From 75819c7f93a2cb52f2f74cc1ebbf5ed6a0141e80 Mon Sep 17 00:00:00 2001 From: Joan He Date: Thu, 5 Apr 2018 12:23:27 -0500 Subject: [PATCH 01/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Feed --- demos/Zend/Feeds/consume-feed.php | 39 - library/Zend/Feed.php | 409 --- library/Zend/Feed/Abstract.php | 301 -- library/Zend/Feed/Atom.php | 390 --- library/Zend/Feed/Builder.php | 398 --- library/Zend/Feed/Builder/Entry.php | 297 -- library/Zend/Feed/Builder/Exception.php | 40 - library/Zend/Feed/Builder/Header.php | 423 --- library/Zend/Feed/Builder/Header/Itunes.php | 288 -- library/Zend/Feed/Builder/Interface.php | 52 - library/Zend/Feed/Element.php | 437 --- library/Zend/Feed/Entry/Abstract.php | 126 - library/Zend/Feed/Entry/Atom.php | 282 -- library/Zend/Feed/Entry/Rss.php | 122 - library/Zend/Feed/Exception.php | 42 - library/Zend/Feed/Pubsubhubbub.php | 153 - .../Feed/Pubsubhubbub/CallbackAbstract.php | 315 -- .../Feed/Pubsubhubbub/CallbackInterface.php | 69 - library/Zend/Feed/Pubsubhubbub/Exception.php | 34 - .../Zend/Feed/Pubsubhubbub/HttpResponse.php | 235 -- .../Feed/Pubsubhubbub/Model/ModelAbstract.php | 63 - .../Feed/Pubsubhubbub/Model/Subscription.php | 141 - .../Model/SubscriptionInterface.php | 65 - library/Zend/Feed/Pubsubhubbub/Publisher.php | 425 --- library/Zend/Feed/Pubsubhubbub/Subscriber.php | 869 ----- .../Feed/Pubsubhubbub/Subscriber/Callback.php | 330 -- library/Zend/Feed/Reader.php | 757 ---- library/Zend/Feed/Reader/Collection.php | 33 - .../Zend/Feed/Reader/Collection/Author.php | 51 - .../Zend/Feed/Reader/Collection/Category.php | 57 - .../Reader/Collection/CollectionAbstract.php | 41 - library/Zend/Feed/Reader/Entry/Atom.php | 400 --- library/Zend/Feed/Reader/Entry/Rss.php | 668 ---- library/Zend/Feed/Reader/EntryAbstract.php | 242 -- library/Zend/Feed/Reader/EntryInterface.php | 143 - .../Zend/Feed/Reader/Extension/Atom/Entry.php | 659 ---- .../Zend/Feed/Reader/Extension/Atom/Feed.php | 590 ---- .../Feed/Reader/Extension/Content/Entry.php | 61 - .../Extension/CreativeCommons/Entry.php | 97 - .../Reader/Extension/CreativeCommons/Feed.php | 89 - .../Reader/Extension/DublinCore/Entry.php | 266 -- .../Feed/Reader/Extension/DublinCore/Feed.php | 309 -- .../Feed/Reader/Extension/EntryAbstract.php | 200 -- .../Feed/Reader/Extension/FeedAbstract.php | 189 - .../Feed/Reader/Extension/Podcast/Entry.php | 202 -- .../Feed/Reader/Extension/Podcast/Feed.php | 293 -- .../Feed/Reader/Extension/Slash/Entry.php | 144 - .../Reader/Extension/Syndication/Feed.php | 168 - .../Feed/Reader/Extension/Thread/Entry.php | 91 - .../Reader/Extension/WellFormedWeb/Entry.php | 73 - library/Zend/Feed/Reader/Feed/Atom.php | 421 --- library/Zend/Feed/Reader/Feed/Atom/Source.php | 102 - library/Zend/Feed/Reader/Feed/Rss.php | 733 ---- library/Zend/Feed/Reader/FeedAbstract.php | 321 -- library/Zend/Feed/Reader/FeedInterface.php | 122 - library/Zend/Feed/Reader/FeedSet.php | 148 - library/Zend/Feed/Rss.php | 530 --- library/Zend/Feed/Writer.php | 267 -- library/Zend/Feed/Writer/Deleted.php | 202 -- library/Zend/Feed/Writer/Entry.php | 761 ---- .../Exception/InvalidMethodException.php | 41 - .../Writer/Extension/Atom/Renderer/Feed.php | 123 - .../Extension/Content/Renderer/Entry.php | 92 - .../Extension/DublinCore/Renderer/Entry.php | 96 - .../Extension/DublinCore/Renderer/Feed.php | 96 - .../Feed/Writer/Extension/ITunes/Entry.php | 242 -- .../Feed/Writer/Extension/ITunes/Feed.php | 361 -- .../Extension/ITunes/Renderer/Entry.php | 216 -- .../Writer/Extension/ITunes/Renderer/Feed.php | 320 -- .../Writer/Extension/RendererAbstract.php | 180 - .../Writer/Extension/RendererInterface.php | 60 - .../Writer/Extension/Slash/Renderer/Entry.php | 91 - .../Extension/Threading/Renderer/Entry.php | 145 - .../WellFormedWeb/Renderer/Entry.php | 96 - library/Zend/Feed/Writer/Feed.php | 282 -- .../Zend/Feed/Writer/Feed/FeedAbstract.php | 872 ----- .../Zend/Feed/Writer/Renderer/Entry/Atom.php | 448 --- .../Writer/Renderer/Entry/Atom/Deleted.php | 121 - .../Zend/Feed/Writer/Renderer/Entry/Rss.php | 346 -- .../Zend/Feed/Writer/Renderer/Feed/Atom.php | 131 - .../Renderer/Feed/Atom/AtomAbstract.php | 446 --- .../Feed/Writer/Renderer/Feed/Atom/Source.php | 110 - .../Zend/Feed/Writer/Renderer/Feed/Rss.php | 505 --- .../Feed/Writer/Renderer/RendererAbstract.php | 250 -- .../Writer/Renderer/RendererInterface.php | 111 - library/Zend/Feed/Writer/Source.php | 33 - tests/Zend/Feed/AbstractFeedTest.php | 84 - tests/Zend/Feed/AllTests.php | 143 - tests/Zend/Feed/ArrayAccessTest.php | 101 - tests/Zend/Feed/AtomEntryOnlyTest.php | 58 - tests/Zend/Feed/AtomPublishingTest.php | 141 - tests/Zend/Feed/AtomTest.php | 49 - tests/Zend/Feed/CountTest.php | 54 - tests/Zend/Feed/ElementTest.php | 165 - tests/Zend/Feed/Entry/RssTest.php | 73 - tests/Zend/Feed/ImportTest.php | 468 --- tests/Zend/Feed/IteratorTest.php | 123 - tests/Zend/Feed/Pubsubhubbub/AllTests.php | 67 - .../Zend/Feed/Pubsubhubbub/Model/AllTests.php | 54 - .../Pubsubhubbub/Model/SubscriptionTest.php | 99 - .../Zend/Feed/Pubsubhubbub/PublisherTest.php | 322 -- .../Feed/Pubsubhubbub/PubsubhubbubTest.php | 59 - .../Pubsubhubbub/Subscriber/CallbackTest.php | 544 --- .../Pubsubhubbub/Subscriber/_files/atom10.xml | 4 - .../Feed/Pubsubhubbub/SubscriberHttpTest.php | 137 - .../Zend/Feed/Pubsubhubbub/SubscriberTest.php | 354 -- tests/Zend/Feed/Pubsubhubbub/_files/rss20.xml | 8 - .../Pubsubhubbub/_files/testRawPostData.php | 3 - .../Reader/Entry/AtomStandaloneEntryTest.php | 303 -- tests/Zend/Feed/Reader/Entry/AtomTest.php | 527 --- tests/Zend/Feed/Reader/Entry/CommonTest.php | 140 - tests/Zend/Feed/Reader/Entry/RssTest.php | 3071 ----------------- .../Entry/_files/Atom/author/plain/atom03.xml | 45 - .../Entry/_files/Atom/author/plain/atom10.xml | 45 - .../Atom/baseurl/plain/atom10-entrylevel.xml | 6 - .../Atom/baseurl/plain/atom10-feedlevel.xml | 7 - .../_files/Atom/category/plain/atom03.xml | 9 - .../_files/Atom/category/plain/atom10.xml | 8 - .../Atom/category/plain/dc10/atom03.xml | 8 - .../Atom/category/plain/dc11/atom03.xml | 8 - .../Atom/category/plain/none/atom03.xml | 5 - .../Atom/category/plain/none/atom10.xml | 5 - .../Atom/commentcount/plain/atom10/rss20.xml | 10 - .../Atom/commentcount/plain/none/rss20.xml | 7 - .../commentcount/plain/thread10/rss20.xml | 9 - .../_files/Atom/commentlink/plain/atom03.xml | 6 - .../commentlink/plain/atom10-relative.xml | 6 - .../_files/Atom/commentlink/plain/atom10.xml | 6 - .../_files/Atom/content/plain/atom03.xml | 6 - .../_files/Atom/content/plain/atom10.xml | 6 - .../_files/Atom/content/plain/atom10_Html.xml | 6 - .../Atom/content/plain/atom10_HtmlCdata.xml | 6 - .../Atom/content/plain/atom10_Xhtml.xml | 10 - .../_files/Atom/datecreated/plain/atom03.xml | 6 - .../_files/Atom/datecreated/plain/atom10.xml | 6 - .../_files/Atom/datemodified/plain/atom03.xml | 6 - .../_files/Atom/datemodified/plain/atom10.xml | 6 - .../_files/Atom/description/plain/atom03.xml | 6 - .../_files/Atom/description/plain/atom10.xml | 6 - .../_files/Atom/enclosure/plain/atom03.xml | 6 - .../_files/Atom/enclosure/plain/atom10.xml | 6 - .../Entry/_files/Atom/id/plain/atom03.xml | 6 - .../Entry/_files/Atom/id/plain/atom10.xml | 6 - .../Entry/_files/Atom/link/plain/atom03.xml | 6 - .../_files/Atom/link/plain/atom10-norel.xml | 6 - .../Atom/link/plain/atom10-relative.xml | 6 - .../Entry/_files/Atom/link/plain/atom10.xml | 6 - .../Entry/_files/Atom/links/plain/atom03.xml | 7 - .../Entry/_files/Atom/links/plain/atom10.xml | 7 - .../Entry/_files/Atom/title/plain/atom03.xml | 6 - .../Entry/_files/Atom/title/plain/atom10.xml | 6 - .../AtomStandaloneEntry/author/atom10.xml | 43 - .../AtomStandaloneEntry/category/atom10.xml | 6 - .../commentlink/atom10.xml | 4 - .../AtomStandaloneEntry/content/atom10.xml | 4 - .../content/atom10_Html.xml | 4 - .../content/atom10_HtmlCdata.xml | 4 - .../content/atom10_Xhtml.xml | 8 - .../datecreated/atom10.xml | 4 - .../datemodified/atom10.xml | 4 - .../description/atom10.xml | 4 - .../AtomStandaloneEntry/enclosure/atom10.xml | 4 - .../_files/AtomStandaloneEntry/id/atom10.xml | 4 - .../AtomStandaloneEntry/link/atom10.xml | 4 - .../AtomStandaloneEntry/links/atom10.xml | 5 - .../AtomStandaloneEntry/title/atom10.xml | 4 - .../Feed/Reader/Entry/_files/Common/atom.xml | 726 ---- .../_files/Common/atom_noencodingdefined.xml | 726 ---- .../_files/Common/atom_rewrittenbydom.xml | 30 - .../Feed/Reader/Entry/_files/Common/rss.xml | 700 ---- .../_files/Rss/author/plain/dc10/rss090.xml | 12 - .../_files/Rss/author/plain/dc10/rss091.xml | 10 - .../_files/Rss/author/plain/dc10/rss092.xml | 10 - .../_files/Rss/author/plain/dc10/rss093.xml | 10 - .../_files/Rss/author/plain/dc10/rss094.xml | 10 - .../_files/Rss/author/plain/dc10/rss10.xml | 12 - .../_files/Rss/author/plain/dc10/rss20.xml | 10 - .../_files/Rss/author/plain/dc11/rss090.xml | 12 - .../_files/Rss/author/plain/dc11/rss091.xml | 10 - .../_files/Rss/author/plain/dc11/rss092.xml | 10 - .../_files/Rss/author/plain/dc11/rss093.xml | 10 - .../_files/Rss/author/plain/dc11/rss094.xml | 10 - .../_files/Rss/author/plain/dc11/rss10.xml | 12 - .../_files/Rss/author/plain/dc11/rss20.xml | 10 - .../_files/Rss/author/plain/none/rss090.xml | 9 - .../_files/Rss/author/plain/none/rss091.xml | 7 - .../_files/Rss/author/plain/none/rss092.xml | 7 - .../_files/Rss/author/plain/none/rss093.xml | 7 - .../_files/Rss/author/plain/none/rss094.xml | 7 - .../_files/Rss/author/plain/none/rss10.xml | 9 - .../_files/Rss/author/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/author/plain/rss090.xml | 9 - .../Entry/_files/Rss/author/plain/rss091.xml | 7 - .../Entry/_files/Rss/author/plain/rss092.xml | 7 - .../Entry/_files/Rss/author/plain/rss093.xml | 7 - .../Entry/_files/Rss/author/plain/rss094.xml | 7 - .../Entry/_files/Rss/author/plain/rss10.xml | 9 - .../Entry/_files/Rss/author/plain/rss20.xml | 9 - .../Rss/category/plain/atom10/rss090.xml | 13 - .../Rss/category/plain/atom10/rss091.xml | 10 - .../Rss/category/plain/atom10/rss092.xml | 10 - .../Rss/category/plain/atom10/rss093.xml | 10 - .../Rss/category/plain/atom10/rss094.xml | 10 - .../Rss/category/plain/atom10/rss10.xml | 13 - .../_files/Rss/category/plain/dc10/rss090.xml | 12 - .../_files/Rss/category/plain/dc10/rss091.xml | 9 - .../_files/Rss/category/plain/dc10/rss092.xml | 9 - .../_files/Rss/category/plain/dc10/rss093.xml | 9 - .../_files/Rss/category/plain/dc10/rss094.xml | 9 - .../_files/Rss/category/plain/dc10/rss10.xml | 12 - .../_files/Rss/category/plain/dc11/rss090.xml | 12 - .../_files/Rss/category/plain/dc11/rss091.xml | 9 - .../_files/Rss/category/plain/dc11/rss092.xml | 9 - .../_files/Rss/category/plain/dc11/rss093.xml | 9 - .../_files/Rss/category/plain/dc11/rss094.xml | 9 - .../_files/Rss/category/plain/dc11/rss10.xml | 12 - .../_files/Rss/category/plain/none/rss090.xml | 9 - .../_files/Rss/category/plain/none/rss091.xml | 7 - .../_files/Rss/category/plain/none/rss092.xml | 7 - .../_files/Rss/category/plain/none/rss093.xml | 7 - .../_files/Rss/category/plain/none/rss094.xml | 7 - .../_files/Rss/category/plain/none/rss10.xml | 9 - .../_files/Rss/category/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/category/plain/rss20.xml | 10 - .../Rss/commentcount/plain/atom10/rss090.xml | 12 - .../Rss/commentcount/plain/atom10/rss091.xml | 10 - .../Rss/commentcount/plain/atom10/rss092.xml | 10 - .../Rss/commentcount/plain/atom10/rss093.xml | 10 - .../Rss/commentcount/plain/atom10/rss094.xml | 10 - .../Rss/commentcount/plain/atom10/rss10.xml | 12 - .../Rss/commentcount/plain/atom10/rss20.xml | 10 - .../Rss/commentcount/plain/none/rss090.xml | 9 - .../Rss/commentcount/plain/none/rss091.xml | 7 - .../Rss/commentcount/plain/none/rss092.xml | 7 - .../Rss/commentcount/plain/none/rss093.xml | 7 - .../Rss/commentcount/plain/none/rss094.xml | 7 - .../Rss/commentcount/plain/none/rss10.xml | 9 - .../Rss/commentcount/plain/none/rss20.xml | 7 - .../Rss/commentcount/plain/slash10/rss090.xml | 11 - .../Rss/commentcount/plain/slash10/rss091.xml | 9 - .../Rss/commentcount/plain/slash10/rss092.xml | 9 - .../Rss/commentcount/plain/slash10/rss093.xml | 9 - .../Rss/commentcount/plain/slash10/rss094.xml | 9 - .../Rss/commentcount/plain/slash10/rss10.xml | 11 - .../Rss/commentcount/plain/slash10/rss20.xml | 9 - .../commentcount/plain/thread10/rss090.xml | 11 - .../commentcount/plain/thread10/rss091.xml | 9 - .../commentcount/plain/thread10/rss092.xml | 9 - .../commentcount/plain/thread10/rss093.xml | 9 - .../commentcount/plain/thread10/rss094.xml | 9 - .../Rss/commentcount/plain/thread10/rss10.xml | 11 - .../Rss/commentcount/plain/thread10/rss20.xml | 9 - .../commentfeedlink/plain/atom10/rss090.xml | 11 - .../commentfeedlink/plain/atom10/rss091.xml | 9 - .../commentfeedlink/plain/atom10/rss092.xml | 9 - .../commentfeedlink/plain/atom10/rss093.xml | 9 - .../commentfeedlink/plain/atom10/rss094.xml | 9 - .../commentfeedlink/plain/atom10/rss10.xml | 11 - .../commentfeedlink/plain/atom10/rss20.xml | 9 - .../Rss/commentfeedlink/plain/none/rss090.xml | 9 - .../Rss/commentfeedlink/plain/none/rss091.xml | 7 - .../Rss/commentfeedlink/plain/none/rss092.xml | 7 - .../Rss/commentfeedlink/plain/none/rss093.xml | 7 - .../Rss/commentfeedlink/plain/none/rss094.xml | 7 - .../Rss/commentfeedlink/plain/none/rss10.xml | 9 - .../Rss/commentfeedlink/plain/none/rss20.xml | 7 - .../commentfeedlink/plain/thread10/rss090.xml | 11 - .../commentfeedlink/plain/thread10/rss091.xml | 9 - .../commentfeedlink/plain/thread10/rss092.xml | 9 - .../commentfeedlink/plain/thread10/rss093.xml | 9 - .../commentfeedlink/plain/thread10/rss094.xml | 9 - .../commentfeedlink/plain/thread10/rss10.xml | 11 - .../commentfeedlink/plain/thread10/rss20.xml | 9 - .../plain/wellformedweb/rss090.xml | 11 - .../plain/wellformedweb/rss091.xml | 9 - .../plain/wellformedweb/rss092.xml | 9 - .../plain/wellformedweb/rss093.xml | 9 - .../plain/wellformedweb/rss094.xml | 9 - .../plain/wellformedweb/rss10.xml | 11 - .../plain/wellformedweb/rss20.xml | 9 - .../Rss/commentlink/plain/atom10/rss090.xml | 11 - .../Rss/commentlink/plain/atom10/rss091.xml | 9 - .../Rss/commentlink/plain/atom10/rss092.xml | 9 - .../Rss/commentlink/plain/atom10/rss093.xml | 9 - .../Rss/commentlink/plain/atom10/rss094.xml | 9 - .../Rss/commentlink/plain/atom10/rss10.xml | 11 - .../Rss/commentlink/plain/atom10/rss20.xml | 9 - .../Rss/commentlink/plain/none/rss090.xml | 9 - .../Rss/commentlink/plain/none/rss091.xml | 7 - .../Rss/commentlink/plain/none/rss092.xml | 7 - .../Rss/commentlink/plain/none/rss093.xml | 7 - .../Rss/commentlink/plain/none/rss094.xml | 7 - .../Rss/commentlink/plain/none/rss10.xml | 9 - .../Rss/commentlink/plain/none/rss20.xml | 7 - .../_files/Rss/commentlink/plain/rss091.xml | 8 - .../_files/Rss/commentlink/plain/rss092.xml | 8 - .../_files/Rss/commentlink/plain/rss093.xml | 8 - .../_files/Rss/commentlink/plain/rss094.xml | 8 - .../_files/Rss/commentlink/plain/rss20.xml | 8 - .../Rss/content/plain/description/rss090.xml | 11 - .../Rss/content/plain/description/rss091.xml | 9 - .../Rss/content/plain/description/rss092.xml | 9 - .../Rss/content/plain/description/rss093.xml | 9 - .../Rss/content/plain/description/rss094.xml | 9 - .../Rss/content/plain/description/rss10.xml | 11 - .../Rss/content/plain/description/rss20.xml | 9 - .../_files/Rss/content/plain/none/rss090.xml | 9 - .../_files/Rss/content/plain/none/rss091.xml | 7 - .../_files/Rss/content/plain/none/rss092.xml | 7 - .../_files/Rss/content/plain/none/rss093.xml | 7 - .../_files/Rss/content/plain/none/rss094.xml | 7 - .../_files/Rss/content/plain/none/rss10.xml | 9 - .../_files/Rss/content/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/content/plain/rss090.xml | 11 - .../Entry/_files/Rss/content/plain/rss091.xml | 9 - .../Entry/_files/Rss/content/plain/rss092.xml | 9 - .../Entry/_files/Rss/content/plain/rss093.xml | 9 - .../Entry/_files/Rss/content/plain/rss094.xml | 9 - .../Entry/_files/Rss/content/plain/rss10.xml | 11 - .../Entry/_files/Rss/content/plain/rss20.xml | 9 - .../Rss/datemodified/plain/atom10/rss090.xml | 11 - .../Rss/datemodified/plain/atom10/rss091.xml | 9 - .../Rss/datemodified/plain/atom10/rss092.xml | 9 - .../Rss/datemodified/plain/atom10/rss093.xml | 9 - .../Rss/datemodified/plain/atom10/rss094.xml | 9 - .../Rss/datemodified/plain/atom10/rss10.xml | 11 - .../Rss/datemodified/plain/atom10/rss20.xml | 9 - .../Rss/datemodified/plain/dc10/rss090.xml | 11 - .../Rss/datemodified/plain/dc10/rss091.xml | 9 - .../Rss/datemodified/plain/dc10/rss092.xml | 9 - .../Rss/datemodified/plain/dc10/rss093.xml | 9 - .../Rss/datemodified/plain/dc10/rss094.xml | 9 - .../Rss/datemodified/plain/dc10/rss10.xml | 11 - .../Rss/datemodified/plain/dc10/rss20.xml | 9 - .../Rss/datemodified/plain/dc11/rss090.xml | 11 - .../Rss/datemodified/plain/dc11/rss091.xml | 9 - .../Rss/datemodified/plain/dc11/rss092.xml | 9 - .../Rss/datemodified/plain/dc11/rss093.xml | 9 - .../Rss/datemodified/plain/dc11/rss094.xml | 9 - .../Rss/datemodified/plain/dc11/rss10.xml | 11 - .../Rss/datemodified/plain/dc11/rss20.xml | 9 - .../Rss/datemodified/plain/none/rss090.xml | 9 - .../Rss/datemodified/plain/none/rss091.xml | 7 - .../Rss/datemodified/plain/none/rss092.xml | 7 - .../Rss/datemodified/plain/none/rss093.xml | 7 - .../Rss/datemodified/plain/none/rss094.xml | 7 - .../Rss/datemodified/plain/none/rss10.xml | 9 - .../Rss/datemodified/plain/none/rss20.xml | 7 - .../Rss/datemodified/plain/rss20-zf-7908.xml | 8 - .../_files/Rss/datemodified/plain/rss20.xml | 8 - .../Rss/datemodified/plain/rss20_en_US.xml | 8 - .../Rss/description/plain/dc10/rss090.xml | 11 - .../Rss/description/plain/dc10/rss091.xml | 9 - .../Rss/description/plain/dc10/rss092.xml | 9 - .../Rss/description/plain/dc10/rss093.xml | 9 - .../Rss/description/plain/dc10/rss094.xml | 9 - .../Rss/description/plain/dc10/rss10.xml | 11 - .../Rss/description/plain/dc10/rss20.xml | 9 - .../Rss/description/plain/dc11/rss090.xml | 11 - .../Rss/description/plain/dc11/rss091.xml | 9 - .../Rss/description/plain/dc11/rss092.xml | 9 - .../Rss/description/plain/dc11/rss093.xml | 9 - .../Rss/description/plain/dc11/rss094.xml | 9 - .../Rss/description/plain/dc11/rss10.xml | 11 - .../Rss/description/plain/dc11/rss20.xml | 9 - .../Rss/description/plain/none/rss090.xml | 9 - .../Rss/description/plain/none/rss091.xml | 7 - .../Rss/description/plain/none/rss092.xml | 7 - .../Rss/description/plain/none/rss093.xml | 7 - .../Rss/description/plain/none/rss094.xml | 7 - .../Rss/description/plain/none/rss10.xml | 9 - .../Rss/description/plain/none/rss20.xml | 7 - .../_files/Rss/description/plain/rss090.xml | 10 - .../_files/Rss/description/plain/rss091.xml | 8 - .../_files/Rss/description/plain/rss092.xml | 8 - .../_files/Rss/description/plain/rss093.xml | 8 - .../_files/Rss/description/plain/rss094.xml | 8 - .../_files/Rss/description/plain/rss10.xml | 10 - .../_files/Rss/description/plain/rss20.xml | 8 - .../_files/Rss/enclosure/plain/rss10.xml | 9 - .../_files/Rss/enclosure/plain/rss20.xml | 8 - .../Entry/_files/Rss/id/plain/dc10/rss090.xml | 11 - .../Entry/_files/Rss/id/plain/dc10/rss091.xml | 9 - .../Entry/_files/Rss/id/plain/dc10/rss092.xml | 9 - .../Entry/_files/Rss/id/plain/dc10/rss093.xml | 9 - .../Entry/_files/Rss/id/plain/dc10/rss094.xml | 9 - .../Entry/_files/Rss/id/plain/dc10/rss10.xml | 11 - .../Entry/_files/Rss/id/plain/dc10/rss20.xml | 9 - .../Entry/_files/Rss/id/plain/dc11/rss090.xml | 11 - .../Entry/_files/Rss/id/plain/dc11/rss091.xml | 9 - .../Entry/_files/Rss/id/plain/dc11/rss092.xml | 9 - .../Entry/_files/Rss/id/plain/dc11/rss093.xml | 9 - .../Entry/_files/Rss/id/plain/dc11/rss094.xml | 9 - .../Entry/_files/Rss/id/plain/dc11/rss10.xml | 11 - .../Entry/_files/Rss/id/plain/dc11/rss20.xml | 9 - .../Entry/_files/Rss/id/plain/none/rss090.xml | 9 - .../Entry/_files/Rss/id/plain/none/rss091.xml | 7 - .../Entry/_files/Rss/id/plain/none/rss092.xml | 7 - .../Entry/_files/Rss/id/plain/none/rss093.xml | 7 - .../Entry/_files/Rss/id/plain/none/rss094.xml | 7 - .../Entry/_files/Rss/id/plain/none/rss10.xml | 9 - .../Entry/_files/Rss/id/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/id/plain/rss090.xml | 9 - .../Entry/_files/Rss/id/plain/rss091.xml | 7 - .../Entry/_files/Rss/id/plain/rss092.xml | 7 - .../Entry/_files/Rss/id/plain/rss093.xml | 7 - .../Entry/_files/Rss/id/plain/rss094.xml | 7 - .../Entry/_files/Rss/id/plain/rss10.xml | 9 - .../Entry/_files/Rss/id/plain/rss20.xml | 8 - .../_files/Rss/id/plain/title/rss090.xml | 11 - .../_files/Rss/id/plain/title/rss091.xml | 9 - .../_files/Rss/id/plain/title/rss092.xml | 9 - .../_files/Rss/id/plain/title/rss093.xml | 9 - .../_files/Rss/id/plain/title/rss094.xml | 9 - .../Entry/_files/Rss/id/plain/title/rss10.xml | 11 - .../Entry/_files/Rss/id/plain/title/rss20.xml | 9 - .../_files/Rss/link/plain/none/rss090.xml | 9 - .../_files/Rss/link/plain/none/rss091.xml | 7 - .../_files/Rss/link/plain/none/rss092.xml | 7 - .../_files/Rss/link/plain/none/rss093.xml | 7 - .../_files/Rss/link/plain/none/rss094.xml | 7 - .../_files/Rss/link/plain/none/rss10.xml | 9 - .../_files/Rss/link/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/link/plain/rss090.xml | 10 - .../Entry/_files/Rss/link/plain/rss091.xml | 8 - .../Entry/_files/Rss/link/plain/rss092.xml | 8 - .../Entry/_files/Rss/link/plain/rss093.xml | 8 - .../Entry/_files/Rss/link/plain/rss094.xml | 8 - .../Entry/_files/Rss/link/plain/rss10.xml | 10 - .../Entry/_files/Rss/link/plain/rss20.xml | 8 - .../_files/Rss/links/plain/none/rss090.xml | 9 - .../_files/Rss/links/plain/none/rss091.xml | 7 - .../_files/Rss/links/plain/none/rss092.xml | 7 - .../_files/Rss/links/plain/none/rss093.xml | 7 - .../_files/Rss/links/plain/none/rss094.xml | 7 - .../_files/Rss/links/plain/none/rss10.xml | 9 - .../_files/Rss/links/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/links/plain/rss090.xml | 11 - .../Entry/_files/Rss/links/plain/rss091.xml | 9 - .../Entry/_files/Rss/links/plain/rss092.xml | 9 - .../Entry/_files/Rss/links/plain/rss093.xml | 9 - .../Entry/_files/Rss/links/plain/rss094.xml | 9 - .../Entry/_files/Rss/links/plain/rss10.xml | 11 - .../Entry/_files/Rss/links/plain/rss20.xml | 9 - .../_files/Rss/title/plain/dc10/rss090.xml | 11 - .../_files/Rss/title/plain/dc10/rss091.xml | 9 - .../_files/Rss/title/plain/dc10/rss092.xml | 9 - .../_files/Rss/title/plain/dc10/rss093.xml | 9 - .../_files/Rss/title/plain/dc10/rss094.xml | 9 - .../_files/Rss/title/plain/dc10/rss10.xml | 11 - .../_files/Rss/title/plain/dc10/rss20.xml | 9 - .../_files/Rss/title/plain/dc11/rss090.xml | 11 - .../_files/Rss/title/plain/dc11/rss091.xml | 9 - .../_files/Rss/title/plain/dc11/rss092.xml | 9 - .../_files/Rss/title/plain/dc11/rss093.xml | 9 - .../_files/Rss/title/plain/dc11/rss094.xml | 9 - .../_files/Rss/title/plain/dc11/rss10.xml | 11 - .../_files/Rss/title/plain/dc11/rss20.xml | 9 - .../_files/Rss/title/plain/none/rss090.xml | 9 - .../_files/Rss/title/plain/none/rss091.xml | 7 - .../_files/Rss/title/plain/none/rss092.xml | 7 - .../_files/Rss/title/plain/none/rss093.xml | 7 - .../_files/Rss/title/plain/none/rss094.xml | 7 - .../_files/Rss/title/plain/none/rss10.xml | 9 - .../_files/Rss/title/plain/none/rss20.xml | 7 - .../Entry/_files/Rss/title/plain/rss090.xml | 10 - .../Entry/_files/Rss/title/plain/rss091.xml | 8 - .../Entry/_files/Rss/title/plain/rss092.xml | 8 - .../Entry/_files/Rss/title/plain/rss093.xml | 8 - .../Entry/_files/Rss/title/plain/rss094.xml | 8 - .../Entry/_files/Rss/title/plain/rss10.xml | 10 - .../Entry/_files/Rss/title/plain/rss20.xml | 8 - .../Zend/Feed/Reader/Feed/AtomSourceTest.php | 306 -- tests/Zend/Feed/Reader/Feed/AtomTest.php | 589 ---- tests/Zend/Feed/Reader/Feed/CommonTest.php | 132 - tests/Zend/Feed/Reader/Feed/RssTest.php | 2979 ---------------- .../Feed/_files/Atom/author/plain/atom03.xml | 45 - .../Feed/_files/Atom/author/plain/atom10.xml | 45 - .../_files/Atom/category/plain/atom03.xml | 10 - .../_files/Atom/category/plain/atom10.xml | 8 - .../Atom/category/plain/dc10/atom03.xml | 8 - .../Atom/category/plain/dc11/atom03.xml | 8 - .../Atom/category/plain/none/atom03.xml | 5 - .../Atom/category/plain/none/atom10.xml | 5 - .../_files/Atom/copyright/plain/atom03.xml | 4 - .../_files/Atom/copyright/plain/atom10.xml | 4 - .../_files/Atom/datecreated/plain/atom03.xml | 4 - .../_files/Atom/datecreated/plain/atom10.xml | 4 - .../_files/Atom/datemodified/plain/atom03.xml | 4 - .../_files/Atom/datemodified/plain/atom10.xml | 4 - .../_files/Atom/description/plain/atom03.xml | 4 - .../_files/Atom/description/plain/atom10.xml | 4 - .../_files/Atom/feedlink/plain/atom03.xml | 4 - .../Atom/feedlink/plain/atom10-relative.xml | 5 - .../_files/Atom/feedlink/plain/atom10.xml | 4 - .../Atom/feedlink/plain/atom10_NoFeedLink.xml | 3 - .../_files/Atom/generator/plain/atom03.xml | 4 - .../_files/Atom/generator/plain/atom10.xml | 4 - .../Feed/_files/Atom/hubs/plain/atom03.xml | 5 - .../Feed/_files/Atom/hubs/plain/atom10.xml | 5 - .../Feed/_files/Atom/icon/plain/atom03.xml | 4 - .../Feed/_files/Atom/icon/plain/atom10.xml | 4 - .../_files/Atom/icon/plain/none/atom03.xml | 3 - .../_files/Atom/icon/plain/none/atom10.xml | 3 - .../Feed/_files/Atom/id/plain/atom03.xml | 4 - .../Feed/_files/Atom/id/plain/atom10.xml | 4 - .../Feed/_files/Atom/image/plain/atom03.xml | 4 - .../Feed/_files/Atom/image/plain/atom10.xml | 4 - .../_files/Atom/image/plain/none/atom03.xml | 3 - .../_files/Atom/image/plain/none/atom10.xml | 3 - .../_files/Atom/language/plain/atom03.xml | 4 - .../_files/Atom/language/plain/atom10.xml | 4 - .../Feed/_files/Atom/link/plain/atom03.xml | 4 - .../_files/Atom/link/plain/atom10-norel.xml | 4 - .../Atom/link/plain/atom10-relative.xml | 5 - .../Feed/_files/Atom/link/plain/atom10.xml | 4 - .../Feed/_files/Atom/title/plain/atom03.xml | 4 - .../Feed/_files/Atom/title/plain/atom10.xml | 4 - .../Feed/_files/AtomSource/author/atom10.xml | 47 - .../_files/AtomSource/category/atom10.xml | 10 - .../_files/AtomSource/copyright/atom10.xml | 8 - .../_files/AtomSource/datecreated/atom10.xml | 8 - .../_files/AtomSource/datemodified/atom10.xml | 8 - .../_files/AtomSource/description/atom10.xml | 8 - .../_files/AtomSource/feedlink/atom10.xml | 8 - .../_files/AtomSource/generator/atom10.xml | 8 - .../Feed/_files/AtomSource/hubs/atom10.xml | 9 - .../Feed/_files/AtomSource/id/atom10.xml | 8 - .../_files/AtomSource/language/atom10.xml | 8 - .../Feed/_files/AtomSource/link/atom10.xml | 8 - .../Feed/_files/AtomSource/title/atom10.xml | 8 - .../Feed/Reader/Feed/_files/Common/atom.xml | 726 ---- .../_files/Common/atom_noencodingdefined.xml | 726 ---- .../_files/Common/atom_rewrittenbydom.xml | 722 ---- .../Feed/Reader/Feed/_files/Common/rss.xml | 700 ---- .../_files/Rss/author/plain/atom10/rss090.xml | 16 - .../_files/Rss/author/plain/atom10/rss091.xml | 14 - .../_files/Rss/author/plain/atom10/rss092.xml | 14 - .../_files/Rss/author/plain/atom10/rss093.xml | 14 - .../_files/Rss/author/plain/atom10/rss094.xml | 14 - .../_files/Rss/author/plain/atom10/rss10.xml | 16 - .../_files/Rss/author/plain/atom10/rss20.xml | 14 - .../_files/Rss/author/plain/dc10/rss090.xml | 12 - .../_files/Rss/author/plain/dc10/rss091.xml | 10 - .../_files/Rss/author/plain/dc10/rss092.xml | 10 - .../_files/Rss/author/plain/dc10/rss093.xml | 10 - .../_files/Rss/author/plain/dc10/rss094.xml | 10 - .../_files/Rss/author/plain/dc10/rss10.xml | 12 - .../_files/Rss/author/plain/dc10/rss20.xml | 10 - .../_files/Rss/author/plain/dc11/rss090.xml | 12 - .../_files/Rss/author/plain/dc11/rss091.xml | 10 - .../_files/Rss/author/plain/dc11/rss092.xml | 10 - .../_files/Rss/author/plain/dc11/rss093.xml | 10 - .../_files/Rss/author/plain/dc11/rss094.xml | 10 - .../_files/Rss/author/plain/dc11/rss10.xml | 12 - .../_files/Rss/author/plain/dc11/rss20.xml | 10 - .../_files/Rss/author/plain/none/rss090.xml | 9 - .../_files/Rss/author/plain/none/rss091.xml | 7 - .../_files/Rss/author/plain/none/rss092.xml | 7 - .../_files/Rss/author/plain/none/rss093.xml | 7 - .../_files/Rss/author/plain/none/rss094.xml | 7 - .../_files/Rss/author/plain/none/rss10.xml | 9 - .../_files/Rss/author/plain/none/rss20.xml | 7 - .../Feed/_files/Rss/author/plain/rss090.xml | 11 - .../Feed/_files/Rss/author/plain/rss091.xml | 9 - .../Feed/_files/Rss/author/plain/rss092.xml | 9 - .../Feed/_files/Rss/author/plain/rss093.xml | 9 - .../Feed/_files/Rss/author/plain/rss094.xml | 9 - .../Feed/_files/Rss/author/plain/rss10.xml | 11 - .../Feed/_files/Rss/author/plain/rss20.xml | 9 - .../Rss/category/plain/atom10/rss090.xml | 11 - .../Rss/category/plain/atom10/rss091.xml | 8 - .../Rss/category/plain/atom10/rss092.xml | 8 - .../Rss/category/plain/atom10/rss093.xml | 8 - .../Rss/category/plain/atom10/rss094.xml | 8 - .../Rss/category/plain/atom10/rss10.xml | 11 - .../_files/Rss/category/plain/dc10/rss090.xml | 10 - .../_files/Rss/category/plain/dc10/rss091.xml | 7 - .../_files/Rss/category/plain/dc10/rss092.xml | 7 - .../_files/Rss/category/plain/dc10/rss093.xml | 7 - .../_files/Rss/category/plain/dc10/rss094.xml | 7 - .../_files/Rss/category/plain/dc10/rss10.xml | 10 - .../_files/Rss/category/plain/dc11/rss090.xml | 10 - .../_files/Rss/category/plain/dc11/rss091.xml | 7 - .../_files/Rss/category/plain/dc11/rss092.xml | 7 - .../_files/Rss/category/plain/dc11/rss093.xml | 7 - .../_files/Rss/category/plain/dc11/rss094.xml | 7 - .../_files/Rss/category/plain/dc11/rss10.xml | 12 - .../_files/Rss/category/plain/none/rss090.xml | 9 - .../_files/Rss/category/plain/none/rss091.xml | 7 - .../_files/Rss/category/plain/none/rss092.xml | 7 - .../_files/Rss/category/plain/none/rss093.xml | 7 - .../_files/Rss/category/plain/none/rss094.xml | 7 - .../_files/Rss/category/plain/none/rss10.xml | 9 - .../_files/Rss/category/plain/none/rss20.xml | 7 - .../Feed/_files/Rss/category/plain/rss20.xml | 10 - .../Rss/copyright/plain/dc10/rss090.xml | 9 - .../Rss/copyright/plain/dc10/rss091.xml | 7 - .../Rss/copyright/plain/dc10/rss092.xml | 7 - .../Rss/copyright/plain/dc10/rss093.xml | 7 - .../Rss/copyright/plain/dc10/rss094.xml | 7 - .../_files/Rss/copyright/plain/dc10/rss10.xml | 9 - .../_files/Rss/copyright/plain/dc10/rss20.xml | 7 - .../Rss/copyright/plain/dc11/rss090.xml | 9 - .../Rss/copyright/plain/dc11/rss091.xml | 7 - .../Rss/copyright/plain/dc11/rss092.xml | 7 - .../Rss/copyright/plain/dc11/rss093.xml | 7 - .../Rss/copyright/plain/dc11/rss094.xml | 7 - .../_files/Rss/copyright/plain/dc11/rss10.xml | 9 - .../_files/Rss/copyright/plain/dc11/rss20.xml | 7 - .../Rss/copyright/plain/none/rss090.xml | 7 - .../Rss/copyright/plain/none/rss091.xml | 5 - .../Rss/copyright/plain/none/rss092.xml | 5 - .../Rss/copyright/plain/none/rss093.xml | 5 - .../Rss/copyright/plain/none/rss094.xml | 5 - .../_files/Rss/copyright/plain/none/rss10.xml | 7 - .../_files/Rss/copyright/plain/none/rss20.xml | 5 - .../_files/Rss/copyright/plain/rss090.xml | 7 - .../_files/Rss/copyright/plain/rss091.xml | 6 - .../_files/Rss/copyright/plain/rss092.xml | 6 - .../_files/Rss/copyright/plain/rss093.xml | 6 - .../_files/Rss/copyright/plain/rss094.xml | 6 - .../Feed/_files/Rss/copyright/plain/rss10.xml | 7 - .../Feed/_files/Rss/copyright/plain/rss20.xml | 6 - .../Rss/datemodified/plain/atom10/rss090.xml | 9 - .../Rss/datemodified/plain/atom10/rss091.xml | 7 - .../Rss/datemodified/plain/atom10/rss092.xml | 7 - .../Rss/datemodified/plain/atom10/rss093.xml | 7 - .../Rss/datemodified/plain/atom10/rss094.xml | 7 - .../Rss/datemodified/plain/atom10/rss10.xml | 9 - .../Rss/datemodified/plain/atom10/rss20.xml | 7 - .../Rss/datemodified/plain/dc10/rss090.xml | 9 - .../Rss/datemodified/plain/dc10/rss091.xml | 7 - .../Rss/datemodified/plain/dc10/rss092.xml | 7 - .../Rss/datemodified/plain/dc10/rss093.xml | 7 - .../Rss/datemodified/plain/dc10/rss094.xml | 7 - .../Rss/datemodified/plain/dc10/rss10.xml | 9 - .../Rss/datemodified/plain/dc10/rss20.xml | 7 - .../Rss/datemodified/plain/dc11/rss090.xml | 9 - .../Rss/datemodified/plain/dc11/rss091.xml | 7 - .../Rss/datemodified/plain/dc11/rss092.xml | 7 - .../Rss/datemodified/plain/dc11/rss093.xml | 7 - .../Rss/datemodified/plain/dc11/rss094.xml | 7 - .../Rss/datemodified/plain/dc11/rss10.xml | 9 - .../Rss/datemodified/plain/dc11/rss20.xml | 7 - .../Rss/datemodified/plain/none/rss090.xml | 7 - .../Rss/datemodified/plain/none/rss091.xml | 5 - .../Rss/datemodified/plain/none/rss092.xml | 5 - .../Rss/datemodified/plain/none/rss093.xml | 5 - .../Rss/datemodified/plain/none/rss094.xml | 5 - .../Rss/datemodified/plain/none/rss10.xml | 7 - .../Rss/datemodified/plain/none/rss20.xml | 5 - .../_files/Rss/datemodified/plain/rss20.xml | 6 - .../Rss/datemodified/plain/rss20_en_US.xml | 6 - .../Rss/description/plain/dc10/rss090.xml | 9 - .../Rss/description/plain/dc10/rss091.xml | 7 - .../Rss/description/plain/dc10/rss092.xml | 7 - .../Rss/description/plain/dc10/rss093.xml | 7 - .../Rss/description/plain/dc10/rss094.xml | 7 - .../Rss/description/plain/dc10/rss10.xml | 9 - .../Rss/description/plain/dc10/rss20.xml | 7 - .../Rss/description/plain/dc11/rss090.xml | 9 - .../Rss/description/plain/dc11/rss091.xml | 7 - .../Rss/description/plain/dc11/rss092.xml | 7 - .../Rss/description/plain/dc11/rss093.xml | 7 - .../Rss/description/plain/dc11/rss094.xml | 7 - .../Rss/description/plain/dc11/rss10.xml | 9 - .../Rss/description/plain/dc11/rss20.xml | 7 - .../Rss/description/plain/none/rss090.xml | 7 - .../Rss/description/plain/none/rss091.xml | 5 - .../Rss/description/plain/none/rss092.xml | 5 - .../Rss/description/plain/none/rss093.xml | 5 - .../Rss/description/plain/none/rss094.xml | 5 - .../Rss/description/plain/none/rss10.xml | 7 - .../Rss/description/plain/none/rss20.xml | 5 - .../_files/Rss/description/plain/rss090.xml | 8 - .../_files/Rss/description/plain/rss091.xml | 6 - .../_files/Rss/description/plain/rss092.xml | 6 - .../_files/Rss/description/plain/rss093.xml | 6 - .../_files/Rss/description/plain/rss094.xml | 6 - .../_files/Rss/description/plain/rss10.xml | 8 - .../_files/Rss/description/plain/rss20.xml | 6 - .../_files/Rss/feedlink/plain/none/rss090.xml | 8 - .../_files/Rss/feedlink/plain/none/rss091.xml | 6 - .../_files/Rss/feedlink/plain/none/rss092.xml | 6 - .../_files/Rss/feedlink/plain/none/rss093.xml | 6 - .../_files/Rss/feedlink/plain/none/rss094.xml | 6 - .../_files/Rss/feedlink/plain/none/rss10.xml | 8 - .../_files/Rss/feedlink/plain/none/rss20.xml | 6 - .../Feed/_files/Rss/feedlink/plain/rss090.xml | 9 - .../Feed/_files/Rss/feedlink/plain/rss091.xml | 7 - .../Feed/_files/Rss/feedlink/plain/rss092.xml | 7 - .../Feed/_files/Rss/feedlink/plain/rss093.xml | 7 - .../Feed/_files/Rss/feedlink/plain/rss094.xml | 7 - .../Feed/_files/Rss/feedlink/plain/rss10.xml | 9 - .../Feed/_files/Rss/feedlink/plain/rss20.xml | 7 - .../Rss/feedlink/plain/rss20_NoFeedLink.xml | 6 - .../Rss/generator/plain/none/rss090.xml | 8 - .../Rss/generator/plain/none/rss091.xml | 6 - .../Rss/generator/plain/none/rss092.xml | 6 - .../Rss/generator/plain/none/rss093.xml | 6 - .../Rss/generator/plain/none/rss094.xml | 6 - .../_files/Rss/generator/plain/none/rss10.xml | 8 - .../_files/Rss/generator/plain/none/rss20.xml | 6 - .../_files/Rss/generator/plain/rss090.xml | 9 - .../_files/Rss/generator/plain/rss091.xml | 7 - .../_files/Rss/generator/plain/rss092.xml | 7 - .../_files/Rss/generator/plain/rss093.xml | 7 - .../_files/Rss/generator/plain/rss094.xml | 7 - .../Feed/_files/Rss/generator/plain/rss10.xml | 9 - .../Feed/_files/Rss/generator/plain/rss20.xml | 6 - .../_files/Rss/hubs/plain/atom10/rss090.xml | 10 - .../_files/Rss/hubs/plain/atom10/rss091.xml | 8 - .../_files/Rss/hubs/plain/atom10/rss092.xml | 8 - .../_files/Rss/hubs/plain/atom10/rss093.xml | 8 - .../_files/Rss/hubs/plain/atom10/rss094.xml | 8 - .../_files/Rss/hubs/plain/atom10/rss10.xml | 10 - .../_files/Rss/hubs/plain/atom10/rss20.xml | 8 - .../_files/Rss/hubs/plain/none/rss090.xml | 8 - .../_files/Rss/hubs/plain/none/rss091.xml | 6 - .../_files/Rss/hubs/plain/none/rss092.xml | 6 - .../_files/Rss/hubs/plain/none/rss093.xml | 6 - .../_files/Rss/hubs/plain/none/rss094.xml | 6 - .../Feed/_files/Rss/hubs/plain/none/rss10.xml | 8 - .../Feed/_files/Rss/hubs/plain/none/rss20.xml | 6 - .../_files/Rss/image/plain/none/rss090.xml | 7 - .../_files/Rss/image/plain/none/rss091.xml | 5 - .../_files/Rss/image/plain/none/rss092.xml | 5 - .../_files/Rss/image/plain/none/rss093.xml | 5 - .../_files/Rss/image/plain/none/rss094.xml | 5 - .../_files/Rss/image/plain/none/rss10.xml | 7 - .../_files/Rss/image/plain/none/rss20.xml | 5 - .../Feed/_files/Rss/image/plain/rss090.xml | 15 - .../Feed/_files/Rss/image/plain/rss091.xml | 13 - .../Feed/_files/Rss/image/plain/rss092.xml | 13 - .../Feed/_files/Rss/image/plain/rss093.xml | 13 - .../Feed/_files/Rss/image/plain/rss094.xml | 13 - .../Feed/_files/Rss/image/plain/rss10.xml | 15 - .../Feed/_files/Rss/image/plain/rss20.xml | 13 - .../_files/Rss/language/plain/dc10/rss090.xml | 9 - .../_files/Rss/language/plain/dc10/rss091.xml | 7 - .../_files/Rss/language/plain/dc10/rss092.xml | 7 - .../_files/Rss/language/plain/dc10/rss093.xml | 7 - .../_files/Rss/language/plain/dc10/rss094.xml | 7 - .../_files/Rss/language/plain/dc10/rss10.xml | 9 - .../_files/Rss/language/plain/dc10/rss20.xml | 7 - .../_files/Rss/language/plain/dc11/rss090.xml | 9 - .../_files/Rss/language/plain/dc11/rss091.xml | 7 - .../_files/Rss/language/plain/dc11/rss092.xml | 7 - .../_files/Rss/language/plain/dc11/rss093.xml | 7 - .../_files/Rss/language/plain/dc11/rss094.xml | 7 - .../_files/Rss/language/plain/dc11/rss10.xml | 9 - .../_files/Rss/language/plain/dc11/rss20.xml | 7 - .../_files/Rss/language/plain/none/rss090.xml | 7 - .../_files/Rss/language/plain/none/rss091.xml | 5 - .../_files/Rss/language/plain/none/rss092.xml | 5 - .../_files/Rss/language/plain/none/rss093.xml | 5 - .../_files/Rss/language/plain/none/rss094.xml | 5 - .../_files/Rss/language/plain/none/rss10.xml | 7 - .../_files/Rss/language/plain/none/rss20.xml | 5 - .../_files/Rss/language/plain/rdf/rss10.xml | 9 - .../Feed/_files/Rss/language/plain/rss090.xml | 7 - .../Feed/_files/Rss/language/plain/rss091.xml | 6 - .../Feed/_files/Rss/language/plain/rss092.xml | 6 - .../Feed/_files/Rss/language/plain/rss093.xml | 6 - .../Feed/_files/Rss/language/plain/rss094.xml | 6 - .../Feed/_files/Rss/language/plain/rss10.xml | 7 - .../Feed/_files/Rss/language/plain/rss20.xml | 6 - .../Rss/lastbuilddate/plain/none/rss20.xml | 5 - .../_files/Rss/lastbuilddate/plain/rss20.xml | 6 - .../_files/Rss/link/plain/none/rss090.xml | 7 - .../_files/Rss/link/plain/none/rss091.xml | 5 - .../_files/Rss/link/plain/none/rss092.xml | 5 - .../_files/Rss/link/plain/none/rss093.xml | 5 - .../_files/Rss/link/plain/none/rss094.xml | 5 - .../Feed/_files/Rss/link/plain/none/rss10.xml | 7 - .../Feed/_files/Rss/link/plain/none/rss20.xml | 5 - .../Feed/_files/Rss/link/plain/rss090.xml | 8 - .../Feed/_files/Rss/link/plain/rss091.xml | 6 - .../Feed/_files/Rss/link/plain/rss092.xml | 6 - .../Feed/_files/Rss/link/plain/rss093.xml | 6 - .../Feed/_files/Rss/link/plain/rss094.xml | 6 - .../Feed/_files/Rss/link/plain/rss10.xml | 8 - .../Feed/_files/Rss/link/plain/rss20.xml | 6 - .../_files/Rss/title/plain/atom10/rss090.xml | 9 - .../_files/Rss/title/plain/atom10/rss091.xml | 7 - .../_files/Rss/title/plain/atom10/rss092.xml | 7 - .../_files/Rss/title/plain/atom10/rss093.xml | 7 - .../_files/Rss/title/plain/atom10/rss094.xml | 7 - .../_files/Rss/title/plain/atom10/rss10.xml | 9 - .../_files/Rss/title/plain/atom10/rss20.xml | 7 - .../_files/Rss/title/plain/dc10/rss090.xml | 9 - .../_files/Rss/title/plain/dc10/rss091.xml | 7 - .../_files/Rss/title/plain/dc10/rss092.xml | 7 - .../_files/Rss/title/plain/dc10/rss093.xml | 7 - .../_files/Rss/title/plain/dc10/rss094.xml | 7 - .../_files/Rss/title/plain/dc10/rss10.xml | 9 - .../_files/Rss/title/plain/dc10/rss20.xml | 7 - .../_files/Rss/title/plain/dc11/rss090.xml | 9 - .../_files/Rss/title/plain/dc11/rss091.xml | 7 - .../_files/Rss/title/plain/dc11/rss092.xml | 7 - .../_files/Rss/title/plain/dc11/rss093.xml | 7 - .../_files/Rss/title/plain/dc11/rss094.xml | 7 - .../_files/Rss/title/plain/dc11/rss10.xml | 9 - .../_files/Rss/title/plain/dc11/rss20.xml | 7 - .../_files/Rss/title/plain/none/rss090.xml | 7 - .../_files/Rss/title/plain/none/rss091.xml | 5 - .../_files/Rss/title/plain/none/rss092.xml | 5 - .../_files/Rss/title/plain/none/rss093.xml | 5 - .../_files/Rss/title/plain/none/rss094.xml | 5 - .../_files/Rss/title/plain/none/rss10.xml | 7 - .../_files/Rss/title/plain/none/rss20.xml | 5 - .../Feed/_files/Rss/title/plain/rss090.xml | 8 - .../Feed/_files/Rss/title/plain/rss091.xml | 6 - .../Feed/_files/Rss/title/plain/rss092.xml | 6 - .../Feed/_files/Rss/title/plain/rss093.xml | 6 - .../Feed/_files/Rss/title/plain/rss094.xml | 6 - .../Feed/_files/Rss/title/plain/rss10.xml | 8 - .../Feed/_files/Rss/title/plain/rss20.xml | 6 - .../Integration/H-OnlineComAtom10Test.php | 227 -- .../Feed/Reader/Integration/LautDeRdfTest.php | 227 -- .../Reader/Integration/PodcastRss2Test.php | 298 -- .../Integration/WordpressAtom10Test.php | 233 -- .../Integration/WordpressRss2DcAtomTest.php | 225 -- .../_files/h-online.com-atom10.xml | 584 ---- .../Reader/Integration/_files/laut.de-rdf.xml | 426 --- .../Reader/Integration/_files/podcast.xml | 92 - .../Integration/_files/wordpress-atom10.xml | 726 ---- .../_files/wordpress-rss2-dc-atom.xml | 700 ---- .../_files/My/Extension/JungleBooks/Entry.php | 54 - .../_files/My/Extension/JungleBooks/Feed.php | 52 - .../Zend/Feed/Reader/_files/Reader/atom03.xml | 3 - .../Zend/Feed/Reader/_files/Reader/atom10.xml | 3 - .../Zend/Feed/Reader/_files/Reader/rss090.xml | 7 - .../Zend/Feed/Reader/_files/Reader/rss091.xml | 5 - .../Zend/Feed/Reader/_files/Reader/rss092.xml | 5 - .../Zend/Feed/Reader/_files/Reader/rss093.xml | 5 - .../Zend/Feed/Reader/_files/Reader/rss094.xml | 5 - .../Zend/Feed/Reader/_files/Reader/rss10.xml | 7 - .../Zend/Feed/Reader/_files/Reader/rss20.xml | 5 - .../Feed/Reader/_files/Reader/xxe-atom10.xml | 5 - .../Feed/Reader/_files/Reader/xxe-info.txt | 1 - tests/Zend/Feed/ReaderTest.php | 394 --- tests/Zend/Feed/RssTest.php | 48 - tests/Zend/Feed/Writer/DeletedTest.php | 183 - tests/Zend/Feed/Writer/EntryTest.php | 603 ---- .../Writer/Extension/ITunes/EntryTest.php | 229 -- .../Feed/Writer/Extension/ITunes/FeedTest.php | 316 -- tests/Zend/Feed/Writer/FeedTest.php | 979 ------ .../Feed/Writer/Renderer/Entry/AtomTest.php | 315 -- .../Feed/Writer/Renderer/Entry/RssTest.php | 383 -- .../Feed/Writer/Renderer/Feed/AtomTest.php | 432 --- .../Feed/Writer/Renderer/Feed/RssTest.php | 570 --- tests/Zend/Feed/_files/AtomHOnline.xml | 554 --- .../AtomPublishingTest-before-update.xml | 7 - .../AtomPublishingTest-created-entry.xml | 15 - .../AtomPublishingTest-expected-update.xml | 7 - .../AtomPublishingTest-updated-entry.xml | 18 - tests/Zend/Feed/_files/AtomTestGoogle.xml | 148 - .../Zend/Feed/_files/AtomTestMozillazine.xml | 213 -- tests/Zend/Feed/_files/AtomTestOReilly.xml | 214 -- tests/Zend/Feed/_files/AtomTestPlanetPHP.xml | 125 - tests/Zend/Feed/_files/AtomTestSample1.xml | 22 - tests/Zend/Feed/_files/AtomTestSample2.xml | 15 - tests/Zend/Feed/_files/AtomTestSample3.xml | 17 - tests/Zend/Feed/_files/AtomTestSample4.xml | 31 - tests/Zend/Feed/_files/RssTest091Sample1.xml | 50 - tests/Zend/Feed/_files/RssTest092Sample1.xml | 103 - tests/Zend/Feed/_files/RssTest100Sample1.xml | 62 - tests/Zend/Feed/_files/RssTest100Sample2.xml | 67 - tests/Zend/Feed/_files/RssTest200Sample1.xml | 41 - tests/Zend/Feed/_files/RssTestCNN.xml | 80 - tests/Zend/Feed/_files/RssTestHarvardLaw.xml | 142 - tests/Zend/Feed/_files/RssTestPlanetPHP.xml | 126 - tests/Zend/Feed/_files/RssTestSlashdot.xml | 178 - tests/Zend/Feed/_files/TestAtomFeed.xml | 34 - .../Feed/_files/TestAtomFeedEntryOnly.xml | 1 - .../Feed/_files/TestAtomFeedNamespaced.xml | 34 - .../_files/TestFeedEntryRssContentEncoded.xml | 61 - tests/Zend/Feed/_files/htmlPage.html | 16 - tests/Zend/Feed/_files/xxe-info.txt | 1 - tests/Zend/Feed/_files/zend_feed_atom_xxe.xml | 5 - tests/Zend/Feed/_files/zend_feed_rss_xxe.xml | 7 - 883 files changed, 54251 deletions(-) delete mode 100644 demos/Zend/Feeds/consume-feed.php delete mode 100644 library/Zend/Feed.php delete mode 100644 library/Zend/Feed/Abstract.php delete mode 100644 library/Zend/Feed/Atom.php delete mode 100644 library/Zend/Feed/Builder.php delete mode 100644 library/Zend/Feed/Builder/Entry.php delete mode 100644 library/Zend/Feed/Builder/Exception.php delete mode 100644 library/Zend/Feed/Builder/Header.php delete mode 100644 library/Zend/Feed/Builder/Header/Itunes.php delete mode 100644 library/Zend/Feed/Builder/Interface.php delete mode 100644 library/Zend/Feed/Element.php delete mode 100644 library/Zend/Feed/Entry/Abstract.php delete mode 100644 library/Zend/Feed/Entry/Atom.php delete mode 100644 library/Zend/Feed/Entry/Rss.php delete mode 100644 library/Zend/Feed/Exception.php delete mode 100644 library/Zend/Feed/Pubsubhubbub.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/CallbackAbstract.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/CallbackInterface.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Exception.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/HttpResponse.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Model/ModelAbstract.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Model/Subscription.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Model/SubscriptionInterface.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Publisher.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Subscriber.php delete mode 100644 library/Zend/Feed/Pubsubhubbub/Subscriber/Callback.php delete mode 100644 library/Zend/Feed/Reader.php delete mode 100644 library/Zend/Feed/Reader/Collection.php delete mode 100644 library/Zend/Feed/Reader/Collection/Author.php delete mode 100644 library/Zend/Feed/Reader/Collection/Category.php delete mode 100644 library/Zend/Feed/Reader/Collection/CollectionAbstract.php delete mode 100644 library/Zend/Feed/Reader/Entry/Atom.php delete mode 100644 library/Zend/Feed/Reader/Entry/Rss.php delete mode 100644 library/Zend/Feed/Reader/EntryAbstract.php delete mode 100644 library/Zend/Feed/Reader/EntryInterface.php delete mode 100644 library/Zend/Feed/Reader/Extension/Atom/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/Atom/Feed.php delete mode 100644 library/Zend/Feed/Reader/Extension/Content/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php delete mode 100644 library/Zend/Feed/Reader/Extension/DublinCore/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/DublinCore/Feed.php delete mode 100644 library/Zend/Feed/Reader/Extension/EntryAbstract.php delete mode 100644 library/Zend/Feed/Reader/Extension/FeedAbstract.php delete mode 100644 library/Zend/Feed/Reader/Extension/Podcast/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/Podcast/Feed.php delete mode 100644 library/Zend/Feed/Reader/Extension/Slash/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/Syndication/Feed.php delete mode 100644 library/Zend/Feed/Reader/Extension/Thread/Entry.php delete mode 100644 library/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php delete mode 100644 library/Zend/Feed/Reader/Feed/Atom.php delete mode 100644 library/Zend/Feed/Reader/Feed/Atom/Source.php delete mode 100644 library/Zend/Feed/Reader/Feed/Rss.php delete mode 100644 library/Zend/Feed/Reader/FeedAbstract.php delete mode 100644 library/Zend/Feed/Reader/FeedInterface.php delete mode 100644 library/Zend/Feed/Reader/FeedSet.php delete mode 100644 library/Zend/Feed/Rss.php delete mode 100644 library/Zend/Feed/Writer.php delete mode 100644 library/Zend/Feed/Writer/Deleted.php delete mode 100644 library/Zend/Feed/Writer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Exception/InvalidMethodException.php delete mode 100644 library/Zend/Feed/Writer/Extension/Atom/Renderer/Feed.php delete mode 100644 library/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php delete mode 100644 library/Zend/Feed/Writer/Extension/ITunes/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/ITunes/Feed.php delete mode 100644 library/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php delete mode 100644 library/Zend/Feed/Writer/Extension/RendererAbstract.php delete mode 100644 library/Zend/Feed/Writer/Extension/RendererInterface.php delete mode 100644 library/Zend/Feed/Writer/Extension/Slash/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php delete mode 100644 library/Zend/Feed/Writer/Feed.php delete mode 100644 library/Zend/Feed/Writer/Feed/FeedAbstract.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Entry/Atom.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Entry/Rss.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Feed/Atom.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Feed/Atom/AtomAbstract.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php delete mode 100644 library/Zend/Feed/Writer/Renderer/Feed/Rss.php delete mode 100644 library/Zend/Feed/Writer/Renderer/RendererAbstract.php delete mode 100644 library/Zend/Feed/Writer/Renderer/RendererInterface.php delete mode 100644 library/Zend/Feed/Writer/Source.php delete mode 100644 tests/Zend/Feed/AbstractFeedTest.php delete mode 100644 tests/Zend/Feed/AllTests.php delete mode 100644 tests/Zend/Feed/ArrayAccessTest.php delete mode 100644 tests/Zend/Feed/AtomEntryOnlyTest.php delete mode 100644 tests/Zend/Feed/AtomPublishingTest.php delete mode 100644 tests/Zend/Feed/AtomTest.php delete mode 100644 tests/Zend/Feed/CountTest.php delete mode 100644 tests/Zend/Feed/ElementTest.php delete mode 100644 tests/Zend/Feed/Entry/RssTest.php delete mode 100644 tests/Zend/Feed/ImportTest.php delete mode 100644 tests/Zend/Feed/IteratorTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/AllTests.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/Model/AllTests.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/Model/SubscriptionTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/PublisherTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/PubsubhubbubTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/Subscriber/CallbackTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/Subscriber/_files/atom10.xml delete mode 100644 tests/Zend/Feed/Pubsubhubbub/SubscriberHttpTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/SubscriberTest.php delete mode 100644 tests/Zend/Feed/Pubsubhubbub/_files/rss20.xml delete mode 100644 tests/Zend/Feed/Pubsubhubbub/_files/testRawPostData.php delete mode 100644 tests/Zend/Feed/Reader/Entry/AtomStandaloneEntryTest.php delete mode 100644 tests/Zend/Feed/Reader/Entry/AtomTest.php delete mode 100644 tests/Zend/Feed/Reader/Entry/CommonTest.php delete mode 100644 tests/Zend/Feed/Reader/Entry/RssTest.php delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-entrylevel.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-feedlevel.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc10/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc11/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/thread10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10-relative.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Html.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_HtmlCdata.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Xhtml.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-norel.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-relative.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/author/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/category/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/commentlink/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Html.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_HtmlCdata.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Xhtml.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datecreated/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datemodified/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/description/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/enclosure/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/id/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/link/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/links/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/title/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Common/atom.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Common/atom_noencodingdefined.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Common/atom_rewrittenbydom.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Common/rss.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20-zf-7908.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20_en_US.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/AtomSourceTest.php delete mode 100644 tests/Zend/Feed/Reader/Feed/AtomTest.php delete mode 100644 tests/Zend/Feed/Reader/Feed/CommonTest.php delete mode 100644 tests/Zend/Feed/Reader/Feed/RssTest.php delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc10/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc11/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10-relative.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10_NoFeedLink.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-norel.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-relative.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/author/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/category/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/copyright/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/datecreated/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/datemodified/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/description/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/feedlink/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/generator/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/hubs/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/id/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/language/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/link/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/AtomSource/title/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Common/atom.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Common/atom_noencodingdefined.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Common/atom_rewrittenbydom.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Common/rss.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20_en_US.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20_NoFeedLink.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rdf/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/Integration/H-OnlineComAtom10Test.php delete mode 100644 tests/Zend/Feed/Reader/Integration/LautDeRdfTest.php delete mode 100644 tests/Zend/Feed/Reader/Integration/PodcastRss2Test.php delete mode 100644 tests/Zend/Feed/Reader/Integration/WordpressAtom10Test.php delete mode 100644 tests/Zend/Feed/Reader/Integration/WordpressRss2DcAtomTest.php delete mode 100644 tests/Zend/Feed/Reader/Integration/_files/h-online.com-atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Integration/_files/laut.de-rdf.xml delete mode 100644 tests/Zend/Feed/Reader/Integration/_files/podcast.xml delete mode 100644 tests/Zend/Feed/Reader/Integration/_files/wordpress-atom10.xml delete mode 100644 tests/Zend/Feed/Reader/Integration/_files/wordpress-rss2-dc-atom.xml delete mode 100644 tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Entry.php delete mode 100644 tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Feed.php delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/atom03.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/atom10.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss090.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss091.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss092.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss093.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss094.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss10.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/rss20.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/xxe-atom10.xml delete mode 100644 tests/Zend/Feed/Reader/_files/Reader/xxe-info.txt delete mode 100644 tests/Zend/Feed/ReaderTest.php delete mode 100644 tests/Zend/Feed/RssTest.php delete mode 100644 tests/Zend/Feed/Writer/DeletedTest.php delete mode 100644 tests/Zend/Feed/Writer/EntryTest.php delete mode 100644 tests/Zend/Feed/Writer/Extension/ITunes/EntryTest.php delete mode 100644 tests/Zend/Feed/Writer/Extension/ITunes/FeedTest.php delete mode 100644 tests/Zend/Feed/Writer/FeedTest.php delete mode 100644 tests/Zend/Feed/Writer/Renderer/Entry/AtomTest.php delete mode 100644 tests/Zend/Feed/Writer/Renderer/Entry/RssTest.php delete mode 100644 tests/Zend/Feed/Writer/Renderer/Feed/AtomTest.php delete mode 100644 tests/Zend/Feed/Writer/Renderer/Feed/RssTest.php delete mode 100644 tests/Zend/Feed/_files/AtomHOnline.xml delete mode 100644 tests/Zend/Feed/_files/AtomPublishingTest-before-update.xml delete mode 100644 tests/Zend/Feed/_files/AtomPublishingTest-created-entry.xml delete mode 100644 tests/Zend/Feed/_files/AtomPublishingTest-expected-update.xml delete mode 100644 tests/Zend/Feed/_files/AtomPublishingTest-updated-entry.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestGoogle.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestMozillazine.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestOReilly.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestPlanetPHP.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestSample1.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestSample2.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestSample3.xml delete mode 100644 tests/Zend/Feed/_files/AtomTestSample4.xml delete mode 100644 tests/Zend/Feed/_files/RssTest091Sample1.xml delete mode 100644 tests/Zend/Feed/_files/RssTest092Sample1.xml delete mode 100644 tests/Zend/Feed/_files/RssTest100Sample1.xml delete mode 100644 tests/Zend/Feed/_files/RssTest100Sample2.xml delete mode 100644 tests/Zend/Feed/_files/RssTest200Sample1.xml delete mode 100644 tests/Zend/Feed/_files/RssTestCNN.xml delete mode 100644 tests/Zend/Feed/_files/RssTestHarvardLaw.xml delete mode 100644 tests/Zend/Feed/_files/RssTestPlanetPHP.xml delete mode 100644 tests/Zend/Feed/_files/RssTestSlashdot.xml delete mode 100644 tests/Zend/Feed/_files/TestAtomFeed.xml delete mode 100644 tests/Zend/Feed/_files/TestAtomFeedEntryOnly.xml delete mode 100644 tests/Zend/Feed/_files/TestAtomFeedNamespaced.xml delete mode 100644 tests/Zend/Feed/_files/TestFeedEntryRssContentEncoded.xml delete mode 100644 tests/Zend/Feed/_files/htmlPage.html delete mode 100644 tests/Zend/Feed/_files/xxe-info.txt delete mode 100644 tests/Zend/Feed/_files/zend_feed_atom_xxe.xml delete mode 100644 tests/Zend/Feed/_files/zend_feed_rss_xxe.xml diff --git a/demos/Zend/Feeds/consume-feed.php b/demos/Zend/Feeds/consume-feed.php deleted file mode 100644 index a86c2dcf79..0000000000 --- a/demos/Zend/Feeds/consume-feed.php +++ /dev/null @@ -1,39 +0,0 @@ -items as $item) { - - echo "

" . $item->title() . "
"; - echo $item->link() . "

"; - -} diff --git a/library/Zend/Feed.php b/library/Zend/Feed.php deleted file mode 100644 index 63286adb88..0000000000 --- a/library/Zend/Feed.php +++ /dev/null @@ -1,409 +0,0 @@ - 'http://a9.com/-/spec/opensearchrss/1.0/', - 'atom' => 'http://www.w3.org/2005/Atom', - 'rss' => 'http://blogs.law.harvard.edu/tech/rss', - ); - - - /** - * Set the HTTP client instance - * - * Sets the HTTP client object to use for retrieving the feeds. - * - * @param Zend_Http_Client $httpClient - * @return void - */ - public static function setHttpClient(Zend_Http_Client $httpClient) - { - self::$_httpClient = $httpClient; - } - - - /** - * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. - * - * @return Zend_Http_Client_Abstract - */ - public static function getHttpClient() - { - if (!self::$_httpClient instanceof Zend_Http_Client) { - /** - * @see Zend_Http_Client - */ - #require_once 'Zend/Http/Client.php'; - self::$_httpClient = new Zend_Http_Client(); - } - - return self::$_httpClient; - } - - - /** - * Toggle using POST instead of PUT and DELETE HTTP methods - * - * Some feed implementations do not accept PUT and DELETE HTTP - * methods, or they can't be used because of proxies or other - * measures. This allows turning on using POST where PUT and - * DELETE would normally be used; in addition, an - * X-Method-Override header will be sent with a value of PUT or - * DELETE as appropriate. - * - * @param boolean $override Whether to override PUT and DELETE. - * @return void - */ - public static function setHttpMethodOverride($override = true) - { - self::$_httpMethodOverride = $override; - } - - - /** - * Get the HTTP override state - * - * @return boolean - */ - public static function getHttpMethodOverride() - { - return self::$_httpMethodOverride; - } - - - /** - * Get the full version of a namespace prefix - * - * Looks up a prefix (atom:, etc.) in the list of registered - * namespaces and returns the full namespace URI if - * available. Returns the prefix, unmodified, if it's not - * registered. - * - * @return string - */ - public static function lookupNamespace($prefix) - { - return isset(self::$_namespaces[$prefix]) ? - self::$_namespaces[$prefix] : - $prefix; - } - - - /** - * Add a namespace and prefix to the registered list - * - * Takes a prefix and a full namespace URI and adds them to the - * list of registered namespaces for use by - * Zend_Feed::lookupNamespace(). - * - * @param string $prefix The namespace prefix - * @param string $namespaceURI The full namespace URI - * @return void - */ - public static function registerNamespace($prefix, $namespaceURI) - { - self::$_namespaces[$prefix] = $namespaceURI; - } - - - /** - * Imports a feed located at $uri. - * - * @param string $uri - * @throws Zend_Feed_Exception - * @return Zend_Feed_Abstract - */ - public static function import($uri) - { - $client = self::getHttpClient(); - $client->setUri($uri); - $response = $client->request('GET'); - if ($response->getStatus() !== 200) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); - } - $feed = $response->getBody(); - return self::importString($feed); - } - - - /** - * Imports a feed represented by $string. - * - * @param string $string - * @throws Zend_Feed_Exception - * @return Zend_Feed_Abstract - */ - public static function importString($string) - { - if (trim($string) == '') { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Document/string being imported' - . ' is an Empty string or comes from an empty HTTP response'); - } - $doc = new DOMDocument; - $doc = Zend_Xml_Security::scan($string, $doc); - - if (!$doc) { - // prevent the class to generate an undefined variable notice (ZF-2590) - // Build error message - $error = libxml_get_last_error(); - if ($error && $error->message) { - $errormsg = "DOMDocument cannot parse XML: {$error->message}"; - } else { - $errormsg = "DOMDocument cannot parse XML"; - } - - - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception($errormsg); - } - - // Try to find the base feed element or a single of an Atom feed - if ($doc->getElementsByTagName('feed')->item(0) || - $doc->getElementsByTagName('entry')->item(0)) { - /** - * @see Zend_Feed_Atom - */ - #require_once 'Zend/Feed/Atom.php'; - // return a newly created Zend_Feed_Atom object - return new Zend_Feed_Atom(null, $string); - } - - // Try to find the base feed element of an RSS feed - if ($doc->getElementsByTagName('channel')->item(0)) { - /** - * @see Zend_Feed_Rss - */ - #require_once 'Zend/Feed/Rss.php'; - // return a newly created Zend_Feed_Rss object - return new Zend_Feed_Rss(null, $string); - } - - // $string does not appear to be a valid feed of the supported types - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid or unsupported feed format'); - } - - - /** - * Imports a feed from a file located at $filename. - * - * @param string $filename - * @throws Zend_Feed_Exception - * @return Zend_Feed_Abstract - */ - public static function importFile($filename) - { - @ini_set('track_errors', 1); - $feed = @file_get_contents($filename); - @ini_restore('track_errors'); - if ($feed === false) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("File could not be loaded: $php_errormsg"); - } - return self::importString($feed); - } - - - /** - * Attempts to find feeds at $uri referenced by tags. Returns an - * array of the feeds referenced at $uri. - * - * @todo Allow findFeeds() to follow one, but only one, code 302. - * - * @param string $uri - * @throws Zend_Feed_Exception - * @return array - */ - public static function findFeeds($uri) - { - // Get the HTTP response from $uri and save the contents - $client = self::getHttpClient(); - $client->setUri($uri); - $response = $client->request(); - if ($response->getStatus() !== 200) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus()); - } - $contents = $response->getBody(); - - // Parse the contents for appropriate tags - @ini_set('track_errors', 1); - $pattern = '~(]+)/?>~i'; - $result = @preg_match_all($pattern, $contents, $matches); - @ini_restore('track_errors'); - if ($result === false) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("Internal error: $php_errormsg"); - } - - // Try to fetch a feed for each link tag that appears to refer to a feed - $feeds = array(); - if (isset($matches[1]) && count($matches[1]) > 0) { - foreach ($matches[1] as $link) { - // force string to be an utf-8 one - if (!mb_check_encoding($link, 'UTF-8')) { - $link = mb_convert_encoding($link, 'UTF-8'); - } - $xml = @Zend_Xml_Security::scan(rtrim($link, ' /') . ' />'); - if ($xml === false) { - continue; - } - $attributes = $xml->attributes(); - if (!isset($attributes['rel']) || !@preg_match('~^(?:alternate|service\.feed)~i', $attributes['rel'])) { - continue; - } - if (!isset($attributes['type']) || - !@preg_match('~^application/(?:atom|rss|rdf)\+xml~', $attributes['type'])) { - continue; - } - if (!isset($attributes['href'])) { - continue; - } - try { - // checks if we need to canonize the given uri - try { - $uri = Zend_Uri::factory((string) $attributes['href']); - } catch (Zend_Uri_Exception $e) { - // canonize the uri - $path = (string) $attributes['href']; - $query = $fragment = ''; - if (substr($path, 0, 1) != '/') { - // add the current root path to this one - $path = rtrim($client->getUri()->getPath(), '/') . '/' . $path; - } - if (strpos($path, '?') !== false) { - list($path, $query) = explode('?', $path, 2); - } - if (strpos($query, '#') !== false) { - list($query, $fragment) = explode('#', $query, 2); - } - $uri = Zend_Uri::factory($client->getUri(true)); - $uri->setPath($path); - $uri->setQuery($query); - $uri->setFragment($fragment); - } - - $feed = self::import($uri); - } catch (Exception $e) { - continue; - } - $feeds[$uri->getUri()] = $feed; - } - } - - // Return the fetched feeds - return $feeds; - } - - /** - * Construct a new Zend_Feed_Abstract object from a custom array - * - * @param array $data - * @param string $format (rss|atom) the requested output format - * @return Zend_Feed_Abstract - */ - public static function importArray(array $data, $format = 'atom') - { - $obj = 'Zend_Feed_' . ucfirst(strtolower($format)); - if (!class_exists($obj)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($obj); - } - - /** - * @see Zend_Feed_Builder - */ - #require_once 'Zend/Feed/Builder.php'; - return new $obj(null, null, new Zend_Feed_Builder($data)); - } - - /** - * Construct a new Zend_Feed_Abstract object from a Zend_Feed_Builder_Interface data source - * - * @param Zend_Feed_Builder_Interface $builder this object will be used to extract the data of the feed - * @param string $format (rss|atom) the requested output format - * @return Zend_Feed_Abstract - */ - public static function importBuilder(Zend_Feed_Builder_Interface $builder, $format = 'atom') - { - $obj = 'Zend_Feed_' . ucfirst(strtolower($format)); - if (!class_exists($obj)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($obj); - } - return new $obj(null, null, $builder); - } -} diff --git a/library/Zend/Feed/Abstract.php b/library/Zend/Feed/Abstract.php deleted file mode 100644 index afc9b720f0..0000000000 --- a/library/Zend/Feed/Abstract.php +++ /dev/null @@ -1,301 +0,0 @@ -setUri($uri); - $response = $client->request('GET'); - if ($response->getStatus() !== 200) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus() . '; request: ' . $client->getLastRequest() . "\nresponse: " . $response->asString()); - } - $this->_element = $this->_importFeedFromString($response->getBody()); - $this->__wakeup(); - } elseif ($string !== null) { - // Retrieve the feed from $string - $this->_element = $string; - $this->__wakeup(); - } else { - // Generate the feed from the array - $header = $builder->getHeader(); - $this->_element = new DOMDocument('1.0', $header['charset']); - $root = $this->_mapFeedHeaders($header); - $this->_mapFeedEntries($root, $builder->getEntries()); - $this->_element = $root; - $this->_buildEntryCache(); - } - } - - - /** - * Load the feed as an XML DOMDocument object - * - * @return void - * @throws Zend_Feed_Exception - */ - public function __wakeup() - { - @ini_set('track_errors', 1); - $doc = new DOMDocument; - $doc = @Zend_Xml_Security::scan($this->_element, $doc); - @ini_restore('track_errors'); - - if (!$doc) { - // prevent the class to generate an undefined variable notice (ZF-2590) - if (!isset($php_errormsg)) { - if (function_exists('xdebug_is_enabled')) { - $php_errormsg = '(error message not available, when XDebug is running)'; - } else { - $php_errormsg = '(error message not available)'; - } - } - - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); - } - - $this->_element = $doc; - } - - - /** - * Prepare for serialiation - * - * @return array - */ - public function __sleep() - { - $this->_element = $this->saveXML(); - - return array('_element'); - } - - - /** - * Cache the individual feed elements so they don't need to be - * searched for on every operation. - * - * @return void - */ - protected function _buildEntryCache() - { - $this->_entries = array(); - foreach ($this->_element->childNodes as $child) { - if ($child->localName == $this->_entryElementName) { - $this->_entries[] = $child; - } - } - } - - - /** - * Get the number of entries in this feed object. - * - * @return integer Entry count. - */ - public function count() - { - return count($this->_entries); - } - - - /** - * Required by the Iterator interface. - * - * @return void - */ - public function rewind() - { - $this->_entryIndex = 0; - } - - - /** - * Required by the Iterator interface. - * - * @return mixed The current row, or null if no rows. - */ - public function current() - { - return new $this->_entryClassName( - null, - $this->_entries[$this->_entryIndex]); - } - - - /** - * Required by the Iterator interface. - * - * @return mixed The current row number (starts at 0), or NULL if no rows - */ - public function key() - { - return $this->_entryIndex; - } - - - /** - * Required by the Iterator interface. - * - * @return mixed The next row, or null if no more rows. - */ - public function next() - { - ++$this->_entryIndex; - } - - - /** - * Required by the Iterator interface. - * - * @return boolean Whether the iteration is valid - */ - public function valid() - { - return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count(); - } - - /** - * Generate the header of the feed when working in write mode - * - * @param array $array the data to use - * @return DOMElement root node - */ - abstract protected function _mapFeedHeaders($array); - - /** - * Generate the entries of the feed when working in write mode - * - * @param DOMElement $root the root node to use - * @param array $array the data to use - * @return DOMElement root node - */ - abstract protected function _mapFeedEntries(DOMElement $root, $array); - - /** - * Send feed to a http client with the correct header - * - * @throws Zend_Feed_Exception if headers have already been sent - * @return void - */ - abstract public function send(); - - /** - * Import a feed from a string - * - * Protects against XXE attack vectors. - * - * @param string $feed - * @return string - * @throws Zend_Feed_Exception on detection of an XXE vector - */ - protected function _importFeedFromString($feed) - { - if (trim($feed) == '') { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Remote feed being imported' - . ' is an Empty string or comes from an empty HTTP response'); - } - $doc = new DOMDocument; - $doc = Zend_Xml_Security::scan($feed, $doc); - - if (!$doc) { - // prevent the class to generate an undefined variable notice (ZF-2590) - // Build error message - $error = libxml_get_last_error(); - if ($error && $error->message) { - $errormsg = "DOMDocument cannot parse XML: {$error->message}"; - } else { - $errormsg = "DOMDocument cannot parse XML"; - } - - - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception($errormsg); - } - - return $doc->saveXML($doc->documentElement); - } -} diff --git a/library/Zend/Feed/Atom.php b/library/Zend/Feed/Atom.php deleted file mode 100644 index 3a6da4bcb6..0000000000 --- a/library/Zend/Feed/Atom.php +++ /dev/null @@ -1,390 +0,0 @@ - - * elements). - * - * @var string - */ - protected $_entryElementName = 'entry'; - - /** - * The default namespace for Atom feeds. - * - * @var string - */ - protected $_defaultNamespace = 'atom'; - - - /** - * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. - * - * @return void - * @throws Zend_Feed_Exception - */ - public function __wakeup() - { - parent::__wakeup(); - - // Find the base feed element and create an alias to it. - $element = $this->_element->getElementsByTagName('feed')->item(0); - if (!$element) { - // Try to find a single instead. - $element = $this->_element->getElementsByTagName($this->_entryElementName)->item(0); - if (!$element) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('No root or <' . $this->_entryElementName - . '> element found, cannot parse feed.'); - } - - $doc = new DOMDocument($this->_element->version, - $this->_element->actualEncoding); - $feed = $doc->appendChild($doc->createElement('feed')); - $feed->appendChild($doc->importNode($element, true)); - $element = $feed; - } - - $this->_element = $element; - - // Find the entries and save a pointer to them for speed and - // simplicity. - $this->_buildEntryCache(); - } - - - /** - * Easy access to tags keyed by "rel" attributes. - * - * If $elt->link() is called with no arguments, we will attempt to - * return the value of the tag(s) like all other - * method-syntax attribute access. If an argument is passed to - * link(), however, then we will return the "href" value of the - * first tag that has a "rel" attribute matching $rel: - * - * $elt->link(): returns the value of the link tag. - * $elt->link('self'): returns the href from the first in the entry. - * - * @param string $rel The "rel" attribute to look for. - * @return mixed - */ - public function link($rel = null) - { - if ($rel === null) { - return parent::__call('link', null); - } - - // index link tags by their "rel" attribute. - $links = parent::__get('link'); - if (!is_array($links)) { - if ($links instanceof Zend_Feed_Element) { - $links = array($links); - } else { - return $links; - } - } - - foreach ($links as $link) { - if (empty($link['rel'])) { - continue; - } - if ($rel == $link['rel']) { - return $link['href']; - } - } - - return null; - } - - - /** - * Make accessing some individual elements of the feed easier. - * - * Special accessors 'entry' and 'entries' are provided so that if - * you wish to iterate over an Atom feed's entries, you can do so - * using foreach ($feed->entries as $entry) or foreach - * ($feed->entry as $entry). - * - * @param string $var The property to access. - * @return mixed - */ - public function __get($var) - { - switch ($var) { - case 'entry': - // fall through to the next case - case 'entries': - return $this; - - default: - return parent::__get($var); - } - } - - /** - * Generate the header of the feed when working in write mode - * - * @param array $array the data to use - * @return DOMElement root node - */ - protected function _mapFeedHeaders($array) - { - $feed = $this->_element->createElement('feed'); - $feed->setAttribute('xmlns', 'http://www.w3.org/2005/Atom'); - - $id = $this->_element->createElement('id', $array->link); - $feed->appendChild($id); - - $title = $this->_element->createElement('title'); - $title->appendChild($this->_element->createCDATASection($array->title)); - $feed->appendChild($title); - - if (isset($array->author)) { - $author = $this->_element->createElement('author'); - $name = $this->_element->createElement('name', $array->author); - $author->appendChild($name); - if (isset($array->email)) { - $email = $this->_element->createElement('email', $array->email); - $author->appendChild($email); - } - $feed->appendChild($author); - } - - $updated = isset($array->lastUpdate) ? $array->lastUpdate : time(); - $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); - $feed->appendChild($updated); - - if (isset($array->published)) { - $published = $this->_element->createElement('published', date(DATE_ATOM, $array->published)); - $feed->appendChild($published); - } - - $link = $this->_element->createElement('link'); - $link->setAttribute('rel', 'self'); - $link->setAttribute('href', $array->link); - if (isset($array->language)) { - $link->setAttribute('hreflang', $array->language); - } - $feed->appendChild($link); - - if (isset($array->description)) { - $subtitle = $this->_element->createElement('subtitle'); - $subtitle->appendChild($this->_element->createCDATASection($array->description)); - $feed->appendChild($subtitle); - } - - if (isset($array->copyright)) { - $copyright = $this->_element->createElement('rights', $array->copyright); - $feed->appendChild($copyright); - } - - if (isset($array->image)) { - $image = $this->_element->createElement('logo', $array->image); - $feed->appendChild($image); - } - - $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; - $generator = $this->_element->createElement('generator', $generator); - $feed->appendChild($generator); - - return $feed; - } - - /** - * Generate the entries of the feed when working in write mode - * - * The following nodes are constructed for each feed entry - * - * url to feed entry - * entry title - * last update - * - * short text - * long version, can contain html - * - * - * @param array $array the data to use - * @param DOMElement $root the root node to use - * @return void - */ - protected function _mapFeedEntries(DOMElement $root, $array) - { - foreach ($array as $dataentry) { - $entry = $this->_element->createElement('entry'); - - $id = $this->_element->createElement('id', isset($dataentry->guid) ? $dataentry->guid : $dataentry->link); - $entry->appendChild($id); - - $title = $this->_element->createElement('title'); - $title->appendChild($this->_element->createCDATASection($dataentry->title)); - $entry->appendChild($title); - - $updated = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); - $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); - $entry->appendChild($updated); - - $link = $this->_element->createElement('link'); - $link->setAttribute('rel', 'alternate'); - $link->setAttribute('href', $dataentry->link); - $entry->appendChild($link); - - $summary = $this->_element->createElement('summary'); - $summary->appendChild($this->_element->createCDATASection($dataentry->description)); - $entry->appendChild($summary); - - if (isset($dataentry->content)) { - $content = $this->_element->createElement('content'); - $content->setAttribute('type', 'html'); - $content->appendChild($this->_element->createCDATASection($dataentry->content)); - $entry->appendChild($content); - } - - if (isset($dataentry->category)) { - foreach ($dataentry->category as $category) { - $node = $this->_element->createElement('category'); - $node->setAttribute('term', $category['term']); - if (isset($category['scheme'])) { - $node->setAttribute('scheme', $category['scheme']); - } - $entry->appendChild($node); - } - } - - if (isset($dataentry->source)) { - $source = $this->_element->createElement('source'); - $title = $this->_element->createElement('title', $dataentry->source['title']); - $source->appendChild($title); - $link = $this->_element->createElement('link', $dataentry->source['title']); - $link->setAttribute('rel', 'alternate'); - $link->setAttribute('href', $dataentry->source['url']); - $source->appendChild($link); - } - - if (isset($dataentry->enclosure)) { - foreach ($dataentry->enclosure as $enclosure) { - $node = $this->_element->createElement('link'); - $node->setAttribute('rel', 'enclosure'); - $node->setAttribute('href', $enclosure['url']); - if (isset($enclosure['type'])) { - $node->setAttribute('type', $enclosure['type']); - } - if (isset($enclosure['length'])) { - $node->setAttribute('length', $enclosure['length']); - } - $entry->appendChild($node); - } - } - - if (isset($dataentry->comments)) { - $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', - 'wfw:comment', - $dataentry->comments); - $entry->appendChild($comments); - } - if (isset($dataentry->commentRss)) { - $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', - 'wfw:commentRss', - $dataentry->commentRss); - $entry->appendChild($comments); - } - - $root->appendChild($entry); - } - } - - /** - * Override Zend_Feed_Element to allow formated feeds - * - * @return string - */ - public function saveXml() - { - // Return a complete document including XML prologue. - $doc = new DOMDocument($this->_element->ownerDocument->version, - $this->_element->ownerDocument->actualEncoding); - $doc->appendChild($doc->importNode($this->_element, true)); - $doc->formatOutput = true; - - return $doc->saveXML(); - } - - /** - * Send feed to a http client with the correct header - * - * @return void - * @throws Zend_Feed_Exception if headers have already been sent - */ - public function send() - { - if (headers_sent()) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Cannot send ATOM because headers have already been sent.'); - } - - header('Content-Type: application/atom+xml; charset=' . $this->_element->ownerDocument->actualEncoding); - - echo $this->saveXML(); - } -} diff --git a/library/Zend/Feed/Builder.php b/library/Zend/Feed/Builder.php deleted file mode 100644 index 1254d8da0f..0000000000 --- a/library/Zend/Feed/Builder.php +++ /dev/null @@ -1,398 +0,0 @@ - - * array( - * 'title' => 'title of the feed', //required - * 'link' => 'canonical url to the feed', //required - * 'lastUpdate' => 'timestamp of the update date', // optional - * 'published' => 'timestamp of the publication date', //optional - * 'charset' => 'charset', // required - * 'description' => 'short description of the feed', //optional - * 'author' => 'author/publisher of the feed', //optional - * 'email' => 'email of the author', //optional - * 'webmaster' => 'email address for person responsible for technical issues' // optional, ignored if atom is used - * 'copyright' => 'copyright notice', //optional - * 'image' => 'url to image', //optional - * 'generator' => 'generator', // optional - * 'language' => 'language the feed is written in', // optional - * 'ttl' => 'how long in minutes a feed can be cached before refreshing', // optional, ignored if atom is used - * 'rating' => 'The PICS rating for the channel.', // optional, ignored if atom is used - * 'cloud' => array( - * 'domain' => 'domain of the cloud, e.g. rpc.sys.com' // required - * 'port' => 'port to connect to' // optional, default to 80 - * 'path' => 'path of the cloud, e.g. /RPC2 //required - * 'registerProcedure' => 'procedure to call, e.g. myCloud.rssPleaseNotify' // required - * 'protocol' => 'protocol to use, e.g. soap or xml-rpc' // required - * ), a cloud to be notified of updates // optional, ignored if atom is used - * 'textInput' => array( - * 'title' => 'the label of the Submit button in the text input area' // required, - * 'description' => 'explains the text input area' // required - * 'name' => 'the name of the text object in the text input area' // required - * 'link' => 'the URL of the CGI script that processes text input requests' // required - * ) // a text input box that can be displayed with the feed // optional, ignored if atom is used - * 'skipHours' => array( - * 'hour in 24 format', // e.g 13 (1pm) - * // up to 24 rows whose value is a number between 0 and 23 - * ) // Hint telling aggregators which hours they can skip // optional, ignored if atom is used - * 'skipDays ' => array( - * 'a day to skip', // e.g Monday - * // up to 7 rows whose value is a Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday - * ) // Hint telling aggregators which days they can skip // optional, ignored if atom is used - * 'itunes' => array( - * 'author' => 'Artist column' // optional, default to the main author value - * 'owner' => array( - * 'name' => 'name of the owner' // optional, default to main author value - * 'email' => 'email of the owner' // optional, default to main email value - * ) // Owner of the podcast // optional - * 'image' => 'album/podcast art' // optional, default to the main image value - * 'subtitle' => 'short description' // optional, default to the main description value - * 'summary' => 'longer description' // optional, default to the main description value - * 'block' => 'Prevent an episode from appearing (yes|no)' // optional - * 'category' => array( - * array('main' => 'main category', // required - * 'sub' => 'sub category' // optional - * ), - * // up to 3 rows - * ) // 'Category column and in iTunes Music Store Browse' // required - * 'explicit' => 'parental advisory graphic (yes|no|clean)' // optional - * 'keywords' => 'a comma separated list of 12 keywords maximum' // optional - * 'new-feed-url' => 'used to inform iTunes of new feed URL location' // optional - * ) // Itunes extension data // optional, ignored if atom is used - * 'entries' => array( - * array( - * 'title' => 'title of the feed entry', //required - * 'link' => 'url to a feed entry', //required - * 'description' => 'short version of a feed entry', // only text, no html, required - * 'guid' => 'id of the article, if not given link value will used', //optional - * 'content' => 'long version', // can contain html, optional - * 'lastUpdate' => 'timestamp of the publication date', // optional - * 'comments' => 'comments page of the feed entry', // optional - * 'commentRss' => 'the feed url of the associated comments', // optional - * 'source' => array( - * 'title' => 'title of the original source' // required, - * 'url' => 'url of the original source' // required - * ) // original source of the feed entry // optional - * 'category' => array( - * array( - * 'term' => 'first category label' // required, - * 'scheme' => 'url that identifies a categorization scheme' // optional - * ), - * array( - * //data for the second category and so on - * ) - * ) // list of the attached categories // optional - * 'enclosure' => array( - * array( - * 'url' => 'url of the linked enclosure' // required - * 'type' => 'mime type of the enclosure' // optional - * 'length' => 'length of the linked content in octets' // optional - * ), - * array( - * //data for the second enclosure and so on - * ) - * ) // list of the enclosures of the feed entry // optional - * ), - * array( - * //data for the second entry and so on - * ) - * ) - * ); - * - * - * @param array $data - * @return void - */ - public function __construct(array $data) - { - $this->_data = $data; - $this->_createHeader($data); - if (isset($data['entries'])) { - $this->_createEntries($data['entries']); - } - } - - /** - * Returns an instance of Zend_Feed_Builder_Header - * describing the header of the feed - * - * @return Zend_Feed_Builder_Header - */ - public function getHeader() - { - return $this->_header; - } - - /** - * Returns an array of Zend_Feed_Builder_Entry instances - * describing the entries of the feed - * - * @return array of Zend_Feed_Builder_Entry - */ - public function getEntries() - { - return $this->_entries; - } - - /** - * Create the Zend_Feed_Builder_Header instance - * - * @param array $data - * @throws Zend_Feed_Builder_Exception - * @return void - */ - protected function _createHeader(array $data) - { - $mandatories = array('title', 'link', 'charset'); - foreach ($mandatories as $mandatory) { - if (!isset($data[$mandatory])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); - } - } - $this->_header = new Zend_Feed_Builder_Header($data['title'], $data['link'], $data['charset']); - if (isset($data['lastUpdate'])) { - $this->_header->setLastUpdate($data['lastUpdate']); - } - if (isset($data['published'])) { - $this->_header->setPublishedDate($data['published']); - } - if (isset($data['description'])) { - $this->_header->setDescription($data['description']); - } - if (isset($data['author'])) { - $this->_header->setAuthor($data['author']); - } - if (isset($data['email'])) { - $this->_header->setEmail($data['email']); - } - if (isset($data['webmaster'])) { - $this->_header->setWebmaster($data['webmaster']); - } - if (isset($data['copyright'])) { - $this->_header->setCopyright($data['copyright']); - } - if (isset($data['image'])) { - $this->_header->setImage($data['image']); - } - if (isset($data['generator'])) { - $this->_header->setGenerator($data['generator']); - } - if (isset($data['language'])) { - $this->_header->setLanguage($data['language']); - } - if (isset($data['ttl'])) { - $this->_header->setTtl($data['ttl']); - } - if (isset($data['rating'])) { - $this->_header->setRating($data['rating']); - } - if (isset($data['cloud'])) { - $mandatories = array('domain', 'path', 'registerProcedure', 'protocol'); - foreach ($mandatories as $mandatory) { - if (!isset($data['cloud'][$mandatory])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your cloud"); - } - } - $uri_str = 'http://' . $data['cloud']['domain'] . $data['cloud']['path']; - $this->_header->setCloud($uri_str, $data['cloud']['registerProcedure'], $data['cloud']['protocol']); - } - if (isset($data['textInput'])) { - $mandatories = array('title', 'description', 'name', 'link'); - foreach ($mandatories as $mandatory) { - if (!isset($data['textInput'][$mandatory])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your textInput"); - } - } - $this->_header->setTextInput($data['textInput']['title'], - $data['textInput']['description'], - $data['textInput']['name'], - $data['textInput']['link']); - } - if (isset($data['skipHours'])) { - $this->_header->setSkipHours($data['skipHours']); - } - if (isset($data['skipDays'])) { - $this->_header->setSkipDays($data['skipDays']); - } - if (isset($data['itunes'])) { - $itunes = new Zend_Feed_Builder_Header_Itunes($data['itunes']['category']); - if (isset($data['itunes']['author'])) { - $itunes->setAuthor($data['itunes']['author']); - } - if (isset($data['itunes']['owner'])) { - $name = isset($data['itunes']['owner']['name']) ? $data['itunes']['owner']['name'] : ''; - $email = isset($data['itunes']['owner']['email']) ? $data['itunes']['owner']['email'] : ''; - $itunes->setOwner($name, $email); - } - if (isset($data['itunes']['image'])) { - $itunes->setImage($data['itunes']['image']); - } - if (isset($data['itunes']['subtitle'])) { - $itunes->setSubtitle($data['itunes']['subtitle']); - } - if (isset($data['itunes']['summary'])) { - $itunes->setSummary($data['itunes']['summary']); - } - if (isset($data['itunes']['block'])) { - $itunes->setBlock($data['itunes']['block']); - } - if (isset($data['itunes']['explicit'])) { - $itunes->setExplicit($data['itunes']['explicit']); - } - if (isset($data['itunes']['keywords'])) { - $itunes->setKeywords($data['itunes']['keywords']); - } - if (isset($data['itunes']['new-feed-url'])) { - $itunes->setNewFeedUrl($data['itunes']['new-feed-url']); - } - - $this->_header->setITunes($itunes); - } - } - - /** - * Create the array of article entries - * - * @param array $data - * @throws Zend_Feed_Builder_Exception - * @return void - */ - protected function _createEntries(array $data) - { - foreach ($data as $row) { - $mandatories = array('title', 'link', 'description'); - foreach ($mandatories as $mandatory) { - if (!isset($row[$mandatory])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); - } - } - $entry = new Zend_Feed_Builder_Entry($row['title'], $row['link'], $row['description']); - if (isset($row['author'])) { - $entry->setAuthor($row['author']); - } - if (isset($row['guid'])) { - $entry->setId($row['guid']); - } - if (isset($row['content'])) { - $entry->setContent($row['content']); - } - if (isset($row['lastUpdate'])) { - $entry->setLastUpdate($row['lastUpdate']); - } - if (isset($row['comments'])) { - $entry->setCommentsUrl($row['comments']); - } - if (isset($row['commentRss'])) { - $entry->setCommentsRssUrl($row['commentRss']); - } - if (isset($row['source'])) { - $mandatories = array('title', 'url'); - foreach ($mandatories as $mandatory) { - if (!isset($row['source'][$mandatory])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("$mandatory key of source property is missing"); - } - } - $entry->setSource($row['source']['title'], $row['source']['url']); - } - if (isset($row['category'])) { - $entry->setCategories($row['category']); - } - if (isset($row['enclosure'])) { - $entry->setEnclosures($row['enclosure']); - } - - $this->_entries[] = $entry; - } - } -} diff --git a/library/Zend/Feed/Builder/Entry.php b/library/Zend/Feed/Builder/Entry.php deleted file mode 100644 index 59f2651e70..0000000000 --- a/library/Zend/Feed/Builder/Entry.php +++ /dev/null @@ -1,297 +0,0 @@ -offsetSet('title', $title); - $this->offsetSet('link', $link); - $this->offsetSet('description', $description); - $this->setLastUpdate(time()); - } - - /** - * Read only properties accessor - * - * @param string $name property to read - * @return mixed - */ - public function __get($name) - { - if (!$this->offsetExists($name)) { - return NULL; - } - - return $this->offsetGet($name); - } - - /** - * Write properties accessor - * - * @param string $name name of the property to set - * @param mixed $value value to set - * @return void - */ - public function __set($name, $value) - { - $this->offsetSet($name, $value); - } - - /** - * Isset accessor - * - * @param string $key - * @return boolean - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Unset accessor - * - * @param string $key - * @return void - */ - public function __unset($key) - { - if ($this->offsetExists($key)) { - $this->offsetUnset($key); - } - } - - /** - * Sets the author of the entry - * - * @param string $author - * @return Zend_Feed_Builder_Entry - */ - public function setAuthor($author) - { - $this->offsetSet('author', $author); - return $this; - } - - /** - * Sets the id/guid of the entry - * - * @param string $id - * @return Zend_Feed_Builder_Entry - */ - public function setId($id) - { - $this->offsetSet('guid', $id); - return $this; - } - - /** - * Sets the full html content of the entry - * - * @param string $content - * @return Zend_Feed_Builder_Entry - */ - public function setContent($content) - { - $this->offsetSet('content', $content); - return $this; - } - - /** - * Timestamp of the update date - * - * @param int $lastUpdate - * @return Zend_Feed_Builder_Entry - */ - public function setLastUpdate($lastUpdate) - { - $this->offsetSet('lastUpdate', $lastUpdate); - return $this; - } - - /** - * Sets the url of the commented page associated to the entry - * - * @param string $comments - * @return Zend_Feed_Builder_Entry - */ - public function setCommentsUrl($comments) - { - $this->offsetSet('comments', $comments); - return $this; - } - - /** - * Sets the url of the comments feed link - * - * @param string $commentRss - * @return Zend_Feed_Builder_Entry - */ - public function setCommentsRssUrl($commentRss) - { - $this->offsetSet('commentRss', $commentRss); - return $this; - } - - /** - * Defines a reference to the original source - * - * @param string $title - * @param string $url - * @return Zend_Feed_Builder_Entry - */ - public function setSource($title, $url) - { - $this->offsetSet('source', array('title' => $title, - 'url' => $url)); - return $this; - } - - /** - * Sets the categories of the entry - * Format of the array: - * - * array( - * array( - * 'term' => 'first category label', - * 'scheme' => 'url that identifies a categorization scheme' // optional - * ), - * // second category and so one - * ) - * - * - * @param array $categories - * @return Zend_Feed_Builder_Entry - */ - public function setCategories(array $categories) - { - foreach ($categories as $category) { - $this->addCategory($category); - } - return $this; - } - - /** - * Add a category to the entry - * - * @param array $category see Zend_Feed_Builder_Entry::setCategories() for format - * @return Zend_Feed_Builder_Entry - * @throws Zend_Feed_Builder_Exception - */ - public function addCategory(array $category) - { - if (empty($category['term'])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to define the name of the category"); - } - - if (!$this->offsetExists('category')) { - $categories = array($category); - } else { - $categories = $this->offsetGet('category'); - $categories[] = $category; - } - $this->offsetSet('category', $categories); - return $this; - } - - /** - * Sets the enclosures of the entry - * Format of the array: - * - * array( - * array( - * 'url' => 'url of the linked enclosure', - * 'type' => 'mime type of the enclosure' // optional - * 'length' => 'length of the linked content in octets' // optional - * ), - * // second enclosure and so one - * ) - * - * - * @param array $enclosures - * @return Zend_Feed_Builder_Entry - * @throws Zend_Feed_Builder_Exception - */ - public function setEnclosures(array $enclosures) - { - foreach ($enclosures as $enclosure) { - if (empty($enclosure['url'])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to supply an url for your enclosure"); - } - $type = isset($enclosure['type']) ? $enclosure['type'] : ''; - $length = isset($enclosure['length']) ? $enclosure['length'] : ''; - $this->addEnclosure($enclosure['url'], $type, $length); - } - return $this; - } - - /** - * Add an enclosure to the entry - * - * @param string $url - * @param string $type - * @param string $length - * @return Zend_Feed_Builder_Entry - */ - public function addEnclosure($url, $type = '', $length = '') - { - if (!$this->offsetExists('enclosure')) { - $enclosure = array(); - } else { - $enclosure = $this->offsetGet('enclosure'); - } - $enclosure[] = array('url' => $url, - 'type' => $type, - 'length' => $length); - $this->offsetSet('enclosure', $enclosure); - return $this; - } -} diff --git a/library/Zend/Feed/Builder/Exception.php b/library/Zend/Feed/Builder/Exception.php deleted file mode 100644 index 320e4dc70e..0000000000 --- a/library/Zend/Feed/Builder/Exception.php +++ /dev/null @@ -1,40 +0,0 @@ -offsetSet('title', $title); - $this->offsetSet('link', $link); - $this->offsetSet('charset', $charset); - $this->setLastUpdate(time()) - ->setGenerator('Zend_Feed'); - } - - /** - * Read only properties accessor - * - * @param string $name property to read - * @return mixed - */ - public function __get($name) - { - if (!$this->offsetExists($name)) { - return NULL; - } - - return $this->offsetGet($name); - } - - /** - * Write properties accessor - * - * @param string $name name of the property to set - * @param mixed $value value to set - * @return void - */ - public function __set($name, $value) - { - $this->offsetSet($name, $value); - } - - /** - * Isset accessor - * - * @param string $key - * @return boolean - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Unset accessor - * - * @param string $key - * @return void - */ - public function __unset($key) - { - if ($this->offsetExists($key)) { - $this->offsetUnset($key); - } - } - - /** - * Timestamp of the update date - * - * @param int $lastUpdate - * @return Zend_Feed_Builder_Header - */ - public function setLastUpdate($lastUpdate) - { - $this->offsetSet('lastUpdate', $lastUpdate); - return $this; - } - - /** - * Timestamp of the publication date - * - * @param int $published - * @return Zend_Feed_Builder_Header - */ - public function setPublishedDate($published) - { - $this->offsetSet('published', $published); - return $this; - } - - /** - * Short description of the feed - * - * @param string $description - * @return Zend_Feed_Builder_Header - */ - public function setDescription($description) - { - $this->offsetSet('description', $description); - return $this; - } - - /** - * Sets the author of the feed - * - * @param string $author - * @return Zend_Feed_Builder_Header - */ - public function setAuthor($author) - { - $this->offsetSet('author', $author); - return $this; - } - - /** - * Sets the author's email - * - * @param string $email - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setEmail($email) - { - /** - * @see Zend_Validate_EmailAddress - */ - #require_once 'Zend/Validate/EmailAddress.php'; - $validate = new Zend_Validate_EmailAddress(); - if (!$validate->isValid($email)) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the email property"); - } - $this->offsetSet('email', $email); - return $this; - } - - /** - * Sets the copyright notice - * - * @param string $copyright - * @return Zend_Feed_Builder_Header - */ - public function setCopyright($copyright) - { - $this->offsetSet('copyright', $copyright); - return $this; - } - - /** - * Sets the image of the feed - * - * @param string $image - * @return Zend_Feed_Builder_Header - */ - public function setImage($image) - { - $this->offsetSet('image', $image); - return $this; - } - - /** - * Sets the generator of the feed - * - * @param string $generator - * @return Zend_Feed_Builder_Header - */ - public function setGenerator($generator) - { - $this->offsetSet('generator', $generator); - return $this; - } - - /** - * Sets the language of the feed - * - * @param string $language - * @return Zend_Feed_Builder_Header - */ - public function setLanguage($language) - { - $this->offsetSet('language', $language); - return $this; - } - - /** - * Email address for person responsible for technical issues - * Ignored if atom is used - * - * @param string $webmaster - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setWebmaster($webmaster) - { - /** - * @see Zend_Validate_EmailAddress - */ - #require_once 'Zend/Validate/EmailAddress.php'; - $validate = new Zend_Validate_EmailAddress(); - if (!$validate->isValid($webmaster)) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the webmaster property"); - } - $this->offsetSet('webmaster', $webmaster); - return $this; - } - - /** - * How long in minutes a feed can be cached before refreshing - * Ignored if atom is used - * - * @param int $ttl - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setTtl($ttl) - { - /** - * @see Zend_Validate_Int - */ - #require_once 'Zend/Validate/Int.php'; - $validate = new Zend_Validate_Int(); - if (!$validate->isValid($ttl)) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set an integer value to the ttl property"); - } - $this->offsetSet('ttl', $ttl); - return $this; - } - - /** - * PICS rating for the feed - * Ignored if atom is used - * - * @param string $rating - * @return Zend_Feed_Builder_Header - */ - public function setRating($rating) - { - $this->offsetSet('rating', $rating); - return $this; - } - - /** - * Cloud to be notified of updates of the feed - * Ignored if atom is used - * - * @param string|Zend_Uri_Http $uri - * @param string $procedure procedure to call, e.g. myCloud.rssPleaseNotify - * @param string $protocol protocol to use, e.g. soap or xml-rpc - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setCloud($uri, $procedure, $protocol) - { - if (is_string($uri) && Zend_Uri_Http::check($uri)) { - $uri = Zend_Uri::factory($uri); - } - if (!$uri instanceof Zend_Uri_Http) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception('Passed parameter is not a valid HTTP URI'); - } - if (!$uri->getPort()) { - $uri->setPort(80); - } - $this->offsetSet('cloud', array('uri' => $uri, - 'procedure' => $procedure, - 'protocol' => $protocol)); - return $this; - } - - /** - * A text input box that can be displayed with the feed - * Ignored if atom is used - * - * @param string $title the label of the Submit button in the text input area - * @param string $description explains the text input area - * @param string $name the name of the text object in the text input area - * @param string $link the URL of the CGI script that processes text input requests - * @return Zend_Feed_Builder_Header - */ - public function setTextInput($title, $description, $name, $link) - { - $this->offsetSet('textInput', array('title' => $title, - 'description' => $description, - 'name' => $name, - 'link' => $link)); - return $this; - } - - /** - * Hint telling aggregators which hours they can skip - * Ignored if atom is used - * - * @param array $hours list of hours in 24 format - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setSkipHours(array $hours) - { - if (count($hours) > 24) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you can not have more than 24 rows in the skipHours property"); - } - foreach ($hours as $hour) { - if ($hour < 0 || $hour > 23) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("$hour has te be between 0 and 23"); - } - } - $this->offsetSet('skipHours', $hours); - return $this; - } - - /** - * Hint telling aggregators which days they can skip - * Ignored if atom is used - * - * @param array $days list of days to skip, e.g. Monday - * @return Zend_Feed_Builder_Header - * @throws Zend_Feed_Builder_Exception - */ - public function setSkipDays(array $days) - { - if (count($days) > 7) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you can not have more than 7 days in the skipDays property"); - } - $valid = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'); - foreach ($days as $day) { - if (!in_array(strtolower($day), $valid)) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("$day is not a valid day"); - } - } - $this->offsetSet('skipDays', $days); - return $this; - } - - /** - * Sets the iTunes rss extension - * - * @param Zend_Feed_Builder_Header_Itunes $itunes - * @return Zend_Feed_Builder_Header - */ - public function setITunes(Zend_Feed_Builder_Header_Itunes $itunes) - { - $this->offsetSet('itunes', $itunes); - return $this; - } -} diff --git a/library/Zend/Feed/Builder/Header/Itunes.php b/library/Zend/Feed/Builder/Header/Itunes.php deleted file mode 100644 index d9752f62ce..0000000000 --- a/library/Zend/Feed/Builder/Header/Itunes.php +++ /dev/null @@ -1,288 +0,0 @@ -setCategories($categories); - } - - /** - * Sets the categories column and in iTunes Music Store Browse - * $categories must conform to the following format: - * - * array(array('main' => 'main category', - * 'sub' => 'sub category' // optionnal - * ), - * // up to 3 rows - * ) - * - * - * @param array $categories - * @return Zend_Feed_Builder_Header_Itunes - * @throws Zend_Feed_Builder_Exception - */ - public function setCategories(array $categories) - { - $nb = count($categories); - if (0 === $nb) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set at least one itunes category"); - } - if ($nb > 3) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set at most three itunes categories"); - } - foreach ($categories as $i => $category) { - if (empty($category['main'])) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set the main category (category #$i)"); - } - } - $this->offsetSet('category', $categories); - return $this; - } - - /** - * Sets the artist value, default to the feed's author value - * - * @param string $author - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setAuthor($author) - { - $this->offsetSet('author', $author); - return $this; - } - - /** - * Sets the owner of the postcast - * - * @param string $name default to the feed's author value - * @param string $email default to the feed's email value - * @return Zend_Feed_Builder_Header_Itunes - * @throws Zend_Feed_Builder_Exception - */ - public function setOwner($name = '', $email = '') - { - if (!empty($email)) { - /** - * @see Zend_Validate_EmailAddress - */ - #require_once 'Zend/Validate/EmailAddress.php'; - $validate = new Zend_Validate_EmailAddress(); - if (!$validate->isValid($email)) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the itunes owner's email property"); - } - } - $this->offsetSet('owner', array('name' => $name, 'email' => $email)); - return $this; - } - - /** - * Sets the album/podcast art picture - * Default to the feed's image value - * - * @param string $image - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setImage($image) - { - $this->offsetSet('image', $image); - return $this; - } - - /** - * Sets the short description of the podcast - * Default to the feed's description - * - * @param string $subtitle - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setSubtitle($subtitle) - { - $this->offsetSet('subtitle', $subtitle); - return $this; - } - - /** - * Sets the longer description of the podcast - * Default to the feed's description - * - * @param string $summary - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setSummary($summary) - { - $this->offsetSet('summary', $summary); - return $this; - } - - /** - * Prevent a feed from appearing - * - * @param string $block can be 'yes' or 'no' - * @return Zend_Feed_Builder_Header_Itunes - * @throws Zend_Feed_Builder_Exception - */ - public function setBlock($block) - { - $block = strtolower($block); - if (!in_array($block, array('yes', 'no'))) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set yes or no to the itunes block property"); - } - $this->offsetSet('block', $block); - return $this; - } - - /** - * Configuration of the parental advisory graphic - * - * @param string $explicit can be 'yes', 'no' or 'clean' - * @return Zend_Feed_Builder_Header_Itunes - * @throws Zend_Feed_Builder_Exception - */ - public function setExplicit($explicit) - { - $explicit = strtolower($explicit); - if (!in_array($explicit, array('yes', 'no', 'clean'))) { - /** - * @see Zend_Feed_Builder_Exception - */ - #require_once 'Zend/Feed/Builder/Exception.php'; - throw new Zend_Feed_Builder_Exception("you have to set yes, no or clean to the itunes explicit property"); - } - $this->offsetSet('explicit', $explicit); - return $this; - } - - /** - * Sets a comma separated list of 12 keywords maximum - * - * @param string $keywords - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setKeywords($keywords) - { - $this->offsetSet('keywords', $keywords); - return $this; - } - - /** - * Sets the new feed URL location - * - * @param string $url - * @return Zend_Feed_Builder_Header_Itunes - */ - public function setNewFeedUrl($url) - { - $this->offsetSet('new_feed_url', $url); - return $this; - } - - /** - * Read only properties accessor - * - * @param string $name property to read - * @return mixed - */ - public function __get($name) - { - if (!$this->offsetExists($name)) { - return NULL; - } - - return $this->offsetGet($name); - } - - /** - * Write properties accessor - * - * @param string $name name of the property to set - * @param mixed $value value to set - * @return void - */ - public function __set($name, $value) - { - $this->offsetSet($name, $value); - } - - /** - * Isset accessor - * - * @param string $key - * @return boolean - */ - public function __isset($key) - { - return $this->offsetExists($key); - } - - /** - * Unset accessor - * - * @param string $key - * @return void - */ - public function __unset($key) - { - if ($this->offsetExists($key)) { - $this->offsetUnset($key); - } - } - -} diff --git a/library/Zend/Feed/Builder/Interface.php b/library/Zend/Feed/Builder/Interface.php deleted file mode 100644 index 8e2615694b..0000000000 --- a/library/Zend/Feed/Builder/Interface.php +++ /dev/null @@ -1,52 +0,0 @@ -_element = $element; - } - - - /** - * Get a DOM representation of the element - * - * Returns the underlying DOM object, which can then be - * manipulated with full DOM methods. - * - * @return DOMDocument - */ - public function getDOM() - { - return $this->_element; - } - - - /** - * Update the object from a DOM element - * - * Take a DOMElement object, which may be originally from a call - * to getDOM() or may be custom created, and use it as the - * DOM tree for this Zend_Feed_Element. - * - * @param DOMElement $element - * @return void - */ - public function setDOM(DOMElement $element) - { - $this->_element = $this->_element->ownerDocument->importNode($element, true); - } - - /** - * Set the parent element of this object to another - * Zend_Feed_Element. - * - * @param Zend_Feed_Element $element - * @return void - */ - public function setParent(Zend_Feed_Element $element) - { - $this->_parentElement = $element; - $this->_appended = false; - } - - - /** - * Appends this element to its parent if necessary. - * - * @return void - */ - protected function ensureAppended() - { - if (!$this->_appended) { - $this->_parentElement->getDOM()->appendChild($this->_element); - $this->_appended = true; - $this->_parentElement->ensureAppended(); - } - } - - - /** - * Get an XML string representation of this element - * - * Returns a string of this element's XML, including the XML - * prologue. - * - * @return string - */ - public function saveXml() - { - // Return a complete document including XML prologue. - $doc = new DOMDocument($this->_element->ownerDocument->version, - $this->_element->ownerDocument->actualEncoding); - $doc->appendChild($doc->importNode($this->_element, true)); - return $doc->saveXML(); - } - - - /** - * Get the XML for only this element - * - * Returns a string of this element's XML without prologue. - * - * @return string - */ - public function saveXmlFragment() - { - return $this->_element->ownerDocument->saveXML($this->_element); - } - - /** - * Get encoding - * - * @return string - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Set encoding - * - * @param string $value Encoding to use - * @return Zend_Feed_Element - */ - public function setEncoding($value) - { - $this->_encoding = (string) $value; - return $this; - } - - /** - * Map variable access onto the underlying entry representation. - * - * Get-style access returns a Zend_Feed_Element representing the - * child element accessed. To get string values, use method syntax - * with the __call() overriding. - * - * @param string $var The property to access. - * @return mixed - */ - public function __get($var) - { - $nodes = $this->_children($var); - $length = count($nodes); - - if ($length == 1) { - return new Zend_Feed_Element($nodes[0]); - } elseif ($length > 1) { - return array_map(function ($e) { return new Zend_Feed_Element($e); }, $nodes); - } else { - // When creating anonymous nodes for __set chaining, don't - // call appendChild() on them. Instead we pass the current - // element to them as an extra reference; the child is - // then responsible for appending itself when it is - // actually set. This way "if ($foo->bar)" doesn't create - // a phantom "bar" element in our tree. - if (strpos($var, ':') !== false) { - list($ns, $elt) = explode(':', $var, 2); - $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $elt); - } else { - $node = $this->_element->ownerDocument->createElement($var); - } - $node = new self($node); - $node->setParent($this); - return $node; - } - } - - - /** - * Map variable sets onto the underlying entry representation. - * - * @param string $var The property to change. - * @param string $val The property's new value. - * @return void - * @throws Zend_Feed_Exception - */ - public function __set($var, $val) - { - $this->ensureAppended(); - - $nodes = $this->_children($var); - if (!$nodes) { - if (strpos($var, ':') !== false) { - list($ns, $elt) = explode(':', $var, 2); - $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), - $var, htmlspecialchars($val, ENT_NOQUOTES, $this->getEncoding())); - $this->_element->appendChild($node); - } else { - $node = $this->_element->ownerDocument->createElement($var, - htmlspecialchars($val, ENT_NOQUOTES, $this->getEncoding())); - $this->_element->appendChild($node); - } - } elseif (count($nodes) > 1) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Cannot set the value of multiple tags simultaneously.'); - } else { - $nodes[0]->nodeValue = $val; - } - } - - - /** - * Map isset calls onto the underlying entry representation. - * - * @param string $var - * @return boolean - */ - public function __isset($var) - { - // Look for access of the form {ns:var}. We don't use - // _children() here because we can break out of the loop - // immediately once we find something. - if (strpos($var, ':') !== false) { - list($ns, $elt) = explode(':', $var, 2); - foreach ($this->_element->childNodes as $child) { - if ($child->localName == $elt && $child->prefix == $ns) { - return true; - } - } - } else { - foreach ($this->_element->childNodes as $child) { - if ($child->localName == $var) { - return true; - } - } - } - } - - - /** - * Get the value of an element with method syntax. - * - * Map method calls to get the string value of the requested - * element. If there are multiple elements that match, this will - * return an array of those objects. - * - * @param string $var The element to get the string value of. - * @param mixed $unused This parameter is not used. - * @return mixed The node's value, null, or an array of nodes. - */ - public function __call($var, $unused) - { - $nodes = $this->_children($var); - - if (!$nodes) { - return null; - } elseif (count($nodes) > 1) { - return $nodes; - } else { - return $nodes[0]->nodeValue; - } - } - - - /** - * Remove all children matching $var. - * - * @param string $var - * @return void - */ - public function __unset($var) - { - $nodes = $this->_children($var); - foreach ($nodes as $node) { - $parent = $node->parentNode; - $parent->removeChild($node); - } - } - - - /** - * Returns the nodeValue of this element when this object is used - * in a string context. - * - * @return string - */ - public function __toString() - { - return $this->_element->nodeValue; - } - - - /** - * Finds children with tagnames matching $var - * - * Similar to SimpleXML's children() method. - * - * @param string $var Tagname to match, can be either namespace:tagName or just tagName. - * @return array - */ - protected function _children($var) - { - $found = array(); - - // Look for access of the form {ns:var}. - if (strpos($var, ':') !== false) { - list($ns, $elt) = explode(':', $var, 2); - foreach ($this->_element->childNodes as $child) { - if ($child->localName == $elt && $child->prefix == $ns) { - $found[] = $child; - } - } - } else { - foreach ($this->_element->childNodes as $child) { - if ($child->localName == $var) { - $found[] = $child; - } - } - } - - return $found; - } - - - /** - * Required by the ArrayAccess interface. - * - * @param string $offset - * @return boolean - */ - public function offsetExists($offset) - { - if (strpos($offset, ':') !== false) { - list($ns, $attr) = explode(':', $offset, 2); - return $this->_element->hasAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); - } else { - return $this->_element->hasAttribute($offset); - } - } - - - /** - * Required by the ArrayAccess interface. - * - * @param string $offset - * @return string - */ - public function offsetGet($offset) - { - if (strpos($offset, ':') !== false) { - list($ns, $attr) = explode(':', $offset, 2); - return $this->_element->getAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); - } else { - return $this->_element->getAttribute($offset); - } - } - - - /** - * Required by the ArrayAccess interface. - * - * @param string $offset - * @param string $value - * @return string - */ - public function offsetSet($offset, $value) - { - $this->ensureAppended(); - - if (strpos($offset, ':') !== false) { - list($ns, $attr) = explode(':', $offset, 2); - // DOMElement::setAttributeNS() requires $qualifiedName to have a prefix - return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $offset, $value); - } else { - return $this->_element->setAttribute($offset, $value); - } - } - - - /** - * Required by the ArrayAccess interface. - * - * @param string $offset - * @return boolean - */ - public function offsetUnset($offset) - { - if (strpos($offset, ':') !== false) { - list($ns, $attr) = explode(':', $offset, 2); - return $this->_element->removeAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); - } else { - return $this->_element->removeAttribute($offset); - } - } - -} diff --git a/library/Zend/Feed/Entry/Abstract.php b/library/Zend/Feed/Entry/Abstract.php deleted file mode 100644 index 216bd95f45..0000000000 --- a/library/Zend/Feed/Entry/Abstract.php +++ /dev/null @@ -1,126 +0,0 @@ -getElementsByTagName($this->_rootElement)->item(0); - if (!$element) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); - } - } else { - $doc = new DOMDocument('1.0', 'utf-8'); - if ($this->_rootNamespace !== null) { - $element = $doc->createElementNS(Zend_Feed::lookupNamespace($this->_rootNamespace), $this->_rootElement); - } else { - $element = $doc->createElement($this->_rootElement); - } - } - } - - parent::__construct($element); - } - -} diff --git a/library/Zend/Feed/Entry/Atom.php b/library/Zend/Feed/Entry/Atom.php deleted file mode 100644 index 42de70eb22..0000000000 --- a/library/Zend/Feed/Entry/Atom.php +++ /dev/null @@ -1,282 +0,0 @@ -link('edit'); - if (!$deleteUri) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Cannot delete entry; no link rel="edit" is present.'); - } - - // DELETE - $client = Zend_Feed::getHttpClient(); - do { - $client->setUri($deleteUri); - if (Zend_Feed::getHttpMethodOverride()) { - $client->setHeader('X-HTTP-Method-Override', 'DELETE'); - $response = $client->request('POST'); - } else { - $response = $client->request('DELETE'); - } - $httpStatus = $response->getStatus(); - switch ((int) $httpStatus / 100) { - // Success - case 2: - return true; - // Redirect - case 3: - $deleteUri = $response->getHeader('Location'); - continue; - // Error - default: - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("Expected response code 2xx, got $httpStatus"); - } - } while (true); - } - - - /** - * Save a new or updated Atom entry. - * - * Save is used to either create new entries or to save changes to - * existing ones. If we have a link rel="edit", we are changing - * an existing entry. In this case we re-serialize the entry and - * PUT it to the edit URI, checking for a 200 OK result. - * - * For posting new entries, you must specify the $postUri - * parameter to save() to tell the object where to post itself. - * We use $postUri and POST the serialized entry there, checking - * for a 201 Created response. If the insert is successful, we - * then parse the response from the POST to get any values that - * the server has generated: an id, an updated time, and its new - * link rel="edit". - * - * @param string $postUri Location to POST for creating new entries. - * @return void - * @throws Zend_Feed_Exception - */ - public function save($postUri = null) - { - if ($this->id()) { - // If id is set, look for link rel="edit" in the - // entry object and PUT. - $editUri = $this->link('edit'); - if (!$editUri) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Cannot edit entry; no link rel="edit" is present.'); - } - - $client = Zend_Feed::getHttpClient(); - $client->setUri($editUri); - if (Zend_Feed::getHttpMethodOverride()) { - $client->setHeaders(array('X-HTTP-Method-Override: PUT', - 'Content-Type: ' . self::CONTENT_TYPE)); - $client->setRawData($this->saveXML()); - $response = $client->request('POST'); - } else { - $client->setHeaders('Content-Type', self::CONTENT_TYPE); - $client->setRawData($this->saveXML()); - $response = $client->request('PUT'); - } - if ($response->getStatus() !== 200) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Expected response code 200, got ' . $response->getStatus()); - } - } else { - if ($postUri === null) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('PostURI must be specified to save new entries.'); - } - $client = Zend_Feed::getHttpClient(); - $client->setUri($postUri); - $client->setHeaders('Content-Type', self::CONTENT_TYPE); - $client->setRawData($this->saveXML()); - $response = $client->request('POST'); - - if ($response->getStatus() !== 201) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Expected response code 201, got ' - . $response->getStatus()); - } - } - - // Update internal properties using $client->responseBody; - @ini_set('track_errors', 1); - $newEntry = new DOMDocument; - $newEntry = @Zend_Xml_Security::scan($response->getBody(), $newEntry); - @ini_restore('track_errors'); - - if (!$newEntry) { - // prevent the class to generate an undefined variable notice (ZF-2590) - if (!isset($php_errormsg)) { - if (function_exists('xdebug_is_enabled')) { - $php_errormsg = '(error message not available, when XDebug is running)'; - } else { - $php_errormsg = '(error message not available)'; - } - } - - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('XML cannot be parsed: ' . $php_errormsg); - } - - $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0); - if (!$newEntry) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('No root element found in server response:' - . "\n\n" . $client->responseBody); - } - - if ($this->_element->parentNode) { - $oldElement = $this->_element; - $this->_element = $oldElement->ownerDocument->importNode($newEntry, true); - $oldElement->parentNode->replaceChild($this->_element, $oldElement); - } else { - $this->_element = $newEntry; - } - } - - - /** - * Easy access to tags keyed by "rel" attributes. - * - * If $elt->link() is called with no arguments, we will attempt to - * return the value of the tag(s) like all other - * method-syntax attribute access. If an argument is passed to - * link(), however, then we will return the "href" value of the - * first tag that has a "rel" attribute matching $rel: - * - * $elt->link(): returns the value of the link tag. - * $elt->link('self'): returns the href from the first in the entry. - * - * @param string $rel The "rel" attribute to look for. - * @return mixed - */ - public function link($rel = null) - { - if ($rel === null) { - return parent::__call('link', null); - } - - // index link tags by their "rel" attribute. - $links = parent::__get('link'); - if (!is_array($links)) { - if ($links instanceof Zend_Feed_Element) { - $links = array($links); - } else { - return $links; - } - } - - foreach ($links as $link) { - if (empty($link['rel'])) { - $link['rel'] = 'alternate'; // see Atom 1.0 spec - } - if ($rel == $link['rel']) { - return $link['href']; - } - } - - return null; - } - -} diff --git a/library/Zend/Feed/Entry/Rss.php b/library/Zend/Feed/Entry/Rss.php deleted file mode 100644 index f0bc5473f0..0000000000 --- a/library/Zend/Feed/Entry/Rss.php +++ /dev/null @@ -1,122 +0,0 @@ -_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); - return parent::__get("$prefix:encoded"); - default: - return parent::__get($var); - } - } - - /** - * Overwrites parent::_set method to enable write access - * to content:encoded element. - * - * @param string $var The property to change. - * @param string $val The property's new value. - * @return void - */ - public function __set($var, $value) - { - switch ($var) { - case 'content': - parent::__set('content:encoded', $value); - break; - default: - parent::__set($var, $value); - } - } - - /** - * Overwrites parent::_isset method to enable access - * to content:encoded element. - * - * @param string $var - * @return boolean - */ - public function __isset($var) - { - switch ($var) { - case 'content': - // don't use other callback to prevent invalid returned value - return $this->content() !== null; - default: - return parent::__isset($var); - } - } - - /** - * Overwrites parent::_call method to enable read access - * to content:encoded element. - * Please note that method-style write access is not currently supported - * by parent method, consequently this method doesn't as well. - * - * @param string $var The element to get the string value of. - * @param mixed $unused This parameter is not used. - * @return mixed The node's value, null, or an array of nodes. - */ - public function __call($var, $unused) - { - switch ($var) { - case 'content': - $prefix = $this->_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); - return parent::__call("$prefix:encoded", $unused); - default: - return parent::__call($var, $unused); - } - } -} diff --git a/library/Zend/Feed/Exception.php b/library/Zend/Feed/Exception.php deleted file mode 100644 index 36a3480782..0000000000 --- a/library/Zend/Feed/Exception.php +++ /dev/null @@ -1,42 +0,0 @@ -getHubs(); - } - - /** - * Allows the external environment to make Zend_Oauth use a specific - * Client instance. - * - * @param Zend_Http_Client $httpClient - * @return void - */ - public static function setHttpClient(Zend_Http_Client $httpClient) - { - self::$httpClient = $httpClient; - } - - /** - * Return the singleton instance of the HTTP Client. Note that - * the instance is reset and cleared of previous parameters GET/POST. - * Headers are NOT reset but handled by this component if applicable. - * - * @return Zend_Http_Client - */ - public static function getHttpClient() - { - if (!isset(self::$httpClient)): - self::$httpClient = new Zend_Http_Client; - else: - self::$httpClient->resetParameters(); - endif; - return self::$httpClient; - } - - /** - * Simple mechanism to delete the entire singleton HTTP Client instance - * which forces an new instantiation for subsequent requests. - * - * @return void - */ - public static function clearHttpClient() - { - self::$httpClient = null; - } - - /** - * RFC 3986 safe url encoding method - * - * @param string $string - * @return string - */ - public static function urlencode($string) - { - $rawencoded = rawurlencode($string); - $rfcencoded = str_replace('%7E', '~', $rawencoded); - return $rfcencoded; - } -} diff --git a/library/Zend/Feed/Pubsubhubbub/CallbackAbstract.php b/library/Zend/Feed/Pubsubhubbub/CallbackAbstract.php deleted file mode 100644 index 30712c6b93..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/CallbackAbstract.php +++ /dev/null @@ -1,315 +0,0 @@ -setConfig($config); - } - } - - /** - * Process any injected configuration options - * - * @param array|Zend_Config $config Options array or Zend_Config instance - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_CallbackAbstract - */ - public function setConfig($config) - { - if ($config instanceof Zend_Config) { - $config = $config->toArray(); - } elseif (!is_array($config)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Array or Zend_Config object' - . 'expected, got ' . gettype($config)); - } - if (array_key_exists('storage', $config)) { - $this->setStorage($config['storage']); - } - return $this; - } - - /** - * Send the response, including all headers. - * If you wish to handle this via Zend_Controller, use the getter methods - * to retrieve any data needed to be set on your HTTP Response object, or - * simply give this object the HTTP Response instance to work with for you! - * - * @return void - */ - public function sendResponse() - { - $this->getHttpResponse()->sendResponse(); - } - - /** - * Sets an instance of Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface used - * to background save any verification tokens associated with a subscription - * or other. - * - * @param Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface $storage - * @return Zend_Feed_Pubsubhubbub_CallbackAbstract - */ - public function setStorage(Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface $storage) - { - $this->_storage = $storage; - return $this; - } - - /** - * Gets an instance of Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface used - * to background save any verification tokens associated with a subscription - * or other. - * - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface - */ - public function getStorage() - { - if ($this->_storage === null) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('No storage object has been' - . ' set that subclasses Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface'); - } - return $this->_storage; - } - - /** - * An instance of a class handling Http Responses. This is implemented in - * Zend_Feed_Pubsubhubbub_HttpResponse which shares an unenforced interface with - * (i.e. not inherited from) Zend_Controller_Response_Http. - * - * @param Zend_Feed_Pubsubhubbub_HttpResponse|Zend_Controller_Response_Http $httpResponse - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_CallbackAbstract - */ - public function setHttpResponse($httpResponse) - { - if (!is_object($httpResponse) - || (!$httpResponse instanceof Zend_Feed_Pubsubhubbub_HttpResponse - && !$httpResponse instanceof Zend_Controller_Response_Http) - ) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('HTTP Response object must' - . ' implement one of Zend_Feed_Pubsubhubbub_HttpResponse or' - . ' Zend_Controller_Response_Http'); - } - $this->_httpResponse = $httpResponse; - return $this; - } - - /** - * An instance of a class handling Http Responses. This is implemented in - * Zend_Feed_Pubsubhubbub_HttpResponse which shares an unenforced interface with - * (i.e. not inherited from) Zend_Controller_Response_Http. - * - * @return Zend_Feed_Pubsubhubbub_HttpResponse|Zend_Controller_Response_Http - */ - public function getHttpResponse() - { - if ($this->_httpResponse === null) { - $this->_httpResponse = new Zend_Feed_Pubsubhubbub_HttpResponse; - } - return $this->_httpResponse; - } - - /** - * Sets the number of Subscribers for which any updates are on behalf of. - * In other words, is this class serving one or more subscribers? How many? - * Defaults to 1 if left unchanged. - * - * @param string|int $count - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_CallbackAbstract - */ - public function setSubscriberCount($count) - { - $count = intval($count); - if ($count <= 0) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Subscriber count must be' - . ' greater than zero'); - } - $this->_subscriberCount = $count; - return $this; - } - - /** - * Gets the number of Subscribers for which any updates are on behalf of. - * In other words, is this class serving one or more subscribers? How many? - * - * @return int - */ - public function getSubscriberCount() - { - return $this->_subscriberCount; - } - - /** - * Attempt to detect the callback URL (specifically the path forward) - */ - protected function _detectCallbackUrl() - { - $callbackUrl = ''; - if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) { - $callbackUrl = $_SERVER['HTTP_X_ORIGINAL_URL']; - } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) { - $callbackUrl = $_SERVER['HTTP_X_REWRITE_URL']; - } elseif (isset($_SERVER['REQUEST_URI'])) { - $callbackUrl = $_SERVER['REQUEST_URI']; - $scheme = 'http'; - if ($_SERVER['HTTPS'] == 'on') { - $scheme = 'https'; - } - $schemeAndHttpHost = $scheme . '://' . $this->_getHttpHost(); - if (strpos($callbackUrl, $schemeAndHttpHost) === 0) { - $callbackUrl = substr($callbackUrl, strlen($schemeAndHttpHost)); - } - } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { - $callbackUrl= $_SERVER['ORIG_PATH_INFO']; - if (!empty($_SERVER['QUERY_STRING'])) { - $callbackUrl .= '?' . $_SERVER['QUERY_STRING']; - } - } - return $callbackUrl; - } - - /** - * Get the HTTP host - * - * @return string - */ - protected function _getHttpHost() - { - if (!empty($_SERVER['HTTP_HOST'])) { - return $_SERVER['HTTP_HOST']; - } - $scheme = 'http'; - if ($_SERVER['HTTPS'] == 'on') { - $scheme = 'https'; - } - $name = $_SERVER['SERVER_NAME']; - $port = $_SERVER['SERVER_PORT']; - if (($scheme == 'http' && $port == 80) - || ($scheme == 'https' && $port == 443) - ) { - return $name; - } else { - return $name . ':' . $port; - } - } - - /** - * Retrieve a Header value from either $_SERVER or Apache - * - * @param string $header - * @return bool - */ - protected function _getHeader($header) - { - $temp = strtoupper(str_replace('-', '_', $header)); - if (!empty($_SERVER[$temp])) { - return $_SERVER[$temp]; - } - $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header)); - if (!empty($_SERVER[$temp])) { - return $_SERVER[$temp]; - } - if (function_exists('apache_request_headers')) { - $headers = apache_request_headers(); - if (!empty($headers[$header])) { - return $headers[$header]; - } - } - return false; - } - - /** - * Return the raw body of the request - * - * @return string|false Raw body, or false if not present - */ - protected function _getRawBody() - { - $body = file_get_contents('php://input'); - if (strlen(trim($body)) == 0 && isset($GLOBALS['HTTP_RAW_POST_DATA'])) { - $body = $GLOBALS['HTTP_RAW_POST_DATA']; - } - if (strlen(trim($body)) > 0) { - return $body; - } - return false; - } -} diff --git a/library/Zend/Feed/Pubsubhubbub/CallbackInterface.php b/library/Zend/Feed/Pubsubhubbub/CallbackInterface.php deleted file mode 100644 index d655c1bb41..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/CallbackInterface.php +++ /dev/null @@ -1,69 +0,0 @@ -sendHeaders(); - echo $this->getBody(); - } - - /** - * Send all headers - * - * Sends any headers specified. If an {@link setHttpResponseCode() HTTP response code} - * has been specified, it is sent with the first header. - * - * @return void - */ - public function sendHeaders() - { - if (count($this->_headers) || (200 != $this->_httpResponseCode)) { - $this->canSendHeaders(true); - } elseif (200 == $this->_httpResponseCode) { - return; - } - $httpCodeSent = false; - foreach ($this->_headers as $header) { - if (!$httpCodeSent && $this->_httpResponseCode) { - header($header['name'] . ': ' . $header['value'], $header['replace'], $this->_httpResponseCode); - $httpCodeSent = true; - } else { - header($header['name'] . ': ' . $header['value'], $header['replace']); - } - } - if (!$httpCodeSent) { - header('HTTP/1.1 ' . $this->_httpResponseCode); - $httpCodeSent = true; - } - } - - /** - * Set a header - * - * If $replace is true, replaces any headers already defined with that - * $name. - * - * @param string $name - * @param string $value - * @param boolean $replace - * @return Zend_Feed_Pubsubhubbub_HttpResponse - */ - public function setHeader($name, $value, $replace = false) - { - $name = $this->_normalizeHeader($name); - $value = (string) $value; - if ($replace) { - foreach ($this->_headers as $key => $header) { - if ($name == $header['name']) { - unset($this->_headers[$key]); - } - } - } - $this->_headers[] = array( - 'name' => $name, - 'value' => $value, - 'replace' => $replace, - ); - - return $this; - } - - /** - * Check if a specific Header is set and return its value - * - * @param string $name - * @return string|null - */ - public function getHeader($name) - { - $name = $this->_normalizeHeader($name); - foreach ($this->_headers as $header) { - if ($header['name'] == $name) { - return $header['value']; - } - } - } - - /** - * Return array of headers; see {@link $_headers} for format - * - * @return array - */ - public function getHeaders() - { - return $this->_headers; - } - - /** - * Can we send headers? - * - * @param boolean $throw Whether or not to throw an exception if headers have been sent; defaults to false - * @return boolean - * @throws Zend_Feed_Pubsubhubbub_Exception - */ - public function canSendHeaders($throw = false) - { - $ok = headers_sent($file, $line); - if ($ok && $throw) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); - } - return !$ok; - } - - /** - * Set HTTP response code to use with headers - * - * @param int $code - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_HttpResponse - */ - public function setHttpResponseCode($code) - { - if (!is_int($code) || (100 > $code) || (599 < $code)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid HTTP response' - . ' code:' . $code); - } - $this->_httpResponseCode = $code; - return $this; - } - - /** - * Retrieve HTTP response code - * - * @return int - */ - public function getHttpResponseCode() - { - return $this->_httpResponseCode; - } - - /** - * Set body content - * - * @param string $content - * @return Zend_Feed_Pubsubhubbub_HttpResponse - */ - public function setBody($content) - { - $this->_body = (string) $content; - $this->setHeader('content-length', strlen($content)); - return $this; - } - - /** - * Return the body content - * - * @return string - */ - public function getBody() - { - return $this->_body; - } - - /** - * Normalizes a header name to X-Capitalized-Names - * - * @param string $name - * @return string - */ - protected function _normalizeHeader($name) - { - $filtered = str_replace(array('-', '_'), ' ', (string) $name); - $filtered = ucwords(strtolower($filtered)); - $filtered = str_replace(' ', '-', $filtered); - return $filtered; - } -} diff --git a/library/Zend/Feed/Pubsubhubbub/Model/ModelAbstract.php b/library/Zend/Feed/Pubsubhubbub/Model/ModelAbstract.php deleted file mode 100644 index 51e84ef199..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/Model/ModelAbstract.php +++ /dev/null @@ -1,63 +0,0 @@ -_db = new Zend_Db_Table($table); - } else { - $this->_db = $tableGateway; - } - } - -} diff --git a/library/Zend/Feed/Pubsubhubbub/Model/Subscription.php b/library/Zend/Feed/Pubsubhubbub/Model/Subscription.php deleted file mode 100644 index b2ae7397aa..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/Model/Subscription.php +++ /dev/null @@ -1,141 +0,0 @@ -_db->find($data['id']); - if (count($result)) { - $data['created_time'] = $result->current()->created_time; - $now = new Zend_Date; - if (isset($data['lease_seconds'])) { - $data['expiration_time'] = $now->add($data['lease_seconds'], Zend_Date::SECOND) - ->get('yyyy-MM-dd HH:mm:ss'); - } - $this->_db->update( - $data, - $this->_db->getAdapter()->quoteInto('id = ?', $data['id']) - ); - return false; - } - - $this->_db->insert($data); - return true; - } - - /** - * Get subscription by ID/key - * - * @param string $key - * @throws Zend_Db_Table_Exception - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return array - */ - public function getSubscription($key) - { - if (empty($key) || !is_string($key)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "key"' - .' of "' . $key . '" must be a non-empty string'); - } - $result = $this->_db->find($key); - if (count($result)) { - return $result->current()->toArray(); - } - return false; - } - - /** - * Determine if a subscription matching the key exists - * - * @param string $key - * @throws Zend_Db_Table_Exception - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return bool - */ - public function hasSubscription($key) - { - if (empty($key) || !is_string($key)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "key"' - .' of "' . $key . '" must be a non-empty string'); - } - $result = $this->_db->find($key); - if (count($result)) { - return true; - } - return false; - } - - /** - * Delete a subscription - * - * @param string $key - * @return bool - */ - public function deleteSubscription($key) - { - $result = $this->_db->find($key); - if (count($result)) { - $this->_db->delete( - $this->_db->getAdapter()->quoteInto('id = ?', $key) - ); - return true; - } - return false; - } - -} diff --git a/library/Zend/Feed/Pubsubhubbub/Model/SubscriptionInterface.php b/library/Zend/Feed/Pubsubhubbub/Model/SubscriptionInterface.php deleted file mode 100644 index c604ff1fcf..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/Model/SubscriptionInterface.php +++ /dev/null @@ -1,65 +0,0 @@ -setConfig($config); - } - } - - /** - * Process any injected configuration options - * - * @param array|Zend_Config $config Options array or Zend_Config instance - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function setConfig($config) - { - if ($config instanceof Zend_Config) { - $config = $config->toArray(); - } elseif (!is_array($config)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Array or Zend_Config object' - . 'expected, got ' . gettype($config)); - } - if (array_key_exists('hubUrls', $config)) { - $this->addHubUrls($config['hubUrls']); - } - if (array_key_exists('updatedTopicUrls', $config)) { - $this->addUpdatedTopicUrls($config['updatedTopicUrls']); - } - if (array_key_exists('parameters', $config)) { - $this->setParameters($config['parameters']); - } - return $this; - } - - /** - * Add a Hub Server URL supported by Publisher - * - * @param string $url - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function addHubUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - .' of "' . $url . '" must be a non-empty string and a valid' - .'URL'); - } - $this->_hubUrls[] = $url; - return $this; - } - - /** - * Add an array of Hub Server URLs supported by Publisher - * - * @param array $urls - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function addHubUrls(array $urls) - { - foreach ($urls as $url) { - $this->addHubUrl($url); - } - return $this; - } - - /** - * Remove a Hub Server URL - * - * @param string $url - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function removeHubUrl($url) - { - if (!in_array($url, $this->getHubUrls())) { - return $this; - } - $key = array_search($url, $this->_hubUrls); - unset($this->_hubUrls[$key]); - return $this; - } - - /** - * Return an array of unique Hub Server URLs currently available - * - * @return array - */ - public function getHubUrls() - { - $this->_hubUrls = array_unique($this->_hubUrls); - return $this->_hubUrls; - } - - /** - * Add a URL to a topic (Atom or RSS feed) which has been updated - * - * @param string $url - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function addUpdatedTopicUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - .' of "' . $url . '" must be a non-empty string and a valid' - .'URL'); - } - $this->_updatedTopicUrls[] = $url; - return $this; - } - - /** - * Add an array of Topic URLs which have been updated - * - * @param array $urls - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function addUpdatedTopicUrls(array $urls) - { - foreach ($urls as $url) { - $this->addUpdatedTopicUrl($url); - } - return $this; - } - - /** - * Remove an updated topic URL - * - * @param string $url - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function removeUpdatedTopicUrl($url) - { - if (!in_array($url, $this->getUpdatedTopicUrls())) { - return $this; - } - $key = array_search($url, $this->_updatedTopicUrls); - unset($this->_updatedTopicUrls[$key]); - return $this; - } - - /** - * Return an array of unique updated topic URLs currently available - * - * @return array - */ - public function getUpdatedTopicUrls() - { - $this->_updatedTopicUrls = array_unique($this->_updatedTopicUrls); - return $this->_updatedTopicUrls; - } - - /** - * Notifies a single Hub Server URL of changes - * - * @param string $url The Hub Server's URL - * @return void - * @throws Zend_Feed_Pubsubhubbub_Exception Thrown on failure - */ - public function notifyHub($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - .' of "' . $url . '" must be a non-empty string and a valid' - .'URL'); - } - $client = $this->_getHttpClient(); - $client->setUri($url); - $response = $client->request(); - if ($response->getStatus() !== 204) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Notification to Hub Server ' - . 'at "' . $url . '" appears to have failed with a status code of "' - . $response->getStatus() . '" and message "' - . $response->getMessage() . '"'); - } - } - - /** - * Notifies all Hub Server URLs of changes - * - * If a Hub notification fails, certain data will be retained in an - * an array retrieved using getErrors(), if a failure occurs for any Hubs - * the isSuccess() check will return FALSE. This method is designed not - * to needlessly fail with an Exception/Error unless from Zend_Http_Client. - * - * @return void - * @throws Zend_Feed_Pubsubhubbub_Exception Thrown if no hubs attached - */ - public function notifyAll() - { - $client = $this->_getHttpClient(); - $hubs = $this->getHubUrls(); - if (empty($hubs)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('No Hub Server URLs' - . ' have been set so no notifcations can be sent'); - } - $this->_errors = array(); - foreach ($hubs as $url) { - $client->setUri($url); - $response = $client->request(); - if ($response->getStatus() !== 204) { - $this->_errors[] = array( - 'response' => $response, - 'hubUrl' => $url - ); - } - } - } - - /** - * Add an optional parameter to the update notification requests - * - * @param string $name - * @param string|null $value - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function setParameter($name, $value = null) - { - if (is_array($name)) { - $this->setParameters($name); - return $this; - } - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "name"' - .' of "' . $name . '" must be a non-empty string'); - } - if ($value === null) { - $this->removeParameter($name); - return $this; - } - if (empty($value) || (!is_string($value) && $value !== null)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "value"' - .' of "' . $value . '" must be a non-empty string'); - } - $this->_parameters[$name] = $value; - return $this; - } - - /** - * Add an optional parameter to the update notification requests - * - * @param array $parameters - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function setParameters(array $parameters) - { - foreach ($parameters as $name => $value) { - $this->setParameter($name, $value); - } - return $this; - } - - /** - * Remove an optional parameter for the notification requests - * - * @param string $name - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Publisher - */ - public function removeParameter($name) - { - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "name"' - .' of "' . $name . '" must be a non-empty string'); - } - if (array_key_exists($name, $this->_parameters)) { - unset($this->_parameters[$name]); - } - return $this; - } - - /** - * Return an array of optional parameters for notification requests - * - * @return array - */ - public function getParameters() - { - return $this->_parameters; - } - - /** - * Returns a boolean indicator of whether the notifications to Hub - * Servers were ALL successful. If even one failed, FALSE is returned. - * - * @return bool - */ - public function isSuccess() - { - if (count($this->_errors) > 0) { - return false; - } - return true; - } - - /** - * Return an array of errors met from any failures, including keys: - * 'response' => the Zend_Http_Response object from the failure - * 'hubUrl' => the URL of the Hub Server whose notification failed - * - * @return array - */ - public function getErrors() - { - return $this->_errors; - } - - /** - * Get a basic prepared HTTP client for use - * - * @throws Zend_Feed_Pubsubhubbub_Exception - * @throws Zend_Http_Client_Exception - * @return Zend_Http_Client - */ - protected function _getHttpClient() - { - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $client->setMethod(Zend_Http_Client::POST); - $client->setConfig(array( - 'useragent' => 'Zend_Feed_Pubsubhubbub_Publisher/' . Zend_Version::VERSION, - )); - $params = array(); - $params[] = 'hub.mode=publish'; - $topics = $this->getUpdatedTopicUrls(); - if (empty($topics)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('No updated topic URLs' - . ' have been set'); - } - foreach ($topics as $topicUrl) { - $params[] = 'hub.url=' . urlencode($topicUrl); - } - $optParams = $this->getParameters(); - foreach ($optParams as $name => $value) { - $params[] = urlencode($name) . '=' . urlencode($value); - } - $paramString = implode('&', $params); - $client->setRawData($paramString, 'application/x-www-form-urlencoded'); - return $client; - } -} diff --git a/library/Zend/Feed/Pubsubhubbub/Subscriber.php b/library/Zend/Feed/Pubsubhubbub/Subscriber.php deleted file mode 100644 index 51907a5462..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/Subscriber.php +++ /dev/null @@ -1,869 +0,0 @@ -setConfig($config); - } - } - - /** - * Process any injected configuration options - * - * @param array|Zend_Config $config Options array or Zend_Config instance - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setConfig($config) - { - if ($config instanceof Zend_Config) { - $config = $config->toArray(); - } elseif (!is_array($config)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Array or Zend_Config object' - . ' expected, got ' . gettype($config)); - } - if (array_key_exists('hubUrls', $config)) { - $this->addHubUrls($config['hubUrls']); - } - if (array_key_exists('callbackUrl', $config)) { - $this->setCallbackUrl($config['callbackUrl']); - } - if (array_key_exists('topicUrl', $config)) { - $this->setTopicUrl($config['topicUrl']); - } - if (array_key_exists('storage', $config)) { - $this->setStorage($config['storage']); - } - if (array_key_exists('leaseSeconds', $config)) { - $this->setLeaseSeconds($config['leaseSeconds']); - } - if (array_key_exists('parameters', $config)) { - $this->setParameters($config['parameters']); - } - if (array_key_exists('authentications', $config)) { - $this->addAuthentications($config['authentications']); - } - if (array_key_exists('usePathParameter', $config)) { - $this->usePathParameter($config['usePathParameter']); - } - if (array_key_exists('preferredVerificationMode', $config)) { - $this->setPreferredVerificationMode( - $config['preferredVerificationMode'] - ); - } - return $this; - } - - /** - * Set the topic URL (RSS or Atom feed) to which the intended (un)subscribe - * event will relate - * - * @param string $url - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setTopicUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - .' of "' . $url . '" must be a non-empty string and a valid' - .' URL'); - } - $this->_topicUrl = $url; - return $this; - } - - /** - * Set the topic URL (RSS or Atom feed) to which the intended (un)subscribe - * event will relate - * - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return string - */ - public function getTopicUrl() - { - if (empty($this->_topicUrl)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('A valid Topic (RSS or Atom' - . ' feed) URL MUST be set before attempting any operation'); - } - return $this->_topicUrl; - } - - /** - * Set the number of seconds for which any subscription will remain valid - * - * @param int $seconds - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setLeaseSeconds($seconds) - { - $seconds = intval($seconds); - if ($seconds <= 0) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Expected lease seconds' - . ' must be an integer greater than zero'); - } - $this->_leaseSeconds = $seconds; - return $this; - } - - /** - * Get the number of lease seconds on subscriptions - * - * @return int - */ - public function getLeaseSeconds() - { - return $this->_leaseSeconds; - } - - /** - * Set the callback URL to be used by Hub Servers when communicating with - * this Subscriber - * - * @param string $url - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setCallbackUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - . ' of "' . $url . '" must be a non-empty string and a valid' - . ' URL'); - } - $this->_callbackUrl = $url; - return $this; - } - - /** - * Get the callback URL to be used by Hub Servers when communicating with - * this Subscriber - * - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return string - */ - public function getCallbackUrl() - { - if (empty($this->_callbackUrl)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('A valid Callback URL MUST be' - . ' set before attempting any operation'); - } - return $this->_callbackUrl; - } - - /** - * Set preferred verification mode (sync or async). By default, this - * Subscriber prefers synchronous verification, but does support - * asynchronous if that's the Hub Server's utilised mode. - * - * Zend_Feed_Pubsubhubbub_Subscriber will always send both modes, whose - * order of occurance in the parameter list determines this preference. - * - * @param string $mode Should be 'sync' or 'async' - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setPreferredVerificationMode($mode) - { - if ($mode !== Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC - && $mode !== Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid preferred' - . ' mode specified: "' . $mode . '" but should be one of' - . ' Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC or' - . ' Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC'); - } - $this->_preferredVerificationMode = $mode; - return $this; - } - - /** - * Get preferred verification mode (sync or async). - * - * @return string - */ - public function getPreferredVerificationMode() - { - return $this->_preferredVerificationMode; - } - - /** - * Add a Hub Server URL supported by Publisher - * - * @param string $url - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function addHubUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - . ' of "' . $url . '" must be a non-empty string and a valid' - . ' URL'); - } - $this->_hubUrls[] = $url; - return $this; - } - - /** - * Add an array of Hub Server URLs supported by Publisher - * - * @param array $urls - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function addHubUrls(array $urls) - { - foreach ($urls as $url) { - $this->addHubUrl($url); - } - return $this; - } - - /** - * Remove a Hub Server URL - * - * @param string $url - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function removeHubUrl($url) - { - if (!in_array($url, $this->getHubUrls())) { - return $this; - } - $key = array_search($url, $this->_hubUrls); - unset($this->_hubUrls[$key]); - return $this; - } - - /** - * Return an array of unique Hub Server URLs currently available - * - * @return array - */ - public function getHubUrls() - { - $this->_hubUrls = array_unique($this->_hubUrls); - return $this->_hubUrls; - } - - /** - * Add authentication credentials for a given URL - * - * @param string $url - * @param array $authentication - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function addAuthentication($url, array $authentication) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "url"' - . ' of "' . $url . '" must be a non-empty string and a valid' - . ' URL'); - } - $this->_authentications[$url] = $authentication; - return $this; - } - - /** - * Add authentication credentials for hub URLs - * - * @param array $authentications - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function addAuthentications(array $authentications) - { - foreach ($authentications as $url => $authentication) { - $this->addAuthentication($url, $authentication); - } - return $this; - } - - /** - * Get all hub URL authentication credentials - * - * @return array - */ - public function getAuthentications() - { - return $this->_authentications; - } - - /** - * Set flag indicating whether or not to use a path parameter - * - * @param bool $bool - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function usePathParameter($bool = true) - { - $this->_usePathParameter = $bool; - return $this; - } - - /** - * Add an optional parameter to the (un)subscribe requests - * - * @param string $name - * @param string|null $value - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setParameter($name, $value = null) - { - if (is_array($name)) { - $this->setParameters($name); - return $this; - } - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "name"' - . ' of "' . $name . '" must be a non-empty string'); - } - if ($value === null) { - $this->removeParameter($name); - return $this; - } - if (empty($value) || (!is_string($value) && $value !== null)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "value"' - . ' of "' . $value . '" must be a non-empty string'); - } - $this->_parameters[$name] = $value; - return $this; - } - - /** - * Add an optional parameter to the (un)subscribe requests - * - * @param array $parameters - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setParameters(array $parameters) - { - foreach ($parameters as $name => $value) { - $this->setParameter($name, $value); - } - return $this; - } - - /** - * Remove an optional parameter for the (un)subscribe requests - * - * @param string $name - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function removeParameter($name) - { - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid parameter "name"' - . ' of "' . $name . '" must be a non-empty string'); - } - if (array_key_exists($name, $this->_parameters)) { - unset($this->_parameters[$name]); - } - return $this; - } - - /** - * Return an array of optional parameters for (un)subscribe requests - * - * @return array - */ - public function getParameters() - { - return $this->_parameters; - } - - /** - * Sets an instance of Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface used to background - * save any verification tokens associated with a subscription or other. - * - * @param Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface $storage - * @return Zend_Feed_Pubsubhubbub_Subscriber - */ - public function setStorage(Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface $storage) - { - $this->_storage = $storage; - return $this; - } - - /** - * Gets an instance of Zend_Feed_Pubsubhubbub_Storage_StorageInterface used - * to background save any verification tokens associated with a subscription - * or other. - * - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface - */ - public function getStorage() - { - if ($this->_storage === null) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('No storage vehicle ' - . 'has been set.'); - } - return $this->_storage; - } - - /** - * Subscribe to one or more Hub Servers using the stored Hub URLs - * for the given Topic URL (RSS or Atom feed) - */ - public function subscribeAll() - { - return $this->_doRequest('subscribe'); - } - - /** - * Unsubscribe from one or more Hub Servers using the stored Hub URLs - * for the given Topic URL (RSS or Atom feed) - */ - public function unsubscribeAll() - { - return $this->_doRequest('unsubscribe'); - } - - /** - * Returns a boolean indicator of whether the notifications to Hub - * Servers were ALL successful. If even one failed, FALSE is returned. - * - * @return bool - */ - public function isSuccess() - { - if (count($this->_errors) > 0) { - return false; - } - return true; - } - - /** - * Return an array of errors met from any failures, including keys: - * 'response' => the Zend_Http_Response object from the failure - * 'hubUrl' => the URL of the Hub Server whose notification failed - * - * @return array - */ - public function getErrors() - { - return $this->_errors; - } - - /** - * Return an array of Hub Server URLs who returned a response indicating - * operation in Asynchronous Verification Mode, i.e. they will not confirm - * any (un)subscription immediately but at a later time (Hubs may be - * doing this as a batch process when load balancing) - * - * @return array - */ - public function getAsyncHubs() - { - return $this->_asyncHubs; - } - - /** - * Executes an (un)subscribe request - * - * @param string $mode - * @throws Zend_Feed_Pubsubhubbub_Exception - * @throws Zend_Http_Client_Exception - */ - protected function _doRequest($mode) - { - $client = $this->_getHttpClient(); - $hubs = $this->getHubUrls(); - if (empty($hubs)) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('No Hub Server URLs' - . ' have been set so no subscriptions can be attempted'); - } - $this->_errors = array(); - $this->_asyncHubs = array(); - foreach ($hubs as $url) { - if (array_key_exists($url, $this->_authentications)) { - $auth = $this->_authentications[$url]; - $client->setAuth($auth[0], $auth[1]); - } - $client->setUri($url); - $client->setRawData( - $this->_getRequestParameters($url, $mode), - 'application/x-www-form-urlencoded' - ); - $response = $client->request(); - if ($response->getStatus() !== 204 - && $response->getStatus() !== 202 - ) { - $this->_errors[] = array( - 'response' => $response, - 'hubUrl' => $url, - ); - /** - * At first I thought it was needed, but the backend storage will - * allow tracking async without any user interference. It's left - * here in case the user is interested in knowing what Hubs - * are using async verification modes so they may update Models and - * move these to asynchronous processes. - */ - } elseif ($response->getStatus() == 202) { - $this->_asyncHubs[] = array( - 'response' => $response, - 'hubUrl' => $url, - ); - } - } - } - - /** - * Get a basic prepared HTTP client for use - * - * @return Zend_Http_Client - */ - protected function _getHttpClient() - { - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $client->setMethod(Zend_Http_Client::POST); - $client->setConfig(array('useragent' => 'Zend_Feed_Pubsubhubbub_Subscriber/' - . Zend_Version::VERSION)); - return $client; - } - - /** - * Return a list of standard protocol/optional parameters for addition to - * client's POST body that are specific to the current Hub Server URL - * - * @param string $hubUrl - * @param string $mode - * @throws Zend_Feed_Pubsubhubbub_Exception - * @return string - */ - protected function _getRequestParameters($hubUrl, $mode) - { - if (!in_array($mode, array('subscribe', 'unsubscribe'))) { - #require_once 'Zend/Feed/Pubsubhubbub/Exception.php'; - throw new Zend_Feed_Pubsubhubbub_Exception('Invalid mode specified: "' - . $mode . '" which should have been "subscribe" or "unsubscribe"'); - } - - $params = array( - 'hub.mode' => $mode, - 'hub.topic' => $this->getTopicUrl(), - ); - - if ($this->getPreferredVerificationMode() - == Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC - ) { - $vmodes = array( - Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC, - Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC, - ); - } else { - $vmodes = array( - Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC, - Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC, - ); - } - $params['hub.verify'] = array(); - foreach($vmodes as $vmode) { - $params['hub.verify'][] = $vmode; - } - - /** - * Establish a persistent verify_token and attach key to callback - * URL's path/querystring - */ - $key = $this->_generateSubscriptionKey($params, $hubUrl); - $token = $this->_generateVerifyToken(); - $params['hub.verify_token'] = $token; - - // Note: query string only usable with PuSH 0.2 Hubs - if (!$this->_usePathParameter) { - $params['hub.callback'] = $this->getCallbackUrl() - . '?xhub.subscription=' . Zend_Feed_Pubsubhubbub::urlencode($key); - } else { - $params['hub.callback'] = rtrim($this->getCallbackUrl(), '/') - . '/' . Zend_Feed_Pubsubhubbub::urlencode($key); - } - if ($mode == 'subscribe' && $this->getLeaseSeconds() !== null) { - $params['hub.lease_seconds'] = $this->getLeaseSeconds(); - } - - // hub.secret not currently supported - $optParams = $this->getParameters(); - foreach ($optParams as $name => $value) { - $params[$name] = $value; - } - - // store subscription to storage - $now = new Zend_Date; - $expires = null; - if (isset($params['hub.lease_seconds'])) { - $expires = $now->add($params['hub.lease_seconds'], Zend_Date::SECOND) - ->get('yyyy-MM-dd HH:mm:ss'); - } - $data = array( - 'id' => $key, - 'topic_url' => $params['hub.topic'], - 'hub_url' => $hubUrl, - 'created_time' => $now->get('yyyy-MM-dd HH:mm:ss'), - 'lease_seconds' => $expires, - 'verify_token' => hash('sha256', $params['hub.verify_token']), - 'secret' => null, - 'expiration_time' => $expires, - 'subscription_state' => Zend_Feed_Pubsubhubbub::SUBSCRIPTION_NOTVERIFIED, - ); - $this->getStorage()->setSubscription($data); - - return $this->_toByteValueOrderedString( - $this->_urlEncode($params) - ); - } - - /** - * Simple helper to generate a verification token used in (un)subscribe - * requests to a Hub Server. Follows no particular method, which means - * it might be improved/changed in future. - * - * @return string - */ - protected function _generateVerifyToken() - { - if (!empty($this->_testStaticToken)) { - return $this->_testStaticToken; - } - return uniqid(rand(), true) . time(); - } - - /** - * Simple helper to generate a verification token used in (un)subscribe - * requests to a Hub Server. - * - * @param array $params - * @param string $hubUrl The Hub Server URL for which this token will apply - * @return string - */ - protected function _generateSubscriptionKey(array $params, $hubUrl) - { - $keyBase = $params['hub.topic'] . $hubUrl; - $key = md5($keyBase); - return $key; - } - - /** - * URL Encode an array of parameters - * - * @param array $params - * @return array - */ - protected function _urlEncode(array $params) - { - $encoded = array(); - foreach ($params as $key => $value) { - if (is_array($value)) { - $ekey = Zend_Feed_Pubsubhubbub::urlencode($key); - $encoded[$ekey] = array(); - foreach ($value as $duplicateKey) { - $encoded[$ekey][] - = Zend_Feed_Pubsubhubbub::urlencode($duplicateKey); - } - } else { - $encoded[Zend_Feed_Pubsubhubbub::urlencode($key)] - = Zend_Feed_Pubsubhubbub::urlencode($value); - } - } - return $encoded; - } - - /** - * Order outgoing parameters - * - * @param array $params - * @return array - */ - protected function _toByteValueOrderedString(array $params) - { - $return = array(); - uksort($params, 'strnatcmp'); - foreach ($params as $key => $value) { - if (is_array($value)) { - foreach ($value as $keyduplicate) { - $return[] = $key . '=' . $keyduplicate; - } - } else { - $return[] = $key . '=' . $value; - } - } - return implode('&', $return); - } - - /** - * This is STRICTLY for testing purposes only... - */ - protected $_testStaticToken = null; - - final public function setTestStaticToken($token) - { - $this->_testStaticToken = (string) $token; - } -} diff --git a/library/Zend/Feed/Pubsubhubbub/Subscriber/Callback.php b/library/Zend/Feed/Pubsubhubbub/Subscriber/Callback.php deleted file mode 100644 index aeabbf7cbf..0000000000 --- a/library/Zend/Feed/Pubsubhubbub/Subscriber/Callback.php +++ /dev/null @@ -1,330 +0,0 @@ -_subscriptionKey = $key; - return $this; - } - - /** - * Handle any callback from a Hub Server responding to a subscription or - * unsubscription request. This should be the Hub Server confirming the - * the request prior to taking action on it. - * - * @param array $httpGetData GET data if available and not in $_GET - * @param bool $sendResponseNow Whether to send response now or when asked - * @return void - */ - public function handle(array $httpGetData = null, $sendResponseNow = false) - { - if ($httpGetData === null) { - $httpGetData = $_GET; - } - - /** - * Handle any feed updates (sorry for the mess :P) - * - * This DOES NOT attempt to process a feed update. Feed updates - * SHOULD be validated/processed by an asynchronous process so as - * to avoid holding up responses to the Hub. - */ - $contentType = $this->_getHeader('Content-Type'); - if (strtolower($_SERVER['REQUEST_METHOD']) == 'post' - && $this->_hasValidVerifyToken(null, false) - && (stripos($contentType, 'application/atom+xml') === 0 - || stripos($contentType, 'application/rss+xml') === 0 - || stripos($contentType, 'application/xml') === 0 - || stripos($contentType, 'text/xml') === 0 - || stripos($contentType, 'application/rdf+xml') === 0) - ) { - $this->setFeedUpdate($this->_getRawBody()); - $this->getHttpResponse() - ->setHeader('X-Hub-On-Behalf-Of', $this->getSubscriberCount()); - /** - * Handle any (un)subscribe confirmation requests - */ - } elseif ($this->isValidHubVerification($httpGetData)) { - $data = $this->_currentSubscriptionData; - $this->getHttpResponse()->setBody($httpGetData['hub_challenge']); - $data['subscription_state'] = Zend_Feed_Pubsubhubbub::SUBSCRIPTION_VERIFIED; - if (isset($httpGetData['hub_lease_seconds'])) { - $data['lease_seconds'] = $httpGetData['hub_lease_seconds']; - } - $this->getStorage()->setSubscription($data); - /** - * Hey, C'mon! We tried everything else! - */ - } else { - $this->getHttpResponse()->setHttpResponseCode(404); - } - if ($sendResponseNow) { - $this->sendResponse(); - } - } - - /** - * Checks validity of the request simply by making a quick pass and - * confirming the presence of all REQUIRED parameters. - * - * @param array $httpGetData - * @return bool - */ - public function isValidHubVerification(array $httpGetData) - { - /** - * As per the specification, the hub.verify_token is OPTIONAL. This - * implementation of Pubsubhubbub considers it REQUIRED and will - * always send a hub.verify_token parameter to be echoed back - * by the Hub Server. Therefore, its absence is considered invalid. - */ - if (strtolower($_SERVER['REQUEST_METHOD']) !== 'get') { - return false; - } - $required = array( - 'hub_mode', - 'hub_topic', - 'hub_challenge', - 'hub_verify_token', - ); - foreach ($required as $key) { - if (!array_key_exists($key, $httpGetData)) { - return false; - } - } - if ($httpGetData['hub_mode'] !== 'subscribe' - && $httpGetData['hub_mode'] !== 'unsubscribe' - ) { - return false; - } - if ($httpGetData['hub_mode'] == 'subscribe' - && !array_key_exists('hub_lease_seconds', $httpGetData) - ) { - return false; - } - if (!Zend_Uri::check($httpGetData['hub_topic'])) { - return false; - } - - /** - * Attempt to retrieve any Verification Token Key attached to Callback - * URL's path by our Subscriber implementation - */ - if (!$this->_hasValidVerifyToken($httpGetData)) { - return false; - } - return true; - } - - /** - * Sets a newly received feed (Atom/RSS) sent by a Hub as an update to a - * Topic we've subscribed to. - * - * @param string $feed - * @return Zend_Feed_Pubsubhubbub_Subscriber_Callback - */ - public function setFeedUpdate($feed) - { - $this->_feedUpdate = $feed; - return $this; - } - - /** - * Check if any newly received feed (Atom/RSS) update was received - * - * @return bool - */ - public function hasFeedUpdate() - { - if ($this->_feedUpdate === null) { - return false; - } - return true; - } - - /** - * Gets a newly received feed (Atom/RSS) sent by a Hub as an update to a - * Topic we've subscribed to. - * - * @return string - */ - public function getFeedUpdate() - { - return $this->_feedUpdate; - } - - /** - * Check for a valid verify_token. By default attempts to compare values - * with that sent from Hub, otherwise merely ascertains its existence. - * - * @param array $httpGetData - * @param bool $checkValue - * @return bool - */ - protected function _hasValidVerifyToken(array $httpGetData = null, $checkValue = true) - { - $verifyTokenKey = $this->_detectVerifyTokenKey($httpGetData); - if (empty($verifyTokenKey)) { - return false; - } - $verifyTokenExists = $this->getStorage()->hasSubscription($verifyTokenKey); - if (!$verifyTokenExists) { - return false; - } - if ($checkValue) { - $data = $this->getStorage()->getSubscription($verifyTokenKey); - $verifyToken = $data['verify_token']; - if ($verifyToken !== hash('sha256', $httpGetData['hub_verify_token'])) { - return false; - } - $this->_currentSubscriptionData = $data; - return true; - } - return true; - } - - /** - * Attempt to detect the verification token key. This would be passed in - * the Callback URL (which we are handling with this class!) as a URI - * path part (the last part by convention). - * - * @param null|array $httpGetData - * @return false|string - */ - protected function _detectVerifyTokenKey(array $httpGetData = null) - { - /** - * Available when sub keys encoding in Callback URL path - */ - if (isset($this->_subscriptionKey)) { - return $this->_subscriptionKey; - } - - /** - * Available only if allowed by PuSH 0.2 Hubs - */ - if (is_array($httpGetData) - && isset($httpGetData['xhub_subscription']) - ) { - return $httpGetData['xhub_subscription']; - } - - /** - * Available (possibly) if corrupted in transit and not part of $_GET - */ - $params = $this->_parseQueryString(); - if (isset($params['xhub.subscription'])) { - return rawurldecode($params['xhub.subscription']); - } - - return false; - } - - /** - * Build an array of Query String parameters. - * This bypasses $_GET which munges parameter names and cannot accept - * multiple parameters with the same key. - * - * @return array|void - */ - protected function _parseQueryString() - { - $params = array(); - $queryString = ''; - if (isset($_SERVER['QUERY_STRING'])) { - $queryString = $_SERVER['QUERY_STRING']; - } - if (empty($queryString)) { - return array(); - } - $parts = explode('&', $queryString); - foreach ($parts as $kvpair) { - $pair = explode('=', $kvpair); - $key = rawurldecode($pair[0]); - $value = rawurldecode($pair[1]); - if (isset($params[$key])) { - if (is_array($params[$key])) { - $params[$key][] = $value; - } else { - $params[$key] = array($params[$key], $value); - } - } else { - $params[$key] = $value; - } - } - return $params; - } -} diff --git a/library/Zend/Feed/Reader.php b/library/Zend/Feed/Reader.php deleted file mode 100644 index bd3961936a..0000000000 --- a/library/Zend/Feed/Reader.php +++ /dev/null @@ -1,757 +0,0 @@ - array( - 'DublinCore_Feed', - 'Atom_Feed' - ), - 'entry' => array( - 'Content_Entry', - 'DublinCore_Entry', - 'Atom_Entry' - ), - 'core' => array( - 'DublinCore_Feed', - 'Atom_Feed', - 'Content_Entry', - 'DublinCore_Entry', - 'Atom_Entry' - ) - ); - - /** - * Get the Feed cache - * - * @return Zend_Cache_Core - */ - public static function getCache() - { - return self::$_cache; - } - - /** - * Set the feed cache - * - * @param Zend_Cache_Core $cache - * @return void - */ - public static function setCache(Zend_Cache_Core $cache) - { - self::$_cache = $cache; - } - - /** - * Set the HTTP client instance - * - * Sets the HTTP client object to use for retrieving the feeds. - * - * @param Zend_Http_Client $httpClient - * @return void - */ - public static function setHttpClient(Zend_Http_Client $httpClient) - { - self::$_httpClient = $httpClient; - } - - - /** - * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. - * - * @return Zend_Http_Client_Abstract - */ - public static function getHttpClient() - { - if (!self::$_httpClient instanceof Zend_Http_Client) { - /** - * @see Zend_Http_Client - */ - #require_once 'Zend/Http/Client.php'; - self::$_httpClient = new Zend_Http_Client(); - } - - return self::$_httpClient; - } - - /** - * Toggle using POST instead of PUT and DELETE HTTP methods - * - * Some feed implementations do not accept PUT and DELETE HTTP - * methods, or they can't be used because of proxies or other - * measures. This allows turning on using POST where PUT and - * DELETE would normally be used; in addition, an - * X-Method-Override header will be sent with a value of PUT or - * DELETE as appropriate. - * - * @param boolean $override Whether to override PUT and DELETE. - * @return void - */ - public static function setHttpMethodOverride($override = true) - { - self::$_httpMethodOverride = $override; - } - - /** - * Get the HTTP override state - * - * @return boolean - */ - public static function getHttpMethodOverride() - { - return self::$_httpMethodOverride; - } - - /** - * Set the flag indicating whether or not to use HTTP conditional GET - * - * @param bool $bool - * @return void - */ - public static function useHttpConditionalGet($bool = true) - { - self::$_httpConditionalGet = $bool; - } - - /** - * Import a feed by providing a URL - * - * @param string $url The URL to the feed - * @param string $etag OPTIONAL Last received ETag for this resource - * @param string $lastModified OPTIONAL Last-Modified value for this resource - * @return Zend_Feed_Reader_FeedInterface - */ - public static function import($uri, $etag = null, $lastModified = null) - { - $cache = self::getCache(); - $feed = null; - $responseXml = ''; - $client = self::getHttpClient(); - $client->resetParameters(); - $client->setHeaders('If-None-Match', null); - $client->setHeaders('If-Modified-Since', null); - $client->setUri($uri); - $cacheId = 'Zend_Feed_Reader_' . md5($uri); - - if (self::$_httpConditionalGet && $cache) { - $data = $cache->load($cacheId); - if ($data) { - if ($etag === null) { - $etag = $cache->load($cacheId.'_etag'); - } - if ($lastModified === null) { - $lastModified = $cache->load($cacheId.'_lastmodified'); - } - if ($etag) { - $client->setHeaders('If-None-Match', $etag); - } - if ($lastModified) { - $client->setHeaders('If-Modified-Since', $lastModified); - } - } - $response = $client->request('GET'); - if ($response->getStatus() !== 200 && $response->getStatus() !== 304) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); - } - if ($response->getStatus() == 304) { - $responseXml = $data; - } else { - $responseXml = $response->getBody(); - $cache->save($responseXml, $cacheId); - if ($response->getHeader('ETag')) { - $cache->save($response->getHeader('ETag'), $cacheId.'_etag'); - } - if ($response->getHeader('Last-Modified')) { - $cache->save($response->getHeader('Last-Modified'), $cacheId.'_lastmodified'); - } - } - if (empty($responseXml)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got empty response body'); - } - return self::importString($responseXml); - } elseif ($cache) { - $data = $cache->load($cacheId); - if ($data !== false) { - return self::importString($data); - } - $response = $client->request('GET'); - if ($response->getStatus() !== 200) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); - } - $responseXml = $response->getBody(); - $cache->save($responseXml, $cacheId); - if (empty($responseXml)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got empty response body'); - } - return self::importString($responseXml); - } else { - $response = $client->request('GET'); - if ($response->getStatus() !== 200) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); - } - $responseXml = $response->getBody(); - if (empty($responseXml)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Feed failed to load, got empty response body'); - } - $reader = self::importString($responseXml); - $reader->setOriginalSourceUri($uri); - return $reader; - } - } - - /** - * Import a feed by providing a Zend_Feed_Abstract object - * - * @param Zend_Feed_Abstract $feed A fully instantiated Zend_Feed object - * @return Zend_Feed_Reader_FeedInterface - */ - public static function importFeed(Zend_Feed_Abstract $feed) - { - $dom = $feed->getDOM()->ownerDocument; - $type = self::detectType($dom); - self::_registerCoreExtensions(); - if (substr($type, 0, 3) == 'rss') { - $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); - } else { - $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); - } - - return $reader; - } - - /** - * Import a feed from a string - * - * @param string $string - * @return Zend_Feed_Reader_FeedInterface - */ - public static function importString($string) - { - $dom = new DOMDocument; - try { - $dom = Zend_Xml_Security::scan($string, $dom); - } catch (Zend_Xml_Exception $e) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - $e->getMessage() - ); - } - if (!$dom) { - // Build error message - $error = libxml_get_last_error(); - if ($error && $error->message) { - $errormsg = "DOMDocument cannot parse XML: {$error->message}"; - } else { - $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity"; - } - - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception($errormsg); - } - - $type = self::detectType($dom); - - self::_registerCoreExtensions(); - - if (substr($type, 0, 3) == 'rss') { - $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); - } elseif (substr($type, 8, 5) == 'entry') { - $reader = new Zend_Feed_Reader_Entry_Atom($dom->documentElement, 0, Zend_Feed_Reader::TYPE_ATOM_10); - } elseif (substr($type, 0, 4) == 'atom') { - $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('The URI used does not point to a ' - . 'valid Atom, RSS or RDF feed that Zend_Feed_Reader can parse.'); - } - return $reader; - } - - /** - * Imports a feed from a file located at $filename. - * - * @param string $filename - * @throws Zend_Feed_Exception - * @return Zend_Feed_Reader_FeedInterface - */ - public static function importFile($filename) - { - @ini_set('track_errors', 1); - $feed = @file_get_contents($filename); - @ini_restore('track_errors'); - if ($feed === false) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("File could not be loaded: $php_errormsg"); - } - return self::importString($feed); - } - - public static function findFeedLinks($uri) - { - // Get the HTTP response from $uri and save the contents - $client = self::getHttpClient(); - $client->setUri($uri); - $response = $client->request(); - if ($response->getStatus() !== 200) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus()); - } - $responseHtml = $response->getBody(); - $libxml_errflag = libxml_use_internal_errors(true); - $oldValue = libxml_disable_entity_loader(true); - $dom = new DOMDocument; - $status = $dom->loadHTML($responseHtml); - libxml_disable_entity_loader($oldValue); - libxml_use_internal_errors($libxml_errflag); - if (!$status) { - // Build error message - $error = libxml_get_last_error(); - if ($error && $error->message) { - $errormsg = "DOMDocument cannot parse HTML: {$error->message}"; - } else { - $errormsg = "DOMDocument cannot parse HTML: Please check the XML document's validity"; - } - - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception($errormsg); - } - $feedSet = new Zend_Feed_Reader_FeedSet; - $links = $dom->getElementsByTagName('link'); - $feedSet->addLinks($links, $uri); - return $feedSet; - } - - /** - * Detect the feed type of the provided feed - * - * @param Zend_Feed_Abstract|DOMDocument|string $feed - * @param bool $specOnly - * @return string - * @throws Zend_Feed_Exception - */ - public static function detectType($feed, $specOnly = false) - { - if ($feed instanceof Zend_Feed_Reader_FeedInterface) { - $dom = $feed->getDomDocument(); - } elseif($feed instanceof DOMDocument) { - $dom = $feed; - } elseif(is_string($feed) && !empty($feed)) { - @ini_set('track_errors', 1); - //$oldValue = libxml_disable_entity_loader(true); - $dom = new DOMDocument; - try { - $dom = Zend_Xml_Security::scan($feed, $dom); - } catch (Zend_Xml_Exception $e) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - $e->getMessage() - ); - } - //libxml_disable_entity_loader($oldValue); - @ini_restore('track_errors'); - if (!$dom) { - if (!isset($php_errormsg)) { - if (function_exists('xdebug_is_enabled')) { - $php_errormsg = '(error message not available, when XDebug is running)'; - } else { - $php_errormsg = '(error message not available)'; - } - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); - } - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid object/scalar provided: must' - . ' be of type Zend_Feed_Reader_FeedInterface, DomDocument or string'); - } - $xpath = new DOMXPath($dom); - - if ($xpath->query('/rss')->length) { - $type = self::TYPE_RSS_ANY; - $version = $xpath->evaluate('string(/rss/@version)'); - - if (strlen($version) > 0) { - switch($version) { - case '2.0': - $type = self::TYPE_RSS_20; - break; - - case '0.94': - $type = self::TYPE_RSS_094; - break; - - case '0.93': - $type = self::TYPE_RSS_093; - break; - - case '0.92': - $type = self::TYPE_RSS_092; - break; - - case '0.91': - $type = self::TYPE_RSS_091; - break; - } - } - - return $type; - } - - $xpath->registerNamespace('rdf', self::NAMESPACE_RDF); - - if ($xpath->query('/rdf:RDF')->length) { - $xpath->registerNamespace('rss', self::NAMESPACE_RSS_10); - - if ($xpath->query('/rdf:RDF/rss:channel')->length - || $xpath->query('/rdf:RDF/rss:image')->length - || $xpath->query('/rdf:RDF/rss:item')->length - || $xpath->query('/rdf:RDF/rss:textinput')->length - ) { - return self::TYPE_RSS_10; - } - - $xpath->registerNamespace('rss', self::NAMESPACE_RSS_090); - - if ($xpath->query('/rdf:RDF/rss:channel')->length - || $xpath->query('/rdf:RDF/rss:image')->length - || $xpath->query('/rdf:RDF/rss:item')->length - || $xpath->query('/rdf:RDF/rss:textinput')->length - ) { - return self::TYPE_RSS_090; - } - } - - $type = self::TYPE_ATOM_ANY; - $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_10); - - if ($xpath->query('//atom:feed')->length) { - return self::TYPE_ATOM_10; - } - - if ($xpath->query('//atom:entry')->length) { - if ($specOnly == true) { - return self::TYPE_ATOM_10; - } else { - return self::TYPE_ATOM_10_ENTRY; - } - } - - $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_03); - - if ($xpath->query('//atom:feed')->length) { - return self::TYPE_ATOM_03; - } - - return self::TYPE_ANY; - } - - /** - * Set plugin loader for use with Extensions - * - * @param Zend_Loader_PluginLoader_Interface $loader - */ - public static function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) - { - self::$_pluginLoader = $loader; - } - - /** - * Get plugin loader for use with Extensions - * - * @return Zend_Loader_PluginLoader_Interface $loader - */ - public static function getPluginLoader() - { - if (!isset(self::$_pluginLoader)) { - #require_once 'Zend/Loader/PluginLoader.php'; - self::$_pluginLoader = new Zend_Loader_PluginLoader(array( - 'Zend_Feed_Reader_Extension_' => 'Zend/Feed/Reader/Extension/', - )); - } - return self::$_pluginLoader; - } - - /** - * Add prefix path for loading Extensions - * - * @param string $prefix - * @param string $path - * @return void - */ - public static function addPrefixPath($prefix, $path) - { - $prefix = rtrim($prefix, '_'); - $path = rtrim($path, DIRECTORY_SEPARATOR); - self::getPluginLoader()->addPrefixPath($prefix, $path); - } - - /** - * Add multiple Extension prefix paths at once - * - * @param array $spec - * @return void - */ - public static function addPrefixPaths(array $spec) - { - if (isset($spec['prefix']) && isset($spec['path'])) { - self::addPrefixPath($spec['prefix'], $spec['path']); - } - foreach ($spec as $prefixPath) { - if (isset($prefixPath['prefix']) && isset($prefixPath['path'])) { - self::addPrefixPath($prefixPath['prefix'], $prefixPath['path']); - } - } - } - - /** - * Register an Extension by name - * - * @param string $name - * @return void - * @throws Zend_Feed_Exception if unable to resolve Extension class - */ - public static function registerExtension($name) - { - $feedName = $name . '_Feed'; - $entryName = $name . '_Entry'; - if (self::isRegistered($name)) { - if (self::getPluginLoader()->isLoaded($feedName) || - self::getPluginLoader()->isLoaded($entryName)) { - return; - } - } - try { - self::getPluginLoader()->load($feedName); - self::$_extensions['feed'][] = $feedName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - try { - self::getPluginLoader()->load($entryName); - self::$_extensions['entry'][] = $entryName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - if (!self::getPluginLoader()->isLoaded($feedName) - && !self::getPluginLoader()->isLoaded($entryName) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Could not load extension: ' . $name - . 'using Plugin Loader. Check prefix paths are configured and extension exists.'); - } - } - - /** - * Is a given named Extension registered? - * - * @param string $extensionName - * @return boolean - */ - public static function isRegistered($extensionName) - { - $feedName = $extensionName . '_Feed'; - $entryName = $extensionName . '_Entry'; - if (in_array($feedName, self::$_extensions['feed']) - || in_array($entryName, self::$_extensions['entry']) - ) { - return true; - } - return false; - } - - /** - * Get a list of extensions - * - * @return array - */ - public static function getExtensions() - { - return self::$_extensions; - } - - /** - * Reset class state to defaults - * - * @return void - */ - public static function reset() - { - self::$_cache = null; - self::$_httpClient = null; - self::$_httpMethodOverride = false; - self::$_httpConditionalGet = false; - self::$_pluginLoader = null; - self::$_prefixPaths = array(); - self::$_extensions = array( - 'feed' => array( - 'DublinCore_Feed', - 'Atom_Feed' - ), - 'entry' => array( - 'Content_Entry', - 'DublinCore_Entry', - 'Atom_Entry' - ), - 'core' => array( - 'DublinCore_Feed', - 'Atom_Feed', - 'Content_Entry', - 'DublinCore_Entry', - 'Atom_Entry' - ) - ); - } - - /** - * Register core (default) extensions - * - * @return void - */ - protected static function _registerCoreExtensions() - { - self::registerExtension('DublinCore'); - self::registerExtension('Content'); - self::registerExtension('Atom'); - self::registerExtension('Slash'); - self::registerExtension('WellFormedWeb'); - self::registerExtension('Thread'); - self::registerExtension('Podcast'); - } - - /** - * Utility method to apply array_unique operation to a multidimensional - * array. - * - * @param array - * @return array - */ - public static function arrayUnique(array $array) - { - foreach ($array as &$value) { - $value = serialize($value); - } - $array = array_unique($array); - foreach ($array as &$value) { - $value = unserialize($value); - } - return $array; - } - -} diff --git a/library/Zend/Feed/Reader/Collection.php b/library/Zend/Feed/Reader/Collection.php deleted file mode 100644 index b12d6744ac..0000000000 --- a/library/Zend/Feed/Reader/Collection.php +++ /dev/null @@ -1,33 +0,0 @@ -getIterator() as $element) { - $authors[] = $element['name']; - } - return array_unique($authors); - } - -} diff --git a/library/Zend/Feed/Reader/Collection/Category.php b/library/Zend/Feed/Reader/Collection/Category.php deleted file mode 100644 index 2633fa585f..0000000000 --- a/library/Zend/Feed/Reader/Collection/Category.php +++ /dev/null @@ -1,57 +0,0 @@ -getIterator() as $element) { - if (isset($element['label']) && !empty($element['label'])) { - $categories[] = $element['label']; - } else { - $categories[] = $element['term']; - } - } - return array_unique($categories); - } - -} diff --git a/library/Zend/Feed/Reader/Collection/CollectionAbstract.php b/library/Zend/Feed/Reader/Collection/CollectionAbstract.php deleted file mode 100644 index d718d55ede..0000000000 --- a/library/Zend/Feed/Reader/Collection/CollectionAbstract.php +++ /dev/null @@ -1,41 +0,0 @@ -_xpathQuery = '//atom:entry[' . ($this->_entryKey + 1) . ']'; - - $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Entry'); - $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type); - - $threadClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Thread_Entry'); - $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type); - - $threadClass = Zend_Feed_Reader::getPluginLoader()->getClassName('DublinCore_Entry'); - $this->_extensions['DublinCore_Entry'] = new $threadClass($entry, $entryKey, $type); - } - - /** - * Get the specified author - * - * @param int $index - * @return string|null - */ - public function getAuthor($index = 0) - { - $authors = $this->getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $people = $this->getExtension('Atom')->getAuthors(); - - $this->_data['authors'] = $people; - - return $this->_data['authors']; - } - - /** - * Get the entry content - * - * @return string - */ - public function getContent() - { - if (array_key_exists('content', $this->_data)) { - return $this->_data['content']; - } - - $content = $this->getExtension('Atom')->getContent(); - - $this->_data['content'] = $content; - - return $this->_data['content']; - } - - /** - * Get the entry creation date - * - * @return string - */ - public function getDateCreated() - { - if (array_key_exists('datecreated', $this->_data)) { - return $this->_data['datecreated']; - } - - $dateCreated = $this->getExtension('Atom')->getDateCreated(); - - $this->_data['datecreated'] = $dateCreated; - - return $this->_data['datecreated']; - } - - /** - * Get the entry modification date - * - * @return string - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $dateModified = $this->getExtension('Atom')->getDateModified(); - - $this->_data['datemodified'] = $dateModified; - - return $this->_data['datemodified']; - } - - /** - * Get the entry description - * - * @return string - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = $this->getExtension('Atom')->getDescription(); - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the entry enclosure - * - * @return string - */ - public function getEnclosure() - { - if (array_key_exists('enclosure', $this->_data)) { - return $this->_data['enclosure']; - } - - $enclosure = $this->getExtension('Atom')->getEnclosure(); - - $this->_data['enclosure'] = $enclosure; - - return $this->_data['enclosure']; - } - - /** - * Get the entry ID - * - * @return string - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = $this->getExtension('Atom')->getId(); - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get a specific link - * - * @param int $index - * @return string - */ - public function getLink($index = 0) - { - if (!array_key_exists('links', $this->_data)) { - $this->getLinks(); - } - - if (isset($this->_data['links'][$index])) { - return $this->_data['links'][$index]; - } - - return null; - } - - /** - * Get all links - * - * @return array - */ - public function getLinks() - { - if (array_key_exists('links', $this->_data)) { - return $this->_data['links']; - } - - $links = $this->getExtension('Atom')->getLinks(); - - $this->_data['links'] = $links; - - return $this->_data['links']; - } - - /** - * Get a permalink to the entry - * - * @return string - */ - public function getPermalink() - { - return $this->getLink(0); - } - - /** - * Get the entry title - * - * @return string - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = $this->getExtension('Atom')->getTitle(); - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get the number of comments/replies for current entry - * - * @return integer - */ - public function getCommentCount() - { - if (array_key_exists('commentcount', $this->_data)) { - return $this->_data['commentcount']; - } - - $commentcount = $this->getExtension('Thread')->getCommentCount(); - - if (!$commentcount) { - $commentcount = $this->getExtension('Atom')->getCommentCount(); - } - - $this->_data['commentcount'] = $commentcount; - - return $this->_data['commentcount']; - } - - /** - * Returns a URI pointing to the HTML page where comments can be made on this entry - * - * @return string - */ - public function getCommentLink() - { - if (array_key_exists('commentlink', $this->_data)) { - return $this->_data['commentlink']; - } - - $commentlink = $this->getExtension('Atom')->getCommentLink(); - - $this->_data['commentlink'] = $commentlink; - - return $this->_data['commentlink']; - } - - /** - * Returns a URI pointing to a feed of all comments for this entry - * - * @return string - */ - public function getCommentFeedLink() - { - if (array_key_exists('commentfeedlink', $this->_data)) { - return $this->_data['commentfeedlink']; - } - - $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink(); - - $this->_data['commentfeedlink'] = $commentfeedlink; - - return $this->_data['commentfeedlink']; - } - - /** - * Get category data as a Zend_Feed_Reader_Collection_Category object - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - $categoryCollection = $this->getExtension('Atom')->getCategories(); - - if (count($categoryCollection) == 0) { - $categoryCollection = $this->getExtension('DublinCore')->getCategories(); - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Get source feed metadata from the entry - * - * @return Zend_Feed_Reader_Feed_Atom_Source|null - */ - public function getSource() - { - if (array_key_exists('source', $this->_data)) { - return $this->_data['source']; - } - - $source = $this->getExtension('Atom')->getSource(); - - $this->_data['source'] = $source; - - return $this->_data['source']; - } - - /** - * Set the XPath query (incl. on all Extensions) - * - * @param DOMXPath $xpath - */ - public function setXpath(DOMXPath $xpath) - { - parent::setXpath($xpath); - foreach ($this->_extensions as $extension) { - $extension->setXpath($this->_xpath); - } - } -} diff --git a/library/Zend/Feed/Reader/Entry/Rss.php b/library/Zend/Feed/Reader/Entry/Rss.php deleted file mode 100644 index 0a23c42c75..0000000000 --- a/library/Zend/Feed/Reader/Entry/Rss.php +++ /dev/null @@ -1,668 +0,0 @@ -_xpathQueryRss = '//item[' . ($this->_entryKey+1) . ']'; - $this->_xpathQueryRdf = '//rss:item[' . ($this->_entryKey+1) . ']'; - - $pluginLoader = Zend_Feed_Reader::getPluginLoader(); - - $dublinCoreClass = $pluginLoader->getClassName('DublinCore_Entry'); - $this->_extensions['DublinCore_Entry'] = new $dublinCoreClass($entry, $entryKey, $type); - - $contentClass = $pluginLoader->getClassName('Content_Entry'); - $this->_extensions['Content_Entry'] = new $contentClass($entry, $entryKey, $type); - - $atomClass = $pluginLoader->getClassName('Atom_Entry'); - $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type); - - $wfwClass = $pluginLoader->getClassName('WellFormedWeb_Entry'); - $this->_extensions['WellFormedWeb_Entry'] = new $wfwClass($entry, $entryKey, $type); - - $slashClass = $pluginLoader->getClassName('Slash_Entry'); - $this->_extensions['Slash_Entry'] = new $slashClass($entry, $entryKey, $type); - - $threadClass = $pluginLoader->getClassName('Thread_Entry'); - $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type); - } - - /** - * Get an author entry - * - * @param DOMElement $element - * @return string - */ - public function getAuthor($index = 0) - { - $authors = $this->getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = array(); - $authors_dc = $this->getExtension('DublinCore')->getAuthors(); - if (!empty($authors_dc)) { - foreach ($authors_dc as $author) { - $authors[] = array( - 'name' => $author['name'] - ); - } - } - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query($this->_xpathQueryRss . '//author'); - } else { - $list = $this->_xpath->query($this->_xpathQueryRdf . '//rss:author'); - } - if ($list->length) { - foreach ($list as $author) { - $string = trim($author->nodeValue); - $email = null; - $name = null; - $data = array(); - // Pretty rough parsing - but it's a catchall - if (preg_match("/^.*@[^ ]*/", $string, $matches)) { - $data['email'] = trim($matches[0]); - if (preg_match("/\((.*)\)$/", $string, $matches)) { - $data['name'] = $matches[1]; - } - $authors[] = $data; - } - } - } - - if (count($authors) == 0) { - $authors = $this->getExtension('Atom')->getAuthors(); - } else { - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } - - if (count($authors) == 0) { - $authors = null; - } - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get the entry content - * - * @return string - */ - public function getContent() - { - if (array_key_exists('content', $this->_data)) { - return $this->_data['content']; - } - - $content = $this->getExtension('Content')->getContent(); - - if (!$content) { - $content = $this->getDescription(); - } - - if (empty($content)) { - $content = $this->getExtension('Atom')->getContent(); - } - - $this->_data['content'] = $content; - - return $this->_data['content']; - } - - /** - * Get the entry's date of creation - * - * @return string - */ - public function getDateCreated() - { - return $this->getDateModified(); - } - - /** - * Get the entry's date of modification - * - * @return string - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $dateModified = null; - $date = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $dateModified = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/pubDate)'); - if ($dateModified) { - $dateModifiedParsed = strtotime($dateModified); - if ($dateModifiedParsed) { - $date = new Zend_Date($dateModifiedParsed); - } else { - $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, - Zend_Date::RFC_2822, Zend_Date::DATES); - $date = new Zend_Date; - foreach ($dateStandards as $standard) { - try { - $date->set($dateModified, $standard); - break; - } catch (Zend_Date_Exception $e) { - if ($standard == Zend_Date::DATES) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - 'Could not load date due to unrecognised' - .' format (should follow RFC 822 or 2822):' - . $e->getMessage(), - 0, $e - ); - } - } - } - } - } - } - - if (!$date) { - $date = $this->getExtension('DublinCore')->getDate(); - } - - if (!$date) { - $date = $this->getExtension('Atom')->getDateModified(); - } - - if (!$date) { - $date = null; - } - - $this->_data['datemodified'] = $date; - - return $this->_data['datemodified']; - } - - /** - * Get the entry description - * - * @return string - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $description = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/description)'); - } else { - $description = $this->_xpath->evaluate('string('.$this->_xpathQueryRdf.'/rss:description)'); - } - - if (!$description) { - $description = $this->getExtension('DublinCore')->getDescription(); - } - - if (empty($description)) { - $description = $this->getExtension('Atom')->getDescription(); - } - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the entry enclosure - * @return string - */ - public function getEnclosure() - { - if (array_key_exists('enclosure', $this->_data)) { - return $this->_data['enclosure']; - } - - $enclosure = null; - - if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20) { - $nodeList = $this->_xpath->query($this->_xpathQueryRss . '/enclosure'); - - if ($nodeList->length > 0) { - $enclosure = new stdClass(); - $enclosure->url = $nodeList->item(0)->getAttribute('url'); - $enclosure->length = $nodeList->item(0)->getAttribute('length'); - $enclosure->type = $nodeList->item(0)->getAttribute('type'); - } - } - - if (!$enclosure) { - $enclosure = $this->getExtension('Atom')->getEnclosure(); - } - - $this->_data['enclosure'] = $enclosure; - - return $this->_data['enclosure']; - } - - /** - * Get the entry ID - * - * @return string - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $id = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/guid)'); - } - - if (!$id) { - $id = $this->getExtension('DublinCore')->getId(); - } - - if (empty($id)) { - $id = $this->getExtension('Atom')->getId(); - } - - if (!$id) { - if ($this->getPermalink()) { - $id = $this->getPermalink(); - } elseif ($this->getTitle()) { - $id = $this->getTitle(); - } else { - $id = null; - } - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get a specific link - * - * @param int $index - * @return string - */ - public function getLink($index = 0) - { - if (!array_key_exists('links', $this->_data)) { - $this->getLinks(); - } - - if (isset($this->_data['links'][$index])) { - return $this->_data['links'][$index]; - } - - return null; - } - - /** - * Get all links - * - * @return array - */ - public function getLinks() - { - if (array_key_exists('links', $this->_data)) { - return $this->_data['links']; - } - - $links = array(); - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query($this->_xpathQueryRss.'//link'); - } else { - $list = $this->_xpath->query($this->_xpathQueryRdf.'//rss:link'); - } - - if (!$list->length) { - $links = $this->getExtension('Atom')->getLinks(); - } else { - foreach ($list as $link) { - $links[] = $link->nodeValue; - } - } - - $this->_data['links'] = $links; - - return $this->_data['links']; - } - - /** - * Get all categories - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query($this->_xpathQueryRss.'//category'); - } else { - $list = $this->_xpath->query($this->_xpathQueryRdf.'//rss:category'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->nodeValue, - 'scheme' => $category->getAttribute('domain'), - 'label' => $category->nodeValue, - ); - } - } else { - $categoryCollection = $this->getExtension('DublinCore')->getCategories(); - } - - if (count($categoryCollection) == 0) { - $categoryCollection = $this->getExtension('Atom')->getCategories(); - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Get a permalink to the entry - * - * @return string - */ - public function getPermalink() - { - return $this->getLink(0); - } - - /** - * Get the entry title - * - * @return string - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $title = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/title)'); - } else { - $title = $this->_xpath->evaluate('string('.$this->_xpathQueryRdf.'/rss:title)'); - } - - if (!$title) { - $title = $this->getExtension('DublinCore')->getTitle(); - } - - if (!$title) { - $title = $this->getExtension('Atom')->getTitle(); - } - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get the number of comments/replies for current entry - * - * @return string|null - */ - public function getCommentCount() - { - if (array_key_exists('commentcount', $this->_data)) { - return $this->_data['commentcount']; - } - - $commentcount = $this->getExtension('Slash')->getCommentCount(); - - if (!$commentcount) { - $commentcount = $this->getExtension('Thread')->getCommentCount(); - } - - if (!$commentcount) { - $commentcount = $this->getExtension('Atom')->getCommentCount(); - } - - if (!$commentcount) { - $commentcount = null; - } - - $this->_data['commentcount'] = $commentcount; - - return $this->_data['commentcount']; - } - - /** - * Returns a URI pointing to the HTML page where comments can be made on this entry - * - * @return string - */ - public function getCommentLink() - { - if (array_key_exists('commentlink', $this->_data)) { - return $this->_data['commentlink']; - } - - $commentlink = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $commentlink = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/comments)'); - } - - if (!$commentlink) { - $commentlink = $this->getExtension('Atom')->getCommentLink(); - } - - if (!$commentlink) { - $commentlink = null; - } - - $this->_data['commentlink'] = $commentlink; - - return $this->_data['commentlink']; - } - - /** - * Returns a URI pointing to a feed of all comments for this entry - * - * @return string - */ - public function getCommentFeedLink() - { - if (array_key_exists('commentfeedlink', $this->_data)) { - return $this->_data['commentfeedlink']; - } - - $commentfeedlink = $this->getExtension('WellFormedWeb')->getCommentFeedLink(); - - if (!$commentfeedlink) { - $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rss'); - } - - if (!$commentfeedlink) { - $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rdf'); - } - - if (!$commentfeedlink) { - $commentfeedlink = null; - } - - $this->_data['commentfeedlink'] = $commentfeedlink; - - return $this->_data['commentfeedlink']; - } - - /** - * Set the XPath query (incl. on all Extensions) - * - * @param DOMXPath $xpath - */ - public function setXpath(DOMXPath $xpath) - { - parent::setXpath($xpath); - foreach ($this->_extensions as $extension) { - $extension->setXpath($this->_xpath); - } - } -} diff --git a/library/Zend/Feed/Reader/EntryAbstract.php b/library/Zend/Feed/Reader/EntryAbstract.php deleted file mode 100644 index b03afa4889..0000000000 --- a/library/Zend/Feed/Reader/EntryAbstract.php +++ /dev/null @@ -1,242 +0,0 @@ -_entry = $entry; - $this->_entryKey = $entryKey; - $this->_domDocument = $entry->ownerDocument; - if ($type !== null) { - $this->_data['type'] = $type; - } else { - $this->_data['type'] = Zend_Feed_Reader::detectType( - $this->_domDocument - ); - } - $this->_loadExtensions(); - } - - /** - * Get the DOM - * - * @return DOMDocument - */ - public function getDomDocument() - { - return $this->_domDocument; - } - - /** - * Get the entry element - * - * @return DOMElement - */ - public function getElement() - { - return $this->_entry; - } - - /** - * Get the Entry's encoding - * - * @return string - */ - public function getEncoding() - { - $assumed = $this->getDomDocument()->encoding; - if (empty($assumed)) { - $assumed = 'UTF-8'; - } - return $assumed; - } - - /** - * Get entry as xml - * - * @return string - */ - public function saveXml() - { - $dom = new DOMDocument('1.0', $this->getEncoding()); - $entry = $dom->importNode($this->getElement(), true); - $dom->appendChild($entry); - return $dom->saveXml(); - } - - /** - * Get the entry type - * - * @return string - */ - public function getType() - { - return $this->_data['type']; - } - - /** - * Get the XPath query object - * - * @return DOMXPath - */ - public function getXpath() - { - if (!$this->_xpath) { - $this->setXpath(new DOMXPath($this->getDomDocument())); - } - return $this->_xpath; - } - - /** - * Set the XPath query - * - * @param DOMXPath $xpath - * @return Zend_Feed_Reader_Entry_EntryAbstract - */ - public function setXpath(DOMXPath $xpath) - { - $this->_xpath = $xpath; - return $this; - } - - /** - * Get registered extensions - * - * @return array - */ - public function getExtensions() - { - return $this->_extensions; - } - - /** - * Return an Extension object with the matching name (postfixed with _Entry) - * - * @param string $name - * @return Zend_Feed_Reader_Extension_EntryAbstract - */ - public function getExtension($name) - { - if (array_key_exists($name . '_Entry', $this->_extensions)) { - return $this->_extensions[$name . '_Entry']; - } - return null; - } - - /** - * Method overloading: call given method on first extension implementing it - * - * @param string $method - * @param array $args - * @return mixed - * @throws Zend_Feed_Exception if no extensions implements the method - */ - public function __call($method, $args) - { - foreach ($this->_extensions as $extension) { - if (method_exists($extension, $method)) { - return call_user_func_array(array($extension, $method), $args); - } - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - 'Method: ' . $method - . 'does not exist and could not be located on a registered Extension' - ); - } - - /** - * Load extensions from Zend_Feed_Reader - * - * @return void - */ - protected function _loadExtensions() - { - $all = Zend_Feed_Reader::getExtensions(); - $feed = $all['entry']; - foreach ($feed as $extension) { - if (in_array($extension, $all['core'])) { - continue; - } - $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension); - $this->_extensions[$extension] = new $className( - $this->getElement(), $this->_entryKey, $this->_data['type'] - ); - } - } -} diff --git a/library/Zend/Feed/Reader/EntryInterface.php b/library/Zend/Feed/Reader/EntryInterface.php deleted file mode 100644 index 2eee00aa9d..0000000000 --- a/library/Zend/Feed/Reader/EntryInterface.php +++ /dev/null @@ -1,143 +0,0 @@ -getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = array(); - $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom:author'); - - if (!$list->length) { - /** - * TODO: Limit query to feed level els only! - */ - $list = $this->getXpath()->query('//atom:author'); - } - - if ($list->length) { - foreach ($list as $author) { - $author = $this->_getAuthor($author); - if (!empty($author)) { - $authors[] = $author; - } - } - } - - if (count($authors) == 0) { - $authors = null; - } else { - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } - - $this->_data['authors'] = $authors; - return $this->_data['authors']; - } - - /** - * Get the entry content - * - * @return string - */ - public function getContent() - { - if (array_key_exists('content', $this->_data)) { - return $this->_data['content']; - } - - $content = null; - - $el = $this->getXpath()->query($this->getXpathPrefix() . '/atom:content'); - if($el->length > 0) { - $el = $el->item(0); - $type = $el->getAttribute('type'); - switch ($type) { - case '': - case 'text': - case 'text/plain': - case 'html': - case 'text/html': - $content = $el->nodeValue; - break; - case 'xhtml': - $this->getXpath()->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml'); - $xhtml = $this->getXpath()->query( - $this->getXpathPrefix() . '/atom:content/xhtml:div' - )->item(0); - //$xhtml->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - $d = new DOMDocument('1.0', $this->getEncoding()); - $xhtmls = $d->importNode($xhtml, true); - $d->appendChild($xhtmls); - $content = $this->_collectXhtml( - $d->saveXML(), - $d->lookupPrefix('http://www.w3.org/1999/xhtml') - ); - break; - } - } - - if (!$content) { - $content = $this->getDescription(); - } - - $this->_data['content'] = trim($content); - - return $this->_data['content']; - } - - /** - * Parse out XHTML to remove the namespacing - */ - protected function _collectXhtml($xhtml, $prefix) - { - if (!empty($prefix)) $prefix = $prefix . ':'; - $matches = array( - "/<\?xml[^<]*>[^<]*<" . $prefix . "div[^<]*/", - "/<\/" . $prefix . "div>\s*$/" - ); - $xhtml = preg_replace($matches, '', $xhtml); - if (!empty($prefix)) { - $xhtml = preg_replace("/(<[\/]?)" . $prefix . "([a-zA-Z]+)/", '$1$2', $xhtml); - } - return $xhtml; - } - - /** - * Get the entry creation date - * - * @return string - */ - public function getDateCreated() - { - if (array_key_exists('datecreated', $this->_data)) { - return $this->_data['datecreated']; - } - - $date = null; - - if ($this->_getAtomType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $dateCreated = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); - } else { - $dateCreated = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); - } - - if ($dateCreated) { - $date = new Zend_Date; - $date->set($dateCreated, Zend_Date::ISO_8601); - } - - $this->_data['datecreated'] = $date; - - return $this->_data['datecreated']; - } - - /** - * Get the entry modification date - * - * @return string - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $date = null; - - if ($this->_getAtomType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $dateModified = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); - } else { - $dateModified = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); - } - - if ($dateModified) { - $date = new Zend_Date; - $date->set($dateModified, Zend_Date::ISO_8601); - } - - $this->_data['datemodified'] = $date; - - return $this->_data['datemodified']; - } - - /** - * Get the entry description - * - * @return string - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:summary)'); - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the entry enclosure - * - * @return string - */ - public function getEnclosure() - { - if (array_key_exists('enclosure', $this->_data)) { - return $this->_data['enclosure']; - } - - $enclosure = null; - - $nodeList = $this->getXpath()->query($this->getXpathPrefix() . '/atom:link[@rel="enclosure"]'); - - if ($nodeList->length > 0) { - $enclosure = new stdClass(); - $enclosure->url = $nodeList->item(0)->getAttribute('href'); - $enclosure->length = $nodeList->item(0)->getAttribute('length'); - $enclosure->type = $nodeList->item(0)->getAttribute('type'); - } - - $this->_data['enclosure'] = $enclosure; - - return $this->_data['enclosure']; - } - - /** - * Get the entry ID - * - * @return string - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); - - if (!$id) { - if ($this->getPermalink()) { - $id = $this->getPermalink(); - } elseif ($this->getTitle()) { - $id = $this->getTitle(); - } else { - $id = null; - } - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the base URI of the feed (if set). - * - * @return string|null - */ - public function getBaseUrl() - { - if (array_key_exists('baseUrl', $this->_data)) { - return $this->_data['baseUrl']; - } - - $baseUrl = $this->getXpath()->evaluate('string(' - . $this->getXpathPrefix() . '/@xml:base[1]' - . ')'); - - if (!$baseUrl) { - $baseUrl = $this->getXpath()->evaluate('string(//@xml:base[1])'); - } - - if (!$baseUrl) { - $baseUrl = null; - } - - $this->_data['baseUrl'] = $baseUrl; - - return $this->_data['baseUrl']; - } - - /** - * Get a specific link - * - * @param int $index - * @return string - */ - public function getLink($index = 0) - { - if (!array_key_exists('links', $this->_data)) { - $this->getLinks(); - } - - if (isset($this->_data['links'][$index])) { - return $this->_data['links'][$index]; - } - - return null; - } - - /** - * Get all links - * - * @return array - */ - public function getLinks() - { - if (array_key_exists('links', $this->_data)) { - return $this->_data['links']; - } - - $links = array(); - - $list = $this->getXpath()->query( - $this->getXpathPrefix() . '//atom:link[@rel="alternate"]/@href' . '|' . - $this->getXpathPrefix() . '//atom:link[not(@rel)]/@href' - ); - - if ($list->length) { - foreach ($list as $link) { - $links[] = $this->_absolutiseUri($link->value); - } - } - - $this->_data['links'] = $links; - - return $this->_data['links']; - } - - /** - * Get a permalink to the entry - * - * @return string - */ - public function getPermalink() - { - return $this->getLink(0); - } - - /** - * Get the entry title - * - * @return string - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = $this->getXpath()->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get the number of comments/replies for current entry - * - * @return integer - */ - public function getCommentCount() - { - if (array_key_exists('commentcount', $this->_data)) { - return $this->_data['commentcount']; - } - - $count = null; - - $this->getXpath()->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); - $list = $this->getXpath()->query( - $this->getXpathPrefix() . '//atom:link[@rel="replies"]/@thread10:count' - ); - - if ($list->length) { - $count = $list->item(0)->value; - } - - $this->_data['commentcount'] = $count; - - return $this->_data['commentcount']; - } - - /** - * Returns a URI pointing to the HTML page where comments can be made on this entry - * - * @return string - */ - public function getCommentLink() - { - if (array_key_exists('commentlink', $this->_data)) { - return $this->_data['commentlink']; - } - - $link = null; - - $list = $this->getXpath()->query( - $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="text/html"]/@href' - ); - - if ($list->length) { - $link = $list->item(0)->value; - $link = $this->_absolutiseUri($link); - } - - $this->_data['commentlink'] = $link; - - return $this->_data['commentlink']; - } - - /** - * Returns a URI pointing to a feed of all comments for this entry - * - * @return string - */ - public function getCommentFeedLink($type = 'atom') - { - if (array_key_exists('commentfeedlink', $this->_data)) { - return $this->_data['commentfeedlink']; - } - - $link = null; - - $list = $this->getXpath()->query( - $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="application/'.$type.'+xml"]/@href' - ); - - if ($list->length) { - $link = $list->item(0)->value; - $link = $this->_absolutiseUri($link); - } - - $this->_data['commentfeedlink'] = $link; - - return $this->_data['commentfeedlink']; - } - - /** - * Get all categories - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - if ($this->_getAtomType() == Zend_Feed_Reader::TYPE_ATOM_10) { - $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom:category'); - } else { - /** - * Since Atom 0.3 did not support categories, it would have used the - * Dublin Core extension. However there is a small possibility Atom 0.3 - * may have been retrofittied to use Atom 1.0 instead. - */ - $this->getXpath()->registerNamespace('atom10', Zend_Feed_Reader::NAMESPACE_ATOM_10); - $list = $this->getXpath()->query($this->getXpathPrefix() . '//atom10:category'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->getAttribute('term'), - 'scheme' => $category->getAttribute('scheme'), - 'label' => $category->getAttribute('label') - ); - } - } else { - return new Zend_Feed_Reader_Collection_Category; - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Get source feed metadata from the entry - * - * @return Zend_Feed_Reader_Feed_Atom_Source|null - */ - public function getSource() - { - if (array_key_exists('source', $this->_data)) { - return $this->_data['source']; - } - - $source = null; - // TODO: Investigate why _getAtomType() fails here. Is it even needed? - if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10) { - $list = $this->getXpath()->query($this->getXpathPrefix() . '/atom:source[1]'); - if ($list->length) { - $element = $list->item(0); - $source = new Zend_Feed_Reader_Feed_Atom_Source($element, $this->getXpathPrefix()); - } - } - - $this->_data['source'] = $source; - return $this->_data['source']; - } - - /** - * Attempt to absolutise the URI, i.e. if a relative URI apply the - * xml:base value as a prefix to turn into an absolute URI. - */ - protected function _absolutiseUri($link) - { - if (!Zend_Uri::check($link)) { - if ($this->getBaseUrl() !== null) { - $link = $this->getBaseUrl() . $link; - if (!Zend_Uri::check($link)) { - $link = null; - } - } - } - return $link; - } - - /** - * Get an author entry - * - * @param DOMElement $element - * @return string - */ - protected function _getAuthor(DOMElement $element) - { - $author = array(); - - $emailNode = $element->getElementsByTagName('email'); - $nameNode = $element->getElementsByTagName('name'); - $uriNode = $element->getElementsByTagName('uri'); - - if ($emailNode->length && strlen($emailNode->item(0)->nodeValue) > 0) { - $author['email'] = $emailNode->item(0)->nodeValue; - } - - if ($nameNode->length && strlen($nameNode->item(0)->nodeValue) > 0) { - $author['name'] = $nameNode->item(0)->nodeValue; - } - - if ($uriNode->length && strlen($uriNode->item(0)->nodeValue) > 0) { - $author['uri'] = $uriNode->item(0)->nodeValue; - } - - if (empty($author)) { - return null; - } - return $author; - } - - /** - * Register the default namespaces for the current feed format - */ - protected function _registerNamespaces() - { - switch ($this->_getAtomType()) { - case Zend_Feed_Reader::TYPE_ATOM_03: - $this->getXpath()->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); - break; - default: - $this->getXpath()->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); - break; - } - } - - /** - * Detect the presence of any Atom namespaces in use - */ - protected function _getAtomType() - { - $dom = $this->getDomDocument(); - $prefixAtom03 = $dom->lookupPrefix(Zend_Feed_Reader::NAMESPACE_ATOM_03); - $prefixAtom10 = $dom->lookupPrefix(Zend_Feed_Reader::NAMESPACE_ATOM_10); - if ($dom->isDefaultNamespace(Zend_Feed_Reader::NAMESPACE_ATOM_03) - || !empty($prefixAtom03)) { - return Zend_Feed_Reader::TYPE_ATOM_03; - } - if ($dom->isDefaultNamespace(Zend_Feed_Reader::NAMESPACE_ATOM_10) - || !empty($prefixAtom10)) { - return Zend_Feed_Reader::TYPE_ATOM_10; - } - } -} diff --git a/library/Zend/Feed/Reader/Extension/Atom/Feed.php b/library/Zend/Feed/Reader/Extension/Atom/Feed.php deleted file mode 100644 index f6ccc4eca9..0000000000 --- a/library/Zend/Feed/Reader/Extension/Atom/Feed.php +++ /dev/null @@ -1,590 +0,0 @@ -getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $list = $this->_xpath->query('//atom:author'); - - $authors = array(); - - if ($list->length) { - foreach ($list as $author) { - $author = $this->_getAuthor($author); - if (!empty($author)) { - $authors[] = $author; - } - } - } - - if (count($authors) == 0) { - $authors = null; - } else { - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get the copyright entry - * - * @return string|null - */ - public function getCopyright() - { - if (array_key_exists('copyright', $this->_data)) { - return $this->_data['copyright']; - } - - $copyright = null; - - if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:copyright)'); - } else { - $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:rights)'); - } - - if (!$copyright) { - $copyright = null; - } - - $this->_data['copyright'] = $copyright; - - return $this->_data['copyright']; - } - - /** - * Get the feed creation date - * - * @return Zend_Date|null - */ - public function getDateCreated() - { - if (array_key_exists('datecreated', $this->_data)) { - return $this->_data['datecreated']; - } - - $date = null; - - if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); - } else { - $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); - } - - if ($dateCreated) { - $date = new Zend_Date; - $date->set($dateCreated, Zend_Date::ISO_8601); - } - - $this->_data['datecreated'] = $date; - - return $this->_data['datecreated']; - } - - /** - * Get the feed modification date - * - * @return Zend_Date|null - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $date = null; - - if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); - } else { - $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); - } - - if ($dateModified) { - $date = new Zend_Date; - $date->set($dateModified, Zend_Date::ISO_8601); - } - - $this->_data['datemodified'] = $date; - - return $this->_data['datemodified']; - } - - /** - * Get the feed description - * - * @return string|null - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = null; - - if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:tagline)'); // TODO: Is this the same as subtitle? - } else { - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:subtitle)'); - } - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the feed generator entry - * - * @return string|null - */ - public function getGenerator() - { - if (array_key_exists('generator', $this->_data)) { - return $this->_data['generator']; - } - // TODO: Add uri support - $generator = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:generator)'); - - if (!$generator) { - $generator = null; - } - - $this->_data['generator'] = $generator; - - return $this->_data['generator']; - } - - /** - * Get the feed ID - * - * @return string|null - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); - - if (!$id) { - if ($this->getLink()) { - $id = $this->getLink(); - } elseif ($this->getTitle()) { - $id = $this->getTitle(); - } else { - $id = null; - } - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the feed language - * - * @return string|null - */ - public function getLanguage() - { - if (array_key_exists('language', $this->_data)) { - return $this->_data['language']; - } - - $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:lang)'); - - if (!$language) { - $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); - } - - if (!$language) { - $language = null; - } - - $this->_data['language'] = $language; - - return $this->_data['language']; - } - - /** - * Get the feed image - * - * @return array|null - */ - public function getImage() - { - if (array_key_exists('image', $this->_data)) { - return $this->_data['image']; - } - - $imageUrl = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:logo)'); - - if (!$imageUrl) { - $image = null; - } else { - $image = array('uri'=>$imageUrl); - } - - $this->_data['image'] = $image; - - return $this->_data['image']; - } - - /** - * Get the feed image - * - * @return array|null - */ - public function getIcon() - { - if (array_key_exists('icon', $this->_data)) { - return $this->_data['icon']; - } - - $imageUrl = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:icon)'); - - if (!$imageUrl) { - $image = null; - } else { - $image = array('uri'=>$imageUrl); - } - - $this->_data['icon'] = $image; - - return $this->_data['icon']; - } - - /** - * Get the base URI of the feed (if set). - * - * @return string|null - */ - public function getBaseUrl() - { - if (array_key_exists('baseUrl', $this->_data)) { - return $this->_data['baseUrl']; - } - - $baseUrl = $this->_xpath->evaluate('string(//@xml:base[1])'); - - if (!$baseUrl) { - $baseUrl = null; - } - $this->_data['baseUrl'] = $baseUrl; - - return $this->_data['baseUrl']; - } - - /** - * Get a link to the source website - * - * @return string|null - */ - public function getLink() - { - if (array_key_exists('link', $this->_data)) { - return $this->_data['link']; - } - - $link = null; - - $list = $this->_xpath->query( - $this->getXpathPrefix() . '/atom:link[@rel="alternate"]/@href' . '|' . - $this->getXpathPrefix() . '/atom:link[not(@rel)]/@href' - ); - - if ($list->length) { - $link = $list->item(0)->nodeValue; - $link = $this->_absolutiseUri($link); - } - - $this->_data['link'] = $link; - - return $this->_data['link']; - } - - /** - * Get a link to the feed's XML Url - * - * @return string|null - */ - public function getFeedLink() - { - if (array_key_exists('feedlink', $this->_data)) { - return $this->_data['feedlink']; - } - - $link = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link[@rel="self"]/@href)'); - - $link = $this->_absolutiseUri($link); - - $this->_data['feedlink'] = $link; - - return $this->_data['feedlink']; - } - - /** - * Get an array of any supported Pusubhubbub endpoints - * - * @return array|null - */ - public function getHubs() - { - if (array_key_exists('hubs', $this->_data)) { - return $this->_data['hubs']; - } - $hubs = array(); - - $list = $this->_xpath->query($this->getXpathPrefix() - . '//atom:link[@rel="hub"]/@href'); - - if ($list->length) { - foreach ($list as $uri) { - $hubs[] = $this->_absolutiseUri($uri->nodeValue); - } - } else { - $hubs = null; - } - - $this->_data['hubs'] = $hubs; - - return $this->_data['hubs']; - } - - /** - * Get the feed title - * - * @return string|null - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get all categories - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10) { - $list = $this->_xpath->query($this->getXpathPrefix() . '/atom:category'); - } else { - /** - * Since Atom 0.3 did not support categories, it would have used the - * Dublin Core extension. However there is a small possibility Atom 0.3 - * may have been retrofittied to use Atom 1.0 instead. - */ - $this->_xpath->registerNamespace('atom10', Zend_Feed_Reader::NAMESPACE_ATOM_10); - $list = $this->_xpath->query($this->getXpathPrefix() . '/atom10:category'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->getAttribute('term'), - 'scheme' => $category->getAttribute('scheme'), - 'label' => $category->getAttribute('label') - ); - } - } else { - return new Zend_Feed_Reader_Collection_Category; - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Get an author entry in RSS format - * - * @param DOMElement $element - * @return string - */ - protected function _getAuthor(DOMElement $element) - { - $author = array(); - - $emailNode = $element->getElementsByTagName('email'); - $nameNode = $element->getElementsByTagName('name'); - $uriNode = $element->getElementsByTagName('uri'); - - if ($emailNode->length && strlen($emailNode->item(0)->nodeValue) > 0) { - $author['email'] = $emailNode->item(0)->nodeValue; - } - - if ($nameNode->length && strlen($nameNode->item(0)->nodeValue) > 0) { - $author['name'] = $nameNode->item(0)->nodeValue; - } - - if ($uriNode->length && strlen($uriNode->item(0)->nodeValue) > 0) { - $author['uri'] = $uriNode->item(0)->nodeValue; - } - - if (empty($author)) { - return null; - } - return $author; - } - - /** - * Attempt to absolutise the URI, i.e. if a relative URI apply the - * xml:base value as a prefix to turn into an absolute URI. - */ - protected function _absolutiseUri($link) - { - if (!Zend_Uri::check($link)) { - if ($this->getBaseUrl() !== null) { - $link = $this->getBaseUrl() . $link; - if (!Zend_Uri::check($link)) { - $link = null; - } - } - } - return $link; - } - - /** - * Register the default namespaces for the current feed format - */ - protected function _registerNamespaces() - { - if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 - || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 - ) { - return; // pre-registered at Feed level - } - $atomDetected = $this->_getAtomType(); - switch ($atomDetected) { - case Zend_Feed_Reader::TYPE_ATOM_03: - $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); - break; - default: - $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); - break; - } - } - - /** - * Detect the presence of any Atom namespaces in use - */ - protected function _getAtomType() - { - $dom = $this->getDomDocument(); - $prefixAtom03 = $dom->lookupPrefix(Zend_Feed_Reader::NAMESPACE_ATOM_03); - $prefixAtom10 = $dom->lookupPrefix(Zend_Feed_Reader::NAMESPACE_ATOM_10); - if ($dom->isDefaultNamespace(Zend_Feed_Reader::NAMESPACE_ATOM_10) - || !empty($prefixAtom10)) { - return Zend_Feed_Reader::TYPE_ATOM_10; - } - if ($dom->isDefaultNamespace(Zend_Feed_Reader::NAMESPACE_ATOM_03) - || !empty($prefixAtom03)) { - return Zend_Feed_Reader::TYPE_ATOM_03; - } - } -} diff --git a/library/Zend/Feed/Reader/Extension/Content/Entry.php b/library/Zend/Feed/Reader/Extension/Content/Entry.php deleted file mode 100644 index bc986d662b..0000000000 --- a/library/Zend/Feed/Reader/Extension/Content/Entry.php +++ /dev/null @@ -1,61 +0,0 @@ -getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 - ) { - $content = $this->_xpath->evaluate('string('.$this->getXpathPrefix().'/content:encoded)'); - } else { - $content = $this->_xpath->evaluate('string('.$this->getXpathPrefix().'/content:encoded)'); - } - return $content; - } - - /** - * Register RSS Content Module namespace - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php b/library/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php deleted file mode 100644 index 84a7604f6b..0000000000 --- a/library/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php +++ /dev/null @@ -1,97 +0,0 @@ -getLicenses(); - - if (isset($licenses[$index])) { - return $licenses[$index]; - } - - return null; - } - - /** - * Get the entry licenses - * - * @return array - */ - public function getLicenses() - { - $name = 'licenses'; - if (array_key_exists($name, $this->_data)) { - return $this->_data[$name]; - } - - $licenses = array(); - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//cc:license'); - - if ($list->length) { - foreach ($list as $license) { - $licenses[] = $license->nodeValue; - } - - $licenses = array_unique($licenses); - } else { - $cc = new Zend_Feed_Reader_Extension_CreativeCommons_Feed( - $this->_domDocument, $this->_data['type'], $this->_xpath - ); - $licenses = $cc->getLicenses(); - } - - $this->_data[$name] = $licenses; - - return $this->_data[$name]; - } - - /** - * Register Creative Commons namespaces - * - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php b/library/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php deleted file mode 100644 index 69c37c8da6..0000000000 --- a/library/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php +++ /dev/null @@ -1,89 +0,0 @@ -getLicenses(); - - if (isset($licenses[$index])) { - return $licenses[$index]; - } - - return null; - } - - /** - * Get the entry licenses - * - * @return array - */ - public function getLicenses() - { - $name = 'licenses'; - if (array_key_exists($name, $this->_data)) { - return $this->_data[$name]; - } - - $licenses = array(); - $list = $this->_xpath->evaluate('channel/cc:license'); - - if ($list->length) { - foreach ($list as $license) { - $licenses[] = $license->nodeValue; - } - - $licenses = array_unique($licenses); - } - - $this->_data[$name] = $licenses; - - return $this->_data[$name]; - } - - /** - * Register Creative Commons namespaces - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/DublinCore/Entry.php b/library/Zend/Feed/Reader/Extension/DublinCore/Entry.php deleted file mode 100644 index 4c83aebf6d..0000000000 --- a/library/Zend/Feed/Reader/Extension/DublinCore/Entry.php +++ /dev/null @@ -1,266 +0,0 @@ -getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = array(); - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:creator'); - - if (!$list->length) { - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:creator'); - } - if (!$list->length) { - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:publisher'); - - if (!$list->length) { - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:publisher'); - } - } - - if ($list->length) { - foreach ($list as $author) { - $authors[] = array( - 'name' => $author->nodeValue - ); - } - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } else { - $authors = null; - } - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get categories (subjects under DC) - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:subject'); - - if (!$list->length) { - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:subject'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->nodeValue, - 'scheme' => null, - 'label' => $category->nodeValue, - ); - } - } else { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - } - - $this->_data['categories'] = $categoryCollection; - return $this->_data['categories']; - } - - - /** - * Get the entry content - * - * @return string - */ - public function getContent() - { - return $this->getDescription(); - } - - /** - * Get the entry description - * - * @return string - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = null; - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); - - if (!$description) { - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); - } - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the entry ID - * - * @return string - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = null; - $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); - - if (!$id) { - $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the entry title - * - * @return string - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = null; - $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); - - if (!$title) { - $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); - } - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * - * - * @return Zend_Date|null - */ - public function getDate() - { - if (array_key_exists('date', $this->_data)) { - return $this->_data['date']; - } - - $d = null; - $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); - - if (!$date) { - $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); - } - - if ($date) { - $d = new Zend_Date; - $d->set($date, Zend_Date::ISO_8601); - } - - $this->_data['date'] = $d; - - return $this->_data['date']; - } - - /** - * Register DC namespaces - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); - $this->_xpath->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/DublinCore/Feed.php b/library/Zend/Feed/Reader/Extension/DublinCore/Feed.php deleted file mode 100644 index 516c58c78d..0000000000 --- a/library/Zend/Feed/Reader/Extension/DublinCore/Feed.php +++ /dev/null @@ -1,309 +0,0 @@ -getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = array(); - $list = $this->_xpath->query('//dc11:creator'); - - if (!$list->length) { - $list = $this->_xpath->query('//dc10:creator'); - } - if (!$list->length) { - $list = $this->_xpath->query('//dc11:publisher'); - - if (!$list->length) { - $list = $this->_xpath->query('//dc10:publisher'); - } - } - - if ($list->length) { - foreach ($list as $author) { - $authors[] = array( - 'name' => $author->nodeValue - ); - } - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } else { - $authors = null; - } - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get the copyright entry - * - * @return string|null - */ - public function getCopyright() - { - if (array_key_exists('copyright', $this->_data)) { - return $this->_data['copyright']; - } - - $copyright = null; - $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:rights)'); - - if (!$copyright) { - $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:rights)'); - } - - if (!$copyright) { - $copyright = null; - } - - $this->_data['copyright'] = $copyright; - - return $this->_data['copyright']; - } - - /** - * Get the feed description - * - * @return string|null - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = null; - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); - - if (!$description) { - $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); - } - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the feed ID - * - * @return string|null - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = null; - $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); - - if (!$id) { - $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the feed language - * - * @return string|null - */ - public function getLanguage() - { - if (array_key_exists('language', $this->_data)) { - return $this->_data['language']; - } - - $language = null; - $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:language)'); - - if (!$language) { - $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:language)'); - } - - if (!$language) { - $language = null; - } - - $this->_data['language'] = $language; - - return $this->_data['language']; - } - - /** - * Get the feed title - * - * @return string|null - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = null; - $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); - - if (!$title) { - $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); - } - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * - * - * @return Zend_Date|null - */ - public function getDate() - { - if (array_key_exists('date', $this->_data)) { - return $this->_data['date']; - } - - $d = null; - $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); - - if (!$date) { - $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); - } - - if ($date) { - $d = new Zend_Date; - $d->set($date, Zend_Date::ISO_8601); - } - - $this->_data['date'] = $d; - - return $this->_data['date']; - } - - /** - * Get categories (subjects under DC) - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:subject'); - - if (!$list->length) { - $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:subject'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->nodeValue, - 'scheme' => null, - 'label' => $category->nodeValue, - ); - } - } else { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - } - - $this->_data['categories'] = $categoryCollection; - return $this->_data['categories']; - } - - /** - * Register the default namespaces for the current feed format - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); - $this->_xpath->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/EntryAbstract.php b/library/Zend/Feed/Reader/Extension/EntryAbstract.php deleted file mode 100644 index 6b1cda6235..0000000000 --- a/library/Zend/Feed/Reader/Extension/EntryAbstract.php +++ /dev/null @@ -1,200 +0,0 @@ -_entry = $entry; - $this->_entryKey = $entryKey; - $this->_domDocument = $entry->ownerDocument; - - if ($type !== null) { - $this->_data['type'] = $type; - } else { - $this->_data['type'] = Zend_Feed_Reader::detectType($entry->ownerDocument, true); - } - // set the XPath query prefix for the entry being queried - if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_10 - || $this->getType() == Zend_Feed_Reader::TYPE_RSS_090 - ) { - $this->setXpathPrefix('//rss:item[' . ($this->_entryKey+1) . ']'); - } elseif ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 - || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 - ) { - $this->setXpathPrefix('//atom:entry[' . ($this->_entryKey+1) . ']'); - } else { - $this->setXpathPrefix('//item[' . ($this->_entryKey+1) . ']'); - } - } - - /** - * Get the DOM - * - * @return DOMDocument - */ - public function getDomDocument() - { - return $this->_domDocument; - } - - /** - * Get the Entry's encoding - * - * @return string - */ - public function getEncoding() - { - $assumed = $this->getDomDocument()->encoding; - return $assumed; - } - - /** - * Get the entry type - * - * @return string - */ - public function getType() - { - return $this->_data['type']; - } - - /** - * Set the XPath query - * - * @param DOMXPath $xpath - * @return Zend_Feed_Reader_Extension_EntryAbstract - */ - public function setXpath(DOMXPath $xpath) - { - $this->_xpath = $xpath; - $this->_registerNamespaces(); - return $this; - } - - /** - * Get the XPath query object - * - * @return DOMXPath - */ - public function getXpath() - { - if (!$this->_xpath) { - $this->setXpath(new DOMXPath($this->getDomDocument())); - } - return $this->_xpath; - } - - /** - * Serialize the entry to an array - * - * @return array - */ - public function toArray() - { - return $this->_data; - } - - /** - * Get the XPath prefix - * - * @return string - */ - public function getXpathPrefix() - { - return $this->_xpathPrefix; - } - - /** - * Set the XPath prefix - * - * @param string $prefix - * @return Zend_Feed_Reader_Extension_EntryAbstract - */ - public function setXpathPrefix($prefix) - { - $this->_xpathPrefix = $prefix; - return $this; - } - - /** - * Register XML namespaces - * - * @return void - */ - protected abstract function _registerNamespaces(); -} diff --git a/library/Zend/Feed/Reader/Extension/FeedAbstract.php b/library/Zend/Feed/Reader/Extension/FeedAbstract.php deleted file mode 100644 index dcf7755f57..0000000000 --- a/library/Zend/Feed/Reader/Extension/FeedAbstract.php +++ /dev/null @@ -1,189 +0,0 @@ -_domDocument = $dom; - - if ($type !== null) { - $this->_data['type'] = $type; - } else { - $this->_data['type'] = Zend_Feed_Reader::detectType($dom); - } - - if ($xpath !== null) { - $this->_xpath = $xpath; - } else { - $this->_xpath = new DOMXPath($this->_domDocument); - } - - $this->_registerNamespaces(); - } - - /** - * Get the DOM - * - * @return DOMDocument - */ - public function getDomDocument() - { - return $this->_domDocument; - } - - /** - * Get the Feed's encoding - * - * @return string - */ - public function getEncoding() - { - $assumed = $this->getDomDocument()->encoding; - return $assumed; - } - - /** - * Get the feed type - * - * @return string - */ - public function getType() - { - return $this->_data['type']; - } - - - /** - * Return the feed as an array - * - * @return array - */ - public function toArray() // untested - { - return $this->_data; - } - - /** - * Set the XPath query - * - * @param DOMXPath $xpath - * @return Zend_Feed_Reader_Extension_EntryAbstract - */ - public function setXpath(DOMXPath $xpath) - { - $this->_xpath = $xpath; - $this->_registerNamespaces(); - return $this; - } - - /** - * Get the DOMXPath object - * - * @return string - */ - public function getXpath() - { - return $this->_xpath; - } - - /** - * Get the XPath prefix - * - * @return string - */ - public function getXpathPrefix() - { - return $this->_xpathPrefix; - } - - /** - * Set the XPath prefix - * - * @return Zend_Feed_Reader_Feed_Atom - */ - public function setXpathPrefix($prefix) - { - $this->_xpathPrefix = $prefix; - } - - /** - * Register the default namespaces for the current feed format - */ - abstract protected function _registerNamespaces(); -} diff --git a/library/Zend/Feed/Reader/Extension/Podcast/Entry.php b/library/Zend/Feed/Reader/Extension/Podcast/Entry.php deleted file mode 100644 index 158ccf60aa..0000000000 --- a/library/Zend/Feed/Reader/Extension/Podcast/Entry.php +++ /dev/null @@ -1,202 +0,0 @@ -_data['author'])) { - return $this->_data['author']; - } - - $author = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); - - if (!$author) { - $author = null; - } - - $this->_data['author'] = $author; - - return $this->_data['author']; - } - - /** - * Get the entry block - * - * @return string - */ - public function getBlock() - { - if (isset($this->_data['block'])) { - return $this->_data['block']; - } - - $block = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); - - if (!$block) { - $block = null; - } - - $this->_data['block'] = $block; - - return $this->_data['block']; - } - - /** - * Get the entry duration - * - * @return string - */ - public function getDuration() - { - if (isset($this->_data['duration'])) { - return $this->_data['duration']; - } - - $duration = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:duration)'); - - if (!$duration) { - $duration = null; - } - - $this->_data['duration'] = $duration; - - return $this->_data['duration']; - } - - /** - * Get the entry explicit - * - * @return string - */ - public function getExplicit() - { - if (isset($this->_data['explicit'])) { - return $this->_data['explicit']; - } - - $explicit = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); - - if (!$explicit) { - $explicit = null; - } - - $this->_data['explicit'] = $explicit; - - return $this->_data['explicit']; - } - - /** - * Get the entry keywords - * - * @return string - */ - public function getKeywords() - { - if (isset($this->_data['keywords'])) { - return $this->_data['keywords']; - } - - $keywords = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); - - if (!$keywords) { - $keywords = null; - } - - $this->_data['keywords'] = $keywords; - - return $this->_data['keywords']; - } - - /** - * Get the entry subtitle - * - * @return string - */ - public function getSubtitle() - { - if (isset($this->_data['subtitle'])) { - return $this->_data['subtitle']; - } - - $subtitle = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); - - if (!$subtitle) { - $subtitle = null; - } - - $this->_data['subtitle'] = $subtitle; - - return $this->_data['subtitle']; - } - - /** - * Get the entry summary - * - * @return string - */ - public function getSummary() - { - if (isset($this->_data['summary'])) { - return $this->_data['summary']; - } - - $summary = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); - - if (!$summary) { - $summary = null; - } - - $this->_data['summary'] = $summary; - - return $this->_data['summary']; - } - - /** - * Register iTunes namespace - * - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/Podcast/Feed.php b/library/Zend/Feed/Reader/Extension/Podcast/Feed.php deleted file mode 100644 index 2510f41bdf..0000000000 --- a/library/Zend/Feed/Reader/Extension/Podcast/Feed.php +++ /dev/null @@ -1,293 +0,0 @@ -_data['author'])) { - return $this->_data['author']; - } - - $author = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); - - if (!$author) { - $author = null; - } - - $this->_data['author'] = $author; - - return $this->_data['author']; - } - - /** - * Get the entry block - * - * @return string - */ - public function getBlock() - { - if (isset($this->_data['block'])) { - return $this->_data['block']; - } - - $block = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); - - if (!$block) { - $block = null; - } - - $this->_data['block'] = $block; - - return $this->_data['block']; - } - - /** - * Get the entry category - * - * @return string - */ - public function getCategories() - { - if (isset($this->_data['categories'])) { - return $this->_data['categories']; - } - - $categoryList = $this->_xpath->query($this->getXpathPrefix() . '/itunes:category'); - - $categories = array(); - - if ($categoryList->length > 0) { - foreach ($categoryList as $node) { - $children = null; - - if ($node->childNodes->length > 0) { - $children = array(); - - foreach ($node->childNodes as $childNode) { - if (!($childNode instanceof DOMText)) { - $children[$childNode->getAttribute('text')] = null; - } - } - } - - $categories[$node->getAttribute('text')] = $children; - } - } - - - if (!$categories) { - $categories = null; - } - - $this->_data['categories'] = $categories; - - return $this->_data['categories']; - } - - /** - * Get the entry explicit - * - * @return string - */ - public function getExplicit() - { - if (isset($this->_data['explicit'])) { - return $this->_data['explicit']; - } - - $explicit = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); - - if (!$explicit) { - $explicit = null; - } - - $this->_data['explicit'] = $explicit; - - return $this->_data['explicit']; - } - - /** - * Get the entry image - * - * @return string - */ - public function getImage() - { - if (isset($this->_data['image'])) { - return $this->_data['image']; - } - - $image = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:image/@href)'); - - if (!$image) { - $image = null; - } - - $this->_data['image'] = $image; - - return $this->_data['image']; - } - - /** - * Get the entry keywords - * - * @return string - */ - public function getKeywords() - { - if (isset($this->_data['keywords'])) { - return $this->_data['keywords']; - } - - $keywords = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); - - if (!$keywords) { - $keywords = null; - } - - $this->_data['keywords'] = $keywords; - - return $this->_data['keywords']; - } - - /** - * Get the entry's new feed url - * - * @return string - */ - public function getNewFeedUrl() - { - if (isset($this->_data['new-feed-url'])) { - return $this->_data['new-feed-url']; - } - - $newFeedUrl = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:new-feed-url)'); - - if (!$newFeedUrl) { - $newFeedUrl = null; - } - - $this->_data['new-feed-url'] = $newFeedUrl; - - return $this->_data['new-feed-url']; - } - - /** - * Get the entry owner - * - * @return string - */ - public function getOwner() - { - if (isset($this->_data['owner'])) { - return $this->_data['owner']; - } - - $owner = null; - - $email = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:email)'); - $name = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:name)'); - - if (!empty($email)) { - $owner = $email . (empty($name) ? '' : ' (' . $name . ')'); - } else if (!empty($name)) { - $owner = $name; - } - - if (!$owner) { - $owner = null; - } - - $this->_data['owner'] = $owner; - - return $this->_data['owner']; - } - - /** - * Get the entry subtitle - * - * @return string - */ - public function getSubtitle() - { - if (isset($this->_data['subtitle'])) { - return $this->_data['subtitle']; - } - - $subtitle = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); - - if (!$subtitle) { - $subtitle = null; - } - - $this->_data['subtitle'] = $subtitle; - - return $this->_data['subtitle']; - } - - /** - * Get the entry summary - * - * @return string - */ - public function getSummary() - { - if (isset($this->_data['summary'])) { - return $this->_data['summary']; - } - - $summary = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); - - if (!$summary) { - $summary = null; - } - - $this->_data['summary'] = $summary; - - return $this->_data['summary']; - } - - /** - * Register iTunes namespace - * - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/Slash/Entry.php b/library/Zend/Feed/Reader/Extension/Slash/Entry.php deleted file mode 100644 index ee5c0833dc..0000000000 --- a/library/Zend/Feed/Reader/Extension/Slash/Entry.php +++ /dev/null @@ -1,144 +0,0 @@ -_getData('section'); - } - - /** - * Get the entry department - * - * @return string|null - */ - public function getDepartment() - { - return $this->_getData('department'); - } - - /** - * Get the entry hit_parade - * - * @return array - */ - public function getHitParade() - { - $name = 'hit_parade'; - - if (isset($this->_data[$name])) { - return $this->_data[$name]; - } - - $stringParade = $this->_getData($name); - $hitParade = array(); - - if (!empty($stringParade)) { - $stringParade = explode(',', $stringParade); - - foreach ($stringParade as $hit) - $hitParade[] = $hit + 0; //cast to integer - } - - $this->_data[$name] = $hitParade; - return $hitParade; - } - - /** - * Get the entry comments - * - * @return int - */ - public function getCommentCount() - { - $name = 'comments'; - - if (isset($this->_data[$name])) { - return $this->_data[$name]; - } - - $comments = $this->_getData($name, 'string'); - - if (!$comments) { - $this->_data[$name] = null; - return $this->_data[$name]; - } - - return $comments; - } - - /** - * Get the entry data specified by name - * @param string $name - * @param string $type - * - * @return mixed|null - */ - protected function _getData($name, $type = 'string') - { - if (array_key_exists($name, $this->_data)) { - return $this->_data[$name]; - } - - $data = $this->_xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/slash10:' . $name . ')'); - - if (!$data) { - $data = null; - } - - $this->_data[$name] = $data; - - return $data; - } - - /** - * Register Slash namespaces - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('slash10', 'http://purl.org/rss/1.0/modules/slash/'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/Syndication/Feed.php b/library/Zend/Feed/Reader/Extension/Syndication/Feed.php deleted file mode 100644 index c7684a1e4e..0000000000 --- a/library/Zend/Feed/Reader/Extension/Syndication/Feed.php +++ /dev/null @@ -1,168 +0,0 @@ -_getData($name); - - if ($period === null) { - $this->_data[$name] = 'daily'; - return 'daily'; //Default specified by spec - } - - switch ($period) - { - case 'hourly': - case 'daily': - case 'weekly': - case 'yearly': - return $period; - default: - throw new Zend_Feed_Exception("Feed specified invalid update period: '$period'." - . " Must be one of hourly, daily, weekly or yearly" - ); - } - } - - /** - * Get update frequency - * @return int - */ - public function getUpdateFrequency() - { - $name = 'updateFrequency'; - $freq = $this->_getData($name, 'number'); - - if (!$freq || $freq < 1) { - $this->_data[$name] = 1; - return 1; - } - - return $freq; - } - - /** - * Get update frequency as ticks - * @return int - */ - public function getUpdateFrequencyAsTicks() - { - $name = 'updateFrequency'; - $freq = $this->_getData($name, 'number'); - - if (!$freq || $freq < 1) { - $this->_data[$name] = 1; - $freq = 1; - } - - $period = $this->getUpdatePeriod(); - $ticks = 1; - - switch ($period) - { - //intentional fall through - case 'yearly': - $ticks *= 52; //TODO: fix generalisation, how? - case 'weekly': - $ticks *= 7; - case 'daily': - $ticks *= 24; - case 'hourly': - $ticks *= 3600; - break; - default: //Never arrive here, exception thrown in getPeriod() - break; - } - - return $ticks / $freq; - } - - /** - * Get update base - * - * @return Zend_Date|null - */ - public function getUpdateBase() - { - $updateBase = $this->_getData('updateBase'); - $date = null; - if ($updateBase) { - $date = new Zend_Date; - $date->set($updateBase, Zend_Date::W3C); - } - return $date; - } - - /** - * Get the entry data specified by name - * - * @param string $name - * @param string $type - * @return mixed|null - */ - private function _getData($name, $type = 'string') - { - if (array_key_exists($name, $this->_data)) { - return $this->_data[$name]; - } - - $data = $this->_xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/syn10:' . $name . ')'); - - if (!$data) { - $data = null; - } - - $this->_data[$name] = $data; - - return $data; - } - - /** - * Register Syndication namespaces - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('syn10', 'http://purl.org/rss/1.0/modules/syndication/'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/Thread/Entry.php b/library/Zend/Feed/Reader/Extension/Thread/Entry.php deleted file mode 100644 index 0c5dfcbdf6..0000000000 --- a/library/Zend/Feed/Reader/Extension/Thread/Entry.php +++ /dev/null @@ -1,91 +0,0 @@ -_getData('total'); - } - - /** - * Get the entry data specified by name - * - * @param string $name - * @param string $type - * @return mixed|null - */ - protected function _getData($name) - { - if (array_key_exists($name, $this->_data)) { - return $this->_data[$name]; - } - - $data = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/thread10:' . $name . ')'); - - if (!$data) { - $data = null; - } - - $this->_data[$name] = $data; - - return $data; - } - - /** - * Register Atom Thread Extension 1.0 namespace - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); - } -} diff --git a/library/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php b/library/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php deleted file mode 100644 index 9ff3688ba0..0000000000 --- a/library/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php +++ /dev/null @@ -1,73 +0,0 @@ -_data)) { - return $this->_data[$name]; - } - - $data = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/wfw:' . $name . ')'); - - if (!$data) { - $data = null; - } - - $this->_data[$name] = $data; - - return $data; - } - - /** - * Register Slash namespaces - * - * @return void - */ - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('wfw', 'http://wellformedweb.org/CommentAPI/'); - } -} diff --git a/library/Zend/Feed/Reader/Feed/Atom.php b/library/Zend/Feed/Reader/Feed/Atom.php deleted file mode 100644 index 798d05812a..0000000000 --- a/library/Zend/Feed/Reader/Feed/Atom.php +++ /dev/null @@ -1,421 +0,0 @@ -getClassName('Atom_Feed'); - $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath); - $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('DublinCore_Feed'); - $this->_extensions['DublinCore_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath); - foreach ($this->_extensions as $extension) { - $extension->setXpathPrefix('/atom:feed'); - } - } - - /** - * Get a single author - * - * @param int $index - * @return string|null - */ - public function getAuthor($index = 0) - { - $authors = $this->getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = $this->getExtension('Atom')->getAuthors(); - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get the copyright entry - * - * @return string|null - */ - public function getCopyright() - { - if (array_key_exists('copyright', $this->_data)) { - return $this->_data['copyright']; - } - - $copyright = $this->getExtension('Atom')->getCopyright(); - - if (!$copyright) { - $copyright = null; - } - - $this->_data['copyright'] = $copyright; - - return $this->_data['copyright']; - } - - /** - * Get the feed creation date - * - * @return string|null - */ - public function getDateCreated() - { - if (array_key_exists('datecreated', $this->_data)) { - return $this->_data['datecreated']; - } - - $dateCreated = $this->getExtension('Atom')->getDateCreated(); - - if (!$dateCreated) { - $dateCreated = null; - } - - $this->_data['datecreated'] = $dateCreated; - - return $this->_data['datecreated']; - } - - /** - * Get the feed modification date - * - * @return string|null - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $dateModified = $this->getExtension('Atom')->getDateModified(); - - if (!$dateModified) { - $dateModified = null; - } - - $this->_data['datemodified'] = $dateModified; - - return $this->_data['datemodified']; - } - - /** - * Get the feed lastBuild date. This is not implemented in Atom. - * - * @return string|null - */ - public function getLastBuildDate() - { - return null; - } - - /** - * Get the feed description - * - * @return string|null - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = $this->getExtension('Atom')->getDescription(); - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the feed generator entry - * - * @return string|null - */ - public function getGenerator() - { - if (array_key_exists('generator', $this->_data)) { - return $this->_data['generator']; - } - - $generator = $this->getExtension('Atom')->getGenerator(); - - $this->_data['generator'] = $generator; - - return $this->_data['generator']; - } - - /** - * Get the feed ID - * - * @return string|null - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = $this->getExtension('Atom')->getId(); - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the feed language - * - * @return string|null - */ - public function getLanguage() - { - if (array_key_exists('language', $this->_data)) { - return $this->_data['language']; - } - - $language = $this->getExtension('Atom')->getLanguage(); - - if (!$language) { - $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); - } - - if (!$language) { - $language = null; - } - - $this->_data['language'] = $language; - - return $this->_data['language']; - } - - /** - * Get a link to the source website - * - * @return string|null - */ - public function getBaseUrl() - { - if (array_key_exists('baseUrl', $this->_data)) { - return $this->_data['baseUrl']; - } - - $baseUrl = $this->getExtension('Atom')->getBaseUrl(); - - $this->_data['baseUrl'] = $baseUrl; - - return $this->_data['baseUrl']; - } - - /** - * Get a link to the source website - * - * @return string|null - */ - public function getLink() - { - if (array_key_exists('link', $this->_data)) { - return $this->_data['link']; - } - - $link = $this->getExtension('Atom')->getLink(); - - $this->_data['link'] = $link; - - return $this->_data['link']; - } - - /** - * Get feed image data - * - * @return array|null - */ - public function getImage() - { - if (array_key_exists('image', $this->_data)) { - return $this->_data['image']; - } - - $link = $this->getExtension('Atom')->getImage(); - - $this->_data['image'] = $link; - - return $this->_data['image']; - } - - /** - * Get a link to the feed's XML Url - * - * @return string|null - */ - public function getFeedLink() - { - if (array_key_exists('feedlink', $this->_data)) { - return $this->_data['feedlink']; - } - - $link = $this->getExtension('Atom')->getFeedLink(); - - if ($link === null || empty($link)) { - $link = $this->getOriginalSourceUri(); - } - - $this->_data['feedlink'] = $link; - - return $this->_data['feedlink']; - } - - /** - * Get the feed title - * - * @return string|null - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = $this->getExtension('Atom')->getTitle(); - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get an array of any supported Pusubhubbub endpoints - * - * @return array|null - */ - public function getHubs() - { - if (array_key_exists('hubs', $this->_data)) { - return $this->_data['hubs']; - } - - $hubs = $this->getExtension('Atom')->getHubs(); - - $this->_data['hubs'] = $hubs; - - return $this->_data['hubs']; - } - - /** - * Get all categories - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - $categoryCollection = $this->getExtension('Atom')->getCategories(); - - if (count($categoryCollection) == 0) { - $categoryCollection = $this->getExtension('DublinCore')->getCategories(); - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Read all entries to the internal entries array - * - * @return void - */ - protected function _indexEntries() - { - if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 || - $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03) { - $entries = array(); - $entries = $this->_xpath->evaluate('//atom:entry'); - - foreach($entries as $index=>$entry) { - $this->_entries[$index] = $entry; - } - } - } - - /** - * Register the default namespaces for the current feed format - * - */ - protected function _registerNamespaces() - { - switch ($this->_data['type']) { - case Zend_Feed_Reader::TYPE_ATOM_03: - $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); - break; - case Zend_Feed_Reader::TYPE_ATOM_10: - default: - $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); - } - } -} diff --git a/library/Zend/Feed/Reader/Feed/Atom/Source.php b/library/Zend/Feed/Reader/Feed/Atom/Source.php deleted file mode 100644 index 88bf888cb8..0000000000 --- a/library/Zend/Feed/Reader/Feed/Atom/Source.php +++ /dev/null @@ -1,102 +0,0 @@ -_domDocument = $source->ownerDocument; - $this->_xpath = new DOMXPath($this->_domDocument); - $this->_data['type'] = $type; - $this->_registerNamespaces(); - $this->_loadExtensions(); - - $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Feed'); - $this->_extensions['Atom_Feed'] = new $atomClass($this->_domDocument, $this->_data['type'], $this->_xpath); - $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('DublinCore_Feed'); - $this->_extensions['DublinCore_Feed'] = new $atomClass($this->_domDocument, $this->_data['type'], $this->_xpath); - foreach ($this->_extensions as $extension) { - $extension->setXpathPrefix(rtrim($xpathPrefix, '/') . '/atom:source'); - } - } - - /** - * Since this is not an Entry carrier but a vehicle for Feed metadata, any - * applicable Entry methods are stubbed out and do nothing. - */ - - /** - * @return void - */ - public function count() {} - - /** - * @return void - */ - public function current() {} - - /** - * @return void - */ - public function key() {} - - /** - * @return void - */ - public function next() {} - - /** - * @return void - */ - public function rewind() {} - - /** - * @return void - */ - public function valid() {} - - /** - * @return void - */ - protected function _indexEntries() {} - -} diff --git a/library/Zend/Feed/Reader/Feed/Rss.php b/library/Zend/Feed/Reader/Feed/Rss.php deleted file mode 100644 index 35a570f277..0000000000 --- a/library/Zend/Feed/Reader/Feed/Rss.php +++ /dev/null @@ -1,733 +0,0 @@ -getClassName('DublinCore_Feed'); - $this->_extensions['DublinCore_Feed'] = new $dublinCoreClass($dom, $this->_data['type'], $this->_xpath); - $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Feed'); - $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath); - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $xpathPrefix = '/rss/channel'; - } else { - $xpathPrefix = '/rdf:RDF/rss:channel'; - } - foreach ($this->_extensions as $extension) { - $extension->setXpathPrefix($xpathPrefix); - } - } - - /** - * Get a single author - * - * @param int $index - * @return string|null - */ - public function getAuthor($index = 0) - { - $authors = $this->getAuthors(); - - if (isset($authors[$index])) { - return $authors[$index]; - } - - return null; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (array_key_exists('authors', $this->_data)) { - return $this->_data['authors']; - } - - $authors = array(); - $authors_dc = $this->getExtension('DublinCore')->getAuthors(); - if (!empty($authors_dc)) { - foreach ($authors_dc as $author) { - $authors[] = array( - 'name' => $author['name'] - ); - } - } - - /** - * Technically RSS doesn't specific author element use at the feed level - * but it's supported on a "just in case" basis. - */ - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 - && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query('//author'); - } else { - $list = $this->_xpath->query('//rss:author'); - } - if ($list->length) { - foreach ($list as $author) { - $string = trim($author->nodeValue); - $email = null; - $name = null; - $data = array(); - // Pretty rough parsing - but it's a catchall - if (preg_match("/^.*@[^ ]*/", $string, $matches)) { - $data['email'] = trim($matches[0]); - if (preg_match("/\((.*)\)$/", $string, $matches)) { - $data['name'] = $matches[1]; - } - $authors[] = $data; - } - } - } - - if (count($authors) == 0) { - $authors = $this->getExtension('Atom')->getAuthors(); - } else { - $authors = new Zend_Feed_Reader_Collection_Author( - Zend_Feed_Reader::arrayUnique($authors) - ); - } - - if (count($authors) == 0) { - $authors = null; - } - - $this->_data['authors'] = $authors; - - return $this->_data['authors']; - } - - /** - * Get the copyright entry - * - * @return string|null - */ - public function getCopyright() - { - if (array_key_exists('copyright', $this->_data)) { - return $this->_data['copyright']; - } - - $copyright = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $copyright = $this->_xpath->evaluate('string(/rss/channel/copyright)'); - } - - if (!$copyright && $this->getExtension('DublinCore') !== null) { - $copyright = $this->getExtension('DublinCore')->getCopyright(); - } - - if (empty($copyright)) { - $copyright = $this->getExtension('Atom')->getCopyright(); - } - - if (!$copyright) { - $copyright = null; - } - - $this->_data['copyright'] = $copyright; - - return $this->_data['copyright']; - } - - /** - * Get the feed creation date - * - * @return string|null - */ - public function getDateCreated() - { - return $this->getDateModified(); - } - - /** - * Get the feed modification date - * - * @return Zend_Date - */ - public function getDateModified() - { - if (array_key_exists('datemodified', $this->_data)) { - return $this->_data['datemodified']; - } - - $dateModified = null; - $date = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $dateModified = $this->_xpath->evaluate('string(/rss/channel/pubDate)'); - if (!$dateModified) { - $dateModified = $this->_xpath->evaluate('string(/rss/channel/lastBuildDate)'); - } - if ($dateModified) { - $dateModifiedParsed = strtotime($dateModified); - if ($dateModifiedParsed) { - $date = new Zend_Date($dateModifiedParsed); - } else { - $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, - Zend_Date::RFC_2822, Zend_Date::DATES); - $date = new Zend_Date; - foreach ($dateStandards as $standard) { - try { - $date->set($dateModified, $standard); - break; - } catch (Zend_Date_Exception $e) { - if ($standard == Zend_Date::DATES) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - 'Could not load date due to unrecognised' - .' format (should follow RFC 822 or 2822):' - . $e->getMessage(), - 0, $e - ); - } - } - } - } - } - } - - if (!$date) { - $date = $this->getExtension('DublinCore')->getDate(); - } - - if (!$date) { - $date = $this->getExtension('Atom')->getDateModified(); - } - - if (!$date) { - $date = null; - } - - $this->_data['datemodified'] = $date; - - return $this->_data['datemodified']; - } - - /** - * Get the feed lastBuild date - * - * @return Zend_Date - */ - public function getLastBuildDate() - { - if (array_key_exists('lastBuildDate', $this->_data)) { - return $this->_data['lastBuildDate']; - } - - $lastBuildDate = null; - $date = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $lastBuildDate = $this->_xpath->evaluate('string(/rss/channel/lastBuildDate)'); - if ($lastBuildDate) { - $lastBuildDateParsed = strtotime($lastBuildDate); - if ($lastBuildDateParsed) { - $date = new Zend_Date($lastBuildDateParsed); - } else { - $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, - Zend_Date::RFC_2822, Zend_Date::DATES); - $date = new Zend_Date; - foreach ($dateStandards as $standard) { - try { - $date->set($lastBuildDate, $standard); - break; - } catch (Zend_Date_Exception $e) { - if ($standard == Zend_Date::DATES) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception( - 'Could not load date due to unrecognised' - .' format (should follow RFC 822 or 2822):' - . $e->getMessage(), - 0, $e - ); - } - } - } - } - } - } - - if (!$date) { - $date = null; - } - - $this->_data['lastBuildDate'] = $date; - - return $this->_data['lastBuildDate']; - } - - /** - * Get the feed description - * - * @return string|null - */ - public function getDescription() - { - if (array_key_exists('description', $this->_data)) { - return $this->_data['description']; - } - - $description = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $description = $this->_xpath->evaluate('string(/rss/channel/description)'); - } else { - $description = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:description)'); - } - - if (!$description && $this->getExtension('DublinCore') !== null) { - $description = $this->getExtension('DublinCore')->getDescription(); - } - - if (empty($description)) { - $description = $this->getExtension('Atom')->getDescription(); - } - - if (!$description) { - $description = null; - } - - $this->_data['description'] = $description; - - return $this->_data['description']; - } - - /** - * Get the feed ID - * - * @return string|null - */ - public function getId() - { - if (array_key_exists('id', $this->_data)) { - return $this->_data['id']; - } - - $id = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $id = $this->_xpath->evaluate('string(/rss/channel/guid)'); - } - - if (!$id && $this->getExtension('DublinCore') !== null) { - $id = $this->getExtension('DublinCore')->getId(); - } - - if (empty($id)) { - $id = $this->getExtension('Atom')->getId(); - } - - if (!$id) { - if ($this->getLink()) { - $id = $this->getLink(); - } elseif ($this->getTitle()) { - $id = $this->getTitle(); - } else { - $id = null; - } - } - - $this->_data['id'] = $id; - - return $this->_data['id']; - } - - /** - * Get the feed image data - * - * @return array|null - */ - public function getImage() - { - if (array_key_exists('image', $this->_data)) { - return $this->_data['image']; - } - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query('/rss/channel/image'); - $prefix = '/rss/channel/image[1]'; - } else { - $list = $this->_xpath->query('/rdf:RDF/rss:channel/rss:image'); - $prefix = '/rdf:RDF/rss:channel/rss:image[1]'; - } - if ($list->length > 0) { - $image = array(); - $value = $this->_xpath->evaluate('string(' . $prefix . '/url)'); - if ($value) { - $image['uri'] = $value; - } - $value = $this->_xpath->evaluate('string(' . $prefix . '/link)'); - if ($value) { - $image['link'] = $value; - } - $value = $this->_xpath->evaluate('string(' . $prefix . '/title)'); - if ($value) { - $image['title'] = $value; - } - $value = $this->_xpath->evaluate('string(' . $prefix . '/height)'); - if ($value) { - $image['height'] = $value; - } - $value = $this->_xpath->evaluate('string(' . $prefix . '/width)'); - if ($value) { - $image['width'] = $value; - } - $value = $this->_xpath->evaluate('string(' . $prefix . '/description)'); - if ($value) { - $image['description'] = $value; - } - } else { - $image = null; - } - - $this->_data['image'] = $image; - - return $this->_data['image']; - } - - /** - * Get the feed language - * - * @return string|null - */ - public function getLanguage() - { - if (array_key_exists('language', $this->_data)) { - return $this->_data['language']; - } - - $language = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $language = $this->_xpath->evaluate('string(/rss/channel/language)'); - } - - if (!$language && $this->getExtension('DublinCore') !== null) { - $language = $this->getExtension('DublinCore')->getLanguage(); - } - - if (empty($language)) { - $language = $this->getExtension('Atom')->getLanguage(); - } - - if (!$language) { - $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); - } - - if (!$language) { - $language = null; - } - - $this->_data['language'] = $language; - - return $this->_data['language']; - } - - /** - * Get a link to the feed - * - * @return string|null - */ - public function getLink() - { - if (array_key_exists('link', $this->_data)) { - return $this->_data['link']; - } - - $link = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $link = $this->_xpath->evaluate('string(/rss/channel/link)'); - } else { - $link = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:link)'); - } - - if (empty($link)) { - $link = $this->getExtension('Atom')->getLink(); - } - - if (!$link) { - $link = null; - } - - $this->_data['link'] = $link; - - return $this->_data['link']; - } - - /** - * Get a link to the feed XML - * - * @return string|null - */ - public function getFeedLink() - { - if (array_key_exists('feedlink', $this->_data)) { - return $this->_data['feedlink']; - } - - $link = null; - - $link = $this->getExtension('Atom')->getFeedLink(); - - if ($link === null || empty($link)) { - $link = $this->getOriginalSourceUri(); - } - - $this->_data['feedlink'] = $link; - - return $this->_data['feedlink']; - } - - /** - * Get the feed generator entry - * - * @return string|null - */ - public function getGenerator() - { - if (array_key_exists('generator', $this->_data)) { - return $this->_data['generator']; - } - - $generator = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $generator = $this->_xpath->evaluate('string(/rss/channel/generator)'); - } - - if (!$generator) { - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $generator = $this->_xpath->evaluate('string(/rss/channel/atom:generator)'); - } else { - $generator = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/atom:generator)'); - } - } - - if (empty($generator)) { - $generator = $this->getExtension('Atom')->getGenerator(); - } - - if (!$generator) { - $generator = null; - } - - $this->_data['generator'] = $generator; - - return $this->_data['generator']; - } - - /** - * Get the feed title - * - * @return string|null - */ - public function getTitle() - { - if (array_key_exists('title', $this->_data)) { - return $this->_data['title']; - } - - $title = null; - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $title = $this->_xpath->evaluate('string(/rss/channel/title)'); - } else { - $title = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:title)'); - } - - if (!$title && $this->getExtension('DublinCore') !== null) { - $title = $this->getExtension('DublinCore')->getTitle(); - } - - if (!$title) { - $title = $this->getExtension('Atom')->getTitle(); - } - - if (!$title) { - $title = null; - } - - $this->_data['title'] = $title; - - return $this->_data['title']; - } - - /** - * Get an array of any supported Pusubhubbub endpoints - * - * @return array|null - */ - public function getHubs() - { - if (array_key_exists('hubs', $this->_data)) { - return $this->_data['hubs']; - } - - $hubs = $this->getExtension('Atom')->getHubs(); - - if (empty($hubs)) { - $hubs = null; - } else { - $hubs = array_unique($hubs); - } - - $this->_data['hubs'] = $hubs; - - return $this->_data['hubs']; - } - - /** - * Get all categories - * - * @return Zend_Feed_Reader_Collection_Category - */ - public function getCategories() - { - if (array_key_exists('categories', $this->_data)) { - return $this->_data['categories']; - } - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && - $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $list = $this->_xpath->query('/rss/channel//category'); - } else { - $list = $this->_xpath->query('/rdf:RDF/rss:channel//rss:category'); - } - - if ($list->length) { - $categoryCollection = new Zend_Feed_Reader_Collection_Category; - foreach ($list as $category) { - $categoryCollection[] = array( - 'term' => $category->nodeValue, - 'scheme' => $category->getAttribute('domain'), - 'label' => $category->nodeValue, - ); - } - } else { - $categoryCollection = $this->getExtension('DublinCore')->getCategories(); - } - - if (count($categoryCollection) == 0) { - $categoryCollection = $this->getExtension('Atom')->getCategories(); - } - - $this->_data['categories'] = $categoryCollection; - - return $this->_data['categories']; - } - - /** - * Read all entries to the internal entries array - * - */ - protected function _indexEntries() - { - $entries = array(); - - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { - $entries = $this->_xpath->evaluate('//item'); - } else { - $entries = $this->_xpath->evaluate('//rss:item'); - } - - foreach($entries as $index=>$entry) { - $this->_entries[$index] = $entry; - } - } - - /** - * Register the default namespaces for the current feed format - * - */ - protected function _registerNamespaces() - { - switch ($this->_data['type']) { - case Zend_Feed_Reader::TYPE_RSS_10: - $this->_xpath->registerNamespace('rdf', Zend_Feed_Reader::NAMESPACE_RDF); - $this->_xpath->registerNamespace('rss', Zend_Feed_Reader::NAMESPACE_RSS_10); - break; - - case Zend_Feed_Reader::TYPE_RSS_090: - $this->_xpath->registerNamespace('rdf', Zend_Feed_Reader::NAMESPACE_RDF); - $this->_xpath->registerNamespace('rss', Zend_Feed_Reader::NAMESPACE_RSS_090); - break; - } - } -} diff --git a/library/Zend/Feed/Reader/FeedAbstract.php b/library/Zend/Feed/Reader/FeedAbstract.php deleted file mode 100644 index 02dd0b49e4..0000000000 --- a/library/Zend/Feed/Reader/FeedAbstract.php +++ /dev/null @@ -1,321 +0,0 @@ -_domDocument = $domDocument; - $this->_xpath = new DOMXPath($this->_domDocument); - - if ($type !== null) { - $this->_data['type'] = $type; - } else { - $this->_data['type'] = Zend_Feed_Reader::detectType($this->_domDocument); - } - $this->_registerNamespaces(); - $this->_indexEntries(); - $this->_loadExtensions(); - } - - /** - * Set an original source URI for the feed being parsed. This value - * is returned from getFeedLink() method if the feed does not carry - * a self-referencing URI. - * - * @param string $uri - */ - public function setOriginalSourceUri($uri) - { - $this->_originalSourceUri = $uri; - } - - /** - * Get an original source URI for the feed being parsed. Returns null if - * unset or the feed was not imported from a URI. - * - * @return string|null - */ - public function getOriginalSourceUri() - { - return $this->_originalSourceUri; - } - - /** - * Get the number of feed entries. - * Required by the Iterator interface. - * - * @return int - */ - public function count() - { - return count($this->_entries); - } - - /** - * Return the current entry - * - * @return Zend_Feed_Reader_EntryInterface - */ - public function current() - { - if (substr($this->getType(), 0, 3) == 'rss') { - $reader = new Zend_Feed_Reader_Entry_Rss($this->_entries[$this->key()], $this->key(), $this->getType()); - } else { - $reader = new Zend_Feed_Reader_Entry_Atom($this->_entries[$this->key()], $this->key(), $this->getType()); - } - - $reader->setXpath($this->_xpath); - - return $reader; - } - - /** - * Get the DOM - * - * @return DOMDocument - */ - public function getDomDocument() - { - return $this->_domDocument; - } - - /** - * Get the Feed's encoding - * - * @return string - */ - public function getEncoding() - { - $assumed = $this->getDomDocument()->encoding; - if (empty($assumed)) { - $assumed = 'UTF-8'; - } - return $assumed; - } - - /** - * Get feed as xml - * - * @return string - */ - public function saveXml() - { - return $this->getDomDocument()->saveXml(); - } - - /** - * Get the DOMElement representing the items/feed element - * - * @return DOMElement - */ - public function getElement() - { - return $this->getDomDocument()->documentElement; - } - - /** - * Get the DOMXPath object for this feed - * - * @return DOMXPath - */ - public function getXpath() - { - return $this->_xpath; - } - - /** - * Get the feed type - * - * @return string - */ - public function getType() - { - return $this->_data['type']; - } - - /** - * Return the current feed key - * - * @return unknown - */ - public function key() - { - return $this->_entriesKey; - } - - /** - * Move the feed pointer forward - * - */ - public function next() - { - ++$this->_entriesKey; - } - - /** - * Reset the pointer in the feed object - * - */ - public function rewind() - { - $this->_entriesKey = 0; - } - - /** - * Check to see if the iterator is still valid - * - * @return boolean - */ - public function valid() - { - return 0 <= $this->_entriesKey && $this->_entriesKey < $this->count(); - } - - public function getExtensions() - { - return $this->_extensions; - } - - public function __call($method, $args) - { - foreach ($this->_extensions as $extension) { - if (method_exists($extension, $method)) { - return call_user_func_array(array($extension, $method), $args); - } - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Method: ' . $method - . 'does not exist and could not be located on a registered Extension'); - } - - /** - * Return an Extension object with the matching name (postfixed with _Feed) - * - * @param string $name - * @return Zend_Feed_Reader_Extension_FeedAbstract - */ - public function getExtension($name) - { - if (array_key_exists($name . '_Feed', $this->_extensions)) { - return $this->_extensions[$name . '_Feed']; - } - return null; - } - - protected function _loadExtensions() - { - $all = Zend_Feed_Reader::getExtensions(); - $feed = $all['feed']; - foreach ($feed as $extension) { - if (in_array($extension, $all['core'])) { - continue; - } - $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension); - $this->_extensions[$extension] = new $className( - $this->getDomDocument(), $this->_data['type'], $this->_xpath - ); - } - } - - /** - * Read all entries to the internal entries array - * - */ - abstract protected function _indexEntries(); - - /** - * Register the default namespaces for the current feed format - * - */ - abstract protected function _registerNamespaces(); -} diff --git a/library/Zend/Feed/Reader/FeedInterface.php b/library/Zend/Feed/Reader/FeedInterface.php deleted file mode 100644 index be65c725f1..0000000000 --- a/library/Zend/Feed/Reader/FeedInterface.php +++ /dev/null @@ -1,122 +0,0 @@ -getAttribute('rel')) !== 'alternate' - || !$link->getAttribute('type') || !$link->getAttribute('href')) { - continue; - } - if (!isset($this->rss) && $link->getAttribute('type') == 'application/rss+xml') { - $this->rss = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); - } elseif(!isset($this->atom) && $link->getAttribute('type') == 'application/atom+xml') { - $this->atom = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); - } elseif(!isset($this->rdf) && $link->getAttribute('type') == 'application/rdf+xml') { - $this->rdf = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); - } - $this[] = new self(array( - 'rel' => 'alternate', - 'type' => $link->getAttribute('type'), - 'href' => $this->_absolutiseUri(trim($link->getAttribute('href')), $uri), - )); - } - } - - /** - * Attempt to turn a relative URI into an absolute URI - */ - protected function _absolutiseUri($link, $uri = null) - { - if (!Zend_Uri::check($link)) { - if ($uri !== null) { - $uri = Zend_Uri::factory($uri); - - if ($link[0] !== '/') { - $link = $uri->getPath() . '/' . $link; - } - - $link = $uri->getScheme() . '://' . $uri->getHost() . '/' . $this->_canonicalizePath($link); - if (!Zend_Uri::check($link)) { - $link = null; - } - } - } - return $link; - } - - /** - * Canonicalize relative path - */ - protected function _canonicalizePath($path) - { - $parts = array_filter(explode('/', $path)); - $absolutes = array(); - foreach ($parts as $part) { - if ('.' == $part) { - continue; - } - if ('..' == $part) { - array_pop($absolutes); - } else { - $absolutes[] = $part; - } - } - return implode('/', $absolutes); - } - - /** - * Supports lazy loading of feeds using Zend_Feed_Reader::import() but - * delegates any other operations to the parent class. - * - * @param string $offset - * @return mixed - * @uses Zend_Feed_Reader - */ - public function offsetGet($offset) - { - if ($offset == 'feed' && !$this->offsetExists('feed')) { - if (!$this->offsetExists('href')) { - return null; - } - $feed = Zend_Feed_Reader::import($this->offsetGet('href')); - $this->offsetSet('feed', $feed); - return $feed; - } - return parent::offsetGet($offset); - } - -} diff --git a/library/Zend/Feed/Rss.php b/library/Zend/Feed/Rss.php deleted file mode 100644 index 674ba51a1e..0000000000 --- a/library/Zend/Feed/Rss.php +++ /dev/null @@ -1,530 +0,0 @@ -s). - * - * @var string - */ - protected $_entryElementName = 'item'; - - /** - * The default namespace for RSS channels. - * - * @var string - */ - protected $_defaultNamespace = 'rss'; - - /** - * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. - * - * @return void - * @throws Zend_Feed_Exception - */ - public function __wakeup() - { - parent::__wakeup(); - - // Find the base channel element and create an alias to it. - $rdfTags = $this->_element->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RDF'); - if ($rdfTags->length != 0) { - $this->_element = $rdfTags->item(0); - } else { - $this->_element = $this->_element->getElementsByTagName('channel')->item(0); - } - if (!$this->_element) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('No root element found, cannot parse channel.'); - } - - // Find the entries and save a pointer to them for speed and - // simplicity. - $this->_buildEntryCache(); - } - - - /** - * Make accessing some individual elements of the channel easier. - * - * Special accessors 'item' and 'items' are provided so that if - * you wish to iterate over an RSS channel's items, you can do so - * using foreach ($channel->items as $item) or foreach - * ($channel->item as $item). - * - * @param string $var The property to access. - * @return mixed - */ - public function __get($var) - { - switch ($var) { - case 'item': - // fall through to the next case - case 'items': - return $this; - - default: - return parent::__get($var); - } - } - - /** - * Generate the header of the feed when working in write mode - * - * @param array $array the data to use - * @return DOMElement root node - */ - protected function _mapFeedHeaders($array) - { - $channel = $this->_element->createElement('channel'); - - $title = $this->_element->createElement('title'); - $title->appendChild($this->_element->createCDATASection($array->title)); - $channel->appendChild($title); - - $link = $this->_element->createElement('link', $array->link); - $channel->appendChild($link); - - $desc = isset($array->description) ? $array->description : ''; - $description = $this->_element->createElement('description'); - $description->appendChild($this->_element->createCDATASection($desc)); - $channel->appendChild($description); - - $pubdate = isset($array->lastUpdate) ? $array->lastUpdate : time(); - $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); - $channel->appendChild($pubdate); - - if (isset($array->published)) { - $lastBuildDate = $this->_element->createElement('lastBuildDate', date(DATE_RSS, $array->published)); - $channel->appendChild($lastBuildDate); - } - - $editor = ''; - if (!empty($array->email)) { - $editor .= $array->email; - } - if (!empty($array->author)) { - $editor .= ' (' . $array->author . ')'; - } - if (!empty($editor)) { - $author = $this->_element->createElement('managingEditor', ltrim($editor)); - $channel->appendChild($author); - } - if (isset($array->webmaster)) { - $channel->appendChild($this->_element->createElement('webMaster', $array->webmaster)); - } - - if (!empty($array->copyright)) { - $copyright = $this->_element->createElement('copyright', $array->copyright); - $channel->appendChild($copyright); - } - - if (isset($array->category)) { - $category = $this->_element->createElement('category', $array->category); - $channel->appendChild($category); - } - - if (!empty($array->image)) { - $image = $this->_element->createElement('image'); - $url = $this->_element->createElement('url', $array->image); - $image->appendChild($url); - $imagetitle = $this->_element->createElement('title'); - $imagetitle->appendChild($this->_element->createCDATASection($array->title)); - $image->appendChild($imagetitle); - $imagelink = $this->_element->createElement('link', $array->link); - $image->appendChild($imagelink); - - $channel->appendChild($image); - } - - $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; - $generator = $this->_element->createElement('generator', $generator); - $channel->appendChild($generator); - - if (!empty($array->language)) { - $language = $this->_element->createElement('language', $array->language); - $channel->appendChild($language); - } - - $doc = $this->_element->createElement('docs', 'http://blogs.law.harvard.edu/tech/rss'); - $channel->appendChild($doc); - - if (isset($array->cloud)) { - $cloud = $this->_element->createElement('cloud'); - $cloud->setAttribute('domain', $array->cloud['uri']->getHost()); - $cloud->setAttribute('port', $array->cloud['uri']->getPort()); - $cloud->setAttribute('path', $array->cloud['uri']->getPath()); - $cloud->setAttribute('registerProcedure', $array->cloud['procedure']); - $cloud->setAttribute('protocol', $array->cloud['protocol']); - $channel->appendChild($cloud); - } - - if (isset($array->ttl)) { - $ttl = $this->_element->createElement('ttl', $array->ttl); - $channel->appendChild($ttl); - } - - if (isset($array->rating)) { - $rating = $this->_element->createElement('rating', $array->rating); - $channel->appendChild($rating); - } - - if (isset($array->textInput)) { - $textinput = $this->_element->createElement('textInput'); - $textinput->appendChild($this->_element->createElement('title', $array->textInput['title'])); - $textinput->appendChild($this->_element->createElement('description', $array->textInput['description'])); - $textinput->appendChild($this->_element->createElement('name', $array->textInput['name'])); - $textinput->appendChild($this->_element->createElement('link', $array->textInput['link'])); - $channel->appendChild($textinput); - } - - if (isset($array->skipHours)) { - $skipHours = $this->_element->createElement('skipHours'); - foreach ($array->skipHours as $hour) { - $skipHours->appendChild($this->_element->createElement('hour', $hour)); - } - $channel->appendChild($skipHours); - } - - if (isset($array->skipDays)) { - $skipDays = $this->_element->createElement('skipDays'); - foreach ($array->skipDays as $day) { - $skipDays->appendChild($this->_element->createElement('day', $day)); - } - $channel->appendChild($skipDays); - } - - if (isset($array->itunes)) { - $this->_buildiTunes($channel, $array); - } - - return $channel; - } - - /** - * Adds the iTunes extensions to a root node - * - * @param DOMElement $root - * @param array $array - * @return void - */ - private function _buildiTunes(DOMElement $root, $array) - { - /* author node */ - $author = ''; - if (isset($array->itunes->author)) { - $author = $array->itunes->author; - } elseif (isset($array->author)) { - $author = $array->author; - } - if (!empty($author)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:author', $author); - $root->appendChild($node); - } - - /* owner node */ - $author = ''; - $email = ''; - if (isset($array->itunes->owner)) { - if (isset($array->itunes->owner['name'])) { - $author = $array->itunes->owner['name']; - } - if (isset($array->itunes->owner['email'])) { - $email = $array->itunes->owner['email']; - } - } - if (empty($author) && isset($array->author)) { - $author = $array->author; - } - if (empty($email) && isset($array->email)) { - $email = $array->email; - } - if (!empty($author) || !empty($email)) { - $owner = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:owner'); - if (!empty($author)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:name', $author); - $owner->appendChild($node); - } - if (!empty($email)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:email', $email); - $owner->appendChild($node); - } - $root->appendChild($owner); - } - $image = ''; - if (isset($array->itunes->image)) { - $image = $array->itunes->image; - } elseif (isset($array->image)) { - $image = $array->image; - } - if (!empty($image)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:image'); - $node->setAttribute('href', $image); - $root->appendChild($node); - } - $subtitle = ''; - if (isset($array->itunes->subtitle)) { - $subtitle = $array->itunes->subtitle; - } elseif (isset($array->description)) { - $subtitle = $array->description; - } - if (!empty($subtitle)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:subtitle', $subtitle); - $root->appendChild($node); - } - $summary = ''; - if (isset($array->itunes->summary)) { - $summary = $array->itunes->summary; - } elseif (isset($array->description)) { - $summary = $array->description; - } - if (!empty($summary)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:summary', $summary); - $root->appendChild($node); - } - if (isset($array->itunes->block)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:block', $array->itunes->block); - $root->appendChild($node); - } - if (isset($array->itunes->explicit)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:explicit', $array->itunes->explicit); - $root->appendChild($node); - } - if (isset($array->itunes->keywords)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:keywords', $array->itunes->keywords); - $root->appendChild($node); - } - if (isset($array->itunes->new_feed_url)) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:new-feed-url', $array->itunes->new_feed_url); - $root->appendChild($node); - } - if (isset($array->itunes->category)) { - foreach ($array->itunes->category as $i => $category) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); - $node->setAttribute('text', $category['main']); - $root->appendChild($node); - $add_end_category = false; - if (!empty($category['sub'])) { - $add_end_category = true; - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); - $node->setAttribute('text', $category['sub']); - $root->appendChild($node); - } - if ($i > 0 || $add_end_category) { - $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); - $root->appendChild($node); - } - } - } - } - - /** - * Generate the entries of the feed when working in write mode - * - * The following nodes are constructed for each feed entry - * - * entry title - * url to feed entry - * url to feed entry - * short text - * long version, can contain html - * - * - * @param DOMElement $root the root node to use - * @param array $array the data to use - * @return void - */ - protected function _mapFeedEntries(DOMElement $root, $array) - { - Zend_Feed::registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); - - foreach ($array as $dataentry) { - $item = $this->_element->createElement('item'); - - $title = $this->_element->createElement('title'); - $title->appendChild($this->_element->createCDATASection($dataentry->title)); - $item->appendChild($title); - - if (isset($dataentry->author)) { - $author = $this->_element->createElement('author', $dataentry->author); - $item->appendChild($author); - } - - $link = $this->_element->createElement('link', $dataentry->link); - $item->appendChild($link); - - if (isset($dataentry->guid)) { - $guid = $this->_element->createElement('guid', $dataentry->guid); - if (!Zend_Uri::check($dataentry->guid)) { - $guid->setAttribute('isPermaLink', 'false'); - } - $item->appendChild($guid); - } - - $description = $this->_element->createElement('description'); - $description->appendChild($this->_element->createCDATASection($dataentry->description)); - $item->appendChild($description); - - if (isset($dataentry->content)) { - $content = $this->_element->createElement('content:encoded'); - $content->appendChild($this->_element->createCDATASection($dataentry->content)); - $item->appendChild($content); - } - - $pubdate = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); - $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); - $item->appendChild($pubdate); - - if (isset($dataentry->category)) { - foreach ($dataentry->category as $category) { - $node = $this->_element->createElement('category'); - $node->appendChild($this->_element->createCDATASection($category['term'])); - if (isset($category['scheme'])) { - $node->setAttribute('domain', $category['scheme']); - } - $item->appendChild($node); - } - } - - if (isset($dataentry->source)) { - $source = $this->_element->createElement('source', $dataentry->source['title']); - $source->setAttribute('url', $dataentry->source['url']); - $item->appendChild($source); - } - - if (isset($dataentry->comments)) { - $comments = $this->_element->createElement('comments', $dataentry->comments); - $item->appendChild($comments); - } - if (isset($dataentry->commentRss)) { - $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', - 'wfw:commentRss', - $dataentry->commentRss); - $item->appendChild($comments); - } - - - if (isset($dataentry->enclosure)) { - foreach ($dataentry->enclosure as $enclosure) { - $node = $this->_element->createElement('enclosure'); - $node->setAttribute('url', $enclosure['url']); - if (isset($enclosure['type'])) { - $node->setAttribute('type', $enclosure['type']); - } - if (isset($enclosure['length'])) { - $node->setAttribute('length', $enclosure['length']); - } - $item->appendChild($node); - } - } - - $root->appendChild($item); - } - } - - /** - * Override Zend_Feed_Element to include root node - * - * @return string - */ - public function saveXml() - { - // Return a complete document including XML prologue. - $doc = new DOMDocument($this->_element->ownerDocument->version, - $this->_element->ownerDocument->actualEncoding); - $root = $doc->createElement('rss'); - - // Use rss version 2.0 - $root->setAttribute('version', '2.0'); - - // Content namespace - $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:content', 'http://purl.org/rss/1.0/modules/content/'); - $root->appendChild($doc->importNode($this->_element, true)); - - // Append root node - $doc->appendChild($root); - - // Format output - $doc->formatOutput = true; - - return $doc->saveXML(); - } - - /** - * Send feed to a http client with the correct header - * - * @return void - * @throws Zend_Feed_Exception if headers have already been sent - */ - public function send() - { - if (headers_sent()) { - /** - * @see Zend_Feed_Exception - */ - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Cannot send RSS because headers have already been sent.'); - } - - header('Content-Type: application/rss+xml; charset=' . $this->_element->ownerDocument->actualEncoding); - - echo $this->saveXml(); - } - -} diff --git a/library/Zend/Feed/Writer.php b/library/Zend/Feed/Writer.php deleted file mode 100644 index eae26287d8..0000000000 --- a/library/Zend/Feed/Writer.php +++ /dev/null @@ -1,267 +0,0 @@ - array(), - 'feed' => array(), - 'entryRenderer' => array(), - 'feedRenderer' => array(), - ); - - /** - * Set plugin loader for use with Extensions - * - * @param Zend_Loader_PluginLoader_Interface - */ - public static function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) - { - self::$_pluginLoader = $loader; - } - - /** - * Get plugin loader for use with Extensions - * - * @return Zend_Loader_PluginLoader_Interface - */ - public static function getPluginLoader() - { - if (!isset(self::$_pluginLoader)) { - #require_once 'Zend/Loader/PluginLoader.php'; - self::$_pluginLoader = new Zend_Loader_PluginLoader(array( - 'Zend_Feed_Writer_Extension_' => 'Zend/Feed/Writer/Extension/', - )); - } - return self::$_pluginLoader; - } - - /** - * Add prefix path for loading Extensions - * - * @param string $prefix - * @param string $path - * @return void - */ - public static function addPrefixPath($prefix, $path) - { - $prefix = rtrim($prefix, '_'); - $path = rtrim($path, DIRECTORY_SEPARATOR); - self::getPluginLoader()->addPrefixPath($prefix, $path); - } - - /** - * Add multiple Extension prefix paths at once - * - * @param array $spec - * @return void - */ - public static function addPrefixPaths(array $spec) - { - if (isset($spec['prefix']) && isset($spec['path'])) { - self::addPrefixPath($spec['prefix'], $spec['path']); - } - foreach ($spec as $prefixPath) { - if (isset($prefixPath['prefix']) && isset($prefixPath['path'])) { - self::addPrefixPath($prefixPath['prefix'], $prefixPath['path']); - } - } - } - - /** - * Register an Extension by name - * - * @param string $name - * @return void - * @throws Zend_Feed_Exception if unable to resolve Extension class - */ - public static function registerExtension($name) - { - $feedName = $name . '_Feed'; - $entryName = $name . '_Entry'; - $feedRendererName = $name . '_Renderer_Feed'; - $entryRendererName = $name . '_Renderer_Entry'; - if (self::isRegistered($name)) { - if (self::getPluginLoader()->isLoaded($feedName) - || self::getPluginLoader()->isLoaded($entryName) - || self::getPluginLoader()->isLoaded($feedRendererName) - || self::getPluginLoader()->isLoaded($entryRendererName) - ) { - return; - } - } - try { - self::getPluginLoader()->load($feedName); - self::$_extensions['feed'][] = $feedName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - try { - self::getPluginLoader()->load($entryName); - self::$_extensions['entry'][] = $entryName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - try { - self::getPluginLoader()->load($feedRendererName); - self::$_extensions['feedRenderer'][] = $feedRendererName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - try { - self::getPluginLoader()->load($entryRendererName); - self::$_extensions['entryRenderer'][] = $entryRendererName; - } catch (Zend_Loader_PluginLoader_Exception $e) { - } - if (!self::getPluginLoader()->isLoaded($feedName) - && !self::getPluginLoader()->isLoaded($entryName) - && !self::getPluginLoader()->isLoaded($feedRendererName) - && !self::getPluginLoader()->isLoaded($entryRendererName) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Could not load extension: ' . $name - . 'using Plugin Loader. Check prefix paths are configured and extension exists.'); - } - } - - /** - * Is a given named Extension registered? - * - * @param string $extensionName - * @return boolean - */ - public static function isRegistered($extensionName) - { - $feedName = $extensionName . '_Feed'; - $entryName = $extensionName . '_Entry'; - $feedRendererName = $extensionName . '_Renderer_Feed'; - $entryRendererName = $extensionName . '_Renderer_Entry'; - if (in_array($feedName, self::$_extensions['feed']) - || in_array($entryName, self::$_extensions['entry']) - || in_array($feedRendererName, self::$_extensions['feedRenderer']) - || in_array($entryRendererName, self::$_extensions['entryRenderer']) - ) { - return true; - } - return false; - } - - /** - * Get a list of extensions - * - * @return array - */ - public static function getExtensions() - { - return self::$_extensions; - } - - /** - * Reset class state to defaults - * - * @return void - */ - public static function reset() - { - self::$_pluginLoader = null; - self::$_prefixPaths = array(); - self::$_extensions = array( - 'entry' => array(), - 'feed' => array(), - 'entryRenderer' => array(), - 'feedRenderer' => array(), - ); - } - - /** - * Register core (default) extensions - * - * @return void - */ - public static function registerCoreExtensions() - { - self::registerExtension('DublinCore'); - self::registerExtension('Content'); - self::registerExtension('Atom'); - self::registerExtension('Slash'); - self::registerExtension('WellFormedWeb'); - self::registerExtension('Threading'); - self::registerExtension('ITunes'); - } - - public static function lcfirst($str) - { - $str[0] = strtolower($str[0]); - return $str; - } - -} diff --git a/library/Zend/Feed/Writer/Deleted.php b/library/Zend/Feed/Writer/Deleted.php deleted file mode 100644 index 938f4549bf..0000000000 --- a/library/Zend/Feed/Writer/Deleted.php +++ /dev/null @@ -1,202 +0,0 @@ -_data['encoding'] = $encoding; - } - - /** - * Get the feed character encoding - * - * @return string|null - */ - public function getEncoding() - { - if (!array_key_exists('encoding', $this->_data)) { - return 'UTF-8'; - } - return $this->_data['encoding']; - } - - /** - * Unset a specific data point - * - * @param string $name - */ - public function remove($name) - { - if (isset($this->_data[$name])) { - unset($this->_data[$name]); - } - } - - /** - * Set the current feed type being exported to "rss" or "atom". This allows - * other objects to gracefully choose whether to execute or not, depending - * on their appropriateness for the current type, e.g. renderers. - * - * @param string $type - */ - public function setType($type) - { - $this->_type = $type; - } - - /** - * Retrieve the current or last feed type exported. - * - * @return string Value will be "rss" or "atom" - */ - public function getType() - { - return $this->_type; - } - - public function setReference($reference) - { - if (empty($reference) || !is_string($reference)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: reference must be a non-empty string'); - } - $this->_data['reference'] = $reference; - } - - public function getReference() - { - if (!array_key_exists('reference', $this->_data)) { - return null; - } - return $this->_data['reference']; - } - - public function setWhen($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['when'] = $zdate; - } - - public function getWhen() - { - if (!array_key_exists('when', $this->_data)) { - return null; - } - return $this->_data['when']; - } - - public function setBy(array $by) - { - $author = array(); - if (!array_key_exists('name', $by) - || empty($by['name']) - || !is_string($by['name']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: author array must include a "name" key with a non-empty string value'); - } - $author['name'] = $by['name']; - if (isset($by['email'])) { - if (empty($by['email']) || !is_string($by['email'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "email" array value must be a non-empty string'); - } - $author['email'] = $by['email']; - } - if (isset($by['uri'])) { - if (empty($by['uri']) - || !is_string($by['uri']) - || !Zend_Uri::check($by['uri']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI'); - } - $author['uri'] = $by['uri']; - } - $this->_data['by'] = $author; - } - - public function getBy() - { - if (!array_key_exists('by', $this->_data)) { - return null; - } - return $this->_data['by']; - } - - public function setComment($comment) - { - $this->_data['comment'] = $comment; - } - - public function getComment() - { - if (!array_key_exists('comment', $this->_data)) { - return null; - } - return $this->_data['comment']; - } - -} diff --git a/library/Zend/Feed/Writer/Entry.php b/library/Zend/Feed/Writer/Entry.php deleted file mode 100644 index 76786ca7a2..0000000000 --- a/library/Zend/Feed/Writer/Entry.php +++ /dev/null @@ -1,761 +0,0 @@ -_loadExtensions(); - } - - /** - * Set a single author - * - * @param int $index - * @return string|null - */ - public function addAuthor($name, $email = null, $uri = null) - { - $author = array(); - if (is_array($name)) { - if (!array_key_exists('name', $name) - || empty($name['name']) - || !is_string($name['name']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: author array must include a "name" key with a non-empty string value'); - } - $author['name'] = $name['name']; - if (isset($name['email'])) { - if (empty($name['email']) || !is_string($name['email'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "email" array value must be a non-empty string'); - } - $author['email'] = $name['email']; - } - if (isset($name['uri'])) { - if (empty($name['uri']) - || !is_string($name['uri']) - || !Zend_Uri::check($name['uri']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI'); - } - $author['uri'] = $name['uri']; - } - /** - * @deprecated - * Array notation (above) is preferred and will be the sole supported input from ZF 2.0 - */ - } else { - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "name" must be a non-empty string value'); - } - $author['name'] = $name; - if (isset($email)) { - if (empty($email) || !is_string($email)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "email" value must be a non-empty string'); - } - $author['email'] = $email; - } - if (isset($uri)) { - if (empty($uri) || !is_string($uri) || !Zend_Uri::check($uri)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" value must be a non-empty string and valid URI/IRI'); - } - $author['uri'] = $uri; - } - } - $this->_data['authors'][] = $author; - } - - /** - * Set an array with feed authors - * - * @return array - */ - public function addAuthors(array $authors) - { - foreach($authors as $author) { - $this->addAuthor($author); - } - } - - /** - * Set the feed character encoding - * - * @return string|null - */ - public function setEncoding($encoding) - { - if (empty($encoding) || !is_string($encoding)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['encoding'] = $encoding; - } - - /** - * Get the feed character encoding - * - * @return string|null - */ - public function getEncoding() - { - if (!array_key_exists('encoding', $this->_data)) { - return 'UTF-8'; - } - return $this->_data['encoding']; - } - - /** - * Set the copyright entry - * - * @return string|null - */ - public function setCopyright($copyright) - { - if (empty($copyright) || !is_string($copyright)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['copyright'] = $copyright; - } - - /** - * Set the entry's content - * - * @return string|null - */ - public function setContent($content) - { - if (empty($content) || !is_string($content)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['content'] = $content; - } - - /** - * Set the feed creation date - * - * @return string|null - */ - public function setDateCreated($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['dateCreated'] = $zdate; - } - - /** - * Set the feed modification date - * - * @return string|null - */ - public function setDateModified($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['dateModified'] = $zdate; - } - - /** - * Set the feed description - * - * @return string|null - */ - public function setDescription($description) - { - if (empty($description) || !is_string($description)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['description'] = $description; - } - - /** - * Set the feed ID - * - * @return string|null - */ - public function setId($id) - { - if (empty($id) || !is_string($id)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['id'] = $id; - } - - /** - * Set a link to the HTML source of this entry - * - * @return string|null - */ - public function setLink($link) - { - if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); - } - $this->_data['link'] = $link; - } - - /** - * Set the number of comments associated with this entry - * - * @return string|null - */ - public function setCommentCount($count) - { - if ( !is_numeric($count) || (int) $count < 0) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "count" must be a non-empty integer number'); - } - $this->_data['commentCount'] = (int) $count; - } - - /** - * Set a link to a HTML page containing comments associated with this entry - * - * @return string|null - */ - public function setCommentLink($link) - { - if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "link" must be a non-empty string and valid URI/IRI'); - } - $this->_data['commentLink'] = $link; - } - - /** - * Set a link to an XML feed for any comments associated with this entry - * - * @return string|null - */ - public function setCommentFeedLink(array $link) - { - if (!isset($link['uri']) || !is_string($link['uri']) || !Zend_Uri::check($link['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "link" must be a non-empty string and valid URI/IRI'); - } - if (!isset($link['type']) || !in_array($link['type'], array('atom', 'rss', 'rdf'))) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "type" must be one' - . ' of "atom", "rss" or "rdf"'); - } - if (!isset($this->_data['commentFeedLinks'])) { - $this->_data['commentFeedLinks'] = array(); - } - $this->_data['commentFeedLinks'][] = $link; - } - - /** - * Set a links to an XML feed for any comments associated with this entry. - * Each link is an array with keys "uri" and "type", where type is one of: - * "atom", "rss" or "rdf". - * - * @return string|null - */ - public function setCommentFeedLinks(array $links) - { - foreach ($links as $link) { - $this->setCommentFeedLink($link); - } - } - - /** - * Set the feed title - * - * @return string|null - */ - public function setTitle($title) - { - if (empty($title) || !is_string($title)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['title'] = $title; - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (!array_key_exists('authors', $this->_data)) { - return null; - } - return $this->_data['authors']; - } - - /** - * Get the entry content - * - * @return string - */ - public function getContent() - { - if (!array_key_exists('content', $this->_data)) { - return null; - } - return $this->_data['content']; - } - - /** - * Get the entry copyright information - * - * @return string - */ - public function getCopyright() - { - if (!array_key_exists('copyright', $this->_data)) { - return null; - } - return $this->_data['copyright']; - } - - /** - * Get the entry creation date - * - * @return string - */ - public function getDateCreated() - { - if (!array_key_exists('dateCreated', $this->_data)) { - return null; - } - return $this->_data['dateCreated']; - } - - /** - * Get the entry modification date - * - * @return string - */ - public function getDateModified() - { - if (!array_key_exists('dateModified', $this->_data)) { - return null; - } - return $this->_data['dateModified']; - } - - /** - * Get the entry description - * - * @return string - */ - public function getDescription() - { - if (!array_key_exists('description', $this->_data)) { - return null; - } - return $this->_data['description']; - } - - /** - * Get the entry ID - * - * @return string - */ - public function getId() - { - if (!array_key_exists('id', $this->_data)) { - return null; - } - return $this->_data['id']; - } - - /** - * Get a link to the HTML source - * - * @return string|null - */ - public function getLink() - { - if (!array_key_exists('link', $this->_data)) { - return null; - } - return $this->_data['link']; - } - - - /** - * Get all links - * - * @return array - */ - public function getLinks() - { - if (!array_key_exists('links', $this->_data)) { - return null; - } - return $this->_data['links']; - } - - /** - * Get the entry title - * - * @return string - */ - public function getTitle() - { - if (!array_key_exists('title', $this->_data)) { - return null; - } - return $this->_data['title']; - } - - /** - * Get the number of comments/replies for current entry - * - * @return integer - */ - public function getCommentCount() - { - if (!array_key_exists('commentCount', $this->_data)) { - return null; - } - return $this->_data['commentCount']; - } - - /** - * Returns a URI pointing to the HTML page where comments can be made on this entry - * - * @return string - */ - public function getCommentLink() - { - if (!array_key_exists('commentLink', $this->_data)) { - return null; - } - return $this->_data['commentLink']; - } - - /** - * Returns an array of URIs pointing to a feed of all comments for this entry - * where the array keys indicate the feed type (atom, rss or rdf). - * - * @return string - */ - public function getCommentFeedLinks() - { - if (!array_key_exists('commentFeedLinks', $this->_data)) { - return null; - } - return $this->_data['commentFeedLinks']; - } - - /** - * Add a entry category - * - * @param string $category - */ - public function addCategory(array $category) - { - if (!isset($category['term'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Each category must be an array and ' - . 'contain at least a "term" element containing the machine ' - . ' readable category name'); - } - if (isset($category['scheme'])) { - if (empty($category['scheme']) - || !is_string($category['scheme']) - || !Zend_Uri::check($category['scheme']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('The Atom scheme or RSS domain of' - . ' a category must be a valid URI'); - } - } - if (!isset($this->_data['categories'])) { - $this->_data['categories'] = array(); - } - $this->_data['categories'][] = $category; - } - - /** - * Set an array of entry categories - * - * @param array $categories - */ - public function addCategories(array $categories) - { - foreach ($categories as $category) { - $this->addCategory($category); - } - } - - /** - * Get the entry categories - * - * @return string|null - */ - public function getCategories() - { - if (!array_key_exists('categories', $this->_data)) { - return null; - } - return $this->_data['categories']; - } - - /** - * Adds an enclosure to the entry. The array parameter may contain the - * keys 'uri', 'type' and 'length'. Only 'uri' is required for Atom, though the - * others must also be provided or RSS rendering (where they are required) - * will throw an Exception. - * - * @param array $enclosures - */ - public function setEnclosure(array $enclosure) - { - if (!isset($enclosure['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Enclosure "uri" is not set'); - } - if (!Zend_Uri::check($enclosure['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Enclosure "uri" is not a valid URI/IRI'); - } - $this->_data['enclosure'] = $enclosure; - } - - /** - * Retrieve an array of all enclosures to be added to entry. - * - * @return array - */ - public function getEnclosure() - { - if (!array_key_exists('enclosure', $this->_data)) { - return null; - } - return $this->_data['enclosure']; - } - - /** - * Unset a specific data point - * - * @param string $name - */ - public function remove($name) - { - if (isset($this->_data[$name])) { - unset($this->_data[$name]); - } - } - - /** - * Get registered extensions - * - * @return array - */ - public function getExtensions() - { - return $this->_extensions; - } - - /** - * Return an Extension object with the matching name (postfixed with _Entry) - * - * @param string $name - * @return object - */ - public function getExtension($name) - { - if (array_key_exists($name . '_Entry', $this->_extensions)) { - return $this->_extensions[$name . '_Entry']; - } - return null; - } - - /** - * Set the current feed type being exported to "rss" or "atom". This allows - * other objects to gracefully choose whether to execute or not, depending - * on their appropriateness for the current type, e.g. renderers. - * - * @param string $type - */ - public function setType($type) - { - $this->_type = $type; - } - - /** - * Retrieve the current or last feed type exported. - * - * @return string Value will be "rss" or "atom" - */ - public function getType() - { - return $this->_type; - } - - /** - * Method overloading: call given method on first extension implementing it - * - * @param string $method - * @param array $args - * @return mixed - * @throws Zend_Feed_Exception if no extensions implements the method - */ - public function __call($method, $args) - { - foreach ($this->_extensions as $extension) { - try { - return call_user_func_array(array($extension, $method), $args); - } catch (Zend_Feed_Writer_Exception_InvalidMethodException $e) { - } - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Method: ' . $method - . ' does not exist and could not be located on a registered Extension'); - } - - /** - * Creates a new Zend_Feed_Writer_Source data container for use. This is NOT - * added to the current feed automatically, but is necessary to create a - * container with some initial values preset based on the current feed data. - * - * @return Zend_Feed_Writer_Source - */ - public function createSource() - { - $source = new Zend_Feed_Writer_Source; - if ($this->getEncoding()) { - $source->setEncoding($this->getEncoding()); - } - $source->setType($this->getType()); - return $source; - } - - /** - * Appends a Zend_Feed_Writer_Entry object representing a new entry/item - * the feed data container's internal group of entries. - * - * @param Zend_Feed_Writer_Source $source - */ - public function setSource(Zend_Feed_Writer_Source $source) - { - $this->_data['source'] = $source; - } - - /** - * @return Zend_Feed_Writer_Source - */ - public function getSource() - { - if (isset($this->_data['source'])) { - return $this->_data['source']; - } - return null; - } - - /** - * Load extensions from Zend_Feed_Writer - * - * @return void - */ - protected function _loadExtensions() - { - $all = Zend_Feed_Writer::getExtensions(); - $exts = $all['entry']; - foreach ($exts as $ext) { - $className = Zend_Feed_Writer::getPluginLoader()->getClassName($ext); - $this->_extensions[$ext] = new $className(); - $this->_extensions[$ext]->setEncoding($this->getEncoding()); - } - } -} diff --git a/library/Zend/Feed/Writer/Exception/InvalidMethodException.php b/library/Zend/Feed/Writer/Exception/InvalidMethodException.php deleted file mode 100644 index ffec8d1038..0000000000 --- a/library/Zend/Feed/Writer/Exception/InvalidMethodException.php +++ /dev/null @@ -1,41 +0,0 @@ -getType()) == 'atom') { - return; - } - $this->_setFeedLinks($this->_dom, $this->_base); - $this->_setHubs($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append namespaces to root element of feed - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:atom', - 'http://www.w3.org/2005/Atom'); - } - - /** - * Set feed link elements - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setFeedLinks(DOMDocument $dom, DOMElement $root) - { - $flinks = $this->getDataContainer()->getFeedLinks(); - if(!$flinks || empty($flinks)) { - return; - } - foreach ($flinks as $type => $href) { - $mime = 'application/' . strtolower($type) . '+xml'; - $flink = $dom->createElement('atom:link'); - $root->appendChild($flink); - $flink->setAttribute('rel', 'self'); - $flink->setAttribute('type', $mime); - $flink->setAttribute('href', $href); - } - $this->_called = true; - } - - /** - * Set PuSH hubs - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setHubs(DOMDocument $dom, DOMElement $root) - { - $hubs = $this->getDataContainer()->getHubs(); - if (!$hubs || empty($hubs)) { - return; - } - foreach ($hubs as $hubUrl) { - $hub = $dom->createElement('atom:link'); - $hub->setAttribute('rel', 'hub'); - $hub->setAttribute('href', $hubUrl); - $root->appendChild($hub); - } - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php b/library/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php deleted file mode 100644 index 53a7509669..0000000000 --- a/library/Zend/Feed/Writer/Extension/Content/Renderer/Entry.php +++ /dev/null @@ -1,92 +0,0 @@ -getType()) == 'atom') { - return; - } - $this->_setContent($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append namespaces to root element - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:content', - 'http://purl.org/rss/1.0/modules/content/'); - } - - /** - * Set entry content - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setContent(DOMDocument $dom, DOMElement $root) - { - $content = $this->getDataContainer()->getContent(); - if (!$content) { - return; - } - $element = $dom->createElement('content:encoded'); - $root->appendChild($element); - $cdata = $dom->createCDATASection($content); - $element->appendChild($cdata); - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php b/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php deleted file mode 100644 index c028314f7a..0000000000 --- a/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Entry.php +++ /dev/null @@ -1,96 +0,0 @@ -getType()) == 'atom') { - return; - } - $this->_setAuthors($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append namespaces to entry - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:dc', - 'http://purl.org/dc/elements/1.1/'); - } - - /** - * Set entry author elements - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->getDataContainer()->getAuthors(); - if (!$authors || empty($authors)) { - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('dc:creator'); - if (array_key_exists('name', $data)) { - $text = $dom->createTextNode($data['name']); - $author->appendChild($text); - $root->appendChild($author); - } - } - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php b/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php deleted file mode 100644 index ba60d2870c..0000000000 --- a/library/Zend/Feed/Writer/Extension/DublinCore/Renderer/Feed.php +++ /dev/null @@ -1,96 +0,0 @@ -getType()) == 'atom') { - return; - } - $this->_setAuthors($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append namespaces to feed element - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:dc', - 'http://purl.org/dc/elements/1.1/'); - } - - /** - * Set feed authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->getDataContainer()->getAuthors(); - if (!$authors || empty($authors)) { - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('dc:creator'); - if (array_key_exists('name', $data)) { - $text = $dom->createTextNode($data['name']); - $author->appendChild($text); - $root->appendChild($author); - } - } - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/ITunes/Entry.php b/library/Zend/Feed/Writer/Extension/ITunes/Entry.php deleted file mode 100644 index 63c0d97dc2..0000000000 --- a/library/Zend/Feed/Writer/Extension/ITunes/Entry.php +++ /dev/null @@ -1,242 +0,0 @@ -_encoding = $enc; - return $this; - } - - /** - * Get feed encoding - * - * @return string - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Set a block value of "yes" or "no". You may also set an empty string. - * - * @param string - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesBlock($value) - { - if (!ctype_alpha($value) && strlen($value) > 0) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "block" may only' - . ' contain alphabetic characters'); - } - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "block" may only' - . ' contain a maximum of 255 characters'); - } - $this->_data['block'] = $value; - } - - /** - * Add authors to itunes entry - * - * @param array $values - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function addItunesAuthors(array $values) - { - foreach ($values as $value) { - $this->addItunesAuthor($value); - } - return $this; - } - - /** - * Add author to itunes entry - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function addItunesAuthor($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "author" may only' - . ' contain a maximum of 255 characters each'); - } - if (!isset($this->_data['authors'])) { - $this->_data['authors'] = array(); - } - $this->_data['authors'][] = $value; - return $this; - } - - /** - * Set duration - * - * @param int $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesDuration($value) - { - $value = (string) $value; - if (!ctype_digit($value) - && !preg_match("/^\d+:[0-5]{1}[0-9]{1}$/", $value) - && !preg_match("/^\d+:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/", $value) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "duration" may only' - . ' be of a specified [[HH:]MM:]SS format'); - } - $this->_data['duration'] = $value; - return $this; - } - - /** - * Set "explicit" flag - * - * @param bool $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesExplicit($value) - { - if (!in_array($value, array('yes','no','clean'))) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "explicit" may only' - . ' be one of "yes", "no" or "clean"'); - } - $this->_data['explicit'] = $value; - return $this; - } - - /** - * Set keywords - * - * @param array $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesKeywords(array $value) - { - if (count($value) > 12) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "keywords" may only' - . ' contain a maximum of 12 terms'); - } - $concat = implode(',', $value); - if (iconv_strlen($concat, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "keywords" may only' - . ' have a concatenated length of 255 chars where terms are delimited' - . ' by a comma'); - } - $this->_data['keywords'] = $value; - return $this; - } - - /** - * Set subtitle - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesSubtitle($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "subtitle" may only' - . ' contain a maximum of 255 characters'); - } - $this->_data['subtitle'] = $value; - return $this; - } - - /** - * Set summary - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Entry - */ - public function setItunesSummary($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 4000) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "summary" may only' - . ' contain a maximum of 4000 characters'); - } - $this->_data['summary'] = $value; - return $this; - } - - /** - * Overloading to itunes specific setters - * - * @param string $method - * @param array $params - * @return mixed - */ - public function __call($method, array $params) - { - $point = Zend_Feed_Writer::lcfirst(substr($method, 9)); - if (!method_exists($this, 'setItunes' . ucfirst($point)) - && !method_exists($this, 'addItunes' . ucfirst($point)) - ) { - #require_once 'Zend/Feed/Writer/Exception/InvalidMethodException.php'; - throw new Zend_Feed_Writer_Exception_InvalidMethodException( - 'invalid method: ' . $method - ); - } - if (!array_key_exists($point, $this->_data) - || empty($this->_data[$point]) - ) { - return null; - } - return $this->_data[$point]; - } -} diff --git a/library/Zend/Feed/Writer/Extension/ITunes/Feed.php b/library/Zend/Feed/Writer/Extension/ITunes/Feed.php deleted file mode 100644 index d6bc3a5cb8..0000000000 --- a/library/Zend/Feed/Writer/Extension/ITunes/Feed.php +++ /dev/null @@ -1,361 +0,0 @@ -_encoding = $enc; - return $this; - } - - /** - * Get feed encoding - * - * @return string - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Set a block value of "yes" or "no". You may also set an empty string. - * - * @param string - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesBlock($value) - { - if (!ctype_alpha($value) && strlen($value) > 0) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "block" may only' - . ' contain alphabetic characters'); - } - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "block" may only' - . ' contain a maximum of 255 characters'); - } - $this->_data['block'] = $value; - return $this; - } - - /** - * Add feed authors - * - * @param array $values - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function addItunesAuthors(array $values) - { - foreach ($values as $value) { - $this->addItunesAuthor($value); - } - return $this; - } - - /** - * Add feed author - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function addItunesAuthor($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "author" may only' - . ' contain a maximum of 255 characters each'); - } - if (!isset($this->_data['authors'])) { - $this->_data['authors'] = array(); - } - $this->_data['authors'][] = $value; - return $this; - } - - /** - * Set feed categories - * - * @param array $values - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesCategories(array $values) - { - if (!isset($this->_data['categories'])) { - $this->_data['categories'] = array(); - } - foreach ($values as $key=>$value) { - if (!is_array($value)) { - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "category" may only' - . ' contain a maximum of 255 characters each'); - } - $this->_data['categories'][] = $value; - } else { - if (iconv_strlen($key, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "category" may only' - . ' contain a maximum of 255 characters each'); - } - $this->_data['categories'][$key] = array(); - foreach ($value as $val) { - if (iconv_strlen($val, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "category" may only' - . ' contain a maximum of 255 characters each'); - } - $this->_data['categories'][$key][] = $val; - } - } - } - return $this; - } - - /** - * Set feed image (icon) - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesImage($value) - { - if (!Zend_Uri::check($value)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "image" may only' - . ' be a valid URI/IRI'); - } - if (!in_array(substr($value, -3), array('jpg','png'))) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "image" may only' - . ' use file extension "jpg" or "png" which must be the last three' - . ' characters of the URI (i.e. no query string or fragment)'); - } - $this->_data['image'] = $value; - return $this; - } - - /** - * Set feed cumulative duration - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesDuration($value) - { - $value = (string) $value; - if (!ctype_digit($value) - && !preg_match("/^\d+:[0-5]{1}[0-9]{1}$/", $value) - && !preg_match("/^\d+:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/", $value) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "duration" may only' - . ' be of a specified [[HH:]MM:]SS format'); - } - $this->_data['duration'] = $value; - return $this; - } - - /** - * Set "explicit" flag - * - * @param string $value Valid values: "yes", "no" or "clean" - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesExplicit($value) - { - if (!in_array($value, array('yes','no','clean'))) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "explicit" may only' - . ' be one of "yes", "no" or "clean"'); - } - $this->_data['explicit'] = $value; - return $this; - } - - /** - * Set feed keywords - * - * @param array $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesKeywords(array $value) - { - if (count($value) > 12) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "keywords" may only' - . ' contain a maximum of 12 terms'); - } - $concat = implode(',', $value); - if (iconv_strlen($concat, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "keywords" may only' - . ' have a concatenated length of 255 chars where terms are delimited' - . ' by a comma'); - } - $this->_data['keywords'] = $value; - return $this; - } - - /** - * Set new feed URL - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesNewFeedUrl($value) - { - if (!Zend_Uri::check($value)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "newFeedUrl" may only' - . ' be a valid URI/IRI'); - } - $this->_data['newFeedUrl'] = $value; - return $this; - } - - /** - * Add feed owners - * - * @param array $values - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function addItunesOwners(array $values) - { - foreach ($values as $value) { - $this->addItunesOwner($value); - } - return $this; - } - - /** - * Add feed owner - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function addItunesOwner(array $value) - { - if (!isset($value['name']) || !isset($value['email'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "owner" must' - . ' be an array containing keys "name" and "email"'); - } - if (iconv_strlen($value['name'], $this->getEncoding()) > 255 - || iconv_strlen($value['email'], $this->getEncoding()) > 255 - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: any "owner" may only' - . ' contain a maximum of 255 characters each for "name" and "email"'); - } - if (!isset($this->_data['owners'])) { - $this->_data['owners'] = array(); - } - $this->_data['owners'][] = $value; - return $this; - } - - /** - * Set feed subtitle - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesSubtitle($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 255) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "subtitle" may only' - . ' contain a maximum of 255 characters'); - } - $this->_data['subtitle'] = $value; - return $this; - } - - /** - * Set feed summary - * - * @param string $value - * @return Zend_Feed_Writer_Extension_ITunes_Feed - */ - public function setItunesSummary($value) - { - if (iconv_strlen($value, $this->getEncoding()) > 4000) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('invalid parameter: "summary" may only' - . ' contain a maximum of 4000 characters'); - } - $this->_data['summary'] = $value; - return $this; - } - - /** - * Overloading: proxy to internal setters - * - * @param string $method - * @param array $params - * @return mixed - */ - public function __call($method, array $params) - { - $point = Zend_Feed_Writer::lcfirst(substr($method, 9)); - if (!method_exists($this, 'setItunes' . ucfirst($point)) - && !method_exists($this, 'addItunes' . ucfirst($point)) - ) { - #require_once 'Zend/Feed/Writer/Exception/InvalidMethodException.php'; - throw new Zend_Feed_Writer_Exception_InvalidMethodException( - 'invalid method: ' . $method - ); - } - if (!array_key_exists($point, $this->_data) || empty($this->_data[$point])) { - return null; - } - return $this->_data[$point]; - } -} diff --git a/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php b/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php deleted file mode 100644 index 861a21e54c..0000000000 --- a/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Entry.php +++ /dev/null @@ -1,216 +0,0 @@ -_setAuthors($this->_dom, $this->_base); - $this->_setBlock($this->_dom, $this->_base); - $this->_setDuration($this->_dom, $this->_base); - $this->_setExplicit($this->_dom, $this->_base); - $this->_setKeywords($this->_dom, $this->_base); - $this->_setSubtitle($this->_dom, $this->_base); - $this->_setSummary($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append namespaces to entry root - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:itunes', - 'http://www.itunes.com/dtds/podcast-1.0.dtd'); - } - - /** - * Set entry authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->getDataContainer()->getItunesAuthors(); - if (!$authors || empty($authors)) { - return; - } - foreach ($authors as $author) { - $el = $dom->createElement('itunes:author'); - $text = $dom->createTextNode($author); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - } - - /** - * Set itunes block - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setBlock(DOMDocument $dom, DOMElement $root) - { - $block = $this->getDataContainer()->getItunesBlock(); - if ($block === null) { - return; - } - $el = $dom->createElement('itunes:block'); - $text = $dom->createTextNode($block); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set entry duration - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDuration(DOMDocument $dom, DOMElement $root) - { - $duration = $this->getDataContainer()->getItunesDuration(); - if (!$duration) { - return; - } - $el = $dom->createElement('itunes:duration'); - $text = $dom->createTextNode($duration); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set explicit flag - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setExplicit(DOMDocument $dom, DOMElement $root) - { - $explicit = $this->getDataContainer()->getItunesExplicit(); - if ($explicit === null) { - return; - } - $el = $dom->createElement('itunes:explicit'); - $text = $dom->createTextNode($explicit); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set entry keywords - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setKeywords(DOMDocument $dom, DOMElement $root) - { - $keywords = $this->getDataContainer()->getItunesKeywords(); - if (!$keywords || empty($keywords)) { - return; - } - $el = $dom->createElement('itunes:keywords'); - $text = $dom->createTextNode(implode(',', $keywords)); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set entry subtitle - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setSubtitle(DOMDocument $dom, DOMElement $root) - { - $subtitle = $this->getDataContainer()->getItunesSubtitle(); - if (!$subtitle) { - return; - } - $el = $dom->createElement('itunes:subtitle'); - $text = $dom->createTextNode($subtitle); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set entry summary - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setSummary(DOMDocument $dom, DOMElement $root) - { - $summary = $this->getDataContainer()->getItunesSummary(); - if (!$summary) { - return; - } - $el = $dom->createElement('itunes:summary'); - $text = $dom->createTextNode($summary); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php b/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php deleted file mode 100644 index 39d71f1530..0000000000 --- a/library/Zend/Feed/Writer/Extension/ITunes/Renderer/Feed.php +++ /dev/null @@ -1,320 +0,0 @@ -_setAuthors($this->_dom, $this->_base); - $this->_setBlock($this->_dom, $this->_base); - $this->_setCategories($this->_dom, $this->_base); - $this->_setImage($this->_dom, $this->_base); - $this->_setDuration($this->_dom, $this->_base); - $this->_setExplicit($this->_dom, $this->_base); - $this->_setKeywords($this->_dom, $this->_base); - $this->_setNewFeedUrl($this->_dom, $this->_base); - $this->_setOwners($this->_dom, $this->_base); - $this->_setSubtitle($this->_dom, $this->_base); - $this->_setSummary($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append feed namespaces - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:itunes', - 'http://www.itunes.com/dtds/podcast-1.0.dtd'); - } - - /** - * Set feed authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->getDataContainer()->getItunesAuthors(); - if (!$authors || empty($authors)) { - return; - } - foreach ($authors as $author) { - $el = $dom->createElement('itunes:author'); - $text = $dom->createTextNode($author); - $el->appendChild($text); - $root->appendChild($el); - } - $this->_called = true; - } - - /** - * Set feed itunes block - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setBlock(DOMDocument $dom, DOMElement $root) - { - $block = $this->getDataContainer()->getItunesBlock(); - if ($block === null) { - return; - } - $el = $dom->createElement('itunes:block'); - $text = $dom->createTextNode($block); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed categories - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCategories(DOMDocument $dom, DOMElement $root) - { - $cats = $this->getDataContainer()->getItunesCategories(); - if (!$cats || empty($cats)) { - return; - } - foreach ($cats as $key=>$cat) { - if (!is_array($cat)) { - $el = $dom->createElement('itunes:category'); - $el->setAttribute('text', $cat); - $root->appendChild($el); - } else { - $el = $dom->createElement('itunes:category'); - $el->setAttribute('text', $key); - $root->appendChild($el); - foreach ($cat as $subcat) { - $el2 = $dom->createElement('itunes:category'); - $el2->setAttribute('text', $subcat); - $el->appendChild($el2); - } - } - } - $this->_called = true; - } - - /** - * Set feed image (icon) - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setImage(DOMDocument $dom, DOMElement $root) - { - $image = $this->getDataContainer()->getItunesImage(); - if (!$image) { - return; - } - $el = $dom->createElement('itunes:image'); - $el->setAttribute('href', $image); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed cumulative duration - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDuration(DOMDocument $dom, DOMElement $root) - { - $duration = $this->getDataContainer()->getItunesDuration(); - if (!$duration) { - return; - } - $el = $dom->createElement('itunes:duration'); - $text = $dom->createTextNode($duration); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set explicit flag - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setExplicit(DOMDocument $dom, DOMElement $root) - { - $explicit = $this->getDataContainer()->getItunesExplicit(); - if ($explicit === null) { - return; - } - $el = $dom->createElement('itunes:explicit'); - $text = $dom->createTextNode($explicit); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed keywords - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setKeywords(DOMDocument $dom, DOMElement $root) - { - $keywords = $this->getDataContainer()->getItunesKeywords(); - if (!$keywords || empty($keywords)) { - return; - } - $el = $dom->createElement('itunes:keywords'); - $text = $dom->createTextNode(implode(',', $keywords)); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed's new URL - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setNewFeedUrl(DOMDocument $dom, DOMElement $root) - { - $url = $this->getDataContainer()->getItunesNewFeedUrl(); - if (!$url) { - return; - } - $el = $dom->createElement('itunes:new-feed-url'); - $text = $dom->createTextNode($url); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed owners - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setOwners(DOMDocument $dom, DOMElement $root) - { - $owners = $this->getDataContainer()->getItunesOwners(); - if (!$owners || empty($owners)) { - return; - } - foreach ($owners as $owner) { - $el = $dom->createElement('itunes:owner'); - $name = $dom->createElement('itunes:name'); - $text = $dom->createTextNode($owner['name']); - $name->appendChild($text); - $email = $dom->createElement('itunes:email'); - $text = $dom->createTextNode($owner['email']); - $email->appendChild($text); - $root->appendChild($el); - $el->appendChild($name); - $el->appendChild($email); - } - $this->_called = true; - } - - /** - * Set feed subtitle - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setSubtitle(DOMDocument $dom, DOMElement $root) - { - $subtitle = $this->getDataContainer()->getItunesSubtitle(); - if (!$subtitle) { - return; - } - $el = $dom->createElement('itunes:subtitle'); - $text = $dom->createTextNode($subtitle); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } - - /** - * Set feed summary - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setSummary(DOMDocument $dom, DOMElement $root) - { - $summary = $this->getDataContainer()->getItunesSummary(); - if (!$summary) { - return; - } - $el = $dom->createElement('itunes:summary'); - $text = $dom->createTextNode($summary); - $el->appendChild($text); - $root->appendChild($el); - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/RendererAbstract.php b/library/Zend/Feed/Writer/Extension/RendererAbstract.php deleted file mode 100644 index 79da301aaf..0000000000 --- a/library/Zend/Feed/Writer/Extension/RendererAbstract.php +++ /dev/null @@ -1,180 +0,0 @@ -_container = $container; - } - - /** - * Set feed encoding - * - * @param string $enc - * @return Zend_Feed_Writer_Extension_RendererAbstract - */ - public function setEncoding($enc) - { - $this->_encoding = $enc; - return $this; - } - - /** - * Get feed encoding - * - * @return void - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Set DOMDocument and DOMElement on which to operate - * - * @param DOMDocument $dom - * @param DOMElement $base - * @return Zend_Feed_Writer_Extension_RendererAbstract - */ - public function setDomDocument(DOMDocument $dom, DOMElement $base) - { - $this->_dom = $dom; - $this->_base = $base; - return $this; - } - - /** - * Get data container being rendered - * - * @return mixed - */ - public function getDataContainer() - { - return $this->_container; - } - - /** - * Set feed type - * - * @param string $type - * @return Zend_Feed_Writer_Extension_RendererAbstract - */ - public function setType($type) - { - $this->_type = $type; - return $this; - } - - /** - * Get feedtype - * - * @return string - */ - public function getType() - { - return $this->_type; - } - - /** - * Set root element of document - * - * @param DOMElement $root - * @return Zend_Feed_Writer_Extension_RendererAbstract - */ - public function setRootElement(DOMElement $root) - { - $this->_rootElement = $root; - return $this; - } - - /** - * Get root element - * - * @return DOMElement - */ - public function getRootElement() - { - return $this->_rootElement; - } - - /** - * Append namespaces to feed - * - * @return void - */ - abstract protected function _appendNamespaces(); -} diff --git a/library/Zend/Feed/Writer/Extension/RendererInterface.php b/library/Zend/Feed/Writer/Extension/RendererInterface.php deleted file mode 100644 index 4c4e9ccbbb..0000000000 --- a/library/Zend/Feed/Writer/Extension/RendererInterface.php +++ /dev/null @@ -1,60 +0,0 @@ -getType()) == 'atom') { - return; // RSS 2.0 only - } - $this->_setCommentCount($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append entry namespaces - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:slash', - 'http://purl.org/rss/1.0/modules/slash/'); - } - - /** - * Set entry comment count - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentCount(DOMDocument $dom, DOMElement $root) - { - $count = $this->getDataContainer()->getCommentCount(); - if (!$count) { - return; - } - $tcount = $this->_dom->createElement('slash:comments'); - $tcount->nodeValue = $count; - $root->appendChild($tcount); - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php b/library/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php deleted file mode 100644 index 2f02601981..0000000000 --- a/library/Zend/Feed/Writer/Extension/Threading/Renderer/Entry.php +++ /dev/null @@ -1,145 +0,0 @@ -getType()) == 'rss') { - return; // Atom 1.0 only - } - $this->_setCommentLink($this->_dom, $this->_base); - $this->_setCommentFeedLinks($this->_dom, $this->_base); - $this->_setCommentCount($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append entry namespaces - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:thr', - 'http://purl.org/syndication/thread/1.0'); - } - - /** - * Set comment link - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentLink(DOMDocument $dom, DOMElement $root) - { - $link = $this->getDataContainer()->getCommentLink(); - if (!$link) { - return; - } - $clink = $this->_dom->createElement('link'); - $clink->setAttribute('rel', 'replies'); - $clink->setAttribute('type', 'text/html'); - $clink->setAttribute('href', $link); - $count = $this->getDataContainer()->getCommentCount(); - if ($count !== null) { - $clink->setAttribute('thr:count', $count); - } - $root->appendChild($clink); - $this->_called = true; - } - - /** - * Set comment feed links - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentFeedLinks(DOMDocument $dom, DOMElement $root) - { - $links = $this->getDataContainer()->getCommentFeedLinks(); - if (!$links || empty($links)) { - return; - } - foreach ($links as $link) { - $flink = $this->_dom->createElement('link'); - $flink->setAttribute('rel', 'replies'); - $flink->setAttribute('type', 'application/'. $link['type'] .'+xml'); - $flink->setAttribute('href', $link['uri']); - $count = $this->getDataContainer()->getCommentCount(); - if ($count !== null) { - $flink->setAttribute('thr:count', $count); - } - $root->appendChild($flink); - $this->_called = true; - } - } - - /** - * Set entry comment count - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentCount(DOMDocument $dom, DOMElement $root) - { - $count = $this->getDataContainer()->getCommentCount(); - if ($count === null) { - return; - } - $tcount = $this->_dom->createElement('thr:total'); - $tcount->nodeValue = $count; - $root->appendChild($tcount); - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php b/library/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php deleted file mode 100644 index ad82cc1e3f..0000000000 --- a/library/Zend/Feed/Writer/Extension/WellFormedWeb/Renderer/Entry.php +++ /dev/null @@ -1,96 +0,0 @@ -getType()) == 'atom') { - return; // RSS 2.0 only - } - $this->_setCommentFeedLinks($this->_dom, $this->_base); - if ($this->_called) { - $this->_appendNamespaces(); - } - } - - /** - * Append entry namespaces - * - * @return void - */ - protected function _appendNamespaces() - { - $this->getRootElement()->setAttribute('xmlns:wfw', - 'http://wellformedweb.org/CommentAPI/'); - } - - /** - * Set entry comment feed links - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentFeedLinks(DOMDocument $dom, DOMElement $root) - { - $links = $this->getDataContainer()->getCommentFeedLinks(); - if (!$links || empty($links)) { - return; - } - foreach ($links as $link) { - if ($link['type'] == 'rss') { - $flink = $this->_dom->createElement('wfw:commentRss'); - $text = $dom->createTextNode($link['uri']); - $flink->appendChild($text); - $root->appendChild($flink); - } - } - $this->_called = true; - } -} diff --git a/library/Zend/Feed/Writer/Feed.php b/library/Zend/Feed/Writer/Feed.php deleted file mode 100644 index a637394e75..0000000000 --- a/library/Zend/Feed/Writer/Feed.php +++ /dev/null @@ -1,282 +0,0 @@ -getEncoding()) { - $entry->setEncoding($this->getEncoding()); - } - $entry->setType($this->getType()); - return $entry; - } - - /** - * Appends a Zend_Feed_Writer_Deleted object representing a new entry tombstone - * to the feed data container's internal group of entries. - * - * @param Zend_Feed_Writer_Deleted $entry - */ - public function addTombstone(Zend_Feed_Writer_Deleted $deleted) - { - $this->_entries[] = $deleted; - } - - /** - * Creates a new Zend_Feed_Writer_Deleted data container for use. This is NOT - * added to the current feed automatically, but is necessary to create a - * container with some initial values preset based on the current feed data. - * - * @return Zend_Feed_Writer_Deleted - */ - public function createTombstone() - { - $deleted = new Zend_Feed_Writer_Deleted; - if ($this->getEncoding()) { - $deleted->setEncoding($this->getEncoding()); - } - $deleted->setType($this->getType()); - return $deleted; - } - - /** - * Appends a Zend_Feed_Writer_Entry object representing a new entry/item - * the feed data container's internal group of entries. - * - * @param Zend_Feed_Writer_Entry $entry - */ - public function addEntry(Zend_Feed_Writer_Entry $entry) - { - $this->_entries[] = $entry; - } - - /** - * Removes a specific indexed entry from the internal queue. Entries must be - * added to a feed container in order to be indexed. - * - * @param int $index - */ - public function removeEntry($index) - { - if (isset($this->_entries[$index])) { - unset($this->_entries[$index]); - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Undefined index: ' . $index . '. Entry does not exist.'); - } - - /** - * Retrieve a specific indexed entry from the internal queue. Entries must be - * added to a feed container in order to be indexed. - * - * @param int $index - */ - public function getEntry($index = 0) - { - if (isset($this->_entries[$index])) { - return $this->_entries[$index]; - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Undefined index: ' . $index . '. Entry does not exist.'); - } - - /** - * Orders all indexed entries by date, thus offering date ordered readable - * content where a parser (or Homo Sapien) ignores the generic rule that - * XML element order is irrelevant and has no intrinsic meaning. - * - * Using this method will alter the original indexation. - * - * @return void - */ - public function orderByDate() - { - /** - * Could do with some improvement for performance perhaps - */ - $timestamp = time(); - $entries = array(); - foreach ($this->_entries as $entry) { - if ($entry->getDateModified()) { - $timestamp = (int) $entry->getDateModified()->get(Zend_Date::TIMESTAMP); - } elseif ($entry->getDateCreated()) { - $timestamp = (int) $entry->getDateCreated()->get(Zend_Date::TIMESTAMP); - } - $entries[$timestamp] = $entry; - } - krsort($entries, SORT_NUMERIC); - $this->_entries = array_values($entries); - } - - /** - * Get the number of feed entries. - * Required by the Iterator interface. - * - * @return int - */ - public function count() - { - return count($this->_entries); - } - - /** - * Return the current entry - * - * @return Zend_Feed_Reader_Entry_Interface - */ - public function current() - { - return $this->_entries[$this->key()]; - } - - /** - * Return the current feed key - * - * @return unknown - */ - public function key() - { - return $this->_entriesKey; - } - - /** - * Move the feed pointer forward - * - * @return void - */ - public function next() - { - ++$this->_entriesKey; - } - - /** - * Reset the pointer in the feed object - * - * @return void - */ - public function rewind() - { - $this->_entriesKey = 0; - } - - /** - * Check to see if the iterator is still valid - * - * @return boolean - */ - public function valid() - { - return 0 <= $this->_entriesKey && $this->_entriesKey < $this->count(); - } - - /** - * Attempt to build and return the feed resulting from the data set - * - * @param string $type The feed type "rss" or "atom" to export as - * @param bool $ignoreExceptions - * @return string - */ - public function export($type, $ignoreExceptions = false) - { - $this->setType(strtolower($type)); - $type = ucfirst($this->getType()); - if ($type !== 'Rss' && $type !== 'Atom') { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid feed type specified: ' . $type . '.' - . ' Should be one of "rss" or "atom".'); - } - $renderClass = 'Zend_Feed_Writer_Renderer_Feed_' . $type; - $renderer = new $renderClass($this); - if ($ignoreExceptions) { - $renderer->ignoreExceptions(); - } - return $renderer->render()->saveXml(); - } - -} diff --git a/library/Zend/Feed/Writer/Feed/FeedAbstract.php b/library/Zend/Feed/Writer/Feed/FeedAbstract.php deleted file mode 100644 index e4a2551cfe..0000000000 --- a/library/Zend/Feed/Writer/Feed/FeedAbstract.php +++ /dev/null @@ -1,872 +0,0 @@ -_loadExtensions(); - } - - /** - * Set a single author - * - * @param int $index - * @return string|null - */ - public function addAuthor($name, $email = null, $uri = null) - { - $author = array(); - if (is_array($name)) { - if (!array_key_exists('name', $name) || empty($name['name']) || !is_string($name['name'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: author array must include a "name" key with a non-empty string value'); - } - $author['name'] = $name['name']; - if (isset($name['email'])) { - if (empty($name['email']) || !is_string($name['email'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "email" array value must be a non-empty string'); - } - $author['email'] = $name['email']; - } - if (isset($name['uri'])) { - if (empty($name['uri']) || !is_string($name['uri']) || !Zend_Uri::check($name['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" array value must be a non-empty string and valid URI/IRI'); - } - $author['uri'] = $name['uri']; - } - } else { - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "name" must be a non-empty string value'); - } - $author['name'] = $name; - if (isset($email)) { - if (empty($email) || !is_string($email)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "email" value must be a non-empty string'); - } - $author['email'] = $email; - } - if (isset($uri)) { - if (empty($uri) || !is_string($uri) || !Zend_Uri::check($uri)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" value must be a non-empty string and valid URI/IRI'); - } - $author['uri'] = $uri; - } - } - $this->_data['authors'][] = $author; - } - - /** - * Set an array with feed authors - * - * @return array - */ - public function addAuthors(array $authors) - { - foreach($authors as $author) { - $this->addAuthor($author); - } - } - - /** - * Set the copyright entry - * - * @return string|null - */ - public function setCopyright($copyright) - { - if (empty($copyright) || !is_string($copyright)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['copyright'] = $copyright; - } - - /** - * Set the feed creation date - * - * @param null|integer|Zend_Date - */ - public function setDateCreated($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['dateCreated'] = $zdate; - } - - /** - * Set the feed modification date - * - * @param null|integer|Zend_Date - */ - public function setDateModified($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['dateModified'] = $zdate; - } - - /** - * Set the feed last-build date. Ignored for Atom 1.0. - * - * @param null|integer|Zend_Date - */ - public function setLastBuildDate($date = null) - { - $zdate = null; - if ($date === null) { - $zdate = new Zend_Date; - } elseif ($date instanceof Zend_Date) { - $zdate = $date; - } elseif (ctype_digit((string)$date)) { - $zdate = new Zend_Date($date, Zend_Date::TIMESTAMP); - } else { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid Zend_Date object or UNIX Timestamp passed as parameter'); - } - $this->_data['lastBuildDate'] = $zdate; - } - - /** - * Set the feed description - * - * @return string|null - */ - public function setDescription($description) - { - if (empty($description) || !is_string($description)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['description'] = $description; - } - - /** - * Set the feed generator entry - * - * @return string|null - */ - public function setGenerator($name, $version = null, $uri = null) - { - if (is_array($name)) { - $data = $name; - if (empty($data['name']) || !is_string($data['name'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "name" must be a non-empty string'); - } - $generator = array('name' => $data['name']); - if (isset($data['version'])) { - if (empty($data['version']) || !is_string($data['version'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "version" must be a non-empty string'); - } - $generator['version'] = $data['version']; - } - if (isset($data['uri'])) { - if (empty($data['uri']) || !is_string($data['uri']) || !Zend_Uri::check($data['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI'); - } - $generator['uri'] = $data['uri']; - } - } else { - if (empty($name) || !is_string($name)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "name" must be a non-empty string'); - } - $generator = array('name' => $name); - if (isset($version)) { - if (empty($version) || !is_string($version)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "version" must be a non-empty string'); - } - $generator['version'] = $version; - } - if (isset($uri)) { - if (empty($uri) || !is_string($uri) || !Zend_Uri::check($uri)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "uri" must be a non-empty string and a valid URI/IRI'); - } - $generator['uri'] = $uri; - } - } - $this->_data['generator'] = $generator; - } - - /** - * Set the feed ID - URI or URN (via PCRE pattern) supported - * - * @param string $id - */ - public function setId($id) - { - if ((empty($id) || !is_string($id) || !Zend_Uri::check($id)) && - !preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", $id) - && !$this->_validateTagUri($id)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); - } - $this->_data['id'] = $id; - } - - /** - * Validate a URI using the tag scheme (RFC 4151) - * - * @param string $id - * @return bool - */ - protected function _validateTagUri($id) - { - if (preg_match('/^tag:(?.*),(?\d{4}-?\d{0,2}-?\d{0,2}):(?.*)(.*:)*$/', $id, $matches)) { - $dvalid = false; - $nvalid = false; - $date = $matches['date']; - $d6 = strtotime($date); - if ((strlen($date) == 4) && $date <= date('Y')) { - $dvalid = true; - } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) { - $dvalid = true; - } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) { - $dvalid = true; - } - $validator = new Zend_Validate_EmailAddress; - if ($validator->isValid($matches['name'])) { - $nvalid = true; - } else { - $nvalid = $validator->isValid('info@' . $matches['name']); - } - return $dvalid && $nvalid; - - } - return false; - } - - /** - * Set a feed image (URI at minimum). Parameter is a single array with the - * required key 'uri'. When rendering as RSS, the required keys are 'uri', - * 'title' and 'link'. RSS also specifies three optional parameters 'width', - * 'height' and 'description'. Only 'uri' is required and used for Atom rendering. - * - * @param array $data - */ - public function setImage(array $data) - { - if (empty($data['uri']) || !is_string($data['uri']) - || !Zend_Uri::check($data['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter \'uri\'' - . ' must be a non-empty string and valid URI/IRI'); - } - $this->_data['image'] = $data; - } - - /** - * Set a feed icon (URI at minimum). Parameter is a single array with the - * required key 'uri'. Only 'uri' is required and used for Atom rendering. - * RSS does not support an Icon tag except via Atom 1.0 as an extension. - * - * @param array $data - */ - public function setIcon(array $data) - { - if (empty($data['uri']) || !is_string($data['uri']) - || !Zend_Uri::check($data['uri'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter \'uri\'' - . ' must be a non-empty string and valid URI/IRI'); - } - $this->_data['icon'] = $data; - } - - /** - * Set the feed language - * - * @return string|null - */ - public function setLanguage($language) - { - if (empty($language) || !is_string($language)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['language'] = $language; - } - - /** - * Set a link to the HTML source - * - * @param string $link - */ - public function setLink($link) - { - if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string and valid URI/IRI'); - } - $this->_data['link'] = $link; - } - - /** - * Set a link to an XML feed for any feed type/version - * - * @return string|null - */ - public function setFeedLink($link, $type) - { - if (empty($link) || !is_string($link) || !Zend_Uri::check($link)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "link"" must be a non-empty string and valid URI/IRI'); - } - if (!in_array(strtolower($type), array('rss', 'rdf', 'atom'))) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "type"; You must declare the type of feed the link points to, i.e. RSS, RDF or Atom'); - } - $this->_data['feedLinks'][strtolower($type)] = $link; - } - - /** - * Set the feed title - * - * @return string|null - */ - public function setTitle($title) - { - if (empty($title) || !is_string($title)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['title'] = $title; - } - - /** - * Set the feed character encoding - * - * @param string $encoding - */ - public function setEncoding($encoding) - { - if (empty($encoding) || !is_string($encoding)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: parameter must be a non-empty string'); - } - $this->_data['encoding'] = $encoding; - } - - /** - * Set the feed's base URL - * - * @param string $url - */ - public function setBaseUrl($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "url" array value' - . ' must be a non-empty string and valid URI/IRI'); - } - $this->_data['baseUrl'] = $url; - } - - /** - * Add a Pubsubhubbub hub endpoint URL - * - * @param string $url - */ - public function addHub($url) - { - if (empty($url) || !is_string($url) || !Zend_Uri::check($url)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: "url" array value' - . ' must be a non-empty string and valid URI/IRI'); - } - if (!isset($this->_data['hubs'])) { - $this->_data['hubs'] = array(); - } - $this->_data['hubs'][] = $url; - } - - /** - * Add Pubsubhubbub hub endpoint URLs - * - * @param array $urls - */ - public function addHubs(array $urls) - { - foreach ($urls as $url) { - $this->addHub($url); - } - } - - /** - * Add a feed category - * - * @param string $category - */ - public function addCategory(array $category) - { - if (!isset($category['term'])) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Each category must be an array and ' - . 'contain at least a "term" element containing the machine ' - . ' readable category name'); - } - if (isset($category['scheme'])) { - if (empty($category['scheme']) - || !is_string($category['scheme']) - || !Zend_Uri::check($category['scheme']) - ) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('The Atom scheme or RSS domain of' - . ' a category must be a valid URI'); - } - } - if (!isset($this->_data['categories'])) { - $this->_data['categories'] = array(); - } - $this->_data['categories'][] = $category; - } - - /** - * Set an array of feed categories - * - * @param array $categories - */ - public function addCategories(array $categories) - { - foreach ($categories as $category) { - $this->addCategory($category); - } - } - - /** - * Get a single author - * - * @param int $index - * @return string|null - */ - public function getAuthor($index = 0) - { - if (isset($this->_data['authors'][$index])) { - return $this->_data['authors'][$index]; - } else { - return null; - } - } - - /** - * Get an array with feed authors - * - * @return array - */ - public function getAuthors() - { - if (!array_key_exists('authors', $this->_data)) { - return null; - } - return $this->_data['authors']; - } - - /** - * Get the copyright entry - * - * @return string|null - */ - public function getCopyright() - { - if (!array_key_exists('copyright', $this->_data)) { - return null; - } - return $this->_data['copyright']; - } - - /** - * Get the feed creation date - * - * @return string|null - */ - public function getDateCreated() - { - if (!array_key_exists('dateCreated', $this->_data)) { - return null; - } - return $this->_data['dateCreated']; - } - - /** - * Get the feed modification date - * - * @return string|null - */ - public function getDateModified() - { - if (!array_key_exists('dateModified', $this->_data)) { - return null; - } - return $this->_data['dateModified']; - } - - /** - * Get the feed last-build date - * - * @return string|null - */ - public function getLastBuildDate() - { - if (!array_key_exists('lastBuildDate', $this->_data)) { - return null; - } - return $this->_data['lastBuildDate']; - } - - /** - * Get the feed description - * - * @return string|null - */ - public function getDescription() - { - if (!array_key_exists('description', $this->_data)) { - return null; - } - return $this->_data['description']; - } - - /** - * Get the feed generator entry - * - * @return string|null - */ - public function getGenerator() - { - if (!array_key_exists('generator', $this->_data)) { - return null; - } - return $this->_data['generator']; - } - - /** - * Get the feed ID - * - * @return string|null - */ - public function getId() - { - if (!array_key_exists('id', $this->_data)) { - return null; - } - return $this->_data['id']; - } - - /** - * Get the feed image URI - * - * @return array - */ - public function getImage() - { - if (!array_key_exists('image', $this->_data)) { - return null; - } - return $this->_data['image']; - } - - /** - * Get the feed icon URI - * - * @return array - */ - public function getIcon() - { - if (!array_key_exists('icon', $this->_data)) { - return null; - } - return $this->_data['icon']; - } - - /** - * Get the feed language - * - * @return string|null - */ - public function getLanguage() - { - if (!array_key_exists('language', $this->_data)) { - return null; - } - return $this->_data['language']; - } - - /** - * Get a link to the HTML source - * - * @return string|null - */ - public function getLink() - { - if (!array_key_exists('link', $this->_data)) { - return null; - } - return $this->_data['link']; - } - - /** - * Get a link to the XML feed - * - * @return string|null - */ - public function getFeedLinks() - { - if (!array_key_exists('feedLinks', $this->_data)) { - return null; - } - return $this->_data['feedLinks']; - } - - /** - * Get the feed title - * - * @return string|null - */ - public function getTitle() - { - if (!array_key_exists('title', $this->_data)) { - return null; - } - return $this->_data['title']; - } - - /** - * Get the feed character encoding - * - * @return string|null - */ - public function getEncoding() - { - if (!array_key_exists('encoding', $this->_data)) { - return 'UTF-8'; - } - return $this->_data['encoding']; - } - - /** - * Get the feed's base url - * - * @return string|null - */ - public function getBaseUrl() - { - if (!array_key_exists('baseUrl', $this->_data)) { - return null; - } - return $this->_data['baseUrl']; - } - - /** - * Get the URLs used as Pubsubhubbub hubs endpoints - * - * @return string|null - */ - public function getHubs() - { - if (!array_key_exists('hubs', $this->_data)) { - return null; - } - return $this->_data['hubs']; - } - - /** - * Get the feed categories - * - * @return string|null - */ - public function getCategories() - { - if (!array_key_exists('categories', $this->_data)) { - return null; - } - return $this->_data['categories']; - } - - /** - * Resets the instance and deletes all data - * - * @return void - */ - public function reset() - { - $this->_data = array(); - } - - /** - * Set the current feed type being exported to "rss" or "atom". This allows - * other objects to gracefully choose whether to execute or not, depending - * on their appropriateness for the current type, e.g. renderers. - * - * @param string $type - */ - public function setType($type) - { - $this->_type = $type; - } - - /** - * Retrieve the current or last feed type exported. - * - * @return string Value will be "rss" or "atom" - */ - public function getType() - { - return $this->_type; - } - - /** - * Unset a specific data point - * - * @param string $name - */ - public function remove($name) - { - if (isset($this->_data[$name])) { - unset($this->_data[$name]); - } - } - - /** - * Method overloading: call given method on first extension implementing it - * - * @param string $method - * @param array $args - * @return mixed - * @throws Zend_Feed_Exception if no extensions implements the method - */ - public function __call($method, $args) - { - foreach ($this->_extensions as $extension) { - try { - return call_user_func_array(array($extension, $method), $args); - } catch (Zend_Feed_Writer_Exception_InvalidMethodException $e) { - } - } - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Method: ' . $method - . ' does not exist and could not be located on a registered Extension'); - } - - /** - * Load extensions from Zend_Feed_Writer - * - * @return void - */ - protected function _loadExtensions() - { - $all = Zend_Feed_Writer::getExtensions(); - $exts = $all['feed']; - foreach ($exts as $ext) { - $className = Zend_Feed_Writer::getPluginLoader()->getClassName($ext); - $this->_extensions[$ext] = new $className(); - $this->_extensions[$ext]->setEncoding($this->getEncoding()); - } - } -} diff --git a/library/Zend/Feed/Writer/Renderer/Entry/Atom.php b/library/Zend/Feed/Writer/Renderer/Entry/Atom.php deleted file mode 100644 index ee4ce524e0..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Entry/Atom.php +++ /dev/null @@ -1,448 +0,0 @@ -_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $entry = $this->_dom->createElementNS(Zend_Feed_Writer::NAMESPACE_ATOM_10, 'entry'); - $this->_dom->appendChild($entry); - - $this->_setSource($this->_dom, $entry); - $this->_setTitle($this->_dom, $entry); - $this->_setDescription($this->_dom, $entry); - $this->_setDateCreated($this->_dom, $entry); - $this->_setDateModified($this->_dom, $entry); - $this->_setLink($this->_dom, $entry); - $this->_setId($this->_dom, $entry); - $this->_setAuthors($this->_dom, $entry); - $this->_setEnclosure($this->_dom, $entry); - $this->_setContent($this->_dom, $entry); - $this->_setCategories($this->_dom, $entry); - - foreach ($this->_extensions as $ext) { - $ext->setType($this->getType()); - $ext->setRootElement($this->getRootElement()); - $ext->setDomDocument($this->getDomDocument(), $entry); - $ext->render(); - } - - return $this; - } - - /** - * Set entry title - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setTitle(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getTitle()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 entry elements MUST contain exactly one' - . ' atom:title element but a title has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $title = $dom->createElement('title'); - $root->appendChild($title); - $title->setAttribute('type', 'html'); - $cdata = $dom->createCDATASection($this->getDataContainer()->getTitle()); - $title->appendChild($cdata); - } - - /** - * Set entry description - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDescription(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDescription()) { - return; // unless src content or base64 - } - $subtitle = $dom->createElement('summary'); - $root->appendChild($subtitle); - $subtitle->setAttribute('type', 'html'); - $cdata = $dom->createCDATASection( - $this->getDataContainer()->getDescription() - ); - $subtitle->appendChild($cdata); - } - - /** - * Set date entry was modified - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateModified(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateModified()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 entry elements MUST contain exactly one' - . ' atom:updated element but a modification date has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - $updated = $dom->createElement('updated'); - $root->appendChild($updated); - $text = $dom->createTextNode( - $this->getDataContainer()->getDateModified()->get(Zend_Date::ISO_8601) - ); - $updated->appendChild($text); - } - - /** - * Set date entry was created - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateCreated(DOMDocument $dom, DOMElement $root) - { - if (!$this->getDataContainer()->getDateCreated()) { - return; - } - $el = $dom->createElement('published'); - $root->appendChild($el); - $text = $dom->createTextNode( - $this->getDataContainer()->getDateCreated()->get(Zend_Date::ISO_8601) - ); - $el->appendChild($text); - } - - /** - * Set entry authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->_container->getAuthors(); - if ((!$authors || empty($authors))) { - /** - * This will actually trigger an Exception at the feed level if - * a feed level author is not set. - */ - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('author'); - $name = $this->_dom->createElement('name'); - $author->appendChild($name); - $root->appendChild($author); - $text = $dom->createTextNode($data['name']); - $name->appendChild($text); - if (array_key_exists('email', $data)) { - $email = $this->_dom->createElement('email'); - $author->appendChild($email); - $text = $dom->createTextNode($data['email']); - $email->appendChild($text); - } - if (array_key_exists('uri', $data)) { - $uri = $this->_dom->createElement('uri'); - $author->appendChild($uri); - $text = $dom->createTextNode($data['uri']); - $uri->appendChild($text); - } - } - } - - /** - * Set entry enclosure - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setEnclosure(DOMDocument $dom, DOMElement $root) - { - $data = $this->_container->getEnclosure(); - if ((!$data || empty($data))) { - return; - } - $enclosure = $this->_dom->createElement('link'); - $enclosure->setAttribute('rel', 'enclosure'); - if (isset($data['type'])) { - $enclosure->setAttribute('type', $data['type']); - } - if (isset($data['length'])) { - $enclosure->setAttribute('length', $data['length']); - } - $enclosure->setAttribute('href', $data['uri']); - $root->appendChild($enclosure); - } - - protected function _setLink(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getLink()) { - return; - } - $link = $dom->createElement('link'); - $root->appendChild($link); - $link->setAttribute('rel', 'alternate'); - $link->setAttribute('type', 'text/html'); - $link->setAttribute('href', $this->getDataContainer()->getLink()); - } - - /** - * Set entry identifier - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setId(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getId() - && !$this->getDataContainer()->getLink()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 entry elements MUST contain exactly one ' - . 'atom:id element, or as an alternative, we can use the same ' - . 'value as atom:link however neither a suitable link nor an ' - . 'id have been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - if (!$this->getDataContainer()->getId()) { - $this->getDataContainer()->setId( - $this->getDataContainer()->getLink()); - } - if (!Zend_Uri::check($this->getDataContainer()->getId()) && - !preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", - $this->getDataContainer()->getId() - ) && !$this->_validateTagUri($this->getDataContainer()->getId())) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Atom 1.0 IDs must be a valid URI/IRI'); - } - $id = $dom->createElement('id'); - $root->appendChild($id); - $text = $dom->createTextNode($this->getDataContainer()->getId()); - $id->appendChild($text); - } - - /** - * Validate a URI using the tag scheme (RFC 4151) - * - * @param string $id - * @return bool - */ - protected function _validateTagUri($id) - { - if (preg_match('/^tag:(?.*),(?\d{4}-?\d{0,2}-?\d{0,2}):(?.*)(.*:)*$/', $id, $matches)) { - $dvalid = false; - $nvalid = false; - $date = $matches['date']; - $d6 = strtotime($date); - if ((strlen($date) == 4) && $date <= date('Y')) { - $dvalid = true; - } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) { - $dvalid = true; - } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) { - $dvalid = true; - } - $validator = new Zend_Validate_EmailAddress; - if ($validator->isValid($matches['name'])) { - $nvalid = true; - } else { - $nvalid = $validator->isValid('info@' . $matches['name']); - } - return $dvalid && $nvalid; - - } - return false; - } - - /** - * Set entry content - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setContent(DOMDocument $dom, DOMElement $root) - { - $content = $this->getDataContainer()->getContent(); - if (!$content && !$this->getDataContainer()->getLink()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 entry elements MUST contain exactly one ' - . 'atom:content element, or as an alternative, at least one link ' - . 'with a rel attribute of "alternate" to indicate an alternate ' - . 'method to consume the content.'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - if (!$content) { - return; - } - $element = $dom->createElement('content'); - $element->setAttribute('type', 'xhtml'); - $xhtmlElement = $this->_loadXhtml($content); - $xhtml = $dom->importNode($xhtmlElement, true); - $element->appendChild($xhtml); - $root->appendChild($element); - } - - /** - * Load a HTML string and attempt to normalise to XML - */ - protected function _loadXhtml($content) - { - $xhtml = ''; - if (class_exists('tidy', false)) { - $tidy = new tidy; - $config = array( - 'output-xhtml' => true, - 'show-body-only' => true, - 'quote-nbsp' => false - ); - $encoding = str_replace('-', '', $this->getEncoding()); - $tidy->parseString($content, $config, $encoding); - $tidy->cleanRepair(); - $xhtml = (string) $tidy; - } else { - $xhtml = $content; - } - $xhtml = preg_replace(array( - "/(<[\/]?)([a-zA-Z]+)/" - ), '$1xhtml:$2', $xhtml); - $dom = new DOMDocument('1.0', $this->getEncoding()); - - $dom = Zend_Xml_Security::scan('' - . $xhtml . '', $dom); - return $dom->documentElement; - } - - /** - * Set entry cateories - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCategories(DOMDocument $dom, DOMElement $root) - { - $categories = $this->getDataContainer()->getCategories(); - if (!$categories) { - return; - } - foreach ($categories as $cat) { - $category = $dom->createElement('category'); - $category->setAttribute('term', $cat['term']); - if (isset($cat['label'])) { - $category->setAttribute('label', $cat['label']); - } else { - $category->setAttribute('label', $cat['term']); - } - if (isset($cat['scheme'])) { - $category->setAttribute('scheme', $cat['scheme']); - } - $root->appendChild($category); - } - } - - /** - * Append Source element (Atom 1.0 Feed Metadata) - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setSource(DOMDocument $dom, DOMElement $root) - { - $source = $this->getDataContainer()->getSource(); - if (!$source) { - return; - } - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom_Source($source); - $renderer->setType($this->getType()); - $element = $renderer->render()->getElement(); - $imported = $dom->importNode($element, true); - $root->appendChild($imported); - } -} diff --git a/library/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php b/library/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php deleted file mode 100644 index 98ff5bd6b7..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Entry/Atom/Deleted.php +++ /dev/null @@ -1,121 +0,0 @@ -_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $entry = $this->_dom->createElement('at:deleted-entry'); - $this->_dom->appendChild($entry); - - $entry->setAttribute('ref', $this->_container->getReference()); - $entry->setAttribute('when', $this->_container->getWhen()->get(Zend_Date::ISO_8601)); - - $this->_setBy($this->_dom, $entry); - $this->_setComment($this->_dom, $entry); - - return $this; - } - - /** - * Set tombstone comment - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setComment(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getComment()) { - return; - } - $c = $dom->createElement('at:comment'); - $root->appendChild($c); - $c->setAttribute('type', 'html'); - $cdata = $dom->createCDATASection($this->getDataContainer()->getComment()); - $c->appendChild($cdata); - } - - /** - * Set entry authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setBy(DOMDocument $dom, DOMElement $root) - { - $data = $this->_container->getBy(); - if ((!$data || empty($data))) { - return; - } - $author = $this->_dom->createElement('at:by'); - $name = $this->_dom->createElement('name'); - $author->appendChild($name); - $root->appendChild($author); - $text = $dom->createTextNode($data['name']); - $name->appendChild($text); - if (array_key_exists('email', $data)) { - $email = $this->_dom->createElement('email'); - $author->appendChild($email); - $text = $dom->createTextNode($data['email']); - $email->appendChild($text); - } - if (array_key_exists('uri', $data)) { - $uri = $this->_dom->createElement('uri'); - $author->appendChild($uri); - $text = $dom->createTextNode($data['uri']); - $uri->appendChild($text); - } - } - -} diff --git a/library/Zend/Feed/Writer/Renderer/Entry/Rss.php b/library/Zend/Feed/Writer/Renderer/Entry/Rss.php deleted file mode 100644 index cd03ced56d..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Entry/Rss.php +++ /dev/null @@ -1,346 +0,0 @@ -_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $this->_dom->substituteEntities = false; - $entry = $this->_dom->createElement('item'); - $this->_dom->appendChild($entry); - - $this->_setTitle($this->_dom, $entry); - $this->_setDescription($this->_dom, $entry); - $this->_setDateCreated($this->_dom, $entry); - $this->_setDateModified($this->_dom, $entry); - $this->_setLink($this->_dom, $entry); - $this->_setId($this->_dom, $entry); - $this->_setAuthors($this->_dom, $entry); - $this->_setEnclosure($this->_dom, $entry); - $this->_setCommentLink($this->_dom, $entry); - $this->_setCategories($this->_dom, $entry); - foreach ($this->_extensions as $ext) { - $ext->setType($this->getType()); - $ext->setRootElement($this->getRootElement()); - $ext->setDomDocument($this->getDomDocument(), $entry); - $ext->render(); - } - - return $this; - } - - /** - * Set entry title - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setTitle(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDescription() - && !$this->getDataContainer()->getTitle()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 entry elements SHOULD contain exactly one' - . ' title element but a title has not been set. In addition, there' - . ' is no description as required in the absence of a title.'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $title = $dom->createElement('title'); - $root->appendChild($title); - $text = $dom->createTextNode($this->getDataContainer()->getTitle()); - $title->appendChild($text); - } - - /** - * Set entry description - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDescription(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDescription() - && !$this->getDataContainer()->getTitle()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 entry elements SHOULD contain exactly one' - . ' description element but a description has not been set. In' - . ' addition, there is no title element as required in the absence' - . ' of a description.'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - if (!$this->getDataContainer()->getDescription()) { - return; - } - $subtitle = $dom->createElement('description'); - $root->appendChild($subtitle); - $text = $dom->createCDATASection($this->getDataContainer()->getDescription()); - $subtitle->appendChild($text); - } - - /** - * Set date entry was last modified - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateModified(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateModified()) { - return; - } - - $updated = $dom->createElement('pubDate'); - $root->appendChild($updated); - $text = $dom->createTextNode( - $this->getDataContainer()->getDateModified()->get(Zend_Date::RSS) - ); - $updated->appendChild($text); - } - - /** - * Set date entry was created - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateCreated(DOMDocument $dom, DOMElement $root) - { - if (!$this->getDataContainer()->getDateCreated()) { - return; - } - if (!$this->getDataContainer()->getDateModified()) { - $this->getDataContainer()->setDateModified( - $this->getDataContainer()->getDateCreated() - ); - } - } - - /** - * Set entry authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->_container->getAuthors(); - if ((!$authors || empty($authors))) { - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('author'); - $name = $data['name']; - if (array_key_exists('email', $data)) { - $name = $data['email'] . ' (' . $data['name'] . ')'; - } - $text = $dom->createTextNode($name); - $author->appendChild($text); - $root->appendChild($author); - } - } - - /** - * Set entry enclosure - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setEnclosure(DOMDocument $dom, DOMElement $root) - { - $data = $this->_container->getEnclosure(); - if ((!$data || empty($data))) { - return; - } - if (!isset($data['type'])) { - #require_once 'Zend/Feed/Exception.php'; - $exception = new Zend_Feed_Exception('Enclosure "type" is not set'); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - if (!isset($data['length'])) { - #require_once 'Zend/Feed/Exception.php'; - $exception = new Zend_Feed_Exception('Enclosure "length" is not set'); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - if (isset($data['length']) && (int) $data['length'] <= 0) { - #require_once 'Zend/Feed/Exception.php'; - $exception = new Zend_Feed_Exception('Enclosure "length" must be an integer' - . ' indicating the content\'s length in bytes'); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $enclosure = $this->_dom->createElement('enclosure'); - $enclosure->setAttribute('type', $data['type']); - $enclosure->setAttribute('length', $data['length']); - $enclosure->setAttribute('url', $data['uri']); - $root->appendChild($enclosure); - } - - /** - * Set link to entry - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setLink(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getLink()) { - return; - } - $link = $dom->createElement('link'); - $root->appendChild($link); - $text = $dom->createTextNode($this->getDataContainer()->getLink()); - $link->appendChild($text); - } - - /** - * Set entry identifier - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setId(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getId() - && !$this->getDataContainer()->getLink()) { - return; - } - - $id = $dom->createElement('guid'); - $root->appendChild($id); - if (!$this->getDataContainer()->getId()) { - $this->getDataContainer()->setId( - $this->getDataContainer()->getLink()); - } - $text = $dom->createTextNode($this->getDataContainer()->getId()); - $id->appendChild($text); - if (!Zend_Uri::check($this->getDataContainer()->getId())) { - $id->setAttribute('isPermaLink', 'false'); - } - } - - /** - * Set link to entry comments - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCommentLink(DOMDocument $dom, DOMElement $root) - { - $link = $this->getDataContainer()->getCommentLink(); - if (!$link) { - return; - } - $clink = $this->_dom->createElement('comments'); - $text = $dom->createTextNode($link); - $clink->appendChild($text); - $root->appendChild($clink); - } - - /** - * Set entry categories - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCategories(DOMDocument $dom, DOMElement $root) - { - $categories = $this->getDataContainer()->getCategories(); - if (!$categories) { - return; - } - foreach ($categories as $cat) { - $category = $dom->createElement('category'); - if (isset($cat['scheme'])) { - $category->setAttribute('domain', $cat['scheme']); - } - $text = $dom->createCDATASection($cat['term']); - $category->appendChild($text); - $root->appendChild($category); - } - } -} diff --git a/library/Zend/Feed/Writer/Renderer/Feed/Atom.php b/library/Zend/Feed/Writer/Renderer/Feed/Atom.php deleted file mode 100644 index 975ea7a2eb..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Feed/Atom.php +++ /dev/null @@ -1,131 +0,0 @@ -_container->getEncoding()) { - $this->_container->setEncoding('UTF-8'); - } - $this->_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $root = $this->_dom->createElementNS( - Zend_Feed_Writer::NAMESPACE_ATOM_10, 'feed' - ); - $this->setRootElement($root); - $this->_dom->appendChild($root); - $this->_setLanguage($this->_dom, $root); - $this->_setBaseUrl($this->_dom, $root); - $this->_setTitle($this->_dom, $root); - $this->_setDescription($this->_dom, $root); - $this->_setImage($this->_dom, $root); - $this->_setIcon($this->_dom, $root); - $this->_setDateCreated($this->_dom, $root); - $this->_setDateModified($this->_dom, $root); - $this->_setGenerator($this->_dom, $root); - $this->_setLink($this->_dom, $root); - $this->_setFeedLinks($this->_dom, $root); - $this->_setId($this->_dom, $root); - $this->_setAuthors($this->_dom, $root); - $this->_setCopyright($this->_dom, $root); - $this->_setCategories($this->_dom, $root); - $this->_setHubs($this->_dom, $root); - - foreach ($this->_extensions as $ext) { - $ext->setType($this->getType()); - $ext->setRootElement($this->getRootElement()); - $ext->setDomDocument($this->getDomDocument(), $root); - $ext->render(); - } - - foreach ($this->_container as $entry) { - if ($this->getDataContainer()->getEncoding()) { - $entry->setEncoding($this->getDataContainer()->getEncoding()); - } - if ($entry instanceof Zend_Feed_Writer_Entry) { - $renderer = new Zend_Feed_Writer_Renderer_Entry_Atom($entry); - } else { - if (!$this->_dom->documentElement->hasAttribute('xmlns:at')) { - $this->_dom->documentElement->setAttribute( - 'xmlns:at', 'http://purl.org/atompub/tombstones/1.0' - ); - } - $renderer = new Zend_Feed_Writer_Renderer_Entry_Atom_Deleted($entry); - } - if ($this->_ignoreExceptions === true) { - $renderer->ignoreExceptions(); - } - $renderer->setType($this->getType()); - $renderer->setRootElement($this->_dom->documentElement); - $renderer->render(); - $element = $renderer->getElement(); - $imported = $this->_dom->importNode($element, true); - $root->appendChild($imported); - } - return $this; - } - -} diff --git a/library/Zend/Feed/Writer/Renderer/Feed/Atom/AtomAbstract.php b/library/Zend/Feed/Writer/Renderer/Feed/Atom/AtomAbstract.php deleted file mode 100644 index d8ff05f64e..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Feed/Atom/AtomAbstract.php +++ /dev/null @@ -1,446 +0,0 @@ -getDataContainer()->getLanguage()) { - $root->setAttribute('xml:lang', $this->getDataContainer() - ->getLanguage()); - } - } - - /** - * Set feed title - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setTitle(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getTitle()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 feed elements MUST contain exactly one' - . ' atom:title element but a title has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - $title = $dom->createElement('title'); - $root->appendChild($title); - $title->setAttribute('type', 'text'); - $text = $dom->createTextNode($this->getDataContainer()->getTitle()); - $title->appendChild($text); - } - - /** - * Set feed description - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDescription(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDescription()) { - return; - } - $subtitle = $dom->createElement('subtitle'); - $root->appendChild($subtitle); - $subtitle->setAttribute('type', 'text'); - $text = $dom->createTextNode($this->getDataContainer()->getDescription()); - $subtitle->appendChild($text); - } - - /** - * Set date feed was last modified - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateModified(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateModified()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 feed elements MUST contain exactly one' - . ' atom:updated element but a modification date has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - $updated = $dom->createElement('updated'); - $root->appendChild($updated); - $text = $dom->createTextNode( - $this->getDataContainer()->getDateModified()->get(Zend_Date::ISO_8601) - ); - $updated->appendChild($text); - } - - /** - * Set feed generator string - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setGenerator(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getGenerator()) { - $this->getDataContainer()->setGenerator('Zend_Feed_Writer', - Zend_Version::VERSION, 'http://framework.zend.com'); - } - - $gdata = $this->getDataContainer()->getGenerator(); - $generator = $dom->createElement('generator'); - $root->appendChild($generator); - $text = $dom->createTextNode($gdata['name']); - $generator->appendChild($text); - if (array_key_exists('uri', $gdata)) { - $generator->setAttribute('uri', $gdata['uri']); - } - if (array_key_exists('version', $gdata)) { - $generator->setAttribute('version', $gdata['version']); - } - } - - /** - * Set link to feed - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setLink(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getLink()) { - return; - } - $link = $dom->createElement('link'); - $root->appendChild($link); - $link->setAttribute('rel', 'alternate'); - $link->setAttribute('type', 'text/html'); - $link->setAttribute('href', $this->getDataContainer()->getLink()); - } - - /** - * Set feed links - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setFeedLinks(DOMDocument $dom, DOMElement $root) - { - $flinks = $this->getDataContainer()->getFeedLinks(); - if(!$flinks || !array_key_exists('atom', $flinks)) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 feed elements SHOULD contain one atom:link ' - . 'element with a rel attribute value of "self". This is the ' - . 'preferred URI for retrieving Atom Feed Documents representing ' - . 'this Atom feed but a feed link has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - foreach ($flinks as $type => $href) { - $mime = 'application/' . strtolower($type) . '+xml'; - $flink = $dom->createElement('link'); - $root->appendChild($flink); - $flink->setAttribute('rel', 'self'); - $flink->setAttribute('type', $mime); - $flink->setAttribute('href', $href); - } - } - - /** - * Set feed authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->_container->getAuthors(); - if (!$authors || empty($authors)) { - /** - * Technically we should defer an exception until we can check - * that all entries contain an author. If any entry is missing - * an author, then a missing feed author element is invalid - */ - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('author'); - $name = $this->_dom->createElement('name'); - $author->appendChild($name); - $root->appendChild($author); - $text = $dom->createTextNode($data['name']); - $name->appendChild($text); - if (array_key_exists('email', $data)) { - $email = $this->_dom->createElement('email'); - $author->appendChild($email); - $text = $dom->createTextNode($data['email']); - $email->appendChild($text); - } - if (array_key_exists('uri', $data)) { - $uri = $this->_dom->createElement('uri'); - $author->appendChild($uri); - $text = $dom->createTextNode($data['uri']); - $uri->appendChild($text); - } - } - } - - /** - * Set feed identifier - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setId(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getId() - && !$this->getDataContainer()->getLink()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Atom 1.0 feed elements MUST contain exactly one ' - . 'atom:id element, or as an alternative, we can use the same ' - . 'value as atom:link however neither a suitable link nor an ' - . 'id have been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - if (!$this->getDataContainer()->getId()) { - $this->getDataContainer()->setId( - $this->getDataContainer()->getLink()); - } - $id = $dom->createElement('id'); - $root->appendChild($id); - $text = $dom->createTextNode($this->getDataContainer()->getId()); - $id->appendChild($text); - } - - /** - * Set feed copyright - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCopyright(DOMDocument $dom, DOMElement $root) - { - $copyright = $this->getDataContainer()->getCopyright(); - if (!$copyright) { - return; - } - $copy = $dom->createElement('rights'); - $root->appendChild($copy); - $text = $dom->createTextNode($copyright); - $copy->appendChild($text); - } - - /** - * Set feed level logo (image) - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setImage(DOMDocument $dom, DOMElement $root) - { - $image = $this->getDataContainer()->getImage(); - if (!$image) { - return; - } - $img = $dom->createElement('logo'); - $root->appendChild($img); - $text = $dom->createTextNode($image['uri']); - $img->appendChild($text); - } - - /** - * Set feed level icon (image) - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setIcon(DOMDocument $dom, DOMElement $root) - { - $image = $this->getDataContainer()->getIcon(); - if (!$image) { - return; - } - $img = $dom->createElement('icon'); - $root->appendChild($img); - $text = $dom->createTextNode($image['uri']); - $img->appendChild($text); - } - - /** - * Set date feed was created - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateCreated(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateCreated()) { - return; - } - if(!$this->getDataContainer()->getDateModified()) { - $this->getDataContainer()->setDateModified( - $this->getDataContainer()->getDateCreated() - ); - } - } - - /** - * Set base URL to feed links - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setBaseUrl(DOMDocument $dom, DOMElement $root) - { - $baseUrl = $this->getDataContainer()->getBaseUrl(); - if (!$baseUrl) { - return; - } - $root->setAttribute('xml:base', $baseUrl); - } - - /** - * Set hubs to which this feed pushes - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setHubs(DOMDocument $dom, DOMElement $root) - { - $hubs = $this->getDataContainer()->getHubs(); - if (!$hubs) { - return; - } - foreach ($hubs as $hubUrl) { - $hub = $dom->createElement('link'); - $hub->setAttribute('rel', 'hub'); - $hub->setAttribute('href', $hubUrl); - $root->appendChild($hub); - } - } - - /** - * Set feed cateories - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCategories(DOMDocument $dom, DOMElement $root) - { - $categories = $this->getDataContainer()->getCategories(); - if (!$categories) { - return; - } - foreach ($categories as $cat) { - $category = $dom->createElement('category'); - $category->setAttribute('term', $cat['term']); - if (isset($cat['label'])) { - $category->setAttribute('label', $cat['label']); - } else { - $category->setAttribute('label', $cat['term']); - } - if (isset($cat['scheme'])) { - $category->setAttribute('scheme', $cat['scheme']); - } - $root->appendChild($category); - } - } -} diff --git a/library/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php b/library/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php deleted file mode 100644 index a97bfedea7..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Feed/Atom/Source.php +++ /dev/null @@ -1,110 +0,0 @@ -_container->getEncoding()) { - $this->_container->setEncoding('UTF-8'); - } - $this->_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $root = $this->_dom->createElement('source'); - $this->setRootElement($root); - $this->_dom->appendChild($root); - $this->_setLanguage($this->_dom, $root); - $this->_setBaseUrl($this->_dom, $root); - $this->_setTitle($this->_dom, $root); - $this->_setDescription($this->_dom, $root); - $this->_setDateCreated($this->_dom, $root); - $this->_setDateModified($this->_dom, $root); - $this->_setGenerator($this->_dom, $root); - $this->_setLink($this->_dom, $root); - $this->_setFeedLinks($this->_dom, $root); - $this->_setId($this->_dom, $root); - $this->_setAuthors($this->_dom, $root); - $this->_setCopyright($this->_dom, $root); - $this->_setCategories($this->_dom, $root); - - foreach ($this->_extensions as $ext) { - $ext->setType($this->getType()); - $ext->setRootElement($this->getRootElement()); - $ext->setDomDocument($this->getDomDocument(), $root); - $ext->render(); - } - return $this; - } - - /** - * Set feed generator string - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setGenerator(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getGenerator()) { - return; - } - - $gdata = $this->getDataContainer()->getGenerator(); - $generator = $dom->createElement('generator'); - $root->appendChild($generator); - $text = $dom->createTextNode($gdata['name']); - $generator->appendChild($text); - if (array_key_exists('uri', $gdata)) { - $generator->setAttribute('uri', $gdata['uri']); - } - if (array_key_exists('version', $gdata)) { - $generator->setAttribute('version', $gdata['version']); - } - } - -} diff --git a/library/Zend/Feed/Writer/Renderer/Feed/Rss.php b/library/Zend/Feed/Writer/Renderer/Feed/Rss.php deleted file mode 100644 index 5068ca9df3..0000000000 --- a/library/Zend/Feed/Writer/Renderer/Feed/Rss.php +++ /dev/null @@ -1,505 +0,0 @@ -_container->getEncoding()) { - $this->_container->setEncoding('UTF-8'); - } - $this->_dom = new DOMDocument('1.0', $this->_container->getEncoding()); - $this->_dom->formatOutput = true; - $this->_dom->substituteEntities = false; - $rss = $this->_dom->createElement('rss'); - $this->setRootElement($rss); - $rss->setAttribute('version', '2.0'); - - $channel = $this->_dom->createElement('channel'); - $rss->appendChild($channel); - $this->_dom->appendChild($rss); - $this->_setLanguage($this->_dom, $channel); - $this->_setBaseUrl($this->_dom, $channel); - $this->_setTitle($this->_dom, $channel); - $this->_setDescription($this->_dom, $channel); - $this->_setImage($this->_dom, $channel); - $this->_setDateCreated($this->_dom, $channel); - $this->_setDateModified($this->_dom, $channel); - $this->_setLastBuildDate($this->_dom, $channel); - $this->_setGenerator($this->_dom, $channel); - $this->_setLink($this->_dom, $channel); - $this->_setAuthors($this->_dom, $channel); - $this->_setCopyright($this->_dom, $channel); - $this->_setCategories($this->_dom, $channel); - - foreach ($this->_extensions as $ext) { - $ext->setType($this->getType()); - $ext->setRootElement($this->getRootElement()); - $ext->setDomDocument($this->getDomDocument(), $channel); - $ext->render(); - } - - foreach ($this->_container as $entry) { - if ($this->getDataContainer()->getEncoding()) { - $entry->setEncoding($this->getDataContainer()->getEncoding()); - } - if ($entry instanceof Zend_Feed_Writer_Entry) { - $renderer = new Zend_Feed_Writer_Renderer_Entry_Rss($entry); - } else { - continue; - } - if ($this->_ignoreExceptions === true) { - $renderer->ignoreExceptions(); - } - $renderer->setType($this->getType()); - $renderer->setRootElement($this->_dom->documentElement); - $renderer->render(); - $element = $renderer->getElement(); - $imported = $this->_dom->importNode($element, true); - $channel->appendChild($imported); - } - return $this; - } - - /** - * Set feed language - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setLanguage(DOMDocument $dom, DOMElement $root) - { - $lang = $this->getDataContainer()->getLanguage(); - if (!$lang) { - return; - } - $language = $dom->createElement('language'); - $root->appendChild($language); - $language->nodeValue = $lang; - } - - /** - * Set feed title - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setTitle(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getTitle()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 feed elements MUST contain exactly one' - . ' title element but a title has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - - $title = $dom->createElement('title'); - $root->appendChild($title); - $text = $dom->createTextNode($this->getDataContainer()->getTitle()); - $title->appendChild($text); - } - - /** - * Set feed description - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDescription(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDescription()) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 feed elements MUST contain exactly one' - . ' description element but one has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $subtitle = $dom->createElement('description'); - $root->appendChild($subtitle); - $text = $dom->createTextNode($this->getDataContainer()->getDescription()); - $subtitle->appendChild($text); - } - - /** - * Set date feed was last modified - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateModified(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateModified()) { - return; - } - - $updated = $dom->createElement('pubDate'); - $root->appendChild($updated); - $text = $dom->createTextNode( - $this->getDataContainer()->getDateModified()->get(Zend_Date::RSS) - ); - $updated->appendChild($text); - } - - /** - * Set feed generator string - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setGenerator(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getGenerator()) { - $this->getDataContainer()->setGenerator('Zend_Feed_Writer', - Zend_Version::VERSION, 'http://framework.zend.com'); - } - - $gdata = $this->getDataContainer()->getGenerator(); - $generator = $dom->createElement('generator'); - $root->appendChild($generator); - $name = $gdata['name']; - if (array_key_exists('version', $gdata)) { - $name .= ' ' . $gdata['version']; - } - if (array_key_exists('uri', $gdata)) { - $name .= ' (' . $gdata['uri'] . ')'; - } - $text = $dom->createTextNode($name); - $generator->appendChild($text); - } - - /** - * Set link to feed - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setLink(DOMDocument $dom, DOMElement $root) - { - $value = $this->getDataContainer()->getLink(); - if(!$value) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 feed elements MUST contain exactly one' - . ' link element but one has not been set'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $link = $dom->createElement('link'); - $root->appendChild($link); - $text = $dom->createTextNode($value); - $link->appendChild($text); - if (!Zend_Uri::check($value)) { - $link->setAttribute('isPermaLink', 'false'); - } - } - - /** - * Set feed authors - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setAuthors(DOMDocument $dom, DOMElement $root) - { - $authors = $this->getDataContainer()->getAuthors(); - if (!$authors || empty($authors)) { - return; - } - foreach ($authors as $data) { - $author = $this->_dom->createElement('author'); - $name = $data['name']; - if (array_key_exists('email', $data)) { - $name = $data['email'] . ' (' . $data['name'] . ')'; - } - $text = $dom->createTextNode($name); - $author->appendChild($text); - $root->appendChild($author); - } - } - - /** - * Set feed copyright - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCopyright(DOMDocument $dom, DOMElement $root) - { - $copyright = $this->getDataContainer()->getCopyright(); - if (!$copyright) { - return; - } - $copy = $dom->createElement('copyright'); - $root->appendChild($copy); - $text = $dom->createTextNode($copyright); - $copy->appendChild($text); - } - - /** - * Set feed channel image - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setImage(DOMDocument $dom, DOMElement $root) - { - $image = $this->getDataContainer()->getImage(); - if (!$image) { - return; - } - if (!isset($image['title']) || empty($image['title']) - || !is_string($image['title'])) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'RSS 2.0 feed images must include a title'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - if (empty($image['link']) || !is_string($image['link']) - || !Zend_Uri::check($image['link'])) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Invalid parameter: parameter \'link\'' - . ' must be a non-empty string and valid URI/IRI'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $img = $dom->createElement('image'); - $root->appendChild($img); - $url = $dom->createElement('url'); - $text = $dom->createTextNode($image['uri']); - $url->appendChild($text); - $title = $dom->createElement('title'); - $text = $dom->createTextNode($image['title']); - $title->appendChild($text); - $link = $dom->createElement('link'); - $text = $dom->createTextNode($image['link']); - $link->appendChild($text); - $img->appendChild($url); - $img->appendChild($title); - $img->appendChild($link); - if (isset($image['height'])) { - if (!ctype_digit((string) $image['height']) || $image['height'] > 400) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Invalid parameter: parameter \'height\'' - . ' must be an integer not exceeding 400'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $height = $dom->createElement('height'); - $text = $dom->createTextNode($image['height']); - $height->appendChild($text); - $img->appendChild($height); - } - if (isset($image['width'])) { - if (!ctype_digit((string) $image['width']) || $image['width'] > 144) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Invalid parameter: parameter \'width\'' - . ' must be an integer not exceeding 144'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $width = $dom->createElement('width'); - $text = $dom->createTextNode($image['width']); - $width->appendChild($text); - $img->appendChild($width); - } - if (isset($image['description'])) { - if (empty($image['description']) || !is_string($image['description'])) { - #require_once 'Zend/Feed/Exception.php'; - $message = 'Invalid parameter: parameter \'description\'' - . ' must be a non-empty string'; - $exception = new Zend_Feed_Exception($message); - if (!$this->_ignoreExceptions) { - throw $exception; - } else { - $this->_exceptions[] = $exception; - return; - } - } - $desc = $dom->createElement('description'); - $text = $dom->createTextNode($image['description']); - $desc->appendChild($text); - $img->appendChild($desc); - } - } - - /** - * Set date feed was created - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setDateCreated(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getDateCreated()) { - return; - } - if(!$this->getDataContainer()->getDateModified()) { - $this->getDataContainer()->setDateModified( - $this->getDataContainer()->getDateCreated() - ); - } - } - - /** - * Set date feed last build date - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setLastBuildDate(DOMDocument $dom, DOMElement $root) - { - if(!$this->getDataContainer()->getLastBuildDate()) { - return; - } - - $lastBuildDate = $dom->createElement('lastBuildDate'); - $root->appendChild($lastBuildDate); - $text = $dom->createTextNode( - $this->getDataContainer()->getLastBuildDate()->get(Zend_Date::RSS) - ); - $lastBuildDate->appendChild($text); - } - - /** - * Set base URL to feed links - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setBaseUrl(DOMDocument $dom, DOMElement $root) - { - $baseUrl = $this->getDataContainer()->getBaseUrl(); - if (!$baseUrl) { - return; - } - $root->setAttribute('xml:base', $baseUrl); - } - - /** - * Set feed categories - * - * @param DOMDocument $dom - * @param DOMElement $root - * @return void - */ - protected function _setCategories(DOMDocument $dom, DOMElement $root) - { - $categories = $this->getDataContainer()->getCategories(); - if (!$categories) { - return; - } - foreach ($categories as $cat) { - $category = $dom->createElement('category'); - if (isset($cat['scheme'])) { - $category->setAttribute('domain', $cat['scheme']); - } - $text = $dom->createTextNode($cat['term']); - $category->appendChild($text); - $root->appendChild($category); - } - } -} diff --git a/library/Zend/Feed/Writer/Renderer/RendererAbstract.php b/library/Zend/Feed/Writer/Renderer/RendererAbstract.php deleted file mode 100644 index 50b0760238..0000000000 --- a/library/Zend/Feed/Writer/Renderer/RendererAbstract.php +++ /dev/null @@ -1,250 +0,0 @@ -_container = $container; - $this->setType($container->getType()); - $this->_loadExtensions(); - } - - /** - * Save XML to string - * - * @return string - */ - public function saveXml() - { - return $this->getDomDocument()->saveXml(); - } - - /** - * Get DOM document - * - * @return DOMDocument - */ - public function getDomDocument() - { - return $this->_dom; - } - - /** - * Get document element from DOM - * - * @return DOMElement - */ - public function getElement() - { - return $this->getDomDocument()->documentElement; - } - - /** - * Get data container of items being rendered - * - * @return mixed - */ - public function getDataContainer() - { - return $this->_container; - } - - /** - * Set feed encoding - * - * @param string $enc - * @return Zend_Feed_Writer_Renderer_RendererAbstract - */ - public function setEncoding($enc) - { - $this->_encoding = $enc; - return $this; - } - - /** - * Get feed encoding - * - * @return string - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Indicate whether or not to ignore exceptions - * - * @param bool $bool - * @return Zend_Feed_Writer_Renderer_RendererAbstract - */ - public function ignoreExceptions($bool = true) - { - if (!is_bool($bool)) { - #require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception('Invalid parameter: $bool. Should be TRUE or FALSE (defaults to TRUE if null)'); - } - $this->_ignoreExceptions = $bool; - return $this; - } - - /** - * Get exception list - * - * @return array - */ - public function getExceptions() - { - return $this->_exceptions; - } - - /** - * Set the current feed type being exported to "rss" or "atom". This allows - * other objects to gracefully choose whether to execute or not, depending - * on their appropriateness for the current type, e.g. renderers. - * - * @param string $type - */ - public function setType($type) - { - $this->_type = $type; - } - - /** - * Retrieve the current or last feed type exported. - * - * @return string Value will be "rss" or "atom" - */ - public function getType() - { - return $this->_type; - } - - /** - * Sets the absolute root element for the XML feed being generated. This - * helps simplify the appending of namespace declarations, but also ensures - * namespaces are added to the root element - not scattered across the entire - * XML file - may assist namespace unsafe parsers and looks pretty ;). - * - * @param DOMElement $root - */ - public function setRootElement(DOMElement $root) - { - $this->_rootElement = $root; - } - - /** - * Retrieve the absolute root element for the XML feed being generated. - * - * @return DOMElement - */ - public function getRootElement() - { - return $this->_rootElement; - } - - /** - * Load extensions from Zend_Feed_Writer - * - * @return void - */ - protected function _loadExtensions() - { - Zend_Feed_Writer::registerCoreExtensions(); - $all = Zend_Feed_Writer::getExtensions(); - if (stripos(get_class($this), 'entry')) { - $exts = $all['entryRenderer']; - } else { - $exts = $all['feedRenderer']; - } - foreach ($exts as $extension) { - $className = Zend_Feed_Writer::getPluginLoader()->getClassName($extension); - $this->_extensions[$extension] = new $className( - $this->getDataContainer() - ); - $this->_extensions[$extension]->setEncoding($this->getEncoding()); - } - } -} diff --git a/library/Zend/Feed/Writer/Renderer/RendererInterface.php b/library/Zend/Feed/Writer/Renderer/RendererInterface.php deleted file mode 100644 index 7bd04a012a..0000000000 --- a/library/Zend/Feed/Writer/Renderer/RendererInterface.php +++ /dev/null @@ -1,111 +0,0 @@ -markTestSkipped('ONLINE feed tests are not enabled'); - } - $this->baseUri = rtrim(constant('TESTS_ZEND_FEED_IMPORT_ONLINE_BASEURI'), '/'); - Zend_Feed::setHttpClient(new Zend_Http_Client()); - } - - public function tearDown() - { - if (!$this->baseUri) { - return parent::tearDown(); - } - - $basePath = dirname(__FILE__) . '/_files/'; - foreach ($this->remoteFeedNames as $file) { - $filename = $basePath . $file; - if (!file_exists($filename)) { - continue; - } - unlink($filename); - } - } - - public function prepareFeed($filename) - { - $basePath = dirname(__FILE__) . '/_files/'; - $path = $basePath . $filename; - $remote = str_replace('.xml', '.remote.xml', $filename); - $string = file_get_contents($path); - $string = str_replace('XXE_URI', $this->baseUri . '/xxe-info.txt', $string); - file_put_contents($basePath . '/' . $remote, $string); - return $remote; - } -} diff --git a/tests/Zend/Feed/AllTests.php b/tests/Zend/Feed/AllTests.php deleted file mode 100644 index 24eb242b07..0000000000 --- a/tests/Zend/Feed/AllTests.php +++ /dev/null @@ -1,143 +0,0 @@ -addTestSuite('Zend_Feed_ArrayAccessTest'); - $suite->addTestSuite('Zend_Feed_AtomEntryOnlyTest'); - $suite->addTestSuite('Zend_Feed_AtomPublishingTest'); - $suite->addTestSuite('Zend_Feed_CountTest'); - $suite->addTestSuite('Zend_Feed_ElementTest'); - $suite->addTestSuite('Zend_Feed_ImportTest'); - $suite->addTestSuite('Zend_Feed_IteratorTest'); - $suite->addTestSuite('Zend_Feed_Entry_RssTest'); - $suite->addTestSuite('Zend_Feed_AtomTest'); - $suite->addTestSuite('Zend_Feed_RssTest'); - - /* Zend_Feed_Reader tests */ - // Base parent class - $suite->addTestSuite('Zend_Feed_ReaderTest'); - // RSS - Feed Level - $suite->addTestSuite('Zend_Feed_Reader_Feed_RssTest'); - // RSS - Item Level - $suite->addTestSuite('Zend_Feed_Reader_Entry_RssTest'); - // ATOM - Feed Level - $suite->addTestSuite('Zend_Feed_Reader_Feed_AtomTest'); - // ATOM - Item Level - $suite->addTestSuite('Zend_Feed_Reader_Entry_AtomTest'); - // COMMON - Feed Level - $suite->addTestSuite('Zend_Feed_Reader_Feed_CommonTest'); - // COMMON - Entry Level - $suite->addTestSuite('Zend_Feed_Reader_Entry_CommonTest'); - // ATOM - Entry Level (Source Feed Metadata) - $suite->addTestSuite('Zend_Feed_Reader_Feed_AtomSourceTest'); - // ATOM - Entry Level (Standalone Entry Documents) - $suite->addTestSuite('Zend_Feed_Reader_Entry_AtomStandaloneEntryTest'); - /** - * Real World Feed Tests - */ - $suite->addTestSuite('Zend_Feed_Reader_Integration_WordpressRss2DcAtomTest'); - $suite->addTestSuite('Zend_Feed_Reader_Integration_WordpressAtom10Test'); - $suite->addTestSuite('Zend_Feed_Reader_Integration_LautDeRdfTest'); - $suite->addTestSuite('Zend_Feed_Reader_Integration_HOnlineComAtom10Test'); - - $suite->addTestSuite('Zend_Feed_Writer_FeedTest'); - $suite->addTestSuite('Zend_Feed_Writer_EntryTest'); - $suite->addTestSuite('Zend_Feed_Writer_DeletedTest'); - $suite->addTestSuite('Zend_Feed_Writer_Renderer_Feed_AtomTest'); - $suite->addTestSuite('Zend_Feed_Writer_Renderer_Feed_RssTest'); - $suite->addTestSuite('Zend_Feed_Writer_Renderer_Entry_AtomTest'); - $suite->addTestSuite('Zend_Feed_Writer_Renderer_Entry_RssTest'); - - $suite->addTestSuite('Zend_Feed_Writer_Extension_ITunes_EntryTest'); - $suite->addTestSuite('Zend_Feed_Writer_Extension_ITunes_FeedTest'); - - $suite->addTest(Zend_Feed_Pubsubhubbub_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Feed_AllTests::main') { - Zend_Feed_AllTests::main(); -} diff --git a/tests/Zend/Feed/ArrayAccessTest.php b/tests/Zend/Feed/ArrayAccessTest.php deleted file mode 100644 index 5ecd6e4e11..0000000000 --- a/tests/Zend/Feed/ArrayAccessTest.php +++ /dev/null @@ -1,101 +0,0 @@ -_feed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeed.xml'); - $this->_nsfeed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeedNamespaced.xml'); - } - - public function testExists() - { - $this->assertFalse(isset($this->_feed[-1]), 'Negative array access should fail'); - $this->assertTrue(isset($this->_feed['version']), 'Feed version should be set'); - - $this->assertFalse(isset($this->_nsfeed[-1]), 'Negative array access should fail'); - $this->assertTrue(isset($this->_nsfeed['version']), 'Feed version should be set'); - } - - public function testGet() - { - $this->assertEquals($this->_feed['version'], '1.0', 'Feed version should be 1.0'); - $this->assertEquals($this->_nsfeed['version'], '1.0', 'Feed version should be 1.0'); - } - - public function testSet() - { - $this->_feed['category'] = 'tests'; - $this->assertTrue(isset($this->_feed['category']), 'Feed category should be set'); - $this->assertEquals($this->_feed['category'], 'tests', 'Feed category should be tests'); - - $this->_nsfeed['atom:category'] = 'tests'; - $this->assertTrue(isset($this->_nsfeed['atom:category']), 'Feed category should be set'); - $this->assertEquals($this->_nsfeed['atom:category'], 'tests', 'Feed category should be tests'); - - // Changing an existing index. - $oldEntry = $this->_feed['version']; - $this->_feed['version'] = '1.1'; - $this->assertTrue($oldEntry != $this->_feed['version'], 'Version should have changed'); - } - - public function testUnset() - { - $feed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeed.xml'); - unset($feed['version']); - $this->assertFalse(isset($feed['version']), 'Version should be unset'); - $this->assertEquals('', $feed['version'], 'Version should be equal to the empty string'); - - $nsfeed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeedNamespaced.xml'); - unset($nsfeed['version']); - $this->assertFalse(isset($nsfeed['version']), 'Version should be unset'); - $this->assertEquals('', $nsfeed['version'], 'Version should be equal to the empty string'); - } - - /** - * @group ZF-5354 - */ - public function testGetsLinkWithEmptyOrMissingRelAsAlternateRel() - { - $feed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/AtomHOnline.xml'); - $entry = $feed->current(); - $this->assertEquals('http://www.h-online.com/security/Google-acquires-reCAPTCHA--/news/114266/from/rss', $entry->link('alternate')); - } - -} diff --git a/tests/Zend/Feed/AtomEntryOnlyTest.php b/tests/Zend/Feed/AtomEntryOnlyTest.php deleted file mode 100644 index efe858ea86..0000000000 --- a/tests/Zend/Feed/AtomEntryOnlyTest.php +++ /dev/null @@ -1,58 +0,0 @@ -assertEquals(1, $feed->count(), 'The entry-only feed should report one entry.'); - - foreach ($feed as $entry); - $this->assertEquals('Zend_Feed_Entry_Atom', get_class($entry), - 'The single entry should be an instance of Zend_Feed_Entry_Atom'); - - $this->assertEquals('1', $entry->id(), 'The single entry should have id 1'); - $this->assertEquals('Bug', $entry->title(), 'The entry\'s title should be "Bug"'); - } - -} diff --git a/tests/Zend/Feed/AtomPublishingTest.php b/tests/Zend/Feed/AtomPublishingTest.php deleted file mode 100644 index 53d5be42c7..0000000000 --- a/tests/Zend/Feed/AtomPublishingTest.php +++ /dev/null @@ -1,141 +0,0 @@ -_uri = 'http://fubar.com/myFeed'; - } - - public function tearDown() - { - Zend_Feed::setHttpClient(new Zend_Http_Client()); - } - - public function testPost() - { - Zend_Feed::setHttpClient(new TestClient()); - - $entry = new Zend_Feed_Entry_Atom(); - - /* Give the entry its initial values. */ - $entry->title = 'Entry 1'; - $entry->content = '1.1'; - $entry->content['type'] = 'text'; - - /* Do the initial post. The base feed URI is the same as the - * POST URI, so just supply save() with that. */ - $entry->save($this->_uri); - - /* $entry will be filled in with any elements returned by the - * server (id, updated, link rel="edit", etc). */ - $this->assertEquals('1', $entry->id(), 'Expected id to be 1'); - $this->assertEquals('Entry 1', $entry->title(), 'Expected title to be "Entry 1"'); - $this->assertEquals('1.1', $entry->content(), 'Expected content to be "1.1"'); - $this->assertEquals('text', $entry->content['type'], 'Expected content/type to be "text"'); - $this->assertEquals('2005-05-23T16:26:00-08:00', $entry->updated(), 'Expected updated date of 2005-05-23T16:26:00-08:00'); - $this->assertEquals('http://fubar.com/myFeed/1/1/', $entry->link('edit'), 'Expected edit URI of http://fubar.com/myFeed/1/1/'); - } - - public function testEdit() - { - Zend_Feed::setHttpClient(new TestClient()); - $contents = file_get_contents(dirname(__FILE__) . '/_files/AtomPublishingTest-before-update.xml'); - - /* The base feed URI is the same as the POST URI, so just supply the - * Zend_Feed_Entry_Atom object with that. */ - $entry = new Zend_Feed_Entry_Atom($this->_uri, $contents); - - /* Initial state. */ - $this->assertEquals('2005-05-23T16:26:00-08:00', $entry->updated(), 'Initial state of updated timestamp does not match'); - $this->assertEquals('http://fubar.com/myFeed/1/1/', $entry->link('edit'), 'Initial state of edit link does not match'); - - /* Just change the entry's properties directly. */ - $entry->content = '1.2'; - - /* Then save the changes. */ - $entry->save(); - - /* New state. */ - $this->assertEquals('1.2', $entry->content(), 'Content change did not stick'); - $this->assertEquals('2005-05-23T16:27:00-08:00', $entry->updated(), 'New updated link is not correct'); - $this->assertEquals('http://fubar.com/myFeed/1/2/', $entry->link('edit'), 'New edit link is not correct'); - } -} - -/** - * A test wrapper around Zend_Http_Client, not actually performing - * the request. - * - */ -class TestClient extends Zend_Http_Client -{ - public function request($method = null) - { - $code = 400; - $body = ''; - - switch ($method) { - case self::POST: - $code = 201; - $body = file_get_contents(dirname(__FILE__) . '/_files/AtomPublishingTest-created-entry.xml'); - break; - - case self::PUT: - $doc1 = new DOMDocument(); - $doc1->load(dirname(__FILE__) . '/_files/AtomPublishingTest-expected-update.xml'); - $doc2 = new DOMDocument(); - $doc2->loadXML($this->raw_post_data); - if ($doc1->saveXml() == $doc2->saveXml()) { - $code = 200; - $body = file_get_contents(dirname(__FILE__) . '/_files/AtomPublishingTest-updated-entry.xml'); - } - break; - - default: - break; - } - - return new Zend_Http_Response($code, array(), $body); - } -} diff --git a/tests/Zend/Feed/AtomTest.php b/tests/Zend/Feed/AtomTest.php deleted file mode 100644 index abd3ba5870..0000000000 --- a/tests/Zend/Feed/AtomTest.php +++ /dev/null @@ -1,49 +0,0 @@ -baseUri . '/' . $this->prepareFeed('zend_feed_atom_xxe.xml'); - $this->setExpectedException('Zend_Feed_Exception', 'parse'); - $feed = new Zend_Feed_Atom($uri); - } -} - diff --git a/tests/Zend/Feed/CountTest.php b/tests/Zend/Feed/CountTest.php deleted file mode 100644 index da1b12cb26..0000000000 --- a/tests/Zend/Feed/CountTest.php +++ /dev/null @@ -1,54 +0,0 @@ -assertEquals($f->count(), 2, 'Feed count should be 2'); - } - - /** - * ZF-3848 - */ - public function testCountableInterface() - { - $f = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeed.xml'); - $this->assertEquals(count($f), 2, 'Feed count should be 2'); - } - -} diff --git a/tests/Zend/Feed/ElementTest.php b/tests/Zend/Feed/ElementTest.php deleted file mode 100644 index 6baec5505f..0000000000 --- a/tests/Zend/Feed/ElementTest.php +++ /dev/null @@ -1,165 +0,0 @@ -author->name['last'] = 'hagenbuch'; - $e->author->name['first'] = 'chuck'; - $e->author->name->{'chuck:url'} = 'marina.horde.org'; - - $e->author->title['foo'] = 'bar'; - if ($e->pants()) { - $this->fail(' does not exist, it should not have a true value'); - // This should not create an element in the actual tree. - } - if ($e->pants()) { - $this->fail(' should not have been created by testing for it'); - // This should not create an element in the actual tree. - } - - $xml = $e->saveXml(); - - $this->assertFalse(strpos($xml, 'pants'), ' should not be in the xml output'); - $this->assertTrue(strpos($xml, 'marina.horde.org') !== false, 'the url attribute should be set'); - } - - public function testStrings() - { - $xml = " - Using C++ Intrinsic Functions for Pipelined Text Processing - http://www.oreillynet.com/pub/wlg/8356 - - -
- A good C++ programming technique that has almost no published material available on the WWW relates to using the special pipeline instructions in modern CPUs for faster text processing. Here's example code using C++ intrinsic functions to give a fourfold speed increase for a UTF-8 to UTF-16 converter compared to the original C/C++ code. -
-
- Rick Jelliffe - 2005-11-07T08:15:57-08:00 -
"; - - $entry = new Zend_Feed_Entry_Atom('uri', $xml); - - $this->assertTrue($entry->summary instanceof Zend_Feed_Element, '__get access should return an Zend_Feed_Element instance'); - $this->assertFalse($entry->summary() instanceof Zend_Feed_Element, 'method access should not return an Zend_Feed_Element instance'); - $this->assertTrue(is_string($entry->summary()), 'method access should return a string'); - $this->assertFalse(is_string($entry->summary), '__get access should not return a string'); - } - - public function testSetNamespacedAttributes() - { - $value = 'value'; - - $e = new Zend_Feed_Entry_Atom(); - $e->test['attr'] = $value; - $e->test['namespace1:attr'] = $value; - $e->test['namespace2:attr'] = $value; - - $this->assertEquals($value, $e->test['attr']); - $this->assertEquals($value, $e->test['namespace1:attr']); - $this->assertEquals($value, $e->test['namespace2:attr']); - } - - public function testUnsetNamespacedAttributes() - { - $value = 'value'; - - $e = new Zend_Feed_Entry_Atom(); - $e->test['attr'] = $value; - $e->test['namespace1:attr'] = $value; - $e->test['namespace2:attr'] = $value; - - $this->assertEquals($value, $e->test['attr']); - $this->assertEquals($value, $e->test['namespace1:attr']); - $this->assertEquals($value, $e->test['namespace2:attr']); - - unset($e->test['attr']); - unset($e->test['namespace1:attr']); - unset($e->test['namespace2:attr']); - - $this->assertEquals('', $e->test['attr']); - $this->assertEquals('', $e->test['namespace1:attr']); - $this->assertEquals('', $e->test['namespace1:attr']); - } - - /** - * @group ZF-2606 - */ - public function testValuesWithXmlSpecialChars() - { - $testAmp = '&'; - $testLt = '<'; - $testGt = '>'; - - $e = new Zend_Feed_Entry_Atom(); - $e->testAmp = $testAmp; - $e->{'namespace1:lt'} = $testLt; - $e->{'namespace1:gt'} = $testGt; - - $this->assertEquals($testAmp, $e->testAmp()); - $this->assertEquals($testLt, $e->{'namespace1:lt'}()); - $this->assertEquals($testGt, $e->{'namespace1:gt'}()); - } - - /** - * @group ZF-2606 - */ - public function testAttributesWithXmlSpecialChars() - { - $testAmp = '&'; - $testLt = '<'; - $testGt = '>'; - $testQuot = '"'; - $testSquot = "'"; - - $e = new Zend_Feed_Entry_Atom(); - $e->test['amp'] = $testAmp; - $e->test['namespace1:lt'] = $testLt; - $e->test['namespace1:gt'] = $testGt; - $e->test['namespace1:quot'] = $testQuot; - $e->test['namespace1:squot'] = $testSquot; - - $this->assertEquals($testAmp, $e->test['amp']); - $this->assertEquals($testLt, $e->test['namespace1:lt']); - $this->assertEquals($testGt, $e->test['namespace1:gt']); - $this->assertEquals($testQuot, $e->test['namespace1:quot']); - $this->assertEquals($testSquot, $e->test['namespace1:squot']); - } - -} diff --git a/tests/Zend/Feed/Entry/RssTest.php b/tests/Zend/Feed/Entry/RssTest.php deleted file mode 100644 index 0240e15f42..0000000000 --- a/tests/Zend/Feed/Entry/RssTest.php +++ /dev/null @@ -1,73 +0,0 @@ -assertTrue($feed instanceof Zend_Feed_Rss); - - $item = $feed->current(); - $this->assertTrue($item instanceof Zend_Feed_Entry_Rss); - - $this->assertTrue(isset($item->content)); - $this->assertContains( - 'http://framework.zend.com/fisheye/changelog/Zend_Framework/?cs=7757', - $item->content->__toString() - ); - $this->assertContains( - 'http://framework.zend.com/fisheye/changelog/Zend_Framework/?cs=7757', - $item->content() - ); - $item->content = 'foo'; - $this->assertEquals('foo', $item->content->__toString()); - } - - public function testContentEncodedNullIfEmpty() - { - $feed = Zend_Feed::importFile(dirname(__FILE__) . '/../_files/TestFeedEntryRssContentEncoded.xml'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - - $feed->next(); - $item = $feed->current(); - $this->assertTrue($item instanceof Zend_Feed_Entry_Rss); - $this->assertFalse(isset($item->content)); - $this->assertNull($item->content()); - // $this->assertNull($item->content); // always return DOMElement Object - } - -} diff --git a/tests/Zend/Feed/ImportTest.php b/tests/Zend/Feed/ImportTest.php deleted file mode 100644 index 859ab47e8c..0000000000 --- a/tests/Zend/Feed/ImportTest.php +++ /dev/null @@ -1,468 +0,0 @@ -_adapter = new Zend_Http_Client_Adapter_Test(); - Zend_Feed::setHttpClient(new Zend_Http_Client(null, array('adapter' => $this->_adapter))); - $this->_client = Zend_Feed::getHttpClient(); - $this->_feedDir = dirname(__FILE__) . '/_files'; - } - - /** - * Test an atom feed generated by google's Blogger platform - */ - public function testAtomGoogle() - { - $this->_importAtomValid('AtomTestGoogle.xml'); - } - - /** - * Test an atom feed generated by mozillaZine.org - */ - public function testAtomMozillazine() - { - $this->_importAtomValid('AtomTestMozillazine.xml'); - } - - /** - * Test an atom feed generated by O'Reilly - */ - public function testAtomOReilly() - { - $this->_importAtomValid('AtomTestOReilly.xml'); - } - - /** - * Test an atom feed generated by PlanetPHP - */ - public function testAtomPlanetPHP() - { - $this->_importAtomValid('AtomTestPlanetPHP.xml'); - } - - /** - * Test a small atom feed - */ - public function testAtomSample1() - { - $this->_importAtomValid('AtomTestSample1.xml'); - } - - /** - * Test a small atom feed without any entries - */ - public function testAtomSample2() - { - $this->_importAtomValid('AtomTestSample2.xml'); - } - - /** - * Test an atom feed with a
tag missing - */ - public function testAtomSample3() - { - $this->_importInvalid('AtomTestSample3.xml'); - } - - /** - * Test an atom feed with links within entries - */ - public function testAtomSample4() - { - $this->_importAtomValid('AtomTestSample4.xml'); - } - - /** - * Test a RSS feed generated by UserLand Frontier v9.5 - */ - public function testRssHarvardLaw() - { - $this->_importRssValid('RssTestHarvardLaw.xml'); - } - - /** - * Test a RSS feed generated by PlanetPHP - */ - public function testRssPlanetPHP() - { - $this->_importRssValid('RssTestPlanetPHP.xml'); - } - - /** - * Test a RSS feed generated by Slashdot - */ - public function testRssSlashdot() - { - $this->_importRssValid('RssTestSlashdot.xml'); - } - - /** - * Test a RSS feed generated by CNN - */ - public function testRssCNN() - { - $this->_importRssValid('RssTestCNN.xml'); - } - - /** - * Test a valid RSS 0.91 sample - */ - public function testRss091Sample1() - { - $this->_importRssValid('RssTest091Sample1.xml'); - } - - /** - * Test a valid RSS 0.91 sample - */ - public function testRss092Sample1() - { - $this->_importRssValid('RssTest092Sample1.xml'); - } - - /** - * Test a valid RSS 1.0 sample - */ - public function testRss100Sample1() - { - $feed = $this->_importRssValid('RssTest100Sample1.xml'); - $this->assertEquals(2, $feed->count()); - } - - /** - * Test a valid RSS 1.0 sample with some extensions in it - */ - public function testRss100Sample2() - { - $feed = $this->_importRssValid('RssTest100Sample2.xml'); - $this->assertEquals(1, $feed->count()); - } - - /** - * Test a valid RSS 2.0 sample - */ - public function testRss200Sample1() - { - $this->_importRssValid('RssTest200Sample1.xml'); - } - - /** - * Test the import of a RSS feed from an array - */ - public function testRssImportFullArray() - { - $feed = Zend_Feed::importArray($this->_getFullArray(), 'rss'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - } - - /** - * Test the import of a RSS feed from an array - * @group ZF-5833 - */ - public function testRssImportSetsIsPermaLinkAsFalseIfGuidNotAUri() - { - $feed = Zend_Feed::importArray($this->_getFullArray(), 'rss'); - $entry = $feed->current(); - $this->assertEquals('false', $entry->guid['isPermaLink']); - } - - /** - * Test the import of a RSS feed from an array - */ - public function testAtomImportFullArray() - { - $feed = Zend_Feed::importArray($this->_getFullArray(), 'atom'); - } - - /** - * Test the import of a RSS feed from a builder - */ - public function testRssImportFullBuilder() - { - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($this->_getFullArray()), 'rss'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - } - - /** - * Test the import of a full iTunes RSS feed from a builder - */ - public function testRssImportFulliTunesBuilder() - { - $array = $this->_getFullArray(); - $array['itunes']['author'] = 'iTunes Author'; - $array['itunes']['owner'] = array('name' => 'iTunes Owner', - 'email' => 'itunes@example.com'); - $array['itunes']['image'] = 'http://www.example/itunes.png'; - $array['itunes']['subtitle'] = 'iTunes subtitle'; - $array['itunes']['summary'] = 'iTunes summary'; - $array['itunes']['explicit'] = 'clean'; - $array['itunes']['block'] = 'no'; - $array['itunes']['new-feed-url'] = 'http://www.example/itunes.xml'; - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'rss'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - } - - /** - * Test the import of an Atom feed from a builder - */ - public function testAtomImportFullBuilder() - { - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($this->_getFullArray()), 'atom'); - - } - - /** - * Test the import of an Atom feed from a builder - */ - public function testAtomImportFullBuilderValid() - { - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($this->_getFullArray()), 'atom'); - - $feed = Zend_Feed::importString($feed->saveXml()); - $this->assertTrue($feed instanceof Zend_Feed_Atom); - } - - /** - * Check the validity of the builder import (rss) - */ - public function testRssImportFullBuilderValid() - { - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($this->_getFullArray()), 'rss'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - $feed = Zend_Feed::importString($feed->saveXml()); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - } - - /** - * Test the return of a link() call (atom) - */ - public function testAtomGetLink() - { - $feed = Zend_Feed::importBuilder(new Zend_Feed_Builder($this->_getFullArray()), 'atom'); - $this->assertTrue($feed instanceof Zend_Feed_Atom); - $feed = Zend_Feed::importString($feed->saveXml()); - $this->assertTrue($feed instanceof Zend_Feed_Atom); - $href = $feed->link('self'); - $this->assertEquals('http://www.example.com', $href); - } - - /** - * Imports an invalid feed and ensure everything works as expected - * even if XDebug is running (ZF-2590). - */ - public function testImportInvalidIsXdebugAware() - { - if (!function_exists('xdebug_is_enabled')) { - $this->markTestIncomplete('XDebug not installed'); - } - - $response = new Zend_Http_Response(200, array(), ''); - $this->_adapter->setResponse($response); - - try { - $feed = Zend_Feed::import('http://localhost'); - $this->fail('Expected Zend_Feed_Exception not thrown'); - } catch (Zend_Feed_Exception $e) { - $this->assertTrue($e instanceof Zend_Feed_Exception); - $this->assertRegExp('/(XDebug is running|Empty string)/', $e->getMessage()); - } - } - - /** - * Returns the array used by Zend_Feed::importArray - * and Zend_Feed::importBuilder tests - * - * @return array - */ - protected function _getFullArray() - { - $array = array('title' => 'Title of the feed', - 'link' => 'http://www.example.com', - 'description' => 'Description of the feed', - 'author' => 'Olivier Sirven', - 'email' => 'olivier@elma.fr', - 'webmaster' => 'olivier@elma.fr', - 'charset' => 'iso-8859-15', - 'lastUpdate' => time(), - 'published' => strtotime('2007-02-27'), - 'copyright' => 'Common Creative', - 'image' => 'http://www.example/images/icon.png', - 'language' => 'en', - 'ttl' => 60, - 'rating' => ' (PICS-1.1 "http://www.gcf.org/v2.5" labels - on "1994.11.05T08:15-0500" - exp "1995.12.31T23:59-0000" - for "http://www.greatdocs.com/foo.html" - by "George Sanderson, Jr." - ratings (suds 0.5 density 0 color/hue 1))', - 'cloud' => array('domain' => 'rpc.sys.com', - 'path' => '/rpc', - 'registerProcedure' => 'webServices.pingMe', - 'protocol' => 'xml-rpc'), - 'textInput' => array('title' => 'subscribe', - 'description' => 'enter your email address to subscribe by mail', - 'name' => 'email', - 'link' => 'http://www.example.com/subscribe'), - 'skipHours' => array(1, 13, 17), - 'skipDays' => array('Saturday', 'Sunday'), - 'itunes' => array('block' => 'no', - 'keywords' => 'example,itunes,podcast', - 'category' => array(array('main' => 'Technology', - 'sub' => 'Gadgets'), - array('main' => 'Music'))), - 'entries' => array(array('guid' => time(), - 'title' => 'First article', - 'link' => 'http://www.example.com', - 'description' => 'First article description', - 'content' => 'First article content', - 'lastUpdate' => time(), - 'comments' => 'http://www.example.com/#comments', - 'commentRss' => 'http://www.example.com/comments.xml', - 'source' => array('title' => 'Original title', - 'url' => 'http://www.domain.com'), - 'category' => array(array('term' => 'test category', - 'scheme' => 'http://www.example.com/scheme'), - array('term' => 'another category') - ), - 'enclosure' => array(array('url' => 'http://www.example.com/podcast.mp3', - 'type' => 'audio/mpeg', - 'length' => '12216320' - ), - array('url' => 'http://www.example.com/podcast2.mp3', - 'type' => 'audio/mpeg', - 'length' => '1221632' - ) - ) - ), - array('title' => 'Second article', - 'link' => 'http://www.example.com/two', - 'description' => 'Second article description', - 'content' => 'Second article content', - 'lastUpdate' => time(), - 'comments' => 'http://www.example.com/two/#comments', - 'category' => array(array('term' => 'test category')), - ) - ) - ); - return $array; - } - - /** - * Import an invalid atom feed - */ - protected function _importAtomValid($filename) - { - $response = new Zend_Http_Response(200, array(), file_get_contents("$this->_feedDir/$filename")); - $this->_adapter->setResponse($response); - - $feed = Zend_Feed::import('http://localhost'); - $this->assertTrue($feed instanceof Zend_Feed_Atom); - } - - /** - * Import a valid rss feed - */ - protected function _importRssValid($filename) - { - $response = new Zend_Http_Response(200, array(), file_get_contents("$this->_feedDir/$filename")); - $this->_adapter->setResponse($response); - - $feed = Zend_Feed::import('http://localhost'); - $this->assertTrue($feed instanceof Zend_Feed_Rss); - return $feed; - } - - /** - * Imports an invalid feed - */ - protected function _importInvalid($filename) - { - $response = new Zend_Http_Response(200, array(), file_get_contents("$this->_feedDir/$filename")); - $this->_adapter->setResponse($response); - - try { - $feed = Zend_Feed::import('http://localhost'); - $this->fail('Expected Zend_Feed_Exception not thrown'); - } catch (Zend_Feed_Exception $e) { - $this->assertTrue($e instanceof Zend_Feed_Exception); - } - } - - /** - * @group ZF-5903 - */ - public function testFindFeedsIncludesUriAsArrayKey() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testFindFeedsIncludesUriAsArrayKey() requires a network connection'); - return; - } - Zend_Feed::setHttpClient(new Zend_Http_Client); - $feeds = Zend_Feed::findFeeds('http://www.planet-php.net'); - $this->assertEquals(array( - 'http://www.planet-php.org:80/rss/', 'http://www.planet-php.org:80/rdf/' - ), array_keys($feeds)); - } -} diff --git a/tests/Zend/Feed/IteratorTest.php b/tests/Zend/Feed/IteratorTest.php deleted file mode 100644 index 8fdf2403a4..0000000000 --- a/tests/Zend/Feed/IteratorTest.php +++ /dev/null @@ -1,123 +0,0 @@ -_feed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeed.xml'); - $this->_nsfeed = Zend_Feed::importFile(dirname(__FILE__) . '/_files/TestAtomFeedNamespaced.xml'); - } - - public function testRewind() - { - $times = 0; - foreach ($this->_feed as $f) { - ++$times; - } - - $times2 = 0; - foreach ($this->_feed as $f) { - ++$times2; - } - - $this->assertEquals($times, $times2, 'Feed should have the same number of iterations multiple times through'); - - $times = 0; - foreach ($this->_nsfeed as $f) { - ++$times; - } - - $times2 = 0; - foreach ($this->_nsfeed as $f) { - ++$times2; - } - - $this->assertEquals($times, $times2, 'Feed should have the same number of iterations multiple times through'); - } - - public function testCurrent() - { - foreach ($this->_feed as $f) { - $this->assertTrue( - $f instanceof Zend_Feed_Entry_Atom, - 'Each feed entry should be an instance of Zend_Feed_Entry_Atom' - ); - break; - } - - foreach ($this->_nsfeed as $f) { - $this->assertTrue( - $f instanceof Zend_Feed_Entry_Atom, - 'Each feed entry should be an instance of Zend_Feed_Entry_Atom' - ); - break; - } - } - - public function testKey() - { - $keys = array(); - foreach ($this->_feed as $k => $f) { - $keys[] = $k; - } - $this->assertEquals($keys, array(0, 1), 'Feed should have keys 0 and 1'); - - $keys = array(); - foreach ($this->_nsfeed as $k => $f) { - $keys[] = $k; - } - $this->assertEquals($keys, array(0, 1), 'Feed should have keys 0 and 1'); - } - - public function testNext() - { - $last = null; - foreach ($this->_feed as $current) { - $this->assertFalse($last === $current, 'Iteration should produce a new object each entry'); - $last = $current; - } - - $last = null; - foreach ($this->_nsfeed as $current) { - $this->assertFalse($last === $current, 'Iteration should produce a new object each entry'); - $last = $current; - } - } - -} diff --git a/tests/Zend/Feed/Pubsubhubbub/AllTests.php b/tests/Zend/Feed/Pubsubhubbub/AllTests.php deleted file mode 100644 index 46e40c9fc9..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/AllTests.php +++ /dev/null @@ -1,67 +0,0 @@ -addTestSuite('Zend_Feed_Pubsubhubbub_PubsubhubbubTest'); - $suite->addTestSuite('Zend_Feed_Pubsubhubbub_PublisherTest'); - $suite->addTestSuite('Zend_Feed_Pubsubhubbub_SubscriberTest'); - $suite->addTestSuite('Zend_Feed_Pubsubhubbub_SubscriberHttpTest'); - $suite->addTest(Zend_Feed_Pubsubhubbub_Model_AllTests::suite()); - $suite->addTestSuite('Zend_Feed_Pubsubhubbub_Subscriber_CallbackTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Feed_Pubsubhubbub_AllTests::main') { - Zend_Feed_Pubsubhubbub_AllTests::main(); -} diff --git a/tests/Zend/Feed/Pubsubhubbub/Model/AllTests.php b/tests/Zend/Feed/Pubsubhubbub/Model/AllTests.php deleted file mode 100644 index 5952ac08f2..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/Model/AllTests.php +++ /dev/null @@ -1,54 +0,0 @@ -addTestSuite('Zend_Feed_Pubsubhubbub_Model_SubscriptionTest'); - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Feed_Pubsubhubbub_Model_AllTests::main') { - Zend_Feed_Pubsubhubbub_AllTests::main(); -} diff --git a/tests/Zend/Feed/Pubsubhubbub/Model/SubscriptionTest.php b/tests/Zend/Feed/Pubsubhubbub/Model/SubscriptionTest.php deleted file mode 100644 index 27603a1027..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/Model/SubscriptionTest.php +++ /dev/null @@ -1,99 +0,0 @@ -_initDb(); - $subscription = new Zend_Feed_Pubsubhubbub_Model_Subscription(); - $id = uniqid(); - $this->assertFalse($subscription->hasSubscription($id)); - $this->assertFalse($subscription->getSubscription($id)); - $this->assertFalse($subscription->deleteSubscription($id)); - $this->assertTrue($subscription->setSubscription(array('id' => $id))); - - $this->assertTrue($subscription->hasSubscription($id)); - $dataSubscription = $subscription->getSubscription($id); - $this->assertTrue(is_array($dataSubscription)); - $keys = array('id', 'topic_url', 'hub_url', - 'created_time', 'lease_seconds', - 'verify_token', 'secret', - 'expiration_time', 'subscription_state'); - - $this->assertSame($keys, array_keys($dataSubscription)); - $this->assertFalse($subscription->setSubscription(array('id' => $id))); - $this->assertTrue($subscription->deleteSubscription($id)); - } - - public function testImpemetsSubscriptionInterface() - { - $reflection = new ReflectionClass('Zend_Feed_Pubsubhubbub_Model_Subscription'); - $this->assertTrue($reflection->implementsInterface('Zend_Feed_Pubsubhubbub_Model_SubscriptionInterface')); - unset($reflection); - } - - protected function _initDb() - { - if (!extension_loaded('pdo')) { - $this->markTestSkipped("extension 'PDO' is not loaded"); - } - - if (!in_array('sqlite', PDO::getAvailableDrivers())) { - $this->markTestSkipped("PDO driver 'sqlite' is not available"); - } - - $db = Zend_Db::factory('Pdo_Sqlite', array('dbname' => ':memory:')); - Zend_Db_Table::setDefaultAdapter($db); - $this->_createTable(); - } - - protected function _createTable() - { - $sql = "CREATE TABLE subscription (" - . "id varchar(32) NOT NULL DEFAULT '', " - . "topic_url varchar(255) DEFAULT NULL, " - . "hub_url varchar(255) DEFAULT NULL, " - . "created_time datetime DEFAULT NULL, " - . "lease_seconds bigint(20) DEFAULT NULL, " - . "verify_token varchar(255) DEFAULT NULL, " - . "secret varchar(255) DEFAULT NULL, " - . "expiration_time datetime DEFAULT NULL, " - . "subscription_state varchar(12) DEFAULT NULL, " - . "PRIMARY KEY (id) " - . ");"; - - Zend_Db_Table::getDefaultAdapter()->getConnection()->query($sql); - } -} diff --git a/tests/Zend/Feed/Pubsubhubbub/PublisherTest.php b/tests/Zend/Feed/Pubsubhubbub/PublisherTest.php deleted file mode 100644 index 801afbd519..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/PublisherTest.php +++ /dev/null @@ -1,322 +0,0 @@ -_publisher = new Zend_Feed_Pubsubhubbub_Publisher; - } - - public function testAddsHubServerUrl() - { - $this->_publisher->addHubUrl('http://www.example.com/hub'); - $this->assertEquals(array('http://www.example.com/hub'), $this->_publisher->getHubUrls()); - } - - public function testAddsHubServerUrlsFromArray() - { - $this->_publisher->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - )); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_publisher->getHubUrls()); - } - - public function testAddsHubServerUrlsFromArrayUsingSetConfig() - { - $this->_publisher->setConfig(array('hubUrls' => array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ))); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_publisher->getHubUrls()); - } - - public function testRemovesHubServerUrl() - { - $this->_publisher->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - )); - $this->_publisher->removeHubUrl('http://www.example.com/hub'); - $this->assertEquals(array( - 1 => 'http://www.example.com/hub2' - ), $this->_publisher->getHubUrls()); - } - - public function testRetrievesUniqueHubServerUrlsOnly() - { - $this->_publisher->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2', - 'http://www.example.com/hub' - )); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_publisher->getHubUrls()); - } - - public function testThrowsExceptionOnSettingEmptyHubServerUrl() - { - try { - $this->_publisher->addHubUrl(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingNonStringHubServerUrl() - { - try { - $this->_publisher->addHubUrl(123); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingInvalidHubServerUrl() - { - try { - $this->_publisher->addHubUrl('http://'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testAddsUpdatedTopicUrl() - { - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic'); - $this->assertEquals(array('http://www.example.com/topic'), $this->_publisher->getUpdatedTopicUrls()); - } - - public function testAddsUpdatedTopicUrlsFromArray() - { - $this->_publisher->addUpdatedTopicUrls(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - )); - $this->assertEquals(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - ), $this->_publisher->getUpdatedTopicUrls()); - } - - public function testAddsUpdatedTopicUrlsFromArrayUsingSetConfig() - { - $this->_publisher->setConfig(array('updatedTopicUrls' => array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - ))); - $this->assertEquals(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - ), $this->_publisher->getUpdatedTopicUrls()); - } - - public function testRemovesUpdatedTopicUrl() - { - $this->_publisher->addUpdatedTopicUrls(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - )); - $this->_publisher->removeUpdatedTopicUrl('http://www.example.com/topic'); - $this->assertEquals(array( - 1 => 'http://www.example.com/topic2' - ), $this->_publisher->getUpdatedTopicUrls()); - } - - public function testRetrievesUniqueUpdatedTopicUrlsOnly() - { - $this->_publisher->addUpdatedTopicUrls(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2', - 'http://www.example.com/topic' - )); - $this->assertEquals(array( - 'http://www.example.com/topic', 'http://www.example.com/topic2' - ), $this->_publisher->getUpdatedTopicUrls()); - } - - public function testThrowsExceptionOnSettingEmptyUpdatedTopicUrl() - { - try { - $this->_publisher->addUpdatedTopicUrl(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingNonStringUpdatedTopicUrl() - { - try { - $this->_publisher->addUpdatedTopicUrl(123); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingInvalidUpdatedTopicUrl() - { - try { - $this->_publisher->addUpdatedTopicUrl('http://'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testAddsParameter() - { - $this->_publisher->setParameter('foo', 'bar'); - $this->assertEquals(array('foo'=>'bar'), $this->_publisher->getParameters()); - } - - public function testAddsParametersFromArray() - { - $this->_publisher->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_publisher->getParameters()); - } - - public function testAddsParametersFromArrayInSingleMethod() - { - $this->_publisher->setParameter(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_publisher->getParameters()); - } - - public function testAddsParametersFromArrayUsingSetConfig() - { - $this->_publisher->setConfig(array('parameters' => array( - 'foo' => 'bar', 'boo' => 'baz' - ))); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_publisher->getParameters()); - } - - public function testRemovesParameter() - { - $this->_publisher->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->_publisher->removeParameter('boo'); - $this->assertEquals(array( - 'foo' => 'bar' - ), $this->_publisher->getParameters()); - } - - public function testRemovesParameterIfSetToNull() - { - $this->_publisher->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->_publisher->setParameter('boo', null); - $this->assertEquals(array( - 'foo' => 'bar' - ), $this->_publisher->getParameters()); - } - - public function testNotifiesHubWithCorrectParameters() - { - Zend_Feed_Pubsubhubbub::setHttpClient(new Zend_Feed_Pubsubhubbub_PublisherTest_ClientSuccess); - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $this->_publisher->addHubUrl('http://www.example.com/hub'); - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic'); - $this->_publisher->setParameter('foo', 'bar'); - $this->_publisher->notifyAll(); - $this->assertEquals('hub.mode=publish&hub.url=http%3A%2F%2Fwww.example.com%2Ftopic&foo=bar', $client->getBody()); - } - - public function testNotifiesHubWithCorrectParametersAndMultipleTopics() - { - Zend_Feed_Pubsubhubbub::setHttpClient(new Zend_Feed_Pubsubhubbub_PublisherTest_ClientSuccess); - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $this->_publisher->addHubUrl('http://www.example.com/hub'); - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic'); - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic2'); - $this->_publisher->notifyAll(); - $this->assertEquals('hub.mode=publish&hub.url=http%3A%2F%2Fwww.example.com%2Ftopic&hub.url=http%3A%2F%2Fwww.example.com%2Ftopic2', $client->getBody()); - } - - public function testNotifiesHubAndReportsSuccess() - { - Zend_Feed_Pubsubhubbub::setHttpClient(new Zend_Feed_Pubsubhubbub_PublisherTest_ClientSuccess); - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $this->_publisher->addHubUrl('http://www.example.com/hub'); - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic'); - $this->_publisher->setParameter('foo', 'bar'); - $this->_publisher->notifyAll(); - $this->assertTrue($this->_publisher->isSuccess()); - } - - public function testNotifiesHubAndReportsFail() - { - Zend_Feed_Pubsubhubbub::setHttpClient(new Zend_Feed_Pubsubhubbub_PublisherTest_ClientFail); - $client = Zend_Feed_Pubsubhubbub::getHttpClient(); - $this->_publisher->addHubUrl('http://www.example.com/hub'); - $this->_publisher->addUpdatedTopicUrl('http://www.example.com/topic'); - $this->_publisher->setParameter('foo', 'bar'); - $this->_publisher->notifyAll(); - $this->assertFalse($this->_publisher->isSuccess()); - } - -} - -// Some stubs for what Http_Client would be doing - -class Zend_Feed_Pubsubhubbub_PublisherTest_ClientSuccess extends Zend_Http_Client -{ - public function request($method = null) { - $response = new Zend_Feed_Pubsubhubbub_PublisherTest_ResponseSuccess; - return $response; - } - public function getBody(){return $this->_prepareBody();} -} -class Zend_Feed_Pubsubhubbub_PublisherTest_ClientFail extends Zend_Http_Client -{ - public function request($method = null) { - $response = new Zend_Feed_Pubsubhubbub_PublisherTest_ResponseFail; - return $response; - } - public function getBody(){return $this->_prepareBody();} -} -class Zend_Feed_Pubsubhubbub_PublisherTest_ResponseSuccess -{ - public function getStatus(){return 204;} -} -class Zend_Feed_Pubsubhubbub_PublisherTest_ResponseFail -{ - public function getStatus(){return 404;} -} diff --git a/tests/Zend/Feed/Pubsubhubbub/PubsubhubbubTest.php b/tests/Zend/Feed/Pubsubhubbub/PubsubhubbubTest.php deleted file mode 100644 index 709272abf6..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/PubsubhubbubTest.php +++ /dev/null @@ -1,59 +0,0 @@ -assertTrue( - Zend_Feed_Pubsubhubbub::getHttpClient() instanceof Test_Http_Client_Pubsub - ); - } - - public function testCanDetectHubs() - { - $feed = Zend_Feed_Reader::importFile(dirname(__FILE__) . '/_files/rss20.xml'); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), Zend_Feed_Pubsubhubbub::detectHubs($feed)); - } - -} - -class Test_Http_Client_Pubsub extends Zend_Http_Client {} diff --git a/tests/Zend/Feed/Pubsubhubbub/Subscriber/CallbackTest.php b/tests/Zend/Feed/Pubsubhubbub/Subscriber/CallbackTest.php deleted file mode 100644 index b5f65cbec2..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/Subscriber/CallbackTest.php +++ /dev/null @@ -1,544 +0,0 @@ -_callback = new Zend_Feed_Pubsubhubbub_Subscriber_Callback; - - $this->_adapter = $this->_getCleanMock( - 'Zend_Db_Adapter_Abstract' - ); - $this->_tableGateway = $this->_getCleanMock( - 'Zend_Db_Table_Abstract' - ); - $this->_rowset = $this->_getCleanMock( - 'Zend_Db_Table_Rowset_Abstract' - ); - - $this->_tableGateway->expects($this->any())->method('getAdapter') - ->will($this->returnValue($this->_adapter)); - $storage = new Zend_Feed_Pubsubhubbub_Model_Subscription($this->_tableGateway); - $this->_callback->setStorage($storage); - - $this->_get = array( - 'hub_mode' => 'subscribe', - 'hub_topic' => 'http://www.example.com/topic', - 'hub_challenge' => 'abc', - 'hub_verify_token' => 'cba', - 'hub_mode' => 'subscribe', - 'hub_lease_seconds' => '1234567' - ); - - $this->_originalServer = $_SERVER; - $_SERVER['REQUEST_METHOD'] = 'get'; - $_SERVER['QUERY_STRING'] = 'xhub.subscription=verifytokenkey'; - } - - public function tearDown() - { - $_SERVER = $this->_originalServer; - } - - - public function testCanSetHttpResponseObject() - { - $this->_callback->setHttpResponse(new Zend_Feed_Pubsubhubbub_HttpResponse); - $this->assertTrue($this->_callback->getHttpResponse() instanceof Zend_Feed_Pubsubhubbub_HttpResponse); - } - - public function testCanUsesDefaultHttpResponseObject() - { - $this->assertTrue($this->_callback->getHttpResponse() instanceof Zend_Feed_Pubsubhubbub_HttpResponse); - } - - public function testThrowsExceptionOnInvalidHttpResponseObjectSet() - { - try { - $this->_callback->setHttpResponse(new stdClass); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionIfNonObjectSetAsHttpResponseObject() - { - try { - $this->_callback->setHttpResponse(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testCanSetSubscriberCount() - { - $this->_callback->setSubscriberCount('10000'); - $this->assertEquals(10000, $this->_callback->getSubscriberCount()); - } - - public function testDefaultSubscriberCountIsOne() - { - $this->assertEquals(1, $this->_callback->getSubscriberCount()); - } - - public function testThrowsExceptionOnSettingZeroAsSubscriberCount() - { - try { - $this->_callback->setSubscriberCount(0); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingLessThanZeroAsSubscriberCount() - { - try { - $this->_callback->setSubscriberCount(-1); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingAnyScalarTypeCastToAZeroOrLessIntegerAsSubscriberCount() - { - try { - $this->_callback->setSubscriberCount('0aa'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testCanSetStorageImplementation() - { - $storage = new Zend_Feed_Pubsubhubbub_Model_Subscription($this->_tableGateway); - $this->_callback->setStorage($storage); - $this->assertThat($this->_callback->getStorage(), $this->identicalTo($storage)); - } - - public function testValidatesValidHttpGetData() - { - - $mockReturnValue = $this->getMock('Result', array('toArray')); - $mockReturnValue->expects($this->any())->method('toArray')->will($this->returnValue(array( - 'verify_token' => hash('sha256', 'cba') - ))); - - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($mockReturnValue)); - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->assertTrue($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfHubVerificationNotAGetRequest() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfModeMissingFromHttpGetData() - { - unset($this->_get['hub_mode']); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfTopicMissingFromHttpGetData() - { - unset($this->_get['hub_topic']); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfChallengeMissingFromHttpGetData() - { - unset($this->_get['hub_challenge']); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfVerifyTokenMissingFromHttpGetData() - { - unset($this->_get['hub_verify_token']); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsTrueIfModeSetAsUnsubscribeFromHttpGetData() - { - - $mockReturnValue = $this->getMock('Result', array('toArray')); - $mockReturnValue->expects($this->any())->method('toArray')->will($this->returnValue(array( - 'verify_token' => hash('sha256', 'cba') - ))); - - $this->_get['hub_mode'] = 'unsubscribe'; - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($mockReturnValue)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->assertTrue($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfModeNotRecognisedFromHttpGetData() - { - $this->_get['hub_mode'] = 'abc'; - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfLeaseSecondsMissedWhenModeIsSubscribeFromHttpGetData() - { - unset($this->_get['hub_lease_seconds']); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfHubTopicInvalidFromHttpGetData() - { - $this->_get['hub_topic'] = 'http://'; - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfVerifyTokenRecordDoesNotExistForConfirmRequest() - { - //$this->_callback->setStorage(new Zend_Feed_Pubsubhubbub_Subscriber_CallbackTestStorageHasNot); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testReturnsFalseIfVerifyTokenRecordDoesNotAgreeWithConfirmRequest() - { - //$this->_callback->setStorage(new Zend_Feed_Pubsubhubbub_Subscriber_CallbackTestStorageHasButWrong); - $this->assertFalse($this->_callback->isValidHubVerification($this->_get)); - } - - public function testRespondsToInvalidConfirmationWith404Response() - { - unset($this->_get['hub_mode']); - $this->_callback->handle($this->_get); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 404); - } - - public function testRespondsToValidConfirmationWith200Response() - { - if (getenv('TRAVIS')) { - $this->markTestSkipped( - 'Test randomly fail on Travis CI.' - ); - } - - $this->_get['hub_mode'] = 'unsubscribe'; - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - - $t = new Zend_Date; - $rowdata = array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba'), - 'created_time' => $t->get(Zend_Date::TIMESTAMP), - 'lease_seconds' => 10000 - ); - - $row = new Zend_Db_Table_Row(array('data' => $rowdata)); - - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($row)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->_tableGateway->expects($this->once()) - ->method('update') - ->with( - $this->equalTo(array('id'=>'verifytokenkey','verify_token'=>hash('sha256', 'cba'),'created_time'=>$t->get(Zend_Date::TIMESTAMP),'lease_seconds'=>1234567,'subscription_state'=>'verified','expiration_time'=>$t->add(1234567,Zend_Date::SECOND)->get('yyyy-MM-dd HH:mm:ss'))), - $this->equalTo('id = \'verifytokenkey\'') - ); - $this->_adapter->expects($this->once()) - ->method('quoteInto') - ->with($this->equalTo('id = ?'), $this->equalTo('verifytokenkey')) - ->will($this->returnValue('id = \'verifytokenkey\'')); - - $this->_callback->handle($this->_get); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 200); - } - - public function testRespondsToValidConfirmationWithBodyContainingHubChallenge() - { - if (getenv('TRAVIS')) { - $this->markTestSkipped( - 'Test randomly fail on Travis CI.' - ); - } - - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - - $t = new Zend_Date; - $rowdata = array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba'), - 'created_time' => $t->get(Zend_Date::TIMESTAMP), - 'lease_seconds' => 10000 - ); - - $row = new Zend_Db_Table_Row(array('data' => $rowdata)); - - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($row)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->_tableGateway->expects($this->once()) - ->method('update') - ->with( - $this->equalTo(array('id'=>'verifytokenkey','verify_token'=>hash('sha256', 'cba'),'created_time'=>$t->get(Zend_Date::TIMESTAMP),'lease_seconds'=>1234567,'subscription_state'=>'verified','expiration_time'=>$t->add(1234567,Zend_Date::SECOND)->get('yyyy-MM-dd HH:mm:ss'))), - $this->equalTo('id = \'verifytokenkey\'') - ); - $this->_adapter->expects($this->once()) - ->method('quoteInto') - ->with($this->equalTo('id = ?'), $this->equalTo('verifytokenkey')) - ->will($this->returnValue('id = \'verifytokenkey\'')); - $this->_callback->handle($this->_get); - $this->assertTrue($this->_callback->getHttpResponse()->getBody() == 'abc'); - } - - public function testRespondsToValidFeedUpdateRequestWith200Response() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['REQUEST_URI'] = '/some/path/callback/verifytokenkey'; - $_SERVER['CONTENT_TYPE'] = 'application/atom+xml'; - $feedXml = file_get_contents(dirname(__FILE__) . '/_files/atom10.xml'); - $GLOBALS['HTTP_RAW_POST_DATA'] = $feedXml; // dirty alternative to php://input - - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - - $t = new Zend_Date; - $rowdata = array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba'), - 'created_time' => time() - ); - - $row = new Zend_Db_Table_Row(array('data' => $rowdata)); - - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($row)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->_callback->handle(array()); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 200); - } - - public function testRespondsToInvalidFeedUpdateNotPostWith404Response() - { // yes, this example makes no sense for GET - I know!!! - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['REQUEST_URI'] = '/some/path/callback/verifytokenkey'; - $_SERVER['CONTENT_TYPE'] = 'application/atom+xml'; - $feedXml = file_get_contents(dirname(__FILE__) . '/_files/atom10.xml'); - $GLOBALS['HTTP_RAW_POST_DATA'] = $feedXml; - - $this->_callback->handle(array()); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 404); - } - - public function testRespondsToInvalidFeedUpdateWrongMimeWith404Response() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['REQUEST_URI'] = '/some/path/callback/verifytokenkey'; - $_SERVER['CONTENT_TYPE'] = 'application/kml+xml'; - $feedXml = file_get_contents(dirname(__FILE__) . '/_files/atom10.xml'); - $GLOBALS['HTTP_RAW_POST_DATA'] = $feedXml; - $this->_callback->handle(array()); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 404); - } - - /** - * As a judgement call, we must respond to any successful request, regardless - * of the wellformedness of any XML payload, by returning a 2xx response code. - * The validation of feeds and their processing must occur outside the Hubbub - * protocol. - */ - public function testRespondsToInvalidFeedUpdateWrongFeedTypeForMimeWith200Response() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['REQUEST_URI'] = '/some/path/callback/verifytokenkey'; - $_SERVER['CONTENT_TYPE'] = 'application/rss+xml'; - $feedXml = file_get_contents(dirname(__FILE__) . '/_files/atom10.xml'); - $GLOBALS['HTTP_RAW_POST_DATA'] = $feedXml; - - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - - $rowdata = array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba'), - 'created_time' => time(), - 'lease_seconds' => 10000 - ); - - $row = new Zend_Db_Table_Row(array('data' => $rowdata)); - - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($row)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->_callback->handle(array()); - $this->assertTrue($this->_callback->getHttpResponse()->getHttpResponseCode() == 200); - } - - public function testRespondsToValidFeedUpdateWithXHubOnBehalfOfHeader() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['REQUEST_URI'] = '/some/path/callback/verifytokenkey'; - $_SERVER['CONTENT_TYPE'] = 'application/atom+xml'; - $feedXml = file_get_contents(dirname(__FILE__) . '/_files/atom10.xml'); - $GLOBALS['HTTP_RAW_POST_DATA'] = $feedXml; - - $this->_tableGateway->expects($this->any()) - ->method('find') - ->with($this->equalTo('verifytokenkey')) - ->will($this->returnValue($this->_rowset)); - - $rowdata = array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba'), - 'created_time' => time(), - 'lease_seconds' => 10000 - ); - - $row = new Zend_Db_Table_Row(array('data' => $rowdata)); - - $this->_rowset->expects($this->any()) - ->method('current') - ->will($this->returnValue($row)); - // require for the count call on the rowset in Model/Subscription - $this->_rowset->expects($this->any()) - ->method('count') - ->will($this->returnValue(1)); - - $this->_callback->handle(array()); - $this->assertTrue($this->_callback->getHttpResponse()->getHeader('X-Hub-On-Behalf-Of') == 1); - } - - protected function _getCleanMock($className) { - $class = new ReflectionClass($className); - $methods = $class->getMethods(); - $stubMethods = array(); - foreach ($methods as $method) { - if ($method->isPublic() || ($method->isProtected() - && $method->isAbstract())) { - $stubMethods[] = $method->getName(); - } - } - $mocked = $this->getMock( - $className, - $stubMethods, - array(), - $className . '_PubsubSubscriberMock_' . uniqid(), - false - ); - return $mocked; - } - -} - -/** - * Stubs for storage access - * DEPRECATED -class Zend_Feed_Pubsubhubbub_Subscriber_CallbackTestStorageHas implements Zend_Feed_Pubsubhubbub_Storage_StorageInterface -{ - public function setSubscription($key, array $data){} - public function getSubscription($key){ - if ($key == 'verifytokenkey') { - return array( - 'id' => 'verifytokenkey', - 'verify_token' => hash('sha256', 'cba') - ); - } - } - public function hasSubscription($key){return true;} - public function removeSubscription($key){} - public function cleanup($type){} -} -class Zend_Feed_Pubsubhubbub_Subscriber_CallbackTestStorageHasNot implements Zend_Feed_Pubsubhubbub_Storage_StorageInterface -{ - public function setSubscription($key, array $data){} - public function getSubscription($key){} - public function hasSubscription($key){return false;} - public function removeSubscription($key){} - public function cleanup($type){} -} -class Zend_Feed_Pubsubhubbub_Subscriber_CallbackTestStorageHasButWrong implements Zend_Feed_Pubsubhubbub_Storage_StorageInterface -{ - public function setSubscription($key, array $data){} - public function getSubscription($key){return 'wrong';} - public function hasSubscription($key){return true;} - public function removeSubscription($key){} - public function cleanup($type){} -}*/ diff --git a/tests/Zend/Feed/Pubsubhubbub/Subscriber/_files/atom10.xml b/tests/Zend/Feed/Pubsubhubbub/Subscriber/_files/atom10.xml deleted file mode 100644 index 18683bf9a0..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/Subscriber/_files/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Pubsubhubbub/SubscriberHttpTest.php b/tests/Zend/Feed/Pubsubhubbub/SubscriberHttpTest.php deleted file mode 100644 index 32201f5fac..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/SubscriberHttpTest.php +++ /dev/null @@ -1,137 +0,0 @@ -_baseuri must point to a directory on a web server - * containing all the files under the _files directory. You should symlink - * or copy these files and set '_baseuri' properly using the constant in - * TestConfiguration.php (based on TestConfiguration.php.dist) - * - * You can also set the proper constant in your test configuration file to - * point to the right place. - * - * @category Zend - * @package Zend_Feed - * @subpackage UnitTests - * @group Zend_Feed - * @group Zend_Feed_Subsubhubbub - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Feed_Pubsubhubbub_SubscriberHttpTest extends PHPUnit_Framework_TestCase -{ - - protected $_subscriber = null; - - protected $_baseuri; - - protected $_client = null; - - protected $_adapter = null; - - protected $_config = array( - 'adapter' => 'Zend_Http_Client_Adapter_Socket' - ); - - public function setUp() - { - if (defined('TESTS_Zend_Feed_Pubsubhubbub_BASEURI') && - Zend_Uri_Http::check(TESTS_Zend_Feed_Pubsubhubbub_BASEURI)) { - $this->_baseuri = TESTS_Zend_Feed_Pubsubhubbub_BASEURI; - if (substr($this->_baseuri, -1) != '/') $this->_baseuri .= '/'; - $name = $this->getName(); - if (($pos = strpos($name, ' ')) !== false) { - $name = substr($name, 0, $pos); - } - $uri = $this->_baseuri . $name . '.php'; - $this->_adapter = new $this->_config['adapter']; - $this->_client = new Zend_Http_Client($uri, $this->_config); - $this->_client->setAdapter($this->_adapter); - Zend_Feed_Pubsubhubbub::setHttpClient($this->_client); - $this->_subscriber = new Zend_Feed_Pubsubhubbub_Subscriber; - - - $this->_storage = $this->_getCleanMock('Zend_Feed_Pubsubhubbub_Entity_TopicSubscription'); - $this->_subscriber->setStorage($this->_storage); - - } else { - // Skip tests - $this->markTestSkipped("Zend_Feed_Pubsubhubbub_Subscriber dynamic tests' - . ' are not enabled in TestConfiguration.php"); - } - } - - public function testSubscriptionRequestSendsExpectedPostData() - { - $this->_subscriber->setTopicUrl('http://www.example.com/topic'); - $this->_subscriber->addHubUrl($this->_baseuri . '/testRawPostData.php'); - $this->_subscriber->setCallbackUrl('http://www.example.com/callback'); - $this->_subscriber->setTestStaticToken('abc'); // override for testing - $this->_subscriber->subscribeAll(); - $this->assertEquals( - 'hub.callback=http%3A%2F%2Fwww.example.com%2Fcallback%3Fxhub.subscription%3D5536df06b5d' - .'cb966edab3a4c4d56213c16a8184b&hub.lease_seconds=2592000&hub.mode=' - .'subscribe&hub.topic=http%3A%2F%2Fwww.example.com%2Ftopic&hub.veri' - .'fy=sync&hub.verify=async&hub.verify_token=abc', - $this->_client->getLastResponse()->getBody()); - } - - public function testUnsubscriptionRequestSendsExpectedPostData() - { - $this->_subscriber->setTopicUrl('http://www.example.com/topic'); - $this->_subscriber->addHubUrl($this->_baseuri . '/testRawPostData.php'); - $this->_subscriber->setCallbackUrl('http://www.example.com/callback'); - $this->_subscriber->setTestStaticToken('abc'); //override for testing - $this->_subscriber->unsubscribeAll(); - $this->assertEquals( - 'hub.callback=http%3A%2F%2Fwww.example.com%2Fcallback%3Fxhub.subscription%3D5536df06b5d' - .'cb966edab3a4c4d56213c16a8184b&hub.mode=unsubscribe&hub.topic=http' - .'%3A%2F%2Fwww.example.com%2Ftopic&hub.verify=sync&hub.verify=async' - .'&hub.verify_token=abc', - $this->_client->getLastResponse()->getBody()); - } - - protected function _getCleanMock($className) { - $class = new ReflectionClass($className); - $methods = $class->getMethods(); - $stubMethods = array(); - foreach ($methods as $method) { - if ($method->isPublic() || ($method->isProtected() - && $method->isAbstract())) { - $stubMethods[] = $method->getName(); - } - } - $mocked = $this->getMock( - $className, - $stubMethods, - array(), - $className . '_SubscriberHttpTestMock_' . uniqid(), - false - ); - return $mocked; - } - -} diff --git a/tests/Zend/Feed/Pubsubhubbub/SubscriberTest.php b/tests/Zend/Feed/Pubsubhubbub/SubscriberTest.php deleted file mode 100644 index 638ce79971..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/SubscriberTest.php +++ /dev/null @@ -1,354 +0,0 @@ -_subscriber = new Zend_Feed_Pubsubhubbub_Subscriber; - $this->_adapter = $this->_getCleanMock( - 'Zend_Db_Adapter_Abstract' - ); - $this->_tableGateway = $this->_getCleanMock( - 'Zend_Db_Table_Abstract' - ); - $this->_tableGateway->expects($this->any())->method('getAdapter') - ->will($this->returnValue($this->_adapter)); - } - - - public function testAddsHubServerUrl() - { - $this->_subscriber->addHubUrl('http://www.example.com/hub'); - $this->assertEquals(array('http://www.example.com/hub'), $this->_subscriber->getHubUrls()); - } - - public function testAddsHubServerUrlsFromArray() - { - $this->_subscriber->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - )); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_subscriber->getHubUrls()); - } - - public function testAddsHubServerUrlsFromArrayUsingSetConfig() - { - $this->_subscriber->setConfig(array('hubUrls' => array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ))); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_subscriber->getHubUrls()); - } - - public function testRemovesHubServerUrl() - { - $this->_subscriber->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - )); - $this->_subscriber->removeHubUrl('http://www.example.com/hub'); - $this->assertEquals(array( - 1 => 'http://www.example.com/hub2' - ), $this->_subscriber->getHubUrls()); - } - - public function testRetrievesUniqueHubServerUrlsOnly() - { - $this->_subscriber->addHubUrls(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2', - 'http://www.example.com/hub' - )); - $this->assertEquals(array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ), $this->_subscriber->getHubUrls()); - } - - public function testThrowsExceptionOnSettingEmptyHubServerUrl() - { - try { - $this->_subscriber->addHubUrl(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingNonStringHubServerUrl() - { - try { - $this->_subscriber->addHubUrl(123); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingInvalidHubServerUrl() - { - try { - $this->_subscriber->addHubUrl('http://'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testAddsParameter() - { - $this->_subscriber->setParameter('foo', 'bar'); - $this->assertEquals(array('foo'=>'bar'), $this->_subscriber->getParameters()); - } - - public function testAddsParametersFromArray() - { - $this->_subscriber->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_subscriber->getParameters()); - } - - public function testAddsParametersFromArrayInSingleMethod() - { - $this->_subscriber->setParameter(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_subscriber->getParameters()); - } - - public function testAddsParametersFromArrayUsingSetConfig() - { - $this->_subscriber->setConfig(array('parameters' => array( - 'foo' => 'bar', 'boo' => 'baz' - ))); - $this->assertEquals(array( - 'foo' => 'bar', 'boo' => 'baz' - ), $this->_subscriber->getParameters()); - } - - public function testRemovesParameter() - { - $this->_subscriber->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->_subscriber->removeParameter('boo'); - $this->assertEquals(array( - 'foo' => 'bar' - ), $this->_subscriber->getParameters()); - } - - public function testRemovesParameterIfSetToNull() - { - $this->_subscriber->setParameters(array( - 'foo' => 'bar', 'boo' => 'baz' - )); - $this->_subscriber->setParameter('boo', null); - $this->assertEquals(array( - 'foo' => 'bar' - ), $this->_subscriber->getParameters()); - } - - public function testCanSetTopicUrl() - { - $this->_subscriber->setTopicUrl('http://www.example.com/topic'); - $this->assertEquals('http://www.example.com/topic', $this->_subscriber->getTopicUrl()); - } - - public function testThrowsExceptionOnSettingEmptyTopicUrl() - { - try { - $this->_subscriber->setTopicUrl(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingNonStringTopicUrl() - { - try { - $this->_subscriber->setTopicUrl(123); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingInvalidTopicUrl() - { - try { - $this->_subscriber->setTopicUrl('http://'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnMissingTopicUrl() - { - try { - $this->_subscriber->getTopicUrl(); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testCanSetCallbackUrl() - { - $this->_subscriber->setCallbackUrl('http://www.example.com/callback'); - $this->assertEquals('http://www.example.com/callback', $this->_subscriber->getCallbackUrl()); - } - - public function testThrowsExceptionOnSettingEmptyCallbackUrl() - { - try { - $this->_subscriber->setCallbackUrl(''); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingNonStringCallbackUrl() - { - try { - $this->_subscriber->setCallbackUrl(123); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - - public function testThrowsExceptionOnSettingInvalidCallbackUrl() - { - try { - $this->_subscriber->setCallbackUrl('http://'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnMissingCallbackUrl() - { - try { - $this->_subscriber->getCallbackUrl(); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testCanSetLeaseSeconds() - { - $this->_subscriber->setLeaseSeconds('10000'); - $this->assertEquals(10000, $this->_subscriber->getLeaseSeconds()); - } - - public function testThrowsExceptionOnSettingZeroAsLeaseSeconds() - { - try { - $this->_subscriber->setLeaseSeconds(0); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingLessThanZeroAsLeaseSeconds() - { - try { - $this->_subscriber->setLeaseSeconds(-1); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testThrowsExceptionOnSettingAnyScalarTypeCastToAZeroOrLessIntegerAsLeaseSeconds() - { - try { - $this->_subscriber->setLeaseSeconds('0aa'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testCanSetPreferredVerificationMode() - { - $this->_subscriber->setPreferredVerificationMode(Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC); - $this->assertEquals(Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_ASYNC, $this->_subscriber->getPreferredVerificationMode()); - } - - public function testSetsPreferredVerificationModeThrowsExceptionOnSettingBadMode() - { - try { - $this->_subscriber->setPreferredVerificationMode('abc'); - $this->fail('Should not fail as an Exception would be raised and caught'); - } catch (Zend_Feed_Pubsubhubbub_Exception $e) {} - } - - public function testPreferredVerificationModeDefaultsToSync() - { - $this->assertEquals(Zend_Feed_Pubsubhubbub::VERIFICATION_MODE_SYNC, $this->_subscriber->getPreferredVerificationMode()); - } - - public function testCanSetStorageImplementation() - { - $storage = new Zend_Feed_Pubsubhubbub_Model_Subscription($this->_tableGateway); - $this->_subscriber->setStorage($storage); - $this->assertThat($this->_subscriber->getStorage(), $this->identicalTo($storage)); - } - - /** - * @expectedException Zend_Feed_Pubsubhubbub_Exception - */ - public function testGetStorageThrowsExceptionIfNoneSet() - { - $this->_subscriber->getStorage(); - } - - protected function _getCleanMock($className) { - $class = new ReflectionClass($className); - $methods = $class->getMethods(); - $stubMethods = array(); - foreach ($methods as $method) { - if ($method->isPublic() || ($method->isProtected() - && $method->isAbstract())) { - $stubMethods[] = $method->getName(); - } - } - $mocked = $this->getMock( - $className, - $stubMethods, - array(), - $className . '_PubsubSubscriberMock_' . uniqid(), - false - ); - return $mocked; - } - -} diff --git a/tests/Zend/Feed/Pubsubhubbub/_files/rss20.xml b/tests/Zend/Feed/Pubsubhubbub/_files/rss20.xml deleted file mode 100644 index 80b98e124d..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/_files/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Pubsubhubbub/_files/testRawPostData.php b/tests/Zend/Feed/Pubsubhubbub/_files/testRawPostData.php deleted file mode 100644 index 990f73601e..0000000000 --- a/tests/Zend/Feed/Pubsubhubbub/_files/testRawPostData.php +++ /dev/null @@ -1,3 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/AtomStandaloneEntry'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - $this->_expectedCatsDc = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - public function testReaderImportOfAtomEntryDocumentReturnsEntryClass() - { - $object = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/id/atom10.xml') - ); - $this->assertTrue($object instanceof Zend_Feed_Reader_Entry_Atom); - } - - /** - * Get Id (Unencoded Text) - * @group ZFR002 - */ - public function testGetsIdFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/id/atom10.xml') - ); - $this->assertEquals('1', $entry->getId()); - } - - /** - * Get creation date (Unencoded Text) - * @group ZFR002 - */ - public function testGetsDateCreatedFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/atom10.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateCreated())); - } - - /** - * Get modification date (Unencoded Text) - * @group ZFR002 - */ - public function testGetsDateModifiedFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/atom10.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - /** - * Get Title (Unencoded Text) - * @group ZFR002 - */ - public function testGetsTitleFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/title/atom10.xml') - ); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - * @group ZFR002 - */ - public function testGetsAuthorsFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/atom10.xml') - ); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $this->assertEquals($authors, (array) $entry->getAuthors()); - } - - /** - * Get Author (Unencoded Text) - * @group ZFR002 - */ - public function testGetsAuthorFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/atom10.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $entry->getAuthor()); - } - - /** - * Get Description (Unencoded Text) - * @group ZFR002 - */ - public function testGetsDescriptionFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/description/atom10.xml') - ); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - /** - * Get enclosure - * @group ZFR002 - */ - public function testGetsEnclosureFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/enclosure/atom10.xml') - ); - - $expected = new stdClass(); - $expected->url = 'http://www.example.org/myaudiofile.mp3'; - $expected->length = '1234'; - $expected->type = 'audio/mpeg'; - - $this->assertEquals($expected, $entry->getEnclosure()); - } - - /** - * TEXT - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/atom10.xml') - ); - $this->assertEquals('Entry Content &', $entry->getContent()); - } - - /** - * HTML Escaped - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10Html() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/atom10_Html.xml') - ); - $this->assertEquals('

Entry Content &

', $entry->getContent()); - } - - /** - * HTML CDATA Escaped - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10HtmlCdata() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/atom10_HtmlCdata.xml') - ); - $this->assertEquals('

Entry Content &

', $entry->getContent()); - } - - /** - * XHTML - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10XhtmlNamespaced() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/atom10_Xhtml.xml') - ); - $this->assertEquals('

Entry Content &x:

', $entry->getContent()); - } - - /** - * Get Link (Unencoded Text) - * @group ZFR002 - */ - public function testGetsLinkFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/link/atom10.xml') - ); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - /** - * Get Comment HTML Link - * @group ZFR002 - */ - public function testGetsCommentLinkFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/commentlink/atom10.xml') - ); - $this->assertEquals('http://www.example.com/entry/comments', $entry->getCommentLink()); - } - - /** - * Get category data - * @group ZFR002 - */ - public function testGetsCategoriesFromAtom10() - { - $entry = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/atom10.xml') - ); - $this->assertEquals($this->_expectedCats, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - -} diff --git a/tests/Zend/Feed/Reader/Entry/AtomTest.php b/tests/Zend/Feed/Reader/Entry/AtomTest.php deleted file mode 100644 index aaed04ea18..0000000000 --- a/tests/Zend/Feed/Reader/Entry/AtomTest.php +++ /dev/null @@ -1,527 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Atom'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - $this->_expectedCatsDc = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Get Id (Unencoded Text) - * @group ZFR003 - */ - public function testGetsIdFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/id/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('1', $entry->getId()); - } - - public function testGetsIdFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/id/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('1', $entry->getId()); - } - - /** - * Get creation date (Unencoded Text) - */ - public function testGetsDateCreatedFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/plain/atom03.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateCreated())); - } - - public function testGetsDateCreatedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/plain/atom10.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateCreated())); - } - - /** - * Get modification date (Unencoded Text) - */ - public function testGetsDateModifiedFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/plain/atom03.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/plain/atom10.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - /** - * Get Title (Unencoded Text) - */ - public function testGetsTitleFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/title/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/title/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - */ - public function testGetsAuthorsFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/plain/atom03.xml') - ); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $entry = $feed->current(); - $this->assertEquals($authors, (array) $entry->getAuthors()); - } - - public function testGetsAuthorsFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/plain/atom10.xml') - ); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $entry = $feed->current(); - $this->assertEquals($authors, (array) $entry->getAuthors()); - } - - /** - * Get Author (Unencoded Text) - */ - public function testGetsAuthorFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $entry->getAuthor()); - } - - public function testGetsAuthorFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/author/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $entry->getAuthor()); - } - - /** - * Get Description (Unencoded Text) - */ - public function testGetsDescriptionFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/description/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/description/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - /** - * Get enclosure - */ - public function testGetsEnclosureFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/enclosure/plain/atom03.xml') - ); - $entry = $feed->current(); - - $expected = new stdClass(); - $expected->url = 'http://www.example.org/myaudiofile.mp3'; - $expected->length = '1234'; - $expected->type = 'audio/mpeg'; - - $this->assertEquals($expected, $entry->getEnclosure()); - } - - public function testGetsEnclosureFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/enclosure/plain/atom10.xml') - ); - $entry = $feed->current(); - - $expected = new stdClass(); - $expected->url = 'http://www.example.org/myaudiofile.mp3'; - $expected->length = '1234'; - $expected->type = 'audio/mpeg'; - - $this->assertEquals($expected, $entry->getEnclosure()); - } - - /** - * Get Content (Unencoded Text) - */ - public function testGetsContentFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - /** - * TEXT - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content &', $entry->getContent()); - } - - /** - * HTML Escaped - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10Html() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/plain/atom10_Html.xml') - ); - $entry = $feed->current(); - $this->assertEquals('

Entry Content &

', $entry->getContent()); - } - - /** - * HTML CDATA Escaped - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10HtmlCdata() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/plain/atom10_HtmlCdata.xml') - ); - $entry = $feed->current(); - $this->assertEquals('

Entry Content &

', $entry->getContent()); - } - - /** - * XHTML - * @group ZFRATOMCONTENT - */ - public function testGetsContentFromAtom10XhtmlNamespaced() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/content/plain/atom10_Xhtml.xml') - ); - $entry = $feed->current(); - $this->assertEquals('

Entry Content &x:

', $entry->getContent()); - } - - /** - * Get Link (Unencoded Text) - */ - public function testGetsLinkFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/link/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/link/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromAtom10_WithNoRelAttribute() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/link/plain/atom10-norel.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromAtom10_WithRelativeUrl() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/link/plain/atom10-relative.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - /** - * Get Base Uri - */ - public function testGetsBaseUriFromAtom10_FromFeedElement() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/baseurl/plain/atom10-feedlevel.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com', $entry->getBaseUrl()); - } - - public function testGetsBaseUriFromAtom10_FromEntryElement() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/baseurl/plain/atom10-entrylevel.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/', $entry->getBaseUrl()); - } - - /** - * Get Comment HTML Link - */ - public function testGetsCommentLinkFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/commentlink/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/commentlink/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromAtom10_RelativeLinks() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/commentlink/plain/atom10-relative.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/comments', $entry->getCommentLink()); - } - - /** - * Get category data - */ - - // Atom 1.0 (Atom 0.3 never supported categories except via Atom 1.0/Dublin Core extensions) - - public function testGetsCategoriesFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCats, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_Atom10Extension() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCats, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - // DC 1.0/1.1 for Atom 0.3 - - public function testGetsCategoriesFromAtom03_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsDc, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsDc, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - // No Categories In Entry - - public function testGetsCategoriesFromAtom10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/atom10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/atom03.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - -} diff --git a/tests/Zend/Feed/Reader/Entry/CommonTest.php b/tests/Zend/Feed/Reader/Entry/CommonTest.php deleted file mode 100644 index 134e002c2c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/CommonTest.php +++ /dev/null @@ -1,140 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Common'; - } - - /** - * Check DOM Retrieval and Information Methods - */ - public function testGetsDomDocumentObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertTrue($entry->getDomDocument() instanceof DOMDocument); - } - - public function testGetsDomXpathObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertTrue($entry->getXpath() instanceof DOMXPath); - } - - public function testGetsXpathPrefixString() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertEquals('//atom:entry[1]', $entry->getXpathPrefix()); - } - - public function testGetsDomElementObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertTrue($entry->getElement() instanceof DOMElement); - } - - public function testSaveXmlOutputsXmlStringForEntry() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertEquals($entry->saveXml(), file_get_contents($this->_feedSamplePath.'/atom_rewrittenbydom.xml')); - } - - public function testGetsNamedExtension() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertTrue($entry->getExtension('Atom') instanceof Zend_Feed_Reader_Extension_Atom_Entry); - } - - public function testReturnsNullIfExtensionDoesNotExist() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getExtension('Foo')); - } - - /** - * @group ZF-8213 - */ - public function testReturnsEncodingOfFeed() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - - /** - * @group ZF-8213 - */ - public function testReturnsEncodingOfFeedAsUtf8IfUndefined() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom_noencodingdefined.xml') - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - - -} diff --git a/tests/Zend/Feed/Reader/Entry/RssTest.php b/tests/Zend/Feed/Reader/Entry/RssTest.php deleted file mode 100644 index e2c87a9aee..0000000000 --- a/tests/Zend/Feed/Reader/Entry/RssTest.php +++ /dev/null @@ -1,3071 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Rss'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic2' - ) - ); - $this->_expectedCatsRdf = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - $this->_expectedCatsAtom = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Get Id (Unencoded Text) - */ - public function testGetsIdFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - // DC 1.0 - - public function testGetsIdFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - // DC 1.1 - - public function testGetsIdFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - public function testGetsIdFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getId()); - } - - // Missing Id (but alternates to Title) - - public function testGetsIdFromRss20_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss094_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss093_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss092_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss091_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss10_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - public function testGetsIdFromRss090_Title() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/title/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getId()); - } - - // Missing Any Id - - public function testGetsIdFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - public function testGetsIdFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getId()); - } - - /** - * Get Title (Unencoded Text) - */ - public function testGetsTitleFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - // DC 1.0 - - public function testGetsTitleFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - // DC 1.1 - - public function testGetsTitleFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - public function testGetsTitleFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Title', $entry->getTitle()); - } - - // Missing Title - - public function testGetsTitleFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - public function testGetsTitleFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - */ - public function testGetsAuthorsFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - // DC 1.0 - - public function testGetsAuthorsFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - // DC 1.1 - - public function testGetsAuthorsFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - public function testGetsAuthorsFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $entry->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $entry->getAuthors()->getValues()); - } - - // Missing Author - - public function testGetsAuthorsFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - public function testGetsAuthorsFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthors()); - } - - - /** - * Get Author (Unencoded Text) - */ - public function testGetsAuthorFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - // DC 1.0 - - public function testGetsAuthorFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - // DC 1.1 - - public function testGetsAuthorFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - public function testGetsAuthorFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Joe Bloggs'), $entry->getAuthor()); - } - - public function testGetsAuthorFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'Jane Bloggs'), $entry->getAuthor(1)); - } - - // Missing Id - - public function testGetsAuthorFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - public function testGetsAuthorFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getAuthor()); - } - - /** - * Get Description (Unencoded Text) - */ - public function testGetsDescriptionFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - // DC 1.0 - - public function testGetsDescriptionFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - // DC 1.1 - - public function testGetsDescriptionFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - public function testGetsDescriptionFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getDescription()); - } - - // Missing Description - - public function testGetsDescriptionFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - public function testGetsDescriptionFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDescription()); - } - - /** - * Get enclosure - */ - public function testGetsEnclosureFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/enclosure/plain/rss20.xml') - ); - $entry = $feed->current(); - - $expected = new stdClass(); - $expected->url = 'http://www.scripting.com/mp3s/weatherReportSuite.mp3'; - $expected->length = '12216320'; - $expected->type = 'audio/mpeg'; - - $this->assertEquals($expected, $entry->getEnclosure()); - } - - public function testGetsEnclosureFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/enclosure/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getEnclosure()); - } - - /** - * Get Content (Unencoded Text) - */ - public function testGetsContentFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - public function testGetsContentFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Content', $entry->getContent()); - } - - // Revert to Description if no Content - - public function testGetsContentFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - public function testGetsContentFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/description/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('Entry Description', $entry->getContent()); - } - - // Missing Content and Description - - public function testGetsContentFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - public function testGetsContentFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/content/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getContent()); - } - - /** - * Get Link (Unencoded Text) - */ - public function testGetsLinkFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - public function testGetsLinkFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry', $entry->getLink()); - } - - // Missing Link - - public function testGetsLinkFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - public function testGetsLinkFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getLink()); - } - - /** - * Get DateModified (Unencoded Text) - */ - public function testGetsDateModifiedFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - /** - * @group ZF-8702 - */ - public function testParsesCorrectDateIfMissingOffsetWhenSystemUsesUSLocale() - { - $locale = new Zend_Locale('en_US'); - Zend_Registry::set('Zend_Locale', $locale); - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20_en_US.xml') - ); - $entry = $feed->current(); - $fdate = $entry->getDateModified(); - $edate = new Zend_Date; - $edate->set('2010-01-04T02:14:00-0600', Zend_Date::ISO_8601); - Zend_Registry::getInstance()->offsetUnset('Zend_Locale'); - $this->assertTrue($edate->equals($fdate)); - } - - // DC 1.0 - - public function testGetsDateModifiedFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss20.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - // DC 1.1 - - public function testGetsDateModifiedFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss20.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - public function testGetsDateModifiedFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - // Missing DateModified - - public function testGetsDateModifiedFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - public function testGetsDateModifiedFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getDateModified()); - } - - /** - * @group ZF-7908 - */ - public function testGetsDateModifiedFromRss20_UnrecognisedGmtFormat() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20-zf-7908.xml') - ); - $entry = $feed->current(); - //$this->assertEquals('Sunday 11 January 2009 09 55 59 +0000', $entry->getDateModified()->toString('EEEE dd MMMM YYYY HH mm ss ZZZ')); - $edate = new Zend_Date; - $edate->set('Sun, 11 Jan 2009 09:55:59 GMT', Zend_Date::RSS); - $this->assertTrue($edate->equals($entry->getDateModified())); - } - - /** - * Get CommentCount (Unencoded Text) - */ - - // Slash 1.0 - - public function testGetsCommentCountFromRss20_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss094_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss093_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss092_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss091_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss10_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss090_Slash10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/slash10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - // Atom Threaded 1.0 - - public function testGetsCommentCountFromRss20_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss094_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss093_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss092_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss091_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss10_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss090_Thread10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/thread10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - // Atom 1.0 (Threaded 1.0 atom:link attribute) - - public function testGetsCommentCountFromRss20_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/atom10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('321', $entry->getCommentCount()); - } - - // Missing Any CommentCount - - public function testGetsCommentCountFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - public function testGetsCommentCountFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentcount/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentCount()); - } - - /** - * Get CommentLink (Unencoded Text) - */ - - public function testGetsCommentLinkFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - // Atom 1.0 - - public function testGetsCommentLinkFromRss20_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/atom10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/comments', $entry->getCommentLink()); - } - - // Missing Any CommentLink - - public function testGetsCommentLinkFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - public function testGetsCommentLinkFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentlink/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentLink()); - } - - /** - * Get CommentFeedLink (Unencoded Text) - */ - - // RSS - - public function testGetsCommentFeedLinkFromRss20_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss094_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss093_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss092_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss091_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss10_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss090_WellFormedWeb10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/wellformedweb/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - // Atom 1.0 - - public function testGetsCommentFeedLinkFromRss20_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/atom10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/entry/321/feed/rss/', $entry->getCommentFeedLink()); - } - - // Missing Any CommentFeedLink - - public function testGetsCommentFeedLinkFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - public function testGetsCommentFeedLinkFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/commentfeedlink/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(null, $entry->getCommentFeedLink()); - } - - /** - * Get category data - */ - - // RSS 2.0 - - public function testGetsCategoriesFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCats, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - // DC 1.0 - - public function testGetsCategoriesFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - // DC 1.1 - - public function testGetsCategoriesFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsRdf, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($entry->getCategories()->getValues())); - } - - // Atom 1.0 - - public function testGetsCategoriesFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals($this->_expectedCatsAtom, (array) $entry->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($entry->getCategories()->getValues())); - } - - // No Categories In Entry - - public function testGetsCategoriesFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss20.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss090.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss091.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss092.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss093.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss094.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss10.xml') - ); - $entry = $feed->current(); - $this->assertEquals(array(), (array) $entry->getCategories()); - $this->assertEquals(array(), array_values($entry->getCategories()->getValues())); - } - - -} diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom03.xml deleted file mode 100644 index 597e58d778..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom03.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom10.xml deleted file mode 100644 index 82821adb93..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/author/plain/atom10.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-entrylevel.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-entrylevel.xml deleted file mode 100644 index 557aaf9ca7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-entrylevel.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-feedlevel.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-feedlevel.xml deleted file mode 100644 index f52d189302..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/baseurl/plain/atom10-feedlevel.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom03.xml deleted file mode 100644 index 814feeb439..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom03.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom10.xml deleted file mode 100644 index 1aa5f997b9..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc10/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc10/atom03.xml deleted file mode 100644 index 521c1ab729..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc10/atom03.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc11/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc11/atom03.xml deleted file mode 100644 index 68942d0704..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/dc11/atom03.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom03.xml deleted file mode 100644 index 8d52ee994f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom03.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom10.xml deleted file mode 100644 index 08dab19ca3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/category/plain/none/atom10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/atom10/rss20.xml deleted file mode 100644 index 2a4a24551d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/atom10/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/thread10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/thread10/rss20.xml deleted file mode 100644 index 447b3cd704..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentcount/plain/thread10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom03.xml deleted file mode 100644 index 641512d6b8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10-relative.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10-relative.xml deleted file mode 100644 index f157dfabd2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10-relative.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10.xml deleted file mode 100644 index 1f54ce03f1..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/commentlink/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom03.xml deleted file mode 100644 index 1ab4d8822a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Content - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10.xml deleted file mode 100644 index f258fd9b57..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Content &amp; - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Html.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Html.xml deleted file mode 100644 index e4ead2678b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Html.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - <p>Entry Content &amp;</p> - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_HtmlCdata.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_HtmlCdata.xml deleted file mode 100644 index e34a7606ee..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_HtmlCdata.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Content &

]]>
-
-
diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Xhtml.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Xhtml.xml deleted file mode 100644 index 080a816fc5..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/content/plain/atom10_Xhtml.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - Entry Content &x: - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom03.xml deleted file mode 100644 index 4c3c9691c8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom10.xml deleted file mode 100644 index 95a7fe7e48..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/datecreated/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom03.xml deleted file mode 100644 index 747b8da210..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom10.xml deleted file mode 100644 index ef300c58b8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/datemodified/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom03.xml deleted file mode 100644 index b8b01e8388..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom10.xml deleted file mode 100644 index 232da70b6a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/description/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom03.xml deleted file mode 100644 index 5206e58dfe..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom10.xml deleted file mode 100644 index b309cb9938..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/enclosure/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom03.xml deleted file mode 100644 index a05d311cbb..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 1 - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom10.xml deleted file mode 100644 index a724682fa6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/id/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 1 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom03.xml deleted file mode 100644 index eba507227f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-norel.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-norel.xml deleted file mode 100644 index 2eb1029a73..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-norel.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-relative.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-relative.xml deleted file mode 100644 index a5b22f4a12..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10-relative.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10.xml deleted file mode 100644 index f20a134614..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/link/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom03.xml deleted file mode 100644 index 406c8b6ec5..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom03.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom10.xml deleted file mode 100644 index f8d8ba5303..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/links/plain/atom10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom03.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom03.xml deleted file mode 100644 index 6625a33501..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom03.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom10.xml deleted file mode 100644 index 06dbcc999f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Atom/title/plain/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Entry Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/author/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/author/atom10.xml deleted file mode 100644 index 7dc139881c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/author/atom10.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/category/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/category/atom10.xml deleted file mode 100644 index 93493a433a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/category/atom10.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/commentlink/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/commentlink/atom10.xml deleted file mode 100644 index 7074557fe0..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/commentlink/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10.xml deleted file mode 100644 index 38c002089f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Entry Content &amp; - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Html.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Html.xml deleted file mode 100644 index 55517fc1a2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Html.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - <p>Entry Content &amp;</p> - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_HtmlCdata.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_HtmlCdata.xml deleted file mode 100644 index dab8970901..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_HtmlCdata.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Entry Content &

]]>
-
diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Xhtml.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Xhtml.xml deleted file mode 100644 index 263913a491..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/content/atom10_Xhtml.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Content &x: - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datecreated/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datecreated/atom10.xml deleted file mode 100644 index 062c253b5d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datecreated/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datemodified/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datemodified/atom10.xml deleted file mode 100644 index a05259055c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/datemodified/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/description/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/description/atom10.xml deleted file mode 100644 index a8e0d5f929..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/description/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Entry Description - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/enclosure/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/enclosure/atom10.xml deleted file mode 100644 index c37b0bfa5a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/enclosure/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/id/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/id/atom10.xml deleted file mode 100644 index 5310e48c06..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/id/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 1 - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/link/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/link/atom10.xml deleted file mode 100644 index 0445b029c9..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/link/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/links/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/links/atom10.xml deleted file mode 100644 index c9d22da116..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/links/atom10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/title/atom10.xml b/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/title/atom10.xml deleted file mode 100644 index f1e2c134a7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/AtomStandaloneEntry/title/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Entry Title - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Common/atom.xml b/tests/Zend/Feed/Reader/Entry/_files/Common/atom.xml deleted file mode 100644 index 1f2c99e6e6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Common/atom.xml +++ /dev/null @@ -1,726 +0,0 @@ - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Entry/_files/Common/atom_noencodingdefined.xml b/tests/Zend/Feed/Reader/Entry/_files/Common/atom_noencodingdefined.xml deleted file mode 100644 index 3e31cbaffb..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Common/atom_noencodingdefined.xml +++ /dev/null @@ -1,726 +0,0 @@ - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Entry/_files/Common/atom_rewrittenbydom.xml b/tests/Zend/Feed/Reader/Entry/_files/Common/atom_rewrittenbydom.xml deleted file mode 100644 index 5dd145a68a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Common/atom_rewrittenbydom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
diff --git a/tests/Zend/Feed/Reader/Entry/_files/Common/rss.xml b/tests/Zend/Feed/Reader/Entry/_files/Common/rss.xml deleted file mode 100644 index 3d1fdfae24..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Common/rss.xml +++ /dev/null @@ -1,700 +0,0 @@ - - - - - Norm 2782 - - http://www.norm2782.com - Why are you here? - Sat, 07 Mar 2009 08:03:50 +0000 - http://wordpress.org/?v=2.8 - en - hourly - 1 - - Wth… reading books? - http://www.norm2782.com/2009/03/wth-reading-books/ - http://www.norm2782.com/2009/03/wth-reading-books/#comments - Mon, 02 Mar 2009 08:09:33 +0000 - norm2782 - - - - - - http://www.norm2782.com/?p=114 - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- http://www.norm2782.com/2009/03/wth-reading-books/feed/ - 0 -
- - My first few weeks in New Zealand - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/ - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/#comments - Sun, 15 Feb 2009 03:29:21 +0000 - norm2782 - - - - http://www.norm2782.com/?p=105 - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

-


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

-

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

-

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

-

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/feed/ - 0 -
- - Properties in PHP – revisited - http://www.norm2782.com/2009/01/properties-in-php-revisited/ - http://www.norm2782.com/2009/01/properties-in-php-revisited/#comments - Wed, 14 Jan 2009 10:47:25 +0000 - norm2782 - - - - http://www.norm2782.com/?p=94 - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

-

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

-

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- http://www.norm2782.com/2009/01/properties-in-php-revisited/feed/ - 0 -
- - Filters for Zend_Paginator - http://www.norm2782.com/2009/01/filters-for-zend_paginator/ - http://www.norm2782.com/2009/01/filters-for-zend_paginator/#comments - Tue, 13 Jan 2009 12:57:53 +0000 - norm2782 - - - - http://www.norm2782.com/?p=72 - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

-


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- http://www.norm2782.com/2009/01/filters-for-zend_paginator/feed/ - 0 -
- - ZF-3239 - http://www.norm2782.com/2009/01/zf-3239/ - http://www.norm2782.com/2009/01/zf-3239/#comments - Wed, 07 Jan 2009 11:48:31 +0000 - norm2782 - - - - http://www.norm2782.com/?p=68 - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- http://www.norm2782.com/2009/01/zf-3239/feed/ - 0 -
- - New in-ear earphones - http://www.norm2782.com/2009/01/new-in-ear-earphones/ - http://www.norm2782.com/2009/01/new-in-ear-earphones/#comments - Sat, 03 Jan 2009 15:49:19 +0000 - norm2782 - - - http://www.norm2782.com/?p=53 - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

-


-cx300

-]]>
- http://www.norm2782.com/2009/01/new-in-ear-earphones/feed/ - 0 -
- - Seven Things – Tagged by Pádraic - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/ - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/#comments - Sat, 03 Jan 2009 10:14:38 +0000 - norm2782 - - - http://www.norm2782.com/?p=44 - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

-

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • -
-]]>
- http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/feed/ - 0 -
- - AMF Server class for WordPress - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/ - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/#comments - Fri, 02 Jan 2009 14:49:42 +0000 - norm2782 - - - - - http://www.norm2782.com/?p=27 - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

-

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-]]>
- http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/feed/ - 0 -
- - Flex frontend - http://www.norm2782.com/2009/01/flex-frontend/ - http://www.norm2782.com/2009/01/flex-frontend/#comments - Thu, 01 Jan 2009 23:29:35 +0000 - norm2782 - - - - http://www.norm2782.com/?p=22 - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- http://www.norm2782.com/2009/01/flex-frontend/feed/ - 0 -
- - Properties in PHP - http://www.norm2782.com/2009/01/properties-in-php/ - http://www.norm2782.com/2009/01/properties-in-php/#comments - Thu, 01 Jan 2009 23:02:54 +0000 - norm2782 - - - - http://www.norm2782.com/?p=8 - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-]]>
- http://www.norm2782.com/2009/01/properties-in-php/feed/ - 0 -
-
-
diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss090.xml deleted file mode 100644 index 68e35c214a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss091.xml deleted file mode 100644 index a8ccda602c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss092.xml deleted file mode 100644 index 323729fdfe..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss093.xml deleted file mode 100644 index 84a68f2fe3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss094.xml deleted file mode 100644 index cfa540adb8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss10.xml deleted file mode 100644 index 8c8e82631a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss20.xml deleted file mode 100644 index 4ad1c11b74..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc10/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss090.xml deleted file mode 100644 index 54e026b18e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss091.xml deleted file mode 100644 index 1d7236c349..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss092.xml deleted file mode 100644 index 578d70f05c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss093.xml deleted file mode 100644 index bbb903713d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss094.xml deleted file mode 100644 index e61e760750..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss10.xml deleted file mode 100644 index 0fbb88edad..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss20.xml deleted file mode 100644 index a38aa4b550..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/dc11/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss20.xml deleted file mode 100644 index 610f00c724..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/author/plain/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss090.xml deleted file mode 100644 index 51c903fbd0..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss090.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss091.xml deleted file mode 100644 index 450aff76bb..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss092.xml deleted file mode 100644 index 694e2f1060..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss093.xml deleted file mode 100644 index d331196f88..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss094.xml deleted file mode 100644 index daa6057f2e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss10.xml deleted file mode 100644 index d760bece2c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/atom10/rss10.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml deleted file mode 100644 index 1c92b582a3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml deleted file mode 100644 index f278d67da0..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml deleted file mode 100644 index 4988e32126..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml deleted file mode 100644 index 3696e2742f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml deleted file mode 100644 index 967d9f228b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml deleted file mode 100644 index 35719e8dc1..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc10/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml deleted file mode 100644 index 50f9b574c2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml deleted file mode 100644 index 256a6c62d4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml deleted file mode 100644 index e2d7ce3e51..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml deleted file mode 100644 index 298caefc44..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml deleted file mode 100644 index 1cfda25165..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml deleted file mode 100644 index 89eb512d72..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/dc11/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss20.xml deleted file mode 100644 index 093db1e65c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/category/plain/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - topic1 - topic1 - topic2 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss090.xml deleted file mode 100644 index 0da7845b38..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss091.xml deleted file mode 100644 index 3c78d2cb7e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss092.xml deleted file mode 100644 index 4a79517194..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss093.xml deleted file mode 100644 index 8f967bbd62..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss094.xml deleted file mode 100644 index c2b4c2fc58..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss10.xml deleted file mode 100644 index b8d328ea8c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss20.xml deleted file mode 100644 index 2a4a24551d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/atom10/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss090.xml deleted file mode 100644 index bb459c17b3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss091.xml deleted file mode 100644 index 83b6de8d26..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss092.xml deleted file mode 100644 index 592e1ccd9d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss093.xml deleted file mode 100644 index af9fe94140..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss094.xml deleted file mode 100644 index 58907c4965..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss10.xml deleted file mode 100644 index 74d2bb0ea7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss20.xml deleted file mode 100644 index a5b53433fe..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/slash10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss090.xml deleted file mode 100644 index 9dff77958f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss091.xml deleted file mode 100644 index fe911dda31..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss092.xml deleted file mode 100644 index 46c514a434..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss093.xml deleted file mode 100644 index a3f457a5ca..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss094.xml deleted file mode 100644 index df01c1bd2e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss10.xml deleted file mode 100644 index 0edd662eef..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss20.xml deleted file mode 100644 index 447b3cd704..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentcount/plain/thread10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss090.xml deleted file mode 100644 index 3138f2ded8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss091.xml deleted file mode 100644 index 510fc983e4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss092.xml deleted file mode 100644 index 3646e10589..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss093.xml deleted file mode 100644 index c1ac68a394..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss094.xml deleted file mode 100644 index dc39e98033..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss10.xml deleted file mode 100644 index 0558187722..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss20.xml deleted file mode 100644 index b892ba5f49..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/atom10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss090.xml deleted file mode 100644 index 9dff77958f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss091.xml deleted file mode 100644 index fe911dda31..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss092.xml deleted file mode 100644 index 46c514a434..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss093.xml deleted file mode 100644 index a3f457a5ca..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss094.xml deleted file mode 100644 index df01c1bd2e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss10.xml deleted file mode 100644 index f267af1611..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss20.xml deleted file mode 100644 index 447b3cd704..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/thread10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 321 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss090.xml deleted file mode 100644 index e9b17e30dc..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss091.xml deleted file mode 100644 index 6790a65f67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss092.xml deleted file mode 100644 index a246decf3f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss093.xml deleted file mode 100644 index dc135d776a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss094.xml deleted file mode 100644 index 064a99ad8f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss10.xml deleted file mode 100644 index ad848d87f8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss20.xml deleted file mode 100644 index 8dbf72263d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentfeedlink/plain/wellformedweb/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry/321/feed/rss/ - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss090.xml deleted file mode 100644 index 748cdc26a7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss091.xml deleted file mode 100644 index d5e6d1dd47..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss092.xml deleted file mode 100644 index d5573c5ad0..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss093.xml deleted file mode 100644 index ff8a1d3109..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss094.xml deleted file mode 100644 index 1cb3cecc22..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss10.xml deleted file mode 100644 index 0e0c4d5c3c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss20.xml deleted file mode 100644 index d9bd4abaea..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/atom10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss091.xml deleted file mode 100644 index e894ea509c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/comments - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss092.xml deleted file mode 100644 index 1bbad33a3c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/comments - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss093.xml deleted file mode 100644 index ee1e64a06d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/comments - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss094.xml deleted file mode 100644 index ecb37067ae..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/comments - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss20.xml deleted file mode 100644 index c1eabeaae8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/commentlink/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/comments - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss090.xml deleted file mode 100644 index c291864664..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss091.xml deleted file mode 100644 index 5af9974f2a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss092.xml deleted file mode 100644 index 65760fa0af..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss093.xml deleted file mode 100644 index 2a2dba03d3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss094.xml deleted file mode 100644 index c4f0785272..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss10.xml deleted file mode 100644 index 941d89c370..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss20.xml deleted file mode 100644 index c6664ac927..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/description/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss090.xml deleted file mode 100644 index deb85415d6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss091.xml deleted file mode 100644 index b596e9abf1..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss092.xml deleted file mode 100644 index fcbc3e3c5b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss093.xml deleted file mode 100644 index a3c1d5fd6e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss094.xml deleted file mode 100644 index 9f3653abba..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss10.xml deleted file mode 100644 index be080266e7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss20.xml deleted file mode 100644 index 4600c6200a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/content/plain/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Content - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss090.xml deleted file mode 100644 index 9db7fd7d0e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss091.xml deleted file mode 100644 index 3ea5f10594..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss092.xml deleted file mode 100644 index 28a22f969f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss093.xml deleted file mode 100644 index 8c2a573c04..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss094.xml deleted file mode 100644 index 770aa0f537..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss10.xml deleted file mode 100644 index 75e8f22ac9..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss20.xml deleted file mode 100644 index 8e25d37dcf..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/atom10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss090.xml deleted file mode 100644 index c54b103a79..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss091.xml deleted file mode 100644 index 8d460b0751..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss092.xml deleted file mode 100644 index 2f6bf523bc..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss093.xml deleted file mode 100644 index e4744b7e01..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss094.xml deleted file mode 100644 index c049daf36b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss10.xml deleted file mode 100644 index 4763d18d4f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss20.xml deleted file mode 100644 index c5c82b6779..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss090.xml deleted file mode 100644 index cf4c825f85..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss091.xml deleted file mode 100644 index 06a1efff75..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss092.xml deleted file mode 100644 index d9faf9f2c3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss093.xml deleted file mode 100644 index f2a5fedd1d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss094.xml deleted file mode 100644 index 95ec42593b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss10.xml deleted file mode 100644 index 608b8b9a47..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss20.xml deleted file mode 100644 index 7e95d8aece..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/dc11/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20-zf-7908.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20-zf-7908.xml deleted file mode 100644 index 7d3874922d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20-zf-7908.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Sun, 11 Jan 2009 09:55:59 GMT - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20.xml deleted file mode 100644 index 527c94b245..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Sat, 07 Mar 2009 08:03:50 +0000 - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20_en_US.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20_en_US.xml deleted file mode 100644 index c48ba68ed7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20_en_US.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Mon, 4 Jan 2010 02:14:00 CST - - - diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss090.xml deleted file mode 100644 index 0399f8780a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss091.xml deleted file mode 100644 index 47148987b8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss092.xml deleted file mode 100644 index 1b5e129a70..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss093.xml deleted file mode 100644 index 63e562d013..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss094.xml deleted file mode 100644 index e647d4bc89..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss10.xml deleted file mode 100644 index 26d899f88f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss20.xml deleted file mode 100644 index 08bff72eb1..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss090.xml deleted file mode 100644 index c291864664..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss091.xml deleted file mode 100644 index 5af9974f2a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss092.xml deleted file mode 100644 index 65760fa0af..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss093.xml deleted file mode 100644 index 2a2dba03d3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss094.xml deleted file mode 100644 index c4f0785272..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss10.xml deleted file mode 100644 index 941d89c370..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss20.xml deleted file mode 100644 index c6664ac927..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/dc11/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss090.xml deleted file mode 100644 index 08c37dbb74..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss091.xml deleted file mode 100644 index bbfba4e65f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss092.xml deleted file mode 100644 index cb1d8367a7..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss093.xml deleted file mode 100644 index 6007bef377..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss094.xml deleted file mode 100644 index ced02b990a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss10.xml deleted file mode 100644 index 95668d4761..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss20.xml deleted file mode 100644 index 31d1e2180a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/description/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Description - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss10.xml deleted file mode 100644 index 7193be64c8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss20.xml deleted file mode 100644 index 48bfbd34e1..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/enclosure/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss090.xml deleted file mode 100644 index 124a3f0e6d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss091.xml deleted file mode 100644 index 7e44ca8878..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss092.xml deleted file mode 100644 index b74ab66d18..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss093.xml deleted file mode 100644 index 67a32177d9..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss094.xml deleted file mode 100644 index 4c7175a6c3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss10.xml deleted file mode 100644 index c6cb3b3b51..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss20.xml deleted file mode 100644 index fda4aa1f86..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss090.xml deleted file mode 100644 index bbc8851c92..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss091.xml deleted file mode 100644 index 4daf0e8ebb..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss092.xml deleted file mode 100644 index db93413818..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss093.xml deleted file mode 100644 index 35129efb70..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss094.xml deleted file mode 100644 index cb77dbf51d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss10.xml deleted file mode 100644 index b0e9c5bc4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss20.xml deleted file mode 100644 index 7d3c4b20a3..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/dc11/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss20.xml deleted file mode 100644 index c80f75202d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/1 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss090.xml deleted file mode 100644 index 3d07454543..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss091.xml deleted file mode 100644 index bf84a7d8b2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss092.xml deleted file mode 100644 index 343a78de7c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss093.xml deleted file mode 100644 index 7ff5e6d8d2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss094.xml deleted file mode 100644 index 32e9ddc33a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss10.xml deleted file mode 100644 index 66e290d234..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss20.xml deleted file mode 100644 index 017ee3cb34..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/id/plain/title/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss090.xml deleted file mode 100644 index f629a31b3d..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss091.xml deleted file mode 100644 index 3b3718c07b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss092.xml deleted file mode 100644 index 37c3483f8f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss093.xml deleted file mode 100644 index 87bca96ac4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss094.xml deleted file mode 100644 index 6d98958152..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss10.xml deleted file mode 100644 index 5b9faeeb78..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss20.xml deleted file mode 100644 index 6b58de284a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/link/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - http://www.example.com/entry - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss090.xml deleted file mode 100644 index dad0c29061..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss091.xml deleted file mode 100644 index 540253611c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss092.xml deleted file mode 100644 index ff8bc7d3c4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss093.xml deleted file mode 100644 index f141e4f723..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss094.xml deleted file mode 100644 index 130e9df826..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss10.xml deleted file mode 100644 index 0ec0f34f46..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss20.xml deleted file mode 100644 index 66a155fba4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/links/plain/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - http://www.example.com/entry - http://www.example.com/entry2 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss090.xml deleted file mode 100644 index ac8b9ea926..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss091.xml deleted file mode 100644 index 000e140428..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss092.xml deleted file mode 100644 index 19b09aa47b..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss093.xml deleted file mode 100644 index d435832011..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss094.xml deleted file mode 100644 index f6705f1804..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss10.xml deleted file mode 100644 index 7f15ef3dff..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss20.xml deleted file mode 100644 index 556662317e..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc10/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss090.xml deleted file mode 100644 index 3d07454543..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss091.xml deleted file mode 100644 index bf84a7d8b2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss092.xml deleted file mode 100644 index 343a78de7c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss093.xml deleted file mode 100644 index 7ff5e6d8d2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss094.xml deleted file mode 100644 index 32e9ddc33a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss10.xml deleted file mode 100644 index 66e290d234..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss20.xml deleted file mode 100644 index 017ee3cb34..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/dc11/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss090.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss090.xml deleted file mode 100644 index 120da2a68f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss091.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss091.xml deleted file mode 100644 index d181865025..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss092.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss092.xml deleted file mode 100644 index 57b71b1dc2..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss093.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss093.xml deleted file mode 100644 index 990fbaf37f..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss094.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss094.xml deleted file mode 100644 index d1af2a7512..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss10.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss10.xml deleted file mode 100644 index 75045d5edb..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss20.xml b/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss20.xml deleted file mode 100644 index 056d3f8c03..0000000000 --- a/tests/Zend/Feed/Reader/Entry/_files/Rss/title/plain/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Entry Title - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/AtomSourceTest.php b/tests/Zend/Feed/Reader/Feed/AtomSourceTest.php deleted file mode 100644 index 96f78c3a72..0000000000 --- a/tests/Zend/Feed/Reader/Feed/AtomSourceTest.php +++ /dev/null @@ -1,306 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/AtomSource'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - $this->_expectedCatsDc = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - public function testGetsSourceFromEntry() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertTrue($source instanceof Zend_Feed_Reader_Feed_Atom_Source); - } - - /** - * Get Title (Unencoded Text) - */ - - public function testGetsTitleFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('My Title', $source->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - */ - - public function testGetsAuthorArrayFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/atom10.xml') - ); - $source = $feed->current()->getSource(); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $this->assertEquals($authors, (array) $source->getAuthors()); - } - - /** - * Get Single Author (Unencoded Text) - */ - - public function testGetsSingleAuthorFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/atom10.xml') - ); - $source = $feed->current()->getSource(); - - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $feed->getAuthor()); - } - - /** - * Get creation date (Unencoded Text) - */ - - public function testGetsDateCreatedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/atom10.xml') - ); - $source = $feed->current()->getSource(); - - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($source->getDateCreated())); - } - - /** - * Get modification date (Unencoded Text) - */ - - public function testGetsDateModifiedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/atom10.xml') - ); - $source = $feed->current()->getSource(); - - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($source->getDateModified())); - } - - /** - * Get Generator (Unencoded Text) - */ - - public function testGetsGeneratorFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('Zend_Feed', $source->getGenerator()); - } - - /** - * Get Copyright (Unencoded Text) - */ - - public function testGetsCopyrightFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('Copyright 2008', $source->getCopyright()); - } - - /** - * Get Description (Unencoded Text) - */ - - public function testGetsDescriptionFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('My Description', $source->getDescription()); - } - - /** - * Get Id (Unencoded Text) - */ - - public function testGetsIdFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('123', $source->getId()); - } - - /** - * Get Language (Unencoded Text) - */ - - public function testGetsLanguageFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('en-GB', $source->getLanguage()); - } - - /** - * Get Link (Unencoded Text) - */ - - public function testGetsLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('http://www.example.com', $source->getLink()); - } - - /** - * Get Feed Link (Unencoded Text) - */ - - public function testGetsFeedLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals('http://www.example.com/feed/atom', $source->getFeedLink()); - } - - /** - * Get Pubsubhubbub Hubs - */ - public function testGetsHubsFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $source->getHubs()); - } - - /** - * Get category data - */ - public function testGetsCategoriesFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/atom10.xml') - ); - $source = $feed->current()->getSource(); - $this->assertEquals($this->_expectedCats, (array) $source->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($source->getCategories()->getValues())); - } - -} diff --git a/tests/Zend/Feed/Reader/Feed/AtomTest.php b/tests/Zend/Feed/Reader/Feed/AtomTest.php deleted file mode 100644 index f4e22c6098..0000000000 --- a/tests/Zend/Feed/Reader/Feed/AtomTest.php +++ /dev/null @@ -1,589 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Atom'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - $this->_expectedCatsDc = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Get Title (Unencoded Text) - */ - public function testGetsTitleFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom03.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - */ - public function testGetsAuthorArrayFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom03.xml') - ); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $this->assertEquals($authors, (array) $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10.xml') - ); - - $authors = array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs','uri'=>'http://www.example.com'), - array('name'=>'Joe Bloggs'), - array('email'=>'joe@example.com','uri'=>'http://www.example.com'), - array('uri'=>'http://www.example.com'), - array('email'=>'joe@example.com') - ); - - $this->assertEquals($authors, (array) $feed->getAuthors()); - } - - /** - * Get Single Author (Unencoded Text) - */ - public function testGetsSingleAuthorFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom03.xml') - ); - - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10.xml') - ); - - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com','uri'=>'http://www.example.com'), $feed->getAuthor()); - } - - /** - * Get creation date (Unencoded Text) - */ - public function testGetsDateCreatedFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/plain/atom03.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateCreated())); - } - - public function testGetsDateCreatedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datecreated/plain/atom10.xml') - ); - - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateCreated())); - } - - /** - * Get modification date (Unencoded Text) - */ - public function testGetsDateModifiedFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/plain/atom03.xml') - ); - - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath . '/datemodified/plain/atom10.xml') - ); - - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - /** - * Get Last Build Date (Unencoded Text) - */ - public function testGetsLastBuildDateAlwaysReturnsNullForAtom() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10.xml') - ); - $this->assertNull($feed->getLastBuildDate()); - } - - /** - * Get Generator (Unencoded Text) - */ - public function testGetsGeneratorFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/atom03.xml') - ); - $this->assertEquals('Zend_Feed', $feed->getGenerator()); - } - - public function testGetsGeneratorFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/atom10.xml') - ); - $this->assertEquals('Zend_Feed', $feed->getGenerator()); - } - - /** - * Get Copyright (Unencoded Text) - */ - public function testGetsCopyrightFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/atom03.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/atom10.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - /** - * Get Description (Unencoded Text) - */ - public function testGetsDescriptionFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/atom03.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/atom10.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - /** - * Get Id (Unencoded Text) - */ - public function testGetsIdFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/atom03.xml') - ); - $this->assertEquals('123', $feed->getId()); - } - - public function testGetsIdFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/id/plain/atom10.xml') - ); - $this->assertEquals('123', $feed->getId()); - } - - /** - * Get Language (Unencoded Text) - */ - public function testGetsLanguageFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/atom03.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/atom10.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - /** - * Get Link (Unencoded Text) - */ - public function testGetsLinkFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/atom03.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/atom10.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromAtom10WithNoRelAttribute() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/atom10-norel.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromAtom10WithRelativeUrl() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/atom10-relative.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - /** - * Get Base Uri - */ - public function testGetsBaseUriFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom10-relative.xml') - ); - $this->assertEquals('http://www.example.com/', $feed->getBaseUrl()); - } - - /** - * Get Feed Link (Unencoded Text) - */ - public function testGetsFeedLinkFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom03.xml') - ); - $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom10.xml') - ); - $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromAtom10IfRelativeUri() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom10-relative.xml') - ); - $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink()); - } - - public function testGetsOriginalSourceUriIfFeedLinkNotAvailableFromFeed() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/atom10_NoFeedLink.xml') - ); - $feed->setOriginalSourceUri('http://www.example.com/feed/atom'); - $this->assertEquals('http://www.example.com/feed/atom', $feed->getFeedLink()); - } - - /** - * Get Pubsubhubbub Hubs - */ - public function testGetsHubsFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom03.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - - /** - * Implements Countable - */ - - public function testCountableInterface() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/atom10.xml') - ); - $this->assertEquals(0, count($feed)); - } - - /** - * Get category data - */ - - // Atom 1.0 (Atom 0.3 never supported categories except via Atom 1.0/Dublin Core extensions) - - public function testGetsCategoriesFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10.xml') - ); - $this->assertEquals($this->_expectedCats, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_Atom10Extension() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom03.xml') - ); - $this->assertEquals($this->_expectedCats, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - // DC 1.0/1.1 for Atom 0.3 - - public function testGetsCategoriesFromAtom03_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/atom03.xml') - ); - $this->assertEquals($this->_expectedCatsDc, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/atom03.xml') - ); - $this->assertEquals($this->_expectedCatsDc, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - // No Categories In Entry - - public function testGetsCategoriesFromAtom10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/atom10.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromAtom03_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/atom03.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - /** - * Get Image (Unencoded Text) - */ - public function testGetsImageFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/atom03.xml') - ); - $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getImage()); - } - - public function testGetsImageFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/atom10.xml') - ); - $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getImage()); - } - - /** - * Get Image (Unencoded Text) When Missing - */ - public function testGetsImageFromAtom03_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/atom03.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromAtom10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/atom10.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - /** - * Get Icon (Unencoded Text) - */ - public function testGetsIconFromAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/icon/plain/atom03.xml') - ); - $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getIcon()); - } - - public function testGetsIconFromAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/icon/plain/atom10.xml') - ); - $this->assertEquals(array('uri'=>'http://www.example.com/logo.gif'), $feed->getIcon()); - } - - /** - * Get Icon (Unencoded Text) When Missing - */ - public function testGetsIconFromAtom03_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/icon/plain/none/atom03.xml') - ); - $this->assertEquals(null, $feed->getIcon()); - } - - public function testGetsIconFromAtom10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/icon/plain/none/atom10.xml') - ); - $this->assertEquals(null, $feed->getIcon()); - } -} diff --git a/tests/Zend/Feed/Reader/Feed/CommonTest.php b/tests/Zend/Feed/Reader/Feed/CommonTest.php deleted file mode 100644 index 7e8c223f74..0000000000 --- a/tests/Zend/Feed/Reader/Feed/CommonTest.php +++ /dev/null @@ -1,132 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Common'; - } - - /** - * Check DOM Retrieval and Information Methods - */ - public function testGetsDomDocumentObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertTrue($feed->getDomDocument() instanceof DOMDocument); - } - - public function testGetsDomXpathObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertTrue($feed->getXpath() instanceof DOMXPath); - } - - public function testGetsXpathPrefixString() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertTrue($feed->getXpathPrefix() == '/atom:feed'); - } - - public function testGetsDomElementObject() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertTrue($feed->getElement() instanceof DOMElement); - } - - public function testSaveXmlOutputsXmlStringForFeed() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertEquals($feed->saveXml(), file_get_contents($this->_feedSamplePath.'/atom_rewrittenbydom.xml')); - } - - public function testGetsNamedExtension() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertTrue($feed->getExtension('Atom') instanceof Zend_Feed_Reader_Extension_Atom_Feed); - } - - public function testReturnsNullIfExtensionDoesNotExist() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertEquals(null, $feed->getExtension('Foo')); - } - - /** - * @group ZF-8213 - */ - public function testReturnsEncodingOfFeed() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom.xml') - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - /** - * @group ZF-8213 - */ - public function testReturnsEncodingOfFeedAsUtf8IfUndefined() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/atom_noencodingdefined.xml') - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - -} diff --git a/tests/Zend/Feed/Reader/Feed/RssTest.php b/tests/Zend/Feed/Reader/Feed/RssTest.php deleted file mode 100644 index 45ba6dcaec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/RssTest.php +++ /dev/null @@ -1,2979 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/Rss'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - $this->_expectedCats = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic2' - ) - ); - $this->_expectedCatsRdf = array( - array( - 'term' => 'topic1', - 'scheme' => null, - 'label' => 'topic1' - ), - array( - 'term' => 'topic2', - 'scheme' => null, - 'label' => 'topic2' - ) - ); - $this->_expectedCatsAtom = array( - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema1', - 'label' => 'topic1' - ), - array( - 'term' => 'topic1', - 'scheme' => 'http://example.com/schema2', - 'label' => 'topic1' - ), - array( - 'term' => 'cat_dog', - 'scheme' => 'http://example.com/schema1', - 'label' => 'Cat & Dog' - ) - ); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Get Title (Unencoded Text) - */ - public function testGetsTitleFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss20.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss094.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss093.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss092.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss091.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss10.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/rss090.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - // DC 1.0 - - public function testGetsTitleFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss20.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss094.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss093.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss092.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss091.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss10.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc10/rss090.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - // DC 1.1 - - public function testGetsTitleFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss20.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss094.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss093.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss092.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss091.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss10.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/dc11/rss090.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - // Atom 1.0 - - public function testGetsTitleFromRss20_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss20.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss094_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss094.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss093_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss093.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss092_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss092.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss091_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss091.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss10_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss10.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - public function testGetsTitleFromRss090_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/atom10/rss090.xml') - ); - $this->assertEquals('My Title', $feed->getTitle()); - } - - // Missing Title - - public function testGetsTitleFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - public function testGetsTitleFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/title/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getTitle()); - } - - /** - * Get Authors (Unencoded Text) - */ - public function testGetsAuthorArrayFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss20.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss094.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss093.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss092.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss091.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss10.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss090.xml') - ); - $this->assertEquals(array( - array('email'=>'joe@example.com','name'=>'Joe Bloggs'), - array('email'=>'jane@example.com','name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - // DC 1.0 - - public function testGetsAuthorArrayFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss20.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss094.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss093.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss092.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss091.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss10.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss090.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues());; - } - - // DC 1.1 - - public function testGetsAuthorArrayFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss20.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss094.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss093.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss092.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss091.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss10.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss090.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - // Atom 1.0 - - public function testGetsAuthorArrayFromRss20_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss20.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss094.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss093.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss092.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss091.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss10.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - public function testGetsAuthorArrayFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/atom10/rss090.xml') - ); - $this->assertEquals(array( - array('name'=>'Joe Bloggs'), array('name'=>'Jane Bloggs') - ), (array) $feed->getAuthors()); - $this->assertEquals(array('Joe Bloggs','Jane Bloggs'), $feed->getAuthors()->getValues()); - } - - // Missing Authors - - public function testGetsAuthorArrayFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - public function testGetsAuthorArrayFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getAuthors()); - } - - /** - * Get Single Author (Unencoded Text) - */ - public function testGetsSingleAuthorFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss20.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss094.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss093.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss092.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss091.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss10.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/rss090.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs','email'=>'joe@example.com'), $feed->getAuthor()); - } - - // DC 1.0 - - public function testGetsSingleAuthorFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss20.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss094.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss093.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss092.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss091.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss10.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc10/rss090.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - // DC 1.1 - - public function testGetsSingleAuthorFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss20.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss094.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss093.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss092.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss091.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss10.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/dc11/rss090.xml') - ); - $this->assertEquals(array('name'=>'Joe Bloggs'), $feed->getAuthor()); - } - - // Missing Author - - public function testGetsSingleAuthorFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - public function testGetsSingleAuthorFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/author/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getAuthor()); - } - - /** - * Get Copyright (Unencoded Text) - */ - public function testGetsCopyrightFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss20.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss094.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss093.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss092.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss091.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss10.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/rss090.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - // DC 1.0 - - public function testGetsCopyrightFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss20.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss094.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss093.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss092.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss091.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss10.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc10/rss090.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - // DC 1.1 - - public function testGetsCopyrightFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss20.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss094.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss093.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss092.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss091.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss10.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/dc11/rss090.xml') - ); - $this->assertEquals('Copyright 2008', $feed->getCopyright()); - } - - // Missing Copyright - - public function testGetsCopyrightFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsCopyrightFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/copyright/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - /** - * Get Description (Unencoded Text) - */ - public function testGetsDescriptionFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss20.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss094.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss093.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss092.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss091.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss10.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/rss090.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - // DC 1.0 - - public function testGetsDescriptionFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss20.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss094.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss093.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss092.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss091.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss10.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc10/rss090.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - // DC 1.1 - - public function testGetsDescriptionFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss20.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss094.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss093.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss092.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss091.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss10.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - public function testGetsDescriptionFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/dc11/rss090.xml') - ); - $this->assertEquals('My Description', $feed->getDescription()); - } - - // Missing Description - - public function testGetsDescriptionFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - public function testGetsDescriptionFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/description/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getDescription()); - } - - /** - * Get Language (Unencoded Text) - */ - public function testGetsLanguageFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss20.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss094.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss093.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss092.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss091.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss10.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rss090.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - // DC 1.0 - - public function testGetsLanguageFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss20.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss094.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss093.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss092.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss091.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss10.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc10/rss090.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - // DC 1.1 - - public function testGetsLanguageFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss20.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss094.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss093.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss092.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss091.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss10.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - public function testGetsLanguageFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/dc11/rss090.xml') - ); - $this->assertEquals('en-GB', $feed->getLanguage()); - } - - // Other - - public function testGetsLanguageFromRss10_XmlLang() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/rdf/rss10.xml') - ); - $this->assertEquals('en', $feed->getLanguage()); - } - - // Missing Language - - public function testGetsLanguageFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLanguageFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/language/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - /** - * Get Link (Unencoded Text) - */ - public function testGetsLinkFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss20.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss094.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss093.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss092.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss091.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss10.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testGetsLinkFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/rss090.xml') - ); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - // Missing Link - - public function testGetsLinkFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - public function testGetsLinkFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getLink()); - } - - /** - * Implements Countable - */ - - public function testCountableInterface() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/link/plain/none/rss090.xml') - ); - $this->assertEquals(0, count($feed)); - } - - /** - * Get Feed Link (Unencoded Text) - */ - public function testGetsFeedLinkFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss20.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsOriginalSourceUriIfFeedLinkNotAvailableFromFeed() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss20_NoFeedLink.xml') - ); - $feed->setOriginalSourceUri('http://www.example.com/feed/rss'); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss094.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss093.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss092.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss091.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss10.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/rss090.xml') - ); - $this->assertEquals('http://www.example.com/feed/rss', $feed->getFeedLink()); - } - - // Missing Feed Link - - public function testGetsFeedLinkFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - public function testGetsFeedLinkFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/feedlink/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getFeedLink()); - } - - /** - * Get Generator (Unencoded Text) - */ - public function testGetsGeneratorFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss20.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss094.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss093.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss092.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss091.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss10.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/rss090.xml') - ); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - // Missing Generator - - public function testGetsGeneratorFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - public function testGetsGeneratorFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/generator/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getGenerator()); - } - - /** - * Get Last Build Date (Unencoded Text) - */ - public function testGetsLastBuildDateFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/lastbuilddate/plain/rss20.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getLastBuildDate())); - } - - public function testGetsLastBuildDateFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/lastbuilddate/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getLastBuildDate()); - } - - /** - * Get Date Modified (Unencoded Text) - */ - public function testGetsDateModifiedFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - /** - * @group ZF-8702 - */ - public function testParsesCorrectDateIfMissingOffsetWhenSystemUsesUSLocale() - { - $locale = new Zend_Locale('en_US'); - Zend_Registry::set('Zend_Locale', $locale); - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20_en_US.xml') - ); - $fdate = $feed->getDateModified(); - $edate = new Zend_Date; - $edate->set('2010-01-04T02:14:00-0600', Zend_Date::ISO_8601); - Zend_Registry::getInstance()->offsetUnset('Zend_Locale'); - $this->assertTrue($edate->equals($fdate)); - } - - // DC 1.0 - - public function testGetsDateModifiedFromRss20_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss20.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss094.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss093.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss092.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss091.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss10.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc10/rss090.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - // DC 1.1 - - public function testGetsDateModifiedFromRss20_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss20.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss094.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss093.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss092.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss091.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss10.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/dc11/rss090.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - // Atom 1.0 - - public function testGetsDateModifiedFromRss20_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss20.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss094_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss094.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss093_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss093.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss092_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss092.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss091_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss091.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss10_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss10.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - public function testGetsDateModifiedFromRss090_atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/atom10/rss090.xml') - ); - $edate = new Zend_Date; - $edate->set('2009-03-07T08:03:50Z', Zend_Date::ISO_8601); - $this->assertTrue($edate->equals($feed->getDateModified())); - } - - // Missing DateModified - - public function testGetsDateModifiedFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - public function testGetsDateModifiedFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/datemodified/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getDateModified()); - } - - /** - * Get Hubs (Unencoded Text) - */ - public function testGetsHubsFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss20.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss094.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss093.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss092.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss091.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss10.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - public function testGetsHubsFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/atom10/rss090.xml') - ); - $this->assertEquals(array( - 'http://www.example.com/hub1', - 'http://www.example.com/hub2' - ), $feed->getHubs()); - } - - // Missing Hubs - - public function testGetsHubsFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - public function testGetsHubsFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/hubs/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getHubs()); - } - - /** - * Get category data - */ - - // RSS 2.0 - - public function testGetsCategoriesFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/rss20.xml') - ); - $this->assertEquals($this->_expectedCats, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - // DC 1.0 - - public function testGetsCategoriesFromRss090_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss090.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss091.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss092.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss093.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss094.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Dc10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc10/rss10.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - // DC 1.1 - - public function testGetsCategoriesFromRss090_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss090.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss091.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss092.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss093.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss094.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Dc11() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/dc11/rss10.xml') - ); - $this->assertEquals($this->_expectedCatsRdf, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','topic2'), array_values($feed->getCategories()->getValues())); - } - - // Atom 1.0 - - public function testGetsCategoriesFromRss090_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss090.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss091.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss092.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss093.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss094.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_Atom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/atom10/rss10.xml') - ); - $this->assertEquals($this->_expectedCatsAtom, (array) $feed->getCategories()); - $this->assertEquals(array('topic1','Cat & Dog'), array_values($feed->getCategories()->getValues())); - } - - // No Categories In Entry - - public function testGetsCategoriesFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss20.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss090.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss091.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss092.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss093.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss094.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - public function testGetsCategoriesFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/category/plain/none/rss10.xml') - ); - $this->assertEquals(array(), (array) $feed->getCategories()); - $this->assertEquals(array(), array_values($feed->getCategories()->getValues())); - } - - /** - * Get Image data (Unencoded Text) - */ - public function testGetsImageFromRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss20.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - public function testGetsImageFromRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss094.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - public function testGetsImageFromRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss093.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - public function testGetsImageFromRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss092.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - public function testGetsImageFromRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss091.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - /*public function testGetsImageFromRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss10.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - } - - public function testGetsImageFromRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/rss090.xml') - ); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/image.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image title', - 'height' => '55', - 'width' => '50', - 'description' => 'Image description' - ), $feed->getImage()); - }*/ - - /** - * Get Image data (Unencoded Text) Missing - */ - public function testGetsImageFromRss20_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss20.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss094_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss094.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss093_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss093.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss092_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss092.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss091_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss091.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss10_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss10.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - - public function testGetsImageFromRss090_None() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/image/plain/none/rss090.xml') - ); - $this->assertEquals(null, $feed->getImage()); - } - -} diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom03.xml deleted file mode 100644 index b048f9da78..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom03.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom10.xml deleted file mode 100644 index 9032ac952d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/author/plain/atom10.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom03.xml deleted file mode 100644 index 510b42f811..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom03.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom10.xml deleted file mode 100644 index 5229fde232..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc10/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc10/atom03.xml deleted file mode 100644 index 02c8c7a317..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc10/atom03.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc11/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc11/atom03.xml deleted file mode 100644 index 8832d68810..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/dc11/atom03.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom03.xml deleted file mode 100644 index 8d52ee994f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom03.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom10.xml deleted file mode 100644 index 08dab19ca3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/category/plain/none/atom10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom03.xml deleted file mode 100644 index f38134dae2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Copyright 2008 - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom10.xml deleted file mode 100644 index c4fa4bf74d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/copyright/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Copyright 2008 - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom03.xml deleted file mode 100644 index a1121f4bd9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom10.xml deleted file mode 100644 index 9689fdafe4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/datecreated/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom03.xml deleted file mode 100644 index 1a5ee9d2e4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom10.xml deleted file mode 100644 index e40fbcde65..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/datemodified/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2009-03-07T08:03:50Z - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom03.xml deleted file mode 100644 index 90148a0a3b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - My Description - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom10.xml deleted file mode 100644 index 150153d194..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/description/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - My Description - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom03.xml deleted file mode 100644 index 18cdf25433..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10-relative.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10-relative.xml deleted file mode 100644 index 07fda0fe49..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10-relative.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10.xml deleted file mode 100644 index cd40d7fb89..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10_NoFeedLink.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10_NoFeedLink.xml deleted file mode 100644 index 2d884af205..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/feedlink/plain/atom10_NoFeedLink.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom03.xml deleted file mode 100644 index 4ad408de01..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Zend_Feed - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom10.xml deleted file mode 100644 index 5baa497697..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/generator/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Zend_Feed - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom03.xml deleted file mode 100644 index d1734bbce6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom03.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom10.xml deleted file mode 100644 index ac8cfb2c0c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/hubs/plain/atom10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom03.xml deleted file mode 100644 index c4f3a570dd..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - http://www.example.com/logo.gif - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom10.xml deleted file mode 100644 index 70f9139c42..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - http://www.example.com/logo.gif - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom03.xml deleted file mode 100644 index 57c63ee924..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom03.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom10.xml deleted file mode 100644 index 2d884af205..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/icon/plain/none/atom10.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom03.xml deleted file mode 100644 index 52a5eefd6b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 123 - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom10.xml deleted file mode 100644 index 0d01f35618..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/id/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 123 - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom03.xml deleted file mode 100644 index b4b808c9af..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - http://www.example.com/logo.gif - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom10.xml deleted file mode 100644 index 7d6744888b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - http://www.example.com/logo.gif - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom03.xml deleted file mode 100644 index 57c63ee924..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom03.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom10.xml deleted file mode 100644 index 2d884af205..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/image/plain/none/atom10.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom03.xml deleted file mode 100644 index 236873b4ee..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - en-GB - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom10.xml deleted file mode 100644 index 8992d2e33b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/language/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - en-GB - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom03.xml deleted file mode 100644 index 8f0b1c9dff..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-norel.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-norel.xml deleted file mode 100644 index 9bbe0fd65d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-norel.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-relative.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-relative.xml deleted file mode 100644 index d75768f021..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10-relative.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10.xml deleted file mode 100644 index 1903f1fe9b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/link/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom03.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom03.xml deleted file mode 100644 index b4e1d6f4fe..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom03.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - My Title - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom10.xml deleted file mode 100644 index c132bd258d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Atom/title/plain/atom10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - My Title - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/author/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/author/atom10.xml deleted file mode 100644 index d5463b66fd..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/author/atom10.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Joe Bloggs - http://www.example.com - joe@example.com - - - Joe Bloggs - http://www.example.com - - - - Joe Bloggs - - - - - - http://www.example.com - joe@example.com - - - - http://www.example.com - - - - - - joe@example.com - - - - - - - - Jane Bloggs - http://www.example.com - jane@example.com - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/category/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/category/atom10.xml deleted file mode 100644 index a7bec9d58d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/category/atom10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/copyright/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/copyright/atom10.xml deleted file mode 100644 index 87132cdedf..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/copyright/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Copyright 2008 - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datecreated/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datecreated/atom10.xml deleted file mode 100644 index 6621d3101c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datecreated/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datemodified/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datemodified/atom10.xml deleted file mode 100644 index 78eb767027..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/datemodified/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - 2009-03-07T08:03:50Z - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/description/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/description/atom10.xml deleted file mode 100644 index 58616a621f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/description/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - My Description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/feedlink/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/feedlink/atom10.xml deleted file mode 100644 index 6b09c8d141..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/feedlink/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/generator/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/generator/atom10.xml deleted file mode 100644 index 915b5f7534..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/generator/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Zend_Feed - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/hubs/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/hubs/atom10.xml deleted file mode 100644 index 1062759729..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/hubs/atom10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/id/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/id/atom10.xml deleted file mode 100644 index 24348e4c4a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/id/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - 123 - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/language/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/language/atom10.xml deleted file mode 100644 index 330fc3ed5d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/language/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - en-GB - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/link/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/link/atom10.xml deleted file mode 100644 index cc34600a51..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/link/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/title/atom10.xml b/tests/Zend/Feed/Reader/Feed/_files/AtomSource/title/atom10.xml deleted file mode 100644 index 9ef8cf3486..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/AtomSource/title/atom10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - My Title - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Common/atom.xml b/tests/Zend/Feed/Reader/Feed/_files/Common/atom.xml deleted file mode 100644 index 1f2c99e6e6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Common/atom.xml +++ /dev/null @@ -1,726 +0,0 @@ - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Feed/_files/Common/atom_noencodingdefined.xml b/tests/Zend/Feed/Reader/Feed/_files/Common/atom_noencodingdefined.xml deleted file mode 100644 index 3e31cbaffb..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Common/atom_noencodingdefined.xml +++ /dev/null @@ -1,726 +0,0 @@ - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Feed/_files/Common/atom_rewrittenbydom.xml b/tests/Zend/Feed/Reader/Feed/_files/Common/atom_rewrittenbydom.xml deleted file mode 100644 index fd9da5f015..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Common/atom_rewrittenbydom.xml +++ /dev/null @@ -1,722 +0,0 @@ - - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Feed/_files/Common/rss.xml b/tests/Zend/Feed/Reader/Feed/_files/Common/rss.xml deleted file mode 100644 index 3d1fdfae24..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Common/rss.xml +++ /dev/null @@ -1,700 +0,0 @@ - - - - - Norm 2782 - - http://www.norm2782.com - Why are you here? - Sat, 07 Mar 2009 08:03:50 +0000 - http://wordpress.org/?v=2.8 - en - hourly - 1 - - Wth… reading books? - http://www.norm2782.com/2009/03/wth-reading-books/ - http://www.norm2782.com/2009/03/wth-reading-books/#comments - Mon, 02 Mar 2009 08:09:33 +0000 - norm2782 - - - - - - http://www.norm2782.com/?p=114 - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- http://www.norm2782.com/2009/03/wth-reading-books/feed/ - 0 -
- - My first few weeks in New Zealand - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/ - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/#comments - Sun, 15 Feb 2009 03:29:21 +0000 - norm2782 - - - - http://www.norm2782.com/?p=105 - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

-


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

-

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

-

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

-

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/feed/ - 0 -
- - Properties in PHP – revisited - http://www.norm2782.com/2009/01/properties-in-php-revisited/ - http://www.norm2782.com/2009/01/properties-in-php-revisited/#comments - Wed, 14 Jan 2009 10:47:25 +0000 - norm2782 - - - - http://www.norm2782.com/?p=94 - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

-

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

-

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- http://www.norm2782.com/2009/01/properties-in-php-revisited/feed/ - 0 -
- - Filters for Zend_Paginator - http://www.norm2782.com/2009/01/filters-for-zend_paginator/ - http://www.norm2782.com/2009/01/filters-for-zend_paginator/#comments - Tue, 13 Jan 2009 12:57:53 +0000 - norm2782 - - - - http://www.norm2782.com/?p=72 - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

-


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- http://www.norm2782.com/2009/01/filters-for-zend_paginator/feed/ - 0 -
- - ZF-3239 - http://www.norm2782.com/2009/01/zf-3239/ - http://www.norm2782.com/2009/01/zf-3239/#comments - Wed, 07 Jan 2009 11:48:31 +0000 - norm2782 - - - - http://www.norm2782.com/?p=68 - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- http://www.norm2782.com/2009/01/zf-3239/feed/ - 0 -
- - New in-ear earphones - http://www.norm2782.com/2009/01/new-in-ear-earphones/ - http://www.norm2782.com/2009/01/new-in-ear-earphones/#comments - Sat, 03 Jan 2009 15:49:19 +0000 - norm2782 - - - http://www.norm2782.com/?p=53 - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

-


-cx300

-]]>
- http://www.norm2782.com/2009/01/new-in-ear-earphones/feed/ - 0 -
- - Seven Things – Tagged by Pádraic - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/ - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/#comments - Sat, 03 Jan 2009 10:14:38 +0000 - norm2782 - - - http://www.norm2782.com/?p=44 - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

-

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • -
-]]>
- http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/feed/ - 0 -
- - AMF Server class for WordPress - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/ - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/#comments - Fri, 02 Jan 2009 14:49:42 +0000 - norm2782 - - - - - http://www.norm2782.com/?p=27 - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

-

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-]]>
- http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/feed/ - 0 -
- - Flex frontend - http://www.norm2782.com/2009/01/flex-frontend/ - http://www.norm2782.com/2009/01/flex-frontend/#comments - Thu, 01 Jan 2009 23:29:35 +0000 - norm2782 - - - - http://www.norm2782.com/?p=22 - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- http://www.norm2782.com/2009/01/flex-frontend/feed/ - 0 -
- - Properties in PHP - http://www.norm2782.com/2009/01/properties-in-php/ - http://www.norm2782.com/2009/01/properties-in-php/#comments - Thu, 01 Jan 2009 23:02:54 +0000 - norm2782 - - - - http://www.norm2782.com/?p=8 - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-]]>
- http://www.norm2782.com/2009/01/properties-in-php/feed/ - 0 -
-
-
diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss090.xml deleted file mode 100644 index c54ad25a98..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss090.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss091.xml deleted file mode 100644 index 854eb5234c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss091.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss092.xml deleted file mode 100644 index 68835bdc34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss092.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss093.xml deleted file mode 100644 index 39bfb532fe..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss093.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss094.xml deleted file mode 100644 index f20b0c4e52..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss094.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss10.xml deleted file mode 100644 index c11eb5557c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss10.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss20.xml deleted file mode 100644 index ce9bc24129..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/atom10/rss20.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Joe Bloggs - - - Jane Bloggs - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss090.xml deleted file mode 100644 index 68e35c214a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss091.xml deleted file mode 100644 index a8ccda602c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss092.xml deleted file mode 100644 index 323729fdfe..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss093.xml deleted file mode 100644 index 84a68f2fe3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss094.xml deleted file mode 100644 index cfa540adb8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss10.xml deleted file mode 100644 index 8c8e82631a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss20.xml deleted file mode 100644 index 4ad1c11b74..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc10/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss090.xml deleted file mode 100644 index 54e026b18e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss090.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss091.xml deleted file mode 100644 index 1d7236c349..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss091.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss092.xml deleted file mode 100644 index 578d70f05c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss092.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss093.xml deleted file mode 100644 index bbb903713d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss093.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss094.xml deleted file mode 100644 index e61e760750..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss094.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss10.xml deleted file mode 100644 index 0fbb88edad..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss20.xml deleted file mode 100644 index a38aa4b550..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/dc11/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Joe Bloggs - Jane Bloggs - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss090.xml deleted file mode 100644 index f3639834b7..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss091.xml deleted file mode 100644 index 3a704257f7..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss091.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss092.xml deleted file mode 100644 index 04a5f2369f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss092.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss093.xml deleted file mode 100644 index 2abe38f8ec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss093.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss094.xml deleted file mode 100644 index 20c763b3d6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss094.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss10.xml deleted file mode 100644 index 97f61c238e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss20.xml deleted file mode 100644 index 084ae2f52d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/author/plain/rss20.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - joe@example.com (Joe Bloggs) - jane@example.com (Jane Bloggs) - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss090.xml deleted file mode 100644 index 84f0e76d5b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss090.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss091.xml deleted file mode 100644 index b9ece3ca5f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss092.xml deleted file mode 100644 index 36e9ae8226..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss093.xml deleted file mode 100644 index 8d31709c4a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss094.xml deleted file mode 100644 index 4dda35b073..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss10.xml deleted file mode 100644 index f9db4b8008..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/atom10/rss10.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss090.xml deleted file mode 100644 index 044832d4a6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss091.xml deleted file mode 100644 index e90ad29263..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss092.xml deleted file mode 100644 index 7909a2e0bf..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss093.xml deleted file mode 100644 index 6370b1f1e4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss094.xml deleted file mode 100644 index d31de294bd..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss10.xml deleted file mode 100644 index de9cfc8d1e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc10/rss10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss090.xml deleted file mode 100644 index 8b5c4c0ee2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss091.xml deleted file mode 100644 index 842ff8932a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss092.xml deleted file mode 100644 index 0d66d5a0ca..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss093.xml deleted file mode 100644 index 0100c3bc3e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss094.xml deleted file mode 100644 index 83683859f8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss10.xml deleted file mode 100644 index 4388162426..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/dc11/rss10.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss090.xml deleted file mode 100644 index 57814153a8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss091.xml deleted file mode 100644 index 04d999e3c6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss092.xml deleted file mode 100644 index 8b31a0745c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss093.xml deleted file mode 100644 index 31d61445b4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss094.xml deleted file mode 100644 index e375a1d94c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss10.xml deleted file mode 100644 index 0ab6cc5b67..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss20.xml deleted file mode 100644 index 8ace034d4a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/none/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/rss20.xml deleted file mode 100644 index 1530bf81c5..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/category/plain/rss20.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - topic1 - topic1 - topic2 - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss090.xml deleted file mode 100644 index 90ceb847c7..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss091.xml deleted file mode 100644 index 3f543e8efa..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss092.xml deleted file mode 100644 index 243bda56bc..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss093.xml deleted file mode 100644 index 731b4b560e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss094.xml deleted file mode 100644 index 6f33176307..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss10.xml deleted file mode 100644 index 7817ee8f3d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss20.xml deleted file mode 100644 index 034df3750b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss090.xml deleted file mode 100644 index 7dcef6bf81..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss091.xml deleted file mode 100644 index 009f2b1360..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss092.xml deleted file mode 100644 index a3cde924ff..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss093.xml deleted file mode 100644 index fd9796136d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss094.xml deleted file mode 100644 index 18472d6018..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss10.xml deleted file mode 100644 index 2313a8c3ce..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss20.xml deleted file mode 100644 index a25587a1f1..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/dc11/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss091.xml deleted file mode 100644 index ab4271a785..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss092.xml deleted file mode 100644 index 3449a0d473..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss093.xml deleted file mode 100644 index c8cb4af8ee..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss094.xml deleted file mode 100644 index 2f23632de7..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss20.xml deleted file mode 100644 index e5e78f0d78..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/copyright/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Copyright 2008 - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss090.xml deleted file mode 100644 index 8435e41741..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss091.xml deleted file mode 100644 index 6a72b12943..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss092.xml deleted file mode 100644 index c98df89764..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss093.xml deleted file mode 100644 index 857ee97006..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss094.xml deleted file mode 100644 index 9fb28087ac..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss10.xml deleted file mode 100644 index fe9e649073..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss20.xml deleted file mode 100644 index 8f55b3f5fa..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/atom10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss090.xml deleted file mode 100644 index 96b513f893..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss091.xml deleted file mode 100644 index 920d4513ec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss092.xml deleted file mode 100644 index be7ace969d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss093.xml deleted file mode 100644 index c0e67a6dc1..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss094.xml deleted file mode 100644 index 4c8a82dae2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss10.xml deleted file mode 100644 index af11177bc5..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss20.xml deleted file mode 100644 index 777d88e6a7..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss090.xml deleted file mode 100644 index da0a1a95dc..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss091.xml deleted file mode 100644 index 9f9e85fdd4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss092.xml deleted file mode 100644 index 75ec5ec9b3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss093.xml deleted file mode 100644 index e8d44a4a0e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss094.xml deleted file mode 100644 index 1a47cf8a80..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss10.xml deleted file mode 100644 index c481fbda16..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss20.xml deleted file mode 100644 index e87b162632..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/dc11/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 2009-03-07T08:03:50Z - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss10.xml deleted file mode 100644 index 34dd52daba..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20.xml deleted file mode 100644 index 5d22fe6e19..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Sat, 07 Mar 2009 08:03:50 +0000 - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20_en_US.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20_en_US.xml deleted file mode 100644 index 778b10c814..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20_en_US.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Mon, 4 Jan 2010 02:14:00 CST - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss090.xml deleted file mode 100644 index 8cfb1c68c8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss091.xml deleted file mode 100644 index 2e29c3d527..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss092.xml deleted file mode 100644 index 1d9a8865ad..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss093.xml deleted file mode 100644 index c89b10c5fa..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss094.xml deleted file mode 100644 index 532d741430..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss10.xml deleted file mode 100644 index 0b1c12bb71..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss20.xml deleted file mode 100644 index 11dd628933..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss090.xml deleted file mode 100644 index 8d9040f2ea..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss091.xml deleted file mode 100644 index 2b0e79f5fa..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss092.xml deleted file mode 100644 index 03bafab9eb..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss093.xml deleted file mode 100644 index 674098564e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss094.xml deleted file mode 100644 index 80973553d8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss10.xml deleted file mode 100644 index ff142bbda1..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss20.xml deleted file mode 100644 index a72cf2da46..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/dc11/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss090.xml deleted file mode 100644 index 7b48832002..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss091.xml deleted file mode 100644 index cc68fb4b90..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss092.xml deleted file mode 100644 index 1bf7d27c01..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss093.xml deleted file mode 100644 index a763d3f247..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss094.xml deleted file mode 100644 index dc1db0fb1f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss10.xml deleted file mode 100644 index 175652268e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss20.xml deleted file mode 100644 index ae9b934e06..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/description/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Description - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss090.xml deleted file mode 100644 index 4eab29c2ac..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss091.xml deleted file mode 100644 index 81c090daa6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss092.xml deleted file mode 100644 index a4b9c6cb58..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss093.xml deleted file mode 100644 index 998ef757a2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss094.xml deleted file mode 100644 index 4fb02a8b11..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss10.xml deleted file mode 100644 index 87774bad6a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss20.xml deleted file mode 100644 index db102b5d5a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/none/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss090.xml deleted file mode 100644 index 004bfd6c07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss091.xml deleted file mode 100644 index fcbbeb652e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss092.xml deleted file mode 100644 index b60f7fc342..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss093.xml deleted file mode 100644 index a6e77af268..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss094.xml deleted file mode 100644 index 99690d2d20..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss10.xml deleted file mode 100644 index a2954c2725..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20.xml deleted file mode 100644 index 7a618962f4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20_NoFeedLink.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20_NoFeedLink.xml deleted file mode 100644 index db102b5d5a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/feedlink/plain/rss20_NoFeedLink.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss090.xml deleted file mode 100644 index 4eab29c2ac..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss091.xml deleted file mode 100644 index 81c090daa6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss092.xml deleted file mode 100644 index a4b9c6cb58..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss093.xml deleted file mode 100644 index 998ef757a2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss094.xml deleted file mode 100644 index 4fb02a8b11..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss10.xml deleted file mode 100644 index 87774bad6a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss20.xml deleted file mode 100644 index db102b5d5a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/none/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss090.xml deleted file mode 100644 index 802065be2a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss091.xml deleted file mode 100644 index 3cd9b7e5d3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss092.xml deleted file mode 100644 index 57d489cbd1..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss093.xml deleted file mode 100644 index 1f5be0a4b3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss094.xml deleted file mode 100644 index 28cf90eabb..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss10.xml deleted file mode 100644 index 39e4cf6e54..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss20.xml deleted file mode 100644 index d691c60d1c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/generator/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Zend_Feed_Writer - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss090.xml deleted file mode 100644 index bdadcb31ec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss090.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss091.xml deleted file mode 100644 index 5c46a38337..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss091.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss092.xml deleted file mode 100644 index c1a9ed5287..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss092.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss093.xml deleted file mode 100644 index f46bc675f5..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss093.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss094.xml deleted file mode 100644 index e79c2fd8d3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss094.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss10.xml deleted file mode 100644 index fbec0334d8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss10.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss20.xml deleted file mode 100644 index 03ace4cf61..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/atom10/rss20.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss090.xml deleted file mode 100644 index 4eab29c2ac..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss091.xml deleted file mode 100644 index 81c090daa6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss092.xml deleted file mode 100644 index a4b9c6cb58..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss093.xml deleted file mode 100644 index 998ef757a2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss094.xml deleted file mode 100644 index 4fb02a8b11..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss10.xml deleted file mode 100644 index 87774bad6a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss20.xml deleted file mode 100644 index db102b5d5a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/hubs/plain/none/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss090.xml deleted file mode 100644 index a9146377ca..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss090.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss091.xml deleted file mode 100644 index cab325ce17..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss091.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss092.xml deleted file mode 100644 index c921bb6230..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss092.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss093.xml deleted file mode 100644 index a76e122a53..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss093.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss094.xml deleted file mode 100644 index 3757c0e069..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss094.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss10.xml deleted file mode 100644 index 1f8b875771..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss10.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss20.xml deleted file mode 100644 index 7038f7f3e0..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/image/plain/rss20.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - http://www.example.com/image.gif - http://www.example.com - Image title - 50 - 55 - Image description - - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss090.xml deleted file mode 100644 index bb022764e2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss091.xml deleted file mode 100644 index 9335a6c16a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss092.xml deleted file mode 100644 index dfbff1f319..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss093.xml deleted file mode 100644 index 2e5c1421bd..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss094.xml deleted file mode 100644 index 5958ca1577..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss10.xml deleted file mode 100644 index 9bc44bb943..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss20.xml deleted file mode 100644 index 8323e8ee4d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss090.xml deleted file mode 100644 index 8491246f0c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss091.xml deleted file mode 100644 index e871513f49..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss092.xml deleted file mode 100644 index 095ac721d2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss093.xml deleted file mode 100644 index 1698bd2e05..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss094.xml deleted file mode 100644 index 83914a3e26..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss10.xml deleted file mode 100644 index ecc20dbcdd..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss20.xml deleted file mode 100644 index 9dbd49a256..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/dc11/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rdf/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rdf/rss10.xml deleted file mode 100644 index 2051d36bb6..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rdf/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss091.xml deleted file mode 100644 index 612ed25ce2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss092.xml deleted file mode 100644 index 4f08019c9a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss093.xml deleted file mode 100644 index dbace46b78..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss094.xml deleted file mode 100644 index d152c626ec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss20.xml deleted file mode 100644 index 75e94e4d67..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/language/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - en-GB - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/rss20.xml deleted file mode 100644 index 5d22fe6e19..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/lastbuilddate/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Sat, 07 Mar 2009 08:03:50 +0000 - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss090.xml deleted file mode 100644 index d891d3ac9e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss091.xml deleted file mode 100644 index cc8d59addb..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss092.xml deleted file mode 100644 index 4a109b0c7b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss093.xml deleted file mode 100644 index 510d4ffc25..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss094.xml deleted file mode 100644 index 28873451ff..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss10.xml deleted file mode 100644 index d160c51c5f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss20.xml deleted file mode 100644 index 7a64a43a0c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/link/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - http://www.example.com - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss090.xml deleted file mode 100644 index 50d109077f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss091.xml deleted file mode 100644 index 8d2e066bb9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss092.xml deleted file mode 100644 index 3558f6692c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss093.xml deleted file mode 100644 index 6d642f2f9f..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss094.xml deleted file mode 100644 index d4dc23d43d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss10.xml deleted file mode 100644 index f6b2dd3b9d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss20.xml deleted file mode 100644 index 1566812db3..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/atom10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss090.xml deleted file mode 100644 index 2cdf962cfa..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss091.xml deleted file mode 100644 index faf1d232f9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss092.xml deleted file mode 100644 index 59a7758b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss093.xml deleted file mode 100644 index 99349c4741..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss094.xml deleted file mode 100644 index 39904014e4..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss10.xml deleted file mode 100644 index a5dc896f3e..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss20.xml deleted file mode 100644 index dac8c0bf8d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc10/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss090.xml deleted file mode 100644 index 960245dc1c..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss090.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss091.xml deleted file mode 100644 index 1e5099458b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss091.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss092.xml deleted file mode 100644 index cc0bacef3b..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss092.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss093.xml deleted file mode 100644 index c25ed842ec..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss093.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss094.xml deleted file mode 100644 index a6747668da..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss094.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss10.xml deleted file mode 100644 index dda2bf6c45..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss10.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss20.xml deleted file mode 100644 index 9a3772e269..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/dc11/rss20.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss090.xml deleted file mode 100644 index 3cec664b34..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss091.xml deleted file mode 100644 index 259a7e27f2..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss092.xml deleted file mode 100644 index 72ed43e2e9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss093.xml deleted file mode 100644 index 1fb8f89ec9..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss094.xml deleted file mode 100644 index 30d484477a..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss10.xml deleted file mode 100644 index 67f28b9d07..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/none/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss090.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss090.xml deleted file mode 100644 index 57409267a0..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss090.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss091.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss091.xml deleted file mode 100644 index 2c92eda28d..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss091.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss092.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss092.xml deleted file mode 100644 index 2427847dc5..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss092.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss093.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss093.xml deleted file mode 100644 index 77545238ff..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss093.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss094.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss094.xml deleted file mode 100644 index 9464939509..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss094.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss10.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss10.xml deleted file mode 100644 index 7f0821c839..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss10.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss20.xml b/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss20.xml deleted file mode 100644 index e369a43af8..0000000000 --- a/tests/Zend/Feed/Reader/Feed/_files/Rss/title/plain/rss20.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - My Title - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Integration/H-OnlineComAtom10Test.php b/tests/Zend/Feed/Reader/Integration/H-OnlineComAtom10Test.php deleted file mode 100644 index 09c3d3a378..0000000000 --- a/tests/Zend/Feed/Reader/Integration/H-OnlineComAtom10Test.php +++ /dev/null @@ -1,227 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/h-online.com-atom10.xml'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - public function testGetsTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('The H - news feed', $feed->getTitle()); - } - - public function testGetsAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array(array('name'=>'The H')), (array) $feed->getAuthors()); - } - - public function testGetsSingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array('name'=>'The H'), $feed->getAuthor()); - } - - public function testGetsCopyright() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Technology news', $feed->getDescription()); - } - - public function testGetsLanguage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://www.h-online.com', $feed->getLink()); - } - - public function testGetsEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testGetsEntryCount() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(60, $feed->count()); - } - - /** - * Entry level testing - */ - - public function testGetsEntryId() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss', $entry->getId()); - } - - public function testGetsEntryTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('McAfee update brings systems down again', $entry->getTitle()); - } - - public function testGetsEntryAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array(array('name'=>'The H')), (array) $entry->getAuthors()); - } - - public function testGetsEntrySingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'The H'), $entry->getAuthor()); - } - - public function testGetsEntryDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - /** - * Note: "’" is not the same as "'" - don't replace in error - */ - $this->assertEquals('A McAfee signature update is currently causing system failures and a lot of overtime for administrators', $entry->getDescription()); - } - - public function testGetsEntryContent() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('A McAfee signature update is currently causing system failures and a lot of overtime for administrators', $entry->getContent()); - } - - public function testGetsEntryLinks() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss'), $entry->getLinks()); - } - - public function testGetsEntryLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss', $entry->getLink()); - } - - public function testGetsEntryPermaLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss', - $entry->getPermaLink()); - } - - public function testGetsEntryEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - -} diff --git a/tests/Zend/Feed/Reader/Integration/LautDeRdfTest.php b/tests/Zend/Feed/Reader/Integration/LautDeRdfTest.php deleted file mode 100644 index e614ea8290..0000000000 --- a/tests/Zend/Feed/Reader/Integration/LautDeRdfTest.php +++ /dev/null @@ -1,227 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/laut.de-rdf.xml'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Feed level testing - */ - - public function testGetsTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('laut.de - news', $feed->getTitle()); - } - - public function testGetsAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array(array('name'=>'laut.de')), (array) $feed->getAuthors()); - } - - public function testGetsSingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array('name'=>'laut.de'), $feed->getAuthor()); - } - - public function testGetsCopyright() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Copyright © 2004 laut.de', $feed->getCopyright()); - } - - public function testGetsDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('laut.de: aktuelle News', $feed->getDescription()); - } - - public function testGetsLanguage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testGetsLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://www.laut.de', $feed->getLink()); - } - - public function testGetsEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('ISO-8859-1', $feed->getEncoding()); - } - - - - /** - * Entry level testing - */ - - public function testGetsEntryId() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm', $entry->getId()); - } - - public function testGetsEntryTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('Angelika Express: MySpace-Aus wegen Sido-Werbung', $entry->getTitle()); - } - - public function testGetsEntryAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array(array('name'=>'laut.de')), (array) $entry->getAuthors()); - } - - public function testGetsEntrySingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'laut.de'), $entry->getAuthor()); - } - - // Technically, the next two tests should not pass. However the source feed has an encoding - // problem - it's stated as ISO-8859-1 but sent as UTF-8. The result is that a) it's - // broken itself, or b) We should consider a fix in the future for similar feeds such - // as using a more limited XML based decoding method (not html_entity_decode()) - - public function testGetsEntryDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('Schon länger haderten die Kölner mit der Plattform des "fiesen Rupert Murdoch". Das Fass zum Überlaufen brachte aber ein Werbebanner von Deutschrapper Sido.', $entry->getDescription()); - } - - public function testGetsEntryContent() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('Schon länger haderten die Kölner mit der Plattform des "fiesen Rupert Murdoch". Das Fass zum Überlaufen brachte aber ein Werbebanner von Deutschrapper Sido.', $entry->getContent()); - } - - public function testGetsEntryLinks() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm'), $entry->getLinks()); - } - - public function testGetsEntryLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm', $entry->getLink()); - } - - public function testGetsEntryPermaLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm', - $entry->getPermaLink()); - } - - public function testGetsEntryEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('ISO-8859-1', $entry->getEncoding()); - } - -} diff --git a/tests/Zend/Feed/Reader/Integration/PodcastRss2Test.php b/tests/Zend/Feed/Reader/Integration/PodcastRss2Test.php deleted file mode 100644 index 3cba9b7d86..0000000000 --- a/tests/Zend/Feed/Reader/Integration/PodcastRss2Test.php +++ /dev/null @@ -1,298 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/podcast.xml'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - /** - * Feed level testing - */ - - public function testGetsNewFeedUrl() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://newlocation.com/example.rss', $feed->getNewFeedUrl()); - } - - public function testGetsOwner() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('john.doe@example.com (John Doe)', $feed->getOwner()); - } - - /* - public function testGetsCategories() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array( - 'Technology' => array( - 'Gadgets' => null - ), - 'TV & Film' => null - ), $feed->getCategories()); - } - */ - - public function testGetsTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('All About Everything', $feed->getTitle()); - } - - public function testGetsCastAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('John Doe', $feed->getCastAuthor()); - } - - public function testGetsFeedBlock() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('no', $feed->getBlock()); - } - - public function testGetsCopyright() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('â„— & © 2005 John Doe & Family', $feed->getCopyright()); - } - - public function testGetsDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('All About Everything is a show about everything. - Each week we dive into any subject known to man and talk - about it as much as we can. Look for our Podcast in the - iTunes Store', $feed->getDescription()); - } - - public function testGetsLanguage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('en-us', $feed->getLanguage()); - } - - public function testGetsLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://www.example.com/podcasts/everything/index.html', $feed->getLink()); - } - - public function testGetsEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testGetsFeedExplicit() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('yes', $feed->getExplicit()); - } - - public function testGetsEntryCount() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(3, $feed->count()); - } - - /* - public function testGetsImage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://example.com/podcasts/everything/AllAboutEverything.jpg', $feed->getImage()); - } - */ - - /** - * Entry level testing - */ - - public function testGetsEntryBlock() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('yes', $entry->getBlock()); - } - - public function testGetsEntryId() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://example.com/podcasts/archive/aae20050615.m4a', $entry->getId()); - } - - public function testGetsEntryTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('Shake Shake Shake Your Spices', $entry->getTitle()); - } - - public function testGetsEntryCastAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('John Doe', $entry->getCastAuthor()); - } - - public function testGetsEntryExplicit() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('no', $entry->getExplicit()); - } - - public function testGetsSubtitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('A short primer on table spices - ', $entry->getSubtitle()); - } - - public function testGetsSummary() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('This week we talk about salt and pepper - shakers, comparing and contrasting pour rates, - construction materials, and overall aesthetics. Come and - join the party!', $entry->getSummary()); - } - - public function testGetsDuration() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('7:04', $entry->getDuration()); - } - - public function testGetsKeywords() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('salt, pepper, shaker, exciting - ', $entry->getKeywords()); - } - - public function testGetsEntryEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - - public function testGetsEnclosure() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - - $expected = new stdClass(); - $expected->url = 'http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4a'; - $expected->length = '8727310'; - $expected->type = 'audio/x-m4a'; - - $this->assertEquals($expected, $entry->getEnclosure()); - } -} diff --git a/tests/Zend/Feed/Reader/Integration/WordpressAtom10Test.php b/tests/Zend/Feed/Reader/Integration/WordpressAtom10Test.php deleted file mode 100644 index e6cf480907..0000000000 --- a/tests/Zend/Feed/Reader/Integration/WordpressAtom10Test.php +++ /dev/null @@ -1,233 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/wordpress-atom10.xml'; - $this->_options = Zend_Date::setOptions(); - foreach($this->_options as $k=>$v) { - if (is_null($v)) { - unset($this->_options[$k]); - } - } - Zend_Date::setOptions(array('format_type'=>'iso')); - } - - public function teardown() - { - Zend_Date::setOptions($this->_options); - } - - public function testGetsTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Norm 2782', $feed->getTitle()); - } - - public function testGetsAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array( - array('name'=>'norm2782','uri'=>'http://www.norm2782.com') - ), (array) $feed->getAuthors()); - } - - public function testGetsSingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array('name'=>'norm2782','uri'=>'http://www.norm2782.com'), $feed->getAuthor()); - } - - public function testGetsCopyright() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Why are you here?', $feed->getDescription()); - } - - public function testGetsLanguage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('en', $feed->getLanguage()); - } - - public function testGetsLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://www.norm2782.com', $feed->getLink()); - } - - public function testGetsEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testGetsEntryCount() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(10, $feed->count()); - } - - /** - * Entry level testing - */ - - public function testGetsEntryId() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/?p=114', $entry->getId()); - } - - public function testGetsEntryTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - /** - * Note: The three dots below is actually a single Unicode character - * called the "three dot leader". Don't replace in error! - */ - $this->assertEquals('Wth… reading books?', $entry->getTitle()); - } - - public function testGetsEntryAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array(array('name'=>'norm2782','uri'=>'http://www.norm2782.com')), (array) $entry->getAuthors()); - } - - public function testGetsEntrySingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'norm2782','uri'=>'http://www.norm2782.com'), $entry->getAuthor()); - } - - public function testGetsEntryDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - /** - * Note: "’" is not the same as "'" - don't replace in error - */ - $this->assertEquals('Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.'."\n\n".'Agile Software Development with Scrum, by Ken Schwaber and Mike Beedle'."\n".'Domain-Driven Design: Tackling Complexity in the [...]', $entry->getDescription()); - } - - public function testGetsEntryContent() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('

Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

', str_replace("\n",'',$entry->getContent())); - } - - public function testGetsEntryLinks() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('http://www.norm2782.com/2009/03/wth-reading-books/'), $entry->getLinks()); - } - - public function testGetsEntryLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/2009/03/wth-reading-books/', $entry->getLink()); - } - - public function testGetsEntryPermaLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/2009/03/wth-reading-books/', - $entry->getPermaLink()); - } - - public function testGetsEntryEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - -} diff --git a/tests/Zend/Feed/Reader/Integration/WordpressRss2DcAtomTest.php b/tests/Zend/Feed/Reader/Integration/WordpressRss2DcAtomTest.php deleted file mode 100644 index fbf85a3a01..0000000000 --- a/tests/Zend/Feed/Reader/Integration/WordpressRss2DcAtomTest.php +++ /dev/null @@ -1,225 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files/wordpress-rss2-dc-atom.xml'; - } - - /** - * Feed level testing - */ - - public function testGetsTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Norm 2782', $feed->getTitle()); - } - - public function testGetsAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array( - array('name'=>'norm2782') - ), (array) $feed->getAuthors()); - } - - public function testGetsSingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(array('name'=>'norm2782'), $feed->getAuthor()); - } - - public function testGetsCopyright() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(null, $feed->getCopyright()); - } - - public function testGetsDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('Why are you here?', $feed->getDescription()); - } - - public function testGetsLanguage() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('en', $feed->getLanguage()); - } - - public function testGetsLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('http://www.norm2782.com', $feed->getLink()); - } - - public function testGetsEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testGetsEntryCount() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $this->assertEquals(10, $feed->count()); - } - - /** - * Entry level testing - */ - - public function testGetsEntryId() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/?p=114', $entry->getId()); - } - - public function testGetsEntryTitle() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - /** - * Note: The three dots below is actually a single Unicode character - * called the "three dot leader". Don't replace in error! - */ - $this->assertEquals('Wth… reading books?', $entry->getTitle()); - } - - public function testGetsEntryAuthors() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array(array('name'=>'norm2782')), (array) $entry->getAuthors()); - } - - public function testGetsEntrySingleAuthor() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('name'=>'norm2782'), $entry->getAuthor()); - } - - public function testGetsEntryDescription() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - /** - * Note: "’" is not the same as "'" - don't replace in error - */ - $this->assertEquals('Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.'."\n\n".'Agile Software Development with Scrum, by Ken Schwaber and Mike Beedle'."\n".'Domain-Driven Design: Tackling Complexity in the [...]', $entry->getDescription()); - } - - public function testGetsEntryContent() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('

Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

'."\n".''."\n".'

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

'."\n", $entry->getContent()); - } - - public function testGetsEntryLinks() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals(array('http://www.norm2782.com/2009/03/wth-reading-books/'), $entry->getLinks()); - } - - public function testGetsEntryLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/2009/03/wth-reading-books/', $entry->getLink()); - } - - public function testGetsEntryPermaLink() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('http://www.norm2782.com/2009/03/wth-reading-books/', - $entry->getPermaLink()); - } - - public function testGetsEntryEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath) - ); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - -} diff --git a/tests/Zend/Feed/Reader/Integration/_files/h-online.com-atom10.xml b/tests/Zend/Feed/Reader/Integration/_files/h-online.com-atom10.xml deleted file mode 100644 index bd008ef9cf..0000000000 --- a/tests/Zend/Feed/Reader/Integration/_files/h-online.com-atom10.xml +++ /dev/null @@ -1,584 +0,0 @@ - - - - -The H - news feed -Technology news - - -2009-07-04T20:31:10+02:00 - -The H - -http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss - - - McAfee update brings systems down again - - A McAfee signature update is currently causing system failures and a lot of overtime for administrators - http://www.h-online.com/security/McAfee-update-brings-systems-down-again--/news/113689/from/rss - 2009-07-04T20:31:10+02:00 - - - - - - The H Week - - This week, The H reported on several new major releases, including Firefox 3.5, Python 3.1, NetBeans 6.7, PHP 5.3.0, VirtualBox 3.0 and PostgreSQL 8.4, and covered the result of Stallman's open letter criticising Debian's use of Mono - http://www.h-online.com/news/The-H-Week--/113687/from/rss - 2009-07-04T09:34:53+02:00 - - - - - GNOME and KDE developer conference begins on Gran Canaria - - The Gran Canaria Desktop Summit 2009 is the first time that the KDE and GNOME communities are co-locating their annual GUADEC and Akademy conferences - http://www.h-online.com/open/GNOME-and-KDE-developer-conference-begins-on-Gran-Canaria--/news/113688/from/rss - 2009-07-03T17:08:07+02:00 - - - - - - XHTML 2 to be discontinued - - The W3C announced yesterday that it will discontinue its work on XHTML 2 and will instead focus exclusively on (X)HTML 5 as a successor of current web standards - http://www.h-online.com/open/XHTML-2-to-be-discontinued--/news/113686/from/rss - 2009-07-03T15:14:56+02:00 - - - - - No mandatory audio and video codecs in HTML 5 - - Some members of the WHATWG reject Ogg Theora, and H.264 is subject to licence fees, so Ian Hickson has decided to eliminate all reference to mandatory audio/video codecs from the HTML 5 specification - http://www.h-online.com/open/No-mandatory-audio-and-video-codecs-in-HTML-5--/news/113685/from/rss - 2009-07-03T13:01:43+02:00 - - - - - - "Luxembourg attacks" on AES encryption - - Although the attacks don't affect the practical security of AES, they represent substantial cryptological progress - http://www.h-online.com/security/Luxembourg-attacks-on-AES-encryption--/news/113684/from/rss - 2009-07-03T17:17:04+02:00 - - - - - Fluendo releases DVD player for Linux - - Fluendo has released its own DVD player for Linux built on the open source GStreamer multimedia framework - http://www.h-online.com/open/Fluendo-releases-DVD-player-for-Linux--/news/113683/from/rss - 2009-07-03T11:40:42+02:00 - - - - - - No more updates for Python 3.0 - - The Python developers have announced that there will be no additional maintenance or security update releases for version 3.0 of the Python scripting language - http://www.h-online.com/open/No-more-updates-for-Python-3-0--/news/113682/from/rss - 2009-07-03T10:30:33+02:00 - - - - - GNOME 2.26.3 released - - The GNOME release team have announced the availability of the final update to GNOME 2.26 - http://www.h-online.com/open/GNOME-2-26-3-released--/news/113679/from/rss - 2009-07-03T16:13:50+02:00 - - - - - - Alledged critical security vulnerability in iPhone SMS application - - According to US media reports, Apple is working on an update for the iPhone to fix a critical vulnerability in its texting application - http://www.h-online.com/security/Alledged-critical-security-vulnerability-in-iPhone-SMS-application--/news/113680/from/rss - 2009-07-03T14:29:51+02:00 - - - - - Hard times for NeoOffice - - The developers of the free open source NeoOffice office suite for Mac OS X have announced that, due to very low donation levels this year, they will be forced to make severe cutbacks - http://www.h-online.com/open/Hard-times-for-NeoOffice--/news/113678/from/rss - 2009-07-02T17:42:53+02:00 - - - - - - Study shows rise in spam botnets - - According to MessageLabs, June 2009 saw a worldwide increase in spam being sent via botnets to 83.2 per cent, up from only 57.6 per cent in May - http://www.h-online.com/security/Study-shows-rise-in-spam-botnets--/news/113677/from/rss - 2009-07-03T17:05:01+02:00 - - - - - MD6 hash algorithm withdrawn from SHA-3 competition - - MD6 was, despite its relative slowness, one of the favourites. The reasons given for the withdrawal by lead developer Ron Rivest surprised even those in the know - http://www.h-online.com/security/MD6-hash-algorithm-withdrawn-from-SHA-3-competition--/news/113676/from/rss - 2009-07-02T17:03:50+02:00 - - - - - - Ubuntu to continue using Mono - - The Ubuntu Technical Board has clarified that the use of the Mono stack implementation is not considered to be a problem and that it, and applications based on it, will continue to be included with the default Ubuntu installation set - http://www.h-online.com/open/Ubuntu-to-continue-using-Mono--/news/113674/from/rss - 2009-07-02T17:01:17+02:00 - - - - - WordPress themes must be GPL - - WordPress themes are derivative works and should be licensed under the GPL say WordPress developers after consulting the Software Freedom Law Center - http://www.h-online.com/open/WordPress-themes-must-be-GPL--/news/113675/from/rss - 2009-07-02T15:37:30+02:00 - - - - - - Google Update no longer runs continuously - - To address concerns from users, the Google Update open source software installer and auto-updater for Windows now uses the Windows Task Scheduler to only run at periodic intervals - http://www.h-online.com/open/Google-Update-no-longer-runs-continuously--/news/113673/from/rss - 2009-07-02T14:20:03+02:00 - - - - - Kernel Log - Coming in 2.6.31 - Part 1: New Wi-Fi drivers and other network-related changes - - Linux 2.6.31 will include a new Wi-Fi driver for Intel chips and will be WPAN-capable in accordance with IEEE 802.15.4. The developers have also improved support for Ralink Wi-Fi components and for newer power saving technologies - http://www.h-online.com/open/Kernel-Log-Coming-in-2-6-31-Part-1-New-Wi-Fi-drivers-and-other-network-related-changes--/news/113670/from/rss - 2009-07-02T17:40:56+02:00 - - - - - - AACS LA reduces copy protection charges for Blu-ray Discs - - The reduced charges are primarily intended to benefit small studios and pressing companies that have yet to release any Blu-ray versions of their films due to the high cost - http://www.h-online.com/security/AACS-LA-reduces-copy-protection-charges-for-Blu-ray-Discs--/news/113672/from/rss - 2009-07-02T17:02:44+02:00 - - - - - SourceForge.net: four billion served - - SourceForge Inc. has announced that its SourceForge.net software site has served its four billionth download. The four billionth application was downloaded on the 8th of June from PortableApps.com - http://www.h-online.com/open/SourceForge-net-four-billion-served--/news/113668/from/rss - 2009-07-03T09:05:26+02:00 - - - - - - Apple's iDisk sealed - - A hole has been closed in Apple's iDisk storage system after a vulnerability allowing unauthorised access was discovered - http://www.h-online.com/security/Apple-s-iDisk-sealed--/news/113669/from/rss - 2009-07-02T11:02:56+02:00 - - - - - Red Hat Enterprise Linux 5.4 beta with KVM - - Apart from offering a range of new features and new and improved drivers, the beta is the first version of RHEL 5.4 to support KVM (Kernel-based Virtual Machine) virtualisation - http://www.h-online.com/open/Red-Hat-Enterprise-Linux-5-4-beta-with-KVM--/news/113667/from/rss - 2009-07-02T10:34:57+02:00 - - - - - - Mercurial 1.3 released - - The distributed version control system is updated and adds experimental support for subrepositories and better local sharing - http://www.h-online.com/open/Mercurial-1-3-released--/news/113666/from/rss - 2009-07-03T09:05:48+02:00 - - - - - CMS Made Simple 1.6 released - - CMS Made Simple, an open source Content Management System, has been updated to version 1.6. The primary focus of the release was the complete re-working of the content permissions system - http://www.h-online.com/open/CMS-Made-Simple-1-6-released--/news/113665/from/rss - 2009-07-01T16:09:52+02:00 - - - - - - KDE 4.3.0 release candidate available - - The KDE developers have announced the availability of the first release candidate of KDE 4.3.0 - http://www.h-online.com/open/KDE-4-3-0-release-candidate-available--/news/113663/from/rss - 2009-07-01T15:22:54+02:00 - - - - - JavaScript Tested - - Two sets of JavaScript unit tests have been released, one by Microsoft and one by Google, to help developers who are implementing the language - http://www.h-online.com/open/JavaScript-Tested--/news/113664/from/rss - 2009-07-01T15:14:12+02:00 - - - - - - Firefox 3.5 already downloaded more than 4 million times - - Less than 24 hours since it was released, Firefox 3.5 has already been downloaded more than four million times and is currently being downloaded approximately 77 times every second - http://www.h-online.com/open/Firefox-3-5-already-downloaded-more-than-4-million-times--/news/113661/from/rss - 2009-07-01T14:34:01+02:00 - - - - - PostgreSQL 8.4 now available - - 16 months of development brings faster database restoration, new SQL functionality and conformance and more - http://www.h-online.com/open/PostgreSQL-8-4-now-available--/news/113662/from/rss - 2009-07-01T14:31:39+02:00 - - - - - - Debian - Mono is not in our default installation - - Debian have responded to Richard Stallman's claim that the project is including Mono in the default installation of the GNU/Linux distribution - http://www.h-online.com/open/Debian-Mono-is-not-in-our-default-installation--/news/113660/from/rss - 2009-07-01T12:47:28+02:00 - - - - - Kaspersky tightens up anti-virus engine - - Kaspersky has fixed its malware detection problem in its 2010 products via an automatic update. The cause of the detection problems that allowed malware to be overlooked seems to have been even more severe than was initially apparent - http://www.h-online.com/security/Kaspersky-tightens-up-anti-virus-engine--/news/113656/from/rss - 2009-07-01T12:02:04+02:00 - - - - - - Security updates for VMWare-ESX - - VMWare updates ESX Server to close a vulnerability in its Kerberos implementation - http://www.h-online.com/security/Security-updates-for-VMWare-ESX--/news/113659/from/rss - 2009-07-01T11:29:20+02:00 - - - - - The new Maven 2.2.0 requires Java 5 - - The new version of the free Java build tool should bring greater stability and fixes a number of less critical bugs - http://www.h-online.com/open/The-new-Maven-2-2-0-requires-Java-5--/news/113658/from/rss - 2009-07-01T11:23:20+02:00 - - - - - - Cash machine cracking presentation cancelled - - Juniper Networks has withdrawn a presentation at the Black Hat conference entitled "Jackpotting Automated Teller Machines" after a cash machine manufacturer intervened - http://www.h-online.com/security/Cash-machine-cracking-presentation-cancelled--/news/113657/from/rss - 2009-07-01T11:14:34+02:00 - - - - - PCLinuxOS 2009.2 released - - The PCLinuxOS developers have released version 2009.2 of the free PCLinuxOS and PCLinuxOS GNOME distributions - http://www.h-online.com/open/PCLinuxOS-2009-2-released--/news/113655/from/rss - 2009-07-01T10:19:52+02:00 - - - - - - UK presents cyber-security strategy - - According to Gordon Brown, the internet today is as important to the UK as the seas were in the 19th century and the air was in the 20th - http://www.h-online.com/security/UK-presents-cyber-security-strategy--/news/113654/from/rss - 2009-06-30T18:05:50+02:00 - - - - - Firefox 3.5 now available - - Mozilla has released version 3.5 of their open source Firefox web browser, code named "Shiretoko", which includes the new Trace Monkey JavaScript engine and is based on version 1.91 of the Gecko layout engine - http://www.h-online.com/open/Firefox-3-5-now-available--/news/113653/from/rss - 2009-06-30T18:49:21+02:00 - - - - - - Swatting phreaker swatted and heading to jail - - A 19-year-old American has been sentenced to eleven years in prison for placing faked phone calls that dispatched special police units to the homes of unwitting families - http://www.h-online.com/security/Swatting-phreaker-swatted-and-heading-to-jail--/news/113652/from/rss - 2009-06-30T17:03:08+02:00 - - - - - VirtualBox 3.0 released - - Sun Microsystems has announced the released of version 3.0 of its open source VirtualBox desktop virtualisation application for x86 hardware which now includes experimental support for Direct3D 8 & 9 in applications for Windows guests - http://www.h-online.com/open/VirtualBox-3-0-released--/news/113651/from/rss - 2009-06-30T16:35:07+02:00 - - - - - - MilePost Compiler: AI optimises machine code - - A GCC-based compiler developed by the MilePost project automatically learns how to translate source code into efficient binary code - http://www.h-online.com/open/MilePost-Compiler-AI-optimises-machine-code--/news/113650/from/rss - 2009-06-30T16:27:51+02:00 - - - - - PHP 5.3.0 released - - The PHP development team have announced the release version 5.3.0 of PHP. The new version includes several fundamental new extensions, as well as a number of other new features - http://www.h-online.com/open/PHP-5-3-0-released--/news/113649/from/rss - 2009-06-30T15:59:07+02:00 - - - - - - Yellow Dog Linux 6.2 released - - With 6.2, the developers have mainly focused on fine-tuning the existing functionality of the Linux distribution designed particularly for PowerPCs and PS3s. Xfce has been added as a further desktop environment choice - http://www.h-online.com/open/Yellow-Dog-Linux-6-2-released--/news/113648/from/rss - 2009-06-30T13:55:55+02:00 - - - - - Once again HP has to close a hole in OpenView Network Node Manager - - HP has released updates for the OpenView Network Node Manager (NNM) to close a remotely exploitable hole in rping - http://www.h-online.com/security/Once-again-HP-has-to-close-a-hole-in-OpenView-Network-Node-Manager--/news/113647/from/rss - 2009-06-30T12:49:56+02:00 - - - - - - Palm Pre 1.0.4 update fixes security issues - - Palm has released version 1.0.4 of its Pre mobile phone software to address several security issues with the Palm webOS - http://www.h-online.com/security/Palm-Pre-1-0-4-update-fixes-security-issues--/news/113645/from/rss - 2009-06-30T12:27:25+02:00 - - - - - Mono 2.4.2 with ASP.NET MVC support - - The latest maintenance release of the cross platform, open source .NET development framework is the first to incorporate Microsoft's ASP.NET MVC framework - http://www.h-online.com/open/Mono-2-4-2-with-ASP-NET-MVC-support--/news/113644/from/rss - 2009-06-30T11:56:58+02:00 - - - - - - openSUSE 11.2 Milestone 3 released - - The third milestone release includes the latest Linux kernel and several updates to the included applications - http://www.h-online.com/open/openSUSE-11-2-Milestone-3-released--/news/113643/from/rss - 2009-06-30T10:49:51+02:00 - - - - - Tiny Core Linux 2.1 arrives - - Tiny Core founder Robert Shingledecker has announced the release of version 2.1 of Tiny Core Linux and Micro Core Linux - http://www.h-online.com/open/Tiny-Core-Linux-2-1-arrives--/news/113642/from/rss - 2009-06-30T10:00:45+02:00 - - - - - - NetBeans 6.7 released - focuses on Maven and Kenai integration - - NetBeans 6.7 has now been released by Sun Microsystems. The H looks at what's new in the latest version - http://www.h-online.com/open/NetBeans-6-7-released-focuses-on-Maven-and-Kenai-integration--/news/113640/from/rss - 2009-06-29T16:30:16+02:00 - - - - - Linux developers want to circumvent VFATs patent problem - - Linux developer Andrew Tridgell has presented the second of two patches designed to work around Microsoft's FAT file naming patents - http://www.h-online.com/open/Linux-developers-want-to-circumvent-VFATs-patent-problem--/news/113641/from/rss - 2009-06-29T15:57:56+02:00 - - - - - - 15 years of FreeDOS - - Originally released on the 28th of June 1994, FreeDOS, a free open source DOS clone, is now 15 years old - http://www.h-online.com/open/15-years-of-FreeDOS--/news/113639/from/rss - 2009-06-29T15:02:42+02:00 - - - - - Lost+Found: Bug reports, eBay, anti-debugging and asterisks - - Too short for news, too good to lose; lost+found is a round up of useful security information. Today, Bug reports, eBay, anti-debugging and asterisks - http://www.h-online.com/security/Lost-Found-Bug-reports-eBay-anti-debugging-and-asterisks--/news/113638/from/rss - 2009-06-29T12:54:25+02:00 - - - - - - Fennec updates for Windows Mobile & Maemo released - - The Mozilla developers have released a second beta for Nokia's N810 Internet Tablets and a second alpha for the Windows Mobile 6 platform, of their Fennec mobile web browser, focusing on performance and user experience improvements - http://www.h-online.com/open/Fennec-updates-for-Windows-Mobile-Maemo-released--/news/113637/from/rss - 2009-06-29T14:26:11+02:00 - - - - - New version of Tor fixes two security issues - - The developers of the anonymity service have released version 0.2.0.35 and the first release candidate of 0.2.1.16, fixing DoS vulnerabilities and a DNS spoofing hole - http://www.h-online.com/security/New-version-of-Tor-fixes-two-security-issues--/news/113636/from/rss - 2009-06-29T13:36:04+02:00 - - - - - - Roadmap for Ruby 1.9.2 - - While Ruby 1.9.2 isn't due until the end of this year, details from a Japanese Ruby conference reveal what to expect in this next version of the dynamic scripting language - http://www.h-online.com/open/Roadmap-for-Ruby-1-9-2--/news/113635/from/rss - 2009-06-29T11:16:00+02:00 - - - - - Second update for Debian 5.0 "Lenny" released - - The Debian project developers have announced the release of the second update to Debian 5.0, which includes a new version of the debian-installer and addresses several bugs and security issues - http://www.h-online.com/open/Second-update-for-Debian-5-0-Lenny-released--/news/113634/from/rss - 2009-06-29T10:59:33+02:00 - - - - - - Python 3.1 released - - The renovation of the Python language continues with the production release of Python 3.1 - http://www.h-online.com/open/Python-3-1-released--/news/113633/from/rss - 2009-06-29T14:26:41+02:00 - - - - - Stallman says "Don't depend on Mono" - - Richard Stallman has added to the protests about Mono, saying free software such as GNU/Linux should not depend on the Microsoft designed framework - http://www.h-online.com/open/Stallman-says-Don-t-depend-on-Mono--/news/113631/from/rss - 2009-06-29T09:42:56+02:00 - - - - - - The H Week - - LinuxTag and 2 Kernel Logs, SCO still not dead, open-source and public institutions, Mozilla 3.5 'real soon', new open source benchmarks, TLD redirections criticised, another Twitter hack and the increasing importance of security updates - http://www.h-online.com/news/The-H-Week--/113632/from/rss - 2009-06-29T09:18:02+02:00 - - - - - LiMux: Munich Linux (R)evolution has its Imitators - - Munich city council's switch to Linux and other open-source software is proceeding with great enthusiasm. Although other local authorities have now followed suit, Microsoft won't leave the field without a fight - http://www.h-online.com/open/LiMux-Munich-Linux-R-evolution-has-its-Imitators--/news/113629/from/rss - 2009-06-27T19:02:10+02:00 - - - - - - Fedora 12 to be named Constantine - - The next version of the Fedora Project's Linux distribution, Fedora 12, will be named "Constantine" - http://www.h-online.com/open/Fedora-12-to-be-named-Constantine--/news/113630/from/rss - 2009-06-27T17:21:12+02:00 - - - - - Free extension for secure browsing - - A free browser extension for Internet Explorer and Firefox from anti-virus manufacturer Finjan, called SecureBrowsing, alerts users of dangerous URLs in Google Search and other popular sites - http://www.h-online.com/security/Free-extension-for-secure-browsing--/news/113627/from/rss - 2009-06-26T15:08:58+02:00 - - - - - - Hole in VLC Media Player - - Secunia says a hole in the Windows binary version of VLC media player is "highly critical" - http://www.h-online.com/security/Hole-in-VLC-Media-Player--/news/113628/from/rss - 2009-06-26T14:39:30+02:00 - - - diff --git a/tests/Zend/Feed/Reader/Integration/_files/laut.de-rdf.xml b/tests/Zend/Feed/Reader/Integration/_files/laut.de-rdf.xml deleted file mode 100644 index fddbe2895b..0000000000 --- a/tests/Zend/Feed/Reader/Integration/_files/laut.de-rdf.xml +++ /dev/null @@ -1,426 +0,0 @@ - - - - - -laut.de - news -http://www.laut.de - -laut.de: aktuelle News -laut.de -Copyright © 2004 laut.de - -2009-07-04T21:01:02+01:00 -hourly -6 -2004-02-10T17:10:15+01:00 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -laut.de -http://www.laut.de -http://www.laut.de/partner/allgemein/logo.gif - - - - - http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm - - 2009-07-04T13:28:09+01:00 - text/html - de - laut.de - laut.de. Alle Rechte vorbehalten. - Angelika Express: MySpace-Aus wegen Sido-Werbung - - Angelika Express - MySpace-Aus wegen Sido-Werbung - http://www.laut.de/vorlaut/news/2009/07/04/22426/index.htm - Schon länger haderten die Kölner mit der Plattform des "fiesen Rupert Murdoch". Das Fass zum Ãœberlaufen brachte aber ein Werbebanner von Deutschrapper Sido. - - - - - http://www.laut.de/vorlaut/news/2009/07/03/22424/index.htm - 2009-07-03T14:50:08+01:00 - text/html - de - laut.de - laut.de. Alle Rechte vorbehalten. - - Michael Jackson: Video der letzten Probe veröffentlicht - Michael Jackson - Video der letzten Probe veröffentlicht - http://www.laut.de/vorlaut/news/2009/07/03/22424/index.htm - Konzertveranstalter AEG Live veröffentlicht ein Video, das Michael Jackson kurz vor seinem Tod beim Proben zeigt. Exfrau Debbie Rowe will unterdessen um das Sorgerecht ihrer Kinder kämpfen. - - - - http://www.laut.de/vorlaut/news/2009/07/03/22423/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Lady Gaga: "Bin wie Andy Warhol" - Lady Gaga - "Bin wie Andy Warhol" - http://www.laut.de/vorlaut/news/2009/07/03/22423/index.htm - Im Interview zieht Trash-Popperin Gaga Parallelen zwischen sich und Pop Art-Ikone Andy Warhol und erklärt: "Ich mache seelenlosen Elektropop." - - - - - - http://www.laut.de/vorlaut/news/2009/07/03/22414/index.htm - 2009-07-03T15:28:47+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Tom Waits: Sänger lässt den Teufel raus - Tom Waits - Sänger lässt den Teufel raus - http://www.laut.de/vorlaut/news/2009/07/03/22414/index.htm - Tom Waits übernimmt im neuen Terry Gilliam-Film die Rolle des Teufels. Ein veröffentlichtes Statement offenbart Details über die Zusammenarbeit. - - - - - - http://www.laut.de/vorlaut/news/2009/07/03/22409/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Tonspion KW26: Free-Mp3s der Woche - Tonspion KW26 - Free-Mp3s der Woche - http://www.laut.de/vorlaut/news/2009/07/03/22409/index.htm - In Kooperation mit Tonspion scannen wir für euch jede Woche die spannendsten Mp3-Downloads. Alles für lau, alles ziemlich super. - - - - - - http://www.laut.de/vorlaut/news/2009/07/03/22408/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Festivalsommer: Die Highlights der Saison (4) - Festivalsommer - Die Highlights der Saison (4) - http://www.laut.de/vorlaut/news/2009/07/03/22408/index.htm - Wir lenken eure Aufmerksamkeit regelmäßig auf spektakuläre Line-Ups, die schönsten Locations und coolsten Open-Airs des Sommers. Diesmal empfehlen wir einen Ausflug in die schwäbische Provinz (Obstwiesenfestival) und eine Reise ans Mittelmeer (Benicàssim Festival). - - - - - - http://www.laut.de/vorlaut/news/2009/07/02/22410/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Three Strikes Out: Neuer Gesetzentwurf spaltet Frankreich - Three Strikes Out - Neuer Gesetzentwurf spaltet Frankreich - http://www.laut.de/vorlaut/news/2009/07/02/22410/index.htm - Sarkozys Plan, Musik-Piraten automatisiert vom Internet auszuschließen, schmetterte das Verfassungsgericht ab. Nun legt die Regierung nach, und Verfassungsschützer melden erneut Bedenken an. - - - - - - http://www.laut.de/vorlaut/news/2009/07/02/22405/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Michael Jackson: Abschiedskonzert ersetzt Aufbahrung - Michael Jackson - Abschiedskonzert ersetzt Aufbahrung - http://www.laut.de/vorlaut/news/2009/07/02/22405/index.htm - In seinem Testament regelt Michael Jackson u.a. das Sorgerecht für die Kinder. An Stelle der Aufbahrung seines Leichnams in Neverland soll nun in Los Angeles ein Abschiedskonzert stattfinden. - - - - - - http://www.laut.de/vorlaut/news/2009/07/02/22404/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Ausgehbefehl: Rifforkane und Jazzmoves - Ausgehbefehl - Rifforkane und Jazzmoves - http://www.laut.de/vorlaut/news/2009/07/02/22404/index.htm - Da wackelt das Skelett: The Dillinger Escape Plan brechen einen Orkan vom Zaun, Guru's Jazzmatazz und Roy Ayers bringens gemeinsam, und die Cold War Kids arbeiten gegen den Indie-Mainstream. - - - - - - http://www.laut.de/vorlaut/news/2009/07/02/22413/index.htm - 2009-07-03T11:46:40+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Björn Kleinhenz: Album für krankes Kaninchen - Björn Kleinhenz - Album für krankes Kaninchen - http://www.laut.de/vorlaut/news/2009/07/02/22413/index.htm - Hängende Löffel im Hause Kleinhenz: Der Hase ist malade und benötigt eine kostenintensive OP. Zu diesem Zweck spendet Kleinhenz den kompletten Erlös aus dem Online-Verkauf seines neuen Albums seinem Kaninchen Humle. - - - - - - http://www.laut.de/vorlaut/news/2009/07/01/22384/index.htm - 2009-07-01T12:56:34+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Kraftwerk: Twitter erinnert Hütter an die Stasi - Kraftwerk - Twitter erinnert Hütter an die Stasi - http://www.laut.de/vorlaut/news/2009/07/01/22384/index.htm - In zwei seiner raren Interviews sprach Kraftwerk-Gründer Ralf Hütter über den Ausstieg von Florian Schneider und die Entwicklung der neuen Medien. - - - - - - http://www.laut.de/vorlaut/news/2009/07/01/22400/index.htm - 2009-07-02T15:37:45+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - U2: Zwei Jacko-Songs zum Tourstart - U2 - Zwei Jacko-Songs zum Tourstart - http://www.laut.de/vorlaut/news/2009/07/01/22400/index.htm - 90.000 Zuschauer wurden gestern Abend Zeuge des U2-Auftaktkonzerts in Barcelona. Als besondere Ãœberraschung würdigte die Band den verstorbenen Michael Jackson. - - - - - - http://www.laut.de/vorlaut/news/2009/07/01/22392/index.htm - 2009-07-02T15:36:13+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - D. Matthews Band: laut.de verlost exklusive Tickets - D. Matthews Band - laut.de verlost exklusive Tickets - http://www.laut.de/vorlaut/news/2009/07/01/22392/index.htm - Für das Akustik-Set von Dave Matthews und seinem Gitarrist Tim Reynolds in Hamburg gibt es keinen offiziellen Ticket-Verkauf. Ihr könnt trotzdem dabei sein! - - - - - - http://www.laut.de/vorlaut/news/2009/07/01/22385/index.htm - 2009-07-01T14:29:34+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Michael Jackson: Aufbahrung auf Neverland-Ranch - Michael Jackson - Aufbahrung auf Neverland-Ranch - http://www.laut.de/vorlaut/news/2009/07/01/22385/index.htm - Am Freitag sollen die sterblichen Ãœberreste von Michael Jackson aufgebahrt werden, damit seine Fans Abschied von ihm nehmen können. - - - - - - http://www.laut.de/vorlaut/news/2009/07/01/22386/index.htm - 2009-07-02T14:42:03+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Pirate Bay-Verkauf: Piraten wollen nicht mehr rauben - Pirate Bay-Verkauf - Piraten wollen nicht mehr rauben - http://www.laut.de/vorlaut/news/2009/07/01/22386/index.htm - Bis August soll der Verkauf von Pirate Bay unter Dach und Fach sein. Quo Vadis? Angeblich in Richtung Legalität und einer verstärkten Konzentration auf politische Aktivitäten. - - - - - - http://www.laut.de/vorlaut/news/2009/06/30/22372/index.htm - 2009-07-01T12:56:34+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Michael Jackson: Die Geier kreisen schon - Michael Jackson - Die Geier kreisen schon - http://www.laut.de/vorlaut/news/2009/06/30/22372/index.htm - Michael Jacksons Tod ruft nicht nur trauernde Fans, sondern auch eine Menge Geschäftsleute auf den Plan, die die neu erlangte Popularität des Stars nutzen wollen. - - - - - - http://www.laut.de/vorlaut/news/2009/06/30/22368/index.htm - 2009-06-30T13:44:11+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Rammstein: Zusatzkonzerte nach Ticket-Ansturm - Rammstein - Zusatzkonzerte nach Ticket-Ansturm - http://www.laut.de/vorlaut/news/2009/06/30/22368/index.htm - Rammsteins Versuch, den Second Hand-Markt für Konzerttickets auszutrocknen, ist offenbar gescheitert. - - - - - - http://www.laut.de/vorlaut/news/2009/06/29/22361/index.htm - 2009-06-30T12:08:22+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Michael Jackson: Familie ordnet zweite Autopsie an - Michael Jackson - Familie ordnet zweite Autopsie an - http://www.laut.de/vorlaut/news/2009/06/29/22361/index.htm - Auch vier Tage nach Michael Jacksons Tod ist die Todesursache völlig unklar. Eine zweite Autopsie soll Klarheit schaffen. - - - - - - http://www.laut.de/vorlaut/news/2009/06/29/22360/index.htm - 2009-07-01T11:47:35+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Glastonbury: Blur, Springsteen und die Schweinegrippe - Glastonbury - Blur, Springsteen und die Schweinegrippe - http://www.laut.de/vorlaut/news/2009/06/29/22360/index.htm - Neben Blur, Bruce Springsteen und Neil Young fand sich am Wochenende ein ungebetener Gast in Glastonbury ein: der Schweinegrippe-Erreger H1N1. - - - - - - http://www.laut.de/vorlaut/news/2009/06/29/22359/index.htm - 2009-06-30T12:08:22+01:00 - text/html - de - laut.de - - laut.de. Alle Rechte vorbehalten. - Vorchecking: Neue Platten auf einen Blick - Vorchecking - Neue Platten auf einen Blick - http://www.laut.de/vorlaut/news/2009/06/29/22359/index.htm - Frisch aus der Redaktionssitzung: Was geht, was nicht? Die Neuerscheinungen für den kommenden Freitag im Ãœberblick. - - - - - - diff --git a/tests/Zend/Feed/Reader/Integration/_files/podcast.xml b/tests/Zend/Feed/Reader/Integration/_files/podcast.xml deleted file mode 100644 index 4abb75a8de..0000000000 --- a/tests/Zend/Feed/Reader/Integration/_files/podcast.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - All About Everything - http://www.example.com/podcasts/everything/index.html - en-us - ℗ & © 2005 John Doe & Family - yes - no - A show about everything - John Doe - All About Everything is a show about everything. - Each week we dive into any subject known to man and talk - about it as much as we can. Look for our Podcast in the - iTunes Store - All About Everything is a show about everything. - Each week we dive into any subject known to man and talk - about it as much as we can. Look for our Podcast in the - iTunes Store - - John Doe - john.doe@example.com - - http://newlocation.com/example.rss - - - - - - - - Shake Shake Shake Your Spices - no - John Doe - yes - A short primer on table spices - - This week we talk about salt and pepper - shakers, comparing and contrasting pour rates, - construction materials, and overall aesthetics. Come and - join the party! - - http://example.com/podcasts/archive/aae20050615.m4a - Wed, 15 Jun 2005 19:00:00 GMT - 7:04 - salt, pepper, shaker, exciting - - - - - Socket Wrench Shootout - Jane Doe - Comparing socket wrenches is fun! - - This week we talk about metric vs. old - english socket wrenches. Which one is better? Do you - really need both? Get all of your answers here. - - - http://example.com/podcasts/archive/aae20050608.mp3 - Wed, 8 Jun 2005 19:00:00 GMT - 4:34 - metric, socket, wrenches, tool - - - - - Red, Whine, & Blue - Various - Red + Blue != Purple - This week we talk about surviving in a Red - state if you are a Blue person. Or vice versa. - - - http://example.com/podcasts/archive/aae20050601.mp3 - Wed, 1 Jun 2005 19:00:00 GMT - 3:59 - politics, red, blue, state - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/Integration/_files/wordpress-atom10.xml b/tests/Zend/Feed/Reader/Integration/_files/wordpress-atom10.xml deleted file mode 100644 index 1f2c99e6e6..0000000000 --- a/tests/Zend/Feed/Reader/Integration/_files/wordpress-atom10.xml +++ /dev/null @@ -1,726 +0,0 @@ - - Norm 2782 - Why are you here? - - 2009-03-07T08:03:50Z - WordPress - - - http://www.norm2782.com/feed/atom/ - - - - - norm2782 - http://www.norm2782.com - - <![CDATA[Wth… reading books?]]> - - http://www.norm2782.com/?p=114 - 2009-03-07T08:03:50Z - 2009-03-02T08:09:33Z - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- - -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[My first few weeks in New Zealand]]> - - http://www.norm2782.com/?p=105 - 2009-02-18T03:30:07Z - 2009-02-15T03:29:21Z - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

- -


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

- -

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

- -

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

- -

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP – revisited]]> - - http://www.norm2782.com/?p=94 - 2009-01-14T10:47:25Z - 2009-01-14T10:47:25Z - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

- -

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

- -

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Filters for Zend_Paginator]]> - - http://www.norm2782.com/?p=72 - 2009-01-14T08:23:19Z - 2009-01-13T12:57:53Z - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

- -


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[ZF-3239]]> - - http://www.norm2782.com/?p=68 - 2009-01-11T09:53:20Z - 2009-01-07T11:48:31Z - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[New in-ear earphones]]> - - http://www.norm2782.com/?p=53 - 2009-01-03T18:51:43Z - 2009-01-03T15:49:19Z - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

- -


-cx300

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Seven Things – Tagged by Pádraic]]> - - http://www.norm2782.com/?p=44 - 2009-01-03T11:47:19Z - 2009-01-03T10:14:38Z - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

- -

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • - -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • - -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • - -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • - -
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[AMF Server class for WordPress]]> - - http://www.norm2782.com/?p=27 - 2009-01-06T15:00:54Z - 2009-01-02T14:49:42Z - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

- -

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-
-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Flex frontend]]> - - http://www.norm2782.com/?p=22 - 2009-01-02T09:27:20Z - 2009-01-01T23:29:35Z - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- - - 0 -
- - - norm2782 - http://www.norm2782.com - - <![CDATA[Properties in PHP]]> - - http://www.norm2782.com/?p=8 - 2009-01-02T15:13:15Z - 2009-01-01T23:02:54Z - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-
-]]>
- - - 0 -
-
diff --git a/tests/Zend/Feed/Reader/Integration/_files/wordpress-rss2-dc-atom.xml b/tests/Zend/Feed/Reader/Integration/_files/wordpress-rss2-dc-atom.xml deleted file mode 100644 index 3d1fdfae24..0000000000 --- a/tests/Zend/Feed/Reader/Integration/_files/wordpress-rss2-dc-atom.xml +++ /dev/null @@ -1,700 +0,0 @@ - - - - - Norm 2782 - - http://www.norm2782.com - Why are you here? - Sat, 07 Mar 2009 08:03:50 +0000 - http://wordpress.org/?v=2.8 - en - hourly - 1 - - Wth… reading books? - http://www.norm2782.com/2009/03/wth-reading-books/ - http://www.norm2782.com/2009/03/wth-reading-books/#comments - Mon, 02 Mar 2009 08:09:33 +0000 - norm2782 - - - - - - http://www.norm2782.com/?p=114 - - Being in New Zealand does strange things to a person. Everybody who knows me, knows I don’t much like that crazy invention called a Book. However, being here I’ve already finished 4 books, all of which I can highly recommend.

- -

Next up: Design Patterns: Elements of Reusable Object-Oriented Software, by the Gang of Four. Yes, talk about classics and shame on me for not having ordered it sooner! Also reading Implementation Patterns, by Kent Beck at the moment.

-]]>
- http://www.norm2782.com/2009/03/wth-reading-books/feed/ - 0 -
- - My first few weeks in New Zealand - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/ - http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/#comments - Sun, 15 Feb 2009 03:29:21 +0000 - norm2782 - - - - http://www.norm2782.com/?p=105 - - It’s been a while since my last blog post. Things have been quite hectic for me these last few weeks. There was my final week at Angry Bytes, followed by a pre-NZ party and then my trip to New Zealand. Currently New Zealand looks pretty much the same as the Netherlands, seeing as I’m locked away in an office most of my time.

-


-My adventure into Kiwi-land started with a long and interesting trip to San Francisco. The interesting part was my new book: Domain Driven Design: Tackling Complexity in the Heart of Software, by Eric Evans. This book, combined with KLM’s excellent on-board service made my flight to SF a breeze.

-

It was only 2PM when I arrived in SF, so I had to wait another 4 hours before my flight to Auckland even boarded. The waiting wasn’t too bad. It was great to get out into the sun and to grab some decent food and coffee. Didn’t get to see much of SF though, which was too bad.

-

SF Airport

-

The flight to Auckland wasn’t that flawless unfortunately. There were some technical problems with the airplane, which caused quite a bit of a delay. Because of this delay I had to run to catch my flight to Dunedin. The flight was all set to go and was waiting for me… I barely made it in time!

-

Flying to Dunedin

-

When I got to Dunedin I was welcomed by Jesse, Tracey and Lindsay. It was great to meet them in person. The first order of business for me was to get some coffee, because I only got roughly 3 hours of sleep on my way there. After a little tour of Abbey College (that’s where I’m staying) it was time for our first meeting. No time for sleep! Finally, after dinner at Abbey, I decided it was time to get some sleep. When I woke up the next day, the jet-lag was no more!

-

My Room

-

Abbey is a great place to stay by the way. It’s not far from the office or from the city center. The people who are staying there are great as well. Just check out the site. Abbey’s got it all!

-

View from my room

-

So what am I doing here in NZ? We’re currently working on writing the software for the PBRF initiative. It has already taken a lot of late hours, and it will probably take a lot more. It will be worth it though! After that, we’ll be working on a great and exciting cutting-edge open-source project. Unfortunately I can’t say a lot more at this point, but you can rest assured that it includes the latest Zend Framework technologies.

-

My Desk

-

Seeing as I don’t have internet-access at Abbey College yet, I’ve got lots of time for other activities. I’ve finished reading the better part of my Domain Driven Design book and I’ve ordered Martin Fowler’s Patterns Of Enterprise Application Architecture, which should arrive this week. I’ve also bought myself a brand new bicycle so I can get around. Cycling here is a bit more dangerous than in the Netherlands though… it definitely brings back memories from my bicycling trip in Scotland! There are lots more things on my todo list: winery tour, surfing, snowboarding, skydiving, bungee-jumping, renting/buying a Harley… six months in NZ is not going to be enough time!

-

Me!

-

Well, that’s my first NZ blog-post. There will definitely be more of these! Let’s hope they fix my internet soon… See my Flickr photo-stream for more pictures.

-]]>
- http://www.norm2782.com/2009/02/my-first-few-weeks-in-new-zealand/feed/ - 0 -
- - Properties in PHP – revisited - http://www.norm2782.com/2009/01/properties-in-php-revisited/ - http://www.norm2782.com/2009/01/properties-in-php-revisited/#comments - Wed, 14 Jan 2009 10:47:25 +0000 - norm2782 - - - - http://www.norm2782.com/?p=94 - - A while ago I was daydreaming about native property support in PHP. Unfortunately it will be a while before PHP itself will support this natively and an even longer while before shared hosting providers will upgrade to a newer version of PHP.

-

So what’s the big deal about those properties? In short, they make a developers life easier by allowing the developer to code no more than needed at that moment. And lets face it… less code is better! In this post we’ll see that it’s not impossible to enjoy properties in PHP today. As with a lot of good things, it does come with a small price though…

-


-Lets have a look at a use-case to demonstrate where properties will not only save you time, but it will also save your sanity. In this example we’re modeling a Person class. In the beginning of the project, the requirements for the Person class are quite simple: a Person has an age and a name. In the simplest form we can code that as follows:

-
-<?php
-class Person
-{
-    public $age;
-
-    public $name;
-}
-
-

This look easy enough, and it is. It even works like a charm and it’s possibly the fastest implementation for the Person class.

-

But, pesky as they are, the client suddenly wants some logic added to our Person class! A Person suddenly can’t be younger than 21 years old. This poses a problem. To add logic to our Person class, we would have to switch the public age attribute with a pair of getters and setters:

-
-<?php
-class Person
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-

Technically this works like a charm, however it will force me to go through my entire application and switch all references from the public attribute to the getter and setter. Not an ideal situation. One possible solution is to do things the Java way: just create all getters and setters up-front so you don’t have to do so afterwards. Even though this works fine, it’s in violation of our mission to write no more code than we actually need at the moment of writing.

-

The solution? Properties! But wait… PHP doesn’t support those, remember? Luckily we still have magic methods. It’s nowhere near as nice as a native solution, but at least it helps us write no more code than we need at the moment we’re first writing our code:

-
-<?php
-abstract class ModelAbstract
-{
-    public function __get($key)
-    {
-        $method = 'get' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        return $this->$method();
-    }
-
-    public function __set($key, $value)
-    {
-        $method = 'set' . ucfirst($key);
-
-        if (!method_exists($this, $method)) {
-            throw new Exception('No property found for ' . $key);
-        }
-
-        $this->$method($value);
-    }
-}
-
-

We’ll take a look at what this does exactly later. The important thing to note is that we can now do the following:

-
-<?php
-class Person extends ModelAbstract
-{
-    private $_age = null;
-
-    public $name = null;
-
-    public function getAge()
-    {
-        return $this->_age;
-    }
-
-    public function setAge($age)
-    {
-        if ($age < 21) {
-            throw new Exception('You need to be at least 21 years or older!');
-        }
-
-        $this->_age = $age;
-    }
-}
-
-$person = new Person();
-
-try {
-    $person->age = 10;
-} catch (Exception $e) {
-    // Will print "You need to be at least 21 years or older!"
-    echo $e->getMessage();
-}
-
-

With this construction in place, we can safely switch from a public attribute to getters and setters, without changing the rest of the application code. The only real downside to this – aside from the minor speed impact – is the fact that you have to subclass ModelAbstract to make this work. Luckily it’s not a lot of code, so should there be a big need to get rid of the ModelAbstract inheritance it’s not a big disaster to do some copy/paste work.

-

This method works by assuming you have get- and set methods that have the same name as the property you’re trying to access. When there’s a public attribute, it will use that. If there’s no public attribute, it will fall back to __get or __set and the logic will take it from there.

-

All of this is just a proof-of-concept of implementing properties in PHP and of the way I want to be using properties to access data the data in my objects. Please comment your experiences with this approach or similar approaches. I’m curious to see how practical this solution would be in a real-life situation.

-]]>
- http://www.norm2782.com/2009/01/properties-in-php-revisited/feed/ - 0 -
- - Filters for Zend_Paginator - http://www.norm2782.com/2009/01/filters-for-zend_paginator/ - http://www.norm2782.com/2009/01/filters-for-zend_paginator/#comments - Tue, 13 Jan 2009 12:57:53 +0000 - norm2782 - - - - http://www.norm2782.com/?p=72 - - Zend_Paginator has a new feature! It is now possible to add a filter to your Paginator object which acts on the data retrieved from the adapter. This filter can be any instance of Zend_Filter_Interface, including a filter-chain. If a filter(-chain) is set, the raw data from the adapter will be passed to the filter() method.

-


-So why would you want to apply filters to your result set? Usually my domain models don’t inherit from Zend_Db_Table_Row but that is the data type I get from the Paginator when I use the DbTableSelect adapter (wrapped in a nice Zend_Db_Table_Rowset). Instead, I would like to load my rows into my models and preferably without using the Paginator abilities or having to apply weird hacks. Previously this was only possible (in a sane way) by subclassing an adapter so it could return a collection of model objects instead of a rowset. With the new filter support you can just inject a filter to do this for you.

-

Lets have a look at an example. In this example I want to list all my users from the database. I’ll grab the name of the user from the row and inject it into a User object.

-
-<?php
-class User
-{
-    private $_name = '';
-
-    public function getName()
-    {
-        return $this->_name;
-    }
-
-    public function setName($name)
-    {
-        $this->_name = $name;
-    }
-}
-
-class UserFilter implements Zend_Filter_Interface
-{
-    public function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new UserFilter());
-
-        return $paginator;
-    }
-}
-
-$paginator = MyModel::getUserPaginator();
-$items = $paginator->getCurrentItems();
-
-foreach ($items as $user) {
-    echo 'Current name: ' . $user->getName() . '<br />' . PHP_EOL;
-}
-
-

To simplify adding a simple filter to your paginator I’ve also added Zend_Filter_Callback. This allows you to specify a callback method that does the same as the filter in the previous example.

-
-<?php
-class MyModel
-{
-    public static function getUserPaginator()
-    {
-        $userTable = new UserTable();
-        $paginator = Zend_Paginator::factory($userTable->select());
-        $paginator->setFilter(new Zend_Filter_Callback(
-            array('MyModel', 'filter'))
-        );
-
-        return $paginator;
-    }
-
-    public static function filter($rows)
-    {
-        $users = array();
-
-        foreach ($rows as $row) {
-            $user = new User();
-            $user->setName($row->name);
-
-            $users[] = $user;
-        }
-
-        return $rows;
-    }
-}
-
-

The callback also accepts object instead of a static reference to a class. Internally it uses call_user_func to execute the filter() method, so any notation that works there, works with the Callback filter.

-

Enjoy!

-]]>
- http://www.norm2782.com/2009/01/filters-for-zend_paginator/feed/ - 0 -
- - ZF-3239 - http://www.norm2782.com/2009/01/zf-3239/ - http://www.norm2782.com/2009/01/zf-3239/#comments - Wed, 07 Jan 2009 11:48:31 +0000 - norm2782 - - - - http://www.norm2782.com/?p=68 - - Zend_Db_Table_Select users, rejoice! I’ve just committed a patch for ZF-3239 in revision 13530. This should be a relief for those of you who have been implementing workarounds for those “No table has been specified for the FROM clause” exceptions.

-]]>
- http://www.norm2782.com/2009/01/zf-3239/feed/ - 0 -
- - New in-ear earphones - http://www.norm2782.com/2009/01/new-in-ear-earphones/ - http://www.norm2782.com/2009/01/new-in-ear-earphones/#comments - Sat, 03 Jan 2009 15:49:19 +0000 - norm2782 - - - http://www.norm2782.com/?p=53 - - Just got myself the Sennheiser CX 300 II Precision in-ear earphones. Check ‘em out by clicking the read more link!

-


-cx300

-]]>
- http://www.norm2782.com/2009/01/new-in-ear-earphones/feed/ - 0 -
- - Seven Things – Tagged by Pádraic - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/ - http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/#comments - Sat, 03 Jan 2009 10:14:38 +0000 - norm2782 - - - http://www.norm2782.com/?p=44 - - Well, this was bound to happen: I got tagged by Pádraic because I’m working on Zend_Feed_Reader with him. Luckily I’ve just setup this new blog, so here we go!

-

Did you know that…

-
    -
  • Every bit of PHP I know is self-taught
  • -
  • My programming adventure started out with Visual Basic 3 back in 1993. I was just 8 years old back then and had no clue what I was doing.
  • -
  • My left foot is actually a few millimeter bigger than my right foot.
  • -
  • I used to have long hair (almost reached my ass). I cut it off in the summer of ‘08 for various reasons, one of which was 100 euro.
  • -
  • I bought my Harley Davidson before I even had my drivers license.
  • -
  • My whisky collection (only single malts ;) ) keeps growing instead of shrinking
  • -
  • While I use a Mac, with an Apple Cinema Display and an Apple keyboard… I have an HTC Touch with Windows Mobile and I’m stuck with it for at least a few more months.
  • -
-

Now it’s my turn to start tagging!

-
    -
  • Stefan Koopmanschap – For not being tagged yet and having said so on Twitter
  • -
  • Maurice Fonk – For being my co-worker and for not having finished Madoqua yet
  • -
  • Geoffrey Bachelet – For the great party in Paris
  • -
  • Wade Arnold – For doing a great job on Zend_AMF and having the same WordPress theme as me.
  • -
  • Kana Yeh – For being the coolest PHP girl in the Netherlands (that I know of)
  • -
  • Matthew Ratzloff – For his great help on Zend_Paginator
  • -
  • And one more here…
  • -
-

As for the rules:

-
    -
  • Link your original tagger(s), and list these rules on your blog.
  • -
  • Share seven facts about yourself in the post – some random, some wierd.
  • -
  • Tag seven people at the end of your post by leaving their names and the links to their blogs.
  • -
  • Let them know they’ve been tagged by leaving a comment on their blogs and/or Twitter.
  • -
-]]>
- http://www.norm2782.com/2009/01/seven-things-tagged-by-padraic/feed/ - 0 -
- - AMF Server class for WordPress - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/ - http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/#comments - Fri, 02 Jan 2009 14:49:42 +0000 - norm2782 - - - - - http://www.norm2782.com/?p=27 - - After browsing through WordPress’ code I quickly found that there’s no sane way to create AMF support as a WP plugin. At least not for someone who hasn’t done any old-skool procedural PHP in years. Instead of writing a plugin, I decided to write a standalone server script. It’s still very basic and currently setup to work for me. To get it working for your WP setup you should probably make some minor modifications. Click the read more link to check out the code. I’ve released it under the generous BSD license, so knock yourself out! Use it at your own risk… I’m not going to support it. Any updates will be posted in this post. Also, please note that I haven’t tested it yet. If you access the script directly it should output “Zend Amf Endpoint” just fine, but that’s all I can guarantee at this point ;)

-

-
-<?php
-/**
- * BSD LICENSE
- *
- * Copyright (c) 2009, norm2782
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of norm2782 nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY norm2782 ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL norm2782 BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Set production mode.
- * If set to false, exceptions will bubble through to the Flex frontend
- *
- * @var bool
- */
-$production = false;
-
-/**
- * Determine the absolute path of the AMF server
- *
- * @var string
- */
-define('ABSPATH', dirname(__FILE__) . '/');
-
-/**
- * One directory below docroot. Your config file and library dir should be here.
- *
- * @var string
- */
-define('SUBPATH', dirname(ABSPATH));
-
-/**
- * You should make sure Zend Framework is in your include path
- */
-set_include_path(
-    implode(PATH_SEPARATOR, array(
-        SUBPATH . '/library',
-        get_include_path()
-    ))
-);
-
-/**
- * Include the WordPress config file
- */
-$configFile = SUBPATH . '/wp-config.php';
-
-if (!file_exists($configFile)) {
-    throw new Exception('WordPress config file was not found!');
-}
-
-require_once $configFile;
-
-/**
- * No need to config more stuff from this point on
- */
-
-/**
- * @see Zend_Amf_Server
- */
-require_once 'Zend/Amf/Server.php';
-
-/**
- * @see Zend_Db_Adapter_Pdo_Mysql
- */
-require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
-
-/**
- * @see Zend_Paginator
- */
-require_once 'Zend/Paginator.php';
-
-/**
- * @see Zend_Paginator_Adapter_DbSelect
- */
-require_once 'Zend/Paginator/Adapter/DbSelect.php';
-
-/**
- * Simple class to expose wordpress data through AMF
- *
- * @author norm2782
- */
-class Wp_Amf_Gateway
-{
-    /**
-     * Database adapter
-     *
-     * @var Zend_Db_Adapter_Pdo_Mysql
-     */
-    private $_db = null;
-
-    /**
-     * WordPress table prefix
-     *
-     * @var string
-     */
-    private $_prefix = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $dbConfig
-     * @param string $prefix
-     * @return void
-     */
-    public function __construct(array $dbConfig, $prefix)
-    {
-        $this->_db = new Zend_Db_Adapter_Pdo_Mysql($dbConfig);
-        $this->_db->query('SET NAMES `utf8`');
-
-        $this->_prefix = $prefix;
-    }
-
-    /**
-     * Get paginated results for the provided query
-     *
-     * @param Zend_Db_Select $select
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    private function _getPaginated(Zend_Db_Select $select, $page, $itemsPerPage)
-    {
-        $paginator = new Zend_Paginator(
-            new Zend_Paginator_Adapter_DbSelect($select)
-        );
-
-        $paginator->setCurrentPageNumber($page)
-                  ->setItemCountPerPage($itemsPerPage);
-
-        return array(
-            'info'  => $paginator->getPages(),
-            'items' => $paginator->getCurrentItems()
-        );
-    }
-
-    /**
-     * Get the comments for the specified post ID
-     *
-     * @param int $postId
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getCommentsForPost($postId, $page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'comments')
-                                      ->where('comment_post_ID = ?', $postId);
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-
-    /**
-     * Get the meta data for the specified post ID
-     *
-     * @param $postId
-     * @return unknown_type
-     */
-    public function getMetaForPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'postmeta')
-                                      ->where('post_id = ?', $postId);
-
-        return $this->_db->fetchAll($select);
-    }
-
-    /**
-     * Get a post by specifying its ID
-     *
-     * @param int $postId
-     * @return array
-     */
-    public function getPost($postId)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts')
-                                      ->where('ID = ?', $postId);
-
-        return $this->_db->fetchOne($select);
-    }
-
-    /**
-     * Get posts per page
-     *
-     * @param int $page
-     * @param int $itemsPerPage
-     * @return array
-     */
-    public function getPosts($page = 1, $itemsPerPage = 10)
-    {
-        $select = $this->_db->select()->from($this->_prefix . 'posts');
-
-        return $this->_getPaginated($select, $page, $itemsPerPage);
-    }
-}
-
-/**
- * Pass the values from wp-config.php to the Wp_Amf_Gateway class.
- */
-$gateway = new Wp_Amf_Gateway(
-    array(
-        'host'     => DB_HOST,
-        'username' => DB_USER,
-        'password' => DB_PASSWORD,
-        'dbname'   => DB_NAME
-    ),
-    $table_prefix
-);
-
-$server = new Zend_Amf_Server();
-$server->setProduction($production)
-       ->setClass($gateway)
-       ->handle();
-
-]]>
- http://www.norm2782.com/2009/01/amf-server-class-for-wordpress/feed/ - 0 -
- - Flex frontend - http://www.norm2782.com/2009/01/flex-frontend/ - http://www.norm2782.com/2009/01/flex-frontend/#comments - Thu, 01 Jan 2009 23:29:35 +0000 - norm2782 - - - - http://www.norm2782.com/?p=22 - - I was planning on writing a quick Flex frontend for this blog, but it appears WordPress only offers the posts themselves as RSS feed. If I get real bored (which I doubt, unfortunately) I’ll have a look and see if I can create a Zend_AMF plugin for WordPress that allows me to retrieve virtually all data from my WordPress install. Would be cool :D

-]]>
- http://www.norm2782.com/2009/01/flex-frontend/feed/ - 0 -
- - Properties in PHP - http://www.norm2782.com/2009/01/properties-in-php/ - http://www.norm2782.com/2009/01/properties-in-php/#comments - Thu, 01 Jan 2009 23:02:54 +0000 - norm2782 - - - - http://www.norm2782.com/?p=8 - - A while ago Dynom from #php_bnl pointed me to an interesting entry on the PHP 5.3 wiki page. In the “Future PHP releases” sections there’s an entry called “29. “real†properties with attached getters and setters”. Personally I can’t wait for this. Hopefully it will look something like ActionScript 3’s properties:

-
-<?php
-class Bar
-{
-    private $_foo = 'foo';
-
-    public function get foo()
-    {
-        return $this->_foo;
-    }
-
-    public function set foo($fooString)
-    {
-        $this->_foo = $fooString;
-    }
-}
-
-$bar = new Bar();
-$bar->foo = 'baz';
-echo $bar->foo; // prints baz
-
-]]>
- http://www.norm2782.com/2009/01/properties-in-php/feed/ - 0 -
-
-
diff --git a/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Entry.php b/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Entry.php deleted file mode 100644 index 1239db13fb..0000000000 --- a/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Entry.php +++ /dev/null @@ -1,54 +0,0 @@ -_data['isbn'])) { - return $this->_data['isbn']; - } - $isbn = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/jungle:isbn)'); - if (!$isbn) { - $isbn = null; - } - $this->_data['isbn'] = $title; - return $this->_data['isbn']; - } - - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('jungle', 'http://example.com/junglebooks/rss/module/1.0/'); - } -} diff --git a/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Feed.php b/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Feed.php deleted file mode 100644 index 8d7706a87e..0000000000 --- a/tests/Zend/Feed/Reader/_files/My/Extension/JungleBooks/Feed.php +++ /dev/null @@ -1,52 +0,0 @@ -_data['dayPopular'])) { - return $this->_data['dayPopular']; - } - $dayPopular = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/jungle:dayPopular)'); - if (!$dayPopular) { - $dayPopular = null; - } - $this->_data['dayPopular'] = $dayPopular; - return $this->_data['dayPopular']; - } - - protected function _registerNamespaces() - { - $this->_xpath->registerNamespace('jungle', 'http://example.com/junglebooks/rss/module/1.0/'); - } -} diff --git a/tests/Zend/Feed/Reader/_files/Reader/atom03.xml b/tests/Zend/Feed/Reader/_files/Reader/atom03.xml deleted file mode 100644 index 071f83a0af..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/atom03.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/atom10.xml b/tests/Zend/Feed/Reader/_files/Reader/atom10.xml deleted file mode 100644 index 4b990551c4..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/atom10.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss090.xml b/tests/Zend/Feed/Reader/_files/Reader/rss090.xml deleted file mode 100644 index 72b79748c9..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss090.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss091.xml b/tests/Zend/Feed/Reader/_files/Reader/rss091.xml deleted file mode 100644 index 8f866b3837..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss091.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss092.xml b/tests/Zend/Feed/Reader/_files/Reader/rss092.xml deleted file mode 100644 index d03fff2c7a..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss092.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss093.xml b/tests/Zend/Feed/Reader/_files/Reader/rss093.xml deleted file mode 100644 index 8b784f6c4f..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss093.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss094.xml b/tests/Zend/Feed/Reader/_files/Reader/rss094.xml deleted file mode 100644 index 02422130ca..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss094.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss10.xml b/tests/Zend/Feed/Reader/_files/Reader/rss10.xml deleted file mode 100644 index 6f9c76f25a..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss10.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/rss20.xml b/tests/Zend/Feed/Reader/_files/Reader/rss20.xml deleted file mode 100644 index c60501eaab..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/rss20.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/Reader/_files/Reader/xxe-atom10.xml b/tests/Zend/Feed/Reader/_files/Reader/xxe-atom10.xml deleted file mode 100644 index 6a4a47d567..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/xxe-atom10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - ]> - - info:&discloseInfo; - diff --git a/tests/Zend/Feed/Reader/_files/Reader/xxe-info.txt b/tests/Zend/Feed/Reader/_files/Reader/xxe-info.txt deleted file mode 100644 index 603572bbbd..0000000000 --- a/tests/Zend/Feed/Reader/_files/Reader/xxe-info.txt +++ /dev/null @@ -1 +0,0 @@ -xxe-information-disclosed diff --git a/tests/Zend/Feed/ReaderTest.php b/tests/Zend/Feed/ReaderTest.php deleted file mode 100644 index c5916a5fd6..0000000000 --- a/tests/Zend/Feed/ReaderTest.php +++ /dev/null @@ -1,394 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/Reader/_files'; - } - - public function tearDown() - { - Zend_Feed_Reader::reset(); - } - - public function testDetectsFeedIsRss20() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss20.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_20, $type); - } - - public function testDetectsFeedIsRss094() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss094.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_094, $type); - } - - public function testDetectsFeedIsRss093() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss093.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_093, $type); - } - - public function testDetectsFeedIsRss092() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss092.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_092, $type); - } - - public function testDetectsFeedIsRss091() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss091.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_091, $type); - } - - public function testDetectsFeedIsRss10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss10.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_10, $type); - } - - public function testDetectsFeedIsRss090() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/rss090.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_090, $type); - } - - public function testDetectsFeedIsAtom10() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/atom10.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_ATOM_10, $type); - } - - public function testDetectsFeedIsAtom03() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents($this->_feedSamplePath.'/Reader/atom03.xml')); - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_ATOM_03, $type); - } - - /** - * @group ZF-9723 - */ - public function testDetectsTypeFromStringOrToRemindPaddyAboutForgettingATestWhichLetsAStupidTypoSurviveUnnoticedForMonths() - { - $feed = ''; - $type = Zend_Feed_Reader::detectType($feed); - $this->assertEquals(Zend_Feed_Reader::TYPE_RSS_10, $type); - } - - public function testGetEncoding() - { - $feed = Zend_Feed_Reader::importString( - file_get_contents(dirname(__FILE__) . '/Reader/Entry/_files/Atom/title/plain/atom10.xml') - ); - - $this->assertEquals('utf-8', $feed->getEncoding()); - $this->assertEquals('utf-8', $feed->current()->getEncoding()); - } - - public function testImportsFile() - { - try { - $feed = Zend_Feed_Reader::importFile( - dirname(__FILE__) . '/Reader/Entry/_files/Atom/title/plain/atom10.xml' - ); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - } - - public function testImportsUri() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testImportsUri() requires a network connection'); - return; - } - - try { - $feed = Zend_Feed_Reader::import('http://www.planet-php.net/rdf/'); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-8328 - * @expectedException Zend_Feed_Exception - */ - public function testImportsUriAndThrowsExceptionIfNotAFeed() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testImportsUri() requires a network connection'); - return; - } - - $feed = Zend_Feed_Reader::import('http://twitter.com/alganet'); - } - - public function testGetsFeedLinksAsValueObject() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - - try { - $links = Zend_Feed_Reader::findFeedLinks('http://www.planet-php.net'); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - $this->assertEquals('http://www.planet-php.org/rss/', $links->rss); - } - - public function testCompilesLinksAsArrayObject() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - $links = Zend_Feed_Reader::findFeedLinks('http://www.planet-php.net'); - $this->assertTrue($links instanceof Zend_Feed_Reader_FeedSet); - $this->assertEquals(array( - 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.planet-php.org/rss/' - ), (array) $links->getIterator()->current()); - } - - public function testFeedSetLoadsFeedObjectWhenFeedArrayKeyAccessed() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - $links = Zend_Feed_Reader::findFeedLinks('http://www.planet-php.net'); - $link = $links->getIterator()->current(); - $this->assertTrue($link['feed'] instanceof Zend_Feed_Reader_Feed_Rss); - } - - public function testZeroCountFeedSetReturnedFromEmptyList() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - $links = Zend_Feed_Reader::findFeedLinks('http://www.example.com'); - $this->assertEquals(0, count($links)); - } - - /** - * @group ZF-8327 - */ - public function testGetsFeedLinksAndTrimsNewlines() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - - try { - $links = Zend_Feed_Reader::findFeedLinks('http://www.infopod.com.br'); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - $this->assertEquals('http://feeds.feedburner.com/jonnyken/infoblog', $links->rss); - } - - /** - * @group ZF-8330 - */ - public function testGetsFeedLinksAndNormalisesRelativeUrls() - { - if (!defined('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - || !constant('TESTS_ZEND_FEED_READER_ONLINE_ENABLED') - ) { - $this->markTestSkipped('testGetsFeedLinksAsValueObject() requires a network connection'); - return; - } - - try { - $links = Zend_Feed_Reader::findFeedLinks('http://meiobit.com'); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - $this->assertEquals('http://meiobit.com/rss.xml', $links->rss); - } - - /** - * @group ZF-8330 - */ - public function testGetsFeedLinksAndNormalisesRelativeUrlsOnUriWithPath() - { - try { - $currClient = Zend_Feed_Reader::getHttpClient(); - - $testAdapter = new Zend_Http_Client_Adapter_Test(); - $testAdapter->setResponse(new Zend_Http_Response(200, array(), '')); - Zend_Feed_Reader::setHttpClient(new Zend_Http_Client(null, array('adapter' => $testAdapter))); - - $links = Zend_Feed_Reader::findFeedLinks('http://foo/bar'); - - Zend_Feed_Reader::setHttpClient($currClient); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - - $this->assertEquals('http://foo/test.rss', $links->rss); - $this->assertEquals('http://foo/test.atom', $links->atom); - } - - public function testAddsPrefixPath() - { - Zend_Feed_Reader::addPrefixPath('A_B_C', '/A/B/C'); - $prefixPaths = Zend_Feed_Reader::getPluginLoader()->getPaths(); - $this->assertEquals('/A/B/C/', $prefixPaths['A_B_C_'][0]); - } - - public function testRegistersUserExtension() - { - try { - Zend_Feed_Reader::addPrefixPath('My_FeedReader_Extension',dirname(__FILE__) . '/Reader/_files/My/Extension'); - Zend_Feed_Reader::registerExtension('JungleBooks'); - } catch(Exception $e) { - $this->fail($e->getMessage()); - } - $this->assertTrue(Zend_Feed_Reader::isRegistered('JungleBooks')); - } - - /** - * @group ZF-11184 - */ - public function testImportingUriWithEmptyResponseBodyTriggersException() - { - $currClient = Zend_Feed_Reader::getHttpClient(); - $testAdapter = new Zend_Http_Client_Adapter_Test(); - $testAdapter->setResponse(new Zend_Http_Response(200,array(),'')); - Zend_Feed_Reader::setHttpClient(new Zend_Http_Client(null, array( - 'adapter'=>$testAdapter - ))); - - $this->setExpectedException('Zend_Feed_Exception', 'Feed failed to load'); - $result = Zend_Feed_Reader::import('http://www.example.com'); - } - - public function testXxePreventionOnFeedParsing() - { - $string = file_get_contents($this->_feedSamplePath.'/Reader/xxe-atom10.xml'); - $string = str_replace('XXE_URI', $this->_feedSamplePath.'/Reader/xxe-info.txt', $string); - $this->setExpectedException('Zend_Feed_Exception'); - $feed = Zend_Feed_Reader::importString($string); - } - - protected function _getTempDirectory() - { - $tmpdir = array(); - foreach (array($_ENV, $_SERVER) as $tab) { - foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) { - if (isset($tab[$key])) { - if (($key == 'windir') or ($key == 'SystemRoot')) { - $dir = realpath($tab[$key] . '\\temp'); - } else { - $dir = realpath($tab[$key]); - } - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } - } - } - } - if (function_exists('sys_get_temp_dir')) { - $dir = sys_get_temp_dir(); - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } - } - $tempFile = tempnam(md5(uniqid(rand(), TRUE)), ''); - if ($tempFile) { - $dir = realpath(dirname($tempFile)); - unlink($tempFile); - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } - } - if ($this->_isGoodTmpDir('/tmp')) { - return '/tmp'; - } - if ($this->_isGoodTmpDir('\\temp')) { - return '\\temp'; - } - } - - protected function _isGoodTmpDir($dir) - { - if (is_readable($dir) && is_writable($dir)) { - return true; - } - return false; - } - -} diff --git a/tests/Zend/Feed/RssTest.php b/tests/Zend/Feed/RssTest.php deleted file mode 100644 index 6f023864ab..0000000000 --- a/tests/Zend/Feed/RssTest.php +++ /dev/null @@ -1,48 +0,0 @@ -baseUri . '/' . $this->prepareFeed('zend_feed_rss_xxe.xml'); - $this->setExpectedException('Zend_Feed_Exception', 'parse'); - $feed = new Zend_Feed_Rss($uri); - } -} diff --git a/tests/Zend/Feed/Writer/DeletedTest.php b/tests/Zend/Feed/Writer/DeletedTest.php deleted file mode 100644 index adf02fa752..0000000000 --- a/tests/Zend/Feed/Writer/DeletedTest.php +++ /dev/null @@ -1,183 +0,0 @@ -setReference('http://www.example.com/id'); - $this->assertEquals('http://www.example.com/id', $entry->getReference()); - } - - public function testSetReferenceThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setReference(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetReferenceReturnsNullIfNotSet() - { - $entry = new Zend_Feed_Writer_Deleted; - $this->assertTrue(is_null($entry->getReference())); - } - - public function testSetWhenDefaultsToCurrentTime() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setWhen(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($entry->getWhen()) || $dateNow->equals($entry->getWhen())); - } - - public function testSetWhenUsesGivenUnixTimestamp() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setWhen(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getWhen())); - } - - /** - * @group ZF-12070 - */ - public function testSetWhenUsesGivenUnixTimestampWhenItIsLessThanTenDigits() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setWhen(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getWhen())); - } - - /** - * @group ZF-11610 - */ - public function testSetWhenUsesGivenUnixTimestampWhenItIsAVerySmallInteger() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setWhen(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getWhen())); - } - - public function testSetWhenUsesZendDateObject() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setWhen(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getWhen())); - } - - public function testSetWhenThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setWhen('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetWhenReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Deleted; - $this->assertTrue(is_null($entry->getWhen())); - } - - public function testAddsByNameFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setBy(array('name'=>'Joe')); - $this->assertEquals(array('name'=>'Joe'), $entry->getBy()); - } - - public function testAddsByEmailFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setBy(array('name'=>'Joe','email'=>'joe@example.com')); - $this->assertEquals(array('name'=>'Joe', 'email' => 'joe@example.com'), $entry->getBy()); - } - - public function testAddsByUriFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - $entry->setBy(array('name'=>'Joe','uri'=>'http://www.example.com')); - $this->assertEquals(array('name'=>'Joe', 'uri' => 'http://www.example.com'), $entry->getBy()); - } - - public function testAddByThrowsExceptionOnInvalidNameFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setBy(array('name'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddByThrowsExceptionOnInvalidEmailFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setBy(array('name'=>'Joe','email'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddByThrowsExceptionOnInvalidUriFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setBy(array('name'=>'Joe','uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddByThrowsExceptionIfNameOmittedFromArray() - { - $entry = new Zend_Feed_Writer_Deleted; - try { - $entry->setBy(array('uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - -} diff --git a/tests/Zend/Feed/Writer/EntryTest.php b/tests/Zend/Feed/Writer/EntryTest.php deleted file mode 100644 index 67c712979d..0000000000 --- a/tests/Zend/Feed/Writer/EntryTest.php +++ /dev/null @@ -1,603 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/_files'; - } - - public function testAddsAuthorName() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor('Joe'); - $this->assertEquals(array(array('name'=>'Joe')), $entry->getAuthors()); - } - - public function testAddsAuthorEmail() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor('Joe', 'joe@example.com'); - $this->assertEquals(array(array('name'=>'Joe', 'email' => 'joe@example.com')), $entry->getAuthors()); - } - - public function testAddsAuthorUri() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor('Joe', null, 'http://www.example.com'); - $this->assertEquals(array(array('name'=>'Joe', 'uri' => 'http://www.example.com')), $entry->getAuthors()); - } - - public function testAddAuthorThrowsExceptionOnInvalidName() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidEmail() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor('Joe', ''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidUri() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor('Joe', null, 'notauri'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddsAuthorNameFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor(array('name'=>'Joe')); - $this->assertEquals(array(array('name'=>'Joe')), $entry->getAuthors()); - } - - public function testAddsAuthorEmailFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor(array('name'=>'Joe','email'=>'joe@example.com')); - $this->assertEquals(array(array('name'=>'Joe', 'email' => 'joe@example.com')), $entry->getAuthors()); - } - - public function testAddsAuthorUriFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthor(array('name'=>'Joe','uri'=>'http://www.example.com')); - $this->assertEquals(array(array('name'=>'Joe', 'uri' => 'http://www.example.com')), $entry->getAuthors()); - } - - public function testAddAuthorThrowsExceptionOnInvalidNameFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor(array('name'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidEmailFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor(array('name'=>'Joe','email'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidUriFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor(array('name'=>'Joe','uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionIfNameOmittedFromArray() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->addAuthor(array('uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddsAuthorsFromArrayOfAuthors() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addAuthors(array( - array('name'=>'Joe','uri'=>'http://www.example.com'), - array('name'=>'Jane','uri'=>'http://www.example.com') - )); - $expected = array( - array('name'=>'Joe','uri'=>'http://www.example.com'), - array('name'=>'Jane','uri'=>'http://www.example.com') - ); - $this->assertEquals($expected, $entry->getAuthors()); - } - - public function testAddsEnclosure() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'uri' => 'http://example.com/audio.mp3', - 'length' => '1337' - )); - $expected = array( - 'type' => 'audio/mpeg', - 'uri' => 'http://example.com/audio.mp3', - 'length' => '1337' - ); - $this->assertEquals($expected, $entry->getEnclosure()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionOnMissingUri() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'length' => '1337' - )); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionWhenUriIsInvalid() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'uri' => 'http://', - 'length' => '1337' - )); - } - - public function testSetsCopyright() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setCopyright('Copyright (c) 2009 Paddy Brady'); - $this->assertEquals('Copyright (c) 2009 Paddy Brady', $entry->getCopyright()); - } - - public function testSetCopyrightThrowsExceptionOnInvalidParam() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCopyright(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetsContent() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setContent('I\'m content.'); - $this->assertEquals("I'm content.", $entry->getContent()); - } - - public function testSetContentThrowsExceptionOnInvalidParam() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setContent(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetDateCreatedDefaultsToCurrentTime() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateCreated(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($entry->getDateCreated()) || $dateNow->equals($entry->getDateCreated())); - } - - public function testSetDateCreatedUsesGivenUnixTimestamp() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateCreated(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateCreated())); - } - - /** - * @group ZF-12070 - */ - public function testSetDateCreatedUsesGivenUnixTimestampWhenItIsLessThanTenDigits() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateCreated(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateCreated())); - } - - /** - * @group ZF-11610 - */ - public function testSetDateCreatedUsesGivenUnixTimestampWhenItIsAVerySmallInteger() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateCreated(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateCreated())); - } - - public function testSetDateCreatedUsesZendDateObject() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateCreated(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateCreated())); - } - - public function testSetDateModifiedDefaultsToCurrentTime() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateModified(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($entry->getDateModified()) || $dateNow->equals($entry->getDateModified())); - } - - public function testSetDateModifiedUsesGivenUnixTimestamp() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateModified(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateModified())); - } - - /** - * @group ZF-12070 - */ - public function testSetDateModifiedUsesGivenUnixTimestampWhenItIsLessThanTenDigits() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateModified(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateModified())); - } - - /** - * @group ZF-11610 - */ - public function testSetDateModifiedUsesGivenUnixTimestampWhenItIsAVerySmallInteger() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateModified(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateModified())); - } - - public function testSetDateModifiedUsesZendDateObject() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDateModified(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($entry->getDateModified())); - } - - public function testSetDateCreatedThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setDateCreated('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetDateModifiedThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setDateModified('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetDateCreatedReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getDateCreated())); - } - - public function testGetDateModifiedReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getDateModified())); - } - - public function testGetCopyrightReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getCopyright())); - } - - public function testGetContentReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getContent())); - } - - public function testSetsDescription() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setDescription('abc'); - $this->assertEquals('abc', $entry->getDescription()); - } - - public function testSetDescriptionThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setDescription(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetDescriptionReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getDescription())); - } - - public function testSetsId() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setId('http://www.example.com/id'); - $this->assertEquals('http://www.example.com/id', $entry->getId()); - } - - public function testSetIdThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setId(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetIdReturnsNullIfNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getId())); - } - - public function testSetsLink() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setLink('http://www.example.com/id'); - $this->assertEquals('http://www.example.com/id', $entry->getLink()); - } - - public function testSetLinkThrowsExceptionOnEmptyString() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setLink(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetLinkThrowsExceptionOnInvalidUri() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setLink('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetLinkReturnsNullIfNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getLink())); - } - - public function testSetsCommentLink() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setCommentLink('http://www.example.com/id/comments'); - $this->assertEquals('http://www.example.com/id/comments', $entry->getCommentLink()); - } - - public function testSetCommentLinkThrowsExceptionOnEmptyString() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentLink(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetCommentLinkThrowsExceptionOnInvalidUri() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentLink('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetCommentLinkReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getCommentLink())); - } - - public function testSetsCommentFeedLink() - { - $entry = new Zend_Feed_Writer_Entry; - - $entry->setCommentFeedLink(array('uri'=>'http://www.example.com/id/comments', 'type'=>'rdf')); - $this->assertEquals(array(array('uri'=>'http://www.example.com/id/comments', 'type'=>'rdf')), $entry->getCommentFeedLinks()); - } - - public function testSetCommentFeedLinkThrowsExceptionOnEmptyString() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentFeedLink(array('uri'=>'', 'type'=>'rdf')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetCommentFeedLinkThrowsExceptionOnInvalidUri() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentFeedLink(array('uri'=>'http://', 'type'=>'rdf')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetCommentFeedLinkThrowsExceptionOnInvalidType() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentFeedLink(array('uri'=>'http://www.example.com/id/comments', 'type'=>'foo')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetCommentFeedLinkReturnsNullIfNoneSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getCommentFeedLinks())); - } - - public function testSetsTitle() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setTitle('abc'); - $this->assertEquals('abc', $entry->getTitle()); - } - - public function testSetTitleThrowsExceptionOnInvalidParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setTitle(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetTitleReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getTitle())); - } - - public function testSetsCommentCount() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setCommentCount('10'); - $this->assertEquals(10, $entry->getCommentCount()); - } - - /** - * @group ZF-11150 - */ - public function testSetCommentCountAcceptsZero() - { - $entry = new Zend_Feed_Writer_Entry(); - $entry->setCommentCount(0); - $this->assertEquals(0, $entry->getCommentCount()); - } - - public function testSetCommentCountThrowsExceptionOnInvalidEmptyParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentCount(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetCommentCountThrowsExceptionOnInvalidNonIntegerParameter() - { - $entry = new Zend_Feed_Writer_Entry; - try { - $entry->setCommentCount('a'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetCommentCountReturnsNullIfDateNotSet() - { - $entry = new Zend_Feed_Writer_Entry; - $this->assertTrue(is_null($entry->getCommentCount())); - } - -} diff --git a/tests/Zend/Feed/Writer/Extension/ITunes/EntryTest.php b/tests/Zend/Feed/Writer/Extension/ITunes/EntryTest.php deleted file mode 100644 index 1a7373d872..0000000000 --- a/tests/Zend/Feed/Writer/Extension/ITunes/EntryTest.php +++ /dev/null @@ -1,229 +0,0 @@ -setItunesBlock('yes'); - $this->assertEquals('yes', $entry->getItunesBlock()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetBlockThrowsExceptionOnNonAlphaValue() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesBlock('123'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetBlockThrowsExceptionIfValueGreaterThan255CharsLength() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesBlock(str_repeat('a', 256)); - } - - public function testAddAuthors() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addItunesAuthors(array('joe', 'jane')); - $this->assertEquals(array('joe', 'jane'), $entry->getItunesAuthors()); - } - - public function testAddAuthor() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addItunesAuthor('joe'); - $this->assertEquals(array('joe'), $entry->getItunesAuthors()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddAuthorThrowsExceptionIfValueGreaterThan255CharsLength() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->addItunesAuthor(str_repeat('a', 256)); - } - - public function testSetDurationAsSeconds() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration(23); - $this->assertEquals(23, $entry->getItunesDuration()); - } - - public function testSetDurationAsMinutesAndSeconds() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration('23:23'); - $this->assertEquals('23:23', $entry->getItunesDuration()); - } - - public function testSetDurationAsHoursMinutesAndSeconds() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration('23:23:23'); - $this->assertEquals('23:23:23', $entry->getItunesDuration()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnUnknownFormat() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration('abc'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnInvalidSeconds() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration('23:456'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnInvalidMinutes() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesDuration('23:234:45'); - } - - public function testSetExplicitToYes() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesExplicit('yes'); - $this->assertEquals('yes', $entry->getItunesExplicit()); - } - - public function testSetExplicitToNo() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesExplicit('no'); - $this->assertEquals('no', $entry->getItunesExplicit()); - } - - public function testSetExplicitToClean() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesExplicit('clean'); - $this->assertEquals('clean', $entry->getItunesExplicit()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetExplicitThrowsExceptionOnUnknownTerm() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesExplicit('abc'); - } - - public function testSetKeywords() - { - $entry = new Zend_Feed_Writer_Entry; - $words = array( - 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12' - ); - $entry->setItunesKeywords($words); - $this->assertEquals($words, $entry->getItunesKeywords()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetKeywordsThrowsExceptionIfMaxKeywordsExceeded() - { - $entry = new Zend_Feed_Writer_Entry; - $words = array( - 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12', 'a13' - ); - $entry->setItunesKeywords($words); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetKeywordsThrowsExceptionIfFormattedKeywordsExceeds255CharLength() - { - $entry = new Zend_Feed_Writer_Entry; - $words = array( - str_repeat('a', 253), str_repeat('b', 2) - ); - $entry->setItunesKeywords($words); - } - - public function testSetSubtitle() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesSubtitle('abc'); - $this->assertEquals('abc', $entry->getItunesSubtitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetSubtitleThrowsExceptionWhenValueExceeds255Chars() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesSubtitle(str_repeat('a', 256)); - } - - public function testSetSummary() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesSummary('abc'); - $this->assertEquals('abc', $entry->getItunesSummary()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetSummaryThrowsExceptionWhenValueExceeds255Chars() - { - $entry = new Zend_Feed_Writer_Entry; - $entry->setItunesSummary(str_repeat('a', 4001)); - } - -} diff --git a/tests/Zend/Feed/Writer/Extension/ITunes/FeedTest.php b/tests/Zend/Feed/Writer/Extension/ITunes/FeedTest.php deleted file mode 100644 index 30676b1765..0000000000 --- a/tests/Zend/Feed/Writer/Extension/ITunes/FeedTest.php +++ /dev/null @@ -1,316 +0,0 @@ -setItunesBlock('yes'); - $this->assertEquals('yes', $feed->getItunesBlock()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetBlockThrowsExceptionOnNonAlphaValue() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesBlock('123'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetBlockThrowsExceptionIfValueGreaterThan255CharsLength() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesBlock(str_repeat('a', 256)); - } - - public function testAddAuthors() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->addItunesAuthors(array('joe', 'jane')); - $this->assertEquals(array('joe', 'jane'), $feed->getItunesAuthors()); - } - - public function testAddAuthor() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->addItunesAuthor('joe'); - $this->assertEquals(array('joe'), $feed->getItunesAuthors()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddAuthorThrowsExceptionIfValueGreaterThan255CharsLength() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->addItunesAuthor(str_repeat('a', 256)); - } - - public function testSetCategories() - { - $feed = new Zend_Feed_Writer_Feed; - $cats = array( - 'cat1', - 'cat2' => array('cat2-1', 'cat2-a&b') - ); - $feed->setItunesCategories($cats); - $this->assertEquals($cats, $feed->getItunesCategories()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetCategoriesThrowsExceptionIfAnyCatNameGreaterThan255CharsLength() - { - $feed = new Zend_Feed_Writer_Feed; - $cats = array( - 'cat1', - 'cat2' => array('cat2-1', str_repeat('a', 256)) - ); - $feed->setItunesCategories($cats); - $this->assertEquals($cats, $feed->getItunesAuthors()); - } - - public function testSetImageAsPngFile() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesImage('http://www.example.com/image.png'); - $this->assertEquals('http://www.example.com/image.png', $feed->getItunesImage()); - } - - public function testSetImageAsJpgFile() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesImage('http://www.example.com/image.jpg'); - $this->assertEquals('http://www.example.com/image.jpg', $feed->getItunesImage()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetImageThrowsExceptionOnInvalidUri() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesImage('http://'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetImageThrowsExceptionOnInvalidImageExtension() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesImage('http://www.example.com/image.gif'); - } - - public function testSetDurationAsSeconds() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration(23); - $this->assertEquals(23, $feed->getItunesDuration()); - } - - public function testSetDurationAsMinutesAndSeconds() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration('23:23'); - $this->assertEquals('23:23', $feed->getItunesDuration()); - } - - public function testSetDurationAsHoursMinutesAndSeconds() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration('23:23:23'); - $this->assertEquals('23:23:23', $feed->getItunesDuration()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnUnknownFormat() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration('abc'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnInvalidSeconds() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration('23:456'); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetDurationThrowsExceptionOnInvalidMinutes() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesDuration('23:234:45'); - } - - public function testSetExplicitToYes() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesExplicit('yes'); - $this->assertEquals('yes', $feed->getItunesExplicit()); - } - - public function testSetExplicitToNo() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesExplicit('no'); - $this->assertEquals('no', $feed->getItunesExplicit()); - } - - public function testSetExplicitToClean() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesExplicit('clean'); - $this->assertEquals('clean', $feed->getItunesExplicit()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetExplicitThrowsExceptionOnUnknownTerm() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesExplicit('abc'); - } - - public function testSetKeywords() - { - $feed = new Zend_Feed_Writer_Feed; - $words = array( - 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12' - ); - $feed->setItunesKeywords($words); - $this->assertEquals($words, $feed->getItunesKeywords()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetKeywordsThrowsExceptionIfMaxKeywordsExceeded() - { - $feed = new Zend_Feed_Writer_Feed; - $words = array( - 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10', 'a11', 'a12', 'a13' - ); - $feed->setItunesKeywords($words); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetKeywordsThrowsExceptionIfFormattedKeywordsExceeds255CharLength() - { - $feed = new Zend_Feed_Writer_Feed; - $words = array( - str_repeat('a', 253), str_repeat('b', 2) - ); - $feed->setItunesKeywords($words); - } - - public function testSetNewFeedUrl() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesNewFeedUrl('http://example.com/feed'); - $this->assertEquals('http://example.com/feed', $feed->getItunesNewFeedUrl()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetNewFeedUrlThrowsExceptionOnInvalidUri() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesNewFeedUrl('http://'); - } - - public function testAddOwner() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->addItunesOwner(array('name'=>'joe','email'=>'joe@example.com')); - $this->assertEquals(array(array('name'=>'joe','email'=>'joe@example.com')), $feed->getItunesOwners()); - } - - public function testAddOwners() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->addItunesOwners(array(array('name'=>'joe','email'=>'joe@example.com'))); - $this->assertEquals(array(array('name'=>'joe','email'=>'joe@example.com')), $feed->getItunesOwners()); - } - - public function testSetSubtitle() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesSubtitle('abc'); - $this->assertEquals('abc', $feed->getItunesSubtitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetSubtitleThrowsExceptionWhenValueExceeds255Chars() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesSubtitle(str_repeat('a', 256)); - } - - public function testSetSummary() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesSummary('abc'); - $this->assertEquals('abc', $feed->getItunesSummary()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetSummaryThrowsExceptionWhenValueExceeds4000Chars() - { - $feed = new Zend_Feed_Writer_Feed; - $feed->setItunesSummary(str_repeat('a',4001)); - } - -} diff --git a/tests/Zend/Feed/Writer/FeedTest.php b/tests/Zend/Feed/Writer/FeedTest.php deleted file mode 100644 index c37729d155..0000000000 --- a/tests/Zend/Feed/Writer/FeedTest.php +++ /dev/null @@ -1,979 +0,0 @@ -_feedSamplePath = dirname(__FILE__) . '/Writer/_files'; - } - - public function testAddsAuthorName() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor('Joe'); - $this->assertEquals(array('name'=>'Joe'), $writer->getAuthor()); - } - - public function testAddsAuthorEmail() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor('Joe', 'joe@example.com'); - $this->assertEquals(array('name'=>'Joe', 'email' => 'joe@example.com'), $writer->getAuthor()); - } - - public function testAddsAuthorUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor('Joe', null, 'http://www.example.com'); - $this->assertEquals(array('name'=>'Joe', 'uri' => 'http://www.example.com'), $writer->getAuthor()); - } - - public function testAddAuthorThrowsExceptionOnInvalidName() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidEmail() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor('Joe', ''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor('Joe', null, 'notauri'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddsAuthorNameFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor(array('name'=>'Joe')); - $this->assertEquals(array('name'=>'Joe'), $writer->getAuthor()); - } - - public function testAddsAuthorEmailFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor(array('name'=>'Joe','email'=>'joe@example.com')); - $this->assertEquals(array('name'=>'Joe', 'email' => 'joe@example.com'), $writer->getAuthor()); - } - - public function testAddsAuthorUriFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthor(array('name'=>'Joe','uri'=>'http://www.example.com')); - $this->assertEquals(array('name'=>'Joe', 'uri' => 'http://www.example.com'), $writer->getAuthor()); - } - - public function testAddAuthorThrowsExceptionOnInvalidNameFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor(array('name'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidEmailFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor(array('name'=>'Joe','email'=>'')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionOnInvalidUriFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor(array('name'=>'Joe','uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddAuthorThrowsExceptionIfNameOmittedFromArray() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addAuthor(array('uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddsAuthorsFromArrayOfAuthors() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addAuthors(array( - array('name'=>'Joe','uri'=>'http://www.example.com'), - array('name'=>'Jane','uri'=>'http://www.example.com') - )); - $this->assertEquals(array('name'=>'Jane', 'uri' => 'http://www.example.com'), $writer->getAuthor(1)); - } - - public function testSetsCopyright() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setCopyright('Copyright (c) 2009 Paddy Brady'); - $this->assertEquals('Copyright (c) 2009 Paddy Brady', $writer->getCopyright()); - } - - public function testSetCopyrightThrowsExceptionOnInvalidParam() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setCopyright(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetDateCreatedDefaultsToCurrentTime() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateCreated(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($writer->getDateCreated()) || $dateNow->equals($writer->getDateCreated())); - } - - public function testSetDateCreatedUsesGivenUnixTimestamp() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateCreated(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateCreated())); - } - - /** - * @group ZF-12023 - */ - public function testSetDateCreatedUsesGivenUnixTimestampThatIsLessThanTenDigits() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateCreated(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateCreated())); - } - - /** - * @group ZF-11610 - */ - public function testSetDateCreatedUsesGivenUnixTimestampThatIsAVerySmallInteger() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateCreated(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateCreated())); - } - - public function testSetDateCreatedUsesZendDateObject() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateCreated(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateCreated())); - } - - public function testSetDateModifiedDefaultsToCurrentTime() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateModified(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($writer->getDateModified()) || $dateNow->equals($writer->getDateModified())); - } - - public function testSetDateModifiedUsesGivenUnixTimestamp() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateModified(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateModified())); - } - - /** - * @group ZF-12023 - */ - public function testSetDateModifiedUsesGivenUnixTimestampThatIsLessThanTenDigits() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateModified(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateModified())); - } - - /** - * @group ZF-11610 - */ - public function testSetDateModifiedUsesGivenUnixTimestampThatIsAVerySmallInteger() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateModified(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateModified())); - } - - public function testSetDateModifiedUsesZendDateObject() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDateModified(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getDateModified())); - } - - public function testSetDateCreatedThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setDateCreated('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetDateModifiedThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setDateModified('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetDateCreatedReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getDateCreated())); - } - - public function testGetDateModifiedReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getDateModified())); - } - - public function testSetLastBuildDateDefaultsToCurrentTime() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLastBuildDate(); - $dateNow = new Zend_Date; - $this->assertTrue($dateNow->isLater($writer->getLastBuildDate()) || $dateNow->equals($writer->getLastBuildDate())); - } - - public function testSetLastBuildDateUsesGivenUnixTimestamp() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLastBuildDate(1234567890); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getLastBuildDate())); - } - - /** - * @group ZF-12023 - */ - public function testSetLastBuildDateUsesGivenUnixTimestampThatIsLessThanTenDigits() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLastBuildDate(123456789); - $myDate = new Zend_Date('123456789', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getLastBuildDate())); - } - - /** - * @group ZF-11610 - */ - public function testSetLastBuildDateUsesGivenUnixTimestampThatIsAVerySmallInteger() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLastBuildDate(123); - $myDate = new Zend_Date('123', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getLastBuildDate())); - } - - public function testSetLastBuildDateUsesZendDateObject() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLastBuildDate(new Zend_Date('1234567890', Zend_Date::TIMESTAMP)); - $myDate = new Zend_Date('1234567890', Zend_Date::TIMESTAMP); - $this->assertTrue($myDate->equals($writer->getLastBuildDate())); - } - - public function testSetLastBuildDateThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setLastBuildDate('abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetLastBuildDateReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getLastBuildDate())); - } - - public function testGetCopyrightReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getCopyright())); - } - - public function testSetsDescription() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setDescription('abc'); - $this->assertEquals('abc', $writer->getDescription()); - } - - public function testSetDescriptionThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setDescription(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetDescriptionReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getDescription())); - } - - public function testSetsId() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setId('http://www.example.com/id'); - $this->assertEquals('http://www.example.com/id', $writer->getId()); - } - - public function testSetsIdAcceptsUrns() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setId('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'); - $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $writer->getId()); - } - - public function testSetsIdAcceptsSimpleTagUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setId('tag:example.org,2010:/foo/bar/'); - $this->assertEquals('tag:example.org,2010:/foo/bar/', $writer->getId()); - } - - public function testSetsIdAcceptsComplexTagUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setId('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog'); - $this->assertEquals('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog', $writer->getId()); - } - - public function testSetIdThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setId(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetIdThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setId('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetIdReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getId())); - } - - public function testSetsLanguage() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLanguage('abc'); - $this->assertEquals('abc', $writer->getLanguage()); - } - - public function testSetLanguageThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setLanguage(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetLanguageReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getLanguage())); - } - - public function testSetsLink() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setLink('http://www.example.com/id'); - $this->assertEquals('http://www.example.com/id', $writer->getLink()); - } - - public function testSetLinkThrowsExceptionOnEmptyString() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setLink(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetLinkThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setLink('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetLinkReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getLink())); - } - - public function testSetsEncoding() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setEncoding('utf-16'); - $this->assertEquals('utf-16', $writer->getEncoding()); - } - - public function testSetEncodingThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setEncoding(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetEncodingReturnsUtf8IfNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertEquals('UTF-8', $writer->getEncoding()); - } - - public function testSetsTitle() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setTitle('abc'); - $this->assertEquals('abc', $writer->getTitle()); - } - - public function testSetTitleThrowsExceptionOnInvalidParameter() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setTitle(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetTitleReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getTitle())); - } - - public function testSetsGeneratorName() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator(array('name'=>'ZFW')); - $this->assertEquals(array('name'=>'ZFW'), $writer->getGenerator()); - } - - public function testSetsGeneratorVersion() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator(array('name'=>'ZFW', 'version' => '1.0')); - $this->assertEquals(array('name'=>'ZFW', 'version' => '1.0'), $writer->getGenerator()); - } - - public function testSetsGeneratorUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator(array('name'=>'ZFW', 'uri'=>'http://www.example.com')); - $this->assertEquals(array('name'=>'ZFW', 'uri' => 'http://www.example.com'), $writer->getGenerator()); - } - - public function testSetsGeneratorThrowsExceptionOnInvalidName() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator(array()); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetsGeneratorThrowsExceptionOnInvalidVersion() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator(array('name'=>'ZFW', 'version'=>'')); - $this->fail('Should have failed since version is empty'); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetsGeneratorThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator(array('name'=>'ZFW','uri'=>'notauri')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - /** - * @deprecated - */ - public function testSetsGeneratorName_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator('ZFW'); - $this->assertEquals(array('name'=>'ZFW'), $writer->getGenerator()); - } - - /** - * @deprecated - */ - public function testSetsGeneratorVersion_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator('ZFW', '1.0'); - $this->assertEquals(array('name'=>'ZFW', 'version' => '1.0'), $writer->getGenerator()); - } - - /** - * @deprecated - */ - public function testSetsGeneratorUri_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setGenerator('ZFW', null, 'http://www.example.com'); - $this->assertEquals(array('name'=>'ZFW', 'uri' => 'http://www.example.com'), $writer->getGenerator()); - } - - /** - * @deprecated - */ - public function testSetsGeneratorThrowsExceptionOnInvalidName_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator(''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - /** - * @deprecated - */ - public function testSetsGeneratorThrowsExceptionOnInvalidVersion_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator('ZFW', ''); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - /** - * @deprecated - */ - public function testSetsGeneratorThrowsExceptionOnInvalidUri_Deprecated() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setGenerator('ZFW', null, 'notauri'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetGeneratorReturnsNullIfDateNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getGenerator())); - } - - public function testSetsFeedLink() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setFeedLink('http://www.example.com/rss', 'RSS'); - $this->assertEquals(array('rss'=>'http://www.example.com/rss'), $writer->getFeedLinks()); - } - - public function testSetsFeedLinkThrowsExceptionOnInvalidType() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setFeedLink('http://www.example.com/rss', 'abc'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testSetsFeedLinkThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setFeedLink('http://', 'rss'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetFeedLinksReturnsNullIfNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getFeedLinks())); - } - - public function testSetsBaseUrl() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setBaseUrl('http://www.example.com'); - $this->assertEquals('http://www.example.com', $writer->getBaseUrl()); - } - - public function testSetsBaseUrlThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->setBaseUrl('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testGetBaseUrlReturnsNullIfNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getBaseUrl())); - } - - public function testAddsHubUrl() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addHub('http://www.example.com/hub'); - $this->assertEquals(array('http://www.example.com/hub'), $writer->getHubs()); - } - - public function testAddsManyHubUrls() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addHubs(array('http://www.example.com/hub', 'http://www.example.com/hub2')); - $this->assertEquals(array('http://www.example.com/hub', 'http://www.example.com/hub2'), $writer->getHubs()); - } - - public function testAddingHubUrlThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addHub('http://'); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddingHubUrlReturnsNullIfNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getHubs())); - } - - public function testCreatesNewEntryDataContainer() - { - $writer = new Zend_Feed_Writer_Feed; - $entry = $writer->createEntry(); - $this->assertTrue($entry instanceof Zend_Feed_Writer_Entry); - } - - public function testAddsCategory() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addCategory(array('term'=>'cat_dog')); - $this->assertEquals(array(array('term'=>'cat_dog')), $writer->getCategories()); - } - - public function testAddsManyCategories() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->addCategories(array(array('term'=>'cat_dog'),array('term'=>'cat_mouse'))); - $this->assertEquals(array(array('term'=>'cat_dog'),array('term'=>'cat_mouse')), $writer->getCategories()); - } - - public function testAddingCategoryWithoutTermThrowsException() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addCategory(array('label' => 'Cats & Dogs', 'scheme' => 'http://www.example.com/schema1')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - public function testAddingCategoryWithInvalidUriAsSchemeThrowsException() - { - $writer = new Zend_Feed_Writer_Feed; - try { - $writer->addCategory(array('term' => 'cat_dog', 'scheme' => 'http://')); - $this->fail(); - } catch (Zend_Feed_Exception $e) { - } - } - - // Image Tests - - public function testSetsImageUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif' - ), $writer->getImage()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsImageUriThrowsExceptionOnEmptyUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => '' - )); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsImageUriThrowsExceptionOnMissingUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsImageUriThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://' - )); - } - - public function testSetsImageLink() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com' - ), $writer->getImage()); - } - - public function testSetsImageTitle() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'title' => 'Image title' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif', - 'title' => 'Image title' - ), $writer->getImage()); - } - - public function testSetsImageHeight() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'height' => '88' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif', - 'height' => '88' - ), $writer->getImage()); - } - - public function testSetsImageWidth() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'width' => '88' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif', - 'width' => '88' - ), $writer->getImage()); - } - - public function testSetsImageDescription() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'description' => 'Image description' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif', - 'description' => 'Image description' - ), $writer->getImage()); - } - - // Icon Tests - - public function testSetsIconUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setIcon(array( - 'uri' => 'http://www.example.com/logo.gif' - )); - $this->assertEquals(array( - 'uri' => 'http://www.example.com/logo.gif' - ), $writer->getIcon()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsIconUriThrowsExceptionOnEmptyUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setIcon(array( - 'uri' => '' - )); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsIconUriThrowsExceptionOnMissingUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setIcon(array()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testSetsIconUriThrowsExceptionOnInvalidUri() - { - $writer = new Zend_Feed_Writer_Feed; - $writer->setIcon(array( - 'uri' => 'http://' - )); - } - - public function testGetCategoriesReturnsNullIfNotSet() - { - $writer = new Zend_Feed_Writer_Feed; - $this->assertTrue(is_null($writer->getCategories())); - } - - public function testAddsAndOrdersEntriesByDateIfRequested() - { - $writer = new Zend_Feed_Writer_Feed; - $entry = $writer->createEntry(); - $entry->setDateCreated(1234567890); - $entry2 = $writer->createEntry(); - $entry2->setDateCreated(1230000000); - $writer->addEntry($entry); - $writer->addEntry($entry2); - $writer->orderByDate(); - $this->assertEquals(1230000000, $writer->getEntry(1)->getDateCreated()->get(Zend_Date::TIMESTAMP)); - } - -} diff --git a/tests/Zend/Feed/Writer/Renderer/Entry/AtomTest.php b/tests/Zend/Feed/Writer/Renderer/Entry/AtomTest.php deleted file mode 100644 index e2e9a50188..0000000000 --- a/tests/Zend/Feed/Writer/Renderer/Entry/AtomTest.php +++ /dev/null @@ -1,315 +0,0 @@ -_validWriter = new Zend_Feed_Writer_Feed; - - $this->_validWriter->setType('atom'); - - $this->_validWriter->setTitle('This is a test feed.'); - $this->_validWriter->setDescription('This is a test description.'); - $this->_validWriter->setDateModified(1234567890); - $this->_validWriter->setLink('http://www.example.com'); - $this->_validWriter->setFeedLink('http://www.example.com/atom', 'atom'); - $this->_validWriter->addAuthor('Joe', 'joe@example.com', 'http://www.example.com/joe'); - $this->_validEntry = $this->_validWriter->createEntry(); - $this->_validEntry->setTitle('This is a test entry.'); - $this->_validEntry->setDescription('This is a test entry description.'); - $this->_validEntry->setDateModified(1234567890); - $this->_validEntry->setDateCreated(1234567000); - $this->_validEntry->setLink('http://www.example.com/1'); - $this->_validEntry->addAuthor('Jane', 'jane@example.com', 'http://www.example.com/jane'); - $this->_validEntry->setContent('

This is test content for xhtml:

'); - $this->_validWriter->addEntry($this->_validEntry); - } - - public function tearDown() - { - $this->_validWriter = null; - $this->_validEntry = null; - } - - public function testRenderMethodRunsMinimalWriterContainerProperlyBeforeICheckAtomCompliance() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - try { - $renderer->render(); - } catch (Zend_Feed_Exception $e) { - $this->fail('Valid Writer object caused an exception when building which should never happen'); - } - } - - public function testEntryEncodingHasBeenSet() - { - $this->_validWriter->setEncoding('iso-8859-1'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('iso-8859-1', $entry->getEncoding()); - } - - public function testEntryEncodingDefaultIsUsedIfEncodingNotSetByHand() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - - public function testEntryTitleHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('This is a test entry.', $entry->getTitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedTitleIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->remove('title'); - $atomFeed->render(); - } - - public function testEntrySummaryDescriptionHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('This is a test entry description.', $entry->getDescription()); - } - - /** - * @group ZFWATOMCONTENT - */ - public function testEntryContentHasBeenSet_Xhtml() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('

This is test content for xhtml:

', $entry->getContent()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedContentIfMissingThrowsExceptionIfThereIsNoLink() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->remove('content'); - $this->_validEntry->remove('link'); - $atomFeed->render(); - } - - public function testEntryUpdatedDateHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(1234567890, $entry->getDateModified()->get(Zend_Date::TIMESTAMP)); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedUpdatedDateIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->remove('dateModified'); - $atomFeed->render(); - } - - public function testEntryPublishedDateHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(1234567000, $entry->getDateCreated()->get(Zend_Date::TIMESTAMP)); - } - - public function testEntryIncludesLinkToHtmlVersionOfFeed() - { - $renderer= new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getLink()); - } - - public function testEntryHoldsAnyAuthorAdded() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $author = $entry->getAuthor(); - $this->assertEquals(array( - 'name'=>'Jane', - 'email'=>'jane@example.com', - 'uri'=>'http://www.example.com/jane'), $entry->getAuthor()); - } - - public function testEntryHoldsAnyEnclosureAdded() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'length' => '1337', - 'uri' => 'http://example.com/audio.mp3' - )); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $enc = $entry->getEnclosure(); - $this->assertEquals('audio/mpeg', $enc->type); - $this->assertEquals('1337', $enc->length); - $this->assertEquals('http://example.com/audio.mp3', $enc->url); - } - - public function testEntryIdHasBeenSet() - { - $this->_validEntry->setId('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $entry->getId()); - } - - public function testEntryIdHasBeenSetUsingSimpleTagUri() - { - $this->_validEntry->setId('tag:example.org,2010:/foo/bar/'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('tag:example.org,2010:/foo/bar/', $entry->getId()); - } - - public function testEntryIdHasBeenSetUsingComplexTagUri() - { - $this->_validEntry->setId('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog', $entry->getId()); - } - - public function testFeedIdDefaultIsUsedIfNotSetByHand() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals($entry->getLink(), $entry->getId()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedIdIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->remove('id'); - $this->_validEntry->remove('link'); - $atomFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedIdThrowsExceptionIfNotUri() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->remove('id'); - $this->_validEntry->remove('link'); - $this->_validEntry->setId('not-a-uri'); - $atomFeed->render(); - } - - public function testCommentLinkRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->setCommentLink('http://www.example.com/id/1'); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/id/1', $entry->getCommentLink()); - } - - public function testCommentCountRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->setCommentCount(22); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(22, $entry->getCommentCount()); - } - - public function testCategoriesCanBeSet() - { - $this->_validEntry->addCategories(array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $entry = $feed->current(); - $expected = array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $entry->getCategories()); - } - - public function testCommentFeedLinksRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validEntry->setCommentFeedLinks(array( - array('uri'=>'http://www.example.com/atom/id/1','type'=>'atom'), - array('uri'=>'http://www.example.com/rss/id/1','type'=>'rss'), - )); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - // Skipped over due to ZFR bug (detects Atom in error when RSS requested) - //$this->assertEquals('http://www.example.com/rss/id/1', $entry->getCommentFeedLink('rss')); - $this->assertEquals('http://www.example.com/atom/id/1', $entry->getCommentFeedLink('atom')); - } - -} diff --git a/tests/Zend/Feed/Writer/Renderer/Entry/RssTest.php b/tests/Zend/Feed/Writer/Renderer/Entry/RssTest.php deleted file mode 100644 index 24b17a01e9..0000000000 --- a/tests/Zend/Feed/Writer/Renderer/Entry/RssTest.php +++ /dev/null @@ -1,383 +0,0 @@ -_validWriter = new Zend_Feed_Writer_Feed; - - $this->_validWriter->setType('rss'); - - $this->_validWriter->setTitle('This is a test feed.'); - $this->_validWriter->setDescription('This is a test description.'); - $this->_validWriter->setLink('http://www.example.com'); - $this->_validEntry = $this->_validWriter->createEntry(); - $this->_validEntry->setTitle('This is a test entry.'); - $this->_validEntry->setDescription('This is a test entry description.'); - $this->_validEntry->setLink('http://www.example.com/1');; - $this->_validWriter->addEntry($this->_validEntry); - } - - public function tearDown() - { - $this->_validWriter = null; - $this->_validEntry = null; - } - - public function testRenderMethodRunsMinimalWriterContainerProperlyBeforeICheckAtomCompliance() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - try { - $renderer->render(); - } catch (Zend_Feed_Exception $e) { - $this->fail('Valid Writer object caused an exception when building which should never happen'); - } - } - - public function testEntryEncodingHasBeenSet() - { - $this->_validWriter->setEncoding('iso-8859-1'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('iso-8859-1', $entry->getEncoding()); - } - - public function testEntryEncodingDefaultIsUsedIfEncodingNotSetByHand() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('UTF-8', $entry->getEncoding()); - } - - public function testEntryTitleHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('This is a test entry.', $entry->getTitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testEntryTitleIfMissingThrowsExceptionIfDescriptionAlsoMissing() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->remove('title'); - $this->_validEntry->remove('description'); - $atomFeed->render(); - } - - public function testEntryTitleCharDataEncoding() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setTitle('<>&\'"áéíóú'); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('<>&\'"áéíóú', $entry->getTitle()); - } - - public function testEntrySummaryDescriptionHasBeenSet() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('This is a test entry description.', $entry->getDescription()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testEntryDescriptionIfMissingThrowsExceptionIfAlsoNoTitle() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->remove('description'); - $this->_validEntry->remove('title'); - $atomFeed->render(); - } - - public function testEntryDescriptionCharDataEncoding() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setDescription('<>&\'"áéíóú'); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('<>&\'"áéíóú', $entry->getDescription()); - } - - public function testEntryContentHasBeenSet() - { - $this->_validEntry->setContent('This is test entry content.'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('This is test entry content.', $entry->getContent()); - } - - public function testEntryContentCharDataEncoding() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setContent('<>&\'"áéíóú'); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('<>&\'"áéíóú', $entry->getContent()); - } - - public function testEntryUpdatedDateHasBeenSet() - { - $this->_validEntry->setDateModified(1234567890); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(1234567890, $entry->getDateModified()->get(Zend_Date::TIMESTAMP)); - } - - public function testEntryPublishedDateHasBeenSet() - { - $this->_validEntry->setDateCreated(1234567000); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(1234567000, $entry->getDateCreated()->get(Zend_Date::TIMESTAMP)); - } - - public function testEntryIncludesLinkToHtmlVersionOfFeed() - { - $renderer= new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/1', $entry->getLink()); - } - - public function testEntryHoldsAnyAuthorAdded() - { - $this->_validEntry->addAuthor('Jane', 'jane@example.com', 'http://www.example.com/jane'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $author = $entry->getAuthor(); - $this->assertEquals(array('name'=>'Jane'), $entry->getAuthor()); - } - - public function testEntryAuthorCharDataEncoding() - { - $this->_validEntry->addAuthor('<>&\'"áéíóú', 'jane@example.com', 'http://www.example.com/jane'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $author = $entry->getAuthor(); - $this->assertEquals(array('name'=>'<>&\'"áéíóú'), $entry->getAuthor()); - } - - public function testEntryHoldsAnyEnclosureAdded() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'length' => '1337', - 'uri' => 'http://example.com/audio.mp3' - )); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $enc = $entry->getEnclosure(); - $this->assertEquals('audio/mpeg', $enc->type); - $this->assertEquals('1337', $enc->length); - $this->assertEquals('http://example.com/audio.mp3', $enc->url); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionOnMissingType() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'uri' => 'http://example.com/audio.mp3', - 'length' => '1337' - )); - $renderer->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionOnMissingLength() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'uri' => 'http://example.com/audio.mp3' - )); - $renderer->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionOnNonNumericLength() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'uri' => 'http://example.com/audio.mp3', - 'length' => 'abc' - )); - $renderer->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testAddsEnclosureThrowsExceptionOnNegativeLength() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setEnclosure(array( - 'type' => 'audio/mpeg', - 'uri' => 'http://example.com/audio.mp3', - 'length' => -23 - )); - $renderer->render(); - } - - public function testEntryIdHasBeenSet() - { - $this->_validEntry->setId('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $entry->getId()); - } - - public function testEntryIdHasBeenSetWithPermaLinkAsFalseWhenNotUri() - { - $this->markTestIncomplete('Untest due to ZFR potential bug'); - } - - public function testEntryIdDefaultIsUsedIfNotSetByHand() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals($entry->getLink(), $entry->getId()); - } - - public function testCommentLinkRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setCommentLink('http://www.example.com/id/1'); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals('http://www.example.com/id/1', $entry->getCommentLink()); - } - - public function testCommentCountRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setCommentCount(22); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $this->assertEquals(22, $entry->getCommentCount()); - } - - public function testCommentFeedLinksRendered() - { - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validEntry->setCommentFeedLinks(array( - array('uri'=>'http://www.example.com/atom/id/1','type'=>'atom'), - array('uri'=>'http://www.example.com/rss/id/1','type'=>'rss'), - )); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - // Skipped assertion is because RSS has no facility to show Atom feeds without an extension - $this->assertEquals('http://www.example.com/rss/id/1', $entry->getCommentFeedLink('rss')); - //$this->assertEquals('http://www.example.com/atom/id/1', $entry->getCommentFeedLink('atom')); - } - - public function testCategoriesCanBeSet() - { - $this->_validEntry->addCategories(array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $expected = array( - array('term'=>'cat_dog', 'label' => 'cat_dog', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $entry->getCategories()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testCategoriesCharDataEncoding() - { - $this->_validEntry->addCategories(array( - array('term'=>'<>&\'"áéíóú', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml()); - $entry = $feed->current(); - $expected = array( - array('term'=>'<>&\'"áéíóú', 'label' => '<>&\'"áéíóú', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $entry->getCategories()); - } - - /** - * @group GH-461 - */ - public function testCategoryHasCDataSection() - { - $this->_validEntry->addCategory(array( - 'term' => 'This is a test category', - )); - $renderer = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $xmlString = $renderer->render()->saveXml(); - $this->assertContains('', $xmlString); - } - -} diff --git a/tests/Zend/Feed/Writer/Renderer/Feed/AtomTest.php b/tests/Zend/Feed/Writer/Renderer/Feed/AtomTest.php deleted file mode 100644 index db1944d30d..0000000000 --- a/tests/Zend/Feed/Writer/Renderer/Feed/AtomTest.php +++ /dev/null @@ -1,432 +0,0 @@ -_validWriter = new Zend_Feed_Writer_Feed; - $this->_validWriter->setTitle('This is a test feed.'); - $this->_validWriter->setDescription('This is a test description.'); - $this->_validWriter->setDateModified(1234567890); - $this->_validWriter->setLink('http://www.example.com'); - $this->_validWriter->setFeedLink('http://www.example.com/atom', 'atom'); - $this->_validWriter->addAuthor('Joe', 'joe@example.com', 'http://www.example.com/joe'); - - $this->_validWriter->setType('atom'); - } - - public function tearDown() - { - $this->_validWriter = null; - } - - public function testSetsWriterInConstructor() - { - $writer = new Zend_Feed_Writer_Feed; - $feed = new Zend_Feed_Writer_Renderer_Feed_Atom($writer); - $this->assertTrue($feed->getDataContainer() instanceof Zend_Feed_Writer_Feed); - } - - public function testBuildMethodRunsMinimalWriterContainerProperlyBeforeICheckAtomCompliance() - { - $feed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - try { - $feed->render(); - } catch (Zend_Feed_Exception $e) { - $this->fail('Valid Writer object caused an exception when building which should never happen'); - } - } - - public function testFeedEncodingHasBeenSet() - { - $this->_validWriter->setEncoding('iso-8859-1'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('iso-8859-1', $feed->getEncoding()); - } - - public function testFeedEncodingDefaultIsUsedIfEncodingNotSetByHand() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testFeedTitleHasBeenSet() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('This is a test feed.', $feed->getTitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedTitleIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('title'); - $atomFeed->render(); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedTitleCharDataEncoding() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->setTitle('<>&\'"áéíóú'); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getTitle()); - } - - public function testFeedSubtitleHasBeenSet() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('This is a test description.', $feed->getDescription()); - } - - public function testFeedSubtitleThrowsNoExceptionIfMissing() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('description'); - $atomFeed->render(); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedSubtitleCharDataEncoding() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->setDescription('<>&\'"áéíóú'); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getDescription()); - } - - public function testFeedUpdatedDateHasBeenSet() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals(1234567890, $feed->getDateModified()->get(Zend_Date::TIMESTAMP)); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedUpdatedDateIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('dateModified'); - $atomFeed->render(); - } - - public function testFeedGeneratorHasBeenSet() - { - $this->_validWriter->setGenerator('FooFeedBuilder', '1.00', 'http://www.example.com'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('FooFeedBuilder', $feed->getGenerator()); - } - - public function testFeedGeneratorIfMissingThrowsNoException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('generator'); - $atomFeed->render(); - } - - public function testFeedGeneratorDefaultIsUsedIfGeneratorNotSetByHand() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('Zend_Feed_Writer', $feed->getGenerator()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedGeneratorCharDataEncoding() - { - $this->_validWriter->setGenerator('<>&\'"áéíóú', '1.00', 'http://www.example.com'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getGenerator()); - } - - public function testFeedLanguageHasBeenSet() - { - $this->_validWriter->setLanguage('fr'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('fr', $feed->getLanguage()); - } - - public function testFeedLanguageIfMissingThrowsNoException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('language'); - $atomFeed->render(); - } - - public function testFeedLanguageDefaultIsUsedIfGeneratorNotSetByHand() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testFeedIncludesLinkToHtmlVersionOfFeed() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - public function testFeedLinkToHtmlVersionOfFeedIfMissingThrowsNoExceptionIfIdSet() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->setId('http://www.example.com'); - $this->_validWriter->remove('link'); - $atomFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedLinkToHtmlVersionOfFeedIfMissingThrowsExceptionIfIdMissing() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('link'); - $atomFeed->render(); - } - - public function testFeedIncludesLinkToXmlAtomWhereTheFeedWillBeAvailable() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('http://www.example.com/atom', $feed->getFeedLink()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedLinkToXmlAtomWhereTheFeedWillBeAvailableIfMissingThrowsException() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('feedLinks'); - $atomFeed->render(); - } - - public function testFeedHoldsAnyAuthorAdded() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $author = $feed->getAuthor(); - $this->assertEquals(array( - 'email'=>'joe@example.com', - 'name'=>'Joe', - 'uri'=>'http://www.example.com/joe'), $feed->getAuthor()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedAuthorCharDataEncoding() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $this->_validWriter->remove('authors'); - $this->_validWriter->addAuthor(array( - 'email'=>'<>&\'"áéíóú', - 'name'=>'<>&\'"áéíóú', - 'uri'=>'http://www.example.com/joe')); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $author = $feed->getAuthor(); - $this->assertEquals(array( - 'email'=>'<>&\'"áéíóú', - 'name'=>'<>&\'"áéíóú', - 'uri'=>'http://www.example.com/joe'), $feed->getAuthor()); - } - - public function testFeedAuthorIfNotSetThrowsExceptionIfAnyEntriesAlsoAreMissingAuthors() - { - $this->markTestIncomplete('Not yet implemented...'); - } - - public function testFeedAuthorIfNotSetThrowsNoExceptionIfAllEntriesIncludeAtLeastOneAuthor() - { - $this->markTestIncomplete('Not yet implemented...'); - } - - public function testFeedIdHasBeenSet() - { - $this->_validWriter->setId('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $feed->getId()); - } - - public function testFeedIdDefaultOfHtmlLinkIsUsedIfNotSetByHand() - { - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals($feed->getLink(), $feed->getId()); - } - - public function testBaseUrlCanBeSet() - { - $this->_validWriter->setBaseUrl('http://www.example.com/base'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('http://www.example.com/base', $feed->getBaseUrl()); - } - - public function testCopyrightCanBeSet() - { - $this->_validWriter->setCopyright('Copyright © 2009 Paddy'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('Copyright © 2009 Paddy', $feed->getCopyright()); - } - - public function testCopyrightCharDataEncoding() - { - $this->_validWriter->setCopyright('<>&\'"áéíóú'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getCopyright()); - } - - public function testCategoriesCanBeSet() - { - $this->_validWriter->addCategories(array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $expected = array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $feed->getCategories()); - } - - public function testCategoriesCharDataEncoding() - { - $this->_validWriter->addCategories(array( - array('term'=>'cat_dog', 'label' => '<>&\'"áéíóú', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $expected = array( - array('term'=>'cat_dog', 'label' => '<>&\'"áéíóú', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $feed->getCategories()); - } - - public function testHubsCanBeSet() - { - $this->_validWriter->addHubs( - array('http://www.example.com/hub', 'http://www.example.com/hub2') - ); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $expected = array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ); - $this->assertEquals($expected, (array) $feed->getHubs()); - } - - public function testImageCanBeSet() - { - $this->_validWriter->setImage( - array('uri'=>'http://www.example.com/logo.gif') - ); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $expected = array( - 'uri' => 'http://www.example.com/logo.gif' - ); - $this->assertEquals($expected, $feed->getImage()); - } - - public function testIconCanBeSet() - { - $this->_validWriter->setIcon( - array('uri'=>'http://www.example.com/logo.gif') - ); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $expected = array( - 'uri' => 'http://www.example.com/logo.gif' - ); - $this->assertEquals($expected, $feed->getIcon()); - } - -} diff --git a/tests/Zend/Feed/Writer/Renderer/Feed/RssTest.php b/tests/Zend/Feed/Writer/Renderer/Feed/RssTest.php deleted file mode 100644 index a68c0f3d3f..0000000000 --- a/tests/Zend/Feed/Writer/Renderer/Feed/RssTest.php +++ /dev/null @@ -1,570 +0,0 @@ -_validWriter = new Zend_Feed_Writer_Feed; - $this->_validWriter->setTitle('This is a test feed.'); - $this->_validWriter->setDescription('This is a test description.'); - $this->_validWriter->setLink('http://www.example.com'); - - $this->_validWriter->setType('rss'); - } - - public function tearDown() - { - $this->_validWriter = null; - } - - public function testSetsWriterInConstructor() - { - $writer = new Zend_Feed_Writer_Feed; - $feed = new Zend_Feed_Writer_Renderer_Feed_Rss($writer); - $this->assertTrue($feed->getDataContainer() instanceof Zend_Feed_Writer_Feed); - } - - public function testBuildMethodRunsMinimalWriterContainerProperlyBeforeICheckRssCompliance() - { - $feed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - try { - $feed->render(); - } catch (Zend_Feed_Exception $e) { - $this->fail('Valid Writer object caused an exception when building which should never happen'); - } - } - - public function testFeedEncodingHasBeenSet() - { - $this->_validWriter->setEncoding('iso-8859-1'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('iso-8859-1', $feed->getEncoding()); - } - - public function testFeedEncodingDefaultIsUsedIfEncodingNotSetByHand() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('UTF-8', $feed->getEncoding()); - } - - public function testFeedTitleHasBeenSet() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('This is a test feed.', $feed->getTitle()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedTitleIfMissingThrowsException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('title'); - $rssFeed->render(); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedTitleCharDataEncoding() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->setTitle('<>&\'"áéíóú'); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getTitle()); - } - - public function testFeedDescriptionHasBeenSet() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('This is a test description.', $feed->getDescription()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedDescriptionThrowsExceptionIfMissing() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('description'); - $rssFeed->render(); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedDescriptionCharDataEncoding() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->setDescription('<>&\'"áéíóú'); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getDescription()); - } - - public function testFeedUpdatedDateHasBeenSet() - { - $this->_validWriter->setDateModified(1234567890); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals(1234567890, $feed->getDateModified()->get(Zend_Date::TIMESTAMP)); - } - - public function testFeedUpdatedDateIfMissingThrowsNoException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('dateModified'); - $rssFeed->render(); - } - - public function testFeedLastBuildDateHasBeenSet() - { - $this->_validWriter->setLastBuildDate(1234567890); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals(1234567890, $feed->getLastBuildDate()->get(Zend_Date::TIMESTAMP)); - } - - public function testFeedGeneratorHasBeenSet() - { - $this->_validWriter->setGenerator('FooFeedBuilder', '1.00', 'http://www.example.com'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('FooFeedBuilder 1.00 (http://www.example.com)', $feed->getGenerator()); - } - - public function testFeedGeneratorIfMissingThrowsNoException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('generator'); - $rssFeed->render(); - } - - public function testFeedGeneratorDefaultIsUsedIfGeneratorNotSetByHand() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('Zend_Feed_Writer ' . Zend_Version::VERSION . ' (http://framework.zend.com)', $feed->getGenerator()); - } - - public function testFeedLanguageHasBeenSet() - { - $this->_validWriter->setLanguage('fr'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('fr', $feed->getLanguage()); - } - - public function testFeedLanguageIfMissingThrowsNoException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('language'); - $rssFeed->render(); - } - - public function testFeedLanguageDefaultIsUsedIfGeneratorNotSetByHand() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals(null, $feed->getLanguage()); - } - - public function testFeedIncludesLinkToHtmlVersionOfFeed() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('http://www.example.com', $feed->getLink()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testFeedLinkToHtmlVersionOfFeedIfMissingThrowsException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('link'); - $rssFeed->render(); - } - - public function testFeedIncludesLinkToXmlRssWhereTheFeedWillBeAvailable() - { - $this->_validWriter->setFeedLink('http://www.example.com/rss', 'rss'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('http://www.example.com/rss', $feed->getFeedLink()); - } - - public function testFeedLinkToXmlRssWhereTheFeedWillBeAvailableIfMissingThrowsNoException() - { - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $this->_validWriter->remove('feedLinks'); - $rssFeed->render(); - } - - public function testBaseUrlCanBeSet() - { - $this->_validWriter->setBaseUrl('http://www.example.com/base'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('http://www.example.com/base', $feed->getBaseUrl()); - } - - /** - * @group ZFW003 - */ - public function testFeedHoldsAnyAuthorAdded() - { - $this->_validWriter->addAuthor('Joe', 'joe@example.com', 'http://www.example.com/joe'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $author = $feed->getAuthor(); - $this->assertEquals(array('name'=>'Joe'), $feed->getAuthor()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testFeedAuthorCharDataEncoding() - { - $this->_validWriter->addAuthor('<>&\'"áéíóú', 'joe@example.com', 'http://www.example.com/joe'); - $atomFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $atomFeed->render(); - $feed = Zend_Feed_Reader::importString($atomFeed->saveXml()); - $author = $feed->getAuthor(); - $this->assertEquals(array('name'=>'<>&\'"áéíóú'), $feed->getAuthor()); - } - - public function testCopyrightCanBeSet() - { - $this->_validWriter->setCopyright('Copyright © 2009 Paddy'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('Copyright © 2009 Paddy', $feed->getCopyright()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testCopyrightCharDataEncoding() - { - $this->_validWriter->setCopyright('<>&\'"áéíóú'); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $this->assertEquals('<>&\'"áéíóú', $feed->getCopyright()); - } - - public function testCategoriesCanBeSet() - { - $this->_validWriter->addCategories(array( - array('term'=>'cat_dog', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $expected = array( - array('term'=>'cat_dog', 'label' => 'cat_dog', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $feed->getCategories()); - } - - /** - * @group ZFWCHARDATA01 - */ - public function testCategoriesCharDataEncoding() - { - $this->_validWriter->addCategories(array( - array('term'=>'<>&\'"áéíóú', 'label' => 'Cats & Dogs', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2') - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $expected = array( - array('term'=>'<>&\'"áéíóú', 'label' => '<>&\'"áéíóú', 'scheme' => 'http://example.com/schema1'), - array('term'=>'cat_dog2', 'label' => 'cat_dog2', 'scheme' => null) - ); - $this->assertEquals($expected, (array) $feed->getCategories()); - } - - public function testHubsCanBeSet() - { - $this->_validWriter->addHubs( - array('http://www.example.com/hub', 'http://www.example.com/hub2') - ); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $expected = array( - 'http://www.example.com/hub', 'http://www.example.com/hub2' - ); - $this->assertEquals($expected, (array) $feed->getHubs()); - } - - public function testImageCanBeSet() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '400', - 'width' => '144', - 'description' => 'Image TITLE' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $expected = array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '400', - 'width' => '144', - 'description' => 'Image TITLE' - ); - $this->assertEquals($expected, $feed->getImage()); - } - - public function testImageCanBeSetWithOnlyRequiredElements() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - $feed = Zend_Feed_Reader::importString($rssFeed->saveXml()); - $expected = array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT' - ); - $this->assertEquals($expected, $feed->getImage()); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionOnMissingLink() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'title' => 'Image ALT' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionOnMissingTitle() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionOnMissingUri() - { - $this->_validWriter->setImage(array( - 'link' => 'http://www.example.com', - 'title' => 'Image ALT' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalDescriptionInvalid() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'description' => 2 - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalDescriptionEmpty() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'description' => '' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalHeightNotAnInteger() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => 'a', - 'width' => 144 - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalHeightEmpty() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '', - 'width' => 144 - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalHeightGreaterThan400() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '401', - 'width' => 144 - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalWidthNotAnInteger() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '400', - 'width' => 'a' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalWidthEmpty() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '400', - 'width' => '' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - /** - * @expectedException Zend_Feed_Exception - */ - public function testImageThrowsExceptionIfOptionalWidthGreaterThan144() - { - $this->_validWriter->setImage(array( - 'uri' => 'http://www.example.com/logo.gif', - 'link' => 'http://www.example.com', - 'title' => 'Image ALT', - 'height' => '400', - 'width' => '145' - )); - $rssFeed = new Zend_Feed_Writer_Renderer_Feed_Rss($this->_validWriter); - $rssFeed->render(); - } - - -} diff --git a/tests/Zend/Feed/_files/AtomHOnline.xml b/tests/Zend/Feed/_files/AtomHOnline.xml deleted file mode 100644 index c1d6daa515..0000000000 --- a/tests/Zend/Feed/_files/AtomHOnline.xml +++ /dev/null @@ -1,554 +0,0 @@ - - - - -The H - news feed -Technology news - - -2009-09-17T17:39:21+02:00 - -The H - -http://www.h-online.com/security/Google-acquires-reCAPTCHA--/news/114266/from/rss - - - Google acquires reCAPTCHA - - Google has announced that it has acquired reCAPTCHA, one of the leading providers of CAPTCHAs which are used in authentication tests - http://www.h-online.com/security/Google-acquires-reCAPTCHA--/news/114266/from/rss - 2009-09-17T17:39:21+02:00 - - - - - Lost+Found: Password shaking, macro viruses and comment spam - - Too short for news, too good to lose; lost+found is a round up of useful security information. Today, Password shaking, macro viruses and comment spam - http://www.h-online.com/security/Lost-Found-Password-shaking-macro-viruses-and-comment-spam--/news/114265/from/rss - 2009-09-17T16:29:59+02:00 - - - - - Free Microsoft tools for detecting security problems - - Microsoft has made two free tools for detecting holes in applications available to developers. For quite some time Redmond's own developers have been using these tools within the Security Development Life cycle - http://www.h-online.com/security/Free-Microsoft-tools-for-detecting-security-problems--/news/114264/from/rss - 2009-09-17T16:00:48+02:00 - - - - - Chatting with a phisher - - After Man-in-the-Middle attacks we now have Chat-in-the-Middle attacks on online banking customers. These pop up a chat window in the browser - and a phisher, posing as a bank representative, starts asking probing questions - http://www.h-online.com/security/Chatting-with-a-phisher--/news/114263/from/rss - 2009-09-17T15:20:05+02:00 - - - - - Noop - a new language for the JVM - - Noop is a new language for the JVM which aims to make coding more productive and reliable by making dependency injection and testing fundamental to the language - http://www.h-online.com/open/Noop-a-new-language-for-the-JVM--/news/114262/from/rss - 2009-09-17T13:14:06+02:00 - - - - - Version 4.2 of OSGi Java component technology available - - Version 4.2 of the OSGi component technology, which is popular in the Java world, is now available to download. Almost all Java EE application servers are based on this specification - http://www.h-online.com/open/Version-4-2-of-OSGi-Java-component-technology-available--/news/114261/from/rss - 2009-09-17T11:53:12+02:00 - - - - - DragonFly BSD 2.4 released - - The DragonFly BSD project has announced the availability of version 2.4 of their FreeBSD fork, a major update that includes several bug fixes, performance improvements and a new 64-bit port - http://www.h-online.com/open/DragonFly-BSD-2-4-released--/news/114260/from/rss - 2009-09-17T11:16:08+02:00 - - - - - Privacy for RFID tags - - Wholesale RFID tagging poses a risk to privacy. A research team has proposed distributing keys as a method of ensuring privacy - http://www.h-online.com/security/Privacy-for-RFID-tags--/news/114259/from/rss - 2009-09-17T09:48:38+02:00 - - - - - Firefox Flash check working - - In one week, ten million Firefox users have responded to Firefox's recently added Adobe Flash checks - http://www.h-online.com/security/Firefox-Flash-check-working--/news/114258/from/rss - 2009-09-17T10:44:58+02:00 - - - - - Nominations open for the Free Software Awards - - The FSF has opened nominations for 2009's Free Software Awards, and is looking for nominations for individuals and projects - http://www.h-online.com/open/Nominations-open-for-the-Free-Software-Awards--/news/114257/from/rss - 2009-09-16T20:06:38+02:00 - - - - - ClarkConnect becomes ClearOS - - The ClearFoundation is hoping to scale new heights with ClearOS [--] the Linux-based small business server, a successor to ClarkConnect, which will now be free to use, with the income stream coming from related services - http://www.h-online.com/open/ClarkConnect-becomes-ClearOS--/news/114256/from/rss - 2009-09-16T18:58:00+02:00 - - - - - GitHub to move to Rackspace - - GitHub co-founder Tom Preston-Werner has announced that the open source code hosting service will be moving its servers from Engine Yard to Rackspace - http://www.h-online.com/open/GitHub-to-move-to-Rackspace--/news/114255/from/rss - 2009-09-16T18:23:09+02:00 - - - - - KOffice 2.1 Beta 2 released - - The KOffice developers have released the second beta of version 2.1 of their open source office suite, which includes a number of bug fixes, new features and performance improvements - http://www.h-online.com/open/KOffice-2-1-Beta-2-released--/news/114253/from/rss - 2009-09-16T16:34:45+02:00 - - - - - MonitoringForge uncovered by GroundWork - - GroundWork has revealed its new community for open source network monitoring and management - http://www.h-online.com/open/MonitoringForge-uncovered-by-GroundWork--/news/114254/from/rss - 2009-09-16T16:32:06+02:00 - - - - - Companies have wrong priorities for security updates - - Although attacks on Windows PCs nowadays almost exclusively exploit vulnerabilities in applications, it takes twice as long for security updates for applications to be installed as it does to plug vulnerabilities in the operating system - http://www.h-online.com/security/Companies-have-wrong-priorities-for-security-updates--/news/114252/from/rss - 2009-09-16T15:07:52+02:00 - - - - - Jaspersoft launches JasperReports Professional Developer Edition - - Open source Business Intelligence software specialist Jaspersoft has announced the immediate availability of a new version of JasperReports Professional and has introduced JasperReports Professional Developer Edition - http://www.h-online.com/open/Jaspersoft-launches-JasperReports-Professional-Developer-Edition--/news/114251/from/rss - 2009-09-16T13:12:54+02:00 - - - - - Google Android 1.6 SDK released - - The Google Android Developers have announced the release of the Android 1.6, code name Donut, software development kit - http://www.h-online.com/open/Google-Android-1-6-SDK-released--/news/114249/from/rss - 2009-09-16T12:30:13+02:00 - - - - - Oracle Enterprise Linux updated - - Oracle updates its RHEL clone, Unbreakable Linux, to keep in step with Red Hat Enterprise Linux - http://www.h-online.com/open/Oracle-Enterprise-Linux-updated--/news/114250/from/rss - 2009-09-16T11:46:25+02:00 - - - - - Terracotta 3.1 supports Hibernate - - Distributed caching for Hibernate queries comes to Terracotta's caching system with version 3.1's new Hibernate plug-in - http://www.h-online.com/open/Terracotta-3-1-supports-Hibernate--/news/114248/from/rss - 2009-09-16T11:30:17+02:00 - - - - - Google Chrome 3.0 released - - Just over one year after Google's Chrome web browser was originally launched, Google has announced the release of Chrome version 3 which includes several bug fixes, improvements and new features - http://www.h-online.com/security/Google-Chrome-3-0-released--/news/114247/from/rss - 2009-09-16T11:18:46+02:00 - - - - - MySpace bring open source MapReduce to .NET - - MySpace have released Quizmt, an implementation of MapReduce algorithms for clustered computing running on Windows and .NET - http://www.h-online.com/open/MySpace-bring-open-source-MapReduce-to-NET--/news/114246/from/rss - 2009-09-17T12:07:01+02:00 - - - - - GNOME Foundation releases first quarterly report - - The GNOME Foundation has released its first quarterly report. The Q2 2009 Quarterly report spans June, July and August and covers several topics, including the projects migration to Git - http://www.h-online.com/open/GNOME-Foundation-releases-first-quarterly-report--/news/114244/from/rss - 2009-09-15T17:29:49+02:00 - - - - - Live video stream of LinuxCon 2009 highlights - - Highlights of the Linux Foundation conference LinuxCon 2009, taking place from the 21st to the 23rd of September are to be available as a live internet broadcast. Keynote speakers include Joe Brockmeier, Bdale Garbee and Mark Shuttleworth - http://www.h-online.com/open/Live-video-stream-of-LinuxCon-2009-highlights--/news/114245/from/rss - 2009-09-15T17:22:22+02:00 - - - - - Anonymous browsing on Android - - A group of developers at the Digital Technology Group at the University of Cambridge have released two Android applications that allow users browse the web anonymously using The Onion Router - http://www.h-online.com/security/Anonymous-browsing-on-Android--/news/114243/from/rss - 2009-09-15T16:25:05+02:00 - - - - - New York Times shows bad banner ad - - Over the weekend, visitors to the newspaper's website were confronted with scareware pop-ups telling them that their PCs had an infection. In order to place their fake banner ad, the scammers had passed themselves off as a well-known company - http://www.h-online.com/security/New-York-Times-shows-bad-banner-ad--/news/114242/from/rss - 2009-09-15T14:31:25+02:00 - - - - - Referential integrity for Berkeley DB - - Oracle has added foreign keys and a C# interface to its free Berkeley DB - http://www.h-online.com/open/Referential-integrity-for-Berkeley-DB--/news/114241/from/rss - 2009-09-15T13:49:10+02:00 - - - - - Horde vulnerabilities fixed - - New versions of the Horde Application Framework, Horde Groupware and various other Horde applications fix two cross-site scripting vulnerabilities and one vulnerability which allows files to be overwritten - http://www.h-online.com/security/Horde-vulnerabilities-fixed--/news/114240/from/rss - 2009-09-15T11:59:43+02:00 - - - - - openSUSE 11.2 Milestone 7 released - - The openSUSE project has released the seventh milestone in the development of openSUSE 11.2, code named Fichte - http://www.h-online.com/open/openSUSE-11-2-Milestone-7-released--/news/114238/from/rss - 2009-09-15T11:51:52+02:00 - - - - - Security updates for Bugzilla - - The developers of the Bugzilla open source bug tracking system have released versions 3.0.9, 3.2.5 and 3.4.2, which fix SQL injection vulnerabilities and remove a means of sniffing out a user's password - http://www.h-online.com/security/Security-updates-for-Bugzilla--/news/114239/from/rss - 2009-09-15T11:12:10+02:00 - - - - - Microsoft says "We are working on our Linux drivers" - - Microsoft's Sam Ramji says the company is working on their Linux Hyper-V drivers and has not abandoned them - http://www.h-online.com/open/Microsoft-says-We-are-working-on-our-Linux-drivers--/news/114237/from/rss - 2009-09-15T09:48:54+02:00 - - - - - The Linux Foundation welcomes ARM - - The microprocessor and microcontroller manufacturer has joined the Linux Foundation. ARM processors are used in a large number of Linux driven mobile devices - http://www.h-online.com/open/The-Linux-Foundation-welcomes-ARM--/news/114236/from/rss - 2009-09-15T12:43:47+02:00 - - - - - CodePlex Foundation founding flawed says legal expert - - Andrew Updegrove, of Gesmer Updegrove LLP, has documented his concerns with the founding of Microsoft's CodePlex Foundation - http://www.h-online.com/open/CodePlex-Foundation-founding-flawed-says-legal-expert--/news/114235/from/rss - 2009-09-14T18:05:10+02:00 - - - - - SystemRescueCd 1.3.0 released - - The SystemRescueCD developers have released version 1.3.0 of their Linux distribution for administering or repairing an operating system and recovering data after a system crash - http://www.h-online.com/open/SystemRescueCd-1-3-0-released--/news/114234/from/rss - 2009-09-14T17:30:13+02:00 - - - - - First Alpha of BeOS-inspired Haiku released - - After eight years of development, the Haiku Project developers have announced the availability of the first official development release of Haiku - http://www.h-online.com/open/First-Alpha-of-BeOS-inspired-Haiku-released--/news/114232/from/rss - 2009-09-14T17:09:46+02:00 - - - - - eyeOS 2.0 rethinks its webtop for 2010 - - In 2010, eyeOS, the webtop operating system, is getting a new desktop, easier collaboration, real time notifications and more - http://www.h-online.com/open/eyeOS-2-0-rethinks-its-webtop-for-2010--/news/114231/from/rss - 2009-09-14T16:44:43+02:00 - - - - - WebKit adds support for WebGL - - The WebKit developers have begun to integrate GPU-accelerated 3D capabilities via WebGL into their open source browser engine - http://www.h-online.com/open/WebKit-adds-support-for-WebGL--/news/114230/from/rss - 2009-09-14T16:13:02+02:00 - - - - - MonoTouch 1.0 released for iPhone developers - - Novell's Mono on iPhone package arrives, with prices ranging from $399 to $3,999 - http://www.h-online.com/open/MonoTouch-1-0-released-for-iPhone-developers--/news/114229/from/rss - 2009-09-14T17:00:13+02:00 - - - - - Survey: Three out of four administrators don't trust anti-virus software - - In a study, 89 per cent of respondents use a standard anti-virus product, but half of them only because it is "better than nothing". The other half felt compelled to use an anti-virus product due to company guidelines - http://www.h-online.com/security/Survey-Three-out-of-four-administrators-don-t-trust-anti-virus-software--/news/114227/from/rss - 2009-09-14T13:51:54+02:00 - - - - - Twitapps.com to close, code to be open sourced - - The Twitter notification by email service will close in the next few weeks, but the code behind it will be released as open source - http://www.h-online.com/open/Twitapps-com-to-close-code-to-be-open-sourced--/news/114228/from/rss - 2009-09-14T12:50:26+02:00 - - - - - Linux Mint 7 XFCE released - - The Mint development team have released Linux Mint 7 XFCE, a Community Edition based on Xfce 4.6 - http://www.h-online.com/open/Linux-Mint-7-XFCE-released--/news/114226/from/rss - 2009-09-14T12:34:12+02:00 - - - - - Botnet discovered on Linux servers - - The servers in question register with dynamic DNS services to distribute malware - http://www.h-online.com/security/Botnet-discovered-on-Linux-servers--/news/114225/from/rss - 2009-09-14T10:52:46+02:00 - - - - - Mozilla releases SeaMonkey 2.0 Beta 2 - - Mozilla has announced the release of version 2.0 beta 2 of their SeaMonkey "all-in-one internet application suite", completing the planned feature set - http://www.h-online.com/open/Mozilla-releases-SeaMonkey-2-0-Beta-2--/news/114224/from/rss - 2009-09-14T11:07:47+02:00 - - - - - Creature comforts for Ubuntu - - Ubuntu's community manager Jono Bacon discusses a number of features designed to make the popular Linux distribution more user-friendly and productive - http://www.h-online.com/open/Creature-comforts-for-Ubuntu--/news/114223/from/rss - 2009-09-14T09:34:09+02:00 - - - - - The H Week - - Linux Kernel 2.6.31 is released, The H looks at Linux and Digital Rights Management, Microsoft confirmed an SMB vulnerability can be exploited to remotely reboot Windows and announced the formation of the new CodePlex Foundation for open source - http://www.h-online.com/news/The-H-Week--/114222/from/rss - 2009-09-12T14:40:15+02:00 - - - - - Apple open source Grand Central - - The engine behind Snow Leopards multi-core support is released as Apache 2.0 licensed open source - http://www.h-online.com/open/Apple-open-source-Grand-Central--/news/114221/from/rss - 2009-09-13T11:01:28+02:00 - - - - - Chrome adds new defence for cross-site scripting attacks - - Google has released Chrome 4.0.207.0 for Mac and Linux into its developer channel, adding a new a reflective XSS filter to defend against cross-site scripting attacks - http://www.h-online.com/security/Chrome-adds-new-defence-for-cross-site-scripting-attacks--/news/114220/from/rss - 2009-09-11T17:09:26+02:00 - - - - - openSUSE planned outage this weekend - - A planned power outage in the projects office in Nuernberg, Germany will take several of its servers off line from the 11th to the 14th of September - http://www.h-online.com/open/openSUSE-planned-outage-this-weekend--/news/114219/from/rss - 2009-09-11T16:07:36+02:00 - - - - - Apple's iPhone 3.1 anti-phishing ineffective? - - According to several reports, the new anti-phishing feature Apple introduced in iPhone OS 3.1 for its mobile version of the Safari web browser is unreliable - http://www.h-online.com/security/Apple-s-iPhone-3-1-anti-phishing-ineffective--/news/114218/from/rss - 2009-09-11T13:25:23+02:00 - - - - - New Google Summer of Code statistics posted - - Google has posted new statistics about its 2005 to 2009 Summer of Code contests which offer university students stipends to write and develop code for various open source projects - http://www.h-online.com/open/New-Google-Summer-of-Code-statistics-posted--/news/114217/from/rss - 2009-09-11T13:11:34+02:00 - - - - - Report says IBM is switching from Microsoft Office to Lotus Symphony - - According to German daily "Handelsblatt", the Lotus office suite has to be installed on all company PCs within the next ten days. Reportedly, some 330,000 employees have already switched - http://www.h-online.com/open/Report-says-IBM-is-switching-from-Microsoft-Office-to-Lotus-Symphony--/news/114216/from/rss - 2009-09-11T12:59:14+02:00 - - - - - VirtualBox 3.0.6 released - - Sun Microsystems has released version 3.0.6, a maintenance update of its open source VirtualBox desktop virtualisation application for x86 hardware - http://www.h-online.com/open/VirtualBox-3-0-6-released--/news/114215/from/rss - 2009-09-11T13:09:42+02:00 - - - - - First update for Apple's Snow Leopard released - - Apple has released Mac OS X 10.6.1 for Snow Leopard and Security Update 2009-005 for 10.4.11 Tiger and 10.5.8 Leopard systems, fixing several bugs and security vulnerabilities - http://www.h-online.com/security/First-update-for-Apple-s-Snow-Leopard-released--/news/114213/from/rss - 2009-09-11T11:39:55+02:00 - - - - - Tornado let loose by Facebook - - Facebook shake up the Python web framework sector by open sourcing Tornado Web Server, the Python server behind the FriendFeed social network aggregator - http://www.h-online.com/open/Tornado-let-loose-by-Facebook--/news/114214/from/rss - 2009-09-14T15:24:28+02:00 - - - - - Survey: "Open Core" least popular open source option - - A survey says that the "Open Core" model for open source licensing trails behind dual licensing and open source with commercial support in terms of acceptability to the enterprise - http://www.h-online.com/open/Survey-Open-Core-least-popular-open-source-option--/news/114212/from/rss - 2009-09-11T10:50:37+02:00 - - - - - Microsoft announces open source foundation - - The new CodePlex Foundation aims to bring together commercial software vendors and the open source community - http://www.h-online.com/open/Microsoft-announces-open-source-foundation--/news/114211/from/rss - 2009-09-11T11:02:35+02:00 - - - - - Four Critical Holes in QuickTime Closed - - The update closes errors which could allow crafted video files to be used to spread infection - http://www.h-online.com/security/Four-Critical-Holes-in-QuickTime-Closed--/news/114209/from/rss - 2009-09-10T15:56:10+02:00 - - - - - Google begins launch of Chrome Extensions - - Extensions for Google Chrome and Chromium are clearly on their way as the feature is now switched on by default in the developer builds of the open source browsers - http://www.h-online.com/open/Google-begins-launch-of-Chrome-Extensions--/news/114208/from/rss - 2009-09-10T14:43:53+02:00 - - - - - iPhone OS 3.1 available - - iPhone OS 3.1 and iPhone OS 3.1.1 for all iPod touch devices are now available for download at iTunes. The new systems come with numerous improvements and functions and close several security holes, some of them critical - http://www.h-online.com/security/iPhone-OS-3-1-available--/news/114207/from/rss - 2009-09-10T12:54:42+02:00 - - - - - Numerous holes in Firefox 3.0 and 3.5 fixed - - Attackers were able to use manipulated websites to infect PCs. The new versions now also warn users if they are using outdated versions of the Flash plug-in - http://www.h-online.com/security/Numerous-holes-in-Firefox-3-0-and-3-5-fixed--/news/114206/from/rss - 2009-09-10T12:18:54+02:00 - - - - - Better query analysis in MySQL Enterprise - - The commercial Enterprise Fall Release 2009 of the open source MySQL database will feature query filtering and analysis using new correlation graphs - http://www.h-online.com/open/Better-query-analysis-in-MySQL-Enterprise--/news/114205/from/rss - 2009-09-10T11:40:38+02:00 - - - diff --git a/tests/Zend/Feed/_files/AtomPublishingTest-before-update.xml b/tests/Zend/Feed/_files/AtomPublishingTest-before-update.xml deleted file mode 100644 index cd6591d5b4..0000000000 --- a/tests/Zend/Feed/_files/AtomPublishingTest-before-update.xml +++ /dev/null @@ -1,7 +0,0 @@ - - 1 - - 2005-05-23T16:26:00-08:00 - Entry 1 - 1.2 - diff --git a/tests/Zend/Feed/_files/AtomPublishingTest-created-entry.xml b/tests/Zend/Feed/_files/AtomPublishingTest-created-entry.xml deleted file mode 100644 index e8e8e8103a..0000000000 --- a/tests/Zend/Feed/_files/AtomPublishingTest-created-entry.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - 1 - - 2005-05-23T16:26:00-08:00 - Entry 1 - 1.1 - diff --git a/tests/Zend/Feed/_files/AtomPublishingTest-expected-update.xml b/tests/Zend/Feed/_files/AtomPublishingTest-expected-update.xml deleted file mode 100644 index cd6591d5b4..0000000000 --- a/tests/Zend/Feed/_files/AtomPublishingTest-expected-update.xml +++ /dev/null @@ -1,7 +0,0 @@ - - 1 - - 2005-05-23T16:26:00-08:00 - Entry 1 - 1.2 - diff --git a/tests/Zend/Feed/_files/AtomPublishingTest-updated-entry.xml b/tests/Zend/Feed/_files/AtomPublishingTest-updated-entry.xml deleted file mode 100644 index 629dc7cbe0..0000000000 --- a/tests/Zend/Feed/_files/AtomPublishingTest-updated-entry.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 1 - - 2005-05-23T16:27:00-08:00 - Entry 1 - 1.2 - diff --git a/tests/Zend/Feed/_files/AtomTestGoogle.xml b/tests/Zend/Feed/_files/AtomTestGoogle.xml deleted file mode 100644 index 669ff221b5..0000000000 --- a/tests/Zend/Feed/_files/AtomTestGoogle.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - -Official Google Blog -Googler insights into product and technology news and our culture. - -tag:blogger.com,1999:blog-10861780 -2006-01-12T19:55:20Z -Blogger - -
This is an Atom formatted XML site feed. It is intended to be viewed in a Newsreader or syndicated to another site. Please visit the Blogger Help for more info.
-
-true - - - -A Googler - -2006-01-12T11:53:00-08:00 -2006-01-12T19:55:20Z -2006-01-11T03:07:43Z - -tag:blogger.com,1999:blog-10861780.post-113694886327994245 -Your Google homepage, to go - -
- -
-
Anyone who's ever tried to browse the web on their cell phone knows that it isn't always the best user experience. That's why I'm excited to tell you about Google Mobile Personalized Home. We've designed a way for you to view the things that you really care about, from your Gmail inbox to news headlines, weather, stock quotes, and feeds (Atom or RSS). The interface is optimized for small screens, and we've arranged things so you don't have to click on a bunch of links to locate what you're after -– your personalized content appears on top, right where it should be. Give it a try, and let us know how you like it.
-
-false -
- - - -A Googler - -2006-01-12T09:15:00-08:00 -2006-01-12T17:18:46Z -2006-01-03T20:50:32Z - -tag:blogger.com,1999:blog-10861780.post-113632143275337066 -Many Minis - -
- -
-
Today is the one year anniversary of the Google Mini, Google's solution for website and corporate network search, and to celebrate we thought we'd announce a few more of them. The standard Mini lets you search up to 100,000 documents. Now organizations that constantly crank out new content can opt for either of two new Minis: one searches up to 200,000 documents, and another that can manage up to 300,000. All three deliver the same easy setup, intuitive interface and fast, relevant results that the Mini is already bringing to thousands of websites and corporate networks. You're growing, and the Mini is growing with you.
-
-false -
- - - -A Googler - -2006-01-10T12:49:00-08:00 -2006-01-10T21:02:47Z -2005-12-31T01:44:54Z - -tag:blogger.com,1999:blog-10861780.post-113599349496410640 -Google Earth in a Mac world (PC too) - -
- -
-
We feel like proud parents around here. Our eldest, Google Earth for the PC, is officially leaving beta status today, and we couldn't be more pleased. For those of you who downloaded early, upgrade to the latest and discover Google Earth all over again.
-
And we have a brand new member of the family -- Google Earth for Macintosh. We're happy to finally have some good news for the, ahem, vocal Mac enthusiasts we've been hearing from. Let's just say that we have gotten more than a few "requests" for a Mac version of Google Earth. They've gone something like this:
-
1) "When is it coming out? Your website says that you are working on it."
-
2) "You know, Mac users are very heavy graphics/mapping/visualization/design/ architecture/education/real estate/geocaching/social-geo-video-networking fans who would certainly use Google Earth a lot."
-
3) "So when is it coming out?"
-
We heard you loud and clear. The Mac version runs on OS X 10.4 and up. Happy travels throughout Google Earth, whether you're on a Mac or a PC.
-
-false -
- - - -A Googler - -2006-01-09T22:16:00-08:00 -2006-01-11T20:30:26Z -2005-12-31T18:25:16Z - -tag:blogger.com,1999:blog-10861780.post-113605351620153422 -A new year for Google Video -<span class="byline-author">Posted by Sanjay Raman, Google Video Team</span><br /><br />Till now, Google Video has been about watching videos and clips online, which is really convenient for videos <a href="http://video.google.com/videoplay?docid=-3496860874967925614&q=fastfocus">like this</a>. But wouldn't it be awesome to watch that episode of <span style="font-style: italic;"><a href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a></span> that you missed when even your trusty DVR failed you? This is one reason we've launched the Google Video store, where you can rent or buy from such well-known media partners as <a href="http://video.google.com/cbs.html">CBS</a>, the <a href="http://video.google.com/nba.html">NBA</a>, The <a href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">Charlie Rose Show</a>, and <a href="http://video.google.com/videosearch?q=Sony+BMG">SONY BMG</a>.<br /><br />We’re not only about mainstream content, though -– we have thousands of titles available (and more coming every day) from every imaginable type of producer, including <a href="http://video.google.com/videosearch?q=1896+tsar+nicholas&so=0">this 1896 clip</a> of the coronation of Tsar Nicholas II – one of the earliest known moving images. We’re especially pleased to offer such quality indie features as Ben Rekhi’s <span style="font-style: italic;"><a href="http://video.google.com/videoplay?docid=-1607114503824678810&q=waterborne ">Waterborne</a></span> (Drops Entertainment) and Lerone Wilson’s <span style="font-style: italic;"><a href="http://video.google.com/videoplay?docid=-4929215594503422280&q=aardvark%27d ">Aardvark’d: 12 Weeks with Geeks</a></span> (Boondoggle Films).<br /><br />When we launched our <a href="https://upload.video.google.com">Upload Program</a> earlier this year, people sent in a huge number of free and compelling videos. But since there's a ton of video that can't be offered for free, we built the <a href="http://video.google.com/">Google Video store</a> to give content owners the option to charge for downloads if they'd like. This means producers large and small can distribute their great content in an easy, secure way. Some of your favorite prime time and classic TV shows, sports, music videos, and documentaries are at your fingertips. Want to see how Shaq scored 30 points last night? Download and watch it (and every <a href="http://video.google.com/nba.html">NBA</a> game for the rest of the season) through Google Video.<br /><br />You can play all the videos you download using the all-new Google Video Player. We're especially pleased about the thumbnail navigation for browsing an entire video so you can play any portion with a single click. And there's another thing: if the content is not copy-protected, you can take your favorite videos with you on your <a href="http://www.apple.com/ipod/">iPod</a> or <a href="http://www.us.playstation.com/psp.aspx">PSP</a> -- our "to go" option.<br /><br />Since it's so early in the year, here's a resolution we intend to keep: make sure new features and content continue to roll out, so that you think Google Video is one of the best ways to find video on the web.<br /><br />These video providers are getting us off to a great start:<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Daquarius">Aquarius Health Care Media</a></span>: A leading producer and distributor of healthcare-related videos will pilot with Google Video using a variety of titles covering SIDS, diabetes, and blindness, among other health issues.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=ardustry">Ardustry Home Entertainment</a></span>: Offers substantial libraries of theatrical motion pictures, television series, documentaries and reality programming, music and sports specials, lifestyle titles, and a wide array of “how-to†products.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=bluehighways">BlueHighways TV</a></span>: Programming service that explores the people, stories, traditions and cultures of America. Discovering the sights and sounds of communities across the country with an up-close, laid-back programming style, BlueHighways TV presents a collage of remarkable music, folklore and information for audiences interested in all aspects of American life and heritage. Programming includes <span style="font-style: italic;">Reno's Old Time Music Festival,</span> <span style="font-style: italic;">American Journeys,</span> <span style="font-style: italic;">Stan Hitchcock's Heart to Heart,</span> and <span style="font-style: italic;">Gospel Sampler</span>.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dcaretalk">CareTALK</a></span>: A multimedia brand dedicated to consumer-directed health care offering programming and tools to help modern family caregivers; initially offering 10-20 hours of health and caregiving-related content (10-20 minutes in length).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/cbs.html">CBS</a>: Includes prime time hits such as <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3Dncis">NCIS</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DSurvivor_Guatemala">Survivor: Guatemala</a>, and The Amazing Race (available spring ’06), as well as classics like <a style="font-style: italic;" href="http://video.google.com/videosearch?q=I+Love+Lucy">I Love Lucy</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DTwilight_Zone">Twilight Zone</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DBrady_Bunch">Brady Bunch</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=Have+Gun+Will+Travel">Have Gun Will Travel</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DMacGyver">MacGyver</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Deep_Space_Nine">Star Trek: Deep Space Nine</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Voyager">Star Trek: Voyager</a>, and My Three Sons (coming soon).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">The Charlie Rose Show</a>: Includes interviews with Henry Kissinger, Oliver Stone, Quentin Tarantino, Martha Stewart, Martin Scorsese, Harrison Ford, Dan Rather, Charles M. Schulz, Steve Jobs, Jay Leno, Tom Brokaw, and others.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Cine+Excel&so=0">Cine Excel</a>: Independent producer will trial on Google Video with 3 DVD movie titles: <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=6833548605067650376&q=Cine+Excel">Bikini Hotel </a>(1997), <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-9198267889833807992&q=Cine+Excel">Tao of Karate</a> (short-film, 1998) and <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=8241854949946868864&q=Cine+Excel">Karate Wars</a> (1998).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=classic+media">Classic Media</a>: Classic Media owns and manages some of the world's most recognizable family properties across all media including feature film, television, home video and consumer products. The company's extensive library features a diverse collection of popular animated and live-action characters. For lentaries are at your fingertips. Want to see how Shaq scored 30 points last night? Download and watch it (and every <a href="http://video.google.com/nba.html">NBA</a> game for the rest of the season) through Google Video.<br /><br />You can play all the videos you download using the all-new Google Video Player. We're especially pleased about the thumbnail navigation for browsing an entire video so you can play any portion with a single click. And there's another thing: if the content is not copy-protected, you can take your favorite videos with you on your <a href="http://www.apple.com/ipod/">iPod</a> or <a href="http://www.us.playstation.com/psp.aspx">PSP</a> -- our "to go" option.<br /><br />Since it's so early in the year, here's a resolution we intend to keep: make sure new features and content continue to roll out, so that you think Google Video is one of the best ways to find video on the web.<br /><br />These video providers are getting us off to a great start:<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Daquarius">Aquarius Health Care Media</a></span>: A leading producer and distributor of healthcare-related videos will pilot with Google Video using a variety of titles covering SIDS, diabetes, and blindness, among other health issues.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=ardustry">Ardustry Home Entertainment</a></span>: Offers substantial libraries of theatrical motion pictures, television series, documentaries and reality programming, music and sports specials, lifestyle titles, and a wide array of “how-to†products.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=bluehighways">BlueHighways TV</a></span>: Programming service that explores the people, stories, traditions and cultures of America. Discovering the sights and sounds of communities across the country with an up-close, laid-back programming style, BlueHighways TV presents a collage of remarkable music, folklore and information for audiences interested in all aspects of American life and heritage. Programming includes <span style="font-style: italic;">Reno's Old Time Music Festival,</span> <span style="font-style: italic;">American Journeys,</span> <span style="font-style: italic;">Stan Hitchcock's Heart to Heart,</span> and <span style="font-style: italic;">Gospel Sampler</span>.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dcaretalk">CareTALK</a></span>: A multimedia brand dedicated to consumer-directed health care offering programming and tools to help modern family caregivers; initially offering 10-20 hours of health and caregiving-related content (10-20 minutes in length).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/cbs.html">CBS</a>: Includes prime time hits such as <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3Dncis">NCIS</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DSurvivor_Guatemala">Survivor: Guatemala</a>, and The Amazing Race (available spring ’06), as well as classics like <a style="font-style: italic;" href="http://video.google.com/videosearch?q=I+Love+Lucy">I Love Lucy</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DTwilight_Zone">Twilight Zone</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DBrady_Bunch">Brady Bunch</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=Have+Gun+Will+Travel">Have Gun Will Travel</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DMacGyver">MacGyver</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Deep_Space_Nine">Star Trek: Deep Space Nine</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Voyager">Star Trek: Voyager</a>, and My Three Sons (coming soon).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">The Charlie Rose Show</a>: Includes interviews with Henry Kissinger, Oliver Stone, Quentin Tarantino, Martha Stewart, Martin Scorsese, Harrison Ford, Dan Rather, Charles M. Schulz, Steve Jobs, Jay Leno, Tom Brokaw, and others.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Cine+Excel&so=0">Cine Excel</a>: Independent producer will trial on Google Video with 3 DVD movie titles: <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=6833548605067650376&q=Cine+Excel">Bikini Hotel </a>(1997), <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-9198267889833807992&q=Cine+Excel">Tao of Karate</a> (short-film, 1998) and <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=8241854949946868864&q=Cine+Excel">Karate Wars</a> (1998).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=classic+media">Classic Media</a>: Classic Media owns and manages some of the world's most recognizable family properties across all media including feature film, television, home video and consumer products. The company's extensive library features a diverse collection of popular animated and live-action characters. For launch we will have <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=2700527067868455741&q=classic+media">Rocky &amp; Bullwinkle</a>, <span style="font-style: italic;">Casper</span>, <span style="font-style: italic;">Wendy</span>, <span style="font-style: italic;">Richie Rich</span>, <span style="font-style: italic;">Herman & Katnip</span>, <span style="font-style: italic;">Baby Huey</span>, <span style="font-style: italic;">Little Audrey</span>, <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-3466783103686653836&q=Mighty+Hercules">Mighty Hercules</a>, <span style="font-style: italic;">Little Lulu</span>, and <span style="font-style: italic;">Felix the Cat</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=clearvue">CLEARVUE & SVE</a>: A leading provider of educational K-12 educational video content. They sell DVDs and run a subscription media-on-demand website with video, audio, and images. CLEARVUE &amp; SVE primarily serves large clients such as schools, school districts or entire states. Leveraging Google Video, they have embarked on a new and bold strategy to target individual customers directly. Among the hundreds of videos you will find on Google, topics vary from classic children's literature to detailed explanations about the workings of the human body.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dechelon">Echelon Home Entertainment 2</a></span>: Focuses on independently produced films made by filmmakers from around the world which offer a unique perspective to the traditional genres: drama, action, thriller, comedy, family, animation, classic, B&W, foreign.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dimage_entertainment">Egami Media</a></span>: A subsidiary of Image Entertainment and a leading independent licensee, producer and distributor of home entertainment programming with over 3,000 titles released in North America. Highlighted content in Google Video includes live concert programs include <span style="font-style: italic;">Kiss: Rock the Nation: Live!</span>, <span style="font-style: italic;">Chick Corea: Rendezvous in New York</span>, <span style="font-style: italic;">Roy Orbison: Black & White Night</span>, and dozens more. Other titles include IMAX programs from MacGillivray Freeman, stand-up comedy and independent, foreign and silent film classics.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dfashion_tv">Fashion TV</a>: The only 24 hours a day, 7 days a week fashion, beauty and style TV station worldwide provides glamorous entertainment with emphasis on the latest trends. Google Video content includes fashion show clips and behind the scenes footage from many fashion shows.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dgetty_images">Getty Images' Archive Films Collection</a>: A diverse collection of short clips that capture personalities, moments and eras throughout history -- selected from vintage newsreels and educational film, as well as contemporary news and events from around the world.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dgreencine">GreenCine.com</a>: Feature length independent films, documentaries and classic titles, including works by legendary Polish director Andrzej Wajda (<span style="font-style: italic;">Zemsta</span>) and award-winning actor-director Caveh Zahedi (<span style="font-style: italic;">In the Bathtub of the World</span>).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=HDNet&so=0">HDNet</a>: Co-founded by Mark Cuban, HDNet has agreed to make select original programming from its library available for the launch of Google's first commercial video offering. The programs to be made available come from HDNet's ever growing library of original content including the <span style="font-style: italic;">HDNet World Report</span>, a groundbreaking series featuring news in HD from around the globe; <span style="font-style: italic;">True Music</span>, a popular weekly music series highlighting up-and-coming bands; <span style="font-style: italic;">Higher Definition</span>, a celebrity interview series hosted by Robert Wilonsky; <span style="font-style: italic;">Young, Beautiful and Trying to Make it in Hollywood</span>, following actresses through the hectic process of getting hired in Hollywood; and <span style="font-style: italic;">Deadline</span>, delivering current events and news from around the world from an irreverent point of view.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=heretv">here!</a>: Gay and lesbian U.S. television network featuring original movies and series and film library (independent and foreign films, documentaries and shorts).<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=hollywood+licensing">Hollywood Licensing's HilariousDownloads.com</a></span>: Hollywood Licensing is the entertainment licensing agency which represents the best and most extensive library of hilarious videos in the world. Tapping into a library boasting tens of thousands of clips, they have custom produced 20 packages of funny themes a celebrity interview series hosted by Robert Wilonsky; <span style="font-style: italic;">Young, Beautiful and Trying to Make it in Hollywood</span>, following actresses through the hectic process of getting hired in Hollywood; and <span style="font-style: italic;">Deadline</span>, delivering current events and news from around the world from an irreverent point of view.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=heretv">here!</a>: Gay and lesbian U.S. television network featuring original movies and series and film library (independent and foreign films, documentaries and shorts).<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=hollywood+licensing">Hollywood Licensing's HilariousDownloads.com</a></span>: Hollywood Licensing is the entertainment licensing agency which represents the best and most extensive library of hilarious videos in the world. Tapping into a library boasting tens of thousands of clips, they have custom produced 20 packages of funny themes for Google Video. For example, if you think that your recent home improvements was nothing but a miserable experience, wait until you see a bucket of wet plaster land on a man's face, a house collapsing or a door falling of its hinges for no particular reason.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Ditn">ITN</a>: One of the world's leading news producers, providing news programming for the main commercial broadcasters in the U.K. and its combined news broadcasts reach over two-thirds of the U.K. population. The company has a strong reputation for the creative and innovative use of modern technology, winning the Royal Television Society's 2004 Innovation Award.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Diwatchnow">iWatchNow.com</a>: Titles include Night of the Living Dead (George Romero), The Chronicles of Narnia: The Lion, Witch, and the Wardrobe (original animated film BBC from1979), The Man Who Knew Too Much (Hitchcock), the hard-to-find Comedy's Dirtiest Dozen (with Chris Rock and Tim Allen), and The Little Shop of Horrors (1960).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=kantola&so=0">Kantola Productions</a>: Captures unique speaking events given by well-known experts at Stanford University. Topics focus on innovative and practical business advice, such as How Leaders Boost Productivity by John H. (Jack) Zenger and <span style="font-style: italic;">Mastery of Speaking as a Leader</span> by Terry Pearce.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dlime">LIME</a></span>: “Healthy Living with a Twist†offers entertaining and revealing programming focused on a greener, healthier, more balanced lifestyle. Programming features inspiration from leading experts, authors, and pop culture icons and covers topics including the environment and sustainability, personal growth, alternative health, healthy foods, and business ethics.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=mediazone.com&so=0">MediaZone.com</a>: Programming covers sporting events, TV episodes, movies, how-to programs. Content includes <span style="font-style: italic;">The Rugby Channel presents ‘The Best Tries of 2004’</span> and <span style="font-style: italic;">The All Blacks of New Zealand Vs. Springboks of South Africa</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dtwi+nobel">Nobel Video Library</a>: A library focused on the achievements of individual Nobel Laureate. The series was developed to introduce students to the work of the laureates as well as to support classroom discussion regarding important issues addressed by Nobel Prize winners in recent decades.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=open+championship&so=0">Open Championship</a>: Official programs from the classic golf tournament, the British Open, such as<span style="font-style: italic;"> </span><span style="font-style: italic;">Reflections: Past Open Champions</span>.<br /><br />•<a style="font-weight: bold;" href="http://video.google.com/videosearch?q=plum+tv"> Plum TV</a>: Provides highly localized programming to the nation’s most influential consumers, and strives to be an incubator of groundbreaking new television programming. Each Plum TV station shares branding which links each station as a network, but still provides original programming customized to reflect each community. Plum TV’s programming includes regionally-focused feature pieces, tourist information (weather, traffic reports, restaurant reviews, retail and lodging information), a real estate show, local news and specially targeted entertainment for each community’s interests.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=porchlight+entertainment">PorchLight Entertainment</a>: Porchlight produces family-oriented motion pictures and TV specials. Google Video will offer 36 titles including <span style="font-style: italic;">Enough Already</span> and <span style="font-style: italic;">Role of a Lifetime</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=SOFA+Entertainment&so=0">SOFA Entertainment</a>: Represents pop culture at its best. Featuring several titles from the classic <span style="font-style: italic;">The Ed Sullivan Show</span> along with documentaries, feature films and music programming. SOFA Entertainment truly offers something for everyone. Some highlights include <span style="font-style: italic;">The Very Best of The Ed Sullivan Show - Vol. 1 & Vol. 2.</span><br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Sony+BMG">SONY BMG MUSIC ENTERTAINMENT</a>: The lineup of launch videos includes offerings from some of SONY BMG's largest global superstar artists, including Christina Aguilera, Beyonce, Kenny Chesney, Destiny's Child, Kelly Clarkson, Alicia Keys, Lil' Flip, Jessica Simpson, Shakira, System of a Down, Switchfoot, Usher, and many more.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Tai+Seng&so=0">Tai Seng Entertainment</a>: The definitive Asian cinema powerhouse. Known as the best source for Hong Kong films, Tai Seng also releases cinematic masterpieces from all over the Asia region in a variety of languages. Tai Seng brings to your home the best in class from high-octane action to bone-crushing martial arts, from chilling horror to lush swordplay epics. We are proud to showcase with Google some of Asia's biggest hits like Johnnie To's <span style="font-style: italic;">Running On Karma</span>, Korea's sensuously emotional drama <span style="font-style: italic;">Addicted</span>, martial arts Master Yuen Wo Ping's highly acclaimed <span style="font-style: italic;">Tai Chi Master</span>, and Michelle Yeoh's violently elegant <span style="font-style: italic;">Butterfly Sword</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Teen+Kids+news">Teen Kids News</a>: A dynamic television news program for teens and pre-teens, by teens. The half-hour weekly program provides 10 eyewitness news segments to students in a way that's educational as well as entertaining. Thirty shows with kids reporting on camera are available on Google Video.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Trinity+Broadcasting+&so=0">Trinity Broadcasting Network</a>: The world's largest religious network and America's most watched faith channel, TBN offers 24 hours of commercial-free inspirational programming that appeal to people in a wide variety of Protestant, Catholic and Messianic Jewish denominations. <span style="font-style: italic;">The Praise the Lord Program</span> is the only live two-hour Christian program in the world. The program brings the highest caliber of guests from well-known celebrities to laypersons for interview, as well as, singers, musicians, evangelists and the coverage of revivals and crusades from around the world. This award-winning program has been on each week night for over 30 years.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videoplay?docid=8592392906577495616&q=in_label%3Aowner%3Dunion">Union</a>: Offers the best of breed from the world of action sports, including snow, skate, bmx, moto, and surfing. Union is owned by Quiksilver Entertainment, Inc. and Global Media Ventures, LLC.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=wilderness+films+india">WFIL</a>: Wilderness Films India Ltd. is a leading producer and library of stock footage captured in India and across Asia. WFIL will offer 100 hours of high quality video, both free and for sale, on Google Video. Topics vary from helicopter skiing in the Himalaya, broadcast coverage of an Everest climb, and rare wildlife such as the takin and the clouded leopard to imagery spanning India's art, culture, technology, peoples, cities, and rural areas.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=wgbh+boston">WGBH</a>: WGBH Boston is America's preeminent public broadcasting producer, the source of fully one-third of PBS's prime-time lineup, along with some of public television's best-known lifestyle shows and children's programs and many public radio favorites. Programming available includes <span style="font-style: italic;">Nova</span>, <span style="font-style: italic;">La Plaza</span> (the longest running Latino program in the country), <span style="font-style: italic;">Thinking Big</span>, and <span style="font-style: italic;">Basic Black</span>. WGBH is the number one producer of Web sites on pbs.org, one of the most trafficked dot-org Web sites in the world. WGBH is a pioneer in educational multimedia and in technologies and services that make media accessible to the 36 million Americans who rely on captioning or video descriptions. WGBH has been recognized with hundreds of honors: Emmys, Peabodys, duPont-Columbia Awards.even two Oscars. In 2002, WGBH was honored with a special institutional Peabody Award for 50 years of excellence.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=WheelsTV&so=0">WheelsTV</a>: Serves both the general audience and the enthusiast with a wide spectrum of vehicle-based entertainment, news and information. WheelsTV Network, WheelsTV On Demand and WheelsTV.net have been developed by the producers of multi-awarding winning automotive programming for Discovery, PBS, Speedvision, Fox and Outdoor Life Networks including <span style="font-style: italic;">Wild About Wheels</span>, <span style="font-style: italic;">Wheels</span>, and <span style="font-style: italic;">Motor Trend Television</span>. WheelsTV Network’s valuable consumer programs include <span style="font-style: italic;">Top 200™ New Vehicle Test Drives</span>. With <span style="font-style: italic;">Top 200</span> on Google, consumers will be able to download virtual test drives of the best selling and most exciting cars on the road today, saving time and money.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dtwi">Wimbledon</a>: Official programs from the Wimbledon Tennis Championships such as <span style="font-style: italic;">Legends of Wimbledon: Bjorn Borg</span>. -false - - - - -A Googler - -2006-01-09T06:27:00-08:00 -2006-01-09T14:30:23Z -2005-12-18T23:47:55Z - -tag:blogger.com,1999:blog-10861780.post-113494967528450491 -The 2006 Anita Borg Scholarships - -
- -
-
The wonderfully-named Dr. Anita Borg (1949 - 2003) was a rebel with a cause: ensuring that technology itself has positive outcomes, and dismantling barriers that keep women and minorities from entering computing and technology fields. Today the Anita Borg Institute for Women and Technology carries on her vision. And because Google shares that passion, we are pleased to sponsor the 2006 Anita Borg Scholarship program. We are inspired by the past scholarship recipients -- and in hopes of finding more, the program is expanded this year to accept applications from students entering their senior year of undergraduate study as well as those enrolled in a graduate program. Last year we awarded 23 scholarships; this year we'd like to do more.
-
Tell your friends, or apply yourself - the deadline is January 20.
-
-false -
- - - -A Googler - -2006-01-06T16:51:00-08:00 -2006-01-07T00:54:51Z -2005-12-31T18:24:44Z - -tag:blogger.com,1999:blog-10861780.post-113605348414874975 -Make your computer just work -<span class="byline-author">Posted by Jesse Savage, Google Pack team</span><br /> <br />So you bought a new PC for yourself or a relative during the holidays. There was the initial excitement about its speed and the nice screen – and then it came time to actually get it running. Which meant embarking on some real work -– downloading a browser, a couple of multimedia players, a PDF reader, a toolbar, and maybe something for voice and instant messaging. Don’t forget the anti-spyware and anti-virus apps – you’ve got to have those. Hours, maybe even days, go by. How many wizards have you clicked through, not to mention license agreements and preference pickers? And then you have to ask: did I get everything? And how am I going to keep all of this up to date?<br /> <br />This was the experience both Sergey and Larry had a year ago. And they’re computer guys, after all. Which led them to ask more of us to make it easier for everyone. So we created the <a href="http://pack.google.com">Google Pack</a> -- a one-stop software package that helps you discover, install, and maintain a wide range of essential PC programs. It’s yours today – and it’s something we hope you find to be painless, easy, and even fun (if computer setup can ever be called that). And it’s free. <br /> <br />We worked with a number of technology companies to identify products that are the best of their type to create <a href="http://www.google.com/support/pack">this suite</a>. (We didn’t pay them, and they aren’t paying us.) For PC users running Windows XP, it downloads in minutes and installs in just a few clicks. There’s only one license agreement – and no wizards. And there’s a new tool called the <a href="http://www.google.com/support/pack/bin/answer.py?answer=30252&topic=8326/">Google Updater</a> that keeps all the software in the Google Pack current. Even if you already have some of the software in the Pack, you can use the Google Updater to update and manage it.<br /> <br />There’s one more thing in the Pack that we think you’ll like. The Pack team asked people what kind of screensavers they like best. They kept saying, “I want my own photos as a screensaver, why can’t I do that?†Good question -- lots of people have trouble with this. So we made the <a href="http://www.google.com/support/pack/bin/answer.py?answer=28076&topic=8315">Google Pack Screensaver</a>, which is the easiest possible way to make your photos into an animated photo collage. And now the question for you is: what will you do with all that time you've saved? -false - - - - -A Googler - -2005-12-30T17:18:00-08:00 -2006-01-05T21:52:34Z -2005-12-31T01:31:39Z - -tag:blogger.com,1999:blog-10861780.post-113599269991367646 -A year of Google blogging - -
- -
-
This is the 201st post to be published on the Google Blog in 2005. In closing out the first full year of our company-wide effort to share news and views, we thought you might be interested in a few factoids. Since we've had Google Analytics running on this blog since June, some of these numbers reflect only half a year. In that time, 4.3 million unique visitors have generated 8.7 million pageviews. Readers have come from all over the world, not just English-speaking countries: 53,001 visitors from Turkey have stopped by, for example; so have 155,691 from France, 29,614 from Thailand and 8,233 from Peru.
-
The most popular posts? Here are a few that have yielded scores of backlinks:

- Our explanation of "Googlebombing"
- A celebration of email and Gmail
- Google Earth's partnership with National Geographic about Africa
-
Several on Google Book Search (formerly known as Google Print), including:
- Preserving public domain books
- Our statement on the Authors' Guild suit
- and Eric Schmidt's op-ed about Book Search.

During the year, we've published 38 how-to tips, announced 77 new products and services, and addressed policy questions and legal matters 17 times. We've featured 11 guest bloggers. Forty posts have illuminated something about day to day life at Google; 19 have offered some international perspective.

In 2006, we'll keep up the Google Blog with more posts, more bloggers, and even more topics. Meanwhile, we really appreciate your interest and feedback, now visible through "Links to this post." We know some of you would like to offer comments directly, and we would like that too, when we can add resources to the blog crew. Meanwhile, our best to you and yours for the New Year.
-
-false -
-
diff --git a/tests/Zend/Feed/_files/AtomTestMozillazine.xml b/tests/Zend/Feed/_files/AtomTestMozillazine.xml deleted file mode 100644 index 2fa18ece5c..0000000000 --- a/tests/Zend/Feed/_files/AtomTestMozillazine.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - mozillaZine.org - - 2006-01-23T04:04:45-08:00 - Your Source for Daily Mozilla News and Advocacy - tag:mozillazine.org,2004:1 - Copyright (c) 2004, The Mozillazine Organization - - Minutes of the mozilla.org Staff Meeting of Monday 9th January 2006 - - 2006-01-22T20:04:42-08:00 - 2006-01-22T20:04:42-08:00 - 2006-01-22T20:04:42-08:00 - tag:mozillazine.org,2004:article7935 - - mozillaZine.org - - - The minutes of the mozilla.org staff meeting held on Monday 9th January 2006 are now online. Issues discussed include Firefox 1.5.0.1 release schedule, Thunderbird 1.5 release and Marketing.

]]> - Talkback

]]> -
-
- - - Minutes of the mozilla.org Staff Meeting of Wednesday 4th January 2006 - - 2006-01-12T09:29:47-08:00 - 2006-01-12T09:29:47-08:00 - 2006-01-12T09:29:47-08:00 - tag:mozillazine.org,2004:article7895 - - mozillaZine.org - - - The minutes of the mozilla.org staff meeting held on Wednesday 4th January 2006 are now available. Issues discussed include Upcoming Releases, Marketing, Thunderbird, 1.9 Roadmap, Firefox 2 Process and Calendar.

-

The minutes have been posted to the new mozilla.dev.general newsgroup, which is accessible via news.mozilla.org. The previously announced newsgroup migration is in progress. Once mozilla.dev.planning is created, minutes will be posted there.

]]> - Talkback

]]> -
-
- - - Thunderbird 1.5 Released - - 2006-01-11T18:19:13-08:00 - 2006-01-11T18:19:13-08:00 - 2006-01-11T18:19:13-08:00 - tag:mozillazine.org,2004:article7892 - - mozillaZine.org - - - Scott MacGregor writes: "The final release of Mozilla Thunderbird 1.5 is now available for download from getthunderbird.com. Users of RC1 should see the update soon. If you are using RC2, then you already have 1.5 final."

-

"Thunderbird 1.5 introduces several new features including a software update system, spell check as you type, built in phishing detector, auto save as draft, and support for deleting attachments from email messages. Message filtering has also been improved with new filter actions for replying and forwarding. Saved search folders can now search folders across multiple accounts."

-

"More details can be found in the Mozilla Thunderbird 1.5 Release Notes, and the support forum staff is available for questions. "

-

"I wanted to thank everyone in the mozillaZine community who helped test the alphas, the betas, and the release candidates that went into this release. Thank you for trusting Thunderbird with your email throughout the development and release cycle for 1.5. I'm looking forward to working with all of you on 2.0 and beyond!"

]]> - Talkback

]]> -
-
- - - Firefox Smoketest Day Planned for January 6, 2006 - - 2006-01-04T14:14:20-08:00 - 2006-01-04T14:14:20-08:00 - 2006-01-04T14:14:20-08:00 - tag:mozillazine.org,2004:article7859 - - mozillaZine.org - - - The Mozilla QA team has announced a community test day with focus on smoketesting nightly Firefox 1.5.0.1 builds.

-

Litmus tool will be used for this testing event. There is a FAQ posted on the QA community wiki that will have specific instructions on how this testing day will run.

]]> - Talkback

]]> -
-
- - - Camino 1.0 Beta 2 Released - - 2006-01-02T15:23:18-08:00 - 2006-01-02T15:23:18-08:00 - 2006-01-02T15:23:18-08:00 - tag:mozillazine.org,2004:article7850 - - mozillaZine.org - - - Camino 1.0 beta 2 has been released. This latest version of the native Mac OS X browser is replacing 0.8.4 as the stable Camino release on all systems 10.2+. See the Camino 1.0 Beta 2 Release Notes for more details.

]]> - Talkback

]]> -
-
- - - Mozilla Newsgroups Migration Scheduled - - 2006-01-02T15:07:27-08:00 - 2006-01-02T15:07:27-08:00 - 2006-01-02T15:07:27-08:00 - tag:mozillazine.org,2004:article7849 - - mozillaZine.org - - - Frank Wein has announced that the migration and reorganization of Mozilla newsgroups will take place in January 2006. As announced earlier, the new newsgroups will be hosted by Giganews. Access to the news server news.mozilla.org will remain free. The new groups will only be propogated to news.mozilla.org, Giganews Servers and Google Groups in an effort to combat news spam. For more information, refer to the FAQ and the list of new newsgroups. -

]]> - Talkback

]]> -
-
- - - Mozilla Thunderbird 1.5 Release Candidate 2 Available - - 2005-12-21T13:58:07-08:00 - 2005-12-21T13:58:07-08:00 - 2005-12-21T13:58:07-08:00 - tag:mozillazine.org,2004:article7823 - - mozillaZine.org - - - Scott MacGregor writes: "The second release candidate of Mozilla Thunderbird 1.5 is now available for download. Mozilla Thunderbird 1.5 RC2 is intended to allow testers to ensure that there are no last-minute problems with the Thunderbird 1.5 code. "

-

"RC2 contains several key bug fixes that were identified during the RC1 testing cycle. There are no new features or enchancements from RC1. Users of Thunderbird 1.5 RC1 will be offered RC 2 through the software update system."

-

"Thunderbird 1.5 RC2 can be downloaded from the Thunderbird 1.5 RC2 Release Notes page, or the Thunderbird 1.5rc2 directory on ftp.mozilla.org. More details can be found in the Release Notes."

-

"I'd like to single out all of the folks who participated in our QA testing day and our localization testing day. We wouldn't have been able to release RC2 before the holidays without all the volunteers who pitched in. Thank you!"

]]> - Talkback

]]> -
-
- - - Interview with Mike Beltzner - - 2005-12-20T23:00:29-08:00 - 2005-12-20T23:00:29-08:00 - 2005-12-20T23:00:29-08:00 - tag:mozillazine.org,2004:article7820 - - mozillaZine.org - - - David Tenser has posted an interview with Mozilla Foundation's User Experience Lead, Mike Beltzner. The interview was conducted over instant messaging sessions during the last week of November. Mike talks about usability studies, design of the Mozilla Developer Central, and the new bookmark system planned for Firefox 2.

]]> - Talkback

]]> -
-
- - - Gecko 1.9 Trunk and 1.8 Branch Management Plan Posted - - 2005-12-20T18:08:36-08:00 - 2005-12-20T18:08:36-08:00 - 2005-12-20T18:08:36-08:00 - tag:mozillazine.org,2004:article7819 - - mozillaZine.org - - - Brendan Eich has posted a draft plan for Gecko 1.9 Trunk and 1.8 Branch Management, including a FAQ at the mozilla wiki. Comments should be directed as followups to the newsgroup post. -

]]> - Talkback

]]> -
-
- - - Minutes of the mozilla.org Staff Meeting of Monday 12th December 2005 - - 2005-12-20T18:04:08-08:00 - 2005-12-20T18:04:08-08:00 - 2005-12-20T18:04:08-08:00 - tag:mozillazine.org,2004:article7818 - - mozillaZine.org - - - The minutes of the mozilla.org staff meeting held on Monday 12th December 2005 are now online. Issues discussed include Firefox Summit, Engineering, Upgrading, Awards and Newsgroups reorganisation

]]> - Talkback

]]> -
-
- - - Minutes of the mozilla.org Staff Meeting of Monday 5th December 2005 - - 2005-12-20T18:02:08-08:00 - 2005-12-20T18:02:08-08:00 - 2005-12-20T18:02:08-08:00 - tag:mozillazine.org,2004:article7817 - - mozillaZine.org - - - The minutes of the mozilla.org staff meeting held on Monday 5th December 2005 are now online. Issues discussed include Firefox Summit and Engineering.

]]> - Talkback

]]> -
-
- - - SeaMonkey 1.0 Beta Released - - 2005-12-20T17:41:12-08:00 - 2005-12-20T17:41:12-08:00 - 2005-12-20T17:41:12-08:00 - tag:mozillazine.org,2004:article7815 - - mozillaZine.org - - - Robert Kaiser writes: "Today, the SeaMonkey Council announces a new developer release, SeaMonkey 1.0 Beta. Compared to the Alpha version released in September, SeaMonkey 1.0 Beta enhances the product with new features like tab drag and drop, but also is the first release branded with the new SeaMonkey logo, which was unveiled earlier this month."

-

"The SeaMonkey 1.0 Beta Release Notes have more information about this test version. All the builds are available from the SeaMonkey 1.0b directory on ftp.mozilla.org."

]]> - Talkback

]]> -
-
- -
diff --git a/tests/Zend/Feed/_files/AtomTestOReilly.xml b/tests/Zend/Feed/_files/AtomTestOReilly.xml deleted file mode 100644 index bc9645ee39..0000000000 --- a/tests/Zend/Feed/_files/AtomTestOReilly.xml +++ /dev/null @@ -1,214 +0,0 @@ - - - - -weblogs.oreilly.com - -The O'Reilly Network Weblogs -Copyright 2005, O'Reilly Media, Inc. -http://weblogs.oreilly.com/ -2006-01-23T09:16:40-08:00 - -O'Reilly Media, Inc. - -no - - - Delightful Javascript Libs -- LGPL, Too. - http://www.oreillynet.com/pub/wlg/9085 - - -
- Here are some fundamental, well made JS goodies: Vectorgraphics Library, Drag'nDrop & DHTML Library, Tooltips with JavaScript Lib, and Rotate Image Lib. A pleasure to work with, and LGPL'ed. Also check out the JS Online Function Grapher. -
-
- Sid Steward - 2006-01-23T09:16:40-08:00 -
- - - Web 2.0: Simple division? - http://www.oreillynet.com/pub/wlg/9084 - - -
- There's been a lot of talk about the revolutionary change Web 2.0 promises, and it's time to look at the architecture that's leading to that change: a greater split between client and server logic. -
-
- Simon St. Laurent - 2006-01-23T08:15:34-08:00 -
- - - Don't Give us your Tired Your Poor - http://www.oreillynet.com/pub/wlg/9083 - - -
- Give us your vibrant, exciting, cool, open source Java submissions for this year's OSCON. -
-
- Daniel H. Steinberg - 2006-01-23T07:45:36-08:00 -
- - - Cutting Through the Patent Thicket - http://www.oreillynet.com/pub/wlg/9082 - - -
- Good succinct summary of the anti-patent argument, including how VC's look at patents and get duped by them. -
-
- Damien Stolarz - 2006-01-23T00:45:30-08:00 -
- - - The addslashes() Versus mysql_real_escape_string() Debate - http://www.oreillynet.com/pub/wlg/9081 - - -
- Last month, I discussed Google's XSS Vulnerability and provided an example that demonstrates it. I was hoping to highlight why character encoding consistency is important, but apparently the addslashes() versus mysql_real_escape_string() debate continues. -
-
- Chris Shiflett - 2006-01-22T22:45:11-08:00 -
- - - RPM Rollback in Fedora Core 4/5 - http://www.oreillynet.com/pub/wlg/9080 - - -
- Fedora's yum/rpm system includes a little-known capability: it can rollback a system to a previously-installed state. -
-
- Chris Tyler - 2006-01-22T13:15:12-08:00 -
- - - Shifting Gears: Switching to Django - http://www.oreillynet.com/pub/wlg/9075 - - -
- I've been using TurboGears since its public debut around September of last year. I believe it has incredible potential, but I'm finding myself needing something a little different. That something is Django. -
-
- Jeremy Jones - 2006-01-22T12:15:19-08:00 -
- - - Are We In A Productivity Crisis? - http://www.oreillynet.com/pub/wlg/9079 - - -
- Are we in a new kind of productivity crisis, one in which there is not too little productivity, but too much? -
-
- Spencer Critchley - 2006-01-22T09:45:58-08:00 -
- - - What Happens When You Edit an Image Stored Outside of iPhoto 6 - http://www.oreillynet.com/pub/wlg/9078 - - -
- Is the edited image stored inside or outside of your iPhoto 6 library? -
-
- Derrick Story - 2006-01-22T07:45:58-08:00 -
- - - Building emacs22 on Mac OS X - http://www.oreillynet.com/pub/wlg/9074 - - -
- Emacs 22 is Mac OS X aware, and can be built either as a Carbon .app double-clickable, or as a typical X11 program. Problem is, the information about how to build it is pretty scattered. Here's what works for me. -
-
- Chris Adamson - 2006-01-21T19:45:53-08:00 -
- - - hip to bash web2.0, are we? - http://www.oreillynet.com/pub/wlg/9034 - - -
- It's hip to take some "diggs" at Web 2.0. -
-
- Timothy M. O'Brien - 2006-01-21T15:46:26-08:00 -
- - - My New Game Development Course at Tufts - http://www.oreillynet.com/pub/wlg/9076 - - -
- I am teaching a new course at the Tufts University, "Introduction to Game Development," this semester. -
-
- Ming Chow - 2006-01-21T12:46:56-08:00 -
- - - Tune in to Radio Babylon - http://www.oreillynet.com/pub/wlg/9073 - - -
- Hardware hacks we'd like to see in iPods, #1 -
-
- Giles Turnbull - 2006-01-20T14:15:54-08:00 -
- - - A resource for Google maphacks and mashers now at Maphacks,net - http://www.oreillynet.com/pub/wlg/9072 - - -
- -
-
- Glenn Letham - 2006-01-20T12:16:05-08:00 -
- - - UK film studio on the hunt for Google earth programmers - http://www.oreillynet.com/pub/wlg/9071 - - -
- -
-
- Glenn Letham - 2006-01-20T11:47:03-08:00 -
- -
- diff --git a/tests/Zend/Feed/_files/AtomTestPlanetPHP.xml b/tests/Zend/Feed/_files/AtomTestPlanetPHP.xml deleted file mode 100644 index 762f01010d..0000000000 --- a/tests/Zend/Feed/_files/AtomTestPlanetPHP.xml +++ /dev/null @@ -1,125 +0,0 @@ - -Planet PHPPeople blogging about PHPhttp://www.planet-php.net/ - Planet PHP Aggregator - 2006-01-23T16:40:00ZeZ components in Gentoo LinuxSebastian Bergmannhttp://www.sebastian-bergmann.de/blog/archives/565-guid.html2006-01-23T16:40:00Z2006-01-23T16:40:00ZeZ components, which provide an enterprise ready general purpose PHP platform, are now available through Gentoo Linux's portage system:
wopr-mobile ~ # emerge -vp ezc-eZcomponents
-
-These are the packages that I would merge, in order:
-
-Calculating dependencies ...done!
-[ebuild  N    ] app-admin/php-toolkit-1.0-r2  0 kB
-[ebuild  N    ] dev-lang/php-5.1.2  0 kB [3]
-[ebuild  N    ] dev-php/PEAR-PEAR-1.4.6  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Base-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Database-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-PhpGenerator-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Configuration-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ImageAnalysis-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Archive-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Translation-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Cache-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ConsoleTools-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-PersistentObject-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ImageConversion-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Mail-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-UserInput-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Debug-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-EventLog-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Execution-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-eZcomponents-1.0_rc1  0 kB [2]
-
-Total size of downloads: 0 kB
-Portage overlays:
- [1] /usr/local/overlay/personal
- [2] /usr/local/overlay/cvs
- [3] /usr/local/overlay/php/testing
- [4] /usr/local/overlay/php/experimental
- [5] /usr/local/overlay/gentopia
- [6] /usr/local/overlay/xgl
- ]]>
PHP InsecurityChris Shifletthttp://shiflett.org/archive/1852006-01-23T16:15:00Z2006-01-23T16:15:00ZAndrew van der Stock has written a strong criticism of PHP's insecurity. Andrew is a seasoned security expert and a major contributor to OWASP, and he states:

-
After writing PHP forum software for three years now, I've come to the conclusion that it is basically impossible for normal programmers to write secure PHP code. It takes far too much effort.
-

He continues, citing specific areas where he thinks PHP is weak and asserting that "PHP must now mature and take on a proper security architecture."

-

Many of the insecure features he cites (register_globals, magic_quotes_gpc, and safe_mode) are slated to be removed in PHP 6, but his core complaint seems to revolve around the fact that PHP makes too much power too easily accessible, often granting developers more power and flexibility than they realize (e.g., wrappers).

-

Aside from minor language features like taint mode, I don't see what other platforms offer to help prevent inexperienced developers from writing insecure code. Anyone care to enlighten me? :-)

- Posted Mon, 23 Jan 2006 16:15:56 GMT in Chris Shiflett: The PHP Blog
- [ -   - - Discuss -   - | -   - - Tag -   - | -   - - Digg -   - | -   - - Furl -   - | -   - - Cosmos -   - ] -

]]>
Beta release of mobile webmail client (MIMP)Horde Newshttp://janschneider.de/cweb/home/index,channel,25,story,255.html2006-01-23T10:01:00Z2006-01-23T10:01:00ZMeet me at php|tekThinkPHP /dev/blog - PHPhttp://blog.thinkphp.de/archives/81-guid.html2006-01-22T22:34:00Z2006-01-22T22:34:00Zphp|tek, the next conference from the php|arch -guys around Marco Tabini who already organized the php|cruise and php|tropics -conferences, will be from April 26th to 28th at Orlando, Florida. As -you can read on the recently published schedule -I'll hold two talks. The first talk will be about PHP on the command -line, showing PHP's strength beyond the web which can be helpful to -build, deploy and scale your web-application and even for building apps -completely independent from anything on the web. My second talk will be -about PHP's reflection API. In that session I'll give an introduction -into the API and show how to use it to build modular, dynamic -applications.

-

If you're in reachable distance you should take the chance to listen and meet PHP developers from all over the world. (Hint: Till January 31st you can get early-bird rates!)

johannes

]]>
Quick LookupJohn Coxhttp://wyome.com/index.php?module=articles&func=display&ptid=10&catid=29-31&aid=5072006-01-22T19:23:00Z2006-01-22T19:23:00ZQuick lookup is a very nice little reference tool for lookups of web development documentation. It installs as a simple bookmark which can be changed to your sidebar for look ups of php / css / javascript / mysql documentation. It has a limited scope of features (which isn't a bad thing in my mind):

-

* Multiple tabs
-* PHP / MySQL / CSS / JS reference (MySQL is 55% complete)
-* Examples
-* Search as you type
-* Fast results
-* Remembers your last tab on your revisit
-* Access keys, [alt + (p, m, j, c)]
-

-

I did a cursory install, and it appears to be pretty fast. I think it might be better as part of the Web Developer Extension for Firefox, but as is, I can see the uses.

- ]]>
mysql_real_escape_string() versus Prepared StatementsIlia Alshanetskyhttp://ilia.ws/archives/103-guid.html2006-01-22T18:03:00Z2006-01-22T18:03:00ZChris has written a compelling piece about how the use of addslashes() for string escaping in MySQL queries can lead to SQL injection through the abuse of multibyte character sets. In his example he relies on addslashes() to convert an invalid multibyte sequence into a valid one, which also has an embedded ' that is not escaped. And in an ironic twist, the function intended to protect against SQL injection is used to actually trigger it.

-The problem demonstrated, actually goes a bit further, which even makes the prescribed escaping mechanism, mysql_real_escape_string() prone to the same kind of issues affecting addslashes(). The main advantage of the mysql_real_escape_string() over addslashes() lies in the fact that it takes character set into account and thus is able to determine how to properly escape the data. For example, if GBK character set is being used, it will not convert an invalid multibyte sequence 0xbf27 (¿’) into 0xbf5c27 (¿\’ or in GBK a single valid multibyte character followed by a single quote). To determine the proper escaping methodology mysql_real_escape_string() needs to know the character set used, which is normally retrieved from the database connection cursor. Herein lies the “trick”. In MySQL there are two ways to change the character set, you can do it by changing in MySQL configuration file (my.cnf) by doing:

CODE:
[client]
-default-character-set=GBK


-Or you can change on a per-connection basis, which is a common practice done by people without admin level access to the server via the following query:

CODE:
SET CHARACTER SET 'GBK'


-The problem with the latter, is that while it most certainly modified the charset it didnÂ’t let the escaping facilities know about it. Which means that mysql_real_escape_string() still works on the basis of the default charset, which if set to latin1 (common default) will make the function work in a manner identical to addslashes() for our purposes. Another word, 0xbf27 will be converted to 0xbf5c27 facilitating the SQL injection. Here is a brief proof of concept.

PHP:

<?php

-$c 
= mysql_connect("localhost", "user", "pass");
mysql_select_db("database", $c);

// change our character set
mysql_query("SET CHARACTER SET 'gbk'", $c);

// create demo table
mysql_query("CREATE TABLE users (
-    username VARCHAR(32) PRIMARY KEY,
-    password VARCHAR(32)
-) CHARACTER SET 'GBK'"
, $c);
mysql_query("INSERT INTO users VALUES('foo','bar'), ('baz','test')", $c);

// now the exploit code
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; 
$_POST['password'] = 'anything'; 

Truncated by Planet PHP, read more at the original (another 2694 bytes)

]]>
The addslashes() Versus mysql_real_escape_string() DebateChris Shifletthttp://shiflett.org/archive/1842006-01-22T04:15:00Z2006-01-22T04:15:00ZLast month, I discussed Google's XSS Vulnerability and provided an example that demonstrates it. I was hoping to highlight why character encoding consistency is important, but apparently the addslashes() versus mysql_real_escape_string() debate continues. Demonstrating Google's XSS vulnerability was pretty easy. Demonstrating an SQL injection attack that is immune to addslashes() is a bit more involved, but still pretty straightforward.

-

In GBK, 0xbf27 is not a valid multi-byte character, but 0xbf5c is. Interpreted as single-byte characters, 0xbf27 is 0xbf (¿) followed by 0x27 ('), and 0xbf5c is 0xbf (¿) followed by 0x5c (\).

-

How does this help? If I want to attempt an SQL injection attack against a MySQL database, having single quotes escaped with a backslash is a bummer. If you're using addslashes(), however, I'm in luck. All I need to do is inject something like 0xbf27, and addslashes() modifies this to become 0xbf5c27, a valid multi-byte character followed by a single quote. In other words, I can successfully inject a single quote despite your escaping. That's because 0xbf5c is considered to be a single character, not two. Oops, there goes the backslash.

-

I'm going to use MySQL 5.0 and PHP's mysqli extension for this demonstration. If you want to try this yourself, make sure you're using GBK. I just changed /etc/my.cnf, but that's because I'm testing locally:

-
[client]
-default-character-set=GBK
-

Create a table called users:

-
CREATE TABLE users
-(
-    username VARCHAR(32) CHARACTER SET GBK,
-    password VARCHAR(32) CHARACTER SET GBK,
-    PRIMARY KEY (username)
-);
-
-

The following script mimics a situation where only addslashes() is used to escape the data being used in a query:

-
<?php 

$mysql 
= array();

$db = mysqli_init();
$db->real_connect('localhost', 'myuser', 'mypass', 'mydb');

$_POST['username'] = chr(0xbf) .
                     
chr(0x27) .
                     
' OR username = username /*';
$_POST['password'] = 'guess';

$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST

Truncated by Planet PHP, read more at the original (another 4165 bytes)

]]>
PHP ConferencesJason E. Sweathttp://blog.casey-sweat.us/?p=692006-01-22T04:04:00Z2006-01-22T04:04:00ZBack from NorwayTobias Schlitthttp://www.schlitt.info/applications/blog/index.php?/archives/407-guid.html2006-01-22T00:30:00Z2006-01-22T00:30:00ZNorway is a somewhat strange country. When I got there - 2 weeks ago to work with Amos, Derick, Fred and Ray on the eZ components - it had the expected amount of snow. A few days later, there was nothing anymore. We had positive celsius values and the weather was really crappy... until Monday. Since then it has been snowing all the time and yesterday we left when it looked like this:

- -

pict1285.jpg

- -

Nice to watch, but not real fun to walk onto. :) Anyway, it's been another great stay in Skien, where the eZ headquarter is and I'm pretty much looking forward to our summer conference, where we plan to have the complete eZ team there and lots of people from the PHP world. Thanks for the great time, folks!

- - ]]>
Solar 0.10.0 ReleasedPaul M. Joneshttp://paul-m-jones.com/blog/?p=1922006-01-21T21:44:00Z2006-01-21T21:44:00Z
diff --git a/tests/Zend/Feed/_files/AtomTestSample1.xml b/tests/Zend/Feed/_files/AtomTestSample1.xml deleted file mode 100644 index 40aa3671b8..0000000000 --- a/tests/Zend/Feed/_files/AtomTestSample1.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Example Feed - Insert witty or insightful remark here - - 2003-12-13T18:30:02Z - - John Doe - johndoe@example.com - - urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 - - - Atom-Powered Robots Run Amok - - urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a - 2003-12-13T18:30:02Z - Some text. - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/AtomTestSample2.xml b/tests/Zend/Feed/_files/AtomTestSample2.xml deleted file mode 100644 index 7a7a628500..0000000000 --- a/tests/Zend/Feed/_files/AtomTestSample2.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - Example Atom Feed - 2006-01-23T23:04:33Z - - http://www.example.com - - - John Doe - John@Example.com - http://www.example.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/AtomTestSample3.xml b/tests/Zend/Feed/_files/AtomTestSample3.xml deleted file mode 100644 index 0accba88d9..0000000000 --- a/tests/Zend/Feed/_files/AtomTestSample3.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - Example Atom Feed - 2006-01-23T23:04:33Z - - http://www.example.com - - - John Doe - John@Example.com - http://www.example.com - - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/AtomTestSample4.xml b/tests/Zend/Feed/_files/AtomTestSample4.xml deleted file mode 100644 index 8af5593f77..0000000000 --- a/tests/Zend/Feed/_files/AtomTestSample4.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - http://www.example.com - Example Atom Feed - 2006-01-23T23:04:33Z - - - - John Doe - John@Example.com - http://www.example.com - - - - tag:www.example.com,2006-01-23:/post/1234 - Mars Attacks Pluto Probe - 2006-01-23T23:04:33Z - In upheaval of the tenuous peace between Earth and Mars over the last century, it has been confirmed that a rogue Martian fighter ship suddenly attacked Earth's 2006 probe to Pluto today. Martian delegates have been dispatched to Earth in an effort to quell the political firestorm that has ensued. - - - - - tag:www.example.com,2006-01-23:/post/1235 - Quake Rocks Io - 2006-01-23T23:04:33Z - A strong tremor rocked Io this afternoon, and officials are saying that no one has been found alive on Io since the quake. - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTest091Sample1.xml b/tests/Zend/Feed/_files/RssTest091Sample1.xml deleted file mode 100644 index 65788c3d0e..0000000000 --- a/tests/Zend/Feed/_files/RssTest091Sample1.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - WriteTheWeb - http://writetheweb.com - News for web users that write back - en-us - Copyright 2000, WriteTheWeb team. - editor@writetheweb.com - webmaster@writetheweb.com - - WriteTheWeb - http://writetheweb.com/images/mynetscape88.gif - http://writetheweb.com - 88 - 31 - News for web users that write back - - - Giving the world a pluggable Gnutella - http://writetheweb.com/read.php?item=24 - WorldOS is a framework on which to build programs that work like Freenet or Gnutella -allowing distributed applications using peer-to-peer routing. - - - Syndication discussions hot up - http://writetheweb.com/read.php?item=23 - After a period of dormancy, the Syndication mailing list has become active again, with contributions from leaders in traditional media and Web syndication. - - - Personal web server integrates file sharing and messaging - http://writetheweb.com/read.php?item=22 - The Magi Project is an innovative project to create a combined personal web server and messaging system that enables the sharing and synchronization of information across desktop, laptop and palmtop devices. - - - Syndication and Metadata - http://writetheweb.com/read.php?item=21 - RSS is probably the best known metadata format around. RDF is probably one of the least understood. In this essay, published on my O'Reilly Network weblog, I argue that the next generation of RSS should be based on RDF. - - - UK bloggers get organised - http://writetheweb.com/read.php?item=20 - Looks like the weblogs scene is gathering pace beyond the shores of the US. There's now a UK-specific page on weblogs.com, and a mailing list at egroups. - - - Yournamehere.com more important than anything - http://writetheweb.com/read.php?item=19 - Whatever you're publishing on the web, your site name is the most valuable asset you have, according to Carl Steadman. - - - diff --git a/tests/Zend/Feed/_files/RssTest092Sample1.xml b/tests/Zend/Feed/_files/RssTest092Sample1.xml deleted file mode 100644 index 5d75c352bd..0000000000 --- a/tests/Zend/Feed/_files/RssTest092Sample1.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Dave Winer: Grateful Dead - http://www.scripting.com/blog/categories/gratefulDead.html - A high-fidelity Grateful Dead song every day. This is where we're experimenting with enclosures on RSS news items that download when you're not using your computer. If it works (it will) it will be the end of the Click-And-Wait multimedia experience on the Internet. - Fri, 13 Apr 2001 19:23:02 GMT - http://backend.userland.com/rss092 - dave@userland.com (Dave Winer) - dave@userland.com (Dave Winer) - - - It's been a few days since I added a song to the Grateful Dead channel. Now that there are all these new Radio users, many of whom are tuned into this channel (it's #16 on the hotlist of upstreaming Radio users, there's no way of knowing how many non-upstreaming users are subscribing, have to do something about this..). Anyway, tonight's song is a live version of Weather Report Suite from Dick's Picks Volume 7. It's wistful music. Of course a beautiful song, oft-quoted here on Scripting News. <i>A little change, the wind and rain.</i> - - - - - Kevin Drennan started a <a href="http://deadend.editthispage.com/">Grateful Dead Weblog</a>. Hey it's cool, he even has a <a href="http://deadend.editthispage.com/directory/61">directory</a>. <i>A Frontier 7 feature.</i> - Scripting News - - - <a href="http://arts.ucsc.edu/GDead/AGDL/other1.html">The Other One</a>, live instrumental, One From The Vault. Very rhythmic very spacy, you can listen to it many times, and enjoy something new every time. - - - - This is a test of a change I just made. Still diggin.. - - - The HTML rendering almost <a href="http://validator.w3.org/check/referer">validates</a>. Close. Hey I wonder if anyone has ever published a style guide for ALT attributes on images? What are you supposed to say in the ALT attribute? I sure don't know. If you're blind send me an email if u cn rd ths. - - - <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Franklin's_Tower.txt">Franklin's Tower</a>, a live version from One From The Vault. - - - - Moshe Weitzman says Shakedown Street is what I'm lookin for for tonight. I'm listening right now. It's one of my favorites. "Don't tell me this town ain't got no heart." Too bright. I like the jazziness of Weather Report Suite. Dreamy and soft. How about The Other One? "Spanish lady come to me.." - Scripting News - - - <a href="http://www.scripting.com/mp3s/youWinAgain.mp3">The news is out</a>, all over town..<p> -You've been seen, out runnin round. <p> -The lyrics are <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/You_Win_Again.txt">here</a>, short and sweet. <p> -<i>You win again!</i> - - - - - <a href="http://www.getlyrics.com/lyrics/grateful-dead/wake-of-the-flood/07.htm">Weather Report Suite</a>: "Winter rain, now tell me why, summers fade, and roses die? The answer came. The wind and rain. Golden hills, now veiled in grey, summer leaves have blown away. Now what remains? The wind and rain." - - - - <a href="http://arts.ucsc.edu/gdead/agdl/darkstar.html">Dark Star</a> crashes, pouring its light into ashes. - - - - DaveNet: <a href="http://davenet.userland.com/2001/01/21/theUsBlues">The U.S. Blues</a>. - - - Still listening to the US Blues. <i>"Wave that flag, wave it wide and high.."</i> Mistake made in the 60s. We gave our country to the assholes. Ah ah. Let's take it back. Hey I'm still a hippie. <i>"You could call this song The United States Blues."</i> - - - <a href="http://www.sixties.com/html/garcia_stack_0.html"><img src="http://www.scripting.com/images/captainTripsSmall.gif" height="51" width="42" border="0" hspace="10" vspace="10" align="right"></a>In celebration of today's inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the <a href="http://searchlyrics2.homestead.com/gd_usblues.html">lyrics</a>. Click on the audio icon to the left to give it a listen. "Red and white, blue suede shoes, I'm Uncle Sam, how do you do?" It's a different kind of patriotic music, but man I love my country and I love Jerry and the band. <i>I truly do!</i> - - - - Grateful Dead: "Tennessee, Tennessee, ain't no place I'd rather be." - - - - Ed Cone: "Had a nice Deadhead experience with my wife, who never was one but gets the vibe and knows and likes a lot of the music. Somehow she made it to the age of 40 without ever hearing Wharf Rat. We drove to Jersey and back over Christmas with the live album commonly known as Skull and Roses in the CD player much of the way, and it was cool to see her discover one the band's finest moments. That song is unique and underappreciated. Fun to hear that disc again after a few years off -- you get Jerry as blues-guitar hero on Big Railroad Blues and a nice version of Bertha." - - - - <a href="http://arts.ucsc.edu/GDead/AGDL/fotd.html">Tonight's Song</a>: "If I get home before daylight I just might get some sleep tonight." - - - - <a href="http://arts.ucsc.edu/GDead/AGDL/uncle.html">Tonight's song</a>: "Come hear Uncle John's Band by the river side. Got some things to talk about here beside the rising tide." - - - - <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Me_and_My_Uncle.txt">Me and My Uncle</a>: "I loved my uncle, God rest his soul, taught me good, Lord, taught me all I know. Taught me so well, I grabbed that gold and I left his dead ass there by the side of the road." - - - - - Truckin, like the doo-dah man, once told me gotta play your hand. Sometimes the cards ain't worth a dime, if you don't lay em down. - - - - Two-Way-Web: <a href="http://www.thetwowayweb.com/payloadsForRss">Payloads for RSS</a>. "When I started talking with Adam late last year, he wanted me to think about high quality video on the Internet, and I totally didn't want to hear about it." - - - A touch of gray, kinda suits you anyway.. - - - - <a href="http://www.sixties.com/html/garcia_stack_0.html"><img src="http://www.scripting.com/images/captainTripsSmall.gif" height="51" width="42" border="0" hspace="10" vspace="10" align="right"></a>In celebration of today's inauguration, after hearing all those great patriotic songs, America the Beautiful, even The Star Spangled Banner made my eyes mist up. It made my choice of Grateful Dead song of the night realllly easy. Here are the <a href="http://searchlyrics2.homestead.com/gd_usblues.html">lyrics</a>. Click on the audio icon to the left to give it a listen. "Red and white, blue suede shoes, I'm Uncle Sam, how do you do?" It's a different kind of patriotic music, but man I love my country and I love Jerry and the band. <i>I truly do!</i> - - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTest100Sample1.xml b/tests/Zend/Feed/_files/RssTest100Sample1.xml deleted file mode 100644 index cd884501dd..0000000000 --- a/tests/Zend/Feed/_files/RssTest100Sample1.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - XML.com - http://xml.com/pub - - XML.com features a rich mix of information and services - for the XML community. - - - - - - - - - - - - - - - - - XML.com - http://www.xml.com - http://xml.com/universal/images/xml_tiny.gif - - - - Processing Inclusions with XSLT - http://xml.com/pub/2000/08/09/xslt/xslt.html - - Processing document inclusions with general XML tools can be - problematic. This article proposes a way of preserving inclusion - information through SAX-based processing. - - - - - Putting RDF to Work - http://xml.com/pub/2000/08/09/rdfdb/index.html - - Tool and API support for the Resource Description Framework - is slowly coming of age. Edd Dumbill takes a look at RDFDB, - one of the most exciting new RDF toolkits. - - - - - Search XML.com - Search XML.com's XML collection - s - http://search.xml.com - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTest100Sample2.xml b/tests/Zend/Feed/_files/RssTest100Sample2.xml deleted file mode 100644 index 5b4cbc4650..0000000000 --- a/tests/Zend/Feed/_files/RssTest100Sample2.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Meerkat - http://meerkat.oreillynet.com - Meerkat: An Open Wire Service - The O'Reilly Network - Rael Dornfest (mailto:rael@oreilly.com) - Copyright © 2000 O'Reilly & Associates, Inc. - 2000-01-01T12:00+00:00 - hourly - 2 - 2000-01-01T12:00+00:00 - - - - - - - - - - - - - - - Meerkat Powered! - http://meerkat.oreillynet.com/icons/meerkat-powered.jpg - http://meerkat.oreillynet.com - - - - XML: A Disruptive Technology - http://c.moreover.com/click/here.pl?r123 - - XML is placing increasingly heavy loads on the existing technical - infrastructure of the Internet. - - The O'Reilly Network - Simon St.Laurent (mailto:simonstl@simonstl.com) - Copyright © 2000 O'Reilly & Associates, Inc. - XML - XML.com - NASDAQ - XML - - - - Search Meerkat - Search Meerkat's RSS Database... - s - http://meerkat.oreillynet.com/ - search - regex - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTest200Sample1.xml b/tests/Zend/Feed/_files/RssTest200Sample1.xml deleted file mode 100644 index 7eedaf8137..0000000000 --- a/tests/Zend/Feed/_files/RssTest200Sample1.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - Liftoff News - http://liftoff.msfc.nasa.gov/ - Liftoff to Space Exploration. - en-us - Tue, 10 Jun 2003 04:00:00 GMT - Tue, 10 Jun 2003 09:41:01 GMT - http://blogs.law.harvard.edu/tech/rss - Weblog Editor 2.0 - editor@example.com - webmaster@example.com - - Star City - http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp - How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>. - Tue, 03 Jun 2003 09:39:21 GMT - http://liftoff.msfc.nasa.gov/2003/06/03.html#item573 - - - Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st. - Fri, 30 May 2003 11:06:42 GMT - http://liftoff.msfc.nasa.gov/2003/05/30.html#item572 - - - The Engine That Does More - http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp - Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that. - Tue, 27 May 2003 08:37:32 GMT - http://liftoff.msfc.nasa.gov/2003/05/27.html#item571 - - - Astronauts' Dirty Laundry - http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp - Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options. - Tue, 20 May 2003 08:56:02 GMT - http://liftoff.msfc.nasa.gov/2003/05/20.html#item570 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTestCNN.xml b/tests/Zend/Feed/_files/RssTestCNN.xml deleted file mode 100644 index b7992aa0d7..0000000000 --- a/tests/Zend/Feed/_files/RssTestCNN.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - -CNN.com -http://www.cnn.com/rssclick/?section=cnn_topstories -CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more. -en-us -© 2006 Cable News Network LP, LLLP. -Mon, 23 Jan 2006 15:11:09 EST -5 - -CNN.com -http://www.cnn.com/rssclick/?section=cnn_topstories -http://i.cnn.net/cnn/.element/img/1.0/logo/cnn.logo.rss.gif -144 -33 -CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more. - - -Court ruling could lead to BlackBerry shutdown -http://www.cnn.com/rssclick/money/2006/01/23/technology/rim/index.htm?section=cnn_topstories -BlackBerry maker Research in Motion was dealt a setback today when the U.S. Supreme Court turned down a request to review a major patent infringement ruling against the company. Research In Motion (RIM) had petitioned the Supreme Court to review a federal appeals court ruling that could lead to a shutdown of most U.S. BlackBerry sales and service. -Mon, 23 Jan 2006 15:09:23 EST - - -Ford owners not told how to reduce fire risk -http://www.cnn.com/rssclick/2006/US/01/23/ford.fires/index.html?section=cnn_topstories -The parents of three sisters burned to death in a rear-end crash are asking Ford Motor Co. to install the same gas tank protective devices in regular models as it did for its police cars. -Mon, 23 Jan 2006 12:30:45 EST - - -Ford cutting up to 30,000 jobs -http://www.cnn.com/rssclick/money/2006/01/23/news/companies/ford_closings/index.htm?section=cnn_topstories -Ford will close 14 manufacturing plants in North America and cut up to 30,000 jobs in the coming years to try to stem losses and adjust to a new, significantly lower market share. "If we build it, they'll buy it. That's business as usual and it's wrong," said Ford Chairman and CEO Bill Ford . "Our product plans for too long have been defined by our capacity. That's why we must reduce capacity in North America." -Mon, 23 Jan 2006 11:56:19 EST - - -Bush rejects warrantless wiretaps furor -http://www.cnn.com/rssclick/2006/POLITICS/01/23/bush.ap/index.html?section=cnn_topstories -Read full story for latest details. -Mon, 23 Jan 2006 14:25:26 EST - - -Rescuers dig for survivors in collapsed Nairobi building -http://www.cnn.com/rssclick/2006/WORLD/africa/01/23/kenya.building/index.html?section=cnn_topstories -Rescuers are desperately trying to dig out construction workers trapped under the rubble of a five-story building that collapsed today in Nairobi, Kenya. At least 60 people are injured. It was unclear if any workers had died. Witnesses told news agencies they had seen between four and eight bodies but police have given no official death toll yet. Dozens of rescuers dug into the rubble with their bare hands while the injured were taken to hospitals in cars. -Mon, 23 Jan 2006 15:06:36 EST - - -DNA frees man 24 years into 130-year sentence -http://www.cnn.com/rssclick/2006/LAW/01/23/dna.exoneration.ap/index.html?section=cnn_topstories -Read full story for latest details. -Mon, 23 Jan 2006 14:05:16 EST - - -School nurse crisis putting kids at risk -http://www.cnn.com/rssclick/2006/HEALTH/01/23/btsc.cohen/index.html?section=cnn_topstories -A few months ago, I was interviewing a principal at a Chicago, Illinois, public elementary school, when from outside her office came the sounds of a child coughing. -Mon, 23 Jan 2006 12:54:40 EST - - -Russia: Britain used 'rock' to spy -http://www.cnn.com/rssclick/2006/WORLD/europe/01/23/uk.russia.row/index.html?section=cnn_topstories -British official say they are "concerned and surprised" at allegations by a Russian state TV program that UK diplomats used a transmitter embedded in a fake rock as part of a high-tech spying operation in Moscow, news agencies report. -Mon, 23 Jan 2006 14:21:29 EST - - -Buttafuocos plan TV reunion with Amy Fisher -http://www.cnn.com/rssclick/2006/SHOWBIZ/TV/01/23/people.fisher.buttafuoco.reunion.ap/index.html?section=cnn_topstories -Read full story for latest details. -Mon, 23 Jan 2006 13:31:06 EST - - -Could you love the 'world's worst dog'? -http://www.cnn.com/rssclick/2006/SHOWBIZ/books/01/23/books.marley.me.ap/index.html?section=cnn_topstories -Read full story for latest details. -Mon, 23 Jan 2006 12:35:01 EST - - - diff --git a/tests/Zend/Feed/_files/RssTestHarvardLaw.xml b/tests/Zend/Feed/_files/RssTestHarvardLaw.xml deleted file mode 100644 index 842ba27aae..0000000000 --- a/tests/Zend/Feed/_files/RssTestHarvardLaw.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Really Simple Syndication - http://blogs.law.harvard.edu/tech/ - RSS Advisory Board announcements and RSS news - http://creativecommons.org/licenses/by-sa/1.0/ - en-us - Sat, 21 Jan 2006 05:00:00 GMT - Sun, 22 Jan 2006 02:01:58 GMT - http://backend.userland.com/rss - UserLand Frontier v9.5 - rssUpdates - rcade@yahoo.com - rcade@yahoo.com - - Simple Syndication in Communist China - http://english.peopledaily.com.cn/rss/rss.html - The English language edition of <a href="http://english.peopledaily.com.cn/">People's Daily</a>, the official newspaper of the Communist Party of China, offers <a href="http://english.peopledaily.com.cn/rss/rss.html">18 RSS 2.0 newsfeeds</a>.<br> -<br> -In addition to feeds on current events in news, business, sports, and -other areas, the paper devotes feeds to party leaders such as Chinese -President <a href="http://english.people.com.cn/rss/hujintao.xml">Hu Jintao</a> and Premier <a href="http://english.peopledaily.com.cn/rss/rss.html">Wen Jiabao</a>.<br> -<br> -Outside observers of China often look to <span style="font-style: italic;">People's Daily</span> for clues about the inner workings of the government, as described in <a href="http://en.wikipedia.org/wiki/People%27s_Daily">Wikipedia</a>:<br> -<p style="margin-left: 40px;">Newspaper articles in the <span style="font-style: italic;">People's Daily</span> are often not read for -content, so much as placement. A large number of articles devoted to a -political figure or idea is often taken as a sign that that official is -rising.</p><br><br><div style="margin-left: 40px;">In addition, editorials in the <i>People's Daily</i> are also still regarded as fairly authoritative statements of government policy.<br> -</div> - Rogers Cadenhead - http://blogs.law.harvard.edu/tech/2005/07/10#a852 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=852&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2005%2F07%2F10%23a852 - - - RSS Takes Flight at NASA - http://www.nasa.gov/rss/ - The National Aeronautics and Space Administration makes extensive use -of RSS 2.0 to provide news, photographs, and press releases on upcoming -missions and other space-related topics.<br> -<br> -People looking ahead to the planned July 13 launch of the space shuttle Discovery can subscribe to a <a href="http://www.nasa.gov/rss/rtf_news.rss">Return to Flight RSS feed</a>.<br> -<br> -NASA's RSS information page also includes an interesting demonstration of an RSS viewer created in Macromedia Flash.<br> - Rogers Cadenhead - http://blogs.law.harvard.edu/tech/2005/07/09#a851 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=851&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2005%2F07%2F09%23a851 - - - RSS Usage Skyrockets in the U.S. - http://blogs.law.harvard.edu/tech/2005/01/04#a821 - Six million Americans get news and information from RSS aggregators, according to a <a href="http://www.pewinternet.org/pdfs/PIP_blogging_data.pdf">nationwide telephone survey</a> conducted by the Pew Internet and American Life Project in November.<br> -<br> -The project, an ongoing survey of the 120 million Americans using the -Internet, found that 5 percent follow their favorite sources through -RSS syndication. "This is a first-time measurement from our surveys and -is an indicator that this application is gaining an impressive -foothold."<br> -<br> -The survey also found that 27 percent of those polled are weblog -readers, a 58 percent jump in the 9 months since the preceding poll was -conducted.<br> - Rogers Cadenhead - http://blogs.law.harvard.edu/tech/2005/01/04#a821 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=821&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2005%2F01%2F04%23a821 - - - Added link to encoding examples in RSS 2.0 spec - http://blogs.law.harvard.edu/tech/2004/06/19#a683 - <P>We added a link to a page of <A href="http://blogs.law.harvard.edu/tech/encodingDescriptions">encoding examples</A> for descriptions, <A href="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">under</A> Elements of &lt;item>. The change is also <A href="http://blogs.law.harvard.edu/tech/rssChangeNotes#61904Dw">noted</A> on the Change Notes page.</P> - Dave Winer - http://blogs.law.harvard.edu/tech/2004/06/19#a683 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=683&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F06%2F19%23a683 - - - Proposed clarification for RSS 2.0 spec (revised) - http://blogs.law.harvard.edu/tech/2004/06/15#a648 - <P>Here's a revised proposal for a clarification to the RSS 2.0 spec.</P> -<P>Under <A href="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">Elements of &lt;item></A>, replace the lead paragraph with the following.<BR></P> -<BLOCKQUOTE> -<P>A channel may contain any number of &lt;item>s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed<FONT color=green><B>; see <A style="COLOR: green" href="http://blogs.law.harvard.edu/tech/encodingDescriptions">examples</A></B></FONT>), and the link and title may be omitted. All elements of an item are optional, however at least one of title or description must be present.</P></BLOCKQUOTE> -<P><STRONG>Notes</STRONG>: The new text is in green. The word examples links to a <A href="http://blogs.law.harvard.edu/tech/encodingDescriptions">page</A> of examples of encodings. We'd like to make the changes to the spec early next week.&nbsp;&nbsp;If you have concerns about this change, please post a comment below, and we will review them before making the change. Thanks to everyone who has participated in the discussion thus far.</P> - Andrew Grumet - http://blogs.law.harvard.edu/tech/2004/06/15#a648 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=648&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F06%2F15%23a648 - - - Proposed clarification for RSS 2.0 spec - http://blogs.law.harvard.edu/tech/2004/06/04#a553 - <P>Requesting comments on a couple of proposed clarifications to the <A href="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">RSS 2.0 spec</A>.</P> -<P>1. Under Elements of &lt;item>, replace the lead paragraph with the following. The new text is highlighted in green.</P> -<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"> -<P>A channel may contain any number of &lt;item>s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text, and the link and title may be omitted. <B><FONT color=green>Either way, &lt;description> contains entity-encoded HTML</FONT>.</B> All elements of an item are optional, however at least one of title or description must be present.</P></BLOCKQUOTE> -<P>2. Immediately following that section, a link to a <A href="http://blogs.law.harvard.edu/tech/encodingDescriptions">page of examples</A>, authored by Nick Bradbury, author of the FeedDemon aggregator.</P> -<P><STRONG>Notes: </STRONG>We believe aggregators already assume the&nbsp;item-level description contains entity-encoded HTML.&nbsp; We'd like to make the changes to the spec early next week and if there are no deal-stoppers, we will. Please comment below. Off-topic and personal comments will be deleted.</P> -<P><STRONG>Thanks to:</STRONG> Nick Bradbury, Brent Simmons, Greg Reinacker, Jake Savin, Dare Obasanjo, Matt Mullenweg for their help working out this proposed clarification.</P> - Dave Winer - http://blogs.law.harvard.edu/tech/2004/06/04#a553 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=553&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F06%2F04%23a553 - - - RSS documentation updates - http://blogs.law.harvard.edu/tech/2004/05/31#a550 - If you're not tracking this site's <A href="http://blogs.law.harvard.edu/tech/rssChangeNotes">change notes page</A>, you might have missed a few minor edits to the documentation for RSS 2.0:<BR> -<UL> -<LI>The <A href="http://cyber.law.harvard.edu/blogs/gems/tech/rss2sample.xml">RSS 2.0 sample file</A> has been updated. -<LI>An <A href="http://blogs.law.harvard.edu/tech/rssChangeNotes#53104Dw">encoding issue</A> has been fixed on the <A href="http://blogs.law.harvard.edu/tech/skipHoursDays">skipHours and skipDays</A> page. </LI></UL>Suggestions for further improvements to the documentation are encouraged.<BR><BR> - Rogers Cadenhead - http://blogs.law.harvard.edu/tech/2004/05/31#a550 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=550&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F05%2F31%23a550 - - - The role of the advisory board - http://blogs.law.harvard.edu/tech/2004/05/18#a540 - There's been some confusion about the role of the advisory board. The purpose of this post to try to clear it up.<BR><BR>1. It's got a very conservative mission, to answer questions about RSS, to help people use it, to promote its use. It's basically a support function. <BR><BR>2. Anyone can extend RSS through namespaces. We suggest that people look first to see if there is a core element that already does what they need to do, and if so, use that instead of inventing a new one. That will keep the work of aggregator developers to a minimum, keep the barriers to entry low, help keep the market competitive. Competition should be based on features, performance and price, not compatibility. Compatibility should be easy.<BR><BR>3. Emphatically, this group is not a standards organization. It does not own RSS, or the spec, it has no more or less authority than any other group of people who wish to promote RSS. - Dave Winer - http://blogs.law.harvard.edu/tech/2004/05/18#a540 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=540&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F05%2F18%23a540 - - - Why are dates RFC 822? - http://blogs.law.harvard.edu/tech/2004/05/16#a534 - <P>Gene Saunders writes: "Why does RSS 2.0 use RFC 822 instead of the (infinitely more modern) RFC 2822?"</P> -<P>Here's why we went with RFC 822:</P> -<P>1. Any scripting software that was used in Internet applications would already have to deal with RFC 822 dates, since that was the format used in email. For most app developers, I imagined, they already had library routines that dealt with 822 format dates. The script environment I was using certainly did. Over the years I've never heard a complaint that people were unable to process 822 dates. <img src="http://static.userland.com/shortcuts/images/qbullets/sidesmiley.gif"></P> -<P>2. 822 dates are not only machine readable, they are also human readable. One of the <A href="http://davenet.scripting.com/2000/09/02/whatToDoAboutRss#rssIsAboutSimplicity">goals</A> of RSS was to be non-intimidating for non-technical users -- they should be able to look at a file and make sense of what's there, where ever possible. </P> -<P>3. Believe it or not, the decision was made in 1997, seven years ago. RSS is a venerable institution, so its anachronisms should be appreciated&nbsp;as one respects a fine wine or an elder statesman, or a format that spawned an incredible market.</P> - Dave Winer - http://blogs.law.harvard.edu/tech/2004/05/16#a534 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=534&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F05%2F16%23a534 - - - Speed Meets Feed in Download Tool - http://blogs.law.harvard.edu/tech/2004/03/15#a519 - <A href="http://www.wired.com/news/infostructure/0,1377,62651,00.html">Wired</A>: "A demo publishing system launched Friday by a popular programmer and blogger merges two of this season's hottest tech fads -- RSS news syndication and BitTorrent file sharing -- to create a cheap publishing system for what its author calls 'big media objects.' The hybrid system is meant to eliminate both the publisher's need for fat bandwidth, and the consumer's need to wait through a grueling download." - Dave Winer - http://blogs.law.harvard.edu/tech/2004/03/15#a519 - http://blogs.law.harvard.edu/tech/comments?u=tech&amp;p=519&amp;link=http%3A%2F%2Fblogs.law.harvard.edu%2Ftech%2F2004%2F03%2F15%23a519 - - - \ No newline at end of file diff --git a/tests/Zend/Feed/_files/RssTestPlanetPHP.xml b/tests/Zend/Feed/_files/RssTestPlanetPHP.xml deleted file mode 100644 index 762f987727..0000000000 --- a/tests/Zend/Feed/_files/RssTestPlanetPHP.xml +++ /dev/null @@ -1,126 +0,0 @@ - - -Planet PHPhttp://planet-php.netPeople blogging about PHPeneZ components in Gentoo Linux - Sebastian Bergmannhttp://www.sebastian-bergmann.de/blog/archives/565-eZ-components-in-Gentoo-Linux.htmlMon, 23 Jan 2006 16:40:00 +0000eZ components, which provide an enterprise ready general purpose PHP platform, are now available through Gentoo Linux's portage system:
wopr-mobile ~ # emerge -vp ezc-eZcomponents
-
-These are the packages that I would merge, in order:
-
-Calculating dependencies ...done!
-[ebuild  N    ] app-admin/php-toolkit-1.0-r2  0 kB
-[ebuild  N    ] dev-lang/php-5.1.2  0 kB [3]
-[ebuild  N    ] dev-php/PEAR-PEAR-1.4.6  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Base-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Database-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-PhpGenerator-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Configuration-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ImageAnalysis-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Archive-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Translation-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Cache-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ConsoleTools-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-PersistentObject-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-ImageConversion-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Mail-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-UserInput-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Debug-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-EventLog-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-Execution-1.0_rc1  0 kB [2]
-[ebuild  N    ] dev-php5/ezc-eZcomponents-1.0_rc1  0 kB [2]
-
-Total size of downloads: 0 kB
-Portage overlays:
- [1] /usr/local/overlay/personal
- [2] /usr/local/overlay/cvs
- [3] /usr/local/overlay/php/testing
- [4] /usr/local/overlay/php/experimental
- [5] /usr/local/overlay/gentopia
- [6] /usr/local/overlay/xgl
- ]]>
PHP Insecurity - Chris Shifletthttp://shiflett.org/archive/185Mon, 23 Jan 2006 16:15:56 +0000Andrew van der Stock has written a strong criticism of PHP's insecurity. Andrew is a seasoned security expert and a major contributor to OWASP, and he states:

-
After writing PHP forum software for three years now, I've come to the conclusion that it is basically impossible for normal programmers to write secure PHP code. It takes far too much effort.
-

He continues, citing specific areas where he thinks PHP is weak and asserting that "PHP must now mature and take on a proper security architecture."

-

Many of the insecure features he cites (register_globals, magic_quotes_gpc, and safe_mode) are slated to be removed in PHP 6, but his core complaint seems to revolve around the fact that PHP makes too much power too easily accessible, often granting developers more power and flexibility than they realize (e.g., wrappers).

-

Aside from minor language features like taint mode, I don't see what other platforms offer to help prevent inexperienced developers from writing insecure code. Anyone care to enlighten me? :-)

- Posted Mon, 23 Jan 2006 16:15:56 GMT in Chris Shiflett: The PHP Blog
- [ -   - - Discuss -   - | -   - - Tag -   - | -   - - Digg -   - | -   - - Furl -   - | -   - - Cosmos -   - ] -

]]>
Beta release of mobile webmail client (MIMP) - Horde Newshttp://janschneider.de/cweb/home/index,channel,25,story,255.htmlMon, 23 Jan 2006 10:01:16 +0000Meet me at php|tek - ThinkPHP /dev/blog - PHPhttp://blog.thinkphp.de/archives/81-Meet-me-at-phptek.htmlSun, 22 Jan 2006 22:34:00 +0000php|tek, the next conference from the php|arch -guys around Marco Tabini who already organized the php|cruise and php|tropics -conferences, will be from April 26th to 28th at Orlando, Florida. As -you can read on the recently published schedule -I'll hold two talks. The first talk will be about PHP on the command -line, showing PHP's strength beyond the web which can be helpful to -build, deploy and scale your web-application and even for building apps -completely independent from anything on the web. My second talk will be -about PHP's reflection API. In that session I'll give an introduction -into the API and show how to use it to build modular, dynamic -applications.

-

If you're in reachable distance you should take the chance to listen and meet PHP developers from all over the world. (Hint: Till January 31st you can get early-bird rates!)

johannes

]]>
Quick Lookup - John Coxhttp://wyome.com/index.php?module=articles&func=display&ptid=10&catid=29-31&aid=507Sun, 22 Jan 2006 19:23:31 +0000Quick lookup is a very nice little reference tool for lookups of web development documentation. It installs as a simple bookmark which can be changed to your sidebar for look ups of php / css / javascript / mysql documentation. It has a limited scope of features (which isn't a bad thing in my mind):

-

* Multiple tabs
-* PHP / MySQL / CSS / JS reference (MySQL is 55% complete)
-* Examples
-* Search as you type
-* Fast results
-* Remembers your last tab on your revisit
-* Access keys, [alt + (p, m, j, c)]
-

-

I did a cursory install, and it appears to be pretty fast. I think it might be better as part of the Web Developer Extension for Firefox, but as is, I can see the uses.

- ]]>
mysql_real_escape_string() versus Prepared Statements - Ilia Alshanetskyhttp://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.htmlSun, 22 Jan 2006 18:03:59 +0000Chris has written a compelling piece about how the use of addslashes() for string escaping in MySQL queries can lead to SQL injection through the abuse of multibyte character sets. In his example he relies on addslashes() to convert an invalid multibyte sequence into a valid one, which also has an embedded ' that is not escaped. And in an ironic twist, the function intended to protect against SQL injection is used to actually trigger it.

-The problem demonstrated, actually goes a bit further, which even makes the prescribed escaping mechanism, mysql_real_escape_string() prone to the same kind of issues affecting addslashes(). The main advantage of the mysql_real_escape_string() over addslashes() lies in the fact that it takes character set into account and thus is able to determine how to properly escape the data. For example, if GBK character set is being used, it will not convert an invalid multibyte sequence 0xbf27 (¿’) into 0xbf5c27 (¿\’ or in GBK a single valid multibyte character followed by a single quote). To determine the proper escaping methodology mysql_real_escape_string() needs to know the character set used, which is normally retrieved from the database connection cursor. Herein lies the “trick”. In MySQL there are two ways to change the character set, you can do it by changing in MySQL configuration file (my.cnf) by doing:

CODE:
[client]
-default-character-set=GBK


-Or you can change on a per-connection basis, which is a common practice done by people without admin level access to the server via the following query:

CODE:
SET CHARACTER SET 'GBK'


-The problem with the latter, is that while it most certainly modified the charset it didnÂ’t let the escaping facilities know about it. Which means that mysql_real_escape_string() still works on the basis of the default charset, which if set to latin1 (common default) will make the function work in a manner identical to addslashes() for our purposes. Another word, 0xbf27 will be converted to 0xbf5c27 facilitating the SQL injection. Here is a brief proof of concept.

PHP:

<?php

-$c 
= mysql_connect("localhost", "user", "pass");
mysql_select_db("database", $c);

// change our character set
mysql_query("SET CHARACTER SET 'gbk'", $c);

// create demo table
mysql_query("CREATE TABLE users (
-    username VARCHAR(32) PRIMARY KEY,
-    password VARCHAR(32)
-) CHARACTER SET 'GBK'"
, $c);
mysql_query("INSERT INTO users VALUES('foo','bar'), ('baz','test')", $c);

// now the exploit code
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*'; 
$_POST['password'] = 'anything'; 

Truncated by Planet PHP, read more at the original (another 2694 bytes)

]]>
The addslashes() Versus mysql_real_escape_string() Debate - Chris Shifletthttp://shiflett.org/archive/184Sun, 22 Jan 2006 04:15:58 +0000Last month, I discussed Google's XSS Vulnerability and provided an example that demonstrates it. I was hoping to highlight why character encoding consistency is important, but apparently the addslashes() versus mysql_real_escape_string() debate continues. Demonstrating Google's XSS vulnerability was pretty easy. Demonstrating an SQL injection attack that is immune to addslashes() is a bit more involved, but still pretty straightforward.

-

In GBK, 0xbf27 is not a valid multi-byte character, but 0xbf5c is. Interpreted as single-byte characters, 0xbf27 is 0xbf (¿) followed by 0x27 ('), and 0xbf5c is 0xbf (¿) followed by 0x5c (\).

-

How does this help? If I want to attempt an SQL injection attack against a MySQL database, having single quotes escaped with a backslash is a bummer. If you're using addslashes(), however, I'm in luck. All I need to do is inject something like 0xbf27, and addslashes() modifies this to become 0xbf5c27, a valid multi-byte character followed by a single quote. In other words, I can successfully inject a single quote despite your escaping. That's because 0xbf5c is considered to be a single character, not two. Oops, there goes the backslash.

-

I'm going to use MySQL 5.0 and PHP's mysqli extension for this demonstration. If you want to try this yourself, make sure you're using GBK. I just changed /etc/my.cnf, but that's because I'm testing locally:

-
[client]
-default-character-set=GBK
-

Create a table called users:

-
CREATE TABLE users
-(
-    username VARCHAR(32) CHARACTER SET GBK,
-    password VARCHAR(32) CHARACTER SET GBK,
-    PRIMARY KEY (username)
-);
-
-

The following script mimics a situation where only addslashes() is used to escape the data being used in a query:

-
<?php 

$mysql 
= array();

$db = mysqli_init();
$db->real_connect('localhost', 'myuser', 'mypass', 'mydb');

$_POST['username'] = chr(0xbf) .
                     
chr(0x27) .
                     
' OR username = username /*';
$_POST['password'] = 'guess';

$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST

Truncated by Planet PHP, read more at the original (another 4165 bytes)

]]>
PHP Conferences - Jason E. Sweathttp://blog.casey-sweat.us/?p=69Sun, 22 Jan 2006 04:04:14 +0000Back from Norway - Tobias Schlitthttp://www.schlitt.info/applications/blog/index.php?/archives/407-Back-from-Norway.htmlSun, 22 Jan 2006 00:30:57 +0000Norway is a somewhat strange country. When I got there - 2 weeks ago to work with Amos, Derick, Fred and Ray on the eZ components - it had the expected amount of snow. A few days later, there was nothing anymore. We had positive celsius values and the weather was really crappy... until Monday. Since then it has been snowing all the time and yesterday we left when it looked like this:

- -

pict1285.jpg

- -

Nice to watch, but not real fun to walk onto. :) Anyway, it's been another great stay in Skien, where the eZ headquarter is and I'm pretty much looking forward to our summer conference, where we plan to have the complete eZ team there and lots of people from the PHP world. Thanks for the great time, folks!

- - ]]>
Solar 0.10.0 Released - Paul M. Joneshttp://paul-m-jones.com/blog/?p=192Sat, 21 Jan 2006 21:44:43 +0000
diff --git a/tests/Zend/Feed/_files/RssTestSlashdot.xml b/tests/Zend/Feed/_files/RssTestSlashdot.xml deleted file mode 100644 index 2ae85d9ae1..0000000000 --- a/tests/Zend/Feed/_files/RssTestSlashdot.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - Slashdot - http://slashdot.org/ - News for nerds, stuff that matters - en-us - Copyright 1997-2005, OSTG - Open Source Technology Group, Inc. All Rights Reserved. - 2006-01-23T20:11:00+00:00 - OSTG - pater@slashdot.org - Technology - hourly - 1 - 1970-01-01T00:00+00:00 - - - - - - - - - - - - - - - - - - - Slashdot - http://images.slashdot.org/topics/topicslashdot.gif - http://slashdot.org/ - - - Interview with Mark Spencer of Asterisk - http://rss.slashdot.org/Slashdot/slashdot?m=3264 - comforteagle writes "OSDir has published an interview with Mark Spencer of Asterisk and Gaim about why and how he got started coding up the software platform PBX system and how it has become much more than -just- another phone system. He also shares his insights for the opportunities within the telecom industry for open source."<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3264"/> - ScuttleMonkey - 2006-01-23T19:47:00+00:00 - communications - ripe-for-open-source - mainpage - 15 - 15,13,11,6,2,1,1 - http://slashdot.org/article.pl?sid=06/01/23/1517205&from=rss - - - The Adobe Photoshop Elements Crafts Book - http://rss.slashdot.org/Slashdot/slashdot?m=3263 - Sdurham writes "Adobe Photoshop and its many siblings have long been a staple of artists, photographers, and programmers interested in doing serious image manipulation. Increasingly, Photoshop's younger sister Photoshop Elements comes prepackaged with digital cameras. Yet many of the users of these cameras lack the time or patience to tackle the steep learning curve of the Photoshop family and are left asking "How do I do ... ?". Elizabeth Bulger's The Adobe Photoshop Elements Crafts Book attempts to bridge the gap between Photoshop skill level and personal creativity by stepping the reader through 14 different craft projects. In doing so, Bulger tries to provide the basic Photoshop Elements skills necessary for readers to pursue their own projects after finishing the book." Read the rest of Sdurham's review.<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3263"/> - samzenpus - 2006-01-23T18:54:00+00:00 - books - update-your-prom-pictures - books - 18 - 18,15,9,5,3,1,0 - http://books.slashdot.org/article.pl?sid=06/01/23/1411250&from=rss - - - Supreme Court spurns RIM - http://rss.slashdot.org/Slashdot/slashdot?m=3262 - l2718 writes "NTP has just won the latest round in its court battle against Research in Motion (makers of the Blackberry). Today's Order List from the US Supreme Court includes a denial of certiorary for RIM's appeal. This follows the Circuit Court of Appeals' denial of review en banc we have covered previously. As sometimes happens, the court nevertheless accepted amicus curiae briefs from several groups, including Intel and the Canadian government." The potential impact of this may mean the shutdown of Blackberry's network. I hope the crackberry addicts have lots of methadone onhand. -<p><a href="http://rss.slashdot.org/~c/Slashdot/slashdot?a=fYMCju"><img src="http://rss.slashdot.org/~c/Slashdot/slashdot?i=fYMCju" border="0"></img></a></p><img src="http://rss.slashdot.org/Slashdot/slashdot?g=3262"/> - Hemos - 2006-01-23T18:22:00+00:00 - patents - good-bye-black-berry - yro - 138 - 138,131,116,73,15,9,5 - http://yro.slashdot.org/article.pl?sid=06/01/23/1744258&from=rss - - - Adult Entertainment Antes Up In DRM War - http://rss.slashdot.org/Slashdot/slashdot?m=3261 - At the recent adult entertainment awards, host Greg Fitzsimmons highlighted the deep relationship between the internet and pornography stating "'The Internet was completely funded by porn,' he said [...] And if it wasn't for the Internet, he added, 'you guys would be completely out of business.' The audience, packed with porn actors and adult entertainment moguls like Jenna Jameson and Larry Flynt, roared with laughter." Now it appears that the adult entertainment industry has chosen to ante up in the DRM battle as well. Some companies have chosen to take sides, like Digital Playground who will be supporting Sony's Blu-Ray. Others, like Vivid Entertainment, seem to think that the answer is diversity and will be supporting both Blu-Ray and HD-DVD.<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3261"/> - ScuttleMonkey - 2006-01-23T17:37:00+00:00 - media - can't-we-all-just-get-along - hardware - 152 - 152,146,124,84,34,17,12 - http://hardware.slashdot.org/article.pl?sid=06/01/23/1544235&from=rss - - - Slashdot Index Code Update - http://rss.slashdot.org/Slashdot/slashdot?m=3259 - For years now Slashdot has posted what we call "Sectional Content". That is to say, stories that we think are good, but since we try to keep the Slashdot Main Page to around 15 stories per day, some stuff just gets put into the sections. This content is mostly lost to readers who simply don't know it exists. Today we're deploying new code to help you find that content (and alternatively, to disable it).<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3259"/> - CmdrTaco - 2006-01-23T17:00:00+00:00 - slashdot - zomg-you-got-some-ajax-in-our-ui - mainpage - 247 - 247,231,192,142,41,21,14 - http://slashdot.org/article.pl?sid=06/01/19/175253&from=rss - - - IE7 Leaked - http://rss.slashdot.org/Slashdot/slashdot?m=3260 - lju writes "IE7 has been leaked according to pcpro. From the article: '...last Friday it was revealed that a build of the new browser - version 5299 - along with numerous screenshots, was available online.' " -<p><a href="http://rss.slashdot.org/~c/Slashdot/slashdot?a=jVTbOh"><img src="http://rss.slashdot.org/~c/Slashdot/slashdot?i=jVTbOh" border="0"></img></a></p><img src="http://rss.slashdot.org/Slashdot/slashdot?g=3260"/> - CmdrTaco - 2006-01-23T16:41:00+00:00 - microsoft - hate-when-that-happens - it - 265 - 265,257,202,137,52,31,19 - http://it.slashdot.org/article.pl?sid=06/01/23/152211&from=rss - - - The Future of e-Commerce and e-Information? - http://rss.slashdot.org/Slashdot/slashdot?m=3257 - An anonymous reader writes "The Washington Post has an interesting article on what they label 'The Coming Tug of War Over the Internet. From the article: 'Do you prefer to search for information online with Google or Yahoo? What about bargain shopping -- do you go to Amazon or eBay? Many of us make these kinds of decisions several times a day, based on who knows what -- maybe you don't like bidding, or maybe Google's clean white search page suits you better than Yahoo's colorful clutter. But the nation's largest telephone companies have a new business plan, and if it comes to pass you may one day discover that Yahoo suddenly responds much faster to your inquiries, overriding your affinity for Google. Or that Amazon's Web site seems sluggish compared with eBay's.'" Seems like the idea of the 2-tier internet is really catching on with the market-droids.<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3257"/> - ScuttleMonkey - 2006-01-23T15:46:00+00:00 - biz - bad-for-the-internet-good-for-business - yro - 159 - 159,157,140,90,25,16,10 - http://yro.slashdot.org/article.pl?sid=06/01/23/1450249&from=rss - - - MacWorld MacBook Only a Prototype? - http://rss.slashdot.org/Slashdot/slashdot?m=3256 - mahju writes "Hard Mac is reporting that Apple's, unoffical, response in Paris to the the lack of information on battery life, is that the MacBook Pro that were demoed at Mac World SF are only prototypes and the final versions are still under development. " -<p><a href="http://rss.slashdot.org/~c/Slashdot/slashdot?a=qEOB5Q"><img src="http://rss.slashdot.org/~c/Slashdot/slashdot?i=qEOB5Q" border="0"></img></a></p><img src="http://rss.slashdot.org/Slashdot/slashdot?g=3256"/> - CmdrTaco - 2006-01-23T14:12:00+00:00 - intel - well-thats-not-surprising - apple - 160 - 160,150,136,102,35,21,14 - http://apple.slashdot.org/article.pl?sid=06/01/23/1333220&from=rss - - - Has Microsoft 'Solved' Spam? - http://rss.slashdot.org/Slashdot/slashdot?m=3254 - MsWillow writes to tell us the Seattle PI is running a story looking back at Bill Gates promise to have the spam problem "solved" in two years. Well, it looks like time is up, and the verdict is -- an emphatic "maybe". From the article: "Microsoft says it sees things differently. To "solve" the problem for consumers in the short run doesn't require eliminating spam entirely, said Ryan Hamlin, the general manager who oversees the company's anti-spam programs. Rather, he said, the idea is to contain it to the point that its impact on in-boxes is minor. In that way, Hamlin said, Gates' prediction has come true for people using the right tactics and advanced filtering technology."<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3254"/> - ScuttleMonkey - 2006-01-23T13:37:00+00:00 - spam - depends-on-your-definition-of-solved - it - 283 - 283,277,240,152,57,27,15 - http://it.slashdot.org/article.pl?sid=06/01/23/0340241&from=rss - - - World of Warcraft AQ Gates Open! - http://rss.slashdot.org/Slashdot/slashdot?m=3255 - Tayman writes "Wow...who didn't see this one coming? The players on the World of Warcraft Medivh server opened the gates to AQ. What happened next? The server crashed repeatedly. Why create content the servers can't handle? The very first time I read about this patch, I knew the servers would crash. The more people who open the gates, the more angry customers Blizzard will have in my opinion. With 5million+ subscribers, you would think Blizzard would have the best servers/connection money can buy. Although, I'm sure it's more complicated than simply plugging in a few ram chips and faster processors though. Most of the people involved in the raid are having a great time though. Could this be the most epic battle ever introduced to the mmorpg market? All signs point to yes. Let's see how long the mobs will respawn. Hopefully, the people of the Medivh server haven't seen anything yet. Either way, I would hate to be a network admin for Blizzard atm. ^_^ Here are some pics of the event. Thanks go out to all of those who took these pics. World of Warcraft AQ Pics Check out MMORPG Veteran to keep up with the events as they unfold." Update: 01/23 13:44 GMT by Z : Additionally, brandor wrote in with a link to some video of the event.<img src="http://rss.slashdot.org/Slashdot/slashdot?g=3255"/> - Hemos - 2006-01-23T13:33:00+00:00 - rpg - of-course-it-will-blow-up - games - 330 - 330,313,258,158,46,27,20 - http://games.slashdot.org/article.pl?sid=06/01/23/1244201&from=rss - - - Search Slashdot - Search Slashdot stories - query - http://slashdot.org/search.pl - - - diff --git a/tests/Zend/Feed/_files/TestAtomFeed.xml b/tests/Zend/Feed/_files/TestAtomFeed.xml deleted file mode 100644 index 69afce7a60..0000000000 --- a/tests/Zend/Feed/_files/TestAtomFeed.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - Atom Example - This is a simple Atom Feed made by XML_Feed_Writer. - - - - 4 - 3 - 2 - 2005-04-25T00:00:00+02:00 - - 1 - - The Item Title - 2004-09-25T16:03:00+02:00 - 2005-12-25T16:03:00+01:00 - - David Coallier - - Testing something before releasing - - - 2 - - Second item added to the builder/feeded.. - 2004-01-04T00:00:00+01:00 - 1970-01-01T01:00:00+01:00 - - David Coallier - - Jaws project, visit the website for infos... - - diff --git a/tests/Zend/Feed/_files/TestAtomFeedEntryOnly.xml b/tests/Zend/Feed/_files/TestAtomFeedEntryOnly.xml deleted file mode 100644 index 9088137da7..0000000000 --- a/tests/Zend/Feed/_files/TestAtomFeedEntryOnly.xml +++ /dev/null @@ -1 +0,0 @@ -1Bug1BuggyLong time debugging2005-09-152005-09-18RESOLVEDnormalP2FIXEDexample@example.comThe bug has been fixed. diff --git a/tests/Zend/Feed/_files/TestAtomFeedNamespaced.xml b/tests/Zend/Feed/_files/TestAtomFeedNamespaced.xml deleted file mode 100644 index 02d0ee2544..0000000000 --- a/tests/Zend/Feed/_files/TestAtomFeedNamespaced.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - Atom Example - This is a simple Atom Feed made by XML_Feed_Writer. - - - - 4 - 3 - 2 - 2005-04-25T00:00:00+02:00 - - 1 - - The Item Title - 2004-09-25T16:03:00+02:00 - 2005-12-25T16:03:00+01:00 - - David Coallier - - Testing something before releasing - - - 2 - - Second item added to the builder/feeded.. - 2004-01-04T00:00:00+01:00 - 1970-01-01T01:00:00+01:00 - - David Coallier - - Jaws project, visit the website for infos... - - diff --git a/tests/Zend/Feed/_files/TestFeedEntryRssContentEncoded.xml b/tests/Zend/Feed/_files/TestFeedEntryRssContentEncoded.xml deleted file mode 100644 index baa70a73b9..0000000000 --- a/tests/Zend/Feed/_files/TestFeedEntryRssContentEncoded.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Zend Framework IT - http://www.zend-framework.it - Just another Zend Framework (Italian) weblog. - Sun, 03 Feb 2008 21:07:35 +0000 - http://wordpress.org/?v=2.3.1 - en - - Zend_Service_Technorati promosso in Core - http://www.zend-framework.it/2008/02/03/zend_service_technorati-promosso-in-core/ - http://www.zend-framework.it/2008/02/03/zend_service_technorati-promosso-in-core/#comments - Sun, 03 Feb 2008 21:06:15 +0000 - weppos - - - - - http://www.zend-framework.it/2008/02/03/zend_service_technorati-promosso-in-core/ - - Il commit r7757 ha ufficialmente decretato la promozione nella core library di un componente al quale sono molto affezionato: Zend_Service_Technorati.
-Non solo si tratta della prima libreria completamente proposta e sviluppata dal sottoscritto, ma è anche un lavoro che mi ha visto occupato per diversi giorni nel tentativo di risolvere i vari problemi di inconsistenza delle API di Technorati, come dimostra il ticket #ZF-2334. (more…)

-]]>
- http://www.zend-framework.it/2008/02/03/zend_service_technorati-promosso-in-core/feed/ -
- - Proposta per la struttura predefinita di un nuovo progetto Zend Framework - http://www.zend-framework.it/2008/02/02/proposta-per-la-struttura-predefinita-di-un-nuovo-progetto-zend-framework/ - http://www.zend-framework.it/2008/02/02/proposta-per-la-struttura-predefinita-di-un-nuovo-progetto-zend-framework/#comments - Sat, 02 Feb 2008 14:21:15 +0000 - weppos - - - http://www.zend-framework.it/2008/02/02/proposta-per-la-struttura-predefinita-di-un-nuovo-progetto-zend-framework/ - - - http://www.zend-framework.it/2008/02/02/proposta-per-la-struttura-predefinita-di-un-nuovo-progetto-zend-framework/feed/ - - - Installare Zend Framework via PEAR - http://www.zend-framework.it/2008/01/29/installare-zend-framework-via-pear/ - http://www.zend-framework.it/2008/01/29/installare-zend-framework-via-pear/#comments - Tue, 29 Jan 2008 08:42:37 +0000 - weppos - - - - http://www.zend-framework.it/2008/01/29/installare-zend-framework-via-pear/ - - Introduzione a PEAR -

Chiunque programmi in PHP avrà sentito parlare, prima o poi, di PEAR.
-PEAR è un enorme repository di librerie PHP. Vi si trovano applicazioni complete, librerie complete ma, ahimè, anche molti componenti abbandonati sul nascere.

-

PEAR offre un eccellente sistema di packaging che consente di installare facilmente una libreria parte del repository ufficiale o una qualsiasi libreria su un altro repository che sia compatibile con gli standard definiti.
-Per chi programma in altri linguaggi, questo sistema è molto simile al concetto di GEM in Ruby o ai moduli di PERL. (more…)

-]]>
- http://www.zend-framework.it/2008/01/29/installare-zend-framework-via-pear/feed/ -
-
-
diff --git a/tests/Zend/Feed/_files/htmlPage.html b/tests/Zend/Feed/_files/htmlPage.html deleted file mode 100644 index 467d534d34..0000000000 --- a/tests/Zend/Feed/_files/htmlPage.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Blog - - - - - - - - diff --git a/tests/Zend/Feed/_files/xxe-info.txt b/tests/Zend/Feed/_files/xxe-info.txt deleted file mode 100644 index 603572bbbd..0000000000 --- a/tests/Zend/Feed/_files/xxe-info.txt +++ /dev/null @@ -1 +0,0 @@ -xxe-information-disclosed diff --git a/tests/Zend/Feed/_files/zend_feed_atom_xxe.xml b/tests/Zend/Feed/_files/zend_feed_atom_xxe.xml deleted file mode 100644 index c60ee0b17a..0000000000 --- a/tests/Zend/Feed/_files/zend_feed_atom_xxe.xml +++ /dev/null @@ -1,5 +0,0 @@ - - ]> - - info:&discloseInfo; - diff --git a/tests/Zend/Feed/_files/zend_feed_rss_xxe.xml b/tests/Zend/Feed/_files/zend_feed_rss_xxe.xml deleted file mode 100644 index bbfb2f29f3..0000000000 --- a/tests/Zend/Feed/_files/zend_feed_rss_xxe.xml +++ /dev/null @@ -1,7 +0,0 @@ - - ]> - - - info:&discloseInfo; - - From 65e7b35bb8234b96c5db9b6fa23a817e06886e83 Mon Sep 17 00:00:00 2001 From: Joan He Date: Thu, 5 Apr 2018 12:25:51 -0500 Subject: [PATCH 02/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Service --- demos/Zend/Service/LiveDocx/Helper.php | 177 -- .../MailMerge/bitmaps/generate-bitmaps.php | 34 - .../MailMerge/bitmaps/template-screenshot.png | Bin 126090 -> 0 bytes .../LiveDocx/MailMerge/bitmaps/template.docx | Bin 47773 -> 0 bytes .../MailMerge/conference-pass/dailemaitre.jpg | Bin 213129 -> 0 bytes .../conference-pass/generate-document.php | 36 - .../MailMerge/conference-pass/template.docx | Bin 4300 -> 0 bytes .../MailMerge/constructors/credentials.ini | 2 - .../constructors/hosted-licensed.php | 34 - .../constructors/public-zend_config.php | 32 - .../MailMerge/constructors/public.php | 58 - .../MailMerge/convert/convert-document.php | 36 - .../LiveDocx/MailMerge/convert/document.doc | Bin 51712 -> 0 bytes .../LiveDocx/MailMerge/images/delete-all.php | 29 - .../LiveDocx/MailMerge/images/download.php | 30 - .../LiveDocx/MailMerge/images/image-1.png | Bin 177 -> 0 bytes .../LiveDocx/MailMerge/images/image-2.png | Bin 204 -> 0 bytes .../MailMerge/images/image-exists.php | 29 - .../LiveDocx/MailMerge/images/list.php | 23 - .../LiveDocx/MailMerge/images/upload.php | 29 - .../generate-document-concat.php | 250 -- .../license-agreement/generate-document.php | 82 - .../license-agreement/template-screenshot.png | Bin 126090 -> 0 bytes .../MailMerge/license-agreement/template.docx | Bin 47773 -> 0 bytes .../metafiles/generate-metafiles.php | 34 - .../metafiles/template-screenshot.png | Bin 126090 -> 0 bytes .../MailMerge/metafiles/template.docx | Bin 47773 -> 0 bytes .../pdf-security/generate-document.php | 42 - .../MailMerge/pdf-security/template.docx | Bin 47773 -> 0 bytes .../show-supported-fonts-cached.php | 58 - .../supported-fonts/show-supported-fonts.php | 23 - .../show-supported-formats-cached.php | 71 - .../show-supported-formats.php | 35 - .../telephone-bill/generate-document.php | 82 - .../telephone-bill/template-screenshot.png | Bin 99168 -> 0 bytes .../MailMerge/telephone-bill/template.doc | Bin 20992 -> 0 bytes .../template-info/list-template-info.php | 80 - .../template-1-text-field-screenshot.png | Bin 80061 -> 0 bytes .../template-info/template-1-text-field.doc | Bin 6656 -> 0 bytes .../template-info/template-1-text-field.docx | Bin 4143 -> 0 bytes .../template-2-text-fields-screenshot.png | Bin 79755 -> 0 bytes .../template-info/template-2-text-fields.doc | Bin 6656 -> 0 bytes .../template-info/template-2-text-fields.docx | Bin 4171 -> 0 bytes .../template-block-fields-screenshot.png | Bin 99168 -> 0 bytes .../template-info/template-block-fields.doc | Bin 20992 -> 0 bytes .../MailMerge/templates/delete-all.php | 29 - .../LiveDocx/MailMerge/templates/download.php | 30 - .../LiveDocx/MailMerge/templates/list.php | 23 - .../MailMerge/templates/template-1.docx | Bin 47773 -> 0 bytes .../MailMerge/templates/template-2.docx | Bin 47773 -> 0 bytes .../MailMerge/templates/template-exists.php | 29 - .../LiveDocx/MailMerge/templates/upload.php | 29 - .../Service/LiveDocx/check-environment.php | 280 -- demos/Zend/Service/LiveDocx/common.php | 27 - .../Service/LiveDocx/configuration.php.dist | 44 - library/Zend/Service/Abstract.php | 71 - library/Zend/Service/Akismet.php | 387 --- library/Zend/Service/Amazon.php | 326 -- library/Zend/Service/Amazon/Abstract.php | 119 - library/Zend/Service/Amazon/Accessories.php | 58 - .../Zend/Service/Amazon/Authentication.php | 82 - .../Amazon/Authentication/Exception.php | 37 - .../Zend/Service/Amazon/Authentication/S3.php | 112 - .../Zend/Service/Amazon/Authentication/V1.php | 108 - .../Zend/Service/Amazon/Authentication/V2.php | 138 - .../Zend/Service/Amazon/CustomerReview.php | 86 - library/Zend/Service/Amazon/Ec2.php | 87 - library/Zend/Service/Amazon/Ec2/Abstract.php | 277 -- .../Service/Amazon/Ec2/Availabilityzones.php | 76 - .../Zend/Service/Amazon/Ec2/CloudWatch.php | 357 --- library/Zend/Service/Amazon/Ec2/Ebs.php | 342 -- library/Zend/Service/Amazon/Ec2/Elasticip.php | 158 - library/Zend/Service/Amazon/Ec2/Exception.php | 51 - library/Zend/Service/Amazon/Ec2/Image.php | 333 -- library/Zend/Service/Amazon/Ec2/Instance.php | 532 ---- .../Service/Amazon/Ec2/Instance/Reserved.php | 143 - .../Service/Amazon/Ec2/Instance/Windows.php | 195 -- library/Zend/Service/Amazon/Ec2/Keypair.php | 137 - library/Zend/Service/Amazon/Ec2/Region.php | 77 - library/Zend/Service/Amazon/Ec2/Response.php | 164 - .../Service/Amazon/Ec2/Securitygroups.php | 301 -- .../Zend/Service/Amazon/EditorialReview.php | 58 - library/Zend/Service/Amazon/Exception.php | 35 - library/Zend/Service/Amazon/Image.php | 69 - library/Zend/Service/Amazon/Item.php | 272 -- library/Zend/Service/Amazon/ListmaniaList.php | 58 - library/Zend/Service/Amazon/Offer.php | 111 - library/Zend/Service/Amazon/OfferSet.php | 118 - library/Zend/Service/Amazon/Query.php | 98 - library/Zend/Service/Amazon/ResultSet.php | 170 - library/Zend/Service/Amazon/S3.php | 1015 ------ library/Zend/Service/Amazon/S3/Exception.php | 37 - library/Zend/Service/Amazon/S3/Stream.php | 503 --- .../Zend/Service/Amazon/SimilarProduct.php | 61 - library/Zend/Service/Amazon/SimpleDb.php | 579 ---- .../Service/Amazon/SimpleDb/Attribute.php | 108 - .../Service/Amazon/SimpleDb/Exception.php | 66 - library/Zend/Service/Amazon/SimpleDb/Page.php | 124 - .../Zend/Service/Amazon/SimpleDb/Response.php | 190 -- library/Zend/Service/Amazon/Sqs.php | 542 ---- library/Zend/Service/Amazon/Sqs/Exception.php | 38 - library/Zend/Service/Audioscrobbler.php | 689 ----- library/Zend/Service/Console/Command.php | 413 --- .../Console/Command/ParameterSource/Argv.php | 71 - .../Command/ParameterSource/ConfigFile.php | 104 - .../Console/Command/ParameterSource/Env.php | 75 - .../ParameterSourceInterface.php | 43 - .../Command/ParameterSource/Prompt.php | 66 - .../Console/Command/ParameterSource/StdIn.php | 81 - library/Zend/Service/Console/Exception.php | 39 - library/Zend/Service/Delicious.php | 618 ---- library/Zend/Service/Delicious/Exception.php | 39 - library/Zend/Service/Delicious/Post.php | 292 -- library/Zend/Service/Delicious/PostList.php | 300 -- library/Zend/Service/Delicious/SimplePost.php | 123 - library/Zend/Service/Ebay/Abstract.php | 309 -- library/Zend/Service/Ebay/Exception.php | 37 - library/Zend/Service/Ebay/Finding.php | 424 --- .../Zend/Service/Ebay/Finding/Abstract.php | 169 - library/Zend/Service/Ebay/Finding/Aspect.php | 68 - .../Finding/Aspect/Histogram/Container.php | 106 - .../Ebay/Finding/Aspect/Histogram/Value.php | 56 - .../Finding/Aspect/Histogram/Value/Set.php | 57 - .../Zend/Service/Ebay/Finding/Aspect/Set.php | 57 - .../Zend/Service/Ebay/Finding/Category.php | 73 - .../Ebay/Finding/Category/Histogram.php | 77 - .../Finding/Category/Histogram/Container.php | 66 - .../Ebay/Finding/Category/Histogram/Set.php | 57 - .../Zend/Service/Ebay/Finding/Error/Data.php | 158 - .../Service/Ebay/Finding/Error/Data/Set.php | 57 - .../Service/Ebay/Finding/Error/Message.php | 60 - .../Zend/Service/Ebay/Finding/Exception.php | 37 - .../Zend/Service/Ebay/Finding/ListingInfo.php | 211 -- .../Service/Ebay/Finding/PaginationOutput.php | 115 - .../Ebay/Finding/Response/Abstract.php | 185 -- .../Ebay/Finding/Response/Histograms.php | 86 - .../Service/Ebay/Finding/Response/Items.php | 249 -- .../Ebay/Finding/Response/Keywords.php | 78 - .../Zend/Service/Ebay/Finding/Search/Item.php | 394 --- .../Service/Ebay/Finding/Search/Item/Set.php | 57 - .../Service/Ebay/Finding/Search/Result.php | 63 - .../Zend/Service/Ebay/Finding/SellerInfo.php | 144 - .../Service/Ebay/Finding/SellingStatus.php | 130 - .../Service/Ebay/Finding/Set/Abstract.php | 128 - .../Service/Ebay/Finding/ShippingInfo.php | 126 - .../Zend/Service/Ebay/Finding/Storefront.php | 73 - library/Zend/Service/Exception.php | 37 - library/Zend/Service/Flickr.php | 624 ---- library/Zend/Service/Flickr/Image.php | 76 - library/Zend/Service/Flickr/Result.php | 195 -- library/Zend/Service/Flickr/ResultSet.php | 188 -- library/Zend/Service/LiveDocx.php | 414 --- library/Zend/Service/LiveDocx/Exception.php | 39 - library/Zend/Service/LiveDocx/MailMerge.php | 1138 ------- library/Zend/Service/Rackspace/Abstract.php | 392 --- library/Zend/Service/Rackspace/Exception.php | 36 - library/Zend/Service/Rackspace/Files.php | 727 ----- .../Service/Rackspace/Files/Container.php | 405 --- .../Service/Rackspace/Files/ContainerList.php | 221 -- .../Service/Rackspace/Files/Exception.php | 36 - .../Zend/Service/Rackspace/Files/Object.php | 312 -- .../Service/Rackspace/Files/ObjectList.php | 237 -- library/Zend/Service/Rackspace/Servers.php | 1281 -------- .../Service/Rackspace/Servers/Exception.php | 36 - .../Zend/Service/Rackspace/Servers/Image.php | 209 -- .../Service/Rackspace/Servers/ImageList.php | 234 -- .../Zend/Service/Rackspace/Servers/Server.php | 325 -- .../Service/Rackspace/Servers/ServerList.php | 235 -- .../Rackspace/Servers/SharedIpGroup.php | 165 - .../Rackspace/Servers/SharedIpGroupList.php | 234 -- library/Zend/Service/ReCaptcha.php | 502 --- library/Zend/Service/ReCaptcha/Exception.php | 36 - library/Zend/Service/ReCaptcha/MailHide.php | 351 --- .../Service/ReCaptcha/MailHide/Exception.php | 36 - library/Zend/Service/ReCaptcha/Response.php | 164 - .../Service/ShortUrl/AbstractShortener.php | 83 - library/Zend/Service/ShortUrl/BitLy.php | 167 - library/Zend/Service/ShortUrl/Exception.php | 32 - library/Zend/Service/ShortUrl/IsGd.php | 96 - library/Zend/Service/ShortUrl/JdemCz.php | 84 - library/Zend/Service/ShortUrl/MetamarkNet.php | 85 - library/Zend/Service/ShortUrl/Shortener.php | 45 - library/Zend/Service/ShortUrl/TinyUrlCom.php | 100 - library/Zend/Service/SlideShare.php | 676 ---- library/Zend/Service/SlideShare/Exception.php | 38 - library/Zend/Service/SlideShare/SlideShow.php | 464 --- library/Zend/Service/SqlAzure/Exception.php | 35 - .../Service/SqlAzure/Management/Client.php | 612 ---- .../Service/SqlAzure/Management/Exception.php | 35 - .../Management/FirewallRuleInstance.php | 57 - .../SqlAzure/Management/ServerInstance.php | 59 - .../Management/ServiceEntityAbstract.php | 67 - library/Zend/Service/StrikeIron.php | 92 - library/Zend/Service/StrikeIron/Base.php | 274 -- library/Zend/Service/StrikeIron/Decorator.php | 143 - library/Zend/Service/StrikeIron/Exception.php | 36 - .../Service/StrikeIron/SalesUseTaxBasic.php | 45 - .../StrikeIron/USAddressVerification.php | 45 - .../Zend/Service/StrikeIron/ZipCodeInfo.php | 45 - library/Zend/Service/Twitter.php | 1307 -------- library/Zend/Service/Twitter/Exception.php | 37 - library/Zend/Service/Twitter/Response.php | 179 -- .../WindowsAzure/CommandLine/Certificate.php | 180 -- .../WindowsAzure/CommandLine/Deployment.php | 585 ---- .../CommandLine/GetAsynchronousOperation.php | 98 - .../WindowsAzure/CommandLine/Package.php | 205 -- .../PackageScaffolderAbstract.php | 251 -- .../Scaffolders/DefaultScaffolder.phar | Bin 4404199 -> 0 bytes .../Scaffolders/DefaultScaffolder/build.bat | 1 - .../Scaffolders/DefaultScaffolder/index.php | 63 - .../resources/PhpOnAzure.Web/Web.config | 20 - .../bin/add-environment-variables.cmd | 7 - .../bin/add-environment-variables.ps1 | 15 - .../PhpOnAzure.Web/bin/install-php.cmd | 12 - .../PhpOnAzure.Web/diagnostics.wadcfg | 35 - .../WebPICmdLine/Microsoft.Web.Deployment.dll | Bin 1201991 -> 0 bytes .../Microsoft.Web.PlatformInstaller.UI.dll | Bin 546620 -> 0 bytes .../Microsoft.Web.PlatformInstaller.dll | Bin 333658 -> 0 bytes .../resources/WebPICmdLine/WebpiCmdLine.exe | Bin 94461 -> 0 bytes .../resources/WebPICmdLine/license.rtf | 41 - .../resources/ServiceConfiguration.cscfg | 9 - .../resources/ServiceDefinition.csdef | 24 - .../WindowsAzure/CommandLine/Service.php | 201 -- .../WindowsAzure/CommandLine/Storage.php | 198 -- .../Credentials/CredentialsAbstract.php | 235 -- .../WindowsAzure/Credentials/Exception.php | 35 - .../Credentials/SharedAccessSignature.php | 298 -- .../WindowsAzure/Credentials/SharedKey.php | 173 -- .../Credentials/SharedKeyLite.php | 152 - .../Diagnostics/ConfigurationDataSources.php | 81 - ...figurationDiagnosticInfrastructureLogs.php | 53 - .../Diagnostics/ConfigurationDirectories.php | 85 - .../Diagnostics/ConfigurationInstance.php | 220 -- .../Diagnostics/ConfigurationLogs.php | 62 - .../ConfigurationObjectBaseAbstract.php | 66 - .../ConfigurationPerformanceCounters.php | 85 - .../ConfigurationWindowsEventLog.php | 76 - .../DirectoryConfigurationSubscription.php | 53 - .../WindowsAzure/Diagnostics/Exception.php | 35 - .../WindowsAzure/Diagnostics/LogLevel.php | 39 - .../WindowsAzure/Diagnostics/Manager.php | 221 -- .../PerformanceCounterSubscription.php | 54 - .../Zend/Service/WindowsAzure/Exception.php | 35 - .../Service/WindowsAzure/Log/Exception.php | 38 - .../Log/Formatter/WindowsAzure.php | 73 - .../WindowsAzure/Log/Writer/WindowsAzure.php | 196 -- .../Management/AffinityGroupInstance.php | 66 - .../Management/CertificateInstance.php | 60 - .../WindowsAzure/Management/Client.php | 2426 --------------- .../Management/DeploymentInstance.php | 90 - .../WindowsAzure/Management/Exception.php | 38 - .../Management/HostedServiceInstance.php | 69 - .../Management/LocationInstance.php | 51 - .../OperatingSystemFamilyInstance.php | 57 - .../Management/OperatingSystemInstance.php | 66 - .../Management/OperationStatusInstance.php | 60 - .../Management/ServiceEntityAbstract.php | 67 - .../Management/StorageServiceInstance.php | 66 - .../SubscriptionOperationInstance.php | 77 - .../WindowsAzure/RetryPolicy/Exception.php | 36 - .../WindowsAzure/RetryPolicy/NoRetry.php | 58 - .../WindowsAzure/RetryPolicy/RetryN.php | 88 - .../RetryPolicy/RetryPolicyAbstract.php | 72 - .../Service/WindowsAzure/SessionHandler.php | 324 -- library/Zend/Service/WindowsAzure/Storage.php | 564 ---- .../Service/WindowsAzure/Storage/Batch.php | 241 -- .../Storage/BatchStorageAbstract.php | 174 -- .../Service/WindowsAzure/Storage/Blob.php | 2142 ------------- .../WindowsAzure/Storage/Blob/Stream.php | 544 ---- .../WindowsAzure/Storage/BlobContainer.php | 90 - .../WindowsAzure/Storage/BlobInstance.php | 93 - .../Storage/DynamicTableEntity.php | 219 -- .../WindowsAzure/Storage/LeaseInstance.php | 60 - .../Storage/PageRegionInstance.php | 54 - .../Service/WindowsAzure/Storage/Queue.php | 592 ---- .../WindowsAzure/Storage/QueueInstance.php | 56 - .../WindowsAzure/Storage/QueueMessage.php | 69 - .../WindowsAzure/Storage/SignedIdentifier.php | 60 - .../Storage/StorageEntityAbstract.php | 67 - .../Service/WindowsAzure/Storage/Table.php | 931 ------ .../WindowsAzure/Storage/TableEntity.php | 354 --- .../WindowsAzure/Storage/TableEntityQuery.php | 351 --- .../WindowsAzure/Storage/TableInstance.php | 60 - library/Zend/Service/Yahoo.php | 951 ------ library/Zend/Service/Yahoo/Image.php | 71 - library/Zend/Service/Yahoo/ImageResult.php | 111 - library/Zend/Service/Yahoo/ImageResultSet.php | 63 - .../Zend/Service/Yahoo/InlinkDataResult.php | 58 - .../Service/Yahoo/InlinkDataResultSet.php | 62 - library/Zend/Service/Yahoo/LocalResult.php | 124 - library/Zend/Service/Yahoo/LocalResultSet.php | 84 - library/Zend/Service/Yahoo/NewsResult.php | 112 - library/Zend/Service/Yahoo/NewsResultSet.php | 63 - library/Zend/Service/Yahoo/PageDataResult.php | 58 - .../Zend/Service/Yahoo/PageDataResultSet.php | 62 - library/Zend/Service/Yahoo/Result.php | 126 - library/Zend/Service/Yahoo/ResultSet.php | 195 -- library/Zend/Service/Yahoo/VideoResult.php | 132 - library/Zend/Service/Yahoo/VideoResultSet.php | 63 - library/Zend/Service/Yahoo/WebResult.php | 109 - library/Zend/Service/Yahoo/WebResultSet.php | 63 - tests/Zend/Service/AkismetTest.php | 234 -- tests/Zend/Service/AllTests.php | 92 - tests/Zend/Service/Amazon/AbstractTest.php | 111 - tests/Zend/Service/Amazon/AllTests.php | 86 - .../Amazon/Authentication/AllTests.php | 81 - .../Service/Amazon/Authentication/S3Test.php | 180 -- .../Service/Amazon/Authentication/V1Test.php | 79 - .../Service/Amazon/Authentication/V2Test.php | 96 - .../Authentication/_files/ec2_v2_return.txt | 4 - .../_files/sqs_v2_get_return.txt | 4 - .../Zend/Service/Amazon/Ec2/AbstractTest.php | 106 - tests/Zend/Service/Amazon/Ec2/AllTests.php | 89 - .../Amazon/Ec2/AvailabilityzonesTest.php | 143 - .../Service/Amazon/Ec2/CloudWatchTest.php | 318 -- tests/Zend/Service/Amazon/Ec2/EbsTest.php | 580 ---- tests/Zend/Service/Amazon/Ec2/Ec2Test.php | 99 - .../Zend/Service/Amazon/Ec2/ElasticipTest.php | 247 -- tests/Zend/Service/Amazon/Ec2/ImageTest.php | 620 ---- .../Amazon/Ec2/InstanceReservedTest.php | 200 -- .../Zend/Service/Amazon/Ec2/InstanceTest.php | 727 ----- .../Amazon/Ec2/InstanceWindowsTest.php | 247 -- tests/Zend/Service/Amazon/Ec2/KeypairTest.php | 262 -- tests/Zend/Service/Amazon/Ec2/RegionTest.php | 151 - .../Service/Amazon/Ec2/SecuritygroupsTest.php | 480 --- tests/Zend/Service/Amazon/OfflineTest.php | 372 --- tests/Zend/Service/Amazon/OnlineTest.php | 352 --- tests/Zend/Service/Amazon/S3/AllTests.php | 80 - tests/Zend/Service/Amazon/S3/OfflineTest.php | 44 - tests/Zend/Service/Amazon/S3/OnlineTest.php | 545 ---- tests/Zend/Service/Amazon/S3/StreamTest.php | 277 -- tests/Zend/Service/Amazon/S3/_files/testdata | 1 - .../Service/Amazon/S3/_files/testdata.html | 3 - .../Zend/Service/Amazon/SimpleDb/AllTests.php | 88 - .../Service/Amazon/SimpleDb/OfflineTest.php | 40 - .../Service/Amazon/SimpleDb/OnlineTest.php | 512 --- .../Zend/Service/Amazon/SimpleDb/PageTest.php | 109 - tests/Zend/Service/Amazon/Sqs/AllTests.php | 79 - tests/Zend/Service/Amazon/Sqs/OfflineTest.php | 96 - tests/Zend/Service/Amazon/Sqs/OnlineTest.php | 132 - .../Amazon/_files/amazon-response-invalid.xml | 1 - .../Amazon/_files/amazon-response-valid.xml | 1 - .../Service/Amazon/_files/mozart_result.xml | 1504 --------- .../Amazon/_files/offers_with_names.xml | 602 ---- .../Service/Audioscrobbler/AlbumDataTest.php | 125 - .../Zend/Service/Audioscrobbler/AllTests.php | 66 - .../Service/Audioscrobbler/ArtistTest.php | 215 -- .../Audioscrobbler/AudioscrobblerTest.php | 112 - .../Audioscrobbler/AudioscrobblerTestCase.php | 79 - .../Zend/Service/Audioscrobbler/GroupTest.php | 296 -- .../Service/Audioscrobbler/ProfileTest.php | 635 ---- .../Service/Audioscrobbler/TagDataTest.php | 167 - .../Service/Audioscrobbler/TrackDataTest.php | 108 - .../Audioscrobbler/_files/errorNoUserExists | 13 - .../_files/errorResponseStatusError | 18 - tests/Zend/Service/Delicious/AllTests.php | 87 - tests/Zend/Service/Delicious/PostTest.php | 227 -- .../Service/Delicious/PrivateDataTest.php | 246 -- .../Zend/Service/Delicious/PublicDataTest.php | 162 - .../Zend/Service/Delicious/SimplePostTest.php | 153 - tests/Zend/Service/Delicious/SkipTests.php | 43 - tests/Zend/Service/Ebay/AbstractTest.php | 200 -- tests/Zend/Service/Ebay/AllTests.php | 61 - tests/Zend/Service/Ebay/Finding/AllTests.php | 66 - .../Zend/Service/Ebay/Finding/OfflineTest.php | 365 --- .../Zend/Service/Ebay/Finding/OnlineTest.php | 193 -- .../Ebay/Finding/_files/ClientCustom.php | 3 - .../Service/Ebay/Finding/_files/error.xml | 1 - .../Finding/_files/find-items-advanced.xml | 1 - .../get-search-keywords-recomendation.xml | 1 - .../Ebay/Finding/_files/histogram-aspect.xml | 1 - .../Finding/_files/histogram-category.xml | 1 - tests/Zend/Service/Ebay/_files/Concrete.php | 39 - tests/Zend/Service/Flickr/AllTests.php | 74 - tests/Zend/Service/Flickr/OfflineTest.php | 568 ---- tests/Zend/Service/Flickr/OnlineTest.php | 232 -- ...olGetPhotosBasic-result_427883923.response | 16 - ...olGetPhotosBasic-result_427883924.response | 17 - ...olGetPhotosBasic-result_427883929.response | 16 - ...olGetPhotosBasic-result_427883930.response | 15 - ...olGetPhotosBasic-result_427884394.response | 15 - ...olGetPhotosBasic-result_427884398.response | 17 - ...olGetPhotosBasic-result_427884401.response | 17 - ...olGetPhotosBasic-result_427884403.response | 15 - ...olGetPhotosBasic-result_427887192.response | 15 - ...olGetPhotosBasic-result_428222530.response | 17 - .../testGroupPoolGetPhotosBasic.response | 22 - ...lGetPhotosExceptionGroupIdInvalid.response | 11 - ...stTagSearchBasic-result_427883923.response | 16 - ...stTagSearchBasic-result_427883924.response | 17 - ...stTagSearchBasic-result_427883929.response | 16 - ...stTagSearchBasic-result_427883930.response | 15 - ...stTagSearchBasic-result_427884394.response | 15 - ...stTagSearchBasic-result_427884398.response | 17 - ...stTagSearchBasic-result_427884401.response | 17 - ...stTagSearchBasic-result_427884403.response | 15 - ...stTagSearchBasic-result_427887192.response | 15 - ...stTagSearchBasic-result_428222530.response | 17 - .../Flickr/_files/testTagSearchBasic.response | 22 - ...stUserSearchExceptionEmailInvalid.response | 11 - ...serSearchExceptionUsernameInvalid.response | 11 - tests/Zend/Service/LiveDocx/AllTests.php | 62 - tests/Zend/Service/LiveDocx/LiveDocxTest.php | 97 - .../Service/LiveDocx/MailMerge/image-01.png | Bin 177 -> 0 bytes .../Service/LiveDocx/MailMerge/image-02.png | Bin 204 -> 0 bytes .../phpunit-template-block-fields.doc | Bin 20992 -> 0 bytes .../LiveDocx/MailMerge/phpunit-template.docx | Bin 47773 -> 0 bytes tests/Zend/Service/LiveDocx/MailMergeTest.php | 709 ----- tests/Zend/Service/Rackspace/AllTests.php | 62 - .../Zend/Service/Rackspace/Files/AllTests.php | 57 - .../Service/Rackspace/Files/OfflineTest.php | 377 --- .../Service/Rackspace/Files/OnlineTest.php | 264 -- .../Files/_files/testCopyObject.request | 10 - .../Files/_files/testCopyObject.response | 18 - .../Files/_files/testCreateContainer.request | 10 - .../Files/_files/testCreateContainer.response | 12 - .../Files/_files/testDeleteContainer.request | 8 - .../Files/_files/testDeleteContainer.response | 7 - .../Files/_files/testDeleteObject.request | 8 - .../Files/_files/testDeleteObject.response | 7 - .../Files/_files/testDeleteObject2.request | 8 - .../Files/_files/testDeleteObject2.response | 7 - .../_files/testEnableCdnContainer.request | 9 - .../_files/testEnableCdnContainer.response | 10 - .../Files/_files/testGetCdnContainers.request | 7 - .../_files/testGetCdnContainers.response | 11 - .../Files/_files/testGetCdnTtl.response | 13 - .../Files/_files/testGetCdnUri.response | 13 - .../Files/_files/testGetCdnUriSSl.response | 13 - .../Files/_files/testGetContainer.request | 7 - .../Files/_files/testGetContainer.response | 11 - .../Files/_files/testGetContainers.request | 7 - .../Files/_files/testGetContainers.response | 12 - .../_files/testGetCountContainers.request | 7 - .../_files/testGetCountContainers.response | 10 - .../Files/_files/testGetCountObjects.request | 7 - .../Files/_files/testGetCountObjects.response | 10 - .../Files/_files/testGetInfoAccount.request | 7 - .../Files/_files/testGetInfoAccount.response | 10 - .../_files/testGetInfoCdnContainer.response | 13 - .../_files/testGetMetadataContainer.request | 7 - .../_files/testGetMetadataContainer.response | 11 - .../_files/testGetMetadataObject.request | 7 - .../_files/testGetMetadataObject.response | 11 - .../Files/_files/testGetObject.request | 7 - .../Files/_files/testGetObject.response | 13 - .../Files/_files/testGetObjects.request | 7 - .../Files/_files/testGetObjects.response | 13 - .../_files/testGetObjectsPseudoDirs.response | 12 - .../_files/testGetSizeContainers.request | 7 - .../_files/testGetSizeContainers.response | 10 - .../_files/testSetMetadataObject.request | 9 - .../_files/testSetMetadataObject.response | 12 - .../Files/_files/testStoreObject.request | 14 - .../Files/_files/testStoreObject.response | 14 - .../_files/testUpdateCdnContainer.request | 9 - .../_files/testUpdateCdnContainer.response | 10 - tests/Zend/Service/Rackspace/OfflineTest.php | 187 -- .../Service/Rackspace/Servers/AllTests.php | 57 - .../Service/Rackspace/Servers/OfflineTest.php | 384 --- .../Service/Rackspace/Servers/OnlineTest.php | 409 --- .../Service/Rackspace/Servers/_files/test.txt | 1 - .../Servers/_files/testAuthentication.request | 8 - .../_files/testAuthentication.response | 14 - .../_files/testChangeBackupSchedule.request | 8 - .../_files/testChangeBackupSchedule.response | 11 - .../_files/testChangeServerName.request | 10 - .../_files/testChangeServerName.response | 11 - .../_files/testChangeServerPassword.request | 10 - .../_files/testChangeServerPassword.response | 11 - .../_files/testConfirmResizeServer.request | 10 - .../_files/testConfirmResizeServer.response | 12 - .../Servers/_files/testCreateImage.request | 10 - .../Servers/_files/testCreateImage.response | 14 - .../Servers/_files/testCreateServer.request | 7 - .../Servers/_files/testCreateServer.response | 16 - .../_files/testCreateSharedIpGroup.request | 10 - .../_files/testCreateSharedIpGroup.response | 14 - .../Servers/_files/testDeleteImage.request | 8 - .../Servers/_files/testDeleteImage.response | 11 - .../Servers/_files/testDeleteServer.request | 8 - .../Servers/_files/testDeleteServer.response | 12 - .../_files/testDeleteSharedIpGroup.request | 8 - .../_files/testDeleteSharedIpGroup.response | 11 - .../_files/testDisableBackupSchedule.request | 8 - .../_files/testDisableBackupSchedule.response | 11 - .../_files/testGetBackupSchedule.request | 8 - .../_files/testGetBackupSchedule.response | 11 - .../Servers/_files/testGetFlavor.request | 7 - .../Servers/_files/testGetFlavor.response | 16 - .../Servers/_files/testGetImage.request | 7 - .../Servers/_files/testGetImage.response | 16 - .../Servers/_files/testGetImageInfo.request | 7 - .../Servers/_files/testGetImageInfo.response | 16 - .../Servers/_files/testGetServer.request | 7 - .../Servers/_files/testGetServer.response | 16 - .../Servers/_files/testGetServerIp.request | 7 - .../Servers/_files/testGetServerIp.response | 16 - .../_files/testGetServerPrivateIp.request | 7 - .../_files/testGetServerPrivateIp.response | 16 - .../_files/testGetServerPublicIp.request | 7 - .../_files/testGetServerPublicIp.response | 16 - .../_files/testGetSharedIpGroup.request | 7 - .../_files/testGetSharedIpGroup.response | 16 - .../_files/testHardRebootServer.request | 7 - .../_files/testHardRebootServer.response | 16 - .../Servers/_files/testListFlavors.request | 7 - .../Servers/_files/testListFlavors.response | 16 - .../Servers/_files/testListImages.request | 7 - .../Servers/_files/testListImages.response | 16 - .../Servers/_files/testListServers.request | 7 - .../Servers/_files/testListServers.response | 16 - .../_files/testListSharedIpGroups.request | 7 - .../_files/testListSharedIpGroups.response | 16 - .../Servers/_files/testRebuildServer.request | 10 - .../Servers/_files/testRebuildServer.response | 12 - .../_files/testRechangeServerName.request | 10 - .../_files/testRechangeServerName.response | 11 - .../Servers/_files/testResizeServer.request | 10 - .../Servers/_files/testResizeServer.response | 12 - .../_files/testRevertResizeServer.request | 10 - .../_files/testRevertResizeServer.response | 12 - .../_files/testSoftRebootServer.request | 7 - .../_files/testSoftRebootServer.response | 16 - .../_files/testAuthenticate.response | 11 - .../_files/testAuthenticateError.response | 8 - tests/Zend/Service/ReCaptcha/AllTests.php | 84 - tests/Zend/Service/ReCaptcha/MailHideTest.php | 142 - .../Zend/Service/ReCaptcha/ReCaptchaTest.php | 281 -- tests/Zend/Service/ReCaptcha/ResponseTest.php | 124 - tests/Zend/Service/ShortUrl/AllTests.php | 83 - tests/Zend/Service/ShortUrl/BitLyTest.php | 116 - tests/Zend/Service/ShortUrl/IsGdTest.php | 113 - tests/Zend/Service/ShortUrl/JdemCzTest.php | 109 - .../Zend/Service/ShortUrl/MetamarkNetTest.php | 110 - .../Zend/Service/ShortUrl/TinyUrlComTest.php | 109 - tests/Zend/Service/SlideShare/_files/demo.ppt | Bin 267264 -> 0 bytes tests/Zend/Service/SlideShareTest.php | 272 -- tests/Zend/Service/SqlAzure/AllTests.php | 63 - .../Service/SqlAzure/Management/AllTests.php | 60 - .../Management/ManagementClientTest.php | 137 - .../SqlAzure/Management/_files/management.cer | Bin 1204 -> 0 bytes .../SqlAzure/Management/_files/management.pem | 89 - .../SqlAzure/Management/_files/management.pfx | Bin 4146 -> 0 bytes tests/Zend/Service/StrikeIron/AllTests.php | 76 - tests/Zend/Service/StrikeIron/BaseTest.php | 297 -- .../Zend/Service/StrikeIron/DecoratorTest.php | 107 - .../Zend/Service/StrikeIron/ExceptionTest.php | 45 - tests/Zend/Service/StrikeIron/NoSoapTest.php | 64 - .../StrikeIron/SalesUseTaxBasicTest.php | 69 - .../Service/StrikeIron/StrikeIronTest.php | 116 - .../StrikeIron/USAddressVerificationTest.php | 69 - .../Service/StrikeIron/ZipCodeInfoTest.php | 70 - tests/Zend/Service/Twitter/AllTests.php | 68 - tests/Zend/Service/Twitter/TwitterTest.php | 579 ---- .../_files/account.verify_credentials.json | 60 - .../_files/application.rate_limit_status.json | 110 - .../Twitter/_files/blocks.create.twitter.json | 45 - .../_files/blocks.destroy.twitter.json | 45 - .../Service/Twitter/_files/blocks.ids.json | 14 - .../Service/Twitter/_files/blocks.list.json | 908 ------ .../Twitter/_files/favorites.create.json | 70 - .../Twitter/_files/favorites.destroy.json | 70 - .../Twitter/_files/favorites.list.json | 1192 ------- .../_files/friendships.create.twitter.json | 87 - .../_files/friendships.destroy.twitter.json | 87 - .../Service/Twitter/_files/search.tweets.json | 1887 ------------ .../Twitter/_files/statuses.destroy.json | 74 - .../_files/statuses.home_timeline.page.json | 2739 ----------------- .../_files/statuses.mentions_timeline.json | 2280 -------------- .../Twitter/_files/statuses.sample.json | 1534 --------- .../Service/Twitter/_files/statuses.show.json | 89 - .../Twitter/_files/statuses.update.json | 89 - .../_files/statuses.user_timeline.mwop.json | 2454 --------------- .../Service/Twitter/_files/users.search.json | 2429 --------------- .../Twitter/_files/users.show.mwop.json | 89 - tests/Zend/Service/WindowsAzure/AllTests.php | 104 - .../WindowsAzure/BlobSessionHandlerTest.php | 207 -- .../BlobStorageSharedAccessTest.php | 222 -- .../Service/WindowsAzure/BlobStorageTest.php | 866 ------ .../Service/WindowsAzure/BlobStreamTest.php | 313 -- .../WindowsAzure/Credentials/AllTests.php | 65 - .../Credentials/SharedAccessSignatureTest.php | 142 - .../Credentials/SharedKeyLiteTest.php | 170 - .../Credentials/SharedKeyTest.php | 170 - .../WindowsAzure/Diagnostics/AllTests.php | 61 - .../WindowsAzure/Diagnostics/ManagerTest.php | 191 -- .../WindowsAzure/DynamicTableEntityTest.php | 188 -- .../WindowsAzure/Management/AllTests.php | 60 - .../Management/ManagementClientTest.php | 189 -- .../Management/_files/PhpOnAzure.cspkg | Bin 2243138 -> 0 bytes .../_files/ServiceConfiguration.cscfg | 8 - .../Management/_files/management.cer | Bin 1204 -> 0 bytes .../Management/_files/management.pem | 89 - .../Management/_files/management.pfx | Bin 4146 -> 0 bytes .../Service/WindowsAzure/QueueStorageTest.php | 393 --- .../Service/WindowsAzure/RetryPolicyTest.php | 118 - .../WindowsAzure/SessionHandlerTest.php | 234 -- .../Zend/Service/WindowsAzure/StorageTest.php | 74 - .../WindowsAzure/TableEntityQueryTest.php | 188 -- .../Service/WindowsAzure/TableEntityTest.php | 154 - .../WindowsAzure/TableSessionHandlerTest.php | 292 -- .../Service/WindowsAzure/TableStorageTest.php | 933 ------ .../WindowsAzure/_files/WindowsAzure.gif | Bin 4171 -> 0 bytes tests/Zend/Service/Yahoo/AllTests.php | 75 - tests/Zend/Service/Yahoo/OfflineTest.php | 552 ---- tests/Zend/Service/Yahoo/OnlineTest.php | 384 --- 607 files changed, 93881 deletions(-) delete mode 100644 demos/Zend/Service/LiveDocx/Helper.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/bitmaps/generate-bitmaps.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template-screenshot.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template.docx delete mode 100644 demos/Zend/Service/LiveDocx/MailMerge/conference-pass/dailemaitre.jpg delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/conference-pass/generate-document.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/conference-pass/template.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/constructors/credentials.ini delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/constructors/hosted-licensed.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/constructors/public-zend_config.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/constructors/public.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/convert/convert-document.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/convert/document.doc delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/delete-all.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/download.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/image-1.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/image-2.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/image-exists.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/list.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/images/upload.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document-concat.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template-screenshot.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/metafiles/generate-metafiles.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/metafiles/template-screenshot.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/metafiles/template.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/pdf-security/generate-document.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/pdf-security/template.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/supported-fonts/show-supported-fonts-cached.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/supported-fonts/show-supported-fonts.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats-cached.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/generate-document.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template-screenshot.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template.doc delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/template-info/list-template-info.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field-screenshot.png delete mode 100644 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.doc delete mode 100644 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields-screenshot.png delete mode 100644 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields.doc delete mode 100644 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-block-fields-screenshot.png delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/template-info/template-block-fields.doc delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/delete-all.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/download.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/list.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/template-1.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/template-2.docx delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/template-exists.php delete mode 100755 demos/Zend/Service/LiveDocx/MailMerge/templates/upload.php delete mode 100755 demos/Zend/Service/LiveDocx/check-environment.php delete mode 100755 demos/Zend/Service/LiveDocx/common.php delete mode 100755 demos/Zend/Service/LiveDocx/configuration.php.dist delete mode 100644 library/Zend/Service/Abstract.php delete mode 100644 library/Zend/Service/Akismet.php delete mode 100644 library/Zend/Service/Amazon.php delete mode 100644 library/Zend/Service/Amazon/Abstract.php delete mode 100644 library/Zend/Service/Amazon/Accessories.php delete mode 100644 library/Zend/Service/Amazon/Authentication.php delete mode 100644 library/Zend/Service/Amazon/Authentication/Exception.php delete mode 100644 library/Zend/Service/Amazon/Authentication/S3.php delete mode 100644 library/Zend/Service/Amazon/Authentication/V1.php delete mode 100644 library/Zend/Service/Amazon/Authentication/V2.php delete mode 100644 library/Zend/Service/Amazon/CustomerReview.php delete mode 100644 library/Zend/Service/Amazon/Ec2.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Abstract.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Availabilityzones.php delete mode 100644 library/Zend/Service/Amazon/Ec2/CloudWatch.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Ebs.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Elasticip.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Exception.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Image.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Instance.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Instance/Reserved.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Instance/Windows.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Keypair.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Region.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Response.php delete mode 100644 library/Zend/Service/Amazon/Ec2/Securitygroups.php delete mode 100644 library/Zend/Service/Amazon/EditorialReview.php delete mode 100755 library/Zend/Service/Amazon/Exception.php delete mode 100644 library/Zend/Service/Amazon/Image.php delete mode 100644 library/Zend/Service/Amazon/Item.php delete mode 100644 library/Zend/Service/Amazon/ListmaniaList.php delete mode 100644 library/Zend/Service/Amazon/Offer.php delete mode 100644 library/Zend/Service/Amazon/OfferSet.php delete mode 100644 library/Zend/Service/Amazon/Query.php delete mode 100644 library/Zend/Service/Amazon/ResultSet.php delete mode 100755 library/Zend/Service/Amazon/S3.php delete mode 100755 library/Zend/Service/Amazon/S3/Exception.php delete mode 100755 library/Zend/Service/Amazon/S3/Stream.php delete mode 100644 library/Zend/Service/Amazon/SimilarProduct.php delete mode 100644 library/Zend/Service/Amazon/SimpleDb.php delete mode 100644 library/Zend/Service/Amazon/SimpleDb/Attribute.php delete mode 100644 library/Zend/Service/Amazon/SimpleDb/Exception.php delete mode 100644 library/Zend/Service/Amazon/SimpleDb/Page.php delete mode 100644 library/Zend/Service/Amazon/SimpleDb/Response.php delete mode 100644 library/Zend/Service/Amazon/Sqs.php delete mode 100644 library/Zend/Service/Amazon/Sqs/Exception.php delete mode 100644 library/Zend/Service/Audioscrobbler.php delete mode 100644 library/Zend/Service/Console/Command.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/Argv.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/ConfigFile.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/Env.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/ParameterSourceInterface.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/Prompt.php delete mode 100644 library/Zend/Service/Console/Command/ParameterSource/StdIn.php delete mode 100644 library/Zend/Service/Console/Exception.php delete mode 100644 library/Zend/Service/Delicious.php delete mode 100644 library/Zend/Service/Delicious/Exception.php delete mode 100644 library/Zend/Service/Delicious/Post.php delete mode 100644 library/Zend/Service/Delicious/PostList.php delete mode 100644 library/Zend/Service/Delicious/SimplePost.php delete mode 100644 library/Zend/Service/Ebay/Abstract.php delete mode 100644 library/Zend/Service/Ebay/Exception.php delete mode 100644 library/Zend/Service/Ebay/Finding.php delete mode 100644 library/Zend/Service/Ebay/Finding/Abstract.php delete mode 100644 library/Zend/Service/Ebay/Finding/Aspect.php delete mode 100644 library/Zend/Service/Ebay/Finding/Aspect/Histogram/Container.php delete mode 100644 library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value.php delete mode 100644 library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value/Set.php delete mode 100644 library/Zend/Service/Ebay/Finding/Aspect/Set.php delete mode 100644 library/Zend/Service/Ebay/Finding/Category.php delete mode 100644 library/Zend/Service/Ebay/Finding/Category/Histogram.php delete mode 100644 library/Zend/Service/Ebay/Finding/Category/Histogram/Container.php delete mode 100644 library/Zend/Service/Ebay/Finding/Category/Histogram/Set.php delete mode 100644 library/Zend/Service/Ebay/Finding/Error/Data.php delete mode 100644 library/Zend/Service/Ebay/Finding/Error/Data/Set.php delete mode 100644 library/Zend/Service/Ebay/Finding/Error/Message.php delete mode 100644 library/Zend/Service/Ebay/Finding/Exception.php delete mode 100644 library/Zend/Service/Ebay/Finding/ListingInfo.php delete mode 100644 library/Zend/Service/Ebay/Finding/PaginationOutput.php delete mode 100644 library/Zend/Service/Ebay/Finding/Response/Abstract.php delete mode 100644 library/Zend/Service/Ebay/Finding/Response/Histograms.php delete mode 100644 library/Zend/Service/Ebay/Finding/Response/Items.php delete mode 100644 library/Zend/Service/Ebay/Finding/Response/Keywords.php delete mode 100644 library/Zend/Service/Ebay/Finding/Search/Item.php delete mode 100644 library/Zend/Service/Ebay/Finding/Search/Item/Set.php delete mode 100644 library/Zend/Service/Ebay/Finding/Search/Result.php delete mode 100644 library/Zend/Service/Ebay/Finding/SellerInfo.php delete mode 100644 library/Zend/Service/Ebay/Finding/SellingStatus.php delete mode 100644 library/Zend/Service/Ebay/Finding/Set/Abstract.php delete mode 100644 library/Zend/Service/Ebay/Finding/ShippingInfo.php delete mode 100644 library/Zend/Service/Ebay/Finding/Storefront.php delete mode 100644 library/Zend/Service/Exception.php delete mode 100644 library/Zend/Service/Flickr.php delete mode 100644 library/Zend/Service/Flickr/Image.php delete mode 100644 library/Zend/Service/Flickr/Result.php delete mode 100644 library/Zend/Service/Flickr/ResultSet.php delete mode 100644 library/Zend/Service/LiveDocx.php delete mode 100644 library/Zend/Service/LiveDocx/Exception.php delete mode 100644 library/Zend/Service/LiveDocx/MailMerge.php delete mode 100644 library/Zend/Service/Rackspace/Abstract.php delete mode 100644 library/Zend/Service/Rackspace/Exception.php delete mode 100644 library/Zend/Service/Rackspace/Files.php delete mode 100644 library/Zend/Service/Rackspace/Files/Container.php delete mode 100644 library/Zend/Service/Rackspace/Files/ContainerList.php delete mode 100644 library/Zend/Service/Rackspace/Files/Exception.php delete mode 100644 library/Zend/Service/Rackspace/Files/Object.php delete mode 100644 library/Zend/Service/Rackspace/Files/ObjectList.php delete mode 100644 library/Zend/Service/Rackspace/Servers.php delete mode 100644 library/Zend/Service/Rackspace/Servers/Exception.php delete mode 100644 library/Zend/Service/Rackspace/Servers/Image.php delete mode 100644 library/Zend/Service/Rackspace/Servers/ImageList.php delete mode 100644 library/Zend/Service/Rackspace/Servers/Server.php delete mode 100644 library/Zend/Service/Rackspace/Servers/ServerList.php delete mode 100644 library/Zend/Service/Rackspace/Servers/SharedIpGroup.php delete mode 100644 library/Zend/Service/Rackspace/Servers/SharedIpGroupList.php delete mode 100644 library/Zend/Service/ReCaptcha.php delete mode 100644 library/Zend/Service/ReCaptcha/Exception.php delete mode 100644 library/Zend/Service/ReCaptcha/MailHide.php delete mode 100644 library/Zend/Service/ReCaptcha/MailHide/Exception.php delete mode 100644 library/Zend/Service/ReCaptcha/Response.php delete mode 100644 library/Zend/Service/ShortUrl/AbstractShortener.php delete mode 100644 library/Zend/Service/ShortUrl/BitLy.php delete mode 100644 library/Zend/Service/ShortUrl/Exception.php delete mode 100644 library/Zend/Service/ShortUrl/IsGd.php delete mode 100644 library/Zend/Service/ShortUrl/JdemCz.php delete mode 100644 library/Zend/Service/ShortUrl/MetamarkNet.php delete mode 100644 library/Zend/Service/ShortUrl/Shortener.php delete mode 100644 library/Zend/Service/ShortUrl/TinyUrlCom.php delete mode 100644 library/Zend/Service/SlideShare.php delete mode 100644 library/Zend/Service/SlideShare/Exception.php delete mode 100644 library/Zend/Service/SlideShare/SlideShow.php delete mode 100644 library/Zend/Service/SqlAzure/Exception.php delete mode 100644 library/Zend/Service/SqlAzure/Management/Client.php delete mode 100644 library/Zend/Service/SqlAzure/Management/Exception.php delete mode 100644 library/Zend/Service/SqlAzure/Management/FirewallRuleInstance.php delete mode 100644 library/Zend/Service/SqlAzure/Management/ServerInstance.php delete mode 100644 library/Zend/Service/SqlAzure/Management/ServiceEntityAbstract.php delete mode 100644 library/Zend/Service/StrikeIron.php delete mode 100644 library/Zend/Service/StrikeIron/Base.php delete mode 100644 library/Zend/Service/StrikeIron/Decorator.php delete mode 100644 library/Zend/Service/StrikeIron/Exception.php delete mode 100644 library/Zend/Service/StrikeIron/SalesUseTaxBasic.php delete mode 100644 library/Zend/Service/StrikeIron/USAddressVerification.php delete mode 100644 library/Zend/Service/StrikeIron/ZipCodeInfo.php delete mode 100755 library/Zend/Service/Twitter.php delete mode 100755 library/Zend/Service/Twitter/Exception.php delete mode 100644 library/Zend/Service/Twitter/Response.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Certificate.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Deployment.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/GetAsynchronousOperation.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Package.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder.phar delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/build.bat delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/index.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/Web.config delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.cmd delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.ps1 delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/install-php.cmd delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/diagnostics.wadcfg delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.Deployment.dll delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.PlatformInstaller.UI.dll delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.PlatformInstaller.dll delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/WebpiCmdLine.exe delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/license.rtf delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceConfiguration.cscfg delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceDefinition.csdef delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Service.php delete mode 100644 library/Zend/Service/WindowsAzure/CommandLine/Storage.php delete mode 100644 library/Zend/Service/WindowsAzure/Credentials/CredentialsAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/Credentials/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/Credentials/SharedAccessSignature.php delete mode 100644 library/Zend/Service/WindowsAzure/Credentials/SharedKey.php delete mode 100644 library/Zend/Service/WindowsAzure/Credentials/SharedKeyLite.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDataSources.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDiagnosticInfrastructureLogs.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDirectories.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationLogs.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationObjectBaseAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationPerformanceCounters.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationWindowsEventLog.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/DirectoryConfigurationSubscription.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/LogLevel.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/Manager.php delete mode 100644 library/Zend/Service/WindowsAzure/Diagnostics/PerformanceCounterSubscription.php delete mode 100644 library/Zend/Service/WindowsAzure/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/Log/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/Log/Formatter/WindowsAzure.php delete mode 100644 library/Zend/Service/WindowsAzure/Log/Writer/WindowsAzure.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/AffinityGroupInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/CertificateInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/Client.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/DeploymentInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/HostedServiceInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/LocationInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/OperatingSystemFamilyInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/OperatingSystemInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/OperationStatusInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/ServiceEntityAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/StorageServiceInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Management/SubscriptionOperationInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/RetryPolicy/Exception.php delete mode 100644 library/Zend/Service/WindowsAzure/RetryPolicy/NoRetry.php delete mode 100644 library/Zend/Service/WindowsAzure/RetryPolicy/RetryN.php delete mode 100644 library/Zend/Service/WindowsAzure/RetryPolicy/RetryPolicyAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/SessionHandler.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/Batch.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/BatchStorageAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/Blob.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/Blob/Stream.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/BlobContainer.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/BlobInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/DynamicTableEntity.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/LeaseInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/PageRegionInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/Queue.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/QueueInstance.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/QueueMessage.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/SignedIdentifier.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/StorageEntityAbstract.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/Table.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/TableEntity.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php delete mode 100644 library/Zend/Service/WindowsAzure/Storage/TableInstance.php delete mode 100644 library/Zend/Service/Yahoo.php delete mode 100644 library/Zend/Service/Yahoo/Image.php delete mode 100644 library/Zend/Service/Yahoo/ImageResult.php delete mode 100644 library/Zend/Service/Yahoo/ImageResultSet.php delete mode 100644 library/Zend/Service/Yahoo/InlinkDataResult.php delete mode 100644 library/Zend/Service/Yahoo/InlinkDataResultSet.php delete mode 100644 library/Zend/Service/Yahoo/LocalResult.php delete mode 100644 library/Zend/Service/Yahoo/LocalResultSet.php delete mode 100644 library/Zend/Service/Yahoo/NewsResult.php delete mode 100644 library/Zend/Service/Yahoo/NewsResultSet.php delete mode 100644 library/Zend/Service/Yahoo/PageDataResult.php delete mode 100644 library/Zend/Service/Yahoo/PageDataResultSet.php delete mode 100644 library/Zend/Service/Yahoo/Result.php delete mode 100644 library/Zend/Service/Yahoo/ResultSet.php delete mode 100644 library/Zend/Service/Yahoo/VideoResult.php delete mode 100644 library/Zend/Service/Yahoo/VideoResultSet.php delete mode 100644 library/Zend/Service/Yahoo/WebResult.php delete mode 100644 library/Zend/Service/Yahoo/WebResultSet.php delete mode 100644 tests/Zend/Service/AkismetTest.php delete mode 100644 tests/Zend/Service/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/AbstractTest.php delete mode 100644 tests/Zend/Service/Amazon/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/Authentication/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/Authentication/S3Test.php delete mode 100644 tests/Zend/Service/Amazon/Authentication/V1Test.php delete mode 100644 tests/Zend/Service/Amazon/Authentication/V2Test.php delete mode 100644 tests/Zend/Service/Amazon/Authentication/_files/ec2_v2_return.txt delete mode 100644 tests/Zend/Service/Amazon/Authentication/_files/sqs_v2_get_return.txt delete mode 100644 tests/Zend/Service/Amazon/Ec2/AbstractTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/AvailabilityzonesTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/CloudWatchTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/EbsTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/Ec2Test.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/ElasticipTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/ImageTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/InstanceReservedTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/InstanceTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/InstanceWindowsTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/KeypairTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/RegionTest.php delete mode 100644 tests/Zend/Service/Amazon/Ec2/SecuritygroupsTest.php delete mode 100644 tests/Zend/Service/Amazon/OfflineTest.php delete mode 100644 tests/Zend/Service/Amazon/OnlineTest.php delete mode 100755 tests/Zend/Service/Amazon/S3/AllTests.php delete mode 100755 tests/Zend/Service/Amazon/S3/OfflineTest.php delete mode 100755 tests/Zend/Service/Amazon/S3/OnlineTest.php delete mode 100755 tests/Zend/Service/Amazon/S3/StreamTest.php delete mode 100755 tests/Zend/Service/Amazon/S3/_files/testdata delete mode 100755 tests/Zend/Service/Amazon/S3/_files/testdata.html delete mode 100644 tests/Zend/Service/Amazon/SimpleDb/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/SimpleDb/OfflineTest.php delete mode 100644 tests/Zend/Service/Amazon/SimpleDb/OnlineTest.php delete mode 100644 tests/Zend/Service/Amazon/SimpleDb/PageTest.php delete mode 100644 tests/Zend/Service/Amazon/Sqs/AllTests.php delete mode 100644 tests/Zend/Service/Amazon/Sqs/OfflineTest.php delete mode 100644 tests/Zend/Service/Amazon/Sqs/OnlineTest.php delete mode 100644 tests/Zend/Service/Amazon/_files/amazon-response-invalid.xml delete mode 100644 tests/Zend/Service/Amazon/_files/amazon-response-valid.xml delete mode 100644 tests/Zend/Service/Amazon/_files/mozart_result.xml delete mode 100644 tests/Zend/Service/Amazon/_files/offers_with_names.xml delete mode 100644 tests/Zend/Service/Audioscrobbler/AlbumDataTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/AllTests.php delete mode 100644 tests/Zend/Service/Audioscrobbler/ArtistTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/AudioscrobblerTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/AudioscrobblerTestCase.php delete mode 100644 tests/Zend/Service/Audioscrobbler/GroupTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/ProfileTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/TagDataTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/TrackDataTest.php delete mode 100644 tests/Zend/Service/Audioscrobbler/_files/errorNoUserExists delete mode 100644 tests/Zend/Service/Audioscrobbler/_files/errorResponseStatusError delete mode 100644 tests/Zend/Service/Delicious/AllTests.php delete mode 100644 tests/Zend/Service/Delicious/PostTest.php delete mode 100644 tests/Zend/Service/Delicious/PrivateDataTest.php delete mode 100644 tests/Zend/Service/Delicious/PublicDataTest.php delete mode 100644 tests/Zend/Service/Delicious/SimplePostTest.php delete mode 100644 tests/Zend/Service/Delicious/SkipTests.php delete mode 100644 tests/Zend/Service/Ebay/AbstractTest.php delete mode 100644 tests/Zend/Service/Ebay/AllTests.php delete mode 100644 tests/Zend/Service/Ebay/Finding/AllTests.php delete mode 100644 tests/Zend/Service/Ebay/Finding/OfflineTest.php delete mode 100644 tests/Zend/Service/Ebay/Finding/OnlineTest.php delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/ClientCustom.php delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/error.xml delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/find-items-advanced.xml delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/get-search-keywords-recomendation.xml delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/histogram-aspect.xml delete mode 100644 tests/Zend/Service/Ebay/Finding/_files/histogram-category.xml delete mode 100644 tests/Zend/Service/Ebay/_files/Concrete.php delete mode 100644 tests/Zend/Service/Flickr/AllTests.php delete mode 100644 tests/Zend/Service/Flickr/OfflineTest.php delete mode 100644 tests/Zend/Service/Flickr/OnlineTest.php delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883923.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883924.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883929.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883930.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884394.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884398.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884401.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884403.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427887192.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_428222530.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic.response delete mode 100644 tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosExceptionGroupIdInvalid.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883923.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883924.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883929.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883930.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884394.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884398.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884401.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884403.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427887192.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_428222530.response delete mode 100644 tests/Zend/Service/Flickr/_files/testTagSearchBasic.response delete mode 100644 tests/Zend/Service/Flickr/_files/testUserSearchExceptionEmailInvalid.response delete mode 100644 tests/Zend/Service/Flickr/_files/testUserSearchExceptionUsernameInvalid.response delete mode 100644 tests/Zend/Service/LiveDocx/AllTests.php delete mode 100644 tests/Zend/Service/LiveDocx/LiveDocxTest.php delete mode 100755 tests/Zend/Service/LiveDocx/MailMerge/image-01.png delete mode 100755 tests/Zend/Service/LiveDocx/MailMerge/image-02.png delete mode 100755 tests/Zend/Service/LiveDocx/MailMerge/phpunit-template-block-fields.doc delete mode 100755 tests/Zend/Service/LiveDocx/MailMerge/phpunit-template.docx delete mode 100644 tests/Zend/Service/LiveDocx/MailMergeTest.php delete mode 100644 tests/Zend/Service/Rackspace/AllTests.php delete mode 100644 tests/Zend/Service/Rackspace/Files/AllTests.php delete mode 100644 tests/Zend/Service/Rackspace/Files/OfflineTest.php delete mode 100644 tests/Zend/Service/Rackspace/Files/OnlineTest.php delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testCopyObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testCopyObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCdnTtl.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCdnUri.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCdnUriSSl.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetContainers.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetContainers.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetInfoCdnContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetObjects.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetObjects.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetObjectsPseudoDirs.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testStoreObject.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testStoreObject.response delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.request delete mode 100644 tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.response delete mode 100644 tests/Zend/Service/Rackspace/OfflineTest.php delete mode 100644 tests/Zend/Service/Rackspace/Servers/AllTests.php delete mode 100644 tests/Zend/Service/Rackspace/Servers/OfflineTest.php delete mode 100644 tests/Zend/Service/Rackspace/Servers/OnlineTest.php delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/test.txt delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetImage.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetImage.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListImages.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListImages.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListServers.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListServers.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.response delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.request delete mode 100644 tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.response delete mode 100644 tests/Zend/Service/Rackspace/_files/testAuthenticate.response delete mode 100644 tests/Zend/Service/Rackspace/_files/testAuthenticateError.response delete mode 100644 tests/Zend/Service/ReCaptcha/AllTests.php delete mode 100644 tests/Zend/Service/ReCaptcha/MailHideTest.php delete mode 100644 tests/Zend/Service/ReCaptcha/ReCaptchaTest.php delete mode 100644 tests/Zend/Service/ReCaptcha/ResponseTest.php delete mode 100644 tests/Zend/Service/ShortUrl/AllTests.php delete mode 100644 tests/Zend/Service/ShortUrl/BitLyTest.php delete mode 100644 tests/Zend/Service/ShortUrl/IsGdTest.php delete mode 100644 tests/Zend/Service/ShortUrl/JdemCzTest.php delete mode 100644 tests/Zend/Service/ShortUrl/MetamarkNetTest.php delete mode 100644 tests/Zend/Service/ShortUrl/TinyUrlComTest.php delete mode 100644 tests/Zend/Service/SlideShare/_files/demo.ppt delete mode 100644 tests/Zend/Service/SlideShareTest.php delete mode 100644 tests/Zend/Service/SqlAzure/AllTests.php delete mode 100644 tests/Zend/Service/SqlAzure/Management/AllTests.php delete mode 100644 tests/Zend/Service/SqlAzure/Management/ManagementClientTest.php delete mode 100644 tests/Zend/Service/SqlAzure/Management/_files/management.cer delete mode 100644 tests/Zend/Service/SqlAzure/Management/_files/management.pem delete mode 100644 tests/Zend/Service/SqlAzure/Management/_files/management.pfx delete mode 100644 tests/Zend/Service/StrikeIron/AllTests.php delete mode 100644 tests/Zend/Service/StrikeIron/BaseTest.php delete mode 100644 tests/Zend/Service/StrikeIron/DecoratorTest.php delete mode 100644 tests/Zend/Service/StrikeIron/ExceptionTest.php delete mode 100644 tests/Zend/Service/StrikeIron/NoSoapTest.php delete mode 100644 tests/Zend/Service/StrikeIron/SalesUseTaxBasicTest.php delete mode 100644 tests/Zend/Service/StrikeIron/StrikeIronTest.php delete mode 100644 tests/Zend/Service/StrikeIron/USAddressVerificationTest.php delete mode 100644 tests/Zend/Service/StrikeIron/ZipCodeInfoTest.php delete mode 100644 tests/Zend/Service/Twitter/AllTests.php delete mode 100644 tests/Zend/Service/Twitter/TwitterTest.php delete mode 100644 tests/Zend/Service/Twitter/_files/account.verify_credentials.json delete mode 100644 tests/Zend/Service/Twitter/_files/application.rate_limit_status.json delete mode 100644 tests/Zend/Service/Twitter/_files/blocks.create.twitter.json delete mode 100644 tests/Zend/Service/Twitter/_files/blocks.destroy.twitter.json delete mode 100644 tests/Zend/Service/Twitter/_files/blocks.ids.json delete mode 100644 tests/Zend/Service/Twitter/_files/blocks.list.json delete mode 100644 tests/Zend/Service/Twitter/_files/favorites.create.json delete mode 100644 tests/Zend/Service/Twitter/_files/favorites.destroy.json delete mode 100644 tests/Zend/Service/Twitter/_files/favorites.list.json delete mode 100644 tests/Zend/Service/Twitter/_files/friendships.create.twitter.json delete mode 100644 tests/Zend/Service/Twitter/_files/friendships.destroy.twitter.json delete mode 100644 tests/Zend/Service/Twitter/_files/search.tweets.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.destroy.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.home_timeline.page.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.mentions_timeline.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.sample.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.show.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.update.json delete mode 100644 tests/Zend/Service/Twitter/_files/statuses.user_timeline.mwop.json delete mode 100644 tests/Zend/Service/Twitter/_files/users.search.json delete mode 100644 tests/Zend/Service/Twitter/_files/users.show.mwop.json delete mode 100644 tests/Zend/Service/WindowsAzure/AllTests.php delete mode 100644 tests/Zend/Service/WindowsAzure/BlobSessionHandlerTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/BlobStorageSharedAccessTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/BlobStorageTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/BlobStreamTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Credentials/AllTests.php delete mode 100644 tests/Zend/Service/WindowsAzure/Credentials/SharedAccessSignatureTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Credentials/SharedKeyLiteTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Credentials/SharedKeyTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Diagnostics/AllTests.php delete mode 100644 tests/Zend/Service/WindowsAzure/Diagnostics/ManagerTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/DynamicTableEntityTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Management/AllTests.php delete mode 100644 tests/Zend/Service/WindowsAzure/Management/ManagementClientTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/Management/_files/PhpOnAzure.cspkg delete mode 100644 tests/Zend/Service/WindowsAzure/Management/_files/ServiceConfiguration.cscfg delete mode 100644 tests/Zend/Service/WindowsAzure/Management/_files/management.cer delete mode 100644 tests/Zend/Service/WindowsAzure/Management/_files/management.pem delete mode 100644 tests/Zend/Service/WindowsAzure/Management/_files/management.pfx delete mode 100644 tests/Zend/Service/WindowsAzure/QueueStorageTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/RetryPolicyTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/SessionHandlerTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/StorageTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/TableEntityQueryTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/TableEntityTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/TableSessionHandlerTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/TableStorageTest.php delete mode 100644 tests/Zend/Service/WindowsAzure/_files/WindowsAzure.gif delete mode 100644 tests/Zend/Service/Yahoo/AllTests.php delete mode 100644 tests/Zend/Service/Yahoo/OfflineTest.php delete mode 100644 tests/Zend/Service/Yahoo/OnlineTest.php diff --git a/demos/Zend/Service/LiveDocx/Helper.php b/demos/Zend/Service/LiveDocx/Helper.php deleted file mode 100644 index 8db4613ef9..0000000000 --- a/demos/Zend/Service/LiveDocx/Helper.php +++ /dev/null @@ -1,177 +0,0 @@ - 0) { - foreach ($result as $record) { - $date->set($record['createTime']); - $createTimeFormatted = $date->get(Zend_Date::RFC_1123); - $date->set($record['modifyTime']); - $modifyTimeFormatted = $date->get(Zend_Date::RFC_1123); - $ret .= sprintf(' Filename : %s%s', $record['filename'], PHP_EOL); - $ret .= sprintf(' File Size : %d b%s', $record['fileSize'], PHP_EOL); - $ret .= sprintf(' Creation Time : %d (%s)%s', $record['createTime'], $createTimeFormatted, PHP_EOL); - $ret .= sprintf('Last Modified Time : %d (%s)%s', $record['modifyTime'], $modifyTimeFormatted, PHP_EOL); - $ret .= PHP_EOL; - } - } - - unset($date); - - return $ret; - } - - /** - * Decorator to format array - * - * @param array $result - * @return string - */ - public static function arrayDecorator($result) - { - $ret = ''; - $count = count($result); - if ($count > 0) { - for ($i = 0; $i < $count; $i ++) { - $ret .= $result[$i]; - if ($count === ($i + 1)) { - $ret .= '.'; - } elseif ($count === ($i + 2)) { - $ret .= ' & '; - } else { - $ret .= ', '; - } - } - } else { - $ret .= 'none'; - } - return $ret; - } - - /** - * Wrap the length of long lines - * - * @param string $str - * @return string - */ - public static function wrapLine($str) - { - return wordwrap($str, self::LINE_LENGTH); - } -} diff --git a/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/generate-bitmaps.php b/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/generate-bitmaps.php deleted file mode 100755 index c42bf087c6..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/generate-bitmaps.php +++ /dev/null @@ -1,34 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->setLocalTemplate('template.docx'); - -$mailMerge->assign('software', 'Magic Graphical Compression Suite v1.9') - ->assign('licensee', 'Daï Lemaitre') - ->assign('company', 'Megasoft Co-operation') - ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->assign('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) - ->assign('city', 'Lyon') - ->assign('country', 'France'); - -$mailMerge->createDocument(); - -// Get all bitmaps -$bitmaps = $mailMerge->getAllBitmaps(100, 'png'); // zoomFactor, format - -// Get just bitmaps in specified range -//$bitmaps = $mailMerge->getBitmaps(2, 2, 100, 'png'); // fromPage, toPage, zoomFactor, format - -foreach ($bitmaps as $pageNumber => $bitmapData) { - $filename = sprintf('document-page-%d.png', $pageNumber); - file_put_contents($filename, $bitmapData); -} - -unset($mailMerge); diff --git a/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template-screenshot.png deleted file mode 100755 index a993087a7b496aed3a24f4765475932b67aef40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126090 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

~{F_aK)3+oJQr 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 OmF3l*6h1P0_x}LAkG9VM diff --git a/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template.docx b/demos/Zend/Service/LiveDocx/MailMerge/bitmaps/template.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 zcmZ6RV{m2R)~#cAY+D_4Y^P&(oQ{o-ZQHhOJ3C3owryv}*x~JSzPeTSyESU9s`c-! zr^cM`oTHYKEF=^r7#JAbzXuG=!Nl$NBRCjXAtD$U#=r01Vs^I9rnb)dsvh>HPP$C) zHh-4XCw}$+z!dnMb4$YehlsY*elMTFn;|5`7i{*fu{o#o<;COikh+1MwizLMU^aO3 zzWtfg#@)xVAckfV_3r?rsEJZKsYo>2qJ1z-CZT|Y5mGzx4}4?FIlj$(e3wE6sG|6y z5sN-+O8kP|Tps#Zo9qLyH;aVlXjOHA3u33*24kzk=$!r&$vG#v&FIL;4$A&WM)T2~ zj6p|&sq_p*xwvjGJxTF5ZnJOl$EUK;EOP}q7w?_?R-A1DW^Q9CWNS{Ihm$vvzM=OG zTzDGfhMw&&#TS(e<;3Q64j7&n{NHxW>s<1DYs)`N5eSh2CeM^y|VdtXc-QzZ2Y`3r-^a%5i<3VnJ>WGXL zaAKv0%Jw+@#X|uMJ(x5*ZGv3q*!?qiz-3q0TRwM`dY1_&F(xqUrC-I7YTw){!Qf|I zw}Dl(fu-*QlYY;blw@?T3-aXTx$e9Yr{}O(y4kp|@GPNz-rD)N`RG8T?1?y!+NwJw zk)_P+s`GiA{z|{re7v}ss1vRN`N;cnYNonY| zW%YNW0bY(+jVg#mmYJ*AarZiLMZz;tNnX|3-wMa|>**8L!v-ANhjMfS z2Zo`p0m}zA(CFDNnecDJ^_+#@6jZpOJ7JIME>*>>#&5C%>+a{G^iVk4<(=hg{+b$B zF~kPA7|U(BT=of8Y6i%S{_Y2uXq=;|&$jedTiz4pob)%UT?Sp7PXLuVnJ;~vHy}59 zR0f337CCqLTE_d|TtacOlURC8)<3@MI154 zu6&Qxq{~9i4CXDLGjk4tVE-HP+U>9r#6QUD5MW@a{~(*#87n#3**h^C+S~u94gm=w ziV!TQAvyEs?m%KQOGXCKiIfC1pWR@2BYhPW7Kmlxw%40W^;Zo5nV z8I0wa51Hmzq;P3n*8+$SN8{AQ_6bNbilAo)5PtvV18*k=46mf-ZDv8-ZZWL*Y0b`i z8Q4O;e384NN6z~N49pM^w;y;q*Is;7nDC?i*ih+Dh`P8*EU9Ip_W}e)&z-sI% z?KO9PLEee=MO+V^)YS<8+@4}q$MZJWCB(*#;oLi2FVg$}@dB8# ziT(J;3mXy)4DJ8rWo+kY`X691i6V+Y!v6yda!;XcX;4gMBa22}ZgJ3B#mX8=#$f67 zWXTQ|UwUsA)z#p5DvOKn{*7%x)az&*^GwBBt@5!n2VskLS)3xK0WCrF`#as7C_$9q zg>;*Yur5Jq>Pn);cn03cy8X^7e%GuH4(|$5=`WRos&D~&;7#y3@uz>Rwi@(~$^dLB zqk~;XY}s%xbdE}$gyn#8b4J}Tu~AQq`l+iy>LI|%R+vwBelH!FaJ9uHUV9pSM#NB5 zUEkQdm=$_QL+d;!ySj*Umk=q#5+yQ7)VxjLFY>KtRrbA~XUJE!;dHhj{{r0xPtLGs z_S(tz2J$0b?s({NFAVH?=6F3iwt zR<019(XLc06K$c_rC*Goj%)yzDna^!Xr5o6^_p@iGS*Z%a6V57WJ;HvXkg#Q-Y_)p zoKHYbIYm~4uX;9j8Q0=i?W=MS#K{^s6Jf$+;blJ@v<<(SRS)7e6`PFovDUnv!!AL~ zPHvYx=D3t9Tf{8lf!Habc+f`aQ6@M|)y^4TR&O9NUyk8%;p&0>QvUg^aeosD$k8RI zSg)h=HIPaECi;7J&x<>z!c>3XjaO(NqmG6W_zd9Q+0esGU0M26qtW4XTUk(?ETDd- z$M=HvyO?se^HR~84EjJp&_8RJG+ut0rmS}DeG0fo{@<9@6tJ0${@J&m5B$F_{x9bL z7x0ztMeN2fR&FojtQ+b(4P*WE`t%gXJWT9WJ0kZ_)UMIELR#8{t_ktB@Wt`*??-5_ zwl*`S$mXGhRxOd@$`?T)R8fSvJWggWITP6#pdG(ncKwWJGoxWM16w&W?9v|{85tFz zC=UbTthgzP7vjF03cSCMm_UUotgVkQ5Az-tl!C<*)zTj&(z~_@dB%ka${ifuI5!_D zpej%h2mqR|o@ArtfQ*zaC$LPr;lF1IX`IQ267=}CBFh%Gb8@3046>#b0DpzH=M3U| zVGweI@5OPhYj(rwJK<64|0+>(72zOf4zYn2bhFJBCLj?Zm_D=YzRw??GP2v8+?}Rc z4Djx*mhL+-0bdz@V1JeXcR5lLo7=U4)_5M$Mc9E?ik3A`qSS{`T=wWDLrzmNL+BOV zChq4NhqT0|%tNo;)6AMpk}6TKYh@GA|J(0tWa%`kL|VICp?8 z(Pg^(2X&{C*KSp<%*ayUY;b-(?&IWg-4ld&_IdT2EIC_$l!A*a3ZHKJ3_w3>4ru7S zj%jHxbM`UFT?n6m`#bc@3+}6U`))a*Ny{p&Ps2*D&s{-^kFyRCG{@RTScKfss6Gp_ ztL~`#NJ+Yswdx?ffBNA1v6HEh|EM=`!j*5XFA~>NJPPrq@jcP<_|c%Lhsg`GBX40T z*gN2Dqt5MOM4v$5DUSl+gf~>wdWN%vMj!Oio9A|9)%JWvq@@bY&qhs@q{QEbXL!Vl zTSOFJr@j&+c1NP_?D8sdKBoJ2@x#-OaFwm{xzo4K*XBX^>v5HC9E2p3hDkuM_~&JE zU#-%@*_nO6BZlX3M7yEfi2>oLPRbdM&JU@iw{(uNh__&sb|eEcC^kj}AD){NAt%?| zFVc}%sn|^TJ}>Z17GDdoF?HGAM*10NSpwZoA-*yg{c`Rb?TmqCO*vUXmga9c2T|X> zXfvbn@w7jl;o-43sxs$_6{&RIsedtkec3){ui;_Zy1}#lUeM7oGv_TMKB8KhW~;z! zi8p;q%8B7`>eiWCSQ&(UvQ+4W!QLSPWN26!?U-fzndNz!o-ow{e6^JLSgoRz41p@U zwk8_`KGEK>v{kTPnHwqdU#yj5w?&x}95Gh-OYC7Q>`W{1w@FPXtmC41eS9nwcppfb zsdMdV(c->$k%uXso@GQUXgCRuMkgl{;uVz0vi*+LPH%e4?k>G1{sKI~%flsoZWqlB zJ+kAmxSE1L@)A#41$Vf+u*$d^DgK}pysUbgUYTB-EwlvCuvvqx6M?LO50*{ zw*9DU%qMAW4YO3F`?Vt&dXv-Lz!|=?Est)LiGwu*tk4WimCBDvdJ|%%P$ab8eqfaH zweW4`EYuvAC)`RSCd~94-tw8Vx~?YD6Q}Cbk~|8a+OdVLG_6hT&_1@xAd#8=tj3k( zb~lMA5h%#;r*cqJI@790-_N{!^)Q(0T4Rr3d$~nEq{%kDxwxYsBZQ~7p$wsOsJ0Yw zMN8Gu^b4dASqWWt^HvFYh{N8yC0efn{2~RG>Q{zBOTE0Wgp+7ooyojG*@G1F7b3Q&)x)Pkv@`# zC_fH@b*Bb^C{jd_)sGc1H6AqBLM+BLm~A9PMKO6qd19L-+fAEO2|1pdn`|=4Pi{Pd0MBZz{XD(n~zmNZq+*s@|B^g@zoCerLFhr@fp0y-5 zREtU&7umHti3DO&mo2TDA5;rV>ROvU-!M6@$~ZlHR&t=8_&V<>Vrp%CDt)D|P`53V zK@Q!l)NNg*to6cMmU@?-Jeh#n=-BnnLj|gM;@-VVpAD9Nhyo$$umuI=%+Y zr{vNt59+Yc7E+7IHhTcexo(lqZ-r7X-9S<8Wi2q3yfB@^{e|4 zHa2&d(-Yc!omRxCypWK9vC3+v&pd4<>Y4VCu>n_ZS0d}X5^mI&F;zTtI(TofER3tn z+-yWjI8TPQ_4d77Ts`AdAr=%4lvuJUM|G+7n7IhYW4B(-C7Hm8a%l91RP|Jrp* zFtIx}{5~XSbG)NFxn#a_KWv*nVt=43EWpm!_W$^IM6iEH^m9`tUIQK$wQjz^e~d+v zwI$8>7sB=u`Euf$5lo$Wj1jB!YA7rI({;PA-TaN+hf9jlob+_H2@WHtcHlWhRa~`T zxW%0?EOaQ6&A35(&?kSvv5&Y+0&Tq!uD5Z)}l{anvi<7 z@_)tCu1~CYU_p7E1^hGKzc@3MwE)60?kYl+#9;XjrUD+s8mOg6c z1AUNXY5yD&-75KRRkK`qytcabq%;?F>Ne zyR*bW948tngTgpbP5ie?u5Y1mT6>!{F>S3+KC8)c6Xaab%A2`S?PA?`{M7xq^qF6| zo@S-L?IuoyiXXyff-JAVw$-TM4U_ze*}|`I=(K<|(BpaV*FfJ9cwymXJ3O2t0eqTC zbuw9#9IJH8J0So?)3?bY&TvqNYOu&vMzbxYk1VC1hY|iZuOyjoyU$lm+tSc|D!k)U zyDr~W1{8Uo%sPIK4u5SZ{H~Eq`xSZ0T!n%Eu1la6Q~~2v8sM} zmS~1X`m42cRDQHlXQ6iExZgsGs)JQ+O=qGNhJdcLT3N;S3I$WDr7F^}iJ2rLA_jB5 zXFC+N7DtY+%71MYr16o&YK-f(#zMgE$_r>>&Z;6~>Gc!m_cnP^HEpI6ntzmuH2;r? zcJZcp%!YS}D4S<6!(wB^@CEoe(Jde92^h4MO~4KyFdB2;Q+Qk^BAveX=ZsMS)uCv9 z@>Vv!1!v<#oH!gmh)aaGQGRD^V!OQK-$_yt=jks?0C01}T-rz~Qh2#!;;-?gj1tGD z1*;RqT)j>R{=9yz*f0TDw$H2XLl}CqbHE#}rsR0ZTuK)JA5i8j((Jsu{s>-l1QEw-mk^{Is4tSaoe4=I@NZ&)^v% z`u5iOHS}rUl~;5`K5H?(uwFfLnBDy2KpS}N$@>zWx~mWs`7OJS!hiPD^OhU7zbOqV^4~5lS5&KWDhQEIXYaJfAf)u@WbwRNJiV zxmGQ>t>AmT@<|LBE?X^Jen}oKbN#!YhS_G9o4K&Lv)BCSs$nkHdKHV7b?|iW1@k07 zbD8a6>q2pIb7C^lrOWM}s(n1mRfBt@Xee`8cKB|;m7PGzwnlMbcca6ei$czKedM)9 zMH#)?;b9leUo9;tCGV=E2*7icT*{-sxuz|lc?q_du21Bzh$uO#hI8{p5F!9J7qW=N zz+1^F83*cuL|J>*toIfQe$j^+d&49e5UP?Ksrq211gzhL4aT>b9LY;lFkbomMD$U4 zq6$h>r({3sTiGzVrHEd88kPOc4oj!!&Jw4Fbrr8EdA0^a*G)CXxVRl}PUbP_f^cdB zp!wF7F^&Q*6j!(z&b(w+HF$Kia+lei%sxJn0(cI5r^w4voXVS0!G*P9Y=2848)2yp zzTkXcXOFxE?#QWwN*i9#^}AqZ45W)fkABbB-oUR(WbIpK#k(wyFVT)S`F(|9pVa zIfVp(qa|2##C{7!Ruy`LE3qKD=i99IR`%16vzb z32k^0{3d8OHRP^aKQEpM9Mao&Ru`W!H<^HKC|W=+boX_D*NTN9U}wEBWb0Xl-`Aah z#AfyE!mWjQsYms#QE0W~$#ez#n3L6J`uRGja@`=T>96bWrA?o@N@&;Tmf5Z6UtCXV zByZNk%@=5YVy>!?RAJ~LQ~utXqGr($uD$m}zb}4_0&j^{Y@L&o?KNs$n~-}bNL;K; zz6F~IV{(nk(r?pS9Q=u1;>ku2GlZF?b4)bQpB_MXA~?di|R#ybLcM&C~eY3L35 zK20b(Ue-B(vAFMk)j06kr<=6z(92_RyAfHJa&!j&?t^bqd+)OOv9}<#xIFi|OmLsg zHJ~WSnb+4OIx`a(vGx2MTE621qHE}CNANLwgS+-KESj80p2U_RaGRk>j2@E*ezSyr zTh~jgdIV^`0Kfjfth`N4D3A@3=H@G=3X|YCYFZGmNtgwraylCU}3ViHRtbw z*2I~4`}mMZ045^C!^59R#HRuifj}ndGutzu#91;>;Y^~KFL&?$<0}`y1dZuxZVr6Q zURfg&Jv14NN4r5IMTKh&Zm)-cx|8_^5g;1o1^pS)sZ|Q&?cau_;pQ)lJF5RF+;NP^ zEk;_53U4SvwL&6!#$=`G#G<$0irPwZKH{Rb5kz2bFPUBE&C{s01Yr5XM zyoCe{(<`rV`-Qv-JRZBzMO&iIg-i8pv$gwW4KWI)9uzExkKG*E8g@AneCk}%Hcrl~-I2X~DS%;hfD|2<%9~*#n^EyaUqOj!Pk66SVge=P z2wUl!d0zxjhDaJnHoOpndZ48CW4-(Hd8iSAJ^1ud(n&7oN=$7oR0|y&t#}0`h3$xtgi?kQ~@5r zqHLC$iCc#%pK?#N*h}VZ&Vz{AZU9OIt}D!Adx4G*yPAClu)Q=7tet*Yf>{E+;RuPJFzVT~`kCi*EJyxMyG zVnSq+lwfVPsjH}ni16znQ4y3fWx)lEumeBHNbAo6i^Tt|N|hh#{t>SrDWGhZbMyA* zr_1ii$jAVhBSh*S96z3)pD#ebCrUgXv;8W?B`fT>xw&b}QigEBe~3RrKl;@*we3ud zV?@2BmuYTrfA0t0AqG(A#=n@i}?e)$r8cY+?yF-F}_s4$RTlfND7+d^2bzq!p zMMW?Iyrtme;^buI*oB#%e7~8i)~%JJehnvuy;--9iS7{RCIN8(4ERH$TbatXlpq|Hl>O`xFyrl?{clF(Dx#XOah*gM$Ov zuVE#hvT#l$Ipr`pd5b#UQ>I>O_VA>oL;?6Bk)UpQQ#J;{_DY!)Nn~1Wha{!hfm! zG*xZWjOk28*8BQ|mFTY{7&TSuKAAq6)2ozf7C+Z7b&v(qGc$i#rHh@Lh6B;RgYa?G zmQ;2cv46$YTXHY;sU$Ys?ZJ>?IL5}ss-L>RHl#;;=GsDGFYHiBmo=0*@j!K`%r3;y zK1Pc18jTJy)Ktr)$ga8Yd3OaVFJQy79PA&oadJLUDA*kW(WnT6#biz$37On9tiW>}T(c7ML z=hlk%58LttnX!H$zOXR0b?f&g_WrJG_PBj_Nlqb3GRdSoir##fdT>;_{R$632>8+9 z6jE_M36#gk)TQs`!W=^FcU~o;(ys2-E9a=c_(-o@Ald%-!99V^Pq`)=$p1 zHZnFn3k4aOah;(R9am*`F{MEG&=Ql|mkqjG1`*l2j|0H(q#%=dXKhZu({^q4-ydia1)ejT~7;lV+n&q6R2YY*Si#q+KDtm{=%b%ui zQyJ5k(N%nK8Mbn=$E)sZvU+YEPoKBJ79plF$7cvDy%@G>Cw zjZ*H0V5+F-29#MAUVql7Gbj_59%z}PvDD&tVF1ve%<7$vGFPfdMpZE}IX^#=Y+6PB z8c!!lpX5@To0}`vyJrb%RIp)rGzdW>iUg^DnRX$|+`RWvMCf6_-02-lViT~W0rsBW zg?|8YO0T$c&>?mhFNNu6bj4ho9l&6q8hd(>4>`i5s6ciL1+xUZ>n?e$? zd34QibU0)7j*pN37SHyomhgw=1}7ygI5sc^1EO1QUx~iShdbp;;Z8UAfjy(Vhvx)k z%y;%DUh``Dlo19IR{Axs$d8>k(tWC39dmi4l9or$HqttYj~yv^XM%uJH%~-79jrBt zU3^@Fv#Yp^6iTslLO#zEkemP}3pxH<0~%ZIKX+g;j@h=Q+^YnpR%mEw^*<)*20FzE zIsNVs5bW#g{WXmYjTb19?%D|v5fLXCD=I3qYFkTW=`?6Bc{qoLhjZtEC$w{BcU~#9 zn2>9^oNkS+t?J4dEtYfH>&vo@;%nI_q`Y~0qk6cLX%gq&?vpnTS9wE)WviS|W%%6O!aaC&{++ecejJG@+p)nMGBV1whK{2|s*TmL3`&p8g<0#Jw=Q zjE&92M3a7T@R&ks0&#sJnP%+kZ1Kpe0`l|I26T6`U&ui}BU{T4J32afWFsd-o|?fv-8!G$HkRA zPh$9lu(|Y7P1;VOtt!;==aiCroL}Z|M|;IGh7Lq2_~fLdm(ist4g{R<@9+;bj*JHs zi6dJ>g0n|uWp930Gm6gwWa*7~-RwqUZH^`M4~mp<1w6v~^xx2;TpZk3`p=a^G9{HM-_+DP*G1PHO%2fadqzEf zG8c%?Ff;Y{^`);^kmw6tgdYBl_4{L+FbF5likP7M>1C~x^g1sY4(hJ{+^K25r2oB%^QBECJkUa$ygTtF%jn6PiRM?V!6 zQD)C^NX(3iOTO83Xaq7@uLSMhd2RcnOH|Iz6dc1)ceR=G@>%8A)hXM3dX*3)iwhRUQ$fj+ zud6HEHmfz*$94GN@s}!04Mx|-28Jr?+i+?%!_KBt{ee z+x=xg`AQS5nm@HUSv8J`8E>r(&x2_NL-&GNP71rpl+MPm!qSq-KRIC2SNc8w#HI?g zz)O@*{sRHm#9KWq$1p#{3+jDcKGsZlBlNqUj51LzyZ#rl*IOx-dpc!lPwv#dY(T;N zUuUU%o*1KmP4vqwt{b(3;&u^z0e}(v&gozJ8ghD9ee!DkzK?z<_mP5T9A z4GnGe-IEg|CoNpL@)poI!7}7cf56$Bg?Ve-j2ul4nfnG==Mpm@`^G5f82-LdtkBSO zx&_He$=c{mIJ}-Dn;t2;>SC*D8O!=VG?O1c8`BPAo^G-MI@a9fj|o?c_G2^23ERTTgG3Z zA))wjrkZ2l{&oNKdB&ig^G2_9CUwe9qL05=l0Olz?ylqJD4Y=@JUb)=9x9DC?vqAt zH+Bj@pk(zMcT}ZV87r#~lVSf_t~EC%l#~4Y{B8gsj7S)Ke9?t9WTG>6T7w|Hq_?cN z8_+dy(vmfqbb6Evn@{Ds%Ep$Y^abH>_F(x3n{Rh@=LF)Yo-cKbJnLI8vL|gJ^*&(E zDCQX`K%6?8-HXjgvs3jQ{IRPDI#oJ%F&c@K7G7G~2PZ+%C}586g**xDriYRxy`dD{ zUK8Wa%P}#@Z`ng%@&k$Y&`p1*APA0&tL=Fy5T3R&MBnvrrsp=FpM;ng>}XFbQ%g&_ zj7F|gP{3YZ9*+40+t|>M4DFs8M_Wx*6}55nw}wR<@g=bGv-$J&XaZG}5L1U*SC}B5 zGguN&dNzN`OvX&d-%_XUwXeT_duOM~xr|s2XT;RRJQI5en-clD_b? zKtFsu=K1WuANTNpX)+DAu{Gx$<9N~%Yq#*pyWN&-%fz2w%{mvoeMS156KH~wF+7kk zeFZfr{$)){l{Rr3S6tlY*Hl=jgyP|-CbQH<*YbOdZiQWOg;(E;?0sw1;K{cgd=IKz zD9B7KV@`=YI<}uBjA?U8E^td zJ?LvtqE_=&%J1H))71L6{+SD1@WM?|maPe#@!s3L@gfsfH}q+^5#&vM?tdU?(*8JJ z{k#vg8gP*7M1grf+TGch#{KoI+KUPa2a9$+``6^+T43B$wn<!QuDXV zPU^PLzEEw$caMzazz)iIs6IfTlbw*mjOux{nKYO~!Z?i~i-h*g(8(1(I2Pp_BqURzu!omVVM{}naWt+^?M0_?WS-k$=$XEbN z?6a<>THv~^o}Ha4LB9JjkO+m-*87u_it!3mOrX|&S(TGRgbEt=GGrf6=;aCpFPc$Y zfq-r4>xss(vs3uynhi!TrEO?rp%_+f^6`kSr1{pjH=vW}lbFu09bE)5jOWJV1)VvMF+150yyKn+5)Qv98j{&VK5 ztEvE@j?Umi!EZJB2RygX%*aGXKmho(RFvnpi#E4Dxq^GrNuOWY2~~`?Ey7yYCXGKK z6xxu#Zy+*h@!KglI&OP>m>L>(JjlSVcdME&f2c;qYe)_ageW{w&3_&} z9|R@hd2Pyuw8dDD<{LDN?r06$zif{n8|jgB3+D^Wi{rz?wfF7K%%rATyR=bUhWbzg z@2-v7NVfQ_K7IEO7n(wgCZQA5qErNOv?({=qNw83U1-B%8tTjF2!T$-^+?Q`j$`d$ul>2fhuMNS!7|&B7tCBHs@)r4D zEce`<cCE zzM-dx0elr@6%_}I5gT5j$Vf?Nhn`Z?(|262Fup!fPzf&zMQ?p;AR5Lr;tk453+4`5 zDGk_ge5HB>_3(IS8{AxN?>&y=HlYCTR~v1O)Mg6~^TrN{-b%SH?ce=XXE&PBDc8D5 zbUyHWIw5vFzTe}yb@s7d&=w3RNdBCIf}26D3Qn77%#{CiI7-|#4+@Zq2;fF3{0@gY zT*N=R-9c|^qydY@k~>wwtpvCZ&xi(s^;g zN}XN^1;I{U96V-Om8BJZPb^E$UyT)l2#(mPNgZew+f?qp@ZT);2)n{L5feKgYac)T*T%+*bANzIhu7|^s+!v4gS-9)Cm6S+sLuP_^R>18HCXiS7Uy$Z?46g; zyY_-c*JqnHH--!_pH!LsFT$Ddm*|xjy9X3xl;0g>NREd7m3)Dwq@56NpGt|}A~tTX zPfs7f{`~{3-hpa8xKhZfOFBMj$Ij(Y{YXbghh2}$3LK>wJa2lvnTyl0;8{Mol9f37 z+yz#i^i0B8gmg9#>?ruc)@}YzV!|8WQ(w#v)4=#rq{Da7;_ayc<8yM5&z9H{B9FPC z9^+c^#xiUF;7EW^$j{qbe3_FdyabBQNP(kK53sy?@cP2FFekkEb|z2i zi%at!86a0(z0gT~#!Bs&8ajzM6dCewhBUi+G?;A-U9gZ7#Ph=eBwO`or&}h4?%Ghw z%U2A!65!)&>o>{}O%*tg?B?^>KM{*{RTYJpnxFJWrO9$$`ISYnu!&jchhbb1_?7>~ z>7(?qaZzj^2cu)0W@Fim4^aNu{HJQQ?wo^5#DafKrQ?kqk4w#>vfjX(Rg16%o$-km zZ3E1yRm-1ol+Z=FsTkt&H>G zsJ$f_8U4HQQ#C8>iI1x0DmBoOeSP-beok=o)K>TbSX+BZM08&ah}1St=Pu9p5lJwP zmbXf{gYc{4Aa?NUHg=LdJv#%(#O?%3Dp9sWF6_oX?FJewX5c6o85q#oS5c9ZBj6?C zOjKjM7AohKla*H{%?+FA);D5}Fue3NLVc~hA{AYHd$mwyiV!7q=}l0Im}s6C6$Y1I zkXjp2fGrN5lp~415!oL(b&ZvyG-#VFtgHO?%4KS8oi%Bhwy@1)5QayLMYZcI!uXY( z3Jrk<7W9r}7PNh{s)@v0m{Y@Oa7tS0W435HanO~myc7}9iN!=60{Lqc;uWKL+~08O z@Q`x0KZUw%zMFp_f)H(n(6b%K?)KL#-jU{`s_L2A4-1Sa@*e(lGCMl33T0M(L$%@3 z_IBL#*$FlqEl33`Pfx+TGT0v!U^au(4f)a(0plB zyZhI*R>Jv)EW~HsJ`L=UPy-J=RN^469Z47k996G zLm0K)Jq%{ApisQgIOyGe>?V?JqAds{Fcma3Y?$}%Dc3DUR{dWxR_^ZU{aG+%^@xL( zear)*z+b}Tru~g;+}sEaZsp-JU>5$M^EE;lBh~luVM9Q++O5FY?nYAJ(x=Hy8lG)y z!*|T=me_HRlDJT8t^S?T)p-UX4-3Y_uVNMF#GCtjHjY-Jf%x}3s>t-X-@UL*K_~OK z?mQvit*4$a@HSK-_5XcW-(cdRIkAV) zUzfHu@_t9LrMcfbj9WN>a&|7!d)6q+JsGl{n6IcdQKlsQYbpxp{(f0_DI#L3rliyd z%3r?CMI{f%_6X9f-FN7`<%7Bx_=K&-FCxp1dAYHt^pnxxR#a5%^XcH>vC057F-fSh zwhFGikk%O)4waQj{^<<#2Cpt?Ok~NA;@$gtf`C%|`BC28(ec+506X8}BdEk`Y@2(R zkkEimYp$<|QcJxR7bJ%&MRpP*gOC3b96W&RptY$0Yq4f6I1@*BGS84rLtU87Y{5wo zEP2mkO8Wwh7SvKfcJrCVa3qSDhy0IylqTqsqHtW)_ z6gZ8w!b`{eG*dJ!wqrBTY|^Dm&!X*IYrWO*0hbz9CZLikFe&%5DeqXwU|ANo*eFKW z+DYKCsIve$#%F*@Sw$sCba2WFFbQH8y94Zd31IqGSeb%%1tl#+)xErd1h#;Q<t9 z)ST@(*WFUxKOoVGo%-g+=0t7qFw0t7IVa<_R8*1z`veU@KNCj6!o+{L#d!ooW7^Lz1+ zxt}?erTmTB)zJao-`&}>EkKvs?BZBhRs#JnesMExR4dvE8?|yz-AQakUD{i%b~&MA zV`GD#H?s6s?(BYxtVqxU-lE{CtV^t~y}I|Q)y-8r0Ur$&HId>MJ?hoH3S4*n<55F) zcD9}-xcg?!#RCZB(GclO?e`kivU+-oQQztQ$W%?IE4C+PrPjFv^(|V`PwGaKUtm*V zfSr>QSzmHzY(r=l!qMmT&1uQA$I7Q?9qa+g+{93CdteQf0DYzwzvw zp_bMfO_Xv;YZ+gZR%e=hQ_#e2XWQzFHve;ZS~E+ z+^(^KYSEY!rTpAIV)5&v>!FD$iK(>Qe)!$=1Wc*hxSbbO%*w&_8)S#RvM1ul=ZBY8 zlTGQqwf49j0c21GJz(Y&ITjfid3d?U(o*(oJ#Ry9nAINzk|R?~dptrou}UmKaa2aU0A#CU=lR zKOQktFhpIb&xHEM889<8ge4}5SM1j24XL%UlZGn@?%Qt*;Mcb+z^BtJ84~XQ1IJ~i z$T|sd533(>28b;6L%!OpY)PX8%PCfTqtAKp(@V0vB3;xFFvQLd|04DIyqG2kqb|-v z&!J^hnDLPeoO5wBsv2QTt<$OOA6HjV7oE_8DG=J=Ds7a#;ZNcJw@+y#J0p_^vJ(*yH-=^~;PCc|wR z_;8@c#!eNXuG=$?2_5yVWQ9g!v2;PCY7s_}N^rGS z@#>1J|G|!^QkmMNw~IXIYG+`0^srhyO z`1l0)Nf-Y%k4-s(#E-Kmr6DyMM+;8P{jEaPtNPK99Lm8FHfWW#wY7kU?qyHgdfM|>%@SOI?^tzKws0V!>!Ju$P{GQ*`o?9{d<9Ez+b)Gq3oc2J)7Xh~ z{)4KP6@Mav^QuW%DkO7Gh{s?(dJd!t6UPzv<8K@{gr4>%T*i-D#dpO28SRIWA8!Fqo}fkL&5# ziHb=gBKfl;RB~UG{OnE5=QJ?|ZO2v{e*%#u^{$~^gkd%OJ_D!(LH zp;<=~uZXXiuA3Kk--~_i$8o-EF)xRBOC*nU@(b-GFO1JZY>rYT{Ak|#bpL6vmrzHV z@P7c6Kx)4j78V*hc@2}AmIfk5^t@b1eI^h_yS^?pH8mt+-kT_ar?q)o*Oy=c?euVS ziXTA*e1W~E;BF93Utiz-`q;|aS{t-6;DYLs-=KU4I{E>bqd)D|)G*IVCQyLP2e{G1 zn*=2L zXtDV6?ix5k*B{nbJHBa+`7H23dWbk5#(%yuH8OHq>-c6glo$cre)*SOolbNWvZ#1G ze*Uh!tbsBb{I{`6{6fDea$S`GBem%Wkn%J%_{#4ZBog7J+dnc!ZdU5FKb`iG6n}hW z-`L`?I|^>0+3lRl`{jWMmCh!o_x+Vsfj}OJ-BSh9xrqrF6884YY)KVh z(15+y+$v-WdA#l}e%Wnmef?_0oDvrH<@xFHvyjjYmekn5!0qjB=2E?d*wYbM_=^jz z7T422#J6fTSyCt@{8Ft%Xj5V(pTiGA%2g|gYlW}{B_!alQRHxge)siFIbU`&SpsLP zYi$BO1}ZO+UbB~My(~U4u|mDJK&4y*GG3`8aMo9;Qp#bqDBP^m{OgzHeAPFs>7pX) zgBnUdQow@WzI_{pSbps3?PbvVRRz2Z2L}g)T<|}D^T{2seNlnGQ+Cyqm6e6xF&p5% zydDMlPd+##F)+1`?Gt;K=goK4GgT-XQs=%y)jC~wCy65jy({&l($L<)0oV;90>bjjikoqe8Ea~Pzc>#M zk3s4224_Y}iiEKq4;R;IIA@35kK|AD3k&c=cS^-dKq4i?#pOz8fXx_`>necek(2wx z+fY-p@ux?bX?=ZNUS1x|z~>+&bex~XQ~LpL_^@$sj13L9c6Qj!r^P>sGMy5GFFCon z-QC@p{q167V{>wISC*H7&Gsn0o`8+qUQE~NU>b-*M3pRbcQtmD z$^*t_7|s;FM};h(sj(-SGM1tLczT5~(J*!Ywtb2e2v}72kkB0J(06b`EhmEmWtAHL zZN-(h1I2e%%tRRr0y_YlXlEu~-XA9B0jV^cuo+{KxC-f^_R6!K#6k4;6Rt zih_8rh|FKpb}1KsQ&=31ivP5enV{~Xi6I0J4tWX+3LyJ-8$BVQRmwcVP>6ZeYOh4h^4~^)=FrgyVi&9B(k|7m4`wQ_fAlDSr}clg@s0n{fAI2q?El*V9a>aW z1mw8(7!?U(ZEZbGPaKhNv)U#WNtjLavem)U%PZpG{g(u`tAqLE7F<2!`Q*<_8l=vV zL9eYuZ~n1RtprJEkiTq$MiT+Vc$p8O!3w3{uQP)`&|qyL=0D)rsQ@3YfCq;*0N~4;nJRi;7NF zk%9b8}hAyAi_c~b zvVXFPE^6eay1KfAghWrK6EFeg(!@3*8cK?bn7FvlM^nbr>L9&UWFeP>IztIEXx?-g zYvobRR}9(j8^CvGM^jTzBM68s>?osoUEmPyO%VWOftcHoItcG;Y>RxZC`i|PE6p5Y zX&%?de-~`Y0a#sJUJ?m-d#<*5QHsPf^{4Z=wB7Ec0ZW0}ZE9)?3Jjbn zRxDgDkBw%c$Bq2!-e%GH_y*iu=PS=4MydFqS4V3J89$I@W4svUVH zE}r~D!D>HhUBEhYA+Os>|E|~=Dw6|-N1G=eF&nY1|23Y7C7<|GRCE&^S&Eo=0ftJv zAjypjjPv0veJ3p(a-iY* zf0+bOZMCB9?C$pc{vEPkWHDD!N8bMY#3S!Hs}?W$va{qjF8L|^RGXJa4Bv8_SF_fK zm}n-ls9F-#M%FF)EAp7f>H1*rh)zlCU-{x_pRiqLaJoPpnb&K4Byw|elYj29^8_^N z=fUHCVJay24cCK$Upe_RgF#4G*wnsoc>!3zM4;R#Eu2iu?-iup!+pv%Ut7vzRzicw zMXL*9OKZC`27LVZ>bm&d{(Lq02BP#fyjuWWvU!Bn~2=;~j%oD?I_ z%Q}xKKr20ta1h|n?>wS!C{* zNXin*xUb2O$+{fo?;nP+{A=?O>Gm_MoN{I+VWtEkE zASeGU#aOQSvw+BKx+o?Y1gz{5wH$qxIK_U* zrJZl3rE>isa>y5S{kHmCbuIQm{0JL#9aFoBy7VBur^D?Wyqgp0L z7jgcR5(<$2P(*WDD)hL=PmQI zo8INYOcaR#zw3$a$1CxNw{p~2?_SsBJrIV_4gtr1&4}ER>84|g$_&kGA($zutJ#Sy zd`k*DbZ~Qz(J7UlOZ;(Wx{5HMN+b-2aLnD!jSnP^`+w~}>+82o3*@Mchm%i%Z!@+( zD1?8+cqYPUT}#Ux3I&s@95*~UjGj&Yt~M}9mL*9rscF0#C0RKleU$zb-}x8aC7es1 z)V2W(WMN@JziACe2vYU)=QEH*pNG>v0OPB_?8vF8K)O`Uo#@{_OJ%cgcXf3W@VFbn(`WAWwW4JeG zH0EeDm+_K`qAX}GVpTOYCCa5ZnThP|>;}C+>5aqJEF{F`(ADjf5E5gG%(3FJ!;y&G z$RC5&hz}M8qwaLoX+-L7H-nrE4t}(~5sH(-9D$HBGRmIZN~f~M4A7REmIgov9?X=6 zaq$5PX#paJ7NwB;!`q@s7h4$3RQ@&hOmWM*Mc(QTB6979q@L(cke2#X9ZY zjSKI{^pHT<(U(aw22%%%)VK2|jgC`Cj_mcnrtzNYnxWvcY=+tNep15&lG0i%scJRT zf~oz`u&_6ot952m_I08{egf3Av=~`cRaO68ejv4<&4==V@<_`8@4^z|^tUtz;T36x znh6TLAsJ?J5n-v?KNMUh!y-3PDpnkR*Xwc zPzG{G8^V@&mA*d@&t`@%L~)DLI3OV^rJvM3hU^Ff!*5{hZ9QdL{}d&~U|{e+V(;e@ z599)LTWflP6Du`|`ys?!_Sw!?gvr%Rb>w9klY>fPwUd(yA9ue{>QYDric@0VjwD5+ z$y#b3RSk86`0eXpvGB>lL|oNR5)q%MsLppiYqFguFc2>bj@pnk>02P4S}ORf-$*ye zkMIqP`mKiw`X_?@yLO)kJGpQ(qo|OSsZT+hxv{Y^JS=taDp`xc#o5^z1oKAn4AlP~^P`cagDhHaF*iHM zOiL@d71;B`dODDqnR#+*s#w(#9CmgeIXET?IJZHX3k(bdkqvB zI$UvCzw3s&l0qbYFurH`6ebt~1M$_OAm90pV_#$qHB;U(fl;FACuF=_h7OgNVojYQ zh8jc_D0OXSq)$a<_$d`d z9&T=K(A|`jB0BSpfq^2m#v>X(tyjRAi22;>OecgUMP3n}T*}S`^P-~H{w9@$lc;6& z5IC=8ef?4aYN=465I^5Qydm{`4G5tlXHi|WI+6{dV31!uA>oJ4Q9{e%&b9aZz8q!# zP8%xxC|qTR(cQtQQTS|<^8=6f*8)CIykf7*RS3}0v#0idaqNqr<*Afw*f(lruOWET z($Ea__mA&8KG1_@D*Mhu1i`|_KD{XC;(R&2FVlXLaCg7U{v7_xA_(C`k;DfS}RhTHRl|3ru5k zE;lc4t0x2#d~>7ycBtK7hg}TDgwShud@aX*9S>76S(h3;8p}B3cBU&f6HUyrZdXU*-oC3#1n6Et1+y5D^eOJv}pc-MVTy z8nv_wWzzq(-CK|T;HoRsZu8`_-|7bxZ}9JiImNQW7YYQ*pVieL4}`6$q>`&_R{5WL z)igCxiMSny66rxdZB%-L(pvR-ew;2=)F^*Su=|rmy;yC~7l`;4g@9ek&^SY07x(4$ zdIFtloBL&`tOvAU5E9ZCKlsiw79F!Cl9yh_IS{F1qCp$u)zTV@n0xP zv=~U(E$26Whb`4xyl>-(S>yCR-x*n3TLbl6JY#-JG-y}@*0@5WKGa|i-%mP?{qdjA zGe|4x@{e>_q2Q9<&yUydECXU=V`Iq0!2PM`u451HZ*8$U9ZdWBLimju>}MKRWL(0A z!Y~cUAX#wp$^NZxI5mXWzSzq7w!TSLji_N(agFFac)jzTP4e3~uh5mLkoYH4vh4JP z7Ex+RIG?-y!j6tlUSkZ}Eu7TU{qy`*mX<|f$k3a8QP04LBO3m_78Ddje9M64$^G(l z(o2)c{$)GFf6@8^BqwihhBOYF(0ySNkk_>9&6T&Y{3E`9PiC`FadrLW>mZMX&Gg!s zl8UOpXed$Ny?+9#$ z=chuO_R0DAdC)%antf~>96n%zs(G>%78lSaNmTLWpyxYws}B*Oq>9|5?S5|9NmcP^gPsC zY!q0OAU%((BlPk2rR09kb+HK`xrK72!;Ik}#eEJ&fp6P;dCwk6v;@i$K|v5AE+s|C z<7^3<#=yXUZVv;JrBVt~*kYrDi5|#P+xdQw4nljp-{5{$R#yD|{06_ifr9j%f~f^s z6fyWQ^x@$F z6l)|NOF<3?+Xp&2L?omm&|O+T)MW9W>0b7rd);4UXJ=!3l>@m3IrZha-fg_E4nl&T z->Z*>@2RK|I1hh^yL*(BsHz?7EhnVm zmjq@>%Y@2PvRKisN*iGgm?}Tnon&-`$UTFvBAA}t@2VOY##$Q*2??PyEskcRfboE_ zr?Z+V7|p(>qo=>TzRqOQ^Gp5*6Za*F!D(+?@I<)k01Xp!3KXW#({15o#m&|LCL?2I zu2_`HMIZ(yCQ#TW_savxG=E@J=;Wd=zvJrMLb&_*%Ju1?(YN;O{G4l8WnU?*3&*H5 z{MTzzIM-?DF^#Mud^#V({+YGpr-_(%va%ac(htc`vhs04NdC<(>q|D-(gex8>Q#?L z$@mXtwH$t+-SoU_LQDI-U^tJkd~prJ?S(e^Di<=)<2(ZAxG8&^HArluxl)XqX5ZBVc4gJn)PPEZ z8d8Cun|u-0wz~tm)AKGTfCOpm?jb5FD#IjL1U4-vC1Es$G+b*mt zsKGUmlyW3hK0ngc*BeRtO+*HY_amFI@WZ{y^ON6Su{Wsca#-8RX06_j8frhwgs5ZB zMg~g)2rKDSD=q+K(^^K^f)Om#nuP7^0e20xF?q#jzBib=@;GG3kqOrs6ao z8X1wE4y0XJw%NKf|}s$ZS-9BPCoG(JJltQbmlceC%46Pf1|*WMSLK09jq zz)6Mi_A`3VjgfV-;n7hXUfT-IpA~Xp7Yc0-oLC}_h}+-SCvwFAAXReHiog6?E);eJ zDj_HMtfhqa?G_%!8DK=vZlMe9P0J~OOty!TeqYy`O%>4Q_(9N!i8Eqj6&SvT3?xg+ z%5p4!N1k00%HX!y@6M+sTGim4-C0xo_nd-2Yuj9qpQ#w7*5Y+&`|Mrr51S^HzBswG z)arHL`{&PS7!HkgTV4t22zh8;9%&d38NH@oJ)4^Pw+Lib8N~rReslL$NS+!`21lS`I9dy3=1A7 z+QXFfWFGwa+SRYW)oz}c4)nuWs;`T*zdaS4!M;%!8~HgZLc--OpHQ;j;xF(~9 z1_|lzkVd*&8tLxt?z{N@aUBj}DB#{}#``|!tTlJZozYnCD4*M>&K|)p(18>bets{V z0c&_QaS7S zdV659pSMAGr{*g#h=#t>DLhs}@3mQ^`1R#yboANTnZIxniqyK%Y!&^5G-{8JuJ2Op z>0rFc4m=vK=BqCHCtVYI0cX9;e1hz9hsZ#OPh}dUzxsmf?Z+p7mpGku-yUj^r3i9Z zH0cGMRt{r2I<`}qTn@6UGkmFVWp}$r-`lvct+na0s_co->3ca{fzVki!r83nld{ih z@=tr>(}xCXz?z$#VqiGkbnmzbEx6G~bqOT*sUkM}pZg9D>TJB?T^U30)0 z0l?GWS8;ZB_CZoMpR37vbY@yxoSZKCl;?{^lrD_sqy#H$A`|Cbfht~|KF0SNk>Tw! zM}BqsT`jHc>-Y>n>*|*t4bERbmN7q*HX9NO_zce3e~=85FUbhW*?5!Ot0MPv;|nMq z5z7y{cP5T!x#P*4(4EUSjFrljxn@ru@cept(pf-G?Q$EqLy2Cnnzn}#TJ2AZVtok2 z@co7Fc0;Y+f<9I1X{Wf>{oa~leZ6(=58uKr5`Vg@_1wcq>I18WVC2D`2g z!cNF;fuoM^BLaF6u${z2M9*&vL`TcZ$Q*-MO;0PI}j%Swz#%{)G~f)TjhpZTbBxH?;H zid~dMMVM+qH+f2&zfrg>0h?dtb)xo7H0o-uANvl4LGS1)Q4|uRFH;Nyg7VY13AUI~ z`^XSJ5^;8T&e(v0wEgWM&tomCloW!NhnV8%yNipr$-GOctLh)P9i@_D{r?ryXFd4g zzx7G;MEuUhVv0w^1)nAQbhqE&c)W=QX^o-hBW56nCUe3KCbc|86R1~yM~Ga}{%Fve zDLnG$=uQeWI^T}KmAfN<6!IRfgk=-fTUe`s0lztw9G?ee-*$W^&E&W^nhHZw(lo$+ z=%hT!b#1AtCC$!fo1jTY5OdR<4t+HfO+Qiz6ZvR7M%6Y^XYw!q1cc;#d(_wP?s@Wx zMnjEH#amlj+b&vutFMS?>s!?(?j<7bR)}Z8sIUl7<6s9^RK``t%fXH(}bmBM5c3=AmdQyy#ea| z?Vc$9*_p4Fr++VozC_<$b_j~HGNg{lpvmQ_kPHIuFH59tr9-BL=Z(g#Y~Wy0$5_sL z+sziy%q)Hh67n9YN*_!A+p(7%6bfi^@1n^Gd<^pkSXKftNFPDoeh=Ll%lQlRz+%4k zgZV7Wq`3huvM{iK7^FNz#KePI2FlL&*B^T54EH8WZrQNke*t(RASf8dJlx%FFkfrk z{?0HGFz|<$bD6>+Krep$fO>j9)!Xk?NLhiT2b69DQ67KABz#)}ugmMH<Ibch zuiDNfhe zM4;s8_lk21TD!i#IYSUV{NJ13Kve$z{Tm|f3eu-YsT2_&9@;?U_G+h+CpI>gy4KLt zbnovkra#8x-P71e=tOk;!SJ^}`eS2bfDGUrxq&^Sl}WCKb4GdneCVNX<9JL=^o19!Q=QW9oX~K^zVH>COfS^8^)%~4F_5&h(kCydi4j?T zA%3jr96-&L4upYw{OqF>83`dL=R3pJ)Ax?oejSxVsyzBDTZ?n!Gb4;DRxUuk7mK+a zGcz{;Er(j(vu^z^74|GvPck$K9l7xTB?{YSqmG)M+mznx9nWTFuFb!m2oJtKwU zu@8|0RC*iWlp)LQOu+A^(6t!OLD$_f|7=u{=8Zz+-C@BAX); z8OqTwhOG^bR<|tsOBn2yV+fZ0F;^I&;@_kt{05U&T4A)`rvCbcL=j@KCwLqxqs3w% z{KI0S!|oVaxr5Bg#s)BMVL5OIRx1Ltl7YO%j={f}v;gC1C0xsrq*R#qX}`qLMy7ei)7rEAX>yhH-S9u8q<_fFWbTs8U@KP{uO#yUqN-=>TDa z2IzdFGL5J41IiE@9*#E>(bV)%Z91h|V@BT{56BONaj`A2u+inhM2E+LiHRwSy18?h z(1?i3?u&BO)IQJyIs6rbm5q%H&|V0Xe4pT+k2*WCk&*FPg@zUt?d^=`brs97ST4HJ zzcurQ^&#{2_O4QT`|B@)pSzrxlvK0r7W&hr+x%Y%8609>k54DBdQR*|_fUVMXF~1l zeVLL3&Iq)NAXO&FWDtn*npDbPJV$vXWnb(vF)|hAFqgREVu?#{PuwVO;!khU1O%3M z!FyWgY@PLnAdRuTU`)uoloX=6s4#T==}<%ni|SOh##-F59a;^q7%OyiIt!MtWMbTBN*de z_k$CKnf=K4cx59S3ekt}o##8_2+2;*^AEUbJG;A6dE8awKikyZcLrgvhCrB<%e>;W z`A#pUv?@(fd#B&M-yDC#zyLDir`K2Tt$F;uh@ERw{Zm^@uikO3m>@|C$3_-WsoSO8 z=KByDw?vXZJ$^}G=%w%z7XG)hd>04%$)EW(Dgpe}QO8jWTs2>Oo4Qvh>h=uw>gwa? z?-uBS0j(AKBh`#e)|#6BwIT>gMWgKNI4YI}^B?K_n)r4{$l2Hwl_zh2uH0T8FfI$x z=yr!c@x0@=wb%Lr&`@oaE7fKUFCBby~c;hO$@ngqIwZg|fpYu6J_yb)i1yI0zR zd_7d8z_2SNqA*#i#pJ|w{cyG9xIMx@U8jJ9+_gJVl+dGAZIWa8?r!6kR&e7sXa~-l zG%25)<)+);@1XWr-;ewiRLMbfu&#LTJG`s7qe2Fm{%+q;sB|ueG~UE}!3&3%`k0)O*~l*eu0aHx9!uyNB}8p*-7Xj-|q&zqQg*%w3m$z%CmVQ){& zw8}}*tuZe!FfjQ>FIY*Y_YYL5MAhF)2N?qcztr&0kKW!dH*Hh9yCzkq7^0%0!kZ-T z+1G;0KqK)R)(1}XCAK5=>gp;*{%eE(hIRA>2M3p^{mD!bQ&9K^Xlk@(YYT2tmS=-2nP8AQ=SFtG8s342=^)_hitGoq48)zGhOeHv4X=Le25DpaA=0tdg zvV;7jPgOe3gdM(BhRw(}Rgsi_yGiVv;$lCugRwjCh?cfD5JK?y9oVvS+FG8_Uh0k| z-&epPX)iS+VF(K9JUt@O7oelJ7L8LTX}9q6m{hAu(UaSFx6qHo#3pbSPwjc$?$CZ^ zr-go>snE}D>@n(P&-1w1z^|I~Szp)VOr!VpiB6^uX4aPtN|!4T%GBzWNa30o>o$fQ zUoCkq>D3$DcVO_|d+p=gfZNo+{XLVfP?+ZVSf|?)UQ<((!exKEnPeGG%KL7y&avI^ z1vADi$g(8!+xWP+fJs&NHXj6up>(wR#S>t4Qo%o?;Z5NT7=8sB#}`> z%oRYSrp6G)myH3m3ggTUG*2)wr}x|rIuLGKgC8=Yin!D zYb|1DvTG;Kavc_1nXFN|3F5)FHW+W93V?prC2 zol`3HcJw~9>4Jgi63zK-M#|CV-MLk={H0zrT#kzg$lD8LR@x7FC81bU)=wA~{q+4} zezFA$|2mqfGc(#Am)nqxnN>?RbAFMCUzkkt6Bu zFe7^;1fSGpVt=@@81;cL_u7ndId-Nz3Y$jA0`~Vldcr?j_)0j)z+?Q|oU*cK^oq0S z3SZk?Ur%RkBjB>jm&1;K;luZ6VI`0xXJC3PTPXb|4J3tM?ON(*j942(J-zI_ysQ*2 z);AguGN?d(>`aZhT7tPFWI2%3;>ub>EMd{7%vL zp*ByF(&YkH>S$o!EZWd{1Nn_6s>Ddxl3jF)_wY^%l@1MlJ!UY~66ICyOZsH?SW6lN z&NHl=?F$!pSMYF@KAaqG*H$%wn^UGOiaVXBZ|~L9eNTffD`dPS2|Lnt(3ZN5wv3=iZ9m9phk8a^ zkbcW95)(RK6bhOZ`<9jtj$}~fng2*3ZhYi&a)RV7v<)P*uSH9x`gy};RJ@E=)AaZ# zAJ3;j@` zp{4z6hgqIMw>!wbRAsdKNzloOqp}fzq~GV-y1Mc^*}fj(&J>D-+glgEOVzdRF!^KK zmFSoly&anB>gwmY9VCyJbCyPdapSM~R765wk#pQHPyjB9iizngb$C9>Xkt>B<68OW z&l3=qgh16S2en7GsEY}z^K&FZW5FmoRXa}y_^p82Z1@0FZ;uD<8RqF`;u>PCfBUHANo2Ysl3Xz6q9|#1!U78z zT`1Q0^T}%7D(H(BFWA`F;t=bkQ$KNPw?ZJjfL*@-k`wD*T=XCs?^=`1k}JS_qkKH@ zakzJWSj+PvHa@=A{m!A=zYP2cX`UN+9i4U`^q8&0MiaAB{k*e^J?_?nM zT=}B{v3P}5G7FGu7o!ouCXz3(X5X#?rD|urvk>PGVvRqqnV4bcq!DG4ro$4}!28I^ zM5Yi3V#4RSZ^MPi)MH*ApxACLYI)omE7#+2=;Mk;w2x-B&q*aadGhDLl9JYIUHXBCI|MLDv(ldCJ^*p~q#7K@pR zjWG5_zDM6GcMg=}_~6eH#r37@#V+fwx)?Z! zms4V>FJk>;^c+9THmX%ANw8^p6`r_hx+Vq}+$%aVh?&B&1;*ph@&UYsgLV;OSmq%j zZ9lF0lODHwCfbIXA}n>`@&lK^=)WbTDsz;U`%|)ZLtVHfPYgIDpBMwZ@^TD6OvvmX z&o59k#OvLnJNaagWLv3lI~VW&SY)7(+e~~SFrTZT7JK=YBBxl`>0p-CuVi~fRZ@%Efs)DRgOZb>Gwl^-?jqFvls zCWOAjhNLvM&ET2XTjk+d%=`L?*Ipg#FUi7{5R*^i!m1ZDi{e9AVg$={w5tv|UHhZ8 z2j8!6lR`!kdrE&T=k=B0Vr9Q#SZL_DJZOy?xOP&mMm88?$?`v#ZJR7#Nz7?>fQOd zou4W?C)z}n>OlnW<12jp=NF3;7@!cdE1cQ+&>HhOhFGTl^e@s5eqzB*E*C#N)lG?V zva{C#UAi=pl(0$V$kA)&Q>KYU(_Cziu8pR`@nbS77Hcal$>G>%UUwd-M*o=|s#(tW z<}Gb6{iW?mq8G~}!ykq$Fi%bnpBm~#en8e3`%NJd-aazpX(Yh%d-d62(K7Fmzxm~f zye_=1_pax1F&{jFEXCB;v6ab<4TrTrEuY7(0*3>tgnKOmu0#@Ip0w>B{g>uYSdoZ; zkA@_PrP*?Av}t^bc#StSc871?$40gdqRmzrv;CHZY>#BXwJ0kiQ&Usp;^K;jmG$EF zov@-E$O;{|z!a)+Ffy8+Z4R1F7Jp#1AC?P1C!Q^kr**lxz1TB4)4(;J%;C7WxbPY5 z?9zE8P()~Bl#*32FxX7tb{wJMvfrB=BuMeo7x=lZq~$)*;An|pY4TS8a(~9H$nI#c zi9(~Mh+w%iutf#ltB6>rCcxoPyHvRp76wYDMwnG^ly=1|GTQF=`WKW`5xL8u;fV_5xqdN?n zja@X{uUwa$<5j9Vp2VP)#S}W|R^a#U-pb@#y0-|qA*m_EwGF;WgjE)3CLXLJ*fh+{ zr(W7NCGe+bXR!qGk?QnTu+NKYrDrKSDK&8N}q_L_gzcy(=Ul&y*lxU-Lj zLopves-Tybm;a4>tII1WtB{g$XtkmfRl?E2=ZXKr2m$7u+{Z6b)|qZucH^_#NCjz5rHAHM?lY&!L>>mp(^!7x?lZhHV- zg;m&4{>mZ($FCcftTbDciy@YQgM&lfrQ5!Y zo}N#{+z!WtM2p4E&dvLcGlLUU@C^bn_)eTE?%U~<8x#EO%}pM~1ZHo4^6?8suH%lL zDJ@?s&D79*QD_ql`{svvgHQMSgAMq27%%AJ!sRnC66TAB=v#1dxJvZdMZro=h@YQd zT)f{K4(ak}snqF;hz$k?M$7F4;qG;nSg^K#fmpED@r9L@RpiICVG3AS*f+TC_xEm9 zH5l6dSP{sphlkBJ8~p(M*f%3(k&ptx1w+~1b7|VCyWNt(fF3-$h`EkDsR)ldT{TK8 zw3Evr4`X(-axDP(gtX#9IvCl8XG%*cqZvh4Hc&&0&UxLnmpy-dTR+jvxl%661QjNIIWHrx+TwSM7X_(Xd@ zQz__?`0aUC8{Na0mF3btx3D3al%A z9Y`j>@v~0bkI;tYYvC3o86o}lc_+jFZS5aIMH-f06Z4!hPK>hCH0x}rk*a_Z+aoP) zXvD~vf5(#Nleu<;XN(9C_NH`&&svnrM@OE(;pe4!s2+c-s#zPURg4iP8^E)uI1;8o zM(3(wD{a0l{I;bF4-fxC-HI-l%T=_NfFZLwVHb+r`o+7g_wDaU#1$R0rP7rSi&=bP zdeUa{UM2dPj`5gN>p9~}GSYVxIG^C}h!QEcf6JPxPlf~scPjk|3;R}}05yS!0M=k? zxn~}8UI<+Hr^QvJg_9V88UFgC!Nu+b1@%O)rBJhJ{f_pe>!^frm4fmO0Pa{uB@tm^ zm4XFbF)=Yo$*_Wa2WLTN#X7#oF-^D?fj%`CN(JK;DYW?#xStS5ZlevzA)dpwZF(cu zUh0cc3`+jDUHIas%-^9t+Knlz<$TTf3L}rYX}&^sTpI4~pQEo#|MzQ@1P4h2O8C(| zp{=Wnnwk0KU|-OCy}*tP!FF$J>v(5-$)~ZMt*xsre63JYUd{WjGuNZyroQiA?O6*) zB`Ai8%+;7{xgM}G-h3e>Aeb!GdLAS&bXK)iSk-*480KY~ox*LTyh(;&^#||wH$D%} ze>-HYxLnTOd7ty&ICNuW+;&RU>xuTO1;c~pG9t-9O=Q%6EhyhsSXlTx^{COg@^?6) zvb~)h5t~^&hT)+brO!LR$yx&O0=M0XBK$;5JRF?$_4Sd@yjc0ae~U!QSz21=`Vo~Z zeOp^zUq7EUEggJ5J;%ljCt&hIGP+>OjIr!@i%?Mw%3r zjb}sLSt4OC_rsH9<1$!JyJw>?FC#dWXCUl{Z5!M&vKR!oe)WQ)OjgyE91dR~D>|rq znMoVE+fwn{F^Wn`N~)@=va+%&Dh1;^sEEJ@0lGj(M=w#W&LnhsA1=8Qpsk^?5Jt$p z{dsC~QVvHL)32$iDLOj(*Dob)?ey~(Mye$aJ>kT;q27s!iLO_NtY68Ci;ESGKN)4a zB|RSrHkn|kdLZR-d!+)Emy^T%?f!6kq1#+5IZk0`W0MFpwbA*EfIK>96#0n2ySuT( zc)(KXqfOY@_03JS#loza0z%m7>1kgy?bDIx)0zZF1|7q}Z$4OOQ>5dvz*Co6WmKiV z8Ep_M7@gFSKEnAZk!&NnK&jjH_Y2Cb(u5MUqF@CMe?cjG^(MAjfqjO zwaO?g6z^p1uVn|-HJr?83+{m57m<^j8?4?yqG$w3j%m|%Ip3u*q!rL=I1%Ub14FEq z`A%3EPj>7*JUr0RF=+6&wzl$ea!xEQ#J_%J(rVs6I9LF+#jktbAIrG2v*Y6^%*n|~ zB_<*w;&8N>LV6{PFW@J{UHRoh9V{Fi2*W5>5)p@0dUG?0j$6v8(R`gPZ97)dG6!L` z>Swd*GL=dLG*TX-l0B}|>X&u3gR`~u^{ThIM(he}9Imk`Z{AADH)vq@7_l_ppZ=Xp z6)kr@GqAKg8s@nREkSy%59{vx@hiV61R@hPGKfzxm=lrM9&U4#?MkDNM#mwvsQo^f z*E989&r8&0YgpHT4v=!s_e%14wyR5c1hWyCojeSvcf_WpamKY4*DcMDFi!GpWIySzE?p8M`Q|GInD zOwV3xf3E6&5TO?`?j?lB}U&4+Z{FJ>$^Mf1*P!_C?pedl5OZ zB?(WS;uMl{AE1fZCv=BAk0|U7uF^_CH`t_Fx`4~DH`MEQyHxcE@#5Eb)ujW7%t2vy z*|<17Ld-iKDmfg1nU*fS=xvs-@$3_snV}er`-qjhX;mL5lW=(p2lrdF^lrbKd{-Nv zv+x&77W>YI{URzV3iiY%qgQ@j-g$N?s)=6H6LUveB7)A}s8?>-tBLU8#N#hcS0!(u zOp__OUpHlAlO0ETnbI;(>H@h0RuLS(02P)N5fX81Ng+Bd7j+RU8EEiekaMnXq=b$E z5IzjU!b9Vl^w@lAYQp(TkGS~_-^`51C`B=$IYWA2Y-|h^N^w}9xwEqzdZdDh2^%F> zbGTXvB(E!MJ%6XFeo4W?9x^a2#HT-N}vHKe_~&UmzW+4apG1?WY{~s-;!!`99v_-Q1CKeg4mh<{HiEC zKEA#HRnyh{{HuC|0`LW?4FiZB2Z1?%!~&*S$=<$?D=*$g4?!%jm@WS zi7se1Y1tgl7!hPvZESpBvuck8=Y=tj2f)3%p8~Xv31LUEo{Ey13@Txo7p=+O-ZuKv zHqXw_i3pi0pmF{fFLTxAw1lxqGI%@Z z`ul#sIXZs6sPmLSg5<89&+mw}(SGcgxpuh(5Toqz$pXXg!JI(vVa6H2MGFMFoUBx= z_{%{cI)Sl+`y@`lBqaLPhb%9PT&iL80|2_~Yq@T$Ci>Ey4*?WLE^&4qUE+VX)NLKO zo<81Rv!ERT?!KMfe}V$L<`3I#8&7J)oo;S~pugsLn%Xx7Yr&=P-61-Dhv1?e;ijSd z3moqGYHMRtmwOWyQ3al0ZDqr!COD3oZ5~`{2&P} z?)6OmBrjx>y@H6{HW5HJdaa&mF_a1X9d#GBe4PWOlOP#OfidcbXhwmp@YPafXa6>7Oljq}V@|m6=IP}X@N^ZZ7*g!D za@Pqmg-_HD6)E0!c6E`tFpi7h?Yi($^rzBNdu)JmP)4cVchK8xdBC;}z1`#9C0-K& z%J+^3P{P!&d8EU~t4SC!`Ir{G%bp*t#_7I=-FNvTc=B{;$A!JzW!@~!+Jj-JR??4+ zOSqkZoolS$!7!+QmoU-rWn*DM!$hnYTHjb(=#E^HI(dic27TE?{ru#tbOY6^z^*Guan7t`UaaMGUQSi9OL5p_u)Yn89AlL z=d~nXs5oIvgyhf2AvR7Z6$7G+fqY;}rH7XX_xsI_G6mGLnx>mL^sPJs1oqI8q@^Vd z9YSRO`3n6!*!V%#)-1I4n`B{C z)H)9Kk)&%eS<@cf-OKMa>3x^&-_+WSNb;?2isrsi&Q7-d2111@s9H|~3<#=I66~ic zwWL?SigNJ>(TsnXytdZ_8vNctRMNy_uHrGwg@8b_=JL9R@>O2Xxis9}c9jrJC;_RUOPS;wxFQMK1PdzPQr0u^ykcx&{mOadRD%uLg5c zo|;Ut?~{;4(SUhAOOGe1Hk1}jt{@1LxvDhG=Fmvc_|sn<^~R<` z5dMVJ1%auza{KDjZa=3ku(A6l1UTcmp`sEui^pORrBx1uAPE;q{K92QoSmI*1muu& z8(fP=w-OnP0_pX;-0RsMOYbBA{MadIDUXF)foa}7>D2t!>zzv-RuLNNOVqX0>wJzar*QV8Bi7t?ENvR`pQxn0)^$ncMlqq;l zPZ50B1fzF?Lj8S$q*a>U;-9Zkv}9adD!$JAo66#p+Z$TTNS1RQMpR@N%Bk&h4{#nz zHIYNQ$eHaVr6b3QBSe{vfbsV60kMSHt;@EfBk4k=NIKyy!y=6Idx_cSA#oO>tpg(; zk|LV+kn|1kNrzy^dno60JRQA+q0v|y>EcZ8nt*Q;UBiuj48=s;E~1i`qeH$BrhBmRt91598SH$U?$KC@sQOht z0-$r~N>Lu_hLE1CD5}UzO&aMxs$0wZYjNRO=~0BQ6Ss4qL<#`m@B01jT7bG zT>!BxW~upU16uN1Ma#y!23q8aj}&7oe{Ptg6~BOhd^+`=bI9ZIcYu3EO|m-ScHcZO zm@;#-RpKki86!mgzUR_~bcP8{S$uZYKE)mUmmWTW#$w0X*II7YC~f2n+tIW6A#1et zTfz13q!6XhkQU&?go~@Imi;(3>zGAvYoss&u@;bF#3v`uPj3l| zg+6*Cj2@cozVtp`dPsSX?)>?)OZU5j^#oP`e2$6_S8Cx=xHT*KPJ?RQ^OjPzyRVNh zo|p!#nI|iIT}!Ai)POgr)G zow|DUcI|T4%ohq|;+XKR`?fUI!h!xor#L<|oG&HwVLDg73H0iXIe>tGpwSM;WPT|5 zAeK}5{;uT$U(SuGTni@5k~qKHuvrb^EBJOhc47s6mB+0%lIH&WrIZ5aJpsPqGBV3W zli1Ysq82$(O=e?ern~k*i4h(ZMV~0vxD;g#H+UCPTsK|@wgReFd(o!6y?hII!3?gm zl6&e(V}g7>X5XyA+``BR%JY51^krwJP5|LFJC=vQ<>#tggoLveYkd!%=X1gi*8uzD zA3qVl)HLvC{FnAPslnbu!RJ^R!OgSWWaYj*&goUIy=waY^1@{ z+NM`n1LUDw&zo$|cL=E!zf0&Yr`vlvgi>o$=INBDk;9}v?UyhCi~|GHLB5>qUD{Dw z;;GtAEe)A9jgy6232YMMOnu7ZzlZi!dn(51!-Dz@(N72GWaLXQ1_p-sg`djd#l@SQ z9Sp~>rF{KOeqsH=nVkH=B&|T5WRMK4RKuRDv+i!hGU|Z=KmxRl*=wm-ewW`oxjL-e z+lz(%ZSqAxtl036wbhOHW$?@Pq;Qj~D=mjc8H&u6Cqj%p?S|$2h^3)-u^Bc7#!1dH z*?m`Q4?kxOo0zOZX&zLp$@-gztj-r(Kn_1L#mymbuF*(eS_VUTwlD_SYIV_dYn1^7 zL&V=*P>?Oc^s&F#R$D>+r>fNWdhZ#0a5lQ>WiJ_t{#tApf+uk|_u$tOthWilpMrFP zl-^w}945n_1!)GV!9EzuCVa#W{>^>WbhO`b9>h7=EQS%v%$evQeH3woHCwd=EK&4W zlLUOfkW@-M-;Ltiu9!X3YW$_PW|Ol^@BUn-vpZCwGtx3lX)TqOvLz1L-}BW^gQ7aj zRA%Tq*UGb%mac|nAD6(_`Lm^~JEir(F|If>oA`~P^r$WR5f$#JR6^;83tcImXxQNJ zFp3`!qTEOH%SkuxGHN1_shiD*b}cru2DU1@COshI`AOSO$r@cV1}_s70s#?ft*@^S zOlnwH7P9zQk?1E*1ZQ(uBos^8Ea*njdY#fc#kYoI{x;j$vH%x-_D4L}#@3qNK(SFa zi!tlHmZ2SD!lQRhwzHxQZM-`L`(x|EMDlbxUX{9BcrvLL)7-<^*(!yIh@8~qthz!U zj~aI5)}ddnicPUmBMdex>vQOI&I0bhfelIQqe|fQDJp8w5aE$or>TF(*qzw{(X`;f z(}Ki21Gm>TMc9q!Q+`yidjC3!&Vrvpio{;`>wQw>h~WJ!t+w_`FFf+8gv9I`p6BRZ zys_e4ejzKbFDi^WJ;~&WJ)j{nu>U!57vuTk)d7C3vA&UC+Joe!!L;YlIvgEtRDX-fk4j5 z)lsTS$WkUW?A~h5_e<1C-ne{0sv(NReT8#SgECj?UuJMF$&}5)_xBz6$~{4z5E@7@ z*cnBo84t9<9HtIpO3OPWR1=4f*OYi61?vKd%d@jCI`t<9xBKyDSVMIy001F71zmWw z<8CVRrBIR!{as5zS9i@cmz~z8>tFl2t8_=C83wBOXqEfP_3_<;c# za>+N3ac&aE#>P%zom5m*rl{901=R9bK9QqEiuYSRP)Tqwozzsu zi1B%wxsjpAO`dJt{sE%02S1ZN-{f$;5eJ_!dFu%&}7 zrfAJfOd8wes;eOJxD!bw>2op(aV-o*bbl@7&!Ll~^e=Gw7jE`Zh+oZ+uxqJhB71|Q zcZPI;_EpDB9^d{Mct3Xf9h5(ul$7-O{>qs?xZ&jY!WlA79Nw>6=v{%e0fBX0V`26q*;!pH>TeH@tX&O9* zqK5#`!*K7hJ?(F@-8J-W(#+EMg+&e|E7Bkkq1`b^z?R#gBpoer4C*_bG`*7MZ_(Da zyN=<=fnC?KdV&!ql1`XFRbj?Y9fqy4=RL4}6|~7*c4V9`Y0nAlg-<1hX0If`eZM_4 zWmSiFC9J4pxZJ(ZWWT&c3hNpP;~fcFhTrPK#R0<-5UfMH+SLs*IR;B$KozyQ(xUmj z28vTbPjD#94irg|hb0q9%QWy6$VrY1ZfR-h@N57AghBRJ%>?E0k%4o=uZI$7na^0{ zI1uq-azKfq2dW{FZTj0c2J=e&CdYtEAVy4Cy-6^kfqqE?-X~%F5|njUr**&CX{ipo zRnjd{>%NIGFzaZ?v-FfWSB^A2r}XcvL&R0z$yrE9Ncwsr=`uLdyh-F>i>&nYQr*P0 zheP+!5TsLzlUAX9^0+qkY|-Pd#H7h+Gu$b+Vb1)$ct1=`lAo#8>qZKkInFwMBxo3M zhuvTUx!`z3ms62Q8@*0Tc>>%vTo{{u1V6V%NDPnlw8GdBl)nHkf(EYRkDMh2gQS-w zd}0@J4ZO(|p-x8E)^rmJl;uc|LZUjmeO%@FGvre9SH47YUxPneB^hm4MbPqOt-{d6 zUJV~mg>2x&Yg45lJhhB%9U|ZH7v-AsM&^Ojf%!Xju5@v)_74wFjg8GZ^`?VSo*!l& zfiir&k<4@!rW#yh6+1!C{U9aNg3oSYFZKNMYx{T?6qNAo^TsTwd{NUfGb_vIuC`v- zdhh4kq%>QjwMH*Yu>W7tZvVDnZ>CrQ$Ff>fdeZ0#>gQKDuwx;=&)}`ATGc$k()g-~ zpEUIAaq%8hUH4w!j1kh~T|W`&Z|a$Q&H55$fZ{ zj_DoeLqg zA#<9?hPFAsjTu@~L&3eAoW43B*cr3mVNq~-0D`~V-btaSU%hL8m5zHozcV942B;@g zDOGYpWT`THTiLeuMC5Ty4Oht*3Z{AykYy4_G#T~G+6jr5IZ zC@VMUG05U*nI4w4PhW4 zL@onvdvB9|e}NQ?hzcuR-cp=hl4N%tM7c9O+Py_gEux!JeMUgK;SJh)X%y?HW8Zh| zlxJdcu*U;~XEFy0FD zMs^X=1F|@5S|9&Fk$q~ZsCleajIsM#UssooYl?evu9QDLI`(@`g@E=(fq&F9F0^DX zn2a!+c~zmGjd^~v%Y)6JW))IQX>^j{=nOA=aA*iRBpH9YC>WkMb)mriPWf(;G=Wun zbX{S_XQ0>kuagva)huFQSGuf~()9pLH2R)kK;0TiDa4lL z=ewCz2IsG0Bq(|U!SH?0d6yK;*VSuFR>}f;9$MPqb8W*>6hV-Ks@~pwBYgikqm5GF zw2KIiO|SHDqGJMkK4HU^kjC9$v9)C$?nn!+KbN|D7Q3YM)@Lk6Ue*-vJ}x?{Fu`j; z(pI#&&#eOI%ig2(nME`$4ny8AvW>-4C~GCj%jtMHDNZu6@$J3G{Btp#VxenN!m%zCQ_p{2FTUxZ|Ip=QM4h>RIyl1h1&zUmz~8YX{wt z+IT#l*W7XQ?Ng?Nbq!dcudc7d@7LZ2e8v=RkE?zYh^B$p$2nYyxd3mik%w5&#>pB!TTU+~7 z4CV<4DeTjJjyUy57x|0<*7fy@uehASm#q1#m>AZeHG6LT8!=WB3>J8OU=ZUnavlgo ztHjicC{s_)W^rYwnkB;@j0@Q`w^e>@ZvXVd@)^AUtC(ka9UF z3I9@%AITA3veOakZvb&=ki?5aLu<0#5)t(zRV=2w?Qr@+<2NwZ*F+lh-@dA{z6gQ1 zFB9LxgY|xTMImBGQOTD2`n_Tmt%7WP%QuR<12Hc<(0*E*vUPKR=KGPr&+%!`<W4!jvby@eA(H1tE zDoL)-s+jl;d*KbjEmX{z9KJ%ILs(BZ>>`Hfq!4mR7QBkW@(jF6SiZtQKLK9#`xSr$lj?=Z{z+8I6B|{<81u zv|HZ*Qm`nWr(sEnbtNT0g<>SV2ABg+GEy{VN`B=r2e;;-KeeLU>jp#v$|^ zT+#}$3nJI_Mh34e$#hZ?VVJ^8BQih~Qg}JtI`KUSk`+HP!f?H$hZ+KpdFa;?xiM7j z{=S*|+@FotjMONp<~W$ozq76*qVL1kYz>c8yAxAmD6WgoS|O@rjY%mfXlCXM%fVd1 zG!)xaH1OLtTH9z1Y>A_MZ@IkBw|uq0$6N1%*LObPVT+_;-3jT9epsE4PX)xqxYo9K4$_+f)HJl-F8o3>6Ud%e9l6N^c81Ui@*y7(ok5L0r zW3yqiJ~A2;ALRN+Nl>ZK)q_9FC8`zN^}crM?TH1_AH+Q(3tv?+C05e2FXx<=yA(Vn zdO{BlEtt^IMP%@v+O`yDC#Mz6Cy2^pdRfXIB?KsR zfiKI~$0t#U#Je+9hf5DbhVam|YPw)fUhf&4nhUIKgzjFAVvG*3Et%h!2%eEjqUH8X zNjITt#+_1v)Ye%|b1hu-y)E}{uL>HU_scM7pavq_?+l;!uV9c+{76aazv`>Z1_g*0 z6(Jd&X{+*ezPvrXw2MYg=xBf08=z=(7!^~_VaW( zUwW$Xy)kVbkBKRVId+8S=4J+?-CdVZWzv7+P-lhhr_>B4u7L@|yqJMx5egLNrQ*?E zu&9S62}*M%;4$975P^dt6BZI(x82KOvR&A`kI`v107VnK zLI2C7_3W|;$EB(sa1K~a6Y8x*a&t5IQ))zNf5EPmV`no+{d32GYtGviimXeb3JStl zXR$o&)VYaCWlz7Re1Kmm$GXw%Z-vNNCEB>4ulqU^Ntf&Ab9Km=X8)2waAOzEY|oz_9;k=e<8IdhAC0H_+WvTIc2|A z0}rz)_HjjA5ovi>R+YXP6P5pc#T`&aje2>N18Z4Q0;`Al{qrUUiCO`u%l>j9?Ovb- zpRbL0%aS6KhT)Oip*+bb;BmCNypLTfBPrdY4B{aLCLx(>aF2@?Y#AkfJxW2B?WKTQ3!za0&8 zkUc59q$AnH^+)>@L;(O|JpWV&tK>o#J&-KGzhe0M^4jeqhm^FV4iqeL+2!SMtewZd zeW27XkgyG8-9ags@B?Xpj#GQbwJt7ctd9yLbb10!) zjmqQhzRj{6g_g`%h|i5h6mox}je$V_lOP;3F$Fa>CGZp2ZJX5=tKx8QqoIN}8tP?& z;-NbOvfj*eQb5H4ci=#Ipa?y+8}jB3>wCKq^R*Y9iaDQKRlC*MfNi7k9PAg;$<@uF zp`k|&=`pYGOzyoNj~4-Pz?0*Gx_3SE!ya6)S}Gj(iJsA^mey8k?;papG?(W({qIHh zzNd{>F~!B&pVdRVg`$;tt{Y%8#20pJHQkRyb!#CH)o+i2QxQW;e+HK{^?ZEtd;R#**3t?J zu)J2rT&8zjUEwWGRli>f^u94F5J1-@yEEDf4X}n&ZAmC8&4{=fSsWG@6;bS-MS1if zfWH2o7kI9=AbU1LN(7lX!KoV>8%+`}(zBa-u6N1ske0qy2N%Z1#%5>%W+&MQ0a#e` zDs6&-f_X1*-1h<8H2ULi>}WpO$T$y?d;k)UZUkqe%l#m6MaJmyqj@S{mm6Vks zh`qe;+_2cgdUTO9Lhq*s2P;EELxZFIciUiuW^uHcV|pNycM!{@c)=3(%3$LQ zQi+KlpPpj&gg|@Rmt1SeOXfU^{H?vb56;;sEL{JQx+Du)W%LX4{2tGPKShttjV!Hk z3)}CV@eTCs=+h|K<54p3xwla-SaRUNROqssz?Y4l-mrO9S^ZgbMlp)PA_odG`90?8 zRcvM^2cg-X=lk}=%FWG96$DS?-%DAj9sr7+${3Amx_|0s}D4l4R# z{JYWdu66|({v8LUEtRfarj$>+wa#BXp6nMsqbh}J(|lT^PB-r{YX%;yg_dbwrZr=O zi`v%XhA4MWxSrAbTwwD4S3-#I`vmt{gqdWBJ|&cV1=W<9v?)1p;Wr_J%lTM5qYvdJ=(%5~V1JiwBHM{aju=OntweY~&9 zz1Iu+IJbC(n;BPuR;pxVb4&+SA$yhe0G090j!Flz1L7GvT7Mqb>eR8+UWK zZFm?R@2A|}wzvK(7*2?q!Eb9sTCo|uSD$yUiwri^q zB22cnbq-G8A~p=2_waU833groQd$Ln@5b-)2;RUBjmEC!e*Wc3GC9-4UK8kpM4YDp zs|Z0m8&{2FQ$|`1Zo4GG+A}ZXnf&^7KF>tA=99pQ(|1k7)zzbb>vC8@`~rVQ6Hr>S zX(xldhij>zM#^?D8nWtsDKS|m0T>}8|`7u7! z&bb2tQ#(5OyK-_~K5NK3N;)>mPKjS{$GfkH6@IT^!EUCl10^{48lfr2tw+DnSWYVL ziG&AE>~O_)Bp)IK8}3H<^XrQ2RJp3kLxyIseTX04OdA?p48i%u9v;4!*myb*K>~Kb z1oMt?=fZH5ahpOI`>``U^F|U~QW4zwE>Hkz$&6F7-r6Zap@@P`1br7^ZEpR8S&^$oW9=e)=0#o=tB{kWtEfkBQ7JO6-R*(OTfb_0KIf4o6FDNTet8Bl+@1(wr@je<0ZqG4&U**JP3502Pf)&7tW(4c!?FB$EyQ6|TOc8CT;IFCYi#kQPA z2`RSB_i3*=XA92m{ z+}*?`P0wl*U|A(BJ`g()zS|!)$9>ipD3@gF=%@b6zqvN`e6<6yPv7i~MH$pU5X7gp zqDIl|MLN?uTi&m5hgY(IYzBbkT&{-UMrtI(8hEbl_PSBJdr0yiYP{T&mAGvwo z;8qTD!Gshv%+RJrZeEo#%KN_sMQBrv$G5yWnN|Z-C68=0>ZOO4;d5|byp(!TzX}?D z{=Ai%cz;qLsrFwXh1_P8|v#O5x7pf0`cNE}HDUJe{Y=lMB%gUbiK-crDMo zogK}lWpju9Y_f*O;rW^68%3YIW%$I3TV>YL5#y76@cY7Z@$|LuvC^(#cABZ|*oA-FmemDIp$A_i^5;w*Ju2tu4wsz9Q&(|MlukX96NxEM}Dr zMi6Bz8+Atc8zo{4jw$6X{4IQ#m4 zQ_j0@(6?}K1rmqoxY{2#jZsYPF%z^G`m&7-Sa(KP zm-xEtUqIm@hkZm(_X+;ccRo)9j0hu6Mg80eyFF3qV_}mjmJ72cRV=9r7u%P7r`4Kn zz+!$+SVQ2$FZWZy!S3f6NJ)-1&oC09y9poJ%foUEEs@ca$DzI7q*^zoI|)`GHGvmU zH;8?GDzH@24@B5GCLmj;C|d^72Be-q;1A?~0BPns^t>dX3G$g*ers_)IeD-ZKXDUj zBXO<3WO7S_9OOL_vOjpk`p3Il*g0pHYSuc+0wosP%Vope7LG${`6uDCb{+TN7$e17 zRXW))hr<>=eU2vbW}acBXFdOzkHsd~`)V0x8Xs`rWVp9x1sncI%h@*L)QNcqqxP$> z&i$C?3t^r*5>)z&ez(bPB%;KDr(~Q?=h?6Cw5RQZ@o2jK)kXg7G*^bcz%#ewOQuZ-IoUI`$&QGs#}mCn?Szv5r#+ie862F7e-X$ulK3>z3nsv`6dmq z<&cJjpxK3#fJ0~1v+_*1Z>2Ui)09obw5(dy$R~}nfrhV-u{J0-vjpEqMAsBwqpKDy znhdqE@D^w=Fk`S6sitR^UwSI(KCLPU_}b*9T_4(&o+X1k&l2X_9H?Z>%}(LS#Ky!1 zjUDra2OOAeQWR-h4pRRb_+Z1eEO>Z1)OGiKbPLq&r5WataI3Ug4t}Ez4ZS&pXL5Is z<8K(@aHM`kL4~i6Hgiv5h)p)vmV1^OKrU`8)z!!W73|l9F^ll?m~;zbYPW5&W`> za=n-E{KlS`VX1m5%!u901&*j?I!ku&qxk6C0rG0lm&lujX5|oz^~N-DX641#eI#fL zwSg4+|?yp+}!0+-A6tr(zNiJHB?e=G=2l$>1lx62pG@~tHz z)bMOh8P1~}D?7eeKJW0|SEty}`f)v4Vti!NI@|puoT|K<94uPNvLuuC~Tz zPCx7{nA~k`d{oEn`dQGj=~G@%(Us%ag^G#M7&(ii%T5A(!6^91xWSicLwvnguX)fN ziD?i(w9r2-IQ2h#OVhWbu@J!JmxKmL`oQt^r$^x8@SKptO~WnYBFvZIUm_?E@TO0- zypf!$!iV3~FigmOace?Pk!ssUh)SM@gO6};YbZ;j@Uf)7dMX^5w0jLtIPP)pnUonR zd>=y!T|p76`Z}_DQw2SasLEzFD)|$4PQw{D0-&-Vpoj{^jpYkBciU(qu-!3$I2k8(3SYu^FV;#%SX z_LU!nT%Zi2|IwRqxq`1=5MW@Th+tr-|J|F;E*>^!&j0GlYV}pSIUzLuT9Rv2rH#Iy zmKfU5bQG%a@T7zL@YnHFQ_zGXOC^c|Jr3qw)_)(Ulq*v9mvXt;ybcoApWQeIC_fCt zpdi;k>lO%|vxFVW(C{lH(mY5jWd<4p{_+Ih8f+ zE7^pQo{6oL_1v2{9qLA8Xq{l>!?=ll`HR2s0jY6Fz+&y5g7e65gQi3dhT&gM-dpS6 zInuwK^mNVW{uq{?43#_p+@_|P?sA~(OrFN;>JcNnainraVpgJ0c|K(v6a$MHK~YSs zBhJd#QcZyR;k#q~>L8Swt>wfCGRut>-i^`0`{0^cJaU2!R%)XCEr zQ`Iz3z3ycqmKF#zksi8XP*&4@GzCTNQy=$4BXrg7ql zxu$Lr7QoFcv8M6iGRbPBj_HOege}q zV6D9owCU({{kY^0On!bXr_zqAQB&c5^vvpjEG|tfRKJiKlg@%4lJC}QfB*Xi(mLP} zSYZF7cN|UKbnZcV2gK?IhWRf=^nVYMf0sI<_I562b}k009u8*CdjI6hcRoBH zNWd&eae-v~`yc_8RG$nk z-^%yDst%ImY71(Ce+l_te}e;6_Uur;zU1G#5enH=ma{wd|3qsM;=m*B;q>Z)IFuT-$XK5^0hVqEhzW30X-RRv|k(NmfW! z2>)}f^v?VJ|9*bn@7L>|*Yo*!KF@l-&hvTBd7U;tZhnFsQBhDAIVelIQu46cO5FGG}y=ZX=wtizl`qWN3 z8Kl{EFt{KM1+t{zHyd0qkUjx^pMgsZq^ZGgBe+nv@VE4Q2I=cSNEYGj;=FxllGoH_ zg3Cd$#oWT|{wgY~Ycaui1bKvkUOp(FDEOZb&cr7y$`2QX2|=WtZIO;lN=P&siFRSK zMlva&Juoir5E@8q;C87`fSlrX(sUqw=JxNJvF@a;L9URyL=b%N!v}*w@$PQdfCb?3 zchbTjjT1?-RXR10#*N(8uZP9#&@X~C!4BOTq=_Q8^CAFx5ACFnfHcVt#t~p3i97j1 z`S@@WxAB{sK!4(PYng#Az}rca13Y>1cD@*prr1ee2I(Wo+p<`dIH}udkc8mwq_I7T zw=Ye&4}-;F`F`NSS^zc;48IE=WFL5<>8H><4RqyEfJaioa`Py&%2c#&B?V><7?schbU?Kp6Zf zfeTye-QUgq_K#%&=4Ky67D7x&NJL0LOhiO<=nydp*@?qsq@-jt$Bt8+pr>VIpr@sy zV`AZ9Wje#fOh?Bi#LmSB6%Y_$WEGJRhKcj=3&5~Sa1I?hL`F(RefTgn>@?kJ*#G>u z`4V!J81e=Zh=+3qf_oGP?*S@gWjY04O;E!NtMD z!^OuVAixK9~g#)^J_iwvm|ESkdP%m73d^~(2Y`t)By}*Tc6rbQU zl<=6eHW9+@_!-z$;uA6vNrg3snE7?SQ(B^1NvK!^hR@DntF~3M|69cZ|DS5MSFzvq z>V=Tu;egJ=I|`A4EU&U92avGk#`#{jC0C+&_p7n8Q8&#vOoK>^XcLm_0ig|>pgrkH zk_}U(gK%;h&GFn%u3;V+P{_Yi+1M}iq!~u!GcQGbSuKK{N53HsDMGIY#|QAoF)=<1BCwB*CQ z8x=um@q9gY=Xt|=XbSFei6e6CETKqm7Q`uZ`lZ>Z4ZkTHis0DP()(V=-X0hD$&v%( zc%pxCL|6*r2XhPN34FiG;OEoU#%}UiJ(Nzt=5VbZ+1#XG_H@a@No~2g!u82RluBc$ zaiwW~)a!L%jqM>y_#nN)7E4YvH2h`K*r`EGuPM;2f zeAZGtRWo_s66T-Ta`Mu&DA%X>OX6dXJ+kiI32|1rDO5#q`n4?!PC$C*B+ePvPotzq zBl;xlyy;W8nyx*jFnf?Y=4lsv%SNcw0y60T$70rEhQLHcl zVWy$q{gs){P5oH3GdWZpD&UusI@uK)7VhG6A9@dS>X9pi?^AdSJTWYi%^Hc6AbA|T zB2*K9&XnN?)m{D^C7}?)6)#*@3YwRQpWPi5KD`6R(q8zgw2fCgBRr20&jzQ?s2cFL zDmoYI9?_ORfkXMe;BaOA-QwnyGXl)qE8Vd_r`|9ym$VaCv`^1Mkh~hh&=-?u|v1efeR(n183% zh@!Tl<=ZWTFTBI*Yt$ikd!#~H4c1O%UT}YWUrrh4l=oupS{zO!S7O6Le#1Rh`E(1u zFIw3Gesg7po6m8ZTWo{U`}tn@(s@lf zh=#SoQwuohYpcBHoFQ)tv$CBNFwvWnL0;xwkW9a^gFs`|OtT zL_D8bMLL{wt$$+`p2tpk5?%aFa5P602@xbRTSOZll1Zg-wtrE3MMHRO!kAw#m_epg zOY;fkBY(#`F&}$YyS_Y%esZU5bs;xTf!)a2JDMmt-%d^4&iw~$>=d2V#|}d6cyf7T z4oRm-B@OS>m$K1WM63y~2}=~n@~$*~xa;sJTBUr1IS+HvqS$E4D1`jiQPUG)D)q|= zfhX04Zp|jzv_$iXxk{S8Uj1C9@!ac^HakNeDMRa%vC{XVhJ}V|p2DML+VYe#By$eq z1PP%$5tZ-XDyC~V^g1;D(zpKb^D7lIDSr;$RJ>HY1IG}~3&s&4r@lhlB_xzgtob^j<-ydf#dnebM*}qM&XwtRrDBc zoh#@Y^tKn7HS*|~G|3~?ts4z&dh0Iwc7bYK?eQ|CbKUl0*dXD|SekdqdQ)=}MwOqk z1@B4TX>|$XP?J2n(sR$}SaO@_gdsj8IpjH~rK(sH-snFvJp(sw7G3R(Lg8*gh+C@c z`aPA#v>$aAKI)R|7o}~g3{gCDm+(|H$ zX9(P~BqGMk@_G`oCo8lR=F>}&3-uzoM#q&q82O$CimZ@Rj2d2Ho}i*yg-5>#&mau( ze`oY@^wf)mNoD$$D)g#GoVX_*^y&Mj8?#>2^c#WMdMiE;6>=VRu{xoWY1%Qc*>8UK zr>5AyY2E)szLFpQDkktO|MLW>77c$yLZ0mB#bYl&QcE}p7MDLadnR70Tgk8C#dwc_ zgOilB$!sF8czk{|$?GykyJHg)UvjuZtNnZ+ZfkM zNnw3eQ-{f;9`$llmLK&jGrBW4IZwrx<{zA08;Rrxz1bixc?#h*qt7a_ib;)Z zHIe0vG+MOMXFXX64e1)yK0PnJlvZ^y*XbkQ*YqO=`s=8+x);r|1M)WUX$_{dg1yoG z=lJd)qu`x!vcye5^j2*`UYXQ%i^EYqW3cER-nG})Hl#u?k2%(i7?6=GIP_dO);K0x zb$k6yS>pzC!l;RM)L5Z#u*1iBPYIG>w*1%49QH0nYUM6UO>Q@0D9A2KWi!5iZ0I2% zW5*Iy0lVwaToU~dWBBy;u`hQaldc1t_m8GVNzgGAk5X2(W>B37@UhHe&ZMShh}Pm| zqP>^i{v)1~xPLrWEiK#98flke^G%7)P$2fi{rgOXXH~860ywiG&~jz$s??>iE-u94uDVweLhdye|5r?E+ki2q{-c;39YlDy){7AFj}4Q5Z1#?v2Lo;n;m=EeD?Fy$+#I*>kqZ%OTpB+I+ERJkq}4F)ec`e7&ahz6 zo<%JrU*M$7+;2NrNxY~O>eRZ;jbf9pVlLdMr-6ss4bU4Ymo=m!3Um&Av5LKHi+N-; zrv-hVOT;X|{@MdxUu^5^#Z#YoC%!Y>13i1DhFn&pj{b&S<0hnBJS-tvyWNVx@qQ%v zp)*i@Zj8*Gr%plH_Fb#+h*%GFb{UR>@+!$#froV`_vbjd)+G9~I;n>8e)wM3y~p!Y zzf&;78-6~UvyAV85K;w6&(!Ffuy}thx^%jO{wP^qWmF|~dg=>*_GYo*p*hKD#|UXR ze3hgQs$Q|K6ZU5yY%l3=&{fcsi^W(xY?hu<=7bYZRC-DlPdrhO&U%*SZl~8UVB#YH z8_@V56Y`^;B$;hAjDj*&5#DhLFP!S5&&sRf;EqQ0Q~tc^v&Xrdjt5=s)pZeBc;IPOQ_LB#Zv4^CKU-`A^1Eov!LJb^RJG(;Ilb>}xG%pnroitaRb|9`ZzeJ2t`+m@ zlSp7MpM(s~#rcmHiWmpN8?W1nVYpt&jyd2;WXrkS%bM1op6=?8y9QaL6vC5SSmrl5 zEa8y-)0b3rgkGHN*HdTVrF<=P=fE$KczPj|;7JR9W^dK$_>5nxov+d77HpquD-km@ z1xjQ&JQ*h0nk*#;uuVQQcY2C3U%WHV+Er#VK$mtAaqrW$-YS}h+Nw|pxw1q~i@17D zuc}Ym%fvITZJ43ii=D&%-p(F~>>q0dmd|Gs?j_Ww22Qlf1Q1c`d{K97WDQN>s=Uvf zxwM#J(s=#5G`#VVMxAew;c+cvXJ#h6sCL5g3$ql0WKX5uE6Vm(K8rnP{wP4KTO`kv znXl(%Ge^HqREr;%n~;fHDZcZHgP`6~22Ov2I2j8DrF=^iY1N^l=kC%R633*7q_eS> zsAOG@v=5mPJ>9JC^3%0=^*tB==&M_J{qfafZRK5;zY8-&_g>O?|JKHt+M@o_s=h3m zweU`X+2jUo_m?%EB)1d%jH0|e3V8SnQy;r!hYRlXmK0}^XTI}3srKachSh4P6eFr_ z5T$jo=D70N%D5T@jW!XftGLhKYe>`m;B+W%wux9|@jv=pcrNGE!xMK8>C)6MCBN`g zSCQgI{}iTg`KhfLcZ)+Zui{0?Q<-IrS;amT%ZRZy1Xm zt?_2@rrv}c9h+(rXSSUwtZQ@~khs*On)5MD-9wbL>B_PWehd0?N^|G1-=)P(h=c=& zr5SgIFmp9)Z^}nLNv%}+M21a>im?#Yj~^$CgmgE2Fw40!eI0FGim9ZOUBAv|yy!$- zX*rdzs9S7pc%1u@$$K?p9deS`nO`()_g{5g6Zx^Mn2p2i`C9TtSp@)G-IQP#dO#-T~{oP*j@ZSb@$%*H}M2=()EyIZ$9C4 zblkW@>+#5Zu#V(fAiC~@VcG?mCvOT9an9EgAbxtO2zsu4!E3s5p|7_B;>zjc_O$$l zvT4+@6UQ$O-4+*0w}%$DINpJ7LSk+UCbZ`{zaO=#&yIR>Nkc<;!sH=?%^(%d?UNJ% zmy#=Lp)Ss1t=foK=YHSFc8f5Ik2U!ju5#8P9vrzm<8BDL;g8azhb7lIy#-FwDU)1-dWYdFL(sdu{GrT{ivhtaA;!T`k+pIEVJ40 zuHSl2TyXE#ucl94e)Gd!SY7o~x1#1x*O3<~B&Hb+hu}2i-;w#g5E0?+Q+98?zU4cG zzt6-kp-)iS{0uJvq2rqn+}fH*sW%?*40mTL(`zLtT1`*)=4>BkQ2`R+q%Z=b2th&i z8#uBi4=-lVXHr|~XGBm5dNDyHP&NS%MZ^u9(*l)TM=9Ok;_@LowA4Of`rVo+<6q85 zF-@)4$RppIhBdyGZB~X*TH?@QgeiIZn~6Zse_!WqQA8~LmoJY)JnPczSPs3=LVLOY+`A;j&@-nBk=Nv|>bMll`+z+E=Ef(@s zKPwb?CI6KCI@!?4%9TkMGTl(CSarhS`_G6wA6GtiRP~3uxp76R)SZ3!6oq8H(x!~p z70lU}7@6)3f8;?*>sgvPUgVekYEsEu3U=*B*#dIhq5Jc_{tFkHKM}^9@We}GvHl#) z8O0Et-29l-E0U><+WuC_3Bwp4Q{q%S)aUYb8wI5_yfVB5AGXvbd^cY9!6CLuKfC1M zF#)N~p3PzAV|Eyft0*t8vpWyM+QkydW98z+dkNvn3+3VCg@{XCaz$7NH7gU!T7uOOuFj|KDvPv3Dfyt0x;`3uRz40^BG#-@k|g4nL@znHIw3I#rb|wa z&hDa@Bv`kUi-I(k%*zTuXlol$9XW*^2zZiU-6@Ngmluy0KaUIAmKQ1_BEriD_P3^b51ZRwChx?7=9t{9Yy^NubI%I3GSKPrahY}E{iGck!{A4Sy> z4oJzZ-3f8t--O?67i*;BHh*W|Vi&f>*uyD1A#9O`C~J(JqyWF5@D6An^-rW4(%BY3 zVIol2e&`N)537rCa&<(yYa!8Es7s(6{5#-(()R>pP#7$Fn~$yJb|dK`-L@XKpBzz= zP(g8CY!84W7WBW;w}p4K?v&}Tthd`&%gzPk0(u>dvQl=&AknU9U;)_PlH9HNza#dl zWu$|2cX9OC78BsZ{_%n>6h6M4y!Z3>gpB`xg!c3IgnrBDJEJgrW&8(u4=(HC1S;h2 zj;#-Lr!f0zdq6Emgfjvy>*8#Kvh_f3H^8pILA*UdO*9G#tbVKNy8`=Zdq53<@kGj@ zY?1Du+;BlI7+eTk!r&6&f(gR7U_t`m0yJR(E;v6QxS${n=)(M5FcCp6em*D{KU5f8 zB3y77xcFg!2J{H=feT=Tu+MP72N%BpKTJ$SPDn@)4wHexWMl*c`9wtIY;be(KOG5d1cT2WQ+QUe@BGDL7s_iUi9Kbz?InXk zxNkQ%7*qbyX1{rRV(N%Xe|Es{-u#R8TL=kk2Q;!ea2k@khNixsxCd2mM7Y~AVH?{O zfp$mgdAlMdSh2&82igj`<+pYWSOJ9w4WNKc6dr-#i5mXREC-=Z_3_iNA3=NNag-wv!H)09{Voa{A#AxY0qCwV91J`_&wj6k z4Ii+2Lkb^65EQn3hiy@|@BDxc zhi+p8xUf<}TX*36fMWv`a0e6tVL0E`9XLLa25t}Bfuj`S2W}L52Y7H7!QO=d65O$Q z@dKxdy<>CX2hJ9I2eRP4B@0}w08{{Qv3F2faNni~ZKZ{=cM(udaNoj+z(HCFhNTMu zw+!yUc?&>AfKKckD=Q+5l@$@jVnl?o7!i>zj0kiqjnyWyrA7=I7&)mCrwOS5v;qNiz}0?E{sVXVTE!A-zC{?OYevOp#u4TDcqLyHgZ=O_zi?L z0)zO!i2s58-`d*RYOkqXJfic+imh6F~q-o zy!Bsk#h-ey+1R+Coe&sF6n3)3YwwD*73cj;{oksG@Bq`&gJ!>2Z@3j$0>n-QK}u8? zIB-($`i0Ewk0=*c`T|m%ByU=I-UeL1 zBwPd=t74)1se4H9@=J2V1a=VEr(M==SR%>E#{=C_u}9kl>DqzC5-)e`;DgO#_i>jk z1Hx!Kj5C;XN^-(?bnK(;!oW-ugGPXvASZTWgH^Og*@ft0YqMhyJ9+)4?1AhMXxFXW zcJ+V)?ND|xY93A?um|yzu9J%k#ty`}*vJT*=K-8up)Fso;ev8Uf>_aGJJ#II;vn9h zoE_Q)i~%SsX)u@CF22rgcCrWY{zFjaKLlm=dd&c3>kNzxDedIq0XlQ1YX6|_=Ca*g zde~my0q&#hfG0`iVn9Xd!W z7f&SGdso-rj6D$#q_nj?m@QzP6lk?QiGR`$6wn0avEAz!&=kLQ?XV6MGe$Z(x_BL! z)eh@Gv8`@6P->fVppdki2jW1PEyjT&*d97iWQ%d2h?WN$EIb}4w8J`3Oda@Tuvm4V z+%9id@VCwUZsdI(_HXR}692RN4$|)1LXf<6$c>x zG>U%*{6{JNFo^>+{Am#f0QMWizp?)#|NZ80fcPKQZ~*^LWB7N#f0SUipLa~*03ExC zT_w7%jwpoT8sY5@);*ECE4MqL`9Hb4g24EZvL0wpTuDk#+=&AJ*Q|uHZce0q1Xh|6u%Y zb6;2NzA1K1>EIdg9(&)scaH{^9&8a--pX2fvOD{MLNGo-ei^Vc2Y$fLoV0?RG*m$v z#s`NB!ej-7WyN{_Ll|4p-|Vf)+1465XySv&f5MezW%oK}Yq3m6QHF^PtUwC0?-$<( z`%_*C1y=q+`J1j4AP}RkG|B~CM&3dm{x0^zUUl1-M zEF!=s2(0pehTPS*PY&A@*tJ>EKyts^0u*_By!dl-d7B14HUXcV@a}z_0v`50Zvp#C z60B(K$17Xs26xY|{lEThog4gr72cKGIyZ<*j$?+01CGq?J2wa+00#$m4-JAdsMsTe z*fVtaTjvH}?b93K3xQ&=-h z#lqh@XNe{`DIj|`Ff#eoIo+pia-V;I(|q*cEalcI#oyU&9a6*rSpv4~)>%FRJX}0N zd;&at9DF<+a7OMl1pgRR`uG`b0+7#D!V}EkC?Ck?I}v~D@EkbIN6aD{sC(8uGFk4` zkIg?%)_rpuowu5;6KC*)Zam&FrH0B@oOcPl3!l zWP^9OZoQ~Zfy}ZDe9HY~6T-j9=s&fBvASNjygpsNREwXTa?&EW+{Q*sCcnLbJAi1_ zPgDrnGGBA%oSgT_Vy$rlkucq-xj@M}>R2u zfBLS?Pc4l6JdR(>d)IFh@@{r%6)pK1G)gE;oz96?nd9`sU&3B|=0{)gKV=tp`55+z zT*;s=U6j05XoL{Y={_^YB>1+)rEwkGz{vEAHlL5^8kFJeJ?G?BMUUPEO{a%weh{KCADvoi0Tm4Cre<)Qn*go+ zYn9K6LFx^~{q{v`^Hr zhHDNlV!K(9TGH|Rm4ue7@gdYtYAGJ|Z9)cq6>UPo^L_X%U$=UL?_KNOOAZZ<0)F+W z>XW5?Q!7^MfOk`P{>t2{`_$4J_;^*Kg3s#o%33L7-OAhswycJXpRwlJx7GqGa>8wc z%V%Ax!`FW-g%HZxesd#n^@r{H))GUQ79xZPbId!ue5JFfaTiyt+VY8Ed+ck4J7Uk3~wo--G}tcf21(*6P)t z)l${sJ|jRe1?g)azl~e%3FaAn6Jcc3Z=xOtxP`BqU8hLe@b3ol4}OIw5hb`?z1lL? z0=hH=KO%;MUX=_fcgwZ^5QDj6fKsyrMY<>-BLA1>WzC6%n|XYt>e7nlx*pY4&)y}m ze@=`!5lI`kQ8Pi%!$EGh$h z8$%a(zrtjC)$T%ALf|^tsqC0^(?F7FsYV4WNQVVd@mC~-^{9FOZ1~T$zPa$^7j$c; z{ixZ2_*SZQ8F)_#~$j^SJ z*VSpvW^bb4bSr~|hU4B1@g+=AQL(-WjgK`$6bfG_#}J&*Tp&K}+kM23BiSdi~;%Zx~I2jRgO(hjFbuotAVMTk)d)^wBRbura z56co{7+pTbxi0ajXg&VL2W2(;V)EQh9eKCPA>R~&lGL2sR#BTi&vFyGtd3~UrQ>{e z^bgbCj6Uy^OcSld#F?LV_G%lc+6^Jd9pVtRBvW^cNfn_w?d{pa>Lru2+L}r%d;lmHVN}|1?>F^!QY_TFn`JTxCn#03Oxj7Lf9DFE92Hqanw7 zkpX?$EDuQVX}F&RsD0yeNX<#lPs_+li5JaQsXv{QntAnlgr2UR+|wFyozon1>c?{< zgjry)C&INNOhNcZJo&B4?>ZBIIcmwnU9mJ+S5wIFhMH-G@YBa3;sRd}iJQSSZtdMZ z<%s0S54^N@wKcgVy2MDkG9 z3o&ttH)BO2bH3c+@A#mqV!7fFimR`sWb~SBS_j{hO$Y6N*d#d$Ct6L76ixVMcJ?dH zG(LSgVO~b_Cnwg+$JUhRG<))AY7$RRHz%i7z3a~*&?snKI1!;1**P98bfjZ4 z$T-Ppq=+^(JGG>n|F(;+PQz-+nDq0r#X)V8pXg!NX`C&U;`nUqo|_VXJKqr!V)LHq zBkA<4(>0t-qpP<>#@!k=A@g)&QdSe;iNDs#kMa8RDUM6!uDtpR#<*r?+Uwt+7vMG> zS0_nPC21sU%?Z>_4S`||A<;aEPl#w1rpjiHnyq@hdfOu*h0MxHjnZ0nO_1jdDJ&(PREwWOVFp@_mB@zGLF-jL#jA%y|;8sY``PD(lO;D`DuJo zLRQtg#Qu<^=cq&3z{2W#%z)|Vcc$DGKVmJ@UC)+(WSh~_)4niM$B7A}h!2U5R#bn2 z^MJVU%zIj5sY6T;5G%I`Ke`#y*{8p~8pbk|zh02JHoxxu5(GmnlA#lej+>B#3=oG%J{HPa zUGrz0Xi3@{*FUZ%ScRL*tqN8LNr9u`ZR)`;v=hwYaZ4 zHgt0j=Pk$@8R~BD4*#|a99%OWV4{JK4=)7{&eCle#Bp#&e;3`Qk#^vwq@w)E*1-vo zK}7{J3usA|zm$u1T|S7nXn2IFU9NcJ4b6rxW21(MpH-S2;cp~2AurdP{eS~53Xo7t zY-olJYA@EYGKbGk-MlnJc-%>>pOhiH6<$?aI)q}wJeJkzkoU>!Tg@jmc$imE+V31a z#d4S0A|bh%9hRH?8JOFD z^~)iMa-hWbcfQJVMcVl#^5TA-?U?n%wyJ((2g#$8*&I1vb7py>o;d{<7!ErB(2+*9 z8v3bo%fA>)_Vv9I6FlZxXwWL|aX&b_hK}RRBT5rTTitfimpYy7QMri()rT+-GT%6u zeW$b{X*D&}J)Ong*(wufAfSVzm;2VD8)?y`@!-roO3%BkG>oY^3lEkVhv&;^ugNX3 znwg-);t21`toVzct^&!TNCh$INk~sIyMwH`v?A11PeGdIBSWm>& z8AX}XbziCK5{5#D+B*CF@5J|^1}Fw{;17Kh`cx{^HPhDK_D;+Cw8f%(GI$!!mTI?6 z<`3vMxu$d&zAL?>>>#9S+T0uC&Hly5geomJD>Ru=4gC6?cu|+aQnUOcMC(fmVf5HTAsM4c{7yEGMiRjWC@~n6^2kzPd^tH4Y0nT=Hd!KjON|R{{ zXS1{HW;1lY6?q2i`B+m=}3z#4i(YBLyC;Yq6950rEx!8aeK6CQu*Y* z)XgTm9(r!K#Q3Q>z^Q}%+$0=0A9pXTq1@-w43&$4`YE1*^-rpA<-2AP=9mmy1!HX=!# zg~%~X5Xuc_WHRL7PIjuE%#0L`G-|LuX*S|}UNGW1%akeQz?JV44g=S8jAvIZG&4)y z%D)QE%4VX{Xw=gF&^uik+wkRrUts;}ykY009%Y2I4$m{{)CZ|{J?Qki_d4TnvK6k| zoy$(u&q|W7QBF204CRtDCsDa)lXqtBfr|Z<8lDzh$TPi@K8RHQLxCDcU^7k0`C~?# zkT-|n6tzo1Gya!+tsJ^BvAV;yI+LX2f!#5reRiRyLsv$O`}twe@-! z)$}~)B(AMdW~Q}{GFI=2o{B+@+c$LpW=afN?*1go6tibCL8WBN0 z`EQn9;uBmw*L&e}derBZ7d{zJ;~vh&Uz_fBs`OCS&G49plSOy=2hqFbT5*aoe9)Pc zR+m@po$`1tuJ2b@idy@%?0frCai`viLW#Ppl8Fk2I6+;5N4h?pC)LejpK#foU`p2G zIFp5bE5(s>M>g#OPkl6pSb=^VY{lnxkDIAhHd&*AtwEl2e|+!O){6z z#)ASa32v^Q;3U+|)9gh>5OyModrhx`j`H#H2Oar|{uw$g_0}AP>GtvE&%B^Do~LQskL$A$c7zIi8Z#!g#Q_hxsA=9tbj85PL8CB_NK3aA&RhUA948MqfnLlehWf&tCBQ-l5C8aJg8yZ|^{Tpcu;zdl60e!H zw1!-~B2H&walTKhW9ymBR zG}G_r24g~j0-1q=A7gtvi0;Nj>cBeKoe;OzSD3-^-|C_6Z&%i-p>E;TIlhm5HvIj~ z3ni<-%9!7&m4wov*>wsKz_E>t*L8nLa2c5efhu)e8G|{9@1FU+cmWm`I63QxI@VW4 zB!7i#u3;?R*1|50B~*{C*iKCU^5(NTV#tt?AoYd6Wfkz6`zd(o)VBnP9f*pdBZupRC4X5- zC6q2=pLs~aJV$6)#sVao-LD0J2H^{G7`n~Vv$R}RRW(geJ8JAbQ-?7aHcVObPRr{w zTvruLDE>0A822MKh~Y4MQXb4PHMg@jGPxV+aJ{g1eA0eKjh(^*pOU8dwCimpmX6F< zGG}hs2v!#3r$6bWmu0uMx9ruXslTSHhDuJT({CWTn$DhdE=|{7>5XKxXZ)zVAxrUh zy|yMpmAN#hvjTH^%8I95)jSwzEW>H=MenBa;o)&;5;NgSL*6sS%pGTic-SBf$Q#dF zWH`Hg?hc(BeLZ6S`I_3GgOfQipBL`a*WcguNVpGp{On7RYk^0VnT~`%dvdWdBHI@y z?QBr;x_06uYZooA@>JjZGm%agE_W{Yh&CA{$A4>Y&dI-NJn_L^HLeL0>i90Z!n#T@ z?aX2*iAA53*=>QY6vp)`*hP5-e8Ue`lg7ibP5ip`*7kO;f zY)6S?=r?# zH!7l7(X#Sric^U|*OZ(OtihwGAO5VYAU8NWqg+ex0h37%{Mn_Pc7B;)j^s`&d4W;( z9Fz)%`h8~yyvk53_hrr&)B62moQa+}2KhJTXzG`ex&__zS5K^6=R1 z`AGSrDZy|A$LZ*7hc5dPQawL8_UlIkZbaguP6jYJU-5byM|)zTom5#M$tvsmz~eyW zM-7(BxDcwVM29mpO%pp}rWV!p^QJXT6_xerk$#w{*9M*X5tUkMA!kDEM=0p{6{(@G zIY@3qykrAlP^78%H}awxxmDKleeCuq_!m)|Tk?~t z43EQ%vYFCm;Ez-;qKcaan`}BLTlGzNBP5ciE&~rHbliuHO+Jo7Kkq(a+&PtdUDW)# zI^#yt%qEYdKiFzH;}21KSIZ<#ax^_iRJndj#e+jfD|`4}d=#@v85!~EYo3M3v#wx` zm%?9N%6*N#fcJh^mw*XuEXU=@ZDc+qJr^$+NO~QAWKF+NNF%43%8hR@6`9 ziPeb9D(-rkm6sS3SgkpjJ(`a3iG51qk(H%ypm*l1D%45k6}9xUNMb~q)5*{aZM~1X z-a*wq5a+&qoNssbu8rPO<-|9WsiYX?YI50y(2a-YH=5VHPA&L*)eUcqW)vH~5wd!5 z+Ppk&^h4GA#4f5l{tTBGZefA^sH!QkftZ`3>Z;bkvCCd*z9q@QDLU;YsF9SiT6Xs2 z41K-4m;!0-?DpIsvuJz0p5mwaX<5+=Pa+ZvnXaYVv^n(`zF#Em$S~wKw$p#7XQ7&+ zjfS_Ue{PYlFKf%IN>q0DC#stNNjVc!T0XV$a+w31_Mb}`AiXj2ysgb>I`)c$w%3Kj zUoTZw_1;?daG=j@(|ZPgCgdunnw@h>UCUwMlt)H;MOd~;cpUM}MIHQ(DV_X9dtt}Q zIBA7I_?h&Vq?12eGt}~)j2Eb+oE55vEo4=jl*p8O=4xNP-b83psD)w+c;abrH1nnG z+We|X@sM-=F^3WPERU|T8N%zyMfN#Pl=R_hsC8S*cE6vUv0dNS-?Vm-HuVU&xVkv; z#GWMilA-F<*dwoN7xlHc)1-kj=V4<++QhiF@gpVePIUckbx8u|Bnv2!RwT<{3CuVa z(}U{D(<#ja6;8pVYR~)fp6TmJ zE?w$GJ#j~klPzYDlTM11s}q?e%V_(xS*z5*IayOoPMN`5DF=rr&Ac|d;`L(j9DHrX zcfnAdV{9JAtG#!M3T?R60;IpNd&X!%jPa<9v#%uEe<;wdwJTvsGq|sYoH&zxmL=0Z z+O_$r>{$*uPKtToAmJeM5Q^JjpFGDZ;@UcT8($1v>YlYLU2043v#jW786a^msQl1z zlC)7U;b|%HF&wM4;b5@LBTI~vhSRHN9!X>z z4&)iA?K*<^m2bwLUFB}tF_B|nq`n_!9GbT1M{L+?{6F$93il*`cC)!i#-z3JYBZ?+ZvFP&} z>OLj+uG;PQe5-8tZ=} zY|8$1`i6iQK5yRPaJj*a6``A0+H%CFg)xY2C?J(M2le#mA@U?bQoD=L~!4 zb`iCofYZP2Q9rEd$xVy9=vLah=#>7nRehjRUMcWf_1xKq-j~=h`Kat?=-`elg{Y@# zqAeQs7<=J>)S%PfOcByt(r?35+sAD=(ik=J7X~KvY!+5K56g@A*n8+MJb$e&pQEh% z?51^x0^?|h!I6f9*R1Yq?sNKc%HQW1Ej_r&)4qAt_}jfU z7Yf8w=NP}=%E6p;ODfj2e?(RMt?IHDt-ZI0M#(JwlD(688s~83&7`Z`h82~_4-O_O z6Il~FH)CqFosM+ssIc6_1Rvs(*UP_|rf?dSN2O@61gFhP4^D^3)Orxa%aasO26i6H zFBV|Sq(2NfG8!^TPWV9Rp`}uYfMoY&#Ov=jR?n9ZIXa`&9lrU$8I7%ezT~U7FqDN7 zlkV@~EwG#Ydj0vt&rinIs?KG}SsgLK^_Kj-xrWIs+BRXVyk9xEbRQ7_f0KY7=6XC<4I!6P%B@+-6ATECq2bQae7+xf} zd=K&Ud&zi3ku`--(1Ou_Tykt;dE*D#q89Iz@>mCjc7k>Yo$XJI#cR8tB|n3oUFP#N zSngLSiPO%_FXdDSn5McKrcG(+wpNqRapQhz@0mlT3dP?|UC^oBkFHfHqS`yW?mW*M z{_wPD<#MGBZBif#y!STcMg*vK+*gjqJu$HXhdL&eI8GgP7sRpvr9KLNWbX)b-Jz&=^W;V(EQlQsdz<_**7k$K#(_Rw#_O(W-Rpu zEw@jfv@x$xo^SFMhQ#vM^x&I-s}-*vhM4L}mFIcpy!QmA zd;)pgJ9;Zd>rz&IV;aA-PU5Nan#L}K{8e^j)?A2s?wr60Vvd2pe9%4SuB>7{OZsKSFBy<7R!DqV#?FaN|; zT+Cg4QS@A*w_~89oYar!R-2EiO8q)3&#puJ2r8p4S-D8PPABrtHFYxjtD*;!Y^*h~# zUnN{!)>Ud%v^}fQQD=2orSHZ*Ty@Rmk6tu=I$m=V(bGW8%wXypH+MGErh3X0$LfW{ zB>f?`)PiRN(^XB0r8*8(%2^)zU+Z!g*QfN}(Tf?jcA2jwIEY4My*1I-)oSY-XZ61y zqMN6g>2nvJBW1bRUo?@{*6~eXLXJvK|C_d*mLTD(V|WH-n#v7$R{HG|wb_9=_tKRV z^9*pS>;vsZ@IG6WJQ;FcOLh!4vzNefICUHiaaZj4y*W)}PYvhU82Fz=NM z^bjV|By)Y#&(6tzUjiQ&nO+s(d9a{HM73;!OUdG zqsqWZT3ba8Ob%_vD@E?6j?t*fThOpk5srL;J1TInd7(;ui#@w#?CWS^{Z|Ga%l0C! zRthZCbAN`8rF1zvOV?mH`wjoeXLqJ>pj%S$Qh54k$9wf2d|1%j6(>ZIox=>70=u;h zy%zRHHDQ@7O*U#vz(~B7bpTj2R@AI!4TN`zYHjpbb;Z_{T*JG4c7(xBgU>g8S}r`_ z^CUs0Fg>+(6t5e;Rx=LI>#h~YA}2HO7hPypmB~n~YzP=H6`I2Q%;oj)SPxjI=TrWe z!>GhC!*Exf%2GrC*;Fr+-C8bd4y)6TV|CsJGA-b*D1SeSb%HFMl1tP{isiar!@_jk zI6?ZN9OX$-BO07v(wo8<&X((X_JV?Im>ST>WiaK59MQT*h~Crw2J~mEX}`Qm_2FFf zgjtv-*V-{8uCSASd8~4sQh9fw#wB#gL8XN-JMOlQ8L(O7Hb^~UVpc5eqgW^dYx;x% z*9@!-Y@Z{@j^?c4>@Yb%g_ayxk3&Xup%k>LL4~sA2Qw7m-O@G4xL)lwyIS#}dykSH z?Yo>Nx{5;z69c2;rWr*u5m!~;+>T3J_+HALp48TUUx zYET&-yPDoRUZ;LQ?xrZmJfF>~v*O)*_6No0z~QlV+@ntYLNCbLFYkv=?1bf(A9pD& z2Co#q2}_z(wcPk9{;X``ro(ZzSkSe1z8=FG&fU}EkB%86<6;DlWray=w?Xx z^)H(7lnHF#gyDu@MQpF?ow)UNj4{|RfEUovq8P!No+(IGd-TCArupu%m}Z~on9>-3 zFZF_!HDnDxWO=osrlq6PV*vwJR6~{_1~+e;8IqH@0>KMXRg2tAsW>?uv{mI(fM-l= zMBenfdY09oQRY4x{81t~Qt>WR=jQ{@Yf*jK-8ZuNoj(e^Y*KrBEgU_yzj?+tgmJ?h zX9AHO@Mm2V6I3&Zuw1)q^-nXcF+&OgJ-{?iKb>W_Rvl(e1*T#Mnn3|r-+%^wNLODH z3IQ-dBHA-4S43RS)|-{P`3A8#z%MkLGa;CKneA@T6Sr?+70mC~7}Ge=>ez;pNkXC{-Qt+&J&9pCV8*)Xi>ft=eYh0bTgh_LvvM z;&gpG`O(m+RTuJe+z;W9(-8k6t9gvf>pT+FRB5X%sw-azHGnW{E`+S0-RXrELgUN^ z9G}x7Yp%3;PRz56Ka+e_b~Fm-1&$Hcw+Zn7G~J%xacIe-md4aM+kzbB2>UH|=biB+ z+(pcY&o_xiXTh6w(oS96JlA=;=J{4^&VM~fcS8MievwnOoG#Agid_pM?1i64meU5Oj>8~r%yt3kR&C1)Q9#*+H7A68}uqkeiF-}dE-0F4yh3=@_$yCtDz`?Tjb~) z1}>~uo?qX%UvBFE8CZ!ky&x}kXu5WvS(-cU zepyeqEQY6uDY34AbUn)ZaXytWgvnzyJtlI>EU|fs%C? zn6a@0e}X@}G77wS417T0Zd9hGt!4CPQh5O=Y$Yg`s%N(ImE!~N@?io>(UOObJndZl zdF=VIfrEkoUbJ6JYt+`3tx8hy8wULY%m$y{yqZ8+uezua{VeKP{e+tKYiwOwO5I)W zEWbLu{m%i$_;TOq8vu!6EWu|#TMX$D>478uv2a@0Vx-5h0u) z5b`i`?&m|TY{fpvCvR*D%l8=LyobAYc`3R9)&Xz-zScgP(kS!fbrx#Y@OV3-R=|NE zw6EZioC~W3ee-``vKOV?kGy6{OW(6;P`-we3(dj79QjrGq}&!0wV8i1N}^@cQ~Yv_ zy*QFK+5;L76(9y=&?>!A&B<|wzV0AXj;tU0)J4dK2Q{X5IoQ_J9$8b!1>`S$IwUiu zEY>)ZpT;_Ko3w}di93kFKcT|Y=SwM~RnPM?jo-T6DR*|WAIEB0@Mg~s`_=S*o?Q`99h2N3(xd%QOT1OOZ(}BH4+tIJF=#(EZ4;gUFnc8L8tJZKuy`_mQ zR4Bq+;_zoGKTpzJBPIQsv$ZUitQEw;miVa^9DTS2TI4cR@wumKXDjedP4AU#En(}L z*=p}GT;ddqj#XTr&=!{#0t&Bhv9Sfck=G^z5kutrx9 zk_LrNLjH;m%XJ*#KRg4xJLD=!eaXMgFU_k!gIKU(ej6QvUx0bI)QDLby3&XKg#a&> z0qT9+lHWDo{iUYnIG{=;zN9w!iX-`;2T{EauStfTy&p1i=IpZa*0)HtN>qd+5ovl9 z%$dmtI@^rg0%$KUh)1cKiklWtSEngM#04f5V02;Funpj$>nq4#knE}Zanh7LS6Q|H zM|}>suyE+gh}9;?q=*)Zv@eYW*dR}^2yT5cw zeepT;v^^7>!If{t?r`eUJ2gX0_khI>@CD1Ya+>ea5VJ&zfb~Zvt}L|STQPiJNiQmV zGa~CrdbL=>T7b)D);8aKRriT~?k@tNzl>&}ebN0p^wuvHrArhYB|KN@;14R87H)I_ z-F)r9qq1NIyoe5~^v$8M?mDY`NDOD{UQ| z9Hzn`-+i7wtkCO@y$cU_Sd-6siZllp2yMLKBaHa7vLw=jPH%@~R_1_Ll$9rCaqJe9 zAYc^{*z{yyOu5)cSKmrR(MFQB1AcELxnhm}u%lc{xxBv<+hhStB4-&gV=!Jx7SmPJ zgBE*1_Ga)JA37}PT1=IQdyn0SYeu`Qj*q{C71-*>gW_$?x)EEV3FvV}y z>^p%stIv(nh%j*lK$Km{pw@>Kk^cQcWbQIhOKX)eV$YCVVo~Li?HCkCb$xpnVw>#9ZB3eEPzIZ@Cm?3){DI_@5u`O?G#M93t8lxfjwkvIsi`y9 z$+b9b!ogn9Iwr`?<KYZY`33Kk1c^NjmA*nh-A-#}_sWo$osaW|VdG(b1M0ef| z3?QDliuRxaV~&)2{lQ@PH$mM_p6`!=t3&1F30Ks{TsW4l1j!;%l&_4$RF(reW{|Ey_gA?fh0iXJ zpK^i=xD9q1B&XVqhwJX%FHwq5q~*!sX8{`FQ^bMhgdRszyz+~DtIe@dgvP=O6411( zG|#FDUTvY#BO&~zv9nSzjg9lmr}b-D;ObWl1vtB9X-ak4Erc)&|3}j~-nQ&Hvm87{ z?uby%?^LRFfs*H&ex4HiyYtf6kwvz`5ckt}7`*KVx1$!X@DibtoUF`wzXD9dy}B@- zIqtNv*nA6-Ze@`0Tv!H(9`aWP_gf$1M&JcW4P^WzY9YB`iqAkMiI4(d2+h_rkWJBu zbeZF>?P0FzeL-Vsd_+eqXLD*&wDi!c0)NSp5z#MK$^LdkMXn6absHl|ZmcF8y{c7? zbqQ+ZN0XcK=XI4dj6{U!R?wb4-cEP>)~x2&|oguS%--tYa6Pi3t^`IzQcG?O&d zX1_o`PkoL?wkrE(j>+h8SOs7C5uhA^Zbf3#EbLvL&pA(0p%p5Rl_*Xux_H4o^vlCM z!FlD~DPalRGfwSDMk3?3_x9C)(Hf7qyrhwZ zbLrX{k7??k{ULWeOXHm%zbvbnf+felvgIDikzI_zWHQ)xb3>2v746NGzZIq(8bGxK zhF-s0eU8hB_iZwe+vWIgjca0GBip)#(vvpMhS{d59ymaay`prUtirg${_1g~NPSj? z%XP>wC@kWA)m4fLyWVz0DXP6*0L;X}Q!wtnN~*v2Xu-|t zTw0JEo_lOtcKw?0yrx-u2_m=E^iDjrNut$GUY)FJVcCw;oG1TNM3%CkVt;m>%V1Dz z)2lLRRZk~(8=$NDJW~vblgrYH^i@;<$cJ+4!07KAeb1n#IRk-|ZJRx0&&yLp0?hPD zIlDDyWJwsITm-&#HhwE%5%CY;FxwLCq^+jK4O8XQ{NX}lLi6pQpl!0iZz%^G>AvWJ z#i^xWVE*p77Kxxab7t2zU$i!CC>k1O3S2xssA$+Xh>oqXEKfcmq~S`dgqDH*37r5C z<>^(>0_IIhcPkSd>$?h124=cyBaSFYA(cnPkc1po0=dv;sthg>tkuF;?1f^S~Ne{)w(D;uch%-9wyT z8ppiQZ_oJxIhHa#1LdMZ>dCkE@5|44uBj$Zqn;8Due+t0G&mvUQwQ)V)f=z*(#7Ki zR^*{7mBI`b2d-_InmmzfvTWt`v?FkVrc&XDb;;80_|d(WcM*Bh{yn^7nWNcke(`G> zdh|7|`!tF+8~uGJoJ_++7HVZ+koLI}n}U&{f6fU&3akr#_14|3s7RKK0T4ol6@@=8 z?}*cHXC?}82AX|zpQSXGvuxBlM2Z~=W0x#kw^)_6ji>TMxqlZT+be-pIZwun>F-gQ zw5$qG7vk^xjNo_!d(Yf`A7Al(^+tCC)i7^hiqm-k+P79X@)M@gF1BKJ->yvi>L}k& z6^`XwbpP)C;U;3ECsS2fESP=;r=hGYAz3}5V{Aw@aS>mD#zu-xqKDRz<^?+#?K1@t z2>%T_m&Gbo>!Dp&v?E0-Ha1>h(`2$YgA-G*ziKRdM}`Lev2{;BxdJycnb0l1pi>y` zVZ|A{7Hmg*RvRh8nj0p^Z|B3LT?q!#GuFNC!wp?ETUwD#=CZK(GyVDXHuZ-iE?gEF zOu%y#zR2qwpnxF!I;K$ei)f|B4K$0upJ|#&&9DnCv$L{#nYFHOSsu4Hfc5nW+mF2_ zW3Dd|ngkfBYwjmy_~XBYELeXA)Qb?j{`TX?N|2tikl*}BRkK%gOZ!%!cFFP4Pb9Nu zOky5SmC{^E$Hkf-OtH<+OPi zv&q(Ne+HU?7-Qco>l8jZ@GOfLiv^R?oCLw4y7*&GbhxCpyMuz7aE3aZ;uF+hFO2uwoE~Qp9QmMN zLcr-4Tl@Hjj}1BmYfdXxIuvWDvI=*z*Nl%_wfKBQtGcU83Y zeXbyxsU7zqV$oIX`=ZWiZCP!-)ba`?jCmPL1Nd75#R3LA+;8=nW`MnZ3s{Lq2Ig4>X$f^cjW6l>>^=^$^D+iCk^5Y=%?gES((1v zuB+@-=zoI9u3A1;R&-9OkSDeFCJ^6)`>Q&qG>=a5sVv^nypsiBEh@xjq07mxj)nt& zh0E19g@`iS@L<;_Vxw{=p~$Ck9p+C8-)k0@IRh7u;794{mblFUA3lnVXy}uEP4f}? z956?jW>r?IOF9fpQqo#KB3HnNs07FWWHz(24z5MFjy&1Zc}z`mp=d6mVQ8d1aOE4*8$5Da$CZAEJr~B>Vsi=t7OSzY8m))N- ziBC7u&lyO-z%{nJca!~s?y?l9+c1}&oSt@?`qHc&PJ@VO7jhxHe#h=3cvg`znET#9 ztssDrF&2Y(e5aHE446`64IB;OVse`RwVwT+y4QLc6N4)nO2O*%YqYN`Q39g{fRjpOB46oe zU-q`_m?^a|IdB=}{tz79eBml~F{v(Uk6fJBQgLqr%c($4ny#)--G$x9Br=tVzLcM; z*H@Bqj#|C!YF|^NGK0Pw+`tnI#>PBt+jmwqYsXXyKV=%FIJfx|=<0TcjqK1mbdX6d zU`5szR6N=;*Ku=m>$RMb{f3sXfeb9H0e1zhO-}r#R1~_Y-eDGwEr1Zl^Wd1VtS8?s z@3RF1vM@|1{x!*{)yMNRyLDqN1ueRc5~3L+3MOrJD`5fIE!Fu7SW=Ez)P7RwD%CS! zk^h-xZaM*o^8S(%)AxtV+^#vGXcRz|jFxCPmTegRG>E5Nd{Hl zNdFo)WzjWr$Ipzox3wi%1&iL59{sdXjgo7H8h_8Fm>h{c?qvr)zq_5 z1J$EA-E!)8qqf$K3x?R@`Re;jvGNt*ff9w~F7h0FKpUB1EZ0;XK~hFS?lxBB=&TuPn2glN89$E$!dTG?CBcW9Op&U`NASuG$79l+e@o z^~tZY@6G7VSJ#pCAFInVL2|$5GtYQ7iXZ<0GH;|u?gOQU37igCf73sGmv;G|4jd7C zgE8~x;1T5;>IISB2mdL0?5#&l)#+pY20xXcrtO!VGeNIvfBgQBKD{`+%SMH@eO51@ z@=OS*PyuQkRDK%eKTgjCOW*wc2Wag7|Ieszzj9VWk*oN?rIQOl#`-2;wJfV% z!ysJNi4=N87Woaa34=J2RDcu=5A(=>fV<%{uY)Zdh+RV5irO2mrJMpXzu=}`k{ijl zSd2%6+^d1G^25?Oq^Z^VzB3@K!!$4F8MmG*EXB4sN9-Ni2~EkgdcjQiaOUz zuBKf(gAHx-VD`@zhkrOMkS(q5iB-24UbCe3swf$Y>xGU;PDV>KlNJa@ z`|K84vJG*ce^?YXS-35$e~j*^tFx~l?et6Ui{o$m#$(`qVIBPs;28fMNfqsv*>wH8 z=GL)w4#bYy`fg6E8R`y9y(SUbrxwc8U96B5wMGYHTkJbpTzq8~Q!*@!p@1ix=t#)1%3$YHq8b+yyn*6h=p81MDvgax1Z#4?aPbd%duf8qylDPOSA}Vz! zGLd$(75;&xLhD%EOG5Xn`Y(*-e;%bgZ&p~$n5b4F2&*wa#Ac+gB+pk%@ID`%g2RiL4?PP4DUzd43FF0YT zJNx*jHz)tjd!A;0?EF@H%^_!1OFKtWJqFFAhXwjzp0t7=Y zLXyRdEuw`uq7gEfU>T4$=GF)8?@dF9t;)^f^upxne*ml*)9Sh9<$$5D;wpa>;C5qp z7#a##+k(s>;>vzi{BiW0buCGm$!+s@gjIQl zZd;fX8~VOSabX5oYud(q3zx_##HMF0%g?SrH=0_^JkqYG0k;f>xTeC6J4TyYit0wR zP2~(dOW{cP_sw%S8{!k5B)Qb)aIDbDv9K!0Dr?hj$LRx~gVxLhke`&l4_)DA1L#8Q zY$UXoR-hbS+@JMC6fl(k{%v?&O>DcaT(zTj0yaM4J6CUwGrOxzWod2$oBZCs8v`F# z>Y;@4Qc@>bI{J=zUHoIuh5C)treUk9QY1^wpE6E4 z=->RTFRJrQ^55VeFA9jKohy=B3OM7D$;EJeh85+kgpw9fV$82pJX*2In%|?o>+wNs zmbwdlaxDq48yYT3QTtPIAS*64+|vETSCZ)n2npPjszxx6p4!H*(RPL~6I?~*;gl?(RHkMcQ#pA_FXTnoXw*{01*lmDA zOaB3QHd%g@lB?&r^4BrEPiDvis7*dgpkN++CeZ-arM=dSN+a>}L5QY{z1BmIVlLAm z$(aRg0DI`E(}1eU;_-`mN9dAKYg|-`A`kr{w}V5)g?N~e_PUZ! zbb6A&RJfX3ebY9?ze}iHC~%yzNE3BIr#Ofbx!8&o-TCldN00!I%6AR@6))V}`iLJ) zUnHQti=t;B9wV{B?Vj2t_J|{1UbPQk2O9Xv7kso$b|DSa)GyYmzxW5ZZ+4czH4qlY zdM3s}DTxM_ex6cX&vKK8Z63Fq@WH7Er!H)uZ4ft1ZIiI+w`>SF#I@Qk&PPtcBvte~ z2gykJ29o_}p(({%O`!&a;S{FhtKBoGN92#8*eI4#{UQAnKc^%$s{v{y0n6VjHU$06 zMRCK7-HPb%kZI;DgG9ypA#2oa-$)p~lAs>Ba%8&^TjkG^lA;z3E$8%S4hjUz)QqWH zRtU{~@NQzwKUDCiJs{Ro01JJI;(mmiPEmqQ?84Y&{SJdM-r|~U$W{V@q5yuDe6*n8qRlMj!w*f!p zBOB}Jq*O^{8KHxBJtHGbc+cBV3S@yiS#{yEbsDMwR#E_R6NHwyWK~tH?6TQ@NedPP zJO}KQ;o1{gV)o_qzsw`v480zpb?(z6!OZG1JiO{{dFIwH>mA413+B2?jbnaOR;mT4 zNT+1U&0_g#ERrm3gO1$G=??2paubQEzOfM+gR^P&DHpCDbJSLAsu<=Lpa(s7Z`OTmG6D}` zQBkRR54-!!%NWyU%!hcIY$5Fr# z-KtAG9TxTTJZ#8SCE^9HsG;CN2e%J~D$kD2LHq#uR}RUNQi%G z`PW$pj*Pu+x3<<~C??0FoUK$`is-Iecf^ul_pNB}A|Gv?ApbA_gv_RYfa-egUi5!} z65H)pTcqlXhmxW}DlOqXhwrZ>=QVWo9BHBt9p^-!O)ev1bYh*<2o-9^n{}h3V{)t@ zvx{JuHe=Cwa8ZFt%2VQ`nTXca=8%i4$Ujk)r!2r0Dwz$AiFWC9 ziO3RxvG3k6y(>{hR_PJdUVn)E?_IQ ze(nv=77;zk1r*AD2+p|fBewn0bQXOQ&#WSAv;LMk)I}XK@-mGw4*OmXi&s@KgP5i- zaT1jn`e`?N{m$~7Jco>${PNlmFVvw?e08Q?5jjoJmY;u>OfzcQ`Z=1+H3;(4bOM|X z%EVzZDeA@VXJ-G_%}nmaL|gL9ESPhu!b*)lB^ERjpJ8J)^>ogPZ=}N?$*Y8V>I=eT z$*%phH4U!mgh+A&-jp>i>L`(JhSz7QOS6UPysP3Nt6IT3o82d4`8{vjOrjbMTN1Bq+No4 zJ>_4~hRJ?nhZbo(n8Q>}z!)Fhwm1xC`nP^mZS7WA;QF24FI$J7EayDpm(3kJDl7ZvyNODko%SmahUUp^ja*3qSE<`} z+k>^lo(W&al_dVQKE8k2p(B7sybNa=Opun~<1{^FyR*~yU^27u#JE-7er$4flT@{G zxpgf2)9{y1v%;4HCF?-JwMR*j*g5Y%`|E7Z^(I`$TIE)SO^e!{t1OktH8e-QAAlUf ziey$G9+#CNIYP9|iDyJyYCCualg*jd*GrR{?3$%UVOOzUMD;fErDkyTBA)WoMXJk} z9(PwL9I3eG&h~7&pVdq1^%Hdk3hIiy!&!Po(t)Gx?Z2(FT#BkF;kFDA&HX9trQGxR z6m$7a;fz7pp-;b;uOn+Ris(~KKERyzTt%^ZvoNs=y9inzTG?R6 z1NG5mW@)>)zF%LrV~&%T!ybHrRM!y4&vQtdm+Xk5w8}m@w!jk6xZTUc|r0<;VzCRVIzU%DP=Y`FAziq#1Ir*|uA(Ymu1UB#1`*rjE zm%w2p*V1%iaqD-E>T75^SXx(!fcGtDxL7s9*6inVBZw}!a290WEClU!tiT$-g~I9h zJ-T~Sd6|r~ZiPW%MCoFv84UlHy_5_S*8=K8EfyzrbTo0+-EfQj=vDvi7x581Mm;UJ zo?8eJRHjx^yH{FLUf86`(XXT%&^!atxD>b(CMTBFB9m@j6R(+CURG{ycF+QY1)$iN zd@NRdqEc%0Zi%JDhlTQ7^#B0oGr}se6RgnC7V3@SC8*FtZdga>K1VfKxhdXlG^h_iritju1Wz8eF!KNRjLfZ^7;|%b0#p|1 zrN+9h;p*LbhRY@bVlE&5oAfsAm5mOL=s)hw6B;J$ySU7V2;>_Qdn5*1=2y#Tdr>it zA$?0cCfn}5!=!R!Bah;6oVCawD>DSZ^7pS*g+G(pF^#k)`DUw=nd}^O(s$<1SL)L0 zOerU=@uvG1+YX@oPwvf_r;qJC6nO62$X0bV>KC{fyK6#X$7vkcb38P96&*($Ggo62 z$r@H_A6_~lpxoZ*7mdlau59NgbSsd+1?ai2wLYYNN;6}jaAYzHF629Nc6`ckxynSb{ zMb20eS5#3GCgc4oxl%E?z;0(EYYx?+n2iL$xJwU`!oJ)g{%*}s&oG|# zGTfYEqYu34B>F{dEvurL47(*d&9Y-OK%d>xs4-oZHI9C2JWXi4CPgXq4+EY0u4A`a z$runxWjB3J!%F1O zO>%xYLD=6)1<;UjuWi&fes3($7|@nZs??cbw0Y=n&~12^lGrCm6oAgX${3`n3z}KkE@;RRf5Wx;WS#@s5Zdrbhi5KK*;P3$fgDC8oe&52EpCU2kTpWv_!s5FMS#C zwy3Pi_c!+yrcGFk*Kj3?gu@(Yfk(tlCU1>x-btfA z=pWHJgsbto6u0;aNPam3wsla%D@S*}N4GyC{o0;P!!Y0kWX>2-c+V_>btGw^9Il$9 z4sKt=O9lZWoA4yuIu|~7?1b)g&VNI0CK)WAN6M_9m@6lAObt*c?w zyNvK-3$;O5UB8a17#S5{_*Ow)0hK1wnPG%z;Q_q&RFYBNX2a2U0$RB=iC z1N5v~2*T19G(1Rzo-`YrW&aLuocl%&dtGVBRdf5jw-y!_rs$l4R**c+i5;GJ{T|$) zNg-pA#V>AOk=L@mw-67aSfYt9l+v2?csz0KXM8b<(H$zynR%a(Q)jv$M6zURRT_n= zG{RC9)1z|(0Rj(lV&5tz6X>1{ zfZL8DSysv{67x~Ya&*$mg}LU5ESZ5luJFO%#Zj0=&+7AOx+cndK2FwLe$KKcK>lk2>4f4^m38oQ`)1Ek>82 z9jjl<%-RS5wOu$8=%Q%y^dr#17_;%*p_^~vI`x#X3ZzeLI*Md&zPLU?;|&IYcv&@+ zo*{{{w`G4rB>OZX3q-Pt+bTJrb}u#iiaimNv){lC9{=ulS2CnJlH$cuAfK z6d&OS$48C1b~|Ks^)Y`pHLUH$LuRy>)1A^@P*295NW8H&-*(>g9H>`Q#xn>0?OS{C zIYqkp{92qHs)E*%BgN{UGt?s5WnuV4*~9FWhCI5`otXB>XyKLYSv6km2-?5pRJvhY zE_d0p=eoLn;B688L#OcDFr~^<@bFK`{=8)l(z;y@`h#QK>V;lqYX0?hXKa(;Opzu; z7*?fagl@s}?hqJ`?PiF$QtkG}rAY2fw%749cz{uMn* zG(}JLsnz-`79jgq;O5=V1%~CRdfu62!}oH}5|M&ts38xLtoM?*&It0*i~NbRpz%A$ z>GDhA2~8aZT}@8Z`brKsP`OaPXs>N{#L}+#<^pdlxwOK>yv-0k)>L zsxsVgTAUWli$CU++oFb3ezki|JVX{6KoeyhS>%*13Xw4$BhVj1N3*qQQUab3yr5MS zhY^YtvTG@;tBB7RDJODQy^)TH^#2UEW75jeX2p*@S@yi*OD<|!zgY09D?r#?x%jc~ zoY7~c0y#AtTeM8==BBHzu90B^dp$Z^-pDHJPy40bklk&<$NlHGZEJVZ-&|?jRXEw< zh;NnNNX&QylQQxMt<=WKsiCCQtNOP=sP!_!{3`C!Z$QOV#V8~0b@?+ekiWa|CaGVT z+iIWpC@GT}-rF!+k72TfK9YD2?z8*|O>VA? zIaW&`ZaWp^DL4Gv#ZPxJ+KcPkuY${b8>muA-TCEL^KX00{#Qhnpndv;LQ6~o;>Gza zHlIw&5_axU?UPKX3JFeWx5u4dw@*cPnf&sPeb*=hfAk7f_@j<0B759;aoK+*?UwR{ z;)UgAT!ZuI*HATN|D9Ct#n3-MTb@=tu9(DQ_oMV=|A)&qzcVMSvV*o6do`t+Yk~$E z73{b!V@vF$+i&JVY4Xe)vC)|72k?hspZE|W_oC3uVil$7`&6EeiQx?hk z8N5sene0s37so>vyR~iW$#->kI(Hx1HI1&HBJb2uYoDR`_A{2MQ=P~e!Kun7uI}rz zmiz>W()sKK&icc69DmUKVJ#=cY4FL{+W9z2$Ex+OwH=2OiRrV(+_cly=_Lkfdat1d zHYNyW_;{$=UOv`h2?C8Hxi6xvz94bJ#!jdF&`?-|qf)11<}XemrLJO?1c`cH$=tCM%vPgMK?b9_KJje1$Q`XQgEE1Py61$X8w4$moI<%tB+CnCNiywau z!>C^`$t~z2wW6jxzX_=gL;ujQubGxsq%#gd5D|oU#fimEz07a^nt8fkHT(GWEWyj` zl}p(|dWo^T*Rp$OOhKo^2Dc!cLWlY~JV(-IVeb2}W5-eH+@f*WS)i)UI;(qFjX$A+ z*Yn~QNueZ?96657Y84Q{84@T<+~yUA2Z&+>QX9*qKo;%g*qEBwl**Z!L+Tf}K3WEy z#xr$x(iPA7>1wX<_{r(pALoofZX!e2u!(7#{zoDp~B{} zeO@Tmnn^j}SbzM6JWF zE)BBd0F8yf=&y--_Qk$PtdZt~IAc#{IT%Zx1R#wk0Z-zu7d-v&r#)3z zMA5-`d=<FI`13tnOmY6(&2H5KYJ&%I;wacB_r~?BUVP2zdZScNFvKTt7ZcBo4zPk z8D=vo?B8G(?km#K`z_4w#R)87FTu80Q=xE!I46lJlE5^4z{H@_<3QwWA1;`@dAj|-Qp&+_r{V_UKt}Cay~qCzgO?NLy}*EJR*T zhDS_0j)jr^aOw|l?sX}nP4oHLbUnW7IS-k`ZR|mokmy^NbN_Gw<>g~fdh$Q(-22ge%ugDr)-fBzk3*$^Z7iMBrWFb(i*w`YX!Ta$q4>= z#ysZRMEW3B%;Q zoHw*c2Ntv_k=iJ8h**8$ctuevMBHMcL+2J^rXqulGc(k+G4JrV^{5?_k?SL7%5XW3 zz97!7)7NK0np3(8HO+*>KWJ93(r6$$i&;y06^sMIbcm#pWDaCIu^BR+2-UMTr3fN= zLk9qW0UwE8wCqdB#C4fhunZ6uZ^uGKvo~(S zSpKO0U~EaMtM)EH@sN-us3tRA?m;;Z>Bkq$!u2sqbj;imlM=F?$cl(~jHbKn4b2GQ zM9)OLUk;z*p5@(sG3H)+tmMUWYML9RKX8AKNEiD3 zw>_9d-!><#sc>DY~W)lCS4S&T7$<;qyQW`pRHt~)nbE!~e6Suq2#zgS)A#MMTD^7a^6 zC{w0#+R&3hqxH}Ge0hwZ&3DJ zU-2SL=8)yL6K0@vb;3{X12je!!qGZxS=#2)zPei}H+`#k818F939|ZuM9lj)zB8AR zGfC}H6GY!P36h!ixdW#kl%$R8XPMkZleP&^PUPft3w{*F(EUzdWVU6>ZM$jTZbZru+u2Yn^;jaB^nB#Hra2e7_5 zou1!AffYe_sFwyImg?AAC@_X_ngJ9VTaunD-d)`xGeH|BG^rWkY?Ts>V`t{}@qkr~ z!E20OCOOy{`(Q;%`()Od8APKIYA@Ix&ze2beQw@ryn+B7$@3wH@7O-3py`?K2Vi?` zy0xKeEZ7!HN?J&fVqf^j&<*C9cPV`amuTfTjJDsk0Dqy6sIJim*^<0o>DjY8KCp4} zdv~j4GvE6UK(=Ob&VJ;)DEjuKnd~;WH(J5LbmxJ;5o?UxmHw`Slc4MKhxr-E!vR1_^d#bJC^7{6y)yR2Kc6K;6n{66H z{JXjZP3_H5o=EfJEBuZw*~E!zO5Fz^K0>DYDu0m|G@m)Q6;|JUf@ zAK>giPab1F{4SyQ;Pxpv>4}BFN_w&T?iywM_XJ0UlmC5j`CrA_#*5_?Y_=z*A2U0T zO6L!#sGLQ-FKT@knDFDz!=oxy!RO~n`8WRn!T$r#V?U$LEcKcAaQg9a^!6c>kJ6*K zyrL{PvC@DOp=gj^y-ljn_USvF)$5}7KUL$h7)XZo%B{V;aEcDx!js&2hwl1{f|gr)R3~F`ZU;&J?B&*8!A`LB6Ak zYcdR3X6_#FS!H6T(m45DeJQ%OH#V`%YgvAten)V7TQU=|hktK(GjCJNQ3Y#Q1ELT) zugjJ4cdwy%>D`=)5*Ng`(vbgy_F}ipScp=q13&8~R zl$K_U?(UFokZzR*X~{36R1n+Wz5nZV-w*CbyPoXXc75V~p2vY6=HgKvvsDwPes@Y= zS7+(e5i!nrz&g8~0HP{7ARpbc2yY8!*0O9|FL=KA_^h_9L0 zMS5(}Tp=st+S(R_swC`04CUrJ%vus_cS{+27R`-RV`&0ukRMHWs|5xRP)n+GkrKLe zT%wiZFHC=CWe?ZMNpNYe)1%cM;_&d+jF+JS^k zhk%&AsWyTe`jY}kPm#4en$EpPMcXF8r{bSwgQu3Yht8M~(EuXt^&k%#-_u)(fEZUy zjZ-OZ#AP#PAj0l!l~Lt!aq8wDbsa0K-*k`kRyNg5o_SxL$EBL5e@C%C;HPwA%i&8V zgue-cemS{6zXrc6{~Y`rQC}KSVP0)N$>Zu}PcsnR%}GyHhU>)Pc)=n%`yPfk0s~pN8uldF&u&HVxVi@zas;ooCm0ZNO>m-Js?|84nU?9*~9rg3GwDV zpvi2V%C)2qrKcr`H;KwKDbihWq_E?T5zN6(33U+o;z=KpBkr4I*9m%?ac)s%(CS@3 zQugv{rL1=sWF@JFK@NP_u6;NcBh0!~?&Z|s+UO4E{3~iZN7&PQMkP>I%UM9#_~}LQ z-RY)DaupR_gEFbflf0XW2A*KQGd2}S>&G=l{b1@qI2y$&qudI_l3 zSSRy)&Q@r$AHL_EDxbAT$xI)8Zb9vm$v#kp61nZAK_dJsvEX1jUR_!drcEz)%^OId zO2$G~-{YwKY8?le8*`tswmgAd9Xu=Qqf_xvA|Kh2cFa6e>#7d$eIxKT%T;9rDFy}V zC5=b^MEn!wPF6O?qzJo;?n(H|uabRJwPpY2+SK-+dr+ITAa~y?f98rsC$|VSqqND( z$;5SvIWyBS*~h3CmhZw%l`~Gnea~v^HkGF3BDjznG|6gGt-q*cs;ewrFX?Jf+X*;l zuiB7}&%O^F7Jt=WdwbdW*G8SyUrSH+ZD%pt&sCP?eTWY1n(*OFfXrqRrFbJze7#F z^;Y0gUsPBv|9rc-tw%)`_MO?q$j9V&(p8ef3ENn!0?|QuJz_>2@MpZ(3H#Ey zWG@lQ+Ndm>yQ%_md3zcynWAsvm&CbBsbYXaVSquFFeV!Z=x32#t!5;OJkor>;ni*D z#G#3noeS5yvBKm3*rWs`URwp##+2mH{WyW87E2vhRVF+xE_q~sUq#$qm=TozGheB4 ze7qFTp8kjGTf6Le|u_ zcwd?@Y#v>N((>J}w#$vuq=+K6jUHxBW8OP^rpd%qtcZD7?ixhhk)AofG-PF7=HBb zG*D;29>dJ18CVm0m4OhNMXM9l_xC_|iyQ2v$Y@VveyZ74A?$u%Xol13sX;r>h3);_MrGZoi^Qc^#d# z&W|2cU1FpTX;`&f%;k9Dtb_lYcDL0=n1-w#S?xy^@^C3oZ!rsx|L)RG5r^%!j1t8{ z?^RW)t8ee}`f&UD1QyLGJJN(1SoM2>k)%^+9@@8Z5D|l?xiN-xvln#OU>baoAmi|- zP*`%&@UQ5V=+HYZr)jxghBw`icvtczKCgEIHbT@yZ*$)9L z5_zzhpyF%-bxP+NGGUi0>=}Dxs65sA8kFq?)KBWsk=`ZLM>+Q`>mJ3D2z|@H=`<#~ z*q8Cfw%M#nDoRE_T65g$sy>&emyarYu^upBB^0*W;N&C*S9vZls)WD1W8Y-&()R9~ z1QKJ_NPT*h1a{?ei$;aF{%`FX>V0$B-n zq0%jU$&(19RH{H0-3FwWAOsFAf?q*_l=0muUqnl*&tO0+Z#81QkX)YRVzJxkTg$(o zzY7a;AL3FtT$Zf!XMW*->jQ(Er++y%k^Ot3e7+7Yh_6SLW&$yki8jo5Ek=o$BXUImhTc>zp zy&xl+F_JZ@8B46jLttBQAX3JECle)~Mo0PUvOD9#A8jb75-!70ge&5~FZ9eTo8c;t za{n&=+uN1chO{V))x0H0v}pf5*?X%3k;qYMP5<$-h5I>;K~? zJHq#IQt7zx4-51ecf(W5d*xa;KJrJqs)jFMcKg>pp8fRIg5SCW0<)5|H~tf-uLj#S zR75o&e!aah8)R(WOGo=R2G#^r#T8LxmsP}~aAsN;^q`NZCChm|V&Kl?z0n`K@~oxI zF6zISsIYu4c~NR$d;J<(t6%U}C<81ZMI=pV1pMaPZ2sl0lX|eKwVB^M^fBxL5x&(` z9Tk>XK#CiBQkP?9wiBo_ZZj@NqlB@lYi!x(t7=L*0l)0i0r9Z+OV=)NSTVe>k4%i9 zCI`4n!OnnZMS8t8+VEQaAbsIwUs{}2scjxKF=wShyx`$+;ZL zhvA(qT_jCcXBQLkn388ITsr@~=~Z^iC9xmA!b>=U;z^a7A$fB4QxTf9K4gVr$OtkC z+TbJ{^?lB#uZpS6ePCznyfW}Y=xZ>y9RE#7zR??qszle zkB7%_vI1hM0lnegbPxFVvD*x^EDf|BfJF{~AwL0Wep5sD)A78G*>!ll^5@Jti^?d5 z^0#X23o7grSu7YKC-hI(x&XJwnsh7t33^d7)>VOdfOxM+YLU~{gGe5%0_`)-%)@qV^9`A zl-L(w=^wCGwKCQFjTgrd{6oeBZX=Nv8&c4w{wKW!$}-O3ZfC2*#?>w1zgj3!eCrqRqfe!kB&uDQpUc`A*c-TC!PkzI-ahp=;?gwwgixD15w*4 z5-lk|`A!pOdwnZ6dG$}Yc50AvMUAR2s5hT$)JXry>Y^M|cMPYO!QN zfFuwclZXdhaawds>f_9zI>l8LTw`!0s~M<%qnt3jg!5_q2R*E27U(;PB`iLvsFH~L zm0yIuaji?o+6S8U$v2Jix&;HcS5O*g%->yi@!O_T82{xIp>)x*Io9{J4=c9`cm=tPnD-7yv?3i;#%2IK1 zrqmK;Y0p)o>DZDpoZE63zhP}7xX|1^jaIH+Oj6!KJ<84iQLJ6QK{dEE9`|(DQ9;Ru za_8jJJx>081iFWaw90xS3oR& z289ti!;Zt-hI|fGzkWKKK74Io`$edJj(&eSuU8m#!!#<#6Ij1RZbwoz|DApKi~IAO zB)b<;S$vKeB7#?yrFA8IoWLCP=90YqeZBlrppo7`N0cu~#l{Vrwmh~Y8GPyclGffb zSZ(*8Yy>Gi2SVH8S#5ps*{iDB-X9tIJSw_t`qu9ROjrBX#K|py&WF_6y>E8;I zafYsq75l#A9QkdDsEk}%SbPipGml|XlFPwHxx?}pwpO{%M0CGO)=T83o}IB3*)~X# z#7qhNG~}o80r7t6FvU z>*ti$qqHW}RyZs|!7M#8)Y`?VsB~sRvEAR&f8cAFh6NTbOq~mW4~=?(Ho&j+MBI{s z@K7H%#NEbEiRXVl*PLCl)s&1DUoFiE-{aDeNiP)RY^#>-OB-PWPrN3BaKP&aqy!=Iq1u|Ps8?~O8%#|(f% zwDXJ^CWmVL@QivJd3ZLqxCE{cV*5v$^9S#<5#_T;AW;PLXD;ZA$6s*)<1Na>8I}`2 zgZ5Glq1sgE4ONDAy8LX%kT`J$d-^LyuR--Pl`8cNKuZtXH3pjSXi@&jUkREGU8>dy zn#*S`H@th6QJps(=7M4Btj~m(1imD3EnjD=s<*Xbh>VEFASCdJ zkpsIvQ}mMIn{{WIBbO#9z8(9YLY-H9d&%5^JI!^efq6ycHR^|>aXinsrhR$LbA?6U zlatH{=H7l#FIL4@nJ5O z?T-?3T*Rl;FJwmB`L}wgA9AyN&oX>e`oXN0c^9ude&Iu0bm|cQ=8UEiP)`o_8nC1( z&HF2NNKsw7B(t)rRgUN$2c>lh_E2RR1rh!%DcrOuJ%6~+Y8Lzcb8dHL+^m|=JSr_m zYKk|1$V>=(9^eXY-SLG*iP1l!dk?_W(kNf6&Z|QO7YSNXqey7(OU4<`SZc;@QCh;l zowzO>?oE2|xAXy5(54(ys-N{O5{ATDK0Y*z-npljG z^V{iC421atAJ8c`Zy9G@!0>u?~W~6rwlbN9oMNl)S46@3z>b#5Su6!N0Qa|RNRu^nT>6jed2KYnlpH; zax-`%%9)&LZz}z^Wqjzxy%%AK&n5LjovY0meYEbgx`9ve#?_rJ;g6GhR-U-lRIc6+ zTQ>i7E?U{S?Vaz+e;E)KjoAH9sHrnEvvc(}IN!{j+u@9*vH6LFaeKHQ;!IvhliR&{ z>~paTst=Zwm)bKT7 z1Isr$6;Am4{J>YnpmZ_oJH);IVhP{C=;9TGvw4<_Zwz~DVl9$xb9L8ShZed$X~IQC zouTzQ8TzWTMDd;IpppMpeLFl%T_viXXSO7)Zrd}-Qb6Nc=*U=h2LsF-@@Lj(m(e0d z5I@ajMUK48R%vUR06z)6|M-j+_|DaWsWgMNb+bik%dHox-`U`Ij&XhGJdAJQ zckW{rjY@f(>GfYKJI?=I|IzeNWECO#m>*hMhGSe-)Yf(1F||S2Fk~M!L(O8$-sD#3 z6%JX)YWo|p4~y#LuFT3%2HaXj(_TxKt8o+H2Fw0Gv7PM-7k4&d`ioc>7JeS<%%e=# zg>UE4itZ-nRl0gi4%UQwQT zXH>P)xan!1U|f5_`jW}1?MA+9mb%)zqS-7^ATeJMToFDGw#SNU{@iq;A$>06B?8I5 zbneqfgt%1oyolW${}oqH2S)k#yg24?Azk`LC6}P9F5u0u(!d_bWzVKCi@UfmDsr`q zW4#VHfq;oVA)$W2U$K<+^~rQ*LFD$)5z={t8WkITNYAi$&E>z0<}8of)!i9|s3`Z^ z?6_+Y+zpS2h~x)5j-~ul<=bUwVKo7ATM#>}ys}WLl*j>cSMLYgpSgA2a8J$uKJ3^m zrG`+oa11l@*)v3rKL!BUzKZXOh6Nk0*y_JE(U!rL)jI12x|~RN&v^dC@-lowXKwJW zKM~kn(rXeH;X;q^0{bATvo*aP)3omZ6mldrj?_4BUY{=Ba%obu`QTZNuf3c-b&5Sp zH@ID1FOW2ua43ss>I`$Qw8~FpWR%$E&m}J$Gd8Hyc_O^9rqTN(z&}kdkg4+-5~sd< zr_{X6g(CJ zfbnRuQ0$}j6ZJrpZB0s|H;w2Pp!}<)u(8hztyXN<(N{{ZVu&*`|vfrN9CU`!;>0GY43_6)bCD zWH5%x;lTD0b+dU_0XnGqR4u$t6VZRBlqGh~*MR&a-5J=VCx@^x7;dL*(9FC)_+s^$1-;)Cnr){3ek4_`qLVwI%d2{ zQcp%PVox6)xC=p&-0%A%W{$UZsBgN<^Xlf1bdhtbGyKyb+@_pjq0;w>QD!qgQ9Vj5 zx6-}mq2Q>jNN!$PiS2Cu^sL}<0{%M$#mka@yUGyX)tLo?cvHIn@^HyD@rR&O0KrTp zvyE-}*W#Ocnp-ai1vUknd`Rr#nlaKl`qXZpt&S4qMT3=WJ@^urR#)Pk;smETF>2-8 zOP}9R-~aunv2CbU=$(RDAfQQdO)iapA1|g9aAypGc?3 zL8FO#$anQq}=B0++J|NBj8T#P&fox-oRw`2r^itByD$i*XIXPZXr# zVkT&ZCiPNrfOz>R@jaH<$fA=!tegMxe;GuKxAwM*(`;CilWIo3be^G5R>|tyQGP<1 zs8eRlkfN_aB4PO-2vl+Tq76*H>~!U~_p z7jm>Y7y|574A+Q|)PYPt0;4oJ_2Wza2k5?x|EBUVr^94TKIW3|+)*?5!E&-}irPlO zWz(F^<!Phlyj=MPFJwwXii<(4~_N_H!gT|FxjV8 z3AVoyhIzM3G^=PBd;=#R8M^nJE(+1!ZDHf0zoyeO6y%;SK{8se%H*CNJGFCQ27p#)mBJB-oi*gfMVU`?Sk?~@q6;HM7d+C|@Vk)sCmXhTOcxmd^-Ap+qm5 zirz#=E={P9Yru)^Ly6B`WzN$y39#5%_d>4_etz}RK|>IJ!wYO2FM(}q zw|;@(OAK~JJy&IX)rX{AFeb=+R#wG8ui6zeiSbBxW^apEIQXRYX|?+aT+Rj7$S*<^ zJ{nI?H*`4fuxUl+*V&y$(X<`GXhk@3DE?iN(P?o><6bZBFx}^)%r_Dyesf*PCGxOi1vIH5}iS_9z?(h4PBI_IQ)Z>}1N>LP- zKZ|1HaU}02xtT*>88E~ZL7zv${58FJgAWtB80Bw8RG?ax`?XO_dc%0kK?W2UzZmN_ zEWg!T0Ci|n!1L(Mxr5r$q1aK5(y-r^@&wy(CbT%pSpweeE_5{}StpjgUJfYi1uYK{--H$XF5W(@ZBEKI<7ZF!5y2 z^rX2C#fc)m>HkRf?@Ej6f+2CPY03iut!jkqS1VtNQB=80AcV}pXpHUEeeGTH=;mRz zSSns`=kK&zU@|=QVaYQqF2FX{8$wRYpq^HB9V$2CdboL8D2`ie$q>*`Zi0P9l2W32 z*Z9Y95CAPA&Gq(7p`~z3wznGq;(NT#uuUZc5awR(Fn2=z#g zmS|fo)mNPj+DP|KICJ^RO4-82>RvFQ?V(_^(eHi0HrPL`quR#_l=J|kwviP7Rczui z@u_6nsxs5Bu{hSOC^TLL7!8Gmsgf zz0Z^c*&f&Qe!(dR@$`{fq8axCk|!j6>7M=sZ*^a*2*Haig`n5kAFAIV9YeAb^xMZe z59*RAzw|xWOF9hfsM1}qM^)nC8QkPl z-?Vsko^OO_{Z-XxYP|B;WGk%U4FIhZFk$@xd0juR*U6;&LXOfpsj=d??qmG}N?|-q z++2kBm)=b^HJ%ROK49%zzv5=5FM~xRiK6+P?P>ZVqNJmE9VaQGUp!CwOYwk-1Aoy~ zv+zFv*%Nv*#T*k1=hw6T8owb{rN1w`wwmM`zV&T1F#d)Iv$DGPXN~s#uJI;)?!1g| zXnNec^xat3d0-0tw4thZ+4|Q@pE`XFpunKEwE@1?>MU*C!Va<82qAlo$>owj72H}ipn4zd zss86j#XPc8m}XeBcUE#<@@d`Iu_ff_CD*GD*XQSdQwg$_f1EXhFw6j9S^EE`1pmK* zfiPVDcbM;^l5CZ?VrS8${P#%j?=6I@ihU>GW+rRT_T%S2k1_Zt{m7zWcTX|qM;L-# zjaaQ@1xtg4N6;4XMnn-aNd;bie-rXHKeV4;Z~xoAGwsTM+sCmuRB$h^)v6xzA}qkY zU?R{iz>9_?TF3fe2Th=zM72!#v|77yWp{nDgVAah$YHBMSfZrpN8H7-hch=Zy|Lm| zGax}C;iG8sfw`B31r!eyeUg0=f2WPB1}YUbU9-~LE}RWoG=5s{yC)d#!f-NG+W#^| zzec1Dg97U)bQX1;T0QaYv#Y=V+T-oE&}JOQy<5`cSC>PWD;95-ZRNOrxs$6sE(?k> zyH;}iy(qcL@GZW^P<;pPC3!b^A^k^3M9GHQQ8&Ckzs<_4@6>qxNnXB#Vc;7NyGg7M zC!>s)=HklYj1}cEaUGSB)l$_g$KX@6xj}vwMFv=>EsZ`fU1C1%g}Z)`#E*d6MgSZX z(lG+m%iY*x&)D2ms#4$fS`ApYp7jA1U%NJTDw>5X-iV+%7}AYk`y36%)W*{~*%J1} zJ-5TKF`y=poGD(hd|ASmmv`5~pw5wqD6?Q%w!m_P`&2Z-(GYw)FxSWD%wj3+MAjy;V6_ggwugY;2{S4TeZ-&%DAo4 ztbWrhX6?yFe1vv7hz;obrC;rHZzE50)ES42$jO2^>#STVF7cF6S8HrCKJTO!S9D}F zyK-4V70r;6Ox@+NBIt_ADLrVCvohD0amgM-nIM&-d5L6Ylik1m%XSmDe&123)3-{a z8R1BQC3*|>d!Z|axkbFuuz8DKcKg+XKgQ)Zm%A&$IsK^AL5Pij?AR;+VZ*z2?Q*lj^enV(N0O zoh9Qr+!W=VZmWUEcbYfaw_d z5~A?!5eA_ql>u8qStR-07#Z_4Bm5Qr``VSZ+sGB*@@mh0=CRQP$CVqa9?dFYaEAE; zm{ zA8>t9I{+#ZlaFa@D#Ynb&#hZ$A@o|@zqQ>%@x=T7eO5Q@#gneV#+#eDGS@_VTT<)R zw;VW+5VUG-`_8?5#!n$s>#nF@VBC^;r?BbfE*kbsf5wJ9yPVI>sj<>4;)lOUW6QFI zky+_>@Q5t!5DI%L+p*Tlzv_Rhm`GL1ar@hgAHt&(Ncy)jmhTxE<2N^BgpjU+S)DzZ zLyZxA5VcF)3UXUqY8YbJY3PYLZ>aifA$W<>u1LRxx3V^oxw_UF;1(?y=4xf6J91-)tl&McjRO6v zd=Jre%gXNMF@!6+xEe#7J8SSF*x$-Ii+etEabNer>j|aEej)rN69TT@uOxkMe__%U z$?;#Sl>L2}54g*&sKB_oHWEb%?07zpopO_N@+IBywwt&(c;_96W6f7|O{}-tK!8k? zJ-}1aw)Hvm<;N^N7?jIp+GP2`X%2PvxhFqPrGRSwsLZYf*rt|dTKK?kJS=;HY){a;XtK*v! zBA^=S$o%Hq4$}=rR&MfTcTEcoP-n}Dq?-r6JN7))H{RpXduv>e8G4LnNN}0K1m-_I zyC6t@qQlQ5i1(q;cdrgPNrtc*3YzMQ ziMp6SY#~B;7Ng`3U2TxCv(p1Gl_pTLBf7)JrZY~* zxcusritQywom#zRDc^a=J(&B|eab13!u0nb>pU!Z4#-x`WmQ6o{_TfXW#b()LOM;7 zB+bShAHGKTC>LnjTj%J^DTG=_IrB;mYa4v+@az4MAiRx$V8srSk1gWk6eBGZOnU&{ z)r%eTU_?ac&+h|{qs0hXSe+yFMLh)*9j2xG&;A6WrY;NH36DTBj?#5RbB62k`xjHTQr(Rqz{KS%Z41X zU}zcCE)14*ZVJH@ZBt6Eky-C}R;pf0%5I(66BwpSMW^>}<3A!n5yV7YhYlkh96g1U z^KSK=^5fGBLJ79qLM-fQ8}ZxXYOICy0^7ue&!1LXW#yk}wo3ShSbD&d3~v*Bjf91j zX2i+4_VN)kcbk)r>kJH9mE&KQmX(&HKM5V5P><0Fx5YQARwFNu<4?yqq=faw-fNFZmM$oJ_j=A9G&%}?@t?4TLY=tr!_KZrss*Hg65!-vD zR%|#bMwY{M_KbBZ3AS|h%{`l+a-4Eq3g2CbA}k}pYO8Y4RON}c8~yhRrAADuKl#Pk z_9w`3UD}hQbjUv+dTWRVwLCN=t1@j|Cn|DCog^xl_f%6#(sWeOE5`}bG$ZLJUIXRj zHkIvJ8&Jk8T1`f+>&zMq8LLx=$P2S%VH`89P_hvDq7i`TcFH72a_%#Zb!QUg)C0vi z>d^{|J$IBkGHQST$InP*KQ_%9+s=Gj}{Rm{>=K!?>zA z7BggZB#tJ}WHbrUzi24>xLulUB#AutN`Dtfcdw2Wpqd+(dj-oI*qV}XI^8YHF|(IW zA4q?gnb9HvM5=Zt^ZKe;_!M^B=aQXFHD!zE&gLVra*61EEyVEXsn%XHwq|ohLP(|i z9~heEaP+fS1T!I2ODGIMYq|C(mqZ@hK|X?Ro3T5yV5eR zdlb!aZK^*?)ZFtMszmyJd(p%`ZEDrm4QV%Dl%h;>Irt#)rW-xMVWKTdExbbGZl!Cw zQnhONTCh@r@|6IeE3@&D0nhPyKEg^}MpH5gt+D7xlvSGyw|6BkKDVTmIP1T4`SWB~ z#KKFgx?U;CO7wNz`nRCO;+5|b-mFpCIViogcLZugjz@pLuhiPd!1t+rHYOvD@GMc0 zrxH8OYim_anakEL?FLPjOaD;Wh4f5#7__}xsWc*cZ|Iqih-uV6~-&y zVtJNxT;lR&=#7-}svTm2KFELnQr+D0L^!*@NCcaNVp!1I@*srMlNy&nefBg=# z4-XHQ_$#&Uw{1%_r8*G)`i*kfbEjW^m(ir6WIs!M-rn5(`$0fbM*fYw`yKvvNSt6- zy#MWvlR(2%-6PO*9K)GoZ@*8f^sqcC$yp#sa3XI%g}>bM4tex8hah@T+I?xGLf;Ap*JKivcbwb)BeL*Nkz8*_!dz>dp z?3eCY6NWSX1Xvs_0$T8In22;NxA5V2o@5ixsv(G+45yTQ)TLEZS2>< zWAe{4TsBqd^ZjaxjH%Y;5=ZF5DQFPo_EE0F>`JYvd#8|kBn(Wu@tFelek|dLDCw2{ zoJHd>4`2J_iH$g){cEwRUF*t8m<=)*G5Y3D=+w+gGxBH_A284g`(1J-oM}AF&`HaZ zY0rWvk^z=WLxOD{Ws6I{@!N%uAAEfNWb2m$N%M|lc6KrUin>54MlghuwK-&6I=!Rv z)jUf05z!npiSu#$>#LDIT~l#TP+N9bA{3!blqlf%{9|VGK9B;kVp4;rreZ87l-Y8d zDD;tBjGC0M4UZ9u397USly)WU)|5@ue7m8{BZZUv@12TB+77D@@0& zoRXY!q|L^**+O#8EVZGr)bp*Wka1Pzx82-ITLB$o+&=pgA z)d_lLs^+C_?4Ig+LhbN43AwezYI)Xp>!EA_W}$|oOrb2nb(vY-3}m5@D;SVyd#r&t z8_(*e#@gcBu@Ntd%*IPc)k7uZdLpO~Xq^meX&gIr@BtcviAdt=GNc@g9}C?ccdY9e z%+IcGZj*OOJnqcn7(i91Yw;9u*X~j4*@e34q_Z}Y>DFY<@#w6=1Lq@jGMZN4akY%! z1lz@-S<#g=Kkaln@un5XdRbd6n?a`I{W1MS#-ODZWGG3>b%d4u*A@L6{5SCUoG!x% z284?Rs$9k6;v=E$4?|(LDI+a|vYq4>&vGs5r^9rbvzHj7Qg!C!>A1$gLl-h8 zhW&2v;ne`rR&tau5I57jNJE}X5)a$2u&IJPli4+toV-C9R7%wDBU{Z4VK{`r)U>_j z%H=5(r@_d-0%Q}nKNCHJexr7$vYL}z@`#F5Q!4m$?CyFfNF^Pdc=DyvYYx5g2`#J|C{pjG3yAiitDYaN#c`tYq*V%hmO3uyAG0j4CHVl(S#x)a z+@Nxi0o^vJ`lnGwauvC_W(vFemG(J}u6&e?qE~AHZ&sKb6$bZzKPT8pqxG7oE+_)3 zuptg+7~xzSkJO|@6j7Nn^ke^P+L=LtQF2ls_-FA*4}(Q*cE_iEwmcG9bc4vBKTHsg z+&UrWyyNZ1saBJtM8k(bJHxlfBXodTD#gxW1!uSO z-&MBK1P#Bq5#^<-zVPWd46>HZn&()VPA`<)ewZOdOJ<%_kPULJlT3knlvgEm$F(YP z%wJ2mPu%|0XpTj=djAz29iG0jrzrMvv?q!=H~A>~nNDVN%k)NKNm$dmw6Z3#2x8wT zF-7+0O>&P?(fp5XhEzin1NV4(lk#a(MRGg7VUV>eEU&0#@9(3I309XJ4_EO-tGc$I(ml9FGQ6ea^JOTW97?+XINN}QKi{RZ2h)h zr-^(_!1VN74L7R&F7d0zy$!}0qM|jGL^w@G#$ppiyNA;QdR-3LAsj$bGnaYS zkKbh&R1awA<@PrWoWZ#+LQC96ve{JHm>e@1M7UdnD0GI!v``d$+Jq(U)699* zwv7?5VU*Ydks<3B?7@{4&cI0#TAvH;wI5gLINmI95#}z!uaoPZVOEdpqlX$}l81hi zk0Jx`90ehHEqQE~dEH!OWHec{lu4-Xdk&YRU;H{aN+rwPO1BPZQI4#RrSTsJxh%V~ zpYn0~jKwN&7dE!++H)jClFCLu<3zlPX#+d!k#l_q^295#-Pnsv0w3@91GQP=<+)5G z)%-@n2V&V!f8bz=VwF%Xn$q->qn}BUN-2XCFC;q%uQYu8k|CS7{*kB1d?@5S4w2>= zhy40GTjiq?oKN8ABZ}`r*OQ7mMJj924&gr^J-tiwi^H4rF0jpDdJ9rPh^fnwiDOHS zZhkr;YOsaxwmc1FQugbM2?a%=^9UxQ`;X%BB_z34VI zH=WZb6uae}PSQj=NQr3QJk*9MI!8|#n%2&aM5f4{rZoMAM?J-fP|0MgH&R}+#tm;3 zoj#AGd$i%eadLS}y&6*%V%r*Jq6^)Oc9+DCJaF4=u9pL-+_$-peD4lr`td$bO3ELQ z^b9OVYoL6-)<#)1`ld$-5W@NfYPjq);1Fkb;p5$ilT9?FGxkPSGPIy%=>fy#j zrZ<6nnVCisH!q|)-@xlPGfa=p7V{^vgb@wCH7whEx8K(SV_brbY;$Vu&85jpZd`e3 zqxF5u?-N&W&FLRoF(F69q~S;0g1y@{{tT|RS$qiA~y$*F07k)YR}FzdZZ!^BF-5NnlwT)-;4m zUEZpG_)0JlCDBin{|ayY{r1&0@nr_7Kw1qIKHTsB+OZ{sIFhK^;hw6$YAuWE)c@&> zTCu7n2dX}`r(cy{5rFhW!Tp7@9_ZOiBZ{bx8a95p{H|QAl$iQzPoly~qka&Js2P`k zm|TY*Rxag3vG{{4z58#v3qx4{@^Xx>+f857O!f9%;R+1V_>MPiK~vr0m3LdIQI|YJ zS4(I4a|gyNGhV&6o%8L6^`O9ja~lGwhM{w@Q>V`I<(pg?^CB4%6I_14_;x!>SoiTI zJD_VJ2uLf9-gH1qsMX|<793{n?fODLcTSgPfu)M_Z|;?zvQc5X*}dnZxZzOvdSVY zjq_x{IVT~D=DpI)e{-Bsp#)Fem+C+0YZ#lG+-`eXzI9`!e>*#zfq#qqZ!0Ki*(^xc zi(SHWQ60N%Isr1O5Z|n4*D7yi_}tqjf|YQgBM-M^{v@?Do4s za4bD~tkuOe!}uGE=8`UEpuh?aMO^TaZrXS;1PT|Fx{t8?uXZ>n+s%(pv1PFhh*R*_ zOb>)YzS>xueZ$((xS3jtO-TvXpg5|JfB;YwXx>1>2h^RR4ZJeLrN6TOV<;_!UIdFbnJaoF8)hx(3-qb8l0p5rfbdBn)t-^z>{m$e5CmWgn%N zjr@5ETZA<&siF+--Y$DG3G%w~*vC6+J3hq8FSJGVhG@9>hCJMf^OcASOAh2*MaMa9 z7y%Id1Q10^a>C(r!U?c$8*etK>4@B=J&Pj$OeRO48kR`%StGZ+F8Se3PyBJLfyR%Q zZ)C4!ztA&2`4X;pyJHg2P)lYEC53yg%Q^Kt)PF4%(_|&lRM*a8LLqoT6Zs%#Q`_%m z2p}4?`OJ`W1@q8ClKUY}0V59(&x7r-SWub_LTCr6w&zQBgWR*5x$0XH1b+_w8 zG#0}O^gJ?MC{f?eI)h|`o&usw%9dv1oU?)KI3nO$uN>}hsWL{=l>D(NTAU@YmW~_= z6`Xd|0C-K(?HE`2EU2cq_N>Npf=#mBd!D8iJ5Cgg?p_%6JdBp5Os+pH{f5yvZa|YW zOz_q=){f5$<6N3Rk(CDAO_b=OI43bwyu*)3N)IDBKcGD_Qc^Qdc9bN%8~=AchdgVA z<^2q&0xfMQjo~MTEK81k6mRIZc<33bxViEh1&ql)W`@+BhSh#!KD*fYQ}TxjWB)LO z^e|5cA%npoY|X4c3{{H<6!LW2kl1o5CeA=(Dt;OR>qABlE=*0HgGh+cY& zRe{`mXMhuMIyR=8dglo3RB>ietX8p(d!L}9bw`RF*V8R-IqD%goJ=Y**NK!*B+W>r zz`ZP$AXbc3LpyCRAJ|J4lVdm~BqTT0GemJDnH*3baXpsfDtJM`erM34GHIgg-xa(hIBkars9h}3ag!ie(7 zduE?K0Bwy-j{{u2ghOtCPTT2G%6EP4fgfAB9p~EQ z7sY>^t_xmCl7aZ03Zo0ZNkC+3P_0Jfd87xSNmmL#4>)w}#c3G>@}OG#Ge=0kmsg&^ z`L-#p$#<|Q=Sb5m>7bF0K6ZQs)XXLrOv>Cbc&tCa$7$)UVI)iM)G>X7ePdW zu_tqWY}rc9pHLXfl5{;sev9kHu$q8(3m@q10qXFuw# zp;diguSLkhJcH#P=R_*8$Z|W;g};%)9FA`f8fBCxymHli-nIo)NItc9v8%UWhZLW+S;4j-qj*h zQMF2G^`@=v_WtMhe{de1^XQ!OI_J8+pYi^p#}A~>e3NWGDJh@C!9MxG=NWwta0QX` zVC}DkINUYiGB9=*J_8#5m^;L{Gn==hR+Kl3V#0UDG6~N{b8jPoaZ+sG-ddgBI9Y%& zbbu+xK&1YBa(74BM%k2K(d2uHuc!0Apjqc&olkVA#6Adh_!E>!MYN3w$8&5m=f(aN{=btNVDzJ63FT)J|B z;j4aO$(I?YONG-CgRXwT$9&(7BIz+kdaL2fn@H=1q-YNaL#jl!KS=!J=GKg0N{;KCfw@1MNg09RWa(Y03OoEA zXLdCB4aOQ`Mr|{=%hFi-;+hru&trXx2HpsioKLB>o=?lm)bb5J1Ir~EH(F&%S|Md` zNsNb!W_Floj-ISvdSvHu(tUB&VI8mR%qB;u5w0S4tuIa&O(fKn!%xJ%@CP$naZ5*n z3MnIQ@OSgHq%En>aNmg4t+R>DEhRZS2oZG5c$pE92m4p{^OpzGtN#Js5kF#`uO}RB z-1*_wSt3BL{a1MmyV3tJl+1xwX4*2~rK}QOK8;o$?OP*_1btl1?st;dHN~ZG+{pgM zC3E+<*Q;tTyiQH6M97))rL?@{^R-*T@z*y>v38M~!Z|Xk4%wy%Kn6p0R$=x7hdCJx ze%<})Jxq35a|d4d2*YT3iJ!4Tcxg2#YpN&nwTuZ#&egY20JV?SmY&>J)76FK=Tp?w zDr;?!R|kW~5qUj_d`ySx^c?QpW#K=DYKGwd0QS!xZlC@B`B5*YVE)&y!;^RBzd+$5 z^gwUO#gl>`dxqbC(X#-(tiOCze`oyonLrNjwY#MpzEe@f?R@ff^;u4kYf$C4~l8G!Hthm`frP5k{=t@HIS zhi@Wp8>34ONP7*n={wlq?EG?hFFowXx|*(ys2=xiO#XfIAik2D?ymEg;&%Iu-&W0; zL4#%wHE|C89e>Rf-#>w^BiH(Nuj3C096F&+hC~V;w_`0Mw_q)E z+=p>8B4rlS)Wb@UI>#A?ZnYwsis}sjNY*k3=#HJGAnYR>Z;02=FxTq`kn+YD<(nR@ z(v|7S2}DqsEc2j8BIs*P1tMnQxi#9vt`lbK(0TfM;LE4Vyw2irn98dQyMo->eBLAC zah`4`UY!<8&8`)V4bN@%nOQW^j7ToHMQKMuM*Z8@L2r-Xc#T4S2kC!0M3I1o!BU>P z=sV|pRZ^uS87xltt})xHM_gHF*9-3e zMKwQh<);EF)twzh(p_KoC{6CJ+V@;!%T*lmekfw?bzjcfN=jh|gOV$%ix&S^=UqA3 zWo1tYTE##YaArTk0BR^bOm_vXz@~B$nlu*2WKYy8`e-`}Vj2=NGt=EB2(WYVSP2Q1 zUYj2)1MKBj31T^B{s_BF^#2!iw;Fv7ww?#(}h6WoUf13 zYQg|jAG9nxBT^d(iT$Vr53d-XySjEXfF=o+Xj%0;A7``u2cR-=kwf^;N4zLh{s?BZ z1-`a4|75ux0Kk~x?%I9xK$iQ1b{%t6Reb1ct%?V!g`#1~QgGXz**2v)C7eateT#p( z*5=uqSy%xo5yGzdt8yvtr21K$L5zK*k&HVepY3Hy#LD`pi8y6JZdoLX-)DAP!R2V$ zMdmIz(2fU_4ALHv8mjVDQg_g}3eU@l%@}vi-A@v{^O8gDR;Yu4#eOsg75?H&HlAQr z#+ty;)Wcbs%JwF!(f%%2F`G~(1r3I-M~iF870UiHd4pA+G|Q7ezUN!)7l@!uH@iCKW08p5~UHTE|5vetHC0k=<{jrn~p4t8%aCX{7 z9x&r4(0ry8pi;94&8ZQ|wiIC0>zbqg@GSZ5=0oI&Xc6bT3vy5TF-`;gj^tXY{Erbx7UgDzFgehQ56E1Te11(yPC@#eE zTrq5e?MG04O4MNF+){&Tfv>DGvb@y{xpEoQYwJ)Q|I{c9q^w3TXAx3-0NVbd$&tH@ zNv}Sp5@4{XQ{yM~Q5(rQO-JC#qFg&+Wh^lja!nHEZ1q!`m@|i_?ZA*c| zIoev1XJG=-?)p5iWt$SjUb6M<`U9}VQmo>Wso{p$*%m#4SoaGse;YQ{mfwou-3D53 z-T3df0W5)`vLQ^;;wEuGp}f3DVn>_BcHJG#DKkzk1nu_AL!8lI+G2C~ic_bjq=e8@ z@*BPbrLHyUzEXgX&<x4sNq@0@B0kDq6dvYh<$X5>!QJ-EJMNxDY%drr8}k70@;d(#%1R+D zbvkniV+tEawS|uHv}U~K@lGq!QB=<@%0j!~nJn1EXWe_PXOiR`zWex{#*i;w27GG; z9x>YyF=yjE+KhYg0a9PFOkH`xI! z_o6LT0ZD?KB_2<^;_q2>+Prx=lz=&f^jltit@^c^?B!1^LLbJQ~MYh2+ zPizoNdy+nv73#o*ZQ%LmJ!akGCYse~*NSJWpS(0d5>q|)Za8y~fe&DY8d-R;b~N!A zqrjcM5JGj6_F?BRVUmi`W75g9b0~b6IzE#W#wGw;Sp8=~4shg&R63h9X|rl$=!-5^ zBuf@sz=GC;ePy!c9fiKK=J$zndXNGT!Cm75mD2+^>H9Jl|8RA{ji7;PxCtHf<~#6X z%A>Pm{L;AnhF*klWezx9-LynLt3Ye`$`myB%c(rl4_cZ-e>8{FYq^@QZ!TSi#wCC1 zE_^;%FZN!;zFNU%U%g0u`NYrZv$Xnzf{*VcTWGaJ%;)FmB)|tXG;P>Qo5a4Z9RB-> z2}#q9EB|o3MJyQ>`DtRGYMwi}G`?R*9&w4V**3HJ5|lYI2AA0K$R}%*i4-T@{aL#9 z?CB@{&~(K{X{S=?yl~ONIdIP<0n0fX=$J*NYC7nk1kcX z^+}dd_{r>Dk={I(h{6)N$y{R>o?j80+v*eJ-rA-o-2ErJ`cc;U|q1 zJr1&y=Y*LsC8SXEvT|tJE{HcwGS_{os0+Gc2MbOP(rb?lze)EOZO_y|*e=JUQvUhN+!t_mx=fqI$VaG)t+TuTf)G)9~NXMVeE}F73 zsV_(v*03DEwrDIvsHtJC$=(y=$E=LTR*~V&k1bq1{(4ed@K@3`q}HvS{rPe@-$gGu zAb74ygENP!&+{>Tie#rnFC?!?qw|8;4;}9EzPr)3*CvHAd_$p~zLx($c=k7_o znyNEA`|=;a2sgpiBk|ydt(T$7ZG#Lmkk*Zy+tS)M6BHW1NKfdKLoF@sB_6@sQpwLl zYpYJbt~Xd*ta#YJvgqL6bmWARsL75mc6}7E$ycZ8!drKl1(s|$f8oo0*z;g6N+XT+ z%p6!@x}S1AR`ADSq7h#B`mebs=gQdI;?Ev9yp$QLS+>-O`Qh&<-UQ$9SKeN7Of0SI za(7O&OOwMldoS4PVefp#wBNb&;szX$c~MI0*PROeG-cO#BWN1{-AO4GWjLHE9Ab=m z^5E&C?uuuow;!P#wi@wJw~ai$z5=H=s|wmH*1=s$k!Ai>5t1r%%=$8RQ|ise{2yKj zC-aSPMR4|;opu+U;4WxQ3@YM!t-0(7Y`CcEqSICwQlN4sQ##S`Il(X^t3PMcO)qaY z!)_$(p|_paXH91J_R*d33I*x-CXW(TVqi5@bn@m0@Wodw;wB}xO}HUeVFNLjXr;Pr$8)D8J&Hhq`5 zyG4i!K2#+{KyZG!6p6~#&)|Li2cIO2tc86I_7-_KXDP)9D0^i4Gk5{vqvNsvGpcCo z7@-RTaJ@?EwrhYiZ9~`}Nb_cdYLlfJJl!&eQwu(gb^l0>FiAq^B@a`D`8Uld!&J)E zB@t&}E;Tm|ierU^SE~K*k6%*qRqU(8=^{pP_^z2L!3|T$U8~M_Fom^s=FVr@4@(`BfK=B<5md>U7bk5Br z_Z`O=4Lq^8{4Ju$URR;>$X4bRGopzL@mfl1dv?&d;;JsDil#U)1`PE1S8mt7Rv(-n ze{4{#X;KolQz_KpU~ZYk#!Pn18^13gs|m>EzHlkt{uVxWxI~R(NjDc21PP48a(=om zRbp9)R!}601vlh5clQbF&?C;OhB`t}Jj!p=kD%q8StAS*0z}d$`2E1hG_)2oSKb)y zoJn_Zy^u}ONKip5Z>EktT~8Ij1i2y*C+N`Un!*YiF*Rb)A`UtX&cNEzS9n>zOAi`5 z4$VmZDMNei2l}0QwxBkBal&7Buoh2tZ2^TVaS<7oG94XdOU9)zG*~v2M_X(`wuGDA zxks^uxzc1L50NJqR|Hlw*-P&Wx@xUB*P;HMWMBdrkP>#%yvmm*oas=;yuv5wQF2&E zE!LQ@wtCvw`G{YBBP zQsr{T&9U@N)(g}IoOAfLuaofFMa8ioCIi!B0VjOC#OzrEUdqS$L3EKA`*o}-sUwCMs@aE=zc4{U~$P(G=%P5`jhP~cKvN46i$qYTR_c5BR87Db0r0koq zM_Ss#c#&|uMv~bLPU0;H(mEF*_PHMlKm$*GS?Z>zcWKE=7?-TBQdL0Z{NJ^xM~_V# zT1=hnYPZD^VbLbSWq=V3N?b*G2ljUWuWk192p-1<-+^vi3vO$FDK#rMZ-sNnL{Bo4#jpP&d%0l+O@n zy_;*WDmC?`XLi#y9GemVma75~7Xm^}`_IkA8f@7NkR<3cZ<6U>k|o%pXH}GX^3Jzt z^0HXuw3&1vQ;2iSo3}BntXF2cix2YwM;&$Cj~J?Bjz9p|IK&FV{@oTh`7(OB7x&IH zGxUVz6glv(erTe1XmQ&&wj-|B#mzURHQFG9YceJ`J_66#l zH~K8Di2ltCcy>hwDUaZ&MXTjA@kEr!G^T96ijlQo$--L&niMTVn+t_P^a6NFFO}69 z(R|lCX`EVRCk@rNcvxCl6B#}8fa%rCsU)-|LBD!P^y0Z7yU3*Zo)Yg#Q9ju%=gJZB zgB!Z^5dBfS`U32zvR{x`U{{4*G#YcxnS8%x#zE9g6rd#tiH0xe^R(Cp=m|cA4F< zP(tplG9bVNA)UNmBrxiTP3(d#J+oHlzugbok+x!F_j9^~{_J1sKM2=(R;l=9M%RTH zv(jq#b%q%Gp!Dm6X;cFWRDJOmdw`l2T$W{Y>MhG~`VY&S4bf6M(A@UFGc&<#LRfz@ z-)>>)l7*P6EANgksp`qYDq+)SpDzCMf?foxetm}3PHS+a<3V^!t3Lf>K~1j7Ht}oB z4Fo$St2}!pLrcAx&uwxiAWAH`s?yo0T{3Ohi8m66B=1Un(s$=l>ufez$4ve<`8>`f zvB?`2?l3(u0DYLOI>+oNFbTK!lZV++h>n#fg}HuTKBe8XL}sQtsj+P1S zo%*ADp^aVv<0DJA3*Juyh$~pf+1-3|s>z(16{d%k!T1il3nM5DwPVAVe4ic#abr#q zmLC6r+7zF@_(W%1jjl7NDGRieY;m0IpTH*dOmQSLDVh3PSl%abAT?v9JI$P2Ww$ec zJUXnkDN0I$=@417@e9BWoJqnCd8Lk1U0zESnw2D%@-vP1`Xu1;J(hG~ZA5$jTLx=t zzZj3cx#xr{x3L*gELTg-q&y6hT!-FI*w|tlV9WeRFs;0*$ZWY~;7zd9UHdO%0jpfX ze^bCJZ0G=3Rv&KR zmCP!GnneEI7tE-bHsCEwKX24FmNkPsYEpYizjur&>rY znn7UTV#A-a!ymKu*mWiAuRPkKqR*EOq}hwVbOu}&NuG!bf0nt&z869a^AF1M4_eq> z?68PA8|E5wm9az+P{b~%2k)61s!;uUXf`!RHU^4J^5fh{_#qcLxtO05y=w+0(FNYo z@;D|Tzj~6OYw+bWov3>CJWe+|3 z<=QWfDmy}EkD*!1Qa-~TCk1r}_xcBa*}C3vbVM5)ENxi2(~bKDBCkD_^)jf*4eAQ6SSWj3}2Pz_@ky{+W((I*yT9#TBuNvg713tvTi6 z?b^Gj^%x=X05czU&WR}g7QAYbUWL#8Ir~qAynxODM@!b8=gDWtdGfs_z;Q^I}Xiz>fO!#+2lyQ;UnWYRW7@ZNyfmS z${=uCJmMw?YWx6|XnS2%%XYzN1?0T|=Ul+>b&9T&kewQRMA( zG^O~br9+Ly&(5i)6>I50DYZE$#uh7zVK0eT3fvMJ? zD%NgkkS6;t!5prrdTAm%--sX~NvM}sh}a+?zkBP#p0xa$Ea>>j@Q+gBD}C(@qE-Q1 zqEZse*e-a?2#aRoVc$ZtL?f42fu*_E^$yB|`KF;&Wf&#qY8TD?vZ1f{{VLkpV_h85 z2$%M*iu?zlC4zv4X_%CLz0CJX!pDjXP$D%fDp_d~kV6y<3*}8yMN-S+B$LR%k;qea zxt_IlHYv8r?`!-eDZ;M5RUvnd(WIpi1f|bpQ(a6R>KiVu0KC^5ij2z1lQmXL7T-Y+ z6bN)dMj26Te65keewiYaubnphR^ul+OT|w$>c^SKBN_@v#c(Z>j-odoPfLWpGQ7#r zXy-EymlgJ(KFLz!VM~^U5trnKxecP~tu4f5ijU9$0*2t>@imE^-VNRZNjDhT15O&Z zQ9F{X)egBTha~e#%wEjf;TU@2g};!I4!C2<@;6;hm7#V2;IU#kqo zG@_B@OHNcndjzir;<$jJqnk(7MG?y{v{dW4g;=>)>+k@bzaGhY`YIv$g>a}or)+ta zysHI9z`>$TwI*hPO46FhJu^k4 zN{R~0OITOu*K9IgV-8b7TVZbyEw75_e?LxEC2!ZpV1-|6EnYc z5$F#`kyB5>aL-rYgfgdjXeNS3W&TTpZ6;4@SjylCfifOd1;u-A)((4(ei0uy$4f%h zjD!w^E#4F3Tjg*5%X#u7zQBum0QXAn}2 z39*(5n_pP|%azsOT$w{!A#v5m?s%@RRp_3X;! zSK{qs(m<5WhxBTu{gj5p{3|NblWX><&BH|836?2#1iHOrL9E^>U`-iYLBs&KW?)=o z*{#!Rp;GC2hRiP%1=@|edDA&nUMWL$)X?gW?IJJ9x<`$?H%Pe0efLisjvx231B-;N z0Fz6Eo=exUyG6}hFJaCm0$O3VNwFJSlS_H(_RGj+nC1M4wB-dB5Zk9)EZiIigtk5* zS3qqZL2vd`Ta(!pda9FZhJ+H~<6+a!xt>{M*ZPoJm`i&h+6Fa-HyU-0_!|2y)p;za zX%5B-?T|3U*TG4xrB{j$W&w}M8YsdHB#i%fy-uC|YfXat*js(~p*g!&k|50ObYU=X3t|3?Pa z&q5-+qV7C!Q_R+pY9Psb{x-{g;KEbXj`GWMNqkG(CienV&|>N{-DO&auxlY0*-KM@#y@p+? zm{LZk5^Yb37vQ&duM8_|hY3GSUBb_mNLfrAOEuQkH5SXsScMnyS~Qnlf$80W#=a9) zB=)IyI@#2{w5fnxAVh6!dPHzb-5+iBbsz|=F)P*Be0tf^)Af6ch4G{AWqWsQ`RkaP zz6sG35o;@jV?Hs!M2(u6`}^ZeI2#P&RZE_4NPTS6QuV^ol4(XJVD}c|xR+I~s>5SB zQgEmGyhdYkERcz5Sk1PKVA)%-($n_(9o0LJaT+gmdYG5~;iIF)heyfx+a84v3qN-V z?)3W)aJ51)XF8o%y{RSdd$*pb&m~QDznf?+(eNL2+<#@+^o1uI!fw(UW2s9wIUWcF zDC~uhq&E-m?6T_AV|QNv!WuDyZ>EVlV&2jlmB9yh{PX_|YS~ zhWGZ|m9U)BtP0ZQw67wjB1k_!n)Q&tR)X(c=`X-PUK%Tjg6_;!@2!Cy_8yPFtQ?fr z@YOfem$zv)G^W?F4QDG-8sY>ReLp2mmlU^zPDSLefED5Xf!F|N5l=LrBwSY5HW-4- zyzh%zvY3XWh<-w<&`$U2<^dG=`sde5X@HgV;S;4ojKX0G?kEwL{ z+xW+Y?l-@lzopm6NB)Hx+|Kw(pN!KxE^{8-c>d>t8OZL-MdG`Wbn~Ak9ksHLzZ-r0 z61~Dgs<2wey>xJDK3mol{0(*%cw~`A!oe8(@KZN|O8dNB(Hg98cnUA!%FUph}I zlAi2nnuDC(>X8`5jwr6zX0J05UO_j6jx!)E+|RB=^S#}06V zib2Iv!!qAn@iK+1rM3oC@T9E2b_*onp^K?1oVt^V^Gk51Q7?qp&%&3QkmojK48e_3lysLBnY52+aGesMOcuVI z%29$>sk_y8&8wOXP%)b1*M4K7`<3u34zstb!Ij1k^8!hj;I`j*MVth#_qR#P+%y2| z1jP8h2Ge}P%>Fb1c!3vW57~U;bBELG2!IEp)+<)S+!IMaq|``4x>otDeyJOJ-#>O; zF+Q{+*~m6a>B$izNbK!CD}nKW&Ak9R_IEG)lQP-- z<5xI?btlN>fR&3uB6b86iLEnrrIV{mmQpKIHeao-M?jjE$6EBkuOT^-E>z|O)*Cwo zvoF+jVy(fHp39vWQ%NSl#pM_6X-X)@I+36aaW##Z^2u*q5T~m zroiw@xLdcZyaiS?EKzxmu&`$$s{UA=!jgPoHYqlzeeo6w!xPIYO$D8RQP(ANQE+z9 z=u3`~bfQL@tU+CP!qK@~e~`2IxJQeKF~cd@PDtyMfX!bSmBQ_Od%ILq4K?fCMwL1+ zEU}62_A^GJu=tpyOmSQ~mq&vnEiFD|36`gOkHjt$13|Lv#tJ;8U0M!q$Zw>e46I=u zF-QCc$xatN!o98?LMf=PcUoUb;xpH#(E9KbqQ>l#3F(mU0iHtv;OVvZy~Xd9H31wu zmV!>p)`fca+|paLm}~aa^>+r^IW!g9)x~-h*ygB@weF1aw0(oCtp{K%vbs2;HPx1l z*=`j~m445$$s?1E3*ZY6yE$tI#C>==v!pIl`OTfV1PxE%H=VewcmrWcOyKtUcb-f#JlKWY}xoLq$x0_Qv;At6Jmxq*MTswSJ3S z%Oh%6CmcmYmg;gp$YjEy)UJxUgO6H`mW~-3rlWJ1V3+a`g$+ok>EBY+jlyMXuk0zE(T{4$ z47xm<{mnvl0Sv&eBhb7gX$F3Jsq#J<<)?~B_9<6D8 z8JOFxb6J5hr;}Is@A_%|umdNt9VziF;nNQ7Lv^PeYtf)XI{`_5psU$pqJHy11L7W7 z*X*HE8w4Qj@H~3E3g%nsSNDX#>Qv8nHoov~sXBX*KY#S;Ku1F6T6F{WFzJH0j8~`jQ% zE_1TpCV9`3?09ZTJQIQ5uk=!aGdD&X^eu8ssZa4OsZ75u^d$u- zv0z5qLNBW`b#CVM&H%al&K(M|&`Y8jP~O<@#bB9dDVnKSU$f6-fXibO38WWL0u`t@+s{HAe>v zaubGu!UJXJ+-J~RxUcRmXJ4E|AtHZkKxcMwTdSP^%FSVE;tSn0Y3k}r>;#ZhLU?7X z{~~QCXE$59A8v#8*=aw3ohukP$^c~??d{Nf*w^NI)dmC8um=>MwmO?;ZG01t$^m-? z1MK)sf=NOcnTEI6$j#$=VC!}4P)#PI4yZI8RP&s}9}??zDj zqR!8sMU#I^71%_=sF_(Qa(%CSdc>v$yD zq5dpbxYWP|Ae<5rfX)ev0f#U;y_b7jlIRmWHf^s8DpuZU@keawm^(?oDEKJPnecRTyFZ+w3jO5;fM~6G z{O)EdU*z(69Id#F_(VmuA@xHg1Lrb`3a9l(Iu6uYz`78?+`&{PoQB1!v^Vg$-v};z zR>LxNU!#+Ql+laqYiZ5=9Q`9wP+&Nyib}?2H!E;F-I>jH6LuHcXita0S>SHI6)YoDFV#K^!J+2Ms0O-LYKxQ~3sz+t_xq@=<=bYNbv#Vu;~#0&&Z z2`NzC-4jjrA5X|^vt#GitRw# z;GJw`XV(mW2WHE%-w39nRwW#RcR@3?6R$|Zs1i(sWW)5cQvTI(Qa^g$d+~7Ubn44- zjOfILbHf9A=<|<|s;7`@^9dmQ{qM8i7oOHX{a;Ug=w3nM?e@vrw)OQ-KhanD{y&W_ zJ)zxY{c}>^=C*VeJ`n7dqk#b>wwd1~>jcE)KFUrO@#}=I2Y68LpTIHZ{Y;cDVLyDJ^Bba5h$n zymwPr<-AIqJj4B#%1e7Qdh%~xZzk%lQ`%oz-dM!2Gj>|pdQzhWOQb(dN>_2jLusuu z4(@&!mCv#A!$ULntx4z9PKVqVNjv{~^&3@7M`zi&e5gYdEf`#U5wzUs${gU6@gE?a z*k49s5Ap$2{b1T+6RK2MpW)Mue~qFiA-aLdPH%6L!Pb18AgZ4WE~~rQLO=V7wl-)Z zg4HG9CK`!xeqy*londn!xk%M+KTg60M%I}b1WKAvv(pRb7Nt*vSyxB+Oxkq_<7IFh zlF>{MAE{@y5ug^EC8B54?~1jcJ8LbyDL_f4%>>-8&pi(Bx%U_+MK&l?6q@Bk^@~uc z5#AFsTkNyf;0L*@mzk#k(YKz`5mba|itgkEKk{Q2VF|vl8^ysM=Lc*oF6sbJHHxEJ zI2cUXC;%WiOR0?qeSH1vhH!Exjcx8{ODix$V5~tYGU0r{h7YhF< zW^B}$jTpTm#*m+U2D?=%$s=LPWfjVhJYtm2_V@ zPuMK9xsf?5^31kn;+?!dFti@E6Y*Ffc1+1!pHWCV`{Ko9)R|%I{it&eKLCVYtw=x; zcq($hwROA9S#ZBx;rq{24Ktr(11-{_JxkH(!fHy@9y3DM^pNEk@0YJ?fH|&`-{7l# zXgbF8P}1b4Zufp z5j3X~HBXgBtN)wSRQczL&M?N-8wr379ff zU~pmT!e`sqhKFUV>8lD73Kc$R1I+1!G`P!YLkue`=Z{-RUM7ufP|M#W#>4)+QBo)l zd$B?nq#hfBB^{dR>1ZZ)EtpW>+>rGp`760^Ty$@#E!X6}leM$ddriTfB;qZfS{$>f<4JJHj>7TM1Vt1{ZoRmp7}r8qno6Xu??Qqo~BpNKmR)mn=T% z`nCp^7Qwqx`QCUcb@knlsrXlE!fT16Be+C6b71TmFn0CdFjtDjbY^@ZFN$`&ybRQH zfyG|qR*2B|zmhjBQM#-4=QznnvC*l4r`?hH1=p8mHee#+>(sQEVd)jC5v<0wt}-0q z;j*J0O}Gjj;NWdtX0^H9>5dMsGHYn=qg^tZUNkob@=-HWe{A^ld(Qxp%uoyS5MAV> z@g< zwpY`)pNT>^fxi0~*vYW-LVQNW90ugto@?CB|IV?F6G_7?3|FxK5EY%9J>aKf`;sjb z75Eje5KI`gKt3+xZf836%S7x8hdKRjQ^!7+9jA0wbF3ogcYMDw#4{cByh6ewD!UB+ zrI8jmuS7Vmrm7W6xubX}B-B4Gtz#YSrg)60a0D{l-~*d1!ftY(lMOmDbb2dKGK?&v zU@2DoC2Hr)-BmNxSV!+IHbzk#W|)aPMSOWD%%N=CRq9u3RYYrE@jCFhBq}Ud2ypim ziVak}WZa+e*e+P3F*|DXw*no51(2rWCgBF+Ts@BUzXz2V;nMXK7wK$Qb~{jrD<==~ z%G$%2Tmsujr48AmnmM?x)FR3V@GO|alJnU<0O-NPB8kyVGfR(8>pxyqa&?aL<_hXS zm+8e>YjS-;;p=LuYl5rF5|Mn|J*m81@}Fh5+~)yTu5N=#(3j6j8iMWXETJ?=84y~E zRc}ckvcdAY$NOC2SiDmMOFN~VLCN&hLq7uDW9FN%!M-x~_j0+hQYX1T(ut4n5@cob zI&^F8v>fJQA8434**tQgN8F@gt0tkU&Mk%Jy~s&xe#iFRBJa|ZPY5}5GR((XV}@E> zZ!u_(;x@w2K@Kzt)Ot6GJt#vU8wD>DxA%y?ugzS>yWB zOO}W3qsf2~rjeL`H?D35$5qu?8w8PSoHzKfei2?zAgVG+uHb`J!bQlWz_8uMUnl7hToym(@CZVA*h^4PL{%!c2aV9 zi+~!G>7te00e{($)c*W8b?`vv*PmP85i0Qqx0)(BdkCzgGP!wl@jaz!w$w zi8 zF>c%?CcOf6Ls~-NvGHO@KoC|+rd)B>?u}Bdvtd`}eTu`W7PuQ2fO z-!Iej|NUUPlg8Usm$&%HzC!fbw5V|F)~(4GCa0*P@1~hs+(!(zhk17n^{ys0`JHly zFVCp}BH9JA9@PCr{~6!(1~Rllx#|3%YpQ~K8@_~<6)U1e;ibH6JH{B*T;er`^d)xt zw+nkGL~|SaIITk91s463*3xYk+vi~VO{tFqdhic@W88cbyv3k{JlE%j__X#Ky)8FV z183;DGZ#O)qc-j*!7Y^EA#4t$*J!UXBD?=78wkNA?5RJfc}``nVc16g!^4mSlsJ-I zLx#bP0*e*E`uWBRMy-7~!guMQ!ZwcmPcc6eg49fr(9%!bi~DA)7wc4ehbOP_!cyR{ zOzCxGz9ErW#sGs=ceJsp@C76G&S=ehd}l)u7*p9r#lr7GVyCRm8smjMYx#av0M;A4 z+4y(-C21*H(jzQvOjA%dt#8AR+bRzB+)c-2Kr18;{PjW0klNb#xYS8fEyurRStI$n zNtWhf$s25gma7!77K~jhSsPfHm%l0c(MEEBMX4VQ*B)$+>8bo1nKov;98g0YGBzQ*j>`KTTk8ipr^yVB!6r3l8R1o(U6`0dZ{r=C8&IQE{dKCm)9 z`}cfmx!~H3^LHbudb?_`Z}!GyI2nh;In;3kJn?0>y+}tgx;2uj6!=LsfiAPAHX8zg zxaN241`0UQ6JYqW-nE3BeAO2yt%J$4^*fi>1K01koZ2^Si`=qVUh-%f*G+%wSl-v~ z&MP$*9X~^9Zs>inlwL>;?FdC>T@PLr39gN(t%Y9HKhLf{P|P##dP2Mkm8_l?)C~dX z+v?Dh1E@NuG^r-`Wg4n5urEz6B_T!bhK{G6xatGD^$#@o>dFMm&#tm!qzt`l)2CKE zk(R;^WF99uI<90?6929Ne)WC+w*$*o*YQG-IhhA2=vynE{F~~R7F^l`*jV~I_u`(W zrQ!{GO+$9uvrZ!BkPWcUG2ZE+;^8FA*nF6eK}J=UiS8o)F^RR!QW{3IjjwC zgHhd%P7TGNjriYdnz7Vm;~|ec`|wGZ_~iy)W!mGcTi=(3^4npoEfEe5S&m-yrsB1) z`UxE|iVaG*aqk&7PMw1Bxq%4gfZP)!4zUp8$u&Ba%(-0kd^=z^z2-gjt(#0pI&(*9 ziX8*5?p^d4*7iDcaw7~+7(ND)?P1j|1(_p2T!fHMfsP(hO)VoPSOKHr5ogQ-L79CZ z-8p3Cm9HUqCyD<=`%+2CFc%MjtWPXo`}y(x!!OXfm?P}6YgUp?9e~fyH%N9YG2$7# z-lwn$eRcTPq?zAMR_@^@v$1fjkLsLS!~5FRvNX`S#&PNE8Ypk5tQAxE0C#Kyp39me zx#L|Z2MvR&r=SZnUt|0C%<*5wXpG(<>vh>3Sj=?*o)#{1@Y#_sOHiU4!C6n;3hJ;$`bi)?0zRL!(+rQe_r z`>X_)vbNlkE}Eq_#mH5l07p!wCaWkS&DeftD=0Q&5xOtg#Awh=sIKsDs}r^8t*B=Z z`4G?YO7SDVWFzsXyMq*!A?p`#>a>;7uN_@JvL7mvSII;$DSWb4@Rq)uE?7*F69}&| zk>SrH4SE;A8fFG@46kKAw#$!Jdo-8tC%sVkN)!ikf~gl5M7`YtX*WLcVWqrNmm95L z%rKv8J~#9>pHJWq7`Q$&5Q!Klcpt{g` zDm_?|=*l(^1YXoF3=cOPc0hVlC9Dg@m?}5@mc3Jx3=SNsp)iux$G8Q(ryZg1Kz$yJ z01$JgVRKJD=6;gFV>`8gR_wk3k)35t?x83|QlMJT>W#~NMG#@BJhD9eewI4;z@aej zC4|3UsRm!|LQ3KNQDEApZ7#lX?39?0y61%ug857iMK#eldGQXeaPHMqK0+o5qT2El zX_m&-yA@4bmH2hsTZvRH&2lO24Hz18m989C}`L>VctD!yRDWqa7!rI$3KCVM*sp})i`=iaM!J?D13}gl$2(` z>Gq~(Z+mg(Ey@23^AX=ieNuHU=MWjG-r?Fnkj2e5pl(F)(4 zd7coiRKk3*Y3C(7XExcsnwm&k_ItK&<4;S4xr<&w3yAuRKd+{u!{9J+@D#Ak8i{Z( z%++S}^1~b`{12cwO`Wt;^3zA|@iq<(e0rzIlbJIC2==!b$?nlQQncG6p0Rz4U}EuW z=pVOZ#Cxa63~1~8Z|6*p2x+mGCAE~=Ec?`N5^o?ckZ9NH@WKfqPs9wDoc3HY*>KD`t5qwU*1o~wTCW0FyCc0s{9$wO$CzD-uQxd;}SIxk)TqmM>iwL?@030wn&Irz3WG2&%TgbFtW3d*_)C`yFHX zYC8rpp1Ri_byQ_n`hIw12}|W&9}Yt=;95z|4%%&6R6I|i&L22ft188mD0pF)^dk=# zS`MhsON3?MT^T6<+V7tF@y262dZsnL0&B5^RE%{ro%OkeMq^~5NORG?N`SQWjI1dP z$v;%)Fz9f&JhqcOh4Zkxm%Ag_@Fslei1AGU#R<&;0=T_1BA{Bm#L^ETx0Hl~OV;a1 z`D_*S_3c#d81r}IsWx43#1^a=bi`CDDDN=7I3*d8eVsGz7I!j>qs>Ww%YaHXE9!5- z+RYnIO^SmVT;A_Algx_Eot|<~(Ke~WXi^J&t;v%ddXR75es z|8vR)8a*Qx*e=_WDhVa}?Yo=OSCv|?V5w8AKkV=E4n5%41FlT_Yken>8mEUdB%>D% zHTYaRxAP>}+9^eJV#cB&QO=rx1_qgR9VulTozMog3}KcMPU(c#K5Vk`3XW|^=1da;HrDMO zVVK_)r4Qt;C42%v?q?YwxWoZ07bAv&3$_wfX4I|TBHp7r;@;a2d}wm?6L_#zyZ2#!M6VXaS{4Y$nR$~5&a!5D+?*aY?(*-Pc&nAo0+~*7+3hR zilNG7gHBi@CKJ@aJo!@6m(Yuu!9c&VRC4*=xO%to7r*WZDsm}?ej&q4G{K-!&P z`c(&y!-^|8t@6LCKbd}pEUDV_&&+-dI{DjfvKjDf2|j2422(?5Qqqi`9_>w*Jghq; zH|J^%-Q^IHeqjO|&6uZFsP(Grw8fAc7UXq_n0t$$&Q)n}#VJ3k2OgGtNwZk;Y>k5( z2QnPMiws%kwWPg-F<-M(|8jlzZ~U`=&tBR6e4LqZxp&pgd+Y9-_0K;jyMWsQ4;6Ov zzEj*%F@Jg$-6@Xm$FH+!@QDOVPul}Z9J@`k-F!VzKLBC^jx^MC*I<0{D zvgGPS8JUVXKffN=Gk6o&kS%Tvm2~FfXJV=7f5001BJKQE*|jgfi#-N%qV8jT|61O) zbm@I%y|^J=U6dnEF~kHet~h&zp>KuUjUaNG>{Qs{+4x|YU%GVq#+F}QQ!NNuum6Z# zV^U7t>(Jek9UNU4s6-Q(v%Wx&gB#=EHdd=-yKm$_M$OGVqVt8- zzl>9AqMaQ7+^3E(w>xytE|^M>mDF#qoSvlRU)D4?FY24lf|~$dqi`^8IHxMTAuJc> zG5?o|OrX((q9EH@Zu$IR25>p{j#j|{gjVcrSH7xhe%R96$Cc%^$a3rq=%MV=Ih005 zsJf(3JQsmelKW8QnHd@;XI|g)S;o4;(xlmi-FDGa!qC<#Pu{ic{>-q)vhT9V{lkkw zfBQzJm;P0+(YDaJIWA7)AxiYW74ld$0Agq|FupLVl*7{;nG9<60(L{9l&Gia1kEd_ zJ9cd~v){SXBrG}E(N^^+#i=`pYQC;lI;8=+qBQl$_rN;z;%_Nq{1X+O8*b`p*V6~Y z=eFc^*U}j@Xsr)ELPNujVoMEFQLMZu5tZ=}zv8U0GXUVb`mp9Djfkcfzh0X7#djhU z7@o5J25aEz_=!y(uE#40Ohj~`X^lksS`peF6;k+5(%)o@gqmz|7^2YOx+*e7x;GOdJm~p-831(LB zEVWjl&@s?h)RdP~o-#G#AP1=k@0Q9&X8Ys+NXUDPHT_1(jy({?JmknpuQDK*FvtjG zTb&_adz9#wY5$_=RT?Vr$?NcazTRkGH^Qu^9@GF|8U4e{G{!M<*FW?A(ZOf(vcBw< zXTIuIDTk~<9X)6Lk}1xCQ?v_E@cOzaLDS}C5EI$TUcvlx8<25od8y-2u@!J+3o~WY z*tEVIUsnq^Xf@m&9?<4`Uy$s8jY5fySJ4_xIBJ7eh3rQe!ajejUtCILx6zd%9?7=; znJHNC)D1F(eH~pWatyJkwUV>*Q8~I>SA3`GX~)*N%tnt>QAY^($2C8HRq4>=9=G6;*D#P4)3c|ShADYkxhVT z(6OdmaMg)Q`af5?(YNe>;M4g8LHbmV>lh+to81OY5oqgt!+-Q_R?^fRRdlZpCn6xi zkL34g(5KRIlEn^qW;dQD;(mzT>M72WKD`ntRTa9UjmrZkPoqdKUM5(juKPnj=O|u>5 zll>Mbo`8iRyK*EP2|;%AbY=EOVJpfA=Kewrfa=F1W`v|rZp(fCFB)Q-MQKF;^!O)5 z8i1_^k*daF0D?K)NhxcAGECjoc!MN&r1_^x^-98$6*u+hKn&K9p^a?W6J_*>CbkkC ze!pG8uZ97dM@~~)(B0n7vencRgxEO`Pdl1I|oCgW8p{$rHAH z>~Pj0kMNTE`71=v(yT=R#o-Sj5kcS;MZJ;7sa<>2(KdP*Iqwu|-OXTz(~UtT@tr?+ z1$&*MrPm%GEJqCr^L$+{%wTElv6Gk;prXHf@2LeJi8D){3{h9QceCQ6;FNCQ*ZXTr zs*q}{M~5N5v$|kZY9My^IH#YHT$9qiO=p(W)GUT_@=~c;PLYL-s=6|zsou;k2p;SH z?3?%N4E+{uYA}c8^HdJc0WEZ{PNo1*u-UH8Wm&bi{qT z#WT}LKtfnd{+<47eOw6ys&oumrrocsQi-l@&mh#5XHfcsp@32c!CP;E)4}g>zQ|sO z_v`vVCa-op+8N#$*RK8wbBVS#$1n+6L5dW@#Jo^7z@YyU#KCD=vtkRhRmn9#45;5& z)GXyx(5TzYc^to&B^pT6DbUF^Po3velQ#^P5hiZWXVQ4DP6_b$drqg=C_TOe3JY~P zOWnFp8Xywn?!W-Yz(ot>sf$yZl2T&&Li6;sE&oU|G?~P*AIx;ag*a$9du|f{pwn?X zri^qm@B^pch_2t3-6JU@MUh6O%BOdwHgoY7mWW9&+g)47l;oN_j`e(@x^v|sW2xW7 zeOPn?;FConMN!-fG^#Y&cvZaP?BB)z*1qdLTRyjIGF_ZHPp?6W=J{m~PzT}k5~5w< zdsICbXSbfgSX_e@mwu&|tflKlJwSyLLa=i`?^r%41lLnOYYMK4Cp)FTpo4 zah08&h6ZnW{EH-ut`qHqAvd2pr4h}f2yKxs>3Jk_vzy@;^^k^!+iWE1l+=U>u*dUo z!`cv@nS*bVY=rCE2THxPO{xqRd}RWFb5l3cg_m* z=dZnQ@xBd2Mk+kZ^cxYw9ao6l2~Wt6f4}UekKbUd%tF#6P$nU(VJTR%UNwfba+c>b zk3}2AE*>#*@+R0YbPlQkNo<2%L(z1csycIMStA1M6obWE>_Cf$h0HwK=9`;}(%p&* zC7YR#&P+j1FZTi7sCP?MEESXtcQ}I4T|Cq+>HKx`3bGevh=) zxQR*O#r4SL(f$K6xO=!`IC2&tA%}kueG?{yqNTh>bT*v4DJov3CEm2+K#Om$RxHyx zbJ!F7pBoIiKMIl0)b&U~Q~$>e^MsI2B=SnKE#+-x836RRh6B}m`ZJL&6v37B<_2XM z`0tT=DHmSTwrtjXeTwvQfp-}qlA~*Yh?z-&eO*>AamtpPH z;^Z;2o@mG8=vDcO4(CJP!aPP12JWk~Z2GkkhXE*^uQet}d(CtdJxr^!XK(|j_ zU__^Co0DI_r_-0JVumy#EB&VEL9vvg>Mi@lP7e4YDzGV&(P@kmKUCTr+wohTTqy8b z&TPc^uGK8xXfK?#K~w$TsSmO29HLpZ&fg^vRww!XshFEYZek@1M zS9f3IyjRz3zx;T!_+>tclae!ByZj#@eyP9j%ad5i zll(bndGuQL8K1MKozjTvS{Jd5ST@7KgWPMGFGwC&JRbvNZ`MRg0Kcc>s*0xx)~d7} z9wJ5tk`2JTY)3@4y=VRi4A z40aejTZqL)5OOjd;mubM>`jxdpnpdJS{DAUOWudlw%NDX|&A3N?XZD;Qv;crteR70>fZ@B4F9R&iAbpPN+fACxcRxU_p znGpQd(gu2Uzb#%44<>BUdgitlrYjQ1H18ZcL(kx0etNz|n zy5@lJxEKn{ZGIDeKNas|W;n6+c4(P#1fBsUa$ zr)o1o*l0%C+;Evxq>TwF-)%5!GE7gopJh_cyWo%z7zIjn`#3ApjxOmGvqH|ftOBLQ z0dB6Y8M(t>vJ1UpFFio-Q(bS(GL6nHDlj5vjykI?^cj1S0|M9c`pA zyCvB~3HGJrCMY>nydbZqpK-L2BeY5&8!zQ`UcD;vmP~K|*6Q-lk0pE%G#LO?s!iB8 z8x7D%bX=D+tMKHQ;{!|p7EM{?Xi*^CjS^}WuOM>0zZ24(;xCR4o5ZJ+q6dw0cVyA8 zc}^k?g@mn0S09s>B+>PLHU^)gIE-1PW#kIlAYPy$MaVis-`Bl%$%-Q_IcU90E^cAY zwf=E;90TLF9hCVH$|UVu-Wk%*8XOAbUF&O(yBLw~eD^sb<1 zfwgFMB-`A_c`+8cDI&$n>9fvkZ!1{7^zRWHui?MV`q>b14ly`%<#K?S@!#qF`Gvr- zfEFFswwVRF;Yw~GaUjG{Qoj+p;cIkwjaR1p;|N(MXP`RvK0Q^uTC;GshCk6xVcEnB zeaIwMQHhX8N%&c{p~U1B9eav2>%535UR8|_ODOgvUPwJLJzCIyC|5jaeou{E%rVD0 zKu%q5E|_2ikTxpY78B%&RCH&|gUOwmx5Beb$cgvp18kOtH8fwK7%w(0!#VhzQ$fRt z0LoB;<7|f0;H<*28&>R!ckpPS{_f47cb#QF+jZu7gC~J!5HRm!?W~n7z1P4(L-0o| zRwSIrKNB~c-56CV)I3fGgVD4u7WF5V9!oZxlbN}GY@m@$^%LVeeh0Zx=$Zk8)7CUE zHZD6hj9$WXmw|Ge;B)N+BvpE+&7&y|=nqa8vxXjf1OuQ0Fm!$zl*MKD)H=dYEpN4P z#Hx?2IU|pR>y~-hkZr`yPcREB6vM;p$&ONHj%(h=IrqcqSA)&hQ?6@a5_!k0RfqiN zfT2t8oM_99{T2+89#Sx^(7ZsC$KZ-IdYk&*!G*Poe4ItaUdT9=1-neLu8CSL-eu=T zNmUzuiupej*2p4qsEn?lz2z$^>W!WrHgaF*el*2VOvl7)eMoR-OBk`B-Pk4JPwa|_$x^Gj zz=}vPOCoi!ZnuV0y)@btKUkfCos!r|`*HAN4KbKwrZp6k2XtP0P8_(bH27T!_?aRji^_5e|LFBh+%V&sBsbr^$Pj4#K@mIrG5G zMue7+?qTx8z!m@drC0!>=8<0ZHZ_hOVm>5j6lmB&JW3ySuolgIoMFj4V^$Hl*kELt zB@9(bfD5=LTOn>7$su^eChQD?ada&N{Be}8$bduGy|jFkExHXqe#uStIa6r?0zij_ zeQ6SFKZA;hKdfc5()tXujcW^Zg_U8<@qVH=ppREEr6?c}D!|HX=(7w^xnWE9ypCHq zjn?%ClONYF)jO58kQ35i9f*SSWK1qtU>;1;`m+{w@A9x)wu8f5gkHOGVFn-~iWjTp zA9$k^HAM?hoB$MmvA8&B<{;Nqm>J?m3ERyC)$cPk7>2MtB7 zGQH^%4SDfk?a2Yyc1k7q+Z%RsIenf3`3lDR80)V$ zJvQj|wg*6#ElPOwaGzcAfB2fy3L0J0Ej9Q;d)9fdPR*7? zEP318JiRyQ^aHV)Qi*r?@spAAeUakUKDxo=!>ciFTax5bggFW2OeKgR2($}GO*8uL z&P?}*CjGGye9{_B(RE@DsfA_6IMCTB_g~ezx@U-ulTO9k!RQ^e=B~xIXQ{R+c*&=3 z_Rd_n7>hq=Z<^!PpE%_$FscX|ak6}c2dS+q0XyAlqj7NksaDX}LnlTT+b`~1Lq+}%ZT zC-{?JF%O*KAm(FY=NCHQHy!o1Ml1pr!XCxMyGt1o0QQZHn*rMw3$u0Bo7YKM13HVx zFt>$~ifS(_e}LcmOnFDht76`4iiA?BPYVe9V7mQ6@h);g3(ie6qXP1$@g5mM+y_jG z`M1Q8JH|h>+|tY2rm3N+u-wonaaTZGX^xia><2yBE5aRQ;iok#wdOr3;dtf82n?@4 zFff!h3Os2MB~)xxgoF;8vI&f7Gev(BS^XAbUpaB7J`Mt#HgFzj1;-6;uZ0mn41%+K zCii;k$cN2b1J=ECQ0FBOfjrb((*ngswX3^E(e_Jo#zlcdccJ_HX^XknxrJnX((Y^r4)lp#>E`!hpfCRJsSmAo_QSjYruEwj;Y1c|Pz<7aU6jVyj3C&8jSKr{Z_<1xj=5Nqnx25t%74Xr)>IRA zaz?_$NBz?nawI(_0u3;>$#=pnB5Q5hF0D8|rBtI{OUav3Ipgt+^b%&$sQ`}{12H~q z9)aBX8XYRwf#u$2-@6iKfK+WGU`)Uv*c2G!twhl9&RON-U< zbsyRlQYX1K14-ca zX1tGOxqxt?gITg^gH>0iFfvW%Yh_#WqtjSF`|nn*RJw{8;_3v17&h(wxGqhO{R1US zb0v&#E1j;dAn6C~VuXS>PPGHTj1MbnDugTx6?(y4^4T}KZ7L{Jjci~8&TP`c@J^pvW zQRGiZS}HKdQiOYi6aWGCiNmb?*6Rtg!QW}rTQos_Vt_2Gwx^>f6G>QPUY%QuGx>{m zQir*%J&MySNWe@qTPw?uriL9|ZSXp|{>ZMryvATwYDDiG7XC=_Xy-|_C)xkL2?5Z; zoL;VtHPI3b)YVL*N&3&(z53jo3TSZ#rkn;|L_1ElX{K0V`>N7GNUkswFeeZ_Rt*q02T_~6(>zoQ-xHQ z@YdH-T3|TXW#eDw73}C2wE{|xyh~~;a5!~JAjA8=UIXzs3cpy0>x(%1(vard=^UM} zWemL$&sXSG3-kGxed*&RCmiU}yfj{)9IH=;eP(uY|8Y!%+(2MMGzj|3<`D~13+|lO zFOVzUiUN;Uk-ks|NwA`A&)uL1YcWGuo0#U59LLlKiyKlVwW}nw2fo&9<79Xdy!g|}VcaLgW0}^!_-N4-H8;(KM`%$?|K}|t z>u6Sds&XT61P-isj1a-41E~Y`#j8XGwJsymx-9*E*E|?8b`sY zR(EwwPq7=*N@v?}{_!1UP1#nYjrpkuf=qHf-FvE%^d1m#yR^y%jHNMLY6dEk^yVD^-X|fO*`4u(m)xWvjn)V6yU@Q zQJDL<*muMDmAR-Wt8s-r)d!MZI(5sM9%$p`BG1W!5W7qdkXv$|w*U#{2- z-NaKhnYjZ$Sfe3N=Fc7pov6tt9-p>Ctt1BpKHPg_%_f1tK)4)Ge2>OuqeY^@4-zTR z0RwCCJs^Mws+;`LSF=ZG6?1=KexdD+&Af0ZTJ`if-yKhg8*u$a+i~|8ZI+A$@v4;URFk=f)|k5p2|^;!puVR`&YX3 zDo#~e5W$i^@({!V^`>2L&D%{RsefVkBD^5IO7A6&^epD_@s=^ZHU44#wsuRI{r%_= zHO*p+>YM1*DyGOqS>E?@JIDY-e_FnMk;=A-Z-A&0fubt|=2vWo76i&CS*4k9Y z=aMiF_Wc%vFzOEMkf5@yG;i7TkV$#%HuNpDkxR_%e*nfD^1!_sJXBCqzqihBvmiHA z9}MI#Tn3EOG4uBbzVAHz^u@xvI`c*(COOW0i*L_hA$asBHc!fCI9aQOHMaZWsfmBR zqi+>oBhXb9K$DOi3GsN5mudX$FUhP=1`{epg<4gjoumCW@OLMS{pQZktm=OKi06DC zU@9qStfon%DrdEW^uI0lcu(aHITfFH=@+5Mi|dvbi6~u<3SB&7mL;338n<>Tbzls4 z!`0uw`RpGG4JK*?v`wH{5`_Vr69?CvvAi4EeMh028;-KIHIYNpFyj`+G<==)ss1gL z8Cl`SogcIPnpMtzHg63+v{E^wucW8i&eb`vWTV^1)h&_H{!4FH>`aKXh=L?Q?#!{b zVwR@vDiKg_E5PV0nh)5rXLX<)Ekg$Bmv0gC3@og&VqZMGoT#_*fxh1_d% z5`pTL5>C|w6~M}WB$O>Fhl9D=lra|_io8XQ)_i@*2=f5 z>ItQIf}pxZ#-LAWQgm%FAj=^)@pJBs=~eE{;R#p*kaqFcqoeg;ku#qD+E0d70M>Jd zw7eE;cgr-czT33wCzKYadl3uP9W*@JBHiFthzs{A$6x!fHeSIE z8&}7_O#1xRB9w{&m|V`z_b6mMYq0PAI`jVk3m~I5{z5AZV!L1owH^X1;i`WTg7I!n z>BTx89I6 zjWh@q&H!}`1EkrVUUWReux7W!Vc*M+9-2zOj_i59mof1}>uZ%JFBWd#FFF($i3k%q zCo=$}a7MSGf-fR>Z`vzLzqZqxcG^wQSY{ii1)PU@^8r9JU2JcdZ$0=&61bC{CQ69@ zA3&gg=3PYa9sHcQPfH}3S@9N-W z9=1o52F6Q!^M8OHN+IXJOwS2%dM-FpO++oVKa>B?&*%qL>J)6dz8qS$Yd;(RffFu< z@gg^hls=;nCGZN2@3of+$|5sN{laCwCFMstkirVXAq zFjy2dlt0IpUqi3T6~Vw#J($FwVGs>9+`Vpn?Qy@7Y1MDBwHGWjW}F-<4_?i`ezI3p zjopOk6n6Z4y)G!rF_$iNWE1--=MisN8;XC4wM!?7Se18SiJY<`b=W+q^#WqREVjCQ zoi183nEE%E1b}~}B7-PT=3l#Kr8CRku$SKLs4dMbk~1|BVI?vEOvYWeu!QA|{G&h& zziC_w-gXy<3;lU&C-llfr-$;Rd?rsf&t=H}09L;roPGHlPkFA&X^4GlME(9We(L9i z>&S%Y_4rnuca))k<^RK?QX#L$|CKoT@$co+sVZ7o6!az>%%R>o!Wl%%uPeVhu!%K@o|qa9uUAE1@Mo2NvyVUVZSr6D*_P1_khg4~=w z1t{JkNxJ3qp0B*<kkCD8VKgnj)n5Nl3ebNnORUOggAxhlw(%fUQI5a z*Nn`5d7ahGqbe|~{+afKK!b(w24kDl-wIeyutVOVxxv#H3r^{tHaJUP`GZ(Dn4hqF z6l^+ADXZGVzjI^pf$557ITeP}gfIIn)clF7y7eqGp><-Hl`7cvOG(=!o49g(I0HyP z$oQ4OX#KM$G@#O}2Fa)n8cGJ|Lsoxg!4nwyXA z%I(OA8K^?WWE;L=*cR+2_-%u;rA;#z7xWx{qHGPnshps#C(A*X6_fkq+E7h;b>;{_ zWQ&bS+P;}3bxF;CN_V>5zOc&HQ<;pzAb@2p+?=Z$?{&!9O7=-e!&|5H-TNK$eO2Zt z-?nIMdZmw&Z2RWN5{Z*Sj65ehkN<~c97RZP_b%6;we2$kSzS{g91UuPvV2H`4qmw> zns*2l&K=X)+Lmo=h=`AUNaHFt;?T@VbGb)4@{5q=?#Pao$S!J|y4Rr}{)~{osn?aA zcofHQkj|CvkKt66k`)$bQ{E?huSFWVKo$Qadwa)b<4ciwNxVO+UO3kUebZ@3-}Q_k z)hfx|$6UN+d=Hv3^C70n847fg;Px1sjynv1VSJ+(3#|_<0LuJP7v`J1F!Nk&EEZz? zUqv^2m#U+JUA5s9*@6Va@jH=Q0XMuNP{&3fW2~-BP5#fvHA_p%I+uxdiM~gNPu-V> zJ}9O;`fS8u6iZatMIJR(c_?N%3z0upkY*DksS50%RPJwOgL%ypsZC+Uf*rhOtBn_% z&aYQwsU1!5iPnp7RR7exNnfg>*;O-MS9~No-VxG z(5$OZ^yR8Uj#-KJK+AT4mdSg$N>`ZyzTO#jRK=2fOv&P~`i)e<;b~y!&q4U-I$wX8 z`ns9dQhbk6>%+vwbA?nrld-rP0;0))+{C;kr=uq8A*DZXYQr=>n8K%^k?Ef!+4f3O zmMz%Nb!OvtKIOg|Pny_Topu5e%t{hiLa}KTnv6+zR&JF+$4bi37@{$ zF0Dj*JxF=_+VbDQ-8k10(0OilY>-R+TM6CZycbgLMkH7rlIob+ByINsR}m{_Q*O0W zw6xGoV`qrcl3J{8Vo#R46gA|q`k-wKL+9Cy1BiV0Wo>W3^o|?#*%A;|mbJG2-okq8 z)?St425=~B<9dp2D~>+FEI~0H#p-m$>D0CiB9KQ_owO3tl0tP;dj>~0>pk;jY#Tcx zu4#YmTR@6BxFa7aHN)0KkyZOocmio{#_G@wT-d}0wCrc{_hhSHx&R{_cF*uwSEISP z92uT(CDMZE4oA8V*J)-5rfH8Pw=mpWURqh}`OsKjg-%(wl{9`bY`FGujEE>kFB=ka zjd<$YwteX8(E3mOJ#^E9p?Cy5LKzG=N?Rh0Gkx7@xar8rRa0veTR)sUH-bnuz{j&B zEEsG|7f3LB^ic?u6~FxJZwI-X9Acz-bJAeeBr$8TGLY4JoOd*z4nmS=Pxxpy`>yo{ z#07ndvV!Iaqj1sRwfFA*E9aq{XQ_(mV9C%U-;bykA!rc)&h;0Y8;;NLm^s}rKkw^` zZ>8LPaDDCaf|3}${LGlVKsH>llOs>kSVe5G9np!PSdS(7KcE`2dKYx>qIF|;;%1b( zy}IMN?Zpx-9l&UfrtPV`wl1MNbx)d4Sy*1z9faAy&Id-@Bu7!)#*`bwlZ+C9!)5M_o z($#Vkf|B?BHhy+0qxR_O0aS2^3WJck=hDZUCPe`9HaLjvkkmiA0%7Ufc`tm(>Cy?O zZ-s`IM?YWwo%@ojm^Q1b+IQhS)vW8L?4k)-A0^CNP~wGG-b(|zDwV|gD3n}kCZ~cJ zur3dw-n;Mf&I@0v6)G54g5(ro(=Ct~C=w35e&d&8$l{floyGyaaC3kBER>Z8Z%Rjj zo0E;p4XtODCyvs-VWgGXi*xI0MjvdCEim8B^ds*{Ev6#O3=@(&!VzWOKiL1%BXH$s zmr^%>_mOl9VO336HKVng65fdHT8Uh1%4E*AS`Oe%!F!-&0Ep+@PZgaWT5I6o`3DXL zJUzoC3=YX=qG(nJ6|-8kg-Q-S}$)m7EaMZRk#47nih>Z#s; zqRCnBa3Im;st-m$cg<3L_~c%qM4C7-`&tq^)V-!3R8!i1FM0#<3UACd(vo{5BX?8m z-I1@K=cDOuE#v2U)3v^SMe1I_)LS_vL1F_Eb!JPe>E+;4=-~Yt?fa7D_Y+8hR#RH z+pT~tFJw-!RB6}RKbn@y0*m6ad+~)rD``703;tViQn|rhSNU6$xDbywkEVglary^_ z>&f)G{AufnD^&{~<>s@Gmk{jA+Qo@`f}@I0eU~yv;K7Uo9R*r>W1m4DIfio!%{A?4 zOO&aYAf_M1HAcDLg@&!QCi1^XA z(^V1?MmWf@qxcm$T?-9mdv#l3Y1;s3!Pr8)k>9FHWbPuLQEt^Qa|PFq!z-~&oz+jW zONzJ2?&cqd!&t<$t)sKe@PTIn!S0$DeMGx5V+q29O|GfblPV&KiCd(UF~Foiesfw+ zI?H@xUKR!0eG`CIZNStU@O27R@Vl(GwzTxDIs__uPwbu|FLd6I{r*Q+=Mcb6cWe6h zb&s68U#^5Qc^aRdSgunJUxO4tD+Q_k^fd3^-FM$94>}tUC_08`?@#}Kc9F?^y|(+? z<;A~#9wmgwt#HeK;g)}UKdk=A`4PyI`E(&~onNi>n7Oy8J|(8%;_m`hs==3>HQD^c zve2`~d0vVE8OL4r9wldvu{=H$ef*zdW^ZRmla2Eml8@BVG6x}`9PF0+#F{ZmiL0Qi zN|gJ(ce@<%(qGIZ$$>9)SkhZsk7|9Km>@qq(C0C667k$yc}D?!3=GZ^B| zqQ=$r`2xm^OD;F_Ly8?|QM!@84J8*cy_YfQ9BaIA%39jqbx~+uwEDH>n@moA7Vo3X zaF=|l+gjNSLV;y<829uBKX)l%hdh{Mo^qt<4(<0s*zNVae`)%V;UaW@34Rg~U;y6S7~Z9{1!$CKC^gK=TwGbIrY;0gHG7DKb($r4}s?S8?V zvre&H)!n{Fd{fm!7XH%2+`3PPA)gIcLbFrSrY~0x@F_SmaB$(kO;lB}ol{%=r45aC zDIY<4{~PPHq3Sf@i&g&gQq6QKGwUu-n*E|9M(oJeCP4i}24<>w8&~cgZ&La78@;j9W1@M60xEes zlB^PL$k$?0=94a-Rz5YcT8x_!uTKAUmq`U~Xw9L5f27#PXZ(27GZxsT?(JP$Jcc-b zEK0jj^sx@>@9nn&O|bSZzGGCNz??^#ND|*(WqdnzWgbqW-RvRRSl(p1tamFl(xQJ5 ztJ^s|?z6Ud5&!vtluKmy5fgK7^MH?nUv)c%PTyRF_ zv}VI}?8|$w)50S0ennkFlCFF1uetA^x#2a8gNhzp96FPG-#$N+D5yprY8Lg(Z}u0l zWX}cj`@Q7XY5l3tXSGiJ;@Z7bjfSIbRh`o!u`|Xd9!yl|)$&JgP_iNYWglg|X+#4( zJQR>qe;X#jj`P#tbiF0CRj_9MYoFWV0!kbb3pxqsHNWV3?c6;T3N^QiK?fAZDImy^rkZi&O#DM2qpLU3 zHcD3DnV<3)i|KvHc?`6Z6~Q!HVf`-Inwo?w-?nTc@!|?pO5#~^re|%MX^bn>>$Cqh zoYxflBFB2|CCI55yMLYSV<^a5hNVRpIh?^dU8154&1ia|SP0b(4^@uCUS1EyW1P(u zwsw^26Er|Pf_z=68i!)KIW?V8dac^N4)ICElY%LRm|>!fh81tlnXegeiU)1)qKGpzhbhteU_=iyiRC3kgnrFp z)yZc2Q&6sj59{wu8+g*_>bjj@cT82rQgDdOS$CwdRe+q4zq>%N-kOk_yE@?ams`#* zb7Z4RdRMCd1Gzv(zpTmaBp%TNOE)*Tn4WN;*!3M9G>HgyHDWrsd}LJ!vZ%wtzNeUc zs>~Fz$Wk+&n?MzctaU)BY(R$OU;fwt+DXLYsnvcR4Aj9%Celi?AN<6`kp@ZQ9nK zDl4ZB7Fuv2g{OqaTIwff2+OdrA&3Sxf*^0a`{N1f z`J!HFiKk2rI*%zazT#xsAV9=o>%QfR*)FLiL5t>Y7ZBA^MqqiwbGShoDI*fJj4~I> zGQ%&PwOL9u>4j$^K_YAc@nRw?*l}7W0t8!~ z`LLb@V(A}%bdwAkRdjNUAwgR5*MO7S-!7!3Iq;;L5%OQ1B zwIU#ucE{}Th8u&pB$9eaP{7=25)2YnWJr%I8RK};TI2ce?Gc2u z695o*z2tbCK#_Zi`pz^-GR*^t3my1q%gUugD8V~o3zcQa9N~fFWOXbV5J3fj_L0bt zcRSdD7=c=tf#3x#F24ay+Xr~Jgi;bg|{os8@O0ob6-HxAE zl~pPV#0lDLB1Bjnzz3PdZF*vLY9cogBnaM4#6)=l4e&cf2xgmiD&0{h-5N>_q{{UMo2pfV71H5m+`JdPJ zZe8%Ecc-?`;uMX{l+v6P4Zi^-Vao)Gh&!-A2LyZdp!9NdR!OuC$rCYi&gOn*F^>C9 zOsi3S)QALwsB;o{-*~^i)!RB!7MiV9s-=R*QfE|_HIhFCJOou~6d?)<&kIIgXv}f| zhkgd0oP|;@LJ<-*NU)Q6GkM}RxyCWUXE0zIfB<)pB)6T#_%qHujsAd6&FNYVAzSea zsLr3PvDZs}wAS5krh*!MBdK)lRRY@LL0h#bUapc^t75ENhK)TefsNmR$y2Mywlh*50LYYb>g;ol|XqGQhn}V)LNobL$Nf8Ho zoO&~>_@(%EwqIef)%Tl0E#jhh>EoeYLqRN(OFL|h0ZExdI}iru9=YpC-lgg4;+to3 z;fw$cRhi~vnc_cOQKzH&y-G&1`et*aps{m8paDkb;r+f}M+HY&NncF`WerRflywRv zf~KBSni)~XL!^ksT}U|u6ZG{U^)L{?GLXQD1Q0>*$6d!US^FR9{{VmQAC^oQto@Jl{{X*63}5N}`yc21pKgp8q3A#J{eAi{ zV#D9_`se=uAD2c9C0*^&6urgmR=UzPaZ6B_eK~ZEY3aimDy3RES}HXNM2wYgt4}JS z4Drgzf*h$!(-o=IqQ^?sMyAKWVHkFWQ$oEO!+JGRptSrf4E;CyW5TC=MdI1rn?9ME zf+{+VF@L&AR}Dl<1q}ky)W=R~9Z)2{@-I&eO!6J^?{5yZf(^%TB#=Bokp~`#J7IEy=b$uAeJsf= zb7}i|auvKMlv75GLULXrz=4B+Fu;ZDAh8s*6#xUMK`W?OPUp`50A456DH3S3%LqUi zk*EW69tfK@ytvoWB5$a&KD=Dg}j1~EKrgeZx zv&CQsD$Kjkpw$maOFC2hRO_mza5WN=k<@V`ri{S@Mxz2S-5ON$IfSICRpB0}6zX)I zqo`7}>Q^AGG-x`RL1>*I&B&di?d7tX2y5Pwo(j73clnyTTsG;eOO(X*@zOm?S69q7 zypT-szy{Dk13g;$6*?-E>awENt*Do&NKkr&5e-#ov#naJKqXz30FCiq>osb-H88H! zXvVdrS*tBG1{RxDRBBX&l@5ya36iGKhdgu!pA<^cQOQbV3bM^bYnLsU=pmbgr6W zMwDu5L8fj?YP$CWF@Rg81r@#-Af}R9Se0Xl)7QrpLWOqP&b4k0MMLe!>>6n%Rt3=K zC#d!7EhQ+W)CEzdv^+_TLCG%WBePL?629~DnMSP3QIQ?BF%>8hjoJy))Q4>`s(%n5 zNV87C3f4^&UoqhZtVrT$qJmwC;v;@1im};UY1f|)o=`{w8;cQ~-hVRFQVZ1x090sQ zQbwi~oQCPz)X25LGGyz$JJZqC3x%d$Y^nOrW|EYsODqNfcLoL24&-4F zG}sA|CJjArvs5ZGJs_w{9Ylx`{3BpQ#{8al!c$f7_p7O^C;eYNeGSuMy~3tjWK+<~ zQ%Zm2SdSyR$h=6=7$q*myoWeF%zC%p6_=>#R1Hm0kTM2aBD%0$N_HSYo_83JOYG%Z z5aJyaogKh-kt}3PFrCbc*kM7T)B3X8X-KY6MwNEpE)l~((u-AKr)b`)C!$_yCaCj= zG;GAgWtmalHq23(aY3Z0bv;p_m7>~6E(&i?P>|X|AW0HNC7g{#aSAlB2`#uRAx^7E z7PDGF2MQg!(=hov?rwKhVZIW+j zmOu-mc&sE5?p`8aB9X$X`HUKxoUl^Usbm9iH;doe1bD`eEa^=_cp$4>f&n67paLXb zOi2dE0+fqfDrTh~DoC;)`ISOeHkKl}m6Q+wVYp-8BRCoAAXYUUHagGZ48Ra8QtMh;m>8ly=hl1U@tCgT49Ogq(Pq*$GAsY)u5+P5(h zS(q^_NH+|&0IlNp02>eiEFk+~pZ6=pqg2f$9A|Xp5?LDsl}`n7Kn;u>bAUm?$>|jhM%4`}#G8Zlh>8A(YvZ6m z0jvQrZvuW&B-`}!j+=s7H0?9jU8>@S7!$-YyDVs=9Jcm;2?y8IFe4c}bc$Jd)ZfB2 z7HyXQ0Gr42++5?eE3GI@{H9`i)1&6rj9g}w=zMcr4>#l874I*x8OMDd<25ql}fnA;@kyXLmvEVv}$su~5 zPtdBcQtd{Z?f@wy@x@DS)pkuoPflHy*CfkosV<~3Ej%n%Qb8LF9AttA zu50W1HBRqQuAILsDbqYAvE|-^t&c zX)^w(YakLFSh)rmawTT)N1eQljfUtQo@JUh-htE19VJ;#<&q{`qXjL1MnY!?0~u-Z z%!JuQfItdJU~UK^-@W-Z7`9B>R9RE14;xr}foR-sFgeCi-Aw4pKw-DS3IHxyPnm&1 zyYX|8kO%;tdO%r_RPrJ%FhDX5wt#)O!fKh5szhpmWdQAIAQ1KQJ$UA^a zh=U*qw~hY*y^$XEQMFZuHjR*MkeI@SR*Cc+1 zw5gRXr~<910V^7$8vt(tPXhCY;c)LhrPp=$NNtaC?cZsC;@aI|r~5&suC=r}PS<^` zr-F)m?6fpER}3Zxk8J?cKUS2*eg^54MHYE zI8b9`hyV*?(Y+(kGQOIWnW<9DXSzb2Oykp2RhD%GxIL;#f&eT#n(>1rt5elYRMn=k zSi~h|Y3Hb$D$1eN%YtRy832Ql*&}Zt6H3)x+fgO~w3GCcxje_|=Ni1WS5PV`hbG!p zWB`4l4BO?+hCLzvhOdu`+t#R?;itG7qO$Q#a;K7`w)OXxnQCFEqKm}1SXyeSUF2C5 zneB>O#bj5H7{DHb_A}Sr>mN+a)n^12%Qa0vf}nLNl4e1%OOuZy{{R#I#;#i~J$omX zS_N1P{VHlS6*fxh6aWY!DiI<`G7a(RkxoD(kU$`xQV;e%$2@iF81UR>(SsGygBYB7 zbC0(idVYSN>yC^Vu*L@~_Q)Cb`}+M)<;O-0Tw^C6Q=IzejN|RmgBUmAAy@*+Kwt(` zk@$}%k?W6gIx)zf(m%iN<&PfUq=(_&>)MX{>)Oghku4gIu-~lJRS6uG6_(486*p;O zSmIQ3CDG=Nqr&_J<5$Zw4!oD`o=&Aa^=iZ5%&OD}O!klkO(G1#!jtli&OO8IK60LK z)3WqI9Zav`x`_cwvFYD}Y1{%t!S=)4_*c8nckI4^s;gFpQ$W-W0onv#D$J?jl_f+i z8H^u)P@@}q^AHPE0QLaPnqZ9}5?~JvJMK-zw)Xt2ebj;9rBQs>Z)B@NU5WoqY79|ZzGJeG4hsuRb1r`l2!GJ zj0shy;RqjzQIxVGzL=z%No$$g5`847&Z%uWMK`9b1GQRZ)r8Wdq$|~A1e%T+Rcru| zaII*%nz}1>JTD!z$qY)Z5ohI?D01+XD*PPyszGJi8B`vxeLpo?oiS=4pa86y1%Q%M zW`Jil)kR;mbW$w!hONRHitx8;@w6@U_3Nhck5O1SB&JYf{nlFG$mN_xq~ zEli^%JJWcL5CnqG%5uO2ILnK)voZPIV5Wr-&FTCjxh6l4^QnC7sH$1qMU=Ct-xj0UDj` z&+XJo{-TT7QO>p@nJI~4VSoUW+D^oa3+gzq%ldnKbm{&Q>J;9qLZ}1~%^w(1Eu@`B z&<_X}r_>dRZmaQOr?_1hmu?NmQcb9ZOcVSO6ZgP}EgM z?6#$*H3ZYMURpyFIJ%&(MM$kpP!QcTq{YECNIDv!(pi`dOQb5T!r0v#)LQbvLvD1I zNFtGCnxUA7XseoN_emW)hub2eg2b^Uswlr8fwg6rC*1aSYmIfGyfKF&l3rVl!5!E=w-Z4!H^pYMb{#JBx1w zT6b7=O+C}aBC%z8B&V3pWhPCf$ylO0vlAm9+CC4PX#*g1D%O_NSTiz`To6D9;ZwMY zxd6@vdTpmhmH}D<5J!T{2IIi-ZZNUgbp#WMB(IJNmD;!r14<)}h+<@v42b|fppEUG zPd!*stVv^4QN#eZmI|^A76N2j=61B=4QeqO7}K5iA&C|RMT{Sjw0Ob7+oSY#@S@UF z(@~1K{81Tl(h}{z#_yxK6B>ORceE%MAMgux}KZy8t^iI2cLjPOYg^LbrbV@nexl>pssv|iY=qSWf5n*ymLO9vxd>Q#{%jo|ypumm^lNuq0# zx(F*wpR$T?3Pa+o4VP~ja{ib*N`P63Az6-kuN5jjVv#nVJYI2DNqE{OCTf&3nzxfc-+g7 z6Lv5`>h~);pwGl_%N_s(1tn|@Si#ycll1|qW&rIb#;$Kv1NSo->Se??nYY zb%<3_GjbrG8_nVXy@10nnic>Sz2XJ$W4QkSLG#0Vxl~>|gK>uCf45vGp{S{+rqbFz zktLF@=~GhT3Mp!-qEj_O)Jd?%OsZId8L+#LPi5%qRA;2Zkt@-oJ@pF_rK%0!{!tbL z7QDq)b2LFH8Ds)o$?c>C$OnVunE*}X;r!?yfr{!)1F1XZ@h^S<0D-$nqphOj2A8na z!9CvjRFH*ROC&{Opnnt!Ib&V&#UXNB1uS-6pXs$LJXUoIgHfieI{*Z*V78DuV&jRm zv0kO>YJ@EvRau|{z<|V&+@#%<%#S;OF%{j@x?goBtcD9_k&m^SQsR-%r7bmf+Nw&q zbn7&~s_xY_mlTSo;FV~F#ljNQ(>~>fR|rp5EkkicD5VxYU|5zjH=T?``Nd1s)Wp;* z?`=ShAPX&)z)6elEOx;Xo^4;Fswu9p-(b0{6Nw|BxI&ebwaE!B;ma0XUN>(dhTIA; zEDtz?UTLk0!LXiVkaq@PdyB>%qUF1RDnYRl2#W|j+~13xu>HGr+WjB#6Qa{tX(}r1 z53H@#QPSUS7Ri}yt8i7^(??3=G*C&AD)>@HPy)Pwy+r^ztI{SzLm@KCR!j3F%REu# zx3*+>n=7;pq}JxLl^j#HdKoCZ&2%pN|S<-J4 zjyPke($z3Mws~u`b;*2w@Bru}kcVP~&Z2%V1i%JG{{U=8f>?mEWRgIO zNaEI!^8R>OAjI)T!_1EuX7c4XF#XU59GvX~K1^hs^w7NRB^ z4Y$XmWtUcxLAIG7NZVH{U7p;Zo=l)kZ0pi*PorefcMA1exsAA z>E5B8$ktM|GMSpx7&HP6H!HCDf4&drANqfY{J#GHm-PB`D-iKVA657DAAisJ{rWIs z=R9NU&mUv=^#1^Ej2NMu4u3p@pY!$m{{T*m7_cO6&(z~TPC5H1_x_)L6Cca#$M^jt zg9-kq?v{kntg-4HMMZCy)4^#~l;OYQTmU&e6^o@4^(d4cWR%I=K<6 zC@zksDCY4RlA35@nw~J(#6(BtiZsDgAh^$74_@z3JZoBtVOr{>22yTrZ2%j7VYWV= z^vh62RU)5FlxL8PGa#Yb^+o*t0J&$ZounT=^tln=k%p4 zjTAsMnzdxJQ+5q)1a~#H0tk}=#@=P?Uv6`mA|3roqRUC5nqX-VhFBW`U_={nhAr`h z+%13Ey z>Ew0M4MQxng)#U*n~56%b8<|W##z4GdatR2RdY3h8ybc5wLvi<1bl;d-^LhR9p$f@ z>qk+3uho@Qej`0$qq)fqScXP2Oz}w|0Jvf@=Ow_#H)Qo+ne^U)W6()69j?B>3_YYi62 zWUZsGsQJ6KvZVxa&p};E5IV_8{gkhaasTifqQ8XrydY~?4_m&{dGQZ-Pj`hZxH$kPlaZMP#rQ znuR8o(9^P#A+C=NJ-$ueP$UfkkWT#Z)>l1|T%ZLQnkK@ecCG#rV3lJqCdYZlqWWK~ z)XtIB(p_v(Kn5b^e9e!arX8)fQde4Kq`1>om!fFatHxPGw9-V&n35+(DIl3x6?oXF z#yxY@UZIki>#UwKWQ%sIqQ6RG!k_eG8Xu?t4trD~kEHh9? z8cMAsl@mpR>l!Ms3kYEmCnSPckHkh-s6L}WW!R~t5I1pW1{qaEh)_Tz$s$MZjSr<) zY|Rl;m0dwwLeo~AEJ+}iVhcdpz+MNmS$sjk`mSn(rFwRzjxzMZ8JU#G$nMZ9Z2@Im z7h}L|5I{V2iO;s0(Mgb?0g+Xt0${R}0vHYBoNe;di)FP`N{Z|lRO%>8t+kLpA-EIs zlfEJ!yjR)UM>0F3NLe6MDnL|Ww19n7u6LslWXZ|LR+$Dh6c><4iePZovE-~=gT2AV zQ`J{MaFM;q2Ez8S0(KtT#~5aMhOHV`aKm$lb^&$(!MVa?18@UqQ|K}{>tpHZsn+{I z+6mGKAjR+Cac?o^-mg?s)J$9mncUdzdtcAK5X-&C=5DJ5a=27>XO92?8+JKjNdWre zlk~@>@p8_p3q*HBPS)alNR74_&1#h`0_Ma>=JD@nB=NU1&v~t*sg@e6^+Ls`wESx{ zRPr{~y4R@P4Liq>uDif3jHysF(kik}y2LFSJ;WPpYY?Oz;kf1_9bH5fOT9rGd?S+_ zAEb*+4c@Ql?d>T z{-2rGoL6hH{{Sf%>CiR}d+{?O(nc%&R*KQexL{amI*P2!3DO4VQ5TaW`y6_=`0LkQ zqV4y?S7r6az3f(m?;mV?EfQY)gVa=o;jk?`-j*kBTU1zGe zGF2V^NW56sdoQHtJs9MvQ_oWwdNs6E&Nf<_SIjcdW}0dxbPCdSHmTCm!GeXyi05+t zxcSV_{W_}Du1ls^XI<#fMXCVS8BvIOawD*U%2q_qJV1Vszl(ia@!8(`PVd|_uAb2p zwrv%qG#;GN8b;o>+a0S+X?kg(rKh2RSjq(TH8nL$46a2w6sFu!OEq`eZ?qnl>J?~G z^q)_EP4w)IC!>_0?3Hsh73y^!u41YpEn0`QR0Yz2S|zc6=$?n_84RwB_G|CC+Qd}M zW?xcME*3P>rb`q>GGy-{k!Zs;(RzO4B+c{2sD-VAGb*&PTj4To63h6KFB5{{cO+n) z#EwoQFx_^hMzsqhf#i_{+<+p+Z7@zWR5I*}z=SMs8_3?kfqq4Zh}&#TFTqXLg3YG; zhjXN`Qqb8R=S5~)D6npmDJ1xgd%j2J+_iWlQaCVi+oJ#N)1taq|>@to~`Yd13k*P zg?Q;)vz4TRagftWSR}<*r~?i-3)O9W+tsK-EFyvdB+E}5&XMn9ykh!>Mxs)Rkggb5 z*xQl>nVxNJ{9!rKzduDvZ5NQuO#cA1r!r0RFcl<$6o`a{kT(kC1sNIVJylkbD^?1z zFl3b`EC>)JMUDKNUgZ&~lwd$*1Tu>lGBpB4?{hG3VTBcBT4ZWkWLV))sF0vx;o)#k zCGz33ovc)@N2WTea1<4%0YTYh5jNEZWr_EKBzxlUYO@~W7ueo7{p}uRZH`H39oRA` zV$5U*aND?G1?TV|P7fshT{Oy60ws*k8-r*Tyl@5Y?=K^2olqcdEKejK0yi7awhR75t;lwlYjD{qy#1&W};?*}7s$Qc0S9CV7NKmspwa835{adENt!l_dLmXZlPh?%)q z+7Hvmj4C#~tu-`mSW|>}$RsgFV}jD)hTVb2(gDdB;AO7>NCfj1n_uV+pb_%J(4d$A z9hxj##qT!QNIQ$;MdIHbT@B8HSc4?g(k|i&bz}vBQU>HuIaR?V7Re;!NXoHF>v6aQ z&ca}cx9JDZ7=@pw)XUUanNk4~Z@7s(c$2>PLOWQ}TlE#@0;-b`@ig(bl31QYB|KG8 zDDsv~(Z?YAXlumgp_2irI+lb%THHu^yX?nwZX?Grz+jim3#qh%C|MC>*K zAQNc^ej{nL+jD`4Y38S_I5~|$W3-S}NGw2Hd2oMyMhPC6>K$D`GR(-dd;41AH{R!* zYkdl@{_ctr0+Vppfv|(mGB+N?;C|03lT^!4sxodEdvm81*W-Em>N?C@fI2h=aDEcew(8YewGZ{{TZTcAvRl1{yZe zS5f2K`*&Skr0RFb9sX7q6&Cz*Sz=mgks|~FguvVfUqyX_&z$F?Q9{7A0n_s#VmXrv zRt2r>G4LPwyXhm-KG^2!D(Ou6CSXAA4n~@u(pgC-l74uWk(_$|SsCNlo_)vp{kq)$ z0Ds(L%kffB`JP zZy;PnXrHez9b77}q6x@Wk3x$mTxSv2kS z>#w%=ll9fI>a88_oR%x&{Itx*dO3XCDk+`fP{1%o^7Y|4KUws@wB2{f=bpA^i#Oh= zW&;C{!`#0;~VG}Jw)O|9Q44z;h$>uVpYGf)1ABHNT zj-6E5snk_wZHo)x0q=)u?$(+bgo6Sj81hB~FSgNVz z18(@pkx|tSneR8I3kpFvwQu;H-iQowt*SRjPV-tx@Uca@1YvmU>H4 znro*}4NFwjF;O6a1sn^(5JIy+d~<7iWEq>^=xCz5HC#(-=}nI(2DEMa^Y z#CuRgi@+p-OGvOeiDlOAYC_8})~85vPs9gki)jMWIB@_AL$v8w1ejEXWs-sfD>0Mc znLcpx;BA3pjaSB=5;u~-a-m!^FZhN5BpiMqa1T;eq1iw+9VEAK5=0q+Y5Ie|u4ef@P z-8Qw?RZ`DiTQRp%m!3!2mB#&0i|uC%D9-W_^krB3RrO-unyAAq#{LdGL}MCZg8#de~) zMStz@Y*{o`gVU5Z3H5%gj+Ug}F0RFrp2upQnN~<7xJ(SQ&*J#05Fj#wRLRPEsI5`5 zSpiQg>G^tZTRWT3{X?k2P@wA*QmL1y<%v}g2)-zNU(+j~`_^x(p7jd)MGU=~l3LEm z&VglJAW50$318^m_zbD|tM01nUgKFVbov_8RSn|j^Ayz-^Ir{ASaIrR!t%XD+_6oux{eYRl5n^=iQk)Y$f_v76K&mXb+PCg&ba_R6hqM99>u zTgo+s z7NOFbilbHwj*8S4%A2*)eNCv0^IP=;&0a)wlR&Xm($#|tMyd*#-)X%kC+XQ1&R5J* z`}St36f&l@I+eks-8!bV6(rH7ssmFjCFaL`Nc%PFx$jiX9K9U9agocSDa^GKPL)=w zq0w^nNCu-V)}#Os*xb%M_h~!r$5T>O+v+UTY?j(sDg|()*&JRYY!s!~6C|v}XO+g% zNWj7JFIUc`DgyMINH3~E0#2Pal4te@++)+dHz`%>xeHKiKM+jK(--ey zq=Vp)542p~F{;SrNort_2x6he$CzOj0K`u=zbcNuvB%l2=UvjE^7`b~8pBm&(=>vD$m@EFZVHphx{zW)v`NO(Bb8tiQ-M*) z3g~1b0zuUrACZahF!}x(t-5<%P|0c2m9s}{YM+;y!FJypY1^E!EkU+Y%Q^BxF8=@> zV#ri;x-o;aQ9e$SJ0@L^OHorspoF1NfZZi#ohsUi)A>m;7}ku%T(DQnEWVlQQz5#P z_BAx9y8s}Wyg|MskKv=UI=0Q+sIBzY$<~T8DyA|5(X0kR{{S*r1G*w|q4Tvt+{Xv5 zdIcQU{Y>Pj(S0C>si+uQVXo(S1lSP(0w)pv(&ln!(f;`PnrvCLq%^T`Bq1C(Bt*yn z3EFP$bdPJGj$rHrB~n62P<%Dpx-x*HgTN;M00|#|MXartCaRJGm}QuqA_-Cf2WcV% z`(w{NJ=ZikC01E`LA*)T3|b9{FmLY|O}mp*^AyrxQnvbe3yE0+m{|(220*)$X%B!y zEBUZ<@#s8TI%{GRYz^ zQqh$Gl!sEe3x&yJ=D;kc)0`3OvB_2xppmGZAcAhZ1Nz$0HYeN6y=H-SDlH;G@&Uc3 zB>w<$Y$SBn;~mYbYMi>o42%kkrq7onwFmJ?DoVfv$RvgI%>L+XQ%mK*12J5>S?YJBfT<4>X1opXi_w%s%hS5Xr(BY z3tFJAm6t43qlZ@t6oep#4h4ddq$rR9l5mXYr_#;QG?y^N9SX8JCJKY`VtNJr&B?cedLuv{mreNAk6FbmG{q5*Lx4IOLg& zoryAp13hfAp0AUlu~BLua0%)Jl58OY+$_z`;tja-_xmU6jZxa0W#2=cC0)y?l2nk; zCLoa{uQ87=zY)I)`WsGnBK2_WKCX(hNZo#Fu8&LWYFX{KD>0g2@>}TZDdU}MVWxRi zVQ{Mc8QND0Pf@dZtfMxpy--EYhLLUISWkE)0$l_AxoenZDK{XA1Q-` zrq}S#uHKi#ufAzJ4U)YoDdrk>db{PyLlz^R7|=%oQ&lu=8F&-)2J@ce@`5LBRH0nl|-oG2x%q(z5M>H+$b)E27VXMkV`h}+KB;M&-jl-z?50D%lbu-fqk2Jz;1=K&(YQ5$(<5(L_L z1en7T3lwY}qw!$p*lrj-bF55)6p?V(8f2TmFbsGnd+mqPmX?CVjsXK{m?vW+$FTWO zr-~_xGO}+_8QMY|6#oDa8CBeQ+_)zm{WQl_$@i1=@$a!5+~Pv4T1Wy&`tbsG++Ht( zEugA`gqBw;hAhPxG1-y79$+%SI3qaZla9Eu37w2=Vtm?o8-DYGB=2a57C&B3w8zNF z!P%$~$R^GnT6|}XjxZ5qXT}}aovf+AQrYx4mq|b>)&$&K5G3wN-c6$8$i!;I6ktGr zcIHpzfv_G<^I^Uk`a~?c`mUNcjta>g;o6J?O-Um^5<=r_j7xZV1e8#Wgcbv#K+xQbsqIiBt?W;08nBk(CEHBozla$v&NCGiUIsuEljl%t*huAE%Nd z9{EWF(wLCcRLn=jux@>)^&D^NXa4|)qg+)~Tl>YL9#?88VAI#g;&GjmvPnwsyyH8D z!HjXVka5?s{{V$~s*O&q8mkJRi z5)Z4SjWnjFqP{|9hC2<;YI>ljEF*?QGf|MI{$dux7>Fzn3U(4lrW%N=Qifz}RYqlS zNF<9Ery%#Kxmb`%iCLeSb2J#z8Jv@V?&(eF6D4)`Dpk0eZ+$g60^l%=Fi(XEr>C@P zsuF48x6#(d^ii5o1z_X-3NwVKMacy7j}==}B-0dWpk@3m6^SK} zTQb0Wbxd@XPrxMH3}~{{!yu?t`mV)XiiFY96<4E{S)CM&nyy5bHsoR3_>4k;@_q)D zUJy)}BO`Ifamn)IBomx;5?BuBHZBSYU}E6%MbB?L5ymEpW4OZ0LTGad6LSVYU?Th- zy@IN$rjnhh{#~VFgcypsSB;JdA-LO&vk(YV!5HZYTA=|tWzLcr2xwqzP2_>p1v2Lb-2r9w@D=xs1@e^PHxdz_NzgPCU<*IFW8(LCH0$0^KMJkp8o;)&0*$T0` z6fE2}Gm(wJ4y%u*R?O0?MQJ)MTCk2LDS;|vz)~RmRs(JJx~J;de7$-#YE~5u8UQ-V z>Z(jKh$mQJ&<&?zA#g_1{{RBoCc2WAE4>9Q_8Ua9*Z!`Cjb=KQ;U3vHU20ugrbU*d zE+GjV4H}4)xGmO?(tgR&=~Jg&)MRqx)D)FVHg>Xte;%QiI-Vf_R3K>*3C3sEe%e+_ zm457iXEPyb_3DwQBSns%!9a8Z7G=pUgz6w0g$l#0JDu>|e_NFno~fTn)jV@b)ci_KBwrpg|E=4aOc(i)xhc*QNVw+ z-R|r+ee?y}L0<3F8h)Ev>6-mNc(Lk6ikde|;8|JsaB>+u42&__4N| z(yP<;N(l65gs2DN<&7~-sjvVvsR;`(MxG{48b+M$W~!;2Q(LrNuer-4tyM{Bq|;Tl z=xe4xHZ?^}Y&3Bg-OrpeW8c}j!RMuFOViBPG7U5o>I!b+2v&9gK_C)6r-Ct|%VaYI zk<%2)gWhzhP-b+gH?^b@AE`1Q@Tc2dXWJCk8sh%|XrqH!Y7t9n{a%%n^Nle;ij3CT z3KtJsA{fO}DOR;n7HyNWb`0V#k9?hAGz!1;qZERUz&oQ7Z! zgaXpU?pTY-m@yGEJK<@&cAHUm7g^I@^_Ak^Z;G0nB`u~JSE`Ifo#@fcE3A?-FcK;< z;ok$(qMFpC<&9BLPNKCJw4MsVn;9_?HpY^kNTo2&mjnPQ5EVw`F){H-n7E5t_an0cOwVb!Y6 zy+n4UM1)3p1Unej+CiBxutbh$b+aauEjkov>85G*DyuW96}lh>2B8o@1nv&;GyRs< zbb89cPpIi>Q6;xk)mh-Ki5eH4+`d+wL5=7g4x32S^f3%GdK$YGsjhy^i_kK@>qkv(!aILF>IbsQsP%T}FpNXDV#7}?pI>?mX$$4J>FBq81uDp5*( ze&_r97q07ey{^}DJnna5c~}3VRy*edDH@SUMQfqrx=*)?rs%^0t#`Uk4a)BF`~&Jt z?+S6NTVICLlype!_1yRk9Fcm1!D?ofIsXhPPlX7s0$<8eHAzI~&yvNGP06*Dlh$T@ ztrsGwwULr|>N^AAG6Y_~hUS%1SCFUU4*519_g~7Ou}FP)BYFdbNT}miG1GG zjq_Qh^O3#96k2RZniWx}m8PZxO7x0ZQqcoWic$hBobb{PehssAZQA_Vj> z=>{eLuy$$VvKt(%Ir(6p(tP;u-=O$m+4Mj=I73Orp~=>PRY7% zQ|$G`f$zjihQD-C4U4fFG!UW6K*LwTkKVcAD^t&<6iaW?GwWl@TOv<|1kqCHBgZ?` z(LWk3%KDF0uje&_O+au;8a_b92>L}vYmaly`18A}Y`)q;qb#tja zP<|&{0FXXo6JYMJ+V4hS${I`3JKp8kVm`~ za$J8o{Jlph{C4+KiFaw9EG?K~dKm>mlZUDTCKNkjN$X_4(#A}$ZVt19nKEq|LV@KR zyKkM;CV|2r5YXQ3 zkYv5=q>t76l(QaggNk;74GHXaeSP+Ic!^h=Zlpi6DZNr9UD_5tY0~}s3?v_%YB%yO z`-aX4Ej;}@O@S$p;cE*TI;ENObTJ@vi#Oqp(Hj>4Z$mqPvSR)lv0YMNJnQran;js? z(~x~zI?YNzA)Fg=!)V5g!z^l%@yaWVMJkyuU9(8)&iGIDAEQJ2m1sXV0WABIsiB{% zS{n-ynfA2`xhf&k?mzk6nZS&+1%7X-P!M4{(jePY341c*d8)a!@%CHFZ3hGk{fNk9 z=6QdS>fsPe{!<2`dfW((r0x9r6QiWQ{!Ztgb}3x_;$p+80$yc}%gPPsk6|A_)a1U? zeuj_4pj5pDHaEV;tfR;OD}3#H)0r&e{Iw8sC0V~CjFPJVP#zLOk?>h)e44w8B*dyS zpke-Kob4hD^O|Cuin#)_M8n@-69%U6$d}68;@U;AW(T7E4v1^*Y$9-N$v&YQcbyx$ zJkcznT7|I1@$Emn55)NScr0yckerZk)P^rt$oC00r>_*t9>e8J`P|R>vqtD&#Np22 z_u)W->a0atw_8@-;;fn>E~@`sbK>!2@~On<`=N^#r*BeX73L9n*7Hr8UTAMAp71d} zSIiITp)#8aR=GkPg*6nKYxuJ}Eb%za`OEGO53~1Bg)$?~=rJsO=1;RD!{aw9*Q)Tv zaT}K(O>1R3vTkYBr@u>MKr;Y@B3ar`0Q8^0Y#9@`Q4GxfJV;vDTr)>@qSUYJrBERw z>M}GLAkOhWz(AoIj6+nQblK%kw+i(eq&6X-H~_^YZWWRz1b`HB37AZM<9leF@M?GX zV2PuOS##)5R&|8W>6-XMGDlJH^PnQ6g1j}^!q z>-f^6DXK^V7}x|9z`^{JA^@Cc4-8gqnJP ze*<#vl`cxHhXSJPXkVGpoFjCGKx5za zeEYA9R^SY!ev*y))9A{owkn@^FT|pj^FFyVv7PVv++GBi;>Qju>f*1-g>0?;=j8|k z-P?2qlSeWF<}l3?P{jAk|0>EKt*Zg>Z|*rXSB*NGs=0xrVrUe5(zOzWb_XiHYd zN3~bdI~`)M7qj>6GE3eEFBxKcP%btqSq(WfmV#O1@|ZcZ5&BcKkEyOZ4q|jUUUVmBm$A2M$##yKbIihQcP@Jk%-->5A|D z+x|){dm=H@i>>(=X1+H;O-_IVhZ=q+aPks{t5L_{6nv?&E2ZF znvgl?_O4>yf=^W+S51%A+9~pw+-li&Ooc7ra82z^T>v5K8(h?*sW@uZ+w*HK8VYVJ= zmDC%TT#|lU)HGw+=*3hYE-Lm5KRoz6yjpkBvDHBAl765lSk=!iHr|Z2S51U$W)iBS zU;e~XMPB%JV+)vI1zCN&xfV55>TmevmT*r~mq0`fI=yHa^k!?0Vf{vU&pgF2GPU@v z!L_C>9c8{ocT4(fJCvYLH4(jSC@H1M++-GDSyp*VXHP*6e_*S^ed0fb&qh1L*qjf% zx>icz=<(2)GLPwi<;KEVYm1SW{q@d`(B%qeiBF#~jA0R2vxfJAZ|-q=H9cDzi4IYI zZp_jopp{M ze_~wl>~3Wt>6x3phP0qk_uQH>ysBRqe-s!vzH7Vm{ruT|kp;E9cSYBW>T06|0E#XR zP~qhp-xQ=%b8C$lW)k*SF0ob;ml`7*TfT0Qc`f;oKZCZOqwrP-$5P!X-JMpS#M0Nw zngCS)sF@VU#?qi?NS2`Yu4KJLhu_tGU0k-`*ZewRxH+TUIT>unuzc;e;u17LF%>a!F%o0L{q{ zuS=xJ70KKT_>g2+K6zGt(&*pm$Xwf69VYs6i@%!CpvKVBRFli%i;7ohaim`QxT7wr zc1Qp1e+51cMN8Kp$oN4sW6l^78+%$$O{r1BXWItjj1V~>;CW5?ctoTI_boA)TN)iN zu=dKScyXuQ%75Ol@^Z-bv_b>c3FPm#jI!h7zg#NEV#%GGl+kEYCVYF;k+p^vUx5Hr zJn=QGB_5ZPob4*uU0yBUaYoC)$@O=xyyOx0@fJ7QW{BY+Gm+f|Aa+n9F6{<+0iXgo z93_^1Rh{}wR0#5O^{dMew4xWTP>se5GBCn?k27^8b&ad5ihIx@n1k>xAhS1yeKM_s z4&YH>uGvHm^r#dQeQr@i$J%3J_(?X#D5PJ(fFVvw?8=R=#SN)TuXO48YpUi7%f!T*(ZQl)hb)=od^hicW%aJ?)fi!*Yj*cCo-yN@O1z6b3 zmE)nE>qeR5+Zg0WqBG=E$>`U5sjcEy1Dt|tk*#xmH`Mx zhOC?YTQk?kvL^%~uz)@=QlM<4Cv`(-;@*W`=o8axaY()^v&p2-v`!JTS8HwufgmCa zk5(vi;gWGc0E*z>!Re3BbCO(_re6l3*y>*dK!-DJC*!zOr0b9Pg|Qv-2UBFZoyaVB zo%U<0lCv5BYhKvQ12%~fZx*l^_&RMSqb-54Yjh-BCyw8F4$*7qa9kTKBB5N%Kn)G6E@v= zps8I5j-5~xU|=~EB5{w2%7a19wtYnkeCAQ6Q=1`u3^#M>xPwYEpO#~QiD5D}ixIOB z>GcB#;*!F$`4tg;NEINAttk9Pxlk%FX0@H;2kI58K=Y&p3Uz2-}FY9-i0E^zN%`7usl*E+b)bF$f zBN225Jn~HqMjAjkStp?ESg_-#;R=B8L1VPC_Nx&03!vTeF|zX`AJVYOYbnMcGSk$4 zm(ptSsFIN&7W+SdV#%NN$lH7X0Q@`ihS}K)ogm#QEIg`y@iYCE4r_aOWV4Xd$7>HvB@ zO#Kw>(=p7};3-{&8Q7kgxEnK7ZWIpzXan{P6qFg^lMZ1ZUP zWcl?qF}M)ETU-YIE0d16r3-0<1`#+*Q?w7$$&tbewVzDI1Z z!0RofU$&d7wye-z%WjNmLIntj#jM}~ISd$dQOUoRQwi(qbtba*#AF0K4KPYzl8SFn z`yU|sr{$aBP57dG%%%3{JI$&>vM~rHMt$!8v}f&&E@{HKu=mo^PKLJ34>LjFH16nu zRY6>^jBU|}P>%e9V~&@uuJDJD@=m#wn{4%>UH2JNCC#*<k8_nE+t^ZwDem84TR+ef=5G(0GM0{&Z{@x%@Un zr@o>r2dCm-Z|SIi>#;n8dvz4Sf~1bm9?ZOupH7+FQy0c`+1Ej4NPJ|?G_vNdtc2{n zhwn~YmkcCi*a`k!Y!%7$2lQs=qh-{$=f91G_P_~`!zw415;+FLBn+?@v?a8w|6lJO zQR=g{xF|7~knn%Q4hjwk-~k$rmDRr$FVddi<9dUA3eaYB(z3R~x?cQ?={C%nmX z0SkELWKAaOgrey$U%BzW&)T?Iy1N``qbNi24 zzChV)cdry}ml0{ife$cY+l^Z{Kq@LZsAb>B7|-OQtZT_m&PmfM~zs2!Q` z=4-F`hwDc)kxJEKk0X_(DXb~T|Eqvz_;lxk(NrnsKCOz+VWVDpnlgwkPKx{9*E`SZO%9&zHxi>35&?ev~k!gbQLlsDzGGcZ9HCr@4hq02furZn?mgYvj zIr;OJXF@Lgi6}C+SEry(QNW_nI^D}acSoUo`}QT;Vc{kcKWdrK*66RH9+WtOITr32 z(sh)X@Y=mhUlmN@BfS<0524^cFW<3RwoAx2Fwsm*0}&jQ_*3@h?0e({WaGsn0*WjY zbe;ZQmIZ*uRF-c~lQeE|NT$=F@PMcky*}aWSxe+R?d-bDkukaT(N)EL+k13S$tq{G z^e|u;>RXPUwL2-VeB^OQ^BUDJU3cij85eFIaOJH<1zj}VS|O$7QSEM%b3)pAa08a* z?*_TRtRL=-aWC<1IFbrheH9|p_`+n<^U{wPVdi&J0f7UOn~H@~E-NyHP&uwH(UaHA z2L1}puXm09Td2;h`lD9EgRgv2?`TSxI$OIF<9RuET3sVyIVyS|#}vE#DIAy7qaR%k zwNkXgu7_DJQ-<5OOFOsGjhPkNLI?@Ad2-O*xX{#ZVPpWKH`8ROCh>C@1N>HzjeUZn zMKy`$VjOk}CQUBuilK zTaPS{;MtbgAYlN!iDOCJFZA}8n~B&vx?$?p%)@*7!72uv$izRAhzBXXY6*KyJQFKB7FlF*dpHpI}8tW3c0VTav*-B^%Jf zo+q77cQtg(0ZU%NEX`a#XndcV&rITmR^sbSNB+pH4rd0EW$NFeTqVv@BKv3jYtDAV z8lMxqN7XQJr)wn5&_oFE?FaRba|1*kLwoWp1urI z-F9i^_he)!-diczO?*=`eFT+hv3IJ2HPGUKr|6zUceS z-to?gC*G+BA&4#90TWs%gm45~|7%+S8xFBuTR_%FBnzI0OWmUVP=rE=BudGjv_7f* zBqqBh4gH2rb=34xn|&<%n2z+r{HGXDMB0QtZ~3z)!d9;fpq>-cZw1qP7gNiSD)xX( z0PO1j0A)`%Ka5P@V$)hR(XKOXOlPGYnV}VXgsNppP9ZKIBMx)RAItbvT_{FH_=qsc z$cFlJK=xB$Rx9MtD^$ugx+BiT2tq5LpyIV786I;b&jM`Q4j_eLMa_=--}Fb<4u*^j!9x%Z=FqE;Jxdm!6e<(^46WzOg_^Y zgfZRA%Xwig4i%!Qj5wy5gjVZosY=(%WKq&a=>Q6Tu$pu;IsNv#)$ic-TwbZa@!xeI z$0aUrC)qaGax)&t5de_1@7z|c`OY?i5f|5Sdy5T+j%YILfeMJ8tevaL!0_bGSvN(= z?s5o44a-!uc)L zg4Fl>+NEWso40=NudN%Z0i^{zp)c8sHk!iw8QY+N%PKO%C*1H^Lv2kwL=BbE90PMBO}G9e{Ub27 zU#yLP9lNyi1&(9KpB%?$8y1Y3+-@@RRTGeYDgbD6!<1FVa`n;2%1=#H%mU|oMs}D* znYwA)H(~u0i(!VWWOQK3mF#WNRYMoUPh;-FeE};+w?}Yfp-J%v;bUwGqU;rqlWtek z8L5w_Cu{aztZ?d`k0F^=BbuU7JX&chBL4&Qv=7A?+q>T7yD!DHY&K`n2C8Jom8AHg42i6-6r8lxOG z#4aZ|3Ob?&o1mQR2OJbn`94F){Q7*@-s=BrJ*BZ;M9g1Vuz*_R;4DqPRLSI zryl`mr*e4+#WKVzf+cFte>~|te>|ArrC@fq{}i(K@Tr|szHA)to$61AUknT9G~@+=DKqh~SUR7m<3t<5pe`wo zkSNe0zqPLwjr%G}Po$p|&CO>gJ4fJ4Prb_PAoaVP_R%Oo*x25ShoxJ43sHW7t}khR z_VB718q$RhtM+Q9d%hUkzs? z2^De%Cq7+aYj~MJuL)vLSiY8R1eTLfL`_WH*jA1`z8C!2fxBKduM!DVVP>ctqDKEJ zOyA}OsNzc#qDt?)So?9oUj0Ce*2k#CQCO1#5eAo|nmpp(!!#nb>C;*KM99W7`nXaC=N+PGsn3%f z+VvQ)^l#p95TV6A1;1hcOB>7q{Ra6mX}y%a$B>{-EK8T`*&dr-&S2E1i1CTThwpW{n_}Pp>H2vf5gpFF+pop+e z7h414XWVQmb4w5xQ!I#Ck*7dI8^9oA%(Z!7U|iLzY2;x9*oV;@u&>5yg*Qu#+Prxz zGHutCSKjaJ&2I0AUOIYRg#fQRCJ@7h7uZBqUf_kwpLFu&^Dq|#w)M2yb=inX<>a&S z!2v@s@)z^G4yES^vG`qgA>AoBw|%m_Ph~VT3!3gJLiq_o0Jfv7QmY?D)0xO(oC*}O z&9}G*5AO{Aild^oOkv2czDaELk0fJK{p|Z6N~31=#qT6IlbHPGsPsc}U_~QF=R-BN zjacm-q(7YA!1TJ?jMy-Ic*9>mlZ`EtR8xnBab|_3|Z+JRmTAlc>?pJejp2mS1PP}@Ck?RE?P;ZK$ziPaWad;nN_oo(HGI{$% zb02ka*ZhaJl%8ATrTjB7>uR^4N4n8oaW~Tn9k~a%m<8bx8KoQOv_-2R8eSD@s#6GP zog`tA)L+Mz6#J!?TULG?Ue(32Kmixb4CE@)Fn3OQIGWBtv8~Y#P&>w3J96k!l$yia z2OmDS`j|RpU_qZ{N30Tqh?yF}#;s@_HK@%ujD}-WVVd(sY5}A5ZhS2n?M01j=9A+y zDee(;er5fty_f!J$bhHKtXZ&wu*d}oGG{1vck2N z@4)24XZDRj|6LC(QtnEZ)kEICGVfpxYuglhm%Ma51?NeiHU?G`;# zPD982^{wq@;s8T?cV2aO`4UtR5W1${`2hk~0_Tcr%3L`kuhogwrwU1r} zTpPC>cLH`9pLFs^WyG^%T2#=>*7Z!M_@e~5kQV6FJ(z!@9uWN%W}onQ1|i|0#FfdLK& zRK0)FeW$kT9p8Fw&3T}L<*dbb(=81(g&JeNtk=s*P4A%O#@(HpjfRi+m)04huPhh# zz#J?{APO%Rmj0}Njs5qNrnh)hj$PFy-RV}~Q~}305~mN0?dTOfKKKAAa*^xcSMt9s zfVdK2hWmmqe~!nK~+&SzXY6DHC>0N)Xso zUg5lOZO!R3m%D5?h;1ZU0MO)L9v|D;)s7{KrGy@obfQ_LGRoCd1OwTe&F)xR`?MCL z;K^XsqcAP5W~;=t!1Zm@N1!qdjF2(4!f2`L_P*Fe!ztTT?kcm25kzr0&Myanwdj2Z zp?k4v%Wls6AE-GJ@j9WYxz0J%y(U$!&|nqA&lLl@nH)I&iKDJS1=I|1LM`@N`&A4i zubZZrLu{k@x5`tQ_Z3hXI$rtp$`ip4Ki!9bn80M)^@#oQN~c$jwQc!s)>bAuvfYpI zZggtClV|PYbvI-k)%IP|l_o0*Zb7DMUusrX0bl*UhL7lVPc~nE&>2A2Y1O*BE}fS$ zBAP!kD`JuO_?mx|HN8dtZ3phNLjObc3)M)i64aWAscxfcpgAnit%2V4nQ3-o_m?#q z0_C_Tzj-KX)a9GhH^H2lX_eM4az~#~FkN?rwybP3TbZe29Gr{!sX!r^f*$&?sQ8&> z91RL)L-bY#8p1!2Y=@*g9o?G(6+Vok`5OIAX|Ta|BThiPP11zuj>O$ot0h8B=l-Pu zRvslb)WBnjI+bPaoI>QFqPX0?tmlyCYHW6s9KFryye-AjO;Uc6XvaAM~gK zoZM;#RR!phu9#9N97b1!%9aj zDttcb%9iv1kf4OI8ylgLpak&Yu*P%W8d(c#;H8QIv7<%<2%fNWt6y5bGY?oeSir2UBxRFU6E>Vr=4g;c@e92C7Bf%){|lfH);%H~gu1xeZ zeA_&dO#KN?WS8RD7ZA&QbJYi4-S5xh%YYy!ePJP)%?(P9Fu|Z=NCGqT@k>3M z1;auI$;&i#h!EIp2WMmmFx+E^>weD{U#x9vf~xF#Nb@wjHpbvT(b1>s4`i#8rbq4d_`FmL$BP}Sz+MbgkHgPL1m@T`8?Kc7SAs=G^*cKHp z-?hygCdlGq`UWZ7#~B}wn@=^>L$?Qs=^d*5+AMeGHKTAu2!qgXaX0qi1{Rfg@%M5^ zv3jPviz+tTYd)zTo*Dd-*y0V1>hccbVTITpF5xtuTmcsM^UD_P5nVl~v@l!)+IQdpU_~ z(pI|jO+510f~K}WkNd@bEq8W~OJ0`?6LhE5+vuGWfG4J?tx2&6`z? zLV+MaFu^AtgtbD>cJun^|F+Sr>z-eIFjMRn&?rP+C|ByFrbz=E6L+`wPKONf64fuP$LkE)?usAIx7>R1^z3B`)ArY7%P14KFVpdA{*FV& z=$uXpDd9Kkmt|GUxxYHd8_I1M^NIJTTK&-L5#N5UwM@PG+j{!!Rny&bhr(RVI^(e3 zEx;x~6Ou@WW1NdlB$g{yGpK57U&xBT`y*~}b>N;9gB%AV-NW!Zk*bdo=Z_~7eqd-y zkCU{fU%w6q@;goM)f&%yW6qrh{c0z6GSJ2BBJlW}a~}y>a+4^YvRqt#H?M%T4NJkV z!{bFH3>P@xOZ;~EgUOR~`H}EN(B#LA#eQ`Ulnf2Y!$Jkws!Ev8FnI8-3{! z?V(61Syra13%Qfx^9Yt~{8C_i?y|&6%e4O;k;|5LjF+!h=PO0Cvmmv%e33WeMSQ~k zUEcZZXSm=W#nj@clUIola|$$YVdq;}`K5Nb5m~5ha`#G4%hwpiL3LAG{#(7|wmQvs zxO_2dQ{5>^Vt%Z=U>QVZgmw0b3xAh?kJXBnJ$kGA6u!?X42>1)TIL%aL!Q}ui zg-Uo~s)N#3sAauf0I?>?U!H#%I&h&DYf?p>GxBZUALa8HnJbVI^DLB1B>4ELBX{#VW&Ms&QMPmZL3 z+|hf z>E$(#rk;%|?W+5H&f3J|;>rv{<ab}!>$mGe|lWmPk4)Y4|mPED0ZX4&#ZL#?l-{l`VE zk0d>}*s??EW#5?FW|W@3-BA5Nj(g;$5;9O6&PB&QvcW`2m{7IX#Wr_#Am?gG^9)de zMGmG{Km|R-n!CCm1kXVxiU-O>s1Pxz3W=g`c{ryA2z%dARCnl)pn5AZ81!i}0E&7@ zVebGVQEI+;@RpZGqYW^`8>FaIa0nkaVEovx<}wE@VRrbkiY;eqC_6)uoW|u$Q`D;m zf-Lgw2W#Tq1}Y1(pf61sxGhZopAzDd(TH&on^6&ffTk<#d94`ak9=c)<$a@Cfoylh zEd&j$LrjxlL$34w)}hs0^;xt@E7uq-9bR=$@SjhR6n%Je+J#DNNRlWn;qgCDc_ZO; zK^H&|Ok@C8L&st~tjCqK1-Ra-X^}nUWognJXf>L5A&+HtY_b~R=?WIEEgIm<#-T_S zK1@d)#h8?xX{j-5xE!5-xmQLu@Q0XHQzD>-$rZo=1t<3_=w+~v76R|LrnyHW?0Uk5 z_8;A}qbw^|T`3@C>`ZJiFLeoOGdDkoGY?AltyX)D{aS4rlq*1IE$;#yJ#aT$;Q9*u ze(LCj=3Vl!dd|PVCkPuarK9KU$Qmge|L6Xrz_cd4(6|1HXICvd));>Of|iR&oX`s9 z2|e1L<%yG{w8NW7EFD=?r;n~8N&Rf`uXU?m30#mfta7~>*shf2d0|6+!fmd+#pxG+-}M#A>-;Z0w>DJmV+L9KYHRk5~oa= z(pnjRmtIm+n2%e>ywIrIj#XNKP)YA(eX zPiZpi3{ORjHUki+VlKkNJh$^*%}fBKnk>YY4NVdp%uewXXlrq*Yc;ozi=^Y1xVY=f zi^WiX4hbDcezDW&UbeE*U}Y-hmoD(LZ|~jxu|DK)Rj_v<+o*$BgyxEwx}-~cTY=b4 zeClL&W+9cc`+niz_hUSuBCT{nqIJDb`ykQp=M|)4kbO!}tGtYR`2DECsGhnlOKL=Z1TXFhDp(R z133{axXm`0t2deT+0zDndJIZmoYPh<6--#Y)7r2WHI)1Bxf|q+lU#dG#NX*TTGCGv7k$zs2S1{6sKiknvg*FnM8K@d{%&%v`mh#CaQFPe znU4I-8JfEqZ8r5i+u=%1A;XWne^Ul(#9?CA1e*#xI064w!WJy{AbKknv}sFH);f7$ zU(A_2bN!x;{zNL{h-H&fId+&c2A7uGPmZ*00B$g3pE;upP&!sigTC+oTmn`LfN>- zjwPK}zB;>c&S0{$6zTJLeMHiAiL8aVupjy##2D@>0*^I!{@ywNMonvTYPY|5PUy0< zA!{B}+G>kY%lI|i)QEWX<0m$f*Ney|Dl`KoY$t4oHLYKL2o$Dl?>B=a2w&wogi`anSZd7-bum-heUz6#z|!H4)@& z&xCgE%-|%Kj54|;x1IOihq87ja&5ZkqZ6^0!iw6i!DI=rLN1G;L_)Zl%JYfu)5Q+NzV=ah) z;tuKkJ@GR4`-TaK4FSeS4G!Hi7$kn+u>F{770WROpBKE}b|rj*iC*ialXSX!QRIBp zp-U{ZiBny?^{?#3>5`T&00^Ffl5PK^etSigA9TmPTp}Y~@aJQvXfx#8lQHTa@HBc26Iu0@EQL5=7_Xz5`n`aI-8VufsdIaA=R zB-zV*;xOv2fP%&3&_8If_8CS+O-F@~=LnKigTI*QIWK&XxoGbM5c4hUNQce$gX5p3 zQ>R&0TMb? z+?WQ+wqnWzZYa*ZWO*grRP`*GhX?RJR zP2(Q!zynT^F#s@GGV1X2Y@6+(;Um;M4V|X>D_8!Ji}+Sy*#M1pM-lIL^S^UzxtV}! zKG30p(^R7PS!NehdcOU*@$%~7+0~clw&T~8dbJ=R)N4*-*~ebLEWRyqf%?yjbTEN31f6i&5{- zxT{aY?&8wljmMve@)m&w1unzs`c8pDqyz?cMs2%U>hAF8y|9jMg`L?|LSUYUav4u( zrJE4UD#;N>naqX!d30envvBHo#%+o@F0^>!<+>F~P+UTnYsq9+o zw{{=X)*o%NtRpHi$d+aNPQmYZ=H56>S+lf1R5jnqd8B=B;q&5b?=4l+z@|@KVvI;o zwT!nz$#T5|^Mm@O1^x=0hS;|~p;cS5hkFpAttszauKRwq1HYL3QXPtvubYrg--7~; zasD>>=(5x>9KBv^7DGbI&i&qO_|0h>TFPrP=$zTiWlB7wJ+&jRpBrdgnM!?bDqL_zo{?`mCpdC>J?qBN;E$8{%)!a2iI(H`#`S~qW+_E!J{vRD@Dr z-Y_xT2EqYI(n8IZ6&q$_gh7-pL5@v>+2HnpaRFPoT$ay<_cg3WJVfsWl&d28T8nri zh7(!cyzCu9ZKiui*DauCm4i_Y3Z$>%8ku3Nn=&pX!^Pmaz?q*aHgoL|f{%z?qikJk z=D7MVN1_SGDc6-hX?)*7Ew9-;AyzH?+5Gt6AJ1;D<{Nolf8>UQvji{bF+s^!5S&e{ z#wCZVw6MPbll*7ftRGwlB#{Q?CZ>3qa_C~5X{(=*sX^P1msk)nn_|CQTwj?3>i zSW=}eJO2j&_B@njDAuLDazB3M95gL%`B0x@uKurunb$vvG1Ck_Geq1m>%Fyw>F7`| zpd{5{(%l7EXQT>P?<~sdEpF<^)9wc-^`?D}mhJ<&7*daGH+hsz66l-0j+xc_LK=Zn z5UiK1tq?wHOD00*>uaEzP~$_nm8@#UtKHfM)}ERLai)?7Ou|JjY-czDWZ_Cfe+ic1 zTFhq)-{+0B)|p&+2ZpuyW_tx@(paDBCPrZYUVS+;J=~}=2IbbrpzU`TVd}iX9SKGP z`lkyHo@!jrH#LBwu+zdAdY`RJHKFww)9pKq^*f4=4P~*q6?$o40aLhUotE-jWoAt% zE=JaC2fb-T{H~xp)3FXC`leA;Km_z_hA4viXVYTnlfWf#vcX)vpJ*bt;W*i~BhW)#mrpiJ+0sRUqo}Sh4GPsc`T*GwTZjy;&ztg^<+SfngwJyKC*fM^t z%Z0<;+}52?kv)GeGqJ3OTXr>~?d6`J@=})OB}a?Ox8AK35MPpNxbcN&*;nc*#gcy1 zLeod8$i*~Fy&%I+nmbRdCTCbdTR%6O-p7IOpp&=p{>XElHYJwBr~4Oe?!UWTI)nw$ zY&F1I(wIuX&@U4l}~8y8JZIaJ3TZkiyod zDNPi~Y?#*I9|XQiD-_@|5)=@nuvg!!fVlh@WaPG?n+%p@eGc^xSZ|0D77S^5^?b%` zvw8Gr=Qciqw}w8QW}lY0$_ot(M!PLBJM7MBLp@M}Trhn~;Rm`K`XpmA^3On}yL-N6 zm+EY$BtTx49tDo*-fox~L5^UN*YJ_po5>e@L|b+lDGXCO;Ba$w_wq4pg`=fSE_)b| z)94Dc&(zcc9sWXJA~8>GZZGEDQrAs1+q$er16mn=gV?KKPDG2;y~E1t!d(h>7R+{U zssx)r^RpeWYV!?0BA?qJG0GNYls}EmO<`DYfj$XAmn`zdpm&r=C!mIvVctSc{tr-o ziC!;%nG)#K30ZZam(o_uNx{VOIEgY~nd$ViqZX$u?Om?&3Ju&rY-lo0yk%Ps0UYv} z@T-ijJt<66rw*?%w~qeTWhwu+P$trs7zX6jC;I3>2~kh!h{R|Oc{z1KuG?QZ1@~rW z`SWQGo;0OUAjk^XaRRz1Px=arBgm>}P)(-yexH5T)}o&&|zP`BsHb=?FYf7vCinaXen;B%P0*xnAL&_EJ zXRR>8R7RFB8Xo3;f*dR^*x&tX(*REcqqxD8wakCN>Q7x^$vkKV%ZWfxNZ&xNCT%-I zVr#cmlEwyTDO!0e^R1{!C=*Ur=nhmhgh$Fds~PRmGfAZz|6WOW9$%Q!*;e_EuyTAFA^qSiIZ7>Fb9^pYod-`XmW) zg=9&;8*(S~jHNs5LuF>NSnQkJW07xva|cQd>#nrt(xbm)(s5?H><^D(qsxjGVAa?6 zMbsBG><2!xN`rny_%)gOZRLQFoJGY*5^*QzwXK->^n#RzO##W&V`(@IT+q-=_W@lt zxb2hWAEkM9f4K`tXw}bm70zCjR|SupuWlNxe2_5xtB5Q(RILyBM#Wl)h}Grz7&gfN zC%?sX_kat;St()vcF~EU_=@Ye0#@G`_(Oo0r0$iutIp4y>oDm0Shuw3?^ivlf#CVK z!?TMQ^=}`vzmePiZ|GnB@%g>0G`qFEc&Wrr{o3*HKheZHw7efkAP5oy7Wn(~e|OG#d9HI^&w0MjeSbb=^0@KI;^U|WKG8ls$MWy<&C-H@@@l=l z=!r)%l9YuRd=aih3A`={+)uuhA7Jsv@yOVY8gdbELBVHFD^)JgM`eTjxxRE0mzn=Y zm3GOh@F(cw_?|mI=&lKhj@D?dEgGPnujLyTTYDtSa&w~Qw&Tl?yRMzm&)vycI0xs% zPU+|^tEy`AyN{dA5Mhyzz;xCKD0@oIgrnUY`=s#&00YAGrc-86=)p*KNw-(%ZoNL) ze_hE(oRy1E=4$<>($#z;X3PBj)&T5D)9x-(mMV3zC`@1_R=*H@S|qrI9NMd-skg0q zD1->uZAZP;W;T+GJmV{QRc4si`qBNH%dhikg|k~N{E9Cw66XSgr|iv$FO91I=-FmH zkoX`@2`VJJBN7XF!%4##AO0<;1oXf*<8LSGhm&hE5BySSrMdx098#YfKoyT+DEPO? zv~+o34*eOTCMN36cCm+)V9E~O2G<0hCHl(De#fLitz2$|7o?=w>NO34b^KyPZOzJA zj8m|}lDq@2WW^A+M6&099QRu0W$K5W$<1-J#>QB{}oOIVG`oadQW*^de{a zu2U?bDebID*$jHXWhp=Dg%@{CS3w$Jvp(%s7EbuXQO0F2XvT)4SWXGjIx9G_3K6C> z?~Ywf?1vuOIYH2rj48t{depph-yq+eEg}5$W0};LX^x#EGzozd7?D+LIjm<&L%J~d zZ~_#H@p|U>M~OxzHbgb1#+=*&t}K=Vp`1b3O`z$vQG7;BGI(~LN`-Cr9T&K!R0AxO zAxk@)AC|cq!7_BbEzM4qPtw{YMPa6r)k4>+AQ zrGwGw)H9WRV_16&%3p&#GfylCWFwG8B?gTT51>OTLs~NPB>8!~ll}0dV$nmu9k~&w zkT7kon%mDGuqOqH;qvD)It5);SU&hSx$r>Myt{FBwq55-BFyIM!p%1m^ap~hMiV5F za)C6WCFnUTi{}m`%x<}r;7$j5rz61`1=8Q-*!@kMTvdeGSvh35A^D9hhQ(3z6M$W(`O&Bp%eSdhUMQcLd zZ|X%-^Q*x(&SU<;hdlaN$>hYuXwwwu)NE!poK0@rthbqZ@0-sXP1dD^h8@hm_bnU= z^E4W{37`0NVUJV-a2xuVu*5g&UZe+MbyB$&9`o1~S%Cw9^WD|HOsQj9?mh=OwmL=K zX;&+gaeC*k+A=Uje{if*K&)5LW2A#OY(w7YKq)2gv3QHrQJV~YZedtWW7Igl8r0i%3WCckr&oOq5Bl3r zl8=&cGnEBU*vKxpgQ;*DEL0j-(l8pjN1}X1MlGgn1}*Nq0v5_69qde`wknvolcmBc zjIOElZ)}|ey=ej!0!L~6oeFRXW8d~qib9TC=p$YmH86FJilcb=@*#RNE)zl*M6X1L^vZUCZe*X3`hnGo=r$Dk;83F*b+@ zyXqZKT`4s?V}L}!9l0JU_NYHuw{29-bHqJqjS22^I_@UEKnwN83^K<^EuYS?()m#q z8KcvVxR+rr)b|OR^2I@qrJHWd)rupJyiq25A4q4b>05S@)ZHytnuWc;blEOZ2e*x- z4!=BEn;=3i>FM?xAB8WmyT4tTJAZAnmu|pD;lW2h#n;95k6{1`%c&&~C-=wHhF;Xl z0<4;#ZG*O>Rtuun|c z+nb7{^0>pt@7cFiUO>}CAoP;zurt7)@flJqp9@VctvmO+7EtJqL#59%4823IFVElb zzVC5ed6g;b+dm>CZGDunt86Ta=ELd$zi_Ug3U{(6hJA&VuwQACju#3$x-Y};sdhj7 zro2)3Bu;owszkj`C9$|km&=<3{QVq2gU38gvvcM^%Dv4w9!pg{R4tVobTMm?pwcR= zD%_sNcT=8X3-48biLa0;9tLHa003m{zW25UW4OPK?(DJe=OqR)@_IL6o0c-3M6bEU z$M^3S3XTvA*Z;w$W}&|ClEq~n3~UbLjkW;9=G*l3D*6~F(e^EgbhheoE{3lWDN1qa zaxE`os2?d3yrK*op4nl;(1M69WVD|{FA2H(i7PpWXV)0DF+LljaLPAEkY(^*)#S?H zDkd3SW!vL&;w?r33d?o9Y!LJ=-Zz*&L!)RuOSisUaa`K%sRY=W2ML+-X2| z$kHJ`%OpiK%PD1)_PGgp{E8p&anvJSW9U;28wXvm2-cBRTJCh4X0DD(0hl%gWC$ns z_uuj7ku)gU+!}&;^Now*R^t26oLOo_Nu5Ix0G4peyygh%A$X$Ba;*n48cJy!Bny;Z zx^`TBsbYxSImNXap71G}P0HlBxU66*nnQVv4^KLjZ(4mBbFpCB$0BN%8~*`{2W_$v z@xBvii29{;IDVw5wb6!nU6z$%;4AjV-8Oj#`wm*oMYejY0shijPyr+V+t>GEW%*;` zpDD^23yjd%4I-9T#fMMDp`=9f`GfQ~@>J}0eI(+cbY%Yl%<;Y33MyhcA0_WkVCC-d z|Ml`4#OM)du^G3kE{1QhSGqb-7Lc7}=?tL)v!?=pW1}hrb+I(#0{YSuy_|f|EuImF zyI19nM{leGoJNknM_Kb1D6RJ`YF5;Gb)}XHxDE9;!~j9v6`sO|cmJBKT-|4m=CUuN zJWy5YIzOG+pW}1FllrbUYE56>?HnSnDJp#{xd^lo^x^PPSosgo&f_O>D&`+|5&R)T zw`nWyqfL^ig$f>ua|D(rO2hE6Rn7sABzwf*QxUrL_q^%(s9JXhjb31MZ{L$2c;{M^ zTJcmv51Ou{aK(1S_#<($&zL=EB38gF=p(sZD(78p8_W`-j)iIcI;|T zFZ^1O5ZI+WL$rAD8L#Mlj-*>ki#r|T=m_dPwfNn(<4qH8GS&%8vH}1S_sSg{@9Cz-RDJ&(`WID2$R?X(S#z&yrL-Qz zk6wC8pzG^ytXr{K8sJUT${~ATOe)qin{Hn{6#`L!1@!`A2?|xqFm66@K zUj_bgxgGuU>IRV$gdQU4z4;D}@4fna-6e_U`)w?G_)|YJYN5P3d9Pqsj-6y_C(ZEo zJ3|)}i}3}`-!%$1jHQ>KM|uP!o<53;5_a`(%JU9t9*wUL>> zUZIpnK?Lt25rGGZvgxtV=H{lyeTSg*hx`>04VqOiYR&IzXG+4PgrO3n=n$wk$uq>z z-Qozsu5@P2o|s64mRMP*wWv=F5{LYr9yG|-#(8g`-fkiLUB|-T^oVf2hBhSd<(*-h zQPDE-gNYDV2f=x<7KRZv_E*iQ1CE|{joQ$9{adRBa$R$)px%j_Sp)zBl$1!ie@Y^u zXL)WoPtTJ-GpUCFn3b62lbRKSSWTsz(_oun?J4u#yJRLQJ7CNWjp?4>K#}U{?@vJ4 zWr}(7wha#{`L|e-XRu#GY9${mB}tg29Mk~}(BEW^IEvmZeMRk)8KXU?*bS7kc>Qk5 z*--liNh-jwpkPBEX-Zv_5O-Hk#2WlQmq2;S0H*hLdT#DgjeW9cq@k$^An{=m&u7nV z?@{F06M)0TaZ0(RE|tlWbSiv3FwU!W4k)yTmBwlhuveSM{Cmz0&KUVm}_*gn?;KS<24$FD&HqyfmtrvftZE7K--fNE#NN zl+4(e)I|w_{X~+*Q%}hXLr&u~G~iR)TMfIPch_D%)G7sG66r~)hGG=?pm_gh`~Ff+ z1lm)B2XYhBi`DaV%_!8UPI{DNHknLnE`~{c-A}OX9pKm5tF*uOBr}^6oy{U`s(0D> zyvv2{VqembzoPyc%RA9s*Y}CE&u{ooX`hzOKwuo1QwP(Fli^BSlBxzk1X(kh7bq1> zD=oN04Nv$|%P?FMf91zbai^|ayGP!HptzEioV85HoAigor{Z1bx^2FiUbXte`C!xj!6tH0$L*m{oc2k0CYTG=UlSTIOqU*C?0h z2t=wlxyZjLue!Ea!W;z4Z>U#?%rha=(WGQD`4bM>RG8PTfL@~*a;n}eP=>s_8KtYs z_dBq4pwYo`0@FIn7j2vJm88EtNfcS9Z$XLC%=^?(+ZC<#AE zVuE0Jdq~n~YZc3Y_@rKkK$7VV(zvNM$FUqxjOi*&OiZDvr;#I}Rqp6oxA~T}i=(vr zS?3>C&mmkyZV!`A)OJY!744}@6Go9w!aWg~eDTWs?gMFrb56CL7DcdUSzZ7d59Y%| zWNix~?tS`fz#hSFIM9Ggo&YsT7%jHW)>+z$uStQXgPyF@Y#w+T)Ty25i$!`_AQ8{jpoKah0^bafEv080sS;6G zOZ52YM39edQ`66tf>9;?YOfaI?Oj!0$r!Ejdi!9aKGg431qRxOox25vmm2TwhhhX$*|U;w#tKhaa-t(03y;-R9D%2D{I>l&m%RxDxooQ8{Vl%TW{K#D*vnAvZ5LjhAk- zv57Q(d4l>o)K$n0cB|?mGX%kceL^3WZ@e83`fRAJLDm~LQsW=Bp@ZaVM650o0Hx1DZTVE2-#~Cbx zgEhbWK2W-|%(=iuJuzWhr>Tiu3yxg{9q}VP{I0@G(Oo+14t7?1MSAuJ5iCcbI{?7( zy*xoAxx0KCSDHz)FzlO|9#ku7X(Y)(k~97y zMnFuFh)k2SLmj`(VW8@>jY1i2IX^qz?s;iMq?m_wk7kTCHMN623aXI)dM#E!9OVuz zfNR)t)w(K99|IId`}Y6kGYZ~;^)(9FKl#x%%ca8?T)b?<|8zqa`s*D&e1*GdPGl8e za?tVkv06B+5t>cTzewT+116JNYFFujVCgRMJsY`Lv}&E1M^0|%2EZpOjPv$+bPB;j z{Pi7}06mQoj!tJr)AeVwg5tdZRVs`?ueqq22#@@K0Gv~RghHy}F(j1is`rmk+|}*8 zib%L)`;~Q|T7kLCjO&*u{2THvmezdzmhj{~tioiN;5yMDUVtHKF6(yYb#V zGCO6o%slb;8db{B#gJ@X^U`?Bw99|FaUoJ>n!YfBJ z{9*gSNbY6$_-pAarhDvm6{+-CkIF8yHebSp>vxOXY;g5tx~SZ}{{Z(MC9}=* zJ=Zlh-uQ~>8x;)z{Bh;>O8|$1pS4|%AfVB3F#9Q({SW28oP>sdU&~a_e(Ilk-BT5B ziq0TB9=rh1^zy%nCH*saOp?W+4KXkTeD-Od#q75VhrKj!N)%CGKKG>pMPK7%Z$h*+k-yx%}Iqr!Ajp)ndeQ^I>)#I1g1SjG=- zf5&wpJi^(!%mM+ zN-|$nLk?U3RTV_pduL1eNQgQNA+#6kd~Gl%?UKcH9hhU=%wg^7I>%sFTFrSm2h}43 zvMzx%N(xyTd<iDtwRbx{LedtpoQ^e4UngVceT@k5_Sio96f7hvUM&Se?$L45S- zZW?JK10moyf9~0e=)Qb+O#thb8y`4+$rqf_#ycbCcfnCQlvxY5^en|S&Ty#Hx-~MS zKD5P;FbVL684@*M^{tm;KA}7eYYDJ{DkwqckgnV`n5xMLgSNL#?*%=1b1(iUEsXIA zJwGWb;CsEPRSidCg4v)teSe>&u5y50f1gK@f(SD#XReDSO)L?=&~|_de(evIp!3VSp4;9F9C-EDlV+Y(>gPd3~3j zOzg|t1+xLYexi>~X%i^|;%W~iAwzUS>esiCw7R&)yxjTRDm~kY9Bml)&ItW-g^gW4 zo|<&bKDBHi!hTLuIeL}FmMuq0qdtZu0fa_^1Wa!DiU+bRS<;{kDU6;YnDqF`l_({+ z4@#<_*-E<59IoaX@=1g~EL}(Q{iI^LdHB?M@-L6Non%eO>m66YXnEAwoVYusu%5U< zMp@TEBedm8^j3k#nT1HH8+luq#vB?IWNsk~)FZ{XQt(o7p;%0oWU7;XNk8eJZ%s%f1ld zV^(O}i>mYxsns^Og64V2dJ=H}V0}pfglTn({@^eovRRYSN zzYxfSk%C|GS}e=GQgwODDEibu#d8jx%}hg2`M|HYSE!?!G&uX{_V~lg=kts+Zxx)Y zW4#vj^n{RAM$r=ey)-`V#MSis842_yMOO83i==#1N$5P2)2*UxW|xy(0W|g8_k`3X z6Xj$dwH%&irt7ul^AA)vl~*kRSx0Yi#~urOxuK5_eCvGFc6pDd=IesYTap*~8$oh+tRqj{X(uBCrBuwT<4MB_^l)kG=L}$ML@}80Akoq+nJyBKyv+P7b z$~8TiQw0#kXx5%JI#MK;AezLjYG9r3utP_&_czndV}8DV{BXPZN+TrBLy2mDbu5%$ z<0Gn%i!X#v;LZN0F-DDv(He8F^yZSgu>1JuXGN_Ba8nVB^Stxw7T)PES-6=Hsao?p z6BDCeMp{yoT|Cm^X~t7KbGr}b+#dwP+6<&kNo0p=764$VPXm+oFSUZ1k7RJmex zXQ3tsHm@ZeM)&GXUlA+Fh9d{TxlzcUp-2b3c=8SY`$={Xu9PE8VO%Ma(x+Pv7w}RLxYAJf5lTU(bA&BQQ!fdfS z;r~VouB)a|bm#66rmKLU?1Z)o9FPUuIlFs09e6a?PPO#i^sP6_V05r$=Dkg+;g`bl zP!~T*D@6cCw;|$W2;8#O}5hwZcL}2qKRy0;-z%A@ADTW z4f`&$=O&McAyhIc{O+qQ7(PF`?Kc2F3e#G3&DPX8zq~KcIM2 z#;P8HE);j|#Gb$&yUD%lc5pVFkwnQmz%UlQt67prp|9vC=$qkITQN~YhXQpaC$7TB ztcNZ!o(Y90?%?2~{KW~Ma{)jHFa8Vpt(5{n-3)q4YyjOt_rG4C7m&?JKs`=-oqI75 zB(F1|<^)Z?jc7ShobpdC>zL8QY1;OYAh#U^RrG!i5}5^olIlOD%D?MuMEeRY*&|T;C;W-N#j?ttWUKSR z+viprtr|F(N?=)jc!`G66#r}ch2j)&6bf3s*0t5nAciz<9Ipx8r2e@=E%XS8Pw@~Z zt9Uua5r!uTy|T{YYV7L|FTJQFIT80GcL;+KAU{^vp9`f-Ed~dtj4@8#_n*fZJR!35 z)NDCq@?ga8u^(?64H_zf!=2UDE!hn*Q#o|cpU7=V|4LQ7oUSs<)b4{FGm@#ki>Fu# zzZ~*ZG+_Zsz-;;z)hNyk10*o)3-@W>ODB_AT}mqJZd<}q6(tHls*2NQtfPe~@jp7` z32NyIxr`jeEu0`n)S)ljbL6E;Am$@Yk%(|;SYm^*!gBd3CrBL}(L`QE&RVvyQ$5j!7ejpNjywQ%~FWO%@%TtpX*xbKt!4} zWQn%;%omKa4_#LMU>L>)Jlgw1C-lTS`>^d}Cl0$s#wB$fVvs11PZtsB_~J$244M2{S|Ob z`nj#^R`;9@x#?oa^2mK_MC5`@i>Z-k+nnWnMzadrmZ2~77!=JJSt{R(Q@X3$-Ye%o zT@g*W77tY_Gf@jv=1m|wsTWMi|8z>cXJjvcM6qDB%_Y(GAk%|AG%SKx{KCo1sWD;J zK`Xske9_Ay4N2qQExx(E?Y?SEXF`)TI=X|6;o3P}(2|_-RnFnxA1Yo}VEvq?v9BP> z=LA`OJjNAxEtl~HEIrv7!rhAtg|H`LZ(!_vX@)=yoiThd>@;eE^mq5MPiRXJBurItkHDGeTeFdQ?WPtS<7{@9I6) zuQGio`!e_rHuJ4YSEz?GtJ!Y9FGxq#BiZrl_cRoEt?=#B<;Y}CU0U_OsLyjzYRPQ> zzkJFD*Hv+3|NHmlvCyw)H+S}L(lmeW;YThm{@%>Sxi$)-qhF4LxuV3c|47>BMyk6% zzkb3TARkRS%#h0>Gk%{QDuTxjWGQkvCjaFMuUg?s;#!`ktt<=zX(TYS0KVrl`hJI> z-}`0$jaZcNK)83VHiP(qnr9gm3MC1q*FJV@qaQseipzCJq(Cb)GJ3|CzX)-OH3T3A zSWIz9QN?eHT0u227?wP&Y4J}2KoYU)b0Z#WFYpzcVNX1=W%bC)N6B*NAtYtVq*uj( z%7#-Ed2K|Fm_+AO>p=cjhi%SRlA0|3offexdkTs|Dyg+kk@Nk{2fPM|S#TTvN_P{g zy#@HG5RoF93Dp>l;kQDAr@gGwLrA_fD(G%xQdZ#OV@AINP1vcTF$0Se-Hz<*fzihc zNLG}tLkTrJ?ia?yOYgHu5+KUUoug!*FS^>z`eEFhcFgi(_aS+Y+@xPEef)OHjYP@& zlV(%5!sGXwzsmB-X^QA1oxAhwHG;)d#~wmjCTd9})mhOLk~B$nF%%xG2SM(_ zAddTi@uE7L$%TTnWAt}ZQl6$-#<5Qr+>7N+)iL>^2Q}ctsWWt))Jd^-3_o?6tvAdx z2Tsb*9Fb97>G$H7)nAi_(aL+wg&*oi8_O#Hgru1EPBK*-rdbYvaX52L*0d*mU>>QnZ~6px zWk4QKr!Gw|DCp5FROL>dTMjO zx)i7DY8etPDs|KfQ*g$AMnk`=1GsG@oJ}eUjbF>`^G)E8uAM-mit+?j6ZN;!A6;E7 zbU-;GmaY1Upe%p{oTL*RPc5h$REYKQ@c5ETq@OkSc1Z+RrgtY2_(x>U;%FRgZ;>(K zQA@9lvik9J%8&t#K3f&ky5afMHnMw`mZ4x@(Qh-cn=_5djX-_&B_-&RM zbTBuBt*mfY3HA_v0s8Zxg9Tny;Mp8B>ec!v--1eGAh>{IuJ7vyZ_$d>??K%BmZgSz zE_u7>KW~=j3Mm2J5cE)j)Gx!P=1G$ccwqV@lOA?$9>i>$%vy{3`{}E>xCkQ=@v9}h zTzPPP2uB=)0@O#!|EO6x)g;chTsXW305xmSC?FKep;M)VGGLSleY5mv&9JS@CKsJZ zVUGjYGu*uzGQ{j!uZUZ~?4ulG1=ZPbh;LDso-@`WvmrKaEP3yHIaZgXhx%i27JcF* z>=5{ud!E^1K}6K2V~hJn9xiVk=t<}DEGtCwwD_vQvVzL2X3H^< zrue)lY;9ZdBGZGUi>J+1_h;7}3H7u+l^!D?ZD;*NyEsUF2f075Nx)>63SF~B&qPG3 ztNeXCeX$Jvr0TCBwJR(UXg8&HFhgKCK>KIS)0Xo;GPQX@g|D+1^3v}bxr3Z+YGCiN zo)A7Lm%&h3YaUr&m8EdYjAdj>$$?8vX<1c4ugEsSz?{ic#ZRN97)=Iwtz)Ceq*KK+ zpK;z@NJXK|8tz^$ zQ9N5+WmiX&BF!6nvfR)`{y3CnQKgG&(|vX?&<60d zdZfNqGO(f#6?<|bde$svKIfap^OJmLa2Bg*eCI8*f{hFKyUx~LtSV-#oPLxs}%_T zO$_J_q_;Pk41COUll|YWGS*o70V06juVX}UbiaYq$y~cnRCE)`AnCDl#j*2=AyLqDJ{El! zfbS^sk?T(PXDM-@kOqChX4r?lYhlOejNp(R8aL4$gPsdf3h~b|EWjo#qqC(Npm$hD zDHCcmR1aW(TYlToyL>5tuW2dUE#A~yvrU)m?#0p%INKeI>U2fg7Z%?2$z&FrISt`3 z4EZY|h3#B*WcwgEmp*9nXzJtSFn`OBcKSX{s(jL4|6?!GQnsyh2-6qN!6o(k>JFTZ z0RE-BLPBRYlyd31a9<7tyxadB>!6N&Mxdln+R78#<<;Mmw6O5Kmt=Ka6~AitpGNG*q>DY+xHkt3QbR?y4Is9kwkhzWI| z0intDNT!L@XO9=;JAD_Q%R2Jb_v38Y`Ox1@s+Y($H}BtfxaW8U>YK)*N9vr#{G_T@_BZh+J8?Kt zZkLa+_K30~&3|fi@1z%qLPbqWzXpwtjLFwT0eU*TGn2Zby zhs}^KoqcU}xzyB0eVtDz4%PR56l1Dd@2|1%`NdoUgFQ*5XHgV&Dvr`c9 zL+#wfoG4tT4sfU7tSB5^;~$;oZxWvvDQf$qlKq%p&ve|JX+H(S@aNiB4LOpv_xks= z`NZ6mYi*As9M!6-E9Kh%%d`R?77ipq=PIh)7QRr! zTwrSFz#3K>6Gf4Fox72=O~*{`Gc$));~@3uU=kz&>fUzag6PhY9iq~8VI-JoSEF`y z#9GS)2JR?|KP!mdA6ANfS=t{x7j6Xw7{zxdf$Y=vZ-QpO>xd>hG6Sx2+OPh0e!?d z*%ZXRUTgv8HLqz2<<%zrJ`C`o-E(8UPiXFp)uk@a4Jyc~UPN zXYRS_qfAn?rWgx706Lb0BViNzReW5_K(zE}D1A?sZCd-}6Oz0o6QW&WmGpi)drKrT z?49GryahOIurlpmzK)G47h$yQQna{IABPy7MiS>PN<=Cvv?*-T8=k;bvZBw3RMs>uGrco;HW&ow1QqTn^~el z{WU~Z(<<+4WkpqXp~^RtZ=z#J!$>Qj_#2P5Sa&m&`lg@`EP;-`UDc?{lo|hwmABPQ zgZ)Xosve*b4g78{ISlTTP@1pNF9TGj&zQApe>8~&%kr)=XEs6V)C5*3`bya+oVhqk zwu=cmge;=aZw)51MJ~#h->S;;*pl&D3g4Ur|jWS!v6Ftrg+y32uL6#^}8S0UU1{M)fsB9h7 z*@(_Se`QWx1NWJ>ZZ%J=QoTtvv#f-)sS za(othpLew17`m+PL23Pc)CF^c>A{EbdEv~M7(rwx@w#HohO9)%HG^&ax_HX$Jk7wX zOI0+yV2IhJhTn>Xih+W!P^!3*jD#&3JW+4GQ9jEOTaif9tW`pvj*)a&smK@-_$)qT z)d-~rJ~n=vn3`PA4W$q2wFYDhg-8cV2M%v}rvV#0Tz_zDT+$dwcHDS=Jz|fnKo(ZH ztM)?k^2Ef~=3Ls=^l8lQdwQGegI;$9+4CGIK?=Ztr@HL4Uu$hISAlCrY{DQXmM1?S z^||J<5n5-(i9oauah|aQ+kr}#u{pdX-&D~3ejZ>d{HnUb-62Gjh;xrIZPN@(ACj_U zEa+;B6p36f2F^zL$@~Xk&TJ;=nXqHPpW96Wr<;1VmTuLu=6Rx+N5n@-xQiiiIpP2o zj?7=fZ8$1_18a{KZS^1I9&gX)d5MBAy<{b~yg#<>PJ|6s_g!fXlUp)1A0!!l{jg7< zbeMP&myW`aEvN;PNOumAxysF3&%*N#_W7%T6bPceRbaBL#H9qUW5V(*W!bO6|egOzhlHY~nUQ;+Or@Y2*K7Usd| z*3MT$zb96q$Skvlun`4KO>3u2t{+Jj2 zOkM|lyw3-`$ftgyEy%$<-9OcAUN6)@+g?}YMstLa8|P$n!aI9Zd1ai3WXL9sG`W9* zvv)G2uQOuPHa-3W{OFoC)D0w7e)1`PgV+G_R%Bm4RYLio90-n)G_@ht3Y!%}Rm)0gTE;`4if1eF8zao_+XEQuFERtx~X3%YGMY zbxA?df?I28KPhGfFV`Qyd>d|1W?iFb<5WsPM?}8SA`FZHBv~32ejL}goZx<&HP@<$ zJiZrq)%Gh=hd$^1b{J1;AI3)=%+q0&Ud~Pxl*1@=ZTLtngRQ3CkU!6>)IOfJb;3)# zjmPJn`hh;hX2O*WI^3>9U4!I#2L4O3lk?k9uD||ku1Sa#qhGJ|7Og#R*PTxg+VUfFx4~00Kf8k7is=99NyN4!r0` zF7ivig_iv`VGJiH>dK>PiuccYMF47R>j;>uC9*IADn! z_6I(CanMm#S!SV%eX9$s-jo^%Z@}~Y~ zI#-=GIdC@3KRs~HCi5p8Mgbp9=|Sh;FMLJjtn%I(HDNeNFW5i4LwAddhwN61`Rs#_ zbuAl6e$i~YkZNZE=jCWc{B1xD3HjGshO*L?{f0Or3>FGdNJ%+jdu`K)ky6A0L+TRS>ClP*G}h&i7+oxikowHah>^F+^9z!GScF_eHCC0960j{LIr$)s-# zJLnWpwAoYUiEq69_C%{8A$klJCux-x*cmX25H-QENpe;9@}^R56qUcqe;DY`Kj^2+ z3JFzo*_3w`|Hzg>qTj$Ae(}f%tl`AL^R`~9|pqB!iW6%TUoJq-}yMo8}DvEXd@$qsM znk{$|bkg}Y;l@?Xf(vEEy34~O5w5NPq@7ULe*lJf8U#ygvCYbl=ZH@o>mKt2q+@xu zNXc-w7)(BmV=Gk-gdLVGN4IMPCF^C4MH$EreyE1tM8;KhVzTCBhtj zyWBD0@n5WtU?jm?(UZ`FC%cP)_g=kUIz4VN;3+fj?v#h&pl4tL+UT8^p6jotKfYy? zf9AQmy%~LUJij2^TZ-zGFy8-&-34D?JGb2jrK(|g+3uU{;t*?k#_w5Ki+@G*ZKRGiqm`3uWoL|Rmtyt zY&!aR{pgkv20sB zI)iQUWJnoLIa=Qi>g5NNSP;qv6xi9OkhkL_ikiP5-DlV5Nrh5jK*%@3X?;P&Q;ja6A{-+8VlVmxZ5%kPa-3(d$=uiOHgN{9(OB030%2Q zWmJ<(bUk!!Ubzt%^p0*)QP7+@n)vuaKpyDwmgggkY!`2Yh{wu$e?MWkpm1mx(ugk%Gf)mlu^NQcTd@Mk7x{U zpJ-nqX0O06irG_$WcdL{;*JW4heJSB&5{Zl=N|j~M1- zkU7#=qVRiCX+djoN#AT?vK5buVdk=YFuI3+7M@Q!`k>#h<(Em ztlM9GckE$Evb2Se;WtYMD1yaNB2cK!MjXA>)AmTe`cVPY z(I{ig8amWjsF4-N>XUuPCla*xhhmc3nopCc!mJ$IxTQ zOc%&(1(!C+uBvgNCXT+Mc`R}2Bb$Kq!i5)Y8yIFnq_~zjmD$ zvnYoY+2CzF4rI;zjVlRX62!kPgCwz4Z6BOw1H0#BWciw0;s~ny;tW}LhAh%cat?Rs zqX^%r8H2RLkJil3Iq13Q=vBxTaS_3cS ziLTCgR+pV6&}wKDX@Ds=`^SYk1yt;4V3T@K( zKq>I5cB$m;ziy6v?gQdyepr?a)O1`XxpDdy&gpkYi9l9ySk{J`LM*qne3JuXbx(=8 zS!boAS+BSrE$EQxa-WK36hg5xEb*2DYm+%s{fom^SYW2hL__tn#?kU-3<5-lbOtxXe6_U> z#LMS(^YGQ72QTV7;VZzwVHNOBb~PZhhvikQ_e0XIZQ12*W~alU1&`10WmjU@^{-X(WT@ zXzn_2gF*lT53*5E_wMY*HrQ-u7Bk0mJJQ-eE-(DnSwUW4j5l*96*6mD76#)*RX#*I%!A0$ z6yK>Thh-8P`RJg!JvLTWwXT)1pI+|5GDo{dNJa-I_39MyrC!Wg>e`Q(T!~km5{A)A zquCgHA27)n*~XyG$C$ld_FOC(y2S&QLkmZvhpw&~ zh&@W|*&z04Y_)1j>=mo3u}f_=TSS!FBu4ETLCo5#ty(4aRz=ZLv$T}fYX5KEuX&Oq zUy|dwp8I#*=Lw;>dvaeDmt_7*fYiE11RHT+45*j3V||}59221Yo>9gT`@jxh{j%qu zi7ZQrG1{1x8b}u^3pZhPFs`386)d1y^VgRZ^H`=}@gV|kg*vWWXVu4FTR`ySZXjA8 zA4MhL`s&2}TXy}lLEzP%CFbL2QEtYJM<+U_8ECAWDtgmT6*c5tAB-bidYq3XQJWZTTJ0Z9vKC#SlaU}Z7g_edtaiR$L%Mv5 zNM2?ug-sgBQQ&=tE@V}a(;yT87`sJE4PgWD_Vs(~2@g|~r2k1_>iiGj-?-dbU3fGz zXY3@+LEA69A-XQ0JH?O_0-e@@d|!w5xw$6juj_x(0tRtU)CVbU$4*7+SfYlh6V+Ea zDX93Q@7!)Uk*KSKNz&t}At*p0@7w#2G@!bTAvN4|J`B3P0?qoF3_AY9nj?45k(3`R z%Z||Geebr@eatA=6}j~VY+V~l(eepz)84|9cFdLr$yJuoUuEz6cn{s_TKNPnVw}9* z&g$~auvkcrL>kAE`oI~@ekiTwYXFASwW* zK;^PaTt2899i28kq`5~&u}*B?ZTZ)qj1H7hW zMG_)_?EY`f2@p)%b|xi=G*dSo(BG!{){&2j9Xyh_!T4zu+gkl4FM~PIw;b@k4ruNsy|{#5q0sFW7hkK&KUcfxi^xal(V9%Wq~T z)o_wwYe7GcWs>#S_5$BW&Jx(KHulJ_fz?_0zGEOm4clNHr_`S0I|FrCHC^!wJR=#lH+Tg0UNx?1BufZo+@(|hl~%*L^> z$KL#9Kl=Ue{YT=pTTW5aRkvRM`uA|+3351T|4VH(wxC?0fF^O}u1h9qV|tf+|2aV< z?h>m$x7S#oUX~L}4$IVP?qD~qG*kdJ2)oso2 zbw=KtZ9gUm?zy=Rfe1MF=H@`YP2#UNfSl>wCFaHG4~>uBY|A|il{R|vIb?n@3gR>n zMr09ft@KXCq;|hIDKmUg9~p42fqqn-S8Y{k|9s85nGUHtwEmI9Q0PLVDfHUJo8BvQ z;boLg&7PDJ1zP*a#6PXt+)ct*)-E$PXghuz&q-OIV05ES6s9`-Yd&;pFp|kD%bv92 zl#D0M*Z0PGH7?dM=Plvoxm?6f@1(r_aWPqZZB#_K61JUdDS5S@)0!XZ`!K2CMvg`W z1Aq&!PH+xF@SX|XOEwxDf=mLbWf%%83^tY8lk@Iodhn7;saQULq8OCb+HN1)O1M`e zYml|)J$9BWY&^)^1zf)?)BRO_N-o#UTL~@pmb0@obzrCs(^l%EIe15QEA&5r7=6w! zx+hzlI18Tn0BdRN)6Di9kDbyrD2NJW9Q%B}q(x2?-!zoK$cnnit3hRg8@6L;;!P?e;rcMBYPQTitDW4F5HT85uDD@qmTM^>GK(vl zV~smswk83gP?pdM78U0aSVo;bH9eS+qym3v?x2XwWX5`lxO8 z{ddv#K4o`;vLE)Hfk){%TVc&dSS)ENH~Q8$l(F6A+b@?@Wse2g%@06$*fKjVhsYmZ%7NwTaOJv4g^FRQS zLRLSEn_6kW)Vo;z*yXX%k`5U^P9|1e25{@mRcP zsS?r3N;h+(#|jg$Y$X-{AloPUoURWlf?n!8y z49-ei`DV$EmTx?kA7C%nWjsgy)-e%^oZ=n(=mNp9}7v~}N1V!i>M>LJ8dY4bDS!$b=w zOpv4OS}8NeV!E@=7B{M$o;}u}ZD-S%N@%o^A9f@)A5|&vb7g=3`0oStJM*?Pr|nv= z?OJ#FiUiFoENsfEc>dge$H71a5S^ovdl6?T6#uC-UCa_%$fjL~vc@LKQBW##%7U~T zXJCZGIm_HEAu{pUuC!xofBdB|j0oF|XjMtfb(j5+oKK-Bi546c2lyuD^+#8+mXwt@ z+LhtWUKZrz{sZg_VV!{0fI7fE(o(X>++R<=&RfomvDOnz7I!@a?rDt{20rg_J|i!aCaiYsRWhTR6ls&Q{xtNP1@o zXBfo=CWp?c+8k>5=$sn{DHT%^@kId4fvwcNr`qp6ANaOiRX%#m-|0}}Qr%|tF+2^@ z2u{PVuVDp@tTa9uFIp}R)G=iZ$L2LjHXV8}Jp2LXD^_v#I$VTk@9*c)O|ay;YB=Ay5g1a7 zGB+;mBX0Y%gw6O_j=p8HcfFPZZ=DRemLSYSyV7Nhg2?s+skY)ODwf(2jL+dF)QB$aleL=pNX_5MzjN-g4v z_%;;!0H8CW@~W!c&wG^?)T_rE;&ak?jOG#%8lT zuTa?tedXhxp2x`JMEHfhdDa^F+6ho+YF3cCG8dmc*wZY(_(?ZRESv(U-Nu=xqN$WP zlx%;l&bwur;%5C5p-OZe2{n9HI@+$2U=7x;%%q_zE=?%Tx4|krZ()jCY*1UVuAC>a zJA*y&fV=!`sJeI2FV0dj1JoQ+BrF(~xAmmAb)eYWE%&&#Uy4{M9t8>ng8l_b@>{y%qX(VqjT<9 zh;B^Qa-q`_5b#y458jDT_Ii?j^1y3iMu$f}{Zp8Rcdofmj%PolKBWWviKbDLAjs>G zU}2#vY7t;^?gS_DmMN1o{8P6CQJaSgbMh&V3h7B_Si&6PY@4pC#bfY|VYGsEjb|27 z{fzgGB?HNI$dab=R55Hu2HOc+18%=rC%;@vC$FATX0IwUx<~Apta}DhDF6BA_6CCW zdo+N;PbBKIbGN`~aPfYDsaTTDU+FL9nwS+;?It^$i=U7FVTP{dqK*5y*S`|~n_XF6 zy(cLb6MPC99>1WbvQ$L)xhf)D`FtD6JXX*T2bk9Bvif7>s{aH0W@ayvHG0@1e65$z zS1hup3sX`Qp$I=VZ!x%yc6VhH^g+r$M~zXrV!1g1B&oZQC-W^RAcc(hjK5-r#)ec^ z4%menLTa4I{?O}J)Uc{sjg%qN=Ff5ix65bzz?^S+B-tybB#_;(YKsGKVDzl8jljuQ zy~K6@U&JS?`YZH-qz5$xM;?lWcU1V4M45YD$!i0~k=$LT*jbz4>#rxq;G$29-$~YW_y8j%&xGaNvJ{UZA%NVxt?nYA3rL zpUM=!Oudzc`}cE-gohyyBx%jjglR5J`Wx1vGN)S-LiV)q;?*~0A!|K(h9>tS-)Is# zOk=poo5cxD%Bjmr2S%IyVr5yC@9|K_fMKY}NK}XI8C9r;z}*qgd=09su%wmU&l2TGf-gXvJcinaUE{51Z zfatxYa1D(5+cog6th(^L60$Eiw2)<>em9=Yo-a@`8c5X$bUPk|wUFY(%&8$SFiA)c zCX?sz1!Dl6?j)frqmessMHh~xE))fiZlwh2?cUbDHJiq2e2=EbUHrL#PCz5Zf$Bzd zU919aSBUgP1len zLB}Bzpz&{a|NQ3togeAMYwu(B-V?8Un~h_aconnP`yXJif=d^X!ILz)c#608Yvj3IqWSkJ^o#I zTfjf*-%H!F1ADGkayj_|5BehJXh|7LmCQs5@fy+E3&#%ve&r+tviu4sj30OL@bN@n=zeDkCd_OTDf!f*H~m;`V!w9KteIE z|6qgVbe=YOVTpr|SWI7Ja?W`yel%EHch2glG8GE z2o2Y9#sRGBQFj#VbG59Fzh{$?`#OlVp&8m^-C60c8!L@LzRzFu1a^+!WLsJlq&z<( zlK(E|j3JHqSA*&B&#@Fq0>NrY9CkT5+emHZg@^XILs+?&f*iem4pV(^?IO3~OBa!< z(nEe{A3Fj^&fcfz3M%R1UgHgs=XtgB^ZM9PYYQes-XprXRqz^*)QZ5k-~5t_DuN^d zi~VTW_C<`B&P2EO)0GF? zxje73FaI>`9`3e={8BJ6c=kcZ(y{6Lg-za$SXCZn0FE!fe(`T#dCNref*DojzbTc- z?8IS6raWBiiHE&gnwFPyA;Sw*Lv&<*!PHz?wY@nko{nOhNl_S<64$nzYU>`PAV-o0 zg#pIPWVQPh!J2}b$fu~~FQPTau_X;0of*PA5|UEO>->V9&F}g16Z=PVm(DO z_gJM4C%0M-uUT^F7AlBz2A-J@B1AXntWT*by#VXKOjy$0ZnvcCs%!JLZ7ayrVRx+> zb2X{atacL2q;NVNAF5s{g9=OScJC+aVt}>-O2gE%p}IGXICDL83#!wFF4d*A(qtgr zo5s$!>Jx0CjWsM-PPD;p?b%{WzAU&l`xRRZ?>DAWyRxV;O`XUF{Th=RJt*FS?~QCt z0FDxe;*~a*JCJ&$IVUClveMiTp@OqfsFhf($VDuO=7QR5mLApOI5k=b88S z#Js=O<8vx-bx+^6pNNW4q5Z%@x|o8+8#pr5Sc+GHK31Xf@EbvJ{7X^vAc(B z+67mRuKgr9CuKFsj}9*3$V zC;zr%2iDpf3_M?5HN%{}UELA?Sj$(ixG$e~ zY5f(!$_#&uYV|@R+~G{_;JC+`VQR=Ud%X&&hj*SNluKHEt`maeglxpaan`>iZmT{U z=uXfh$>Gynrh)FyRTb8$G9k7zeMtT^%hEA1tGduT_}P@VLo^pM`5^uGv~X*_U?#3~ znzpDvEqhn19~^A)`dC=0R1#YWZL*|-WpWTa8w2vUyoPHAcgBfG2b0#d3yBjAVZ62N zK(@GE{QI{NLtJM;!v#W?K=M$s(EU*h@bK>N@O8c?@8mIWr~QNI$3%rjWTs<|`^&-X z@=5+aJ)my@BTv>Vzp9xs%aR6f$5xOoQ=otrTN4_#d-j1Mx+dz2@Qkqi$QpNty-nlbY6z>vM91Ag_9h~#E-yS+5RsWM>lcTuW_MK|=e0j9}a@$pGKU5WVf{Q1CW?rW+`N*tODFevj z-n?>>ncvO@84n~fLxt&rA5lJq7unuUF}CBt3Lx!#e{K0Td9=?8mIl=g1imLH1Tko* z26B>jjXG|gP1=aN{h;s-SLJrp|0BG{!6cl+isY<2 zBWOjZIgRO>dFYO|AbzS*(-xm6&^GY)?w@ABS6(tNdc;C$afyO(aLuw;p@Y<~{0#tR z;U?#If_3oi3GG=UE((aeh&TylQ4M$DOf>U?_uvWpU|FV!4NkU-QfB9bn@71^Dwv)> zl{xCDQ<(fK^+4=>1ZT#Rdc&3%B!!PN^bicaM+auTl$^W@^H>~KiyK7Jwy_bzoWvEE zKAK72Aei-wUF004EQT;jlC>`opkALa@>LceTa)3J#bvd<(mH%W-WDr7DeONJJ44SUSPpO*!E|0Xo&)hI8lX_}Xe=Byr zmV~)$W#r3$fS!>!#l-EeoS?8C3{;Z-PdDZ^Zn{?$`FvBn8AJLSENabx_%bhDR zI;^>cZekIn&Z-{jZ@Q@Z=K?VoKEGWm=b7ZN_x20= z+>_m6V`yeQ11lucxp|NF-`@UOZw)DZQcCorweXCfK(01&FR01n=rTIQ_%_?>=+9nJ^CB-{^oBt)TR46Mj&Rv z^=kKMHjX3r?DvRTT-?#fYSv#Ojyev>ptZ~Q0zwxVMQr@))0rzn=t|&fPygO~AEW|x z<+%z{>n&3HHcc#5Yyoy>u*%9J;D6zi#9+Iq_E=4BU{lrzh-vEImSyeVn%UmsTd%-% zE!5uXXeBG8{K>?3xo zQydDQ9}dz8xYo<{=Bq5gWmM}s=TSjqb7i?a+olSAkkhXkq9;8*D(!Qs^_ve@Ipk#l zDE1TG!AZ^_&r$YOYUiA7uN4DKtU)Tdi(4{+Q##eUqC))AsK#91y2K1YW%O8b;;CJP zn=9cSEhz~|i*zeCC6r$q#lonC2GCWllHnaBAwOL%29_Pl^`7ThKKY;OD z^)4xlojZkN0Pk%WY|01LIxr*)Is}l5{DQSlY}zn)*d4Y)f;27I8lFGXtT!Jzky#nX zwBP4$xl69@VB;Qm-$K6%p{G-&;tdlgXj!%*hkpT49g5Bh{H5A03k<{A`3%;)T7AWu zj(Di<$P?sWzk=G167f4MYE0dYTD^+87y?KfR>v2ld54;=@}mrXO6A>H>!NODy)3*@ zHP+npi=)>%-8`BaRQe-1b*5UY1aBg(HIAvQ%%ldQ?WiaaM=Q>y!_3^1_ z#vez%NqcJ6t3@wi`A+_hhTv+`q(w&wBWs)-`;El>x!8=q)!C`Ik^A{lLp>H@BCPAd z1w$W~fz~dDENm6b=H&jy+Ctm*ENECmtPess&2we7=egDh?G@Hp=~W-IxokeGz1go~ z)^8O#%EZYHh01^Y~Px3nP%Ha6C9VK33C9QBnqZKna|8qD8;M_F>}kOGU{Ofw}(C##*W#wvm?3Xi@ifAV=ZKMg^?MTicS z<18{=nJFD5kTN-l7uhJ1X~);Esv0Wo-AGAR0F1U40)S>I?rGuQ-FGx6Y#x}#!DYP& zvJf3Fxu`xXCgA||K}Oo)1G+`|HroSgq3S+n3rCwOlV#*wIL)*GXh<{_@2T-BGP0x{ zrja{kY1!N!BE<|$j%)|`0R(nn?@nq*|7Lm2F+8Z;v7RFxJUw89^O=-O`aZv7{>;$n zoLBZU-;ZY{w74`AI-6C6{dKnx)tli&=?{pzF52=hyk#u8t7{^2?UQY<$D8o|EDhpA zYDw;3oF;n~AgfpE<*WmSMeN%Gmo_|9t1|mHfg;3P?K^eb7nV1FxUCngY-j9LgV(s* zety(4Q}92CSeCGUP5h?$rMy}38^^YQ%Z!8rTx{Gz6R-7~ z7Sy&+XAg`P=b1Dlr2PjlnuvG#lBQpk>1Bt0a{#1Q zV`AFky!k*`X|WjmWL&&L6yfs3I)xyITl{{a@}D*P|$R2j`B0f@NfN z?7qwWIu2w>5iXU8+@l?)WjquO84jLLcr(bfe?E$Eh}WJKJmH3k>o6ME{P3h^6*4Os4Yju{wkLbO zw$3q3`BF9ZK-=S&(0+wGm8a9EkUUZ(o-2d|Don+u=2EEo(u3~ob9%lF|9!*J^v|{_ z)Wz>Ezz+^p|2(etu4&`tVL3a0C5B*WR{%ZFb%cMxa4~Zoxg$dPEC&Nd)Q!sWCXAFm z6A;0s47pf;c4xqM*qYtCsoZ6KyPlAJktQ9|3+zLaGVwhuNfnue_?+hH$|~RPpxBe( za^cR3wsXyEa+!T2&@m^=4kk%uFtFO+5wg=T&VmdumYazq+qmuc4CXSR-u&&+x?*hU zBG_le^#S(LR|n$ZlZwIr`*C_a=|Ho`z6IlT9RCN z-X+T4{=R~(wP7o%C#>y1z^x>d2J_Ck^6o{_TcQ0|WovED*@ls!+1|0G>nv|Cn$Al(ZOHPF-2p;wTNsIP*< z%b`90KWq)DfLlCA+?5;~%6@dAiqRbCn4={dl-786*CI{_wlEip0ovX41|B7S3cd)^ zA*pi>{t@_Yca4tAPq#<54OK-n1nGmCB+K-*&bG;w3B&MdivtR__Y_~LTooC$6v1g3 za!KNvdEGzNB6fj9;cD-5`Dg+5;=;$bnP3PWo?N}V^h9bdbEcVzva@9>y6*t!=Q%O` zo;YtEQT8KG!0P=t<#vkMrKHGlkQ8L&)BNyKlqhl&N(7Q`wwzXfER82t{V?tEgfuJW zzjtI}m6!WAF~TluH!lSLP}bx5}QVH zLT`T)eBZaipKaZ2e)*)S2o z)s5xjJ+xTbF`(vpVSOkh)%HWlqeXbMO7Z^Qbe@%G4Y_z-EBdu$q#pIbzZ#kUa-~V3ydHDZ%rHe*f)&avUjpeJSfBzpiw@Vl_{t*G_Psz^zj1coC1R(SK z&vgtDJEuYXf$LC+2EOVR*&x;k{aTBGGf~|889)C65W5J{TBondL}va56Tx&c zvvHh}SFuNjuVVZ(|BQS*CfVyJF0D;pyNEk2lm0m~K>T?|lJ zy*^b30XoKy+z)5!Vfih&=|yO3ED7n(@ONSBhk@x55r%s1@y+taVM!3=sVE6+Atm=G zQ#FeO1~M3Brx&zZ#Z9((fwMHzjnphl22aafxRt}QfE`fiCkKGx|CcFCO<|D@ue~^a zZl!9mFq)X~;DxZcUR*Zzi&KB>-EZ-G*!b{gdTKbaAZu&!ZL@p@nciG}COY+;LXPND zKTSy`O!#1SetWxZWXOa2nomf`_}La%VnKRmSuPCZ`*m7fIwo@M2%cC=W{49{;HCD3 zW$rJ(yZ%&ANNrZ}AbFM@4IxdzO97KFU!Di3%c8$Gz#XpKWJsibHz=^wNuIMhzEOq@ zg7fAi?a*KhQjq3BM~PjzfG84{ed+$h-54z7R_S}#fk2!H5Fz{Q=UWZz)mF|pFB5RC z6eCW0qD7aH-A;Ip)@h3+|De`AKd+gr(;Pyoom2C;M#ShAqZ+c}zKL&j{rk@%%ym*i zYWh{alO|IB6ED!N!kf(m-0(Q~NxYjRXYmCaI*r6i#%>}RmS!<3zf#`p9^k_o3r?V` zrC!VDz`u5QGe2&w`8{j}{fVkIBcUPNCD64Fx1am5Chzs8=8r9WP%I@cn}2*lM_?aM$K zhrZv5N{5W-M5j3|?InwD*32%jo;`U@26<_i+|zTFMf0sJ`)xxi0frBv$^uFNs1N4v z{I(S|F<4hu%yBmna%z3E2mu-9E;`pv_#*+TJoj(45gt(7m$OW1LfRC|lnFn1n?>jH zq=r%0l|jesMlSTDiMbKSQEx#hW+_m2fsKa$OG}-+T-pDB@-X-vxwc+#UzTg^#0%T~7_p6A0&;0AzpHF=1G# zHlq)c7BwGzCr>0!^H|;E70{8Ae~q>m78iyqHNEOger|;Hc=@V(y)ZHGX|;XeM;q8Zt`uw3qi(=-NdVF8`coH_ z=a(76d2X>`Wj5J@7)MeYo$@N?Dl98?EGuNFNOw@uwT&=f3)8%+EUig`q!;laUNz6> za>4`ezSmAeQ?N{ixff3)KhoHVThlFSikR4{^Z`0J?uAGx{4nyZV48Uzj;!yoj#)}5 zIC>!2uHa8jqFYz!nb1~NtZi+|6vPB){gis>zCUjwuAk$Lus;be#_((_@EB~x2GGjktN9cobx3y2DLwT`zPx5>ty`oAq z+Z#D@SrmF6=yIpQ%}Z_;G4W4G?aI=#bfV0m%C5n@3V?rMSWW?8R^=Ej`3kQF_gX#h z+P53y??#w^PpgHbis~%oUsq;Ono2y!v8!ZkfKZY*F+m*2}zQF>4T-iO6B! zu*h8ukZLpKl7B4iI0psK8Mu-V}0e4ReYFiFwvEDex@J&RMGmIeO%Z zCvKP28YX^C)L3) zf=N?xiqV$i$`J|NxRZX6*H?-g~(Y@epByP-o2 zZh&X-ciqe*_tZk^M!C78q++uFU656jpFFP2jKJoz3QAwbaIXHO08`MgkbWA5QI2o*6^-}t{ zg>)sw*{QW4n8v4wunS~Xutr3Q>*L@UInHrq&>R~K%I01QTZwq9>)I$fp3R?rA8Sxl zTS9snG0iz$sf zLjkDy6uZdG7F}JD3|TsCldr3uvuzCyCcKUFbDiAvFD4%UuF=QuaKt+QV9(nPPc<>y zt3SFq4HMsps*m(voV0pe(^v(q$nE$fgny5)T`=uWV`U|?`XKLtusiUuF+h%?4x*>O zIaRqsU}2gd5@`}iWMLl)d80pcl-jxCeI?sYioS1zf(vkdA&r&&Pz_H(3IECn`rEsx z*x*$m$yG3}vT$FzW6!fPhe~|UT-2W!4Y^T&))?*{E{e(aNQewFYUIi)gV7o#7pF9} z`xZGvP~n*O-^2Td$m0KLjNEAc)mXpSpAcltD%x7T{qB7FA`zgvxpJ&UgzqMzrW%rM6v3sp5(3$hx(YU<1_ww}S@4x@+NIow7^F6wJ`X3L!?Nbg@7HGzjN2XeNyF}3gJWHWb^wlVdL;;FC~X~ zwqCQl2+iLY6Y!!i(dXLMLkYcj)Qt5B{4r*ltu8x8x0oP-zctByBg>J%l%lC1 zp*7ShVF(KN?U_xgvIi8!x{?@YAi6)~zJ15efa@^1mxhbC@|GM^`{GKKk6W(l)^ZRP zhX`51Lvw27167(dv+4yXw-q9MJw&>=d}yEaL}p5IuK?CRFkCq!21x>VMcqHvj6;UD znKGRHiQunfX&#%KFPE1K&-(Hk3U28bKDT_p!(wha5HwO(U*%Ry%tkUVqlU`D&Lk!x@#W0#;J#D``Vi(p5jPa+aJPY z4z*vXGz+FOFLy^^rse|z#@hcTA3p1{(iN1M8_ub-qJ7qSbL6-qlOIdXn5=L|;KhdU zqN+CGFu7+z!ZtGWMnOU6wcA3F?G__|Nm2o{Bp~wCfnLwDIzrme%iT7+N?6{wRgMEl zTK?6IOzn!YDRgGm>9}I&V7rF)ar*~76C;DK0`i%y;&s;l0mfs$BI-{iEfcgXtKAJP&;)5Lx@_WhNZOi@Q5lHLL?TWdW*KPVd&-xCe#La6{8sCM6dg?8(tZNqsQ(3?l zsC1Nua=qx)d218Isvm9ExarpNBfda!-c5byPm}Lc?P7MPVP2T#P#N|%ej+4s8R%si4>KWHQX8CKL%?gp}@ zpEt2*q7^*^(LS;0bFrqi?4I-34ME6>FhA<(NiunLybZN@u-~j_rBqL>N{=OCS4ld! zcN&iuZC=@PwKouX@-<2?OlKw9S=EVi@+E_+Jw-t`AoA-A(eWKR-$s{wb6sK zxmfu@QV!Cm#suJ6_isTiE{&|L39@;G+|(L{_LhPplXk%_r=MO;M`SQ_%{8_`;bZpb zdh2NVsJTVD);xy|AT^a}+t+gH17UIJ<*c^>qSYA9pQhw0ukSuDsri!t{1yvlF$bV3 z6NpaFCCzwMk#DJXJnz(M5mj=gZG*{2kaMo87gW@XlBjO!>aCmk!HBodwDzNHpXEB# zMm`Ra1oh2TYU>MDB@}+J6JXZ3v{N%RZV)8Ha->H-@IG%v7=LRk?*sSG)q%BSjWZG_ zCyICJXQr>Btt9c?)nVYIMe^damy#8RIOtLAk?I%n;}=6E1bZ?+V)iqs8gjs79}o4Fty5-i~qcvXbTmo(vCB${10$c)u2yF(g5`b_&^KRo3n6b z?Joimb>p8WHEHVOxUIqutzWLg{8r*m-s;SV%_qOCWLZ{7AjSaWp}2QA zr>)^-{Ilg+qvq~*+{&}tOyPj&F7llI^-p@s2V9J$xiUq9+dr52+?_bCIy)a^DloGV z0kkB1tAQ>=XeP2r6+}-E3E#X<_k5^$Pna#6V$ zz`)y?MlzIL2Xwx|bkhqYql0d!aubxWSz13TeC0m?4$i~ek~c2UXw*a;L#@03XHo&9 zPk2h8%7@KRSQiAA_oxt7EYr;M(>EdGsbUQ(7MCW2M=2$8Ybgml8&(!nEry@aL})r+ zD4r@F2`b<7$to)PHIEgvrvqvVJV_!$npC?I{z4NNd89GGjAV`xNooL}pWq|3DfxcI z6h~%dlA0ndQ+%o$kC;_#=Njlfu20xGLrD<=qZM@Fc4j9dyp8?@)+HgS+87Tq{oOv~ ztTmTSQM*sCB`av9&INtzP@gj|NOpV%?mf_rr0x<^TvDS z>hAE&8O!f3&}Z3UnrCP8^KT^ZyuLv!tAhLOzk2Mw_pjTzFoBlc0=mce*lM!@q6>vn z^2G69gcsk{-S7!(BNB0eJZIp6CwL<;Kp^no_L)Z*^5A%}F%6GD@t7y188Ass^1iD` zb2Y#JhpDB4Qllv3^_f~v|J-+S|SYyNtKg3e9dY-fEV z@W$)PxIh85H zb=o}2K(u?U_*pAJ&(N=;4+6S1ucI-`66%7;5Q|E#|~{y6p#uvlp^q2wQw zZwU@#-gHcSoU(Q3Z#E?zER{R;ZPdZOzNxU9?#jnjz3hxFH!x_R6 z&Y$`s4PC?Uq!y7iYo;zzS#hGZFu4X}WRrwj2>@j9(ar&PLnP#sD@d4}0VO*gJ$TuA zNSx>r?I_2jpZWYPP>DUiY_nT2teEVzkQ1Ywnk8A^u&Xi>N^;mHF2uHwK3;<(Mkg5^ zvR0vfeLiXW;XzQH1j4d0ww|S|z~j~q1G4V5nj%#}&+bE;7Tili)n|+qcZ=YXW|rT> zbXZjlSTZ2T4C-t|$udqg^jzVWf;Z^4j3E|v-%hfsOr(t;a2Q06BaxFr$`F^=(Knn9 ziw81k{KeR0NU6C!`eX=JVWoyrcx0*8q z&8Nwp^i{@!yvoj8e)DTqTmih0wfU z(#q@B;X9!vp&imeUgp*w@iDB_70hVg?m8uiT^KHDsov@MK5;1n} zC1(RA*ok@3nqOGf;lYoe=B!f>XWhxEMCbu3y#aQO*wMf+Rt_;2+;^~;1r72G5dhhp zOoV?f%n#F%hE?ZR*c&bxyhvAOSQFH*Yk#ZtTv=lDYt65{p+k!rhY4G2>osyES-{(6 zmrt@GVqj{E-%HE&g z%Ch*p3m2}zRdpF3io%6c7pNY(S*q>|xe3w@lAt!}mlexuZIL0FIDlr(ViiDmt$#HJ zU@E&PRuEa9uL4ISZ){8M2xxKp`~I|eyU#Hpx4?GCLdQD$KfoP94Mm7g6&&u<7Kj&C zt5F@uKj8|@)MAF{nN-3Vy^vvrS%cb&>V=Kt~Xl4_CP zOFZg6;48lUAwe;!?V$FPnatY#^jmpXXE*pN`MA}t6nvgJaPsSk@22x}OGm7HP0InJ za-7-)WV(Ar#qXu8*8%e&SV%dmUzhH9!Z6WZKTP##tucm{X!jT~K5vu;kl7S>EX#9) zjFU1MF0w@jP?Ao=biqQeH;1T~SE&(W?+!w1=f=AW!@Wpk>T81nOsUSxc(8UHuQatc*; zmqIZ>2L-eG&ZmuIH8c!@&ofr^HyjNiqX-DE93G_wqWF!aSdS@AmLOy9fU2d-HBoR5 zc2a^dZ-b!W=aki~WK^=ZzJVEiq^n#`&UiRF_|=oZjuS&kN!@w00-N-SYe(rSHI{N| zzsNFE$G&yM4lj^#SfrMXP@*ID&)^p!G1S#CMPKp5b0`~mCb0DC>{FVf7X;S#6!D zO7&bT`D;v1ul2j#g=L!W^S{OGlXc$J=(_884EQPYBfT&XCuZN22+@=vkgmLb z`Yeqw_+;oVJ(A$zUf=XT0R2D$zhDLsA|yaRDYh>PvmMz4C>|kIKfFlV0nXfT2Pe>H z8R-Sil9wVi0nCy)7ZKwA4ifAPf&fyasbUKl60*SDo$djPV9P^F@@1tP+E9j{!{Ob_ z2=jsl={6}~xB!8;pH82o36UX#T}(kF+|8zJU~mL&V%!3v+(}~)000p`lmoShyj)Hk z7iug&tuJv!4K!6%P(vMWg0dx zHxLYgv})3Jfi}cE)j|->fsteEH5&q8ffh5k=LVfk-goW?#Ra!Q*u?bOAF~#({#|L? ze3P`PEzRd!rmDXb{0TkI={b#pmmUo&?3ZkZtN#E{&4x-IpGAnvXEJKpkj(3Zqk0(qytYgYc3Bs3O~& z0|)EQW7ggJtaCs5D5jG8>*e83HC9@ zC@T6$M_{!~Y9qP{06>!*AEmB+^M)lk7_)o@K`l-5xYDx&#{g<4VJ zhgJopUC7GdV2-C#&Sk2AQlOGxgCh2|?0CP=j7EADsgfBF21UUKVk3-5ZG%(k%~M4k z%S~Uc7y1d5yj6CKjV;2R*F2FeEV8Gs<&WdkkU_X0k08z&AcF)DM+8T|I2`+7y*|H} z{;zL;_vg4VbNM&$IR60mheixo?(*Xq_w~kbf2XhX=)sB`usuHhxyK*Z*P{k0bI<Q>6u04Ot{W>sXBb+vI>G%3`{@>T51~C~J;N#cR z-)IN=WDmcuMhr&h#%F6a6n-A!z&OslE=wvD~goJe}##tRc^yc*zQRi z&fANTKIfK$Myj$bvH*MpIy|7amC}Zbl4N z`pIH|z{$hcu1F&?E9 zXV$t^mRg<2VpNt@RbdRmLE;IE&I|QZ8YxT>$tm!Jg(3=`KGJ-MgoZ=43X)D3AS?(Y z9Yau4@WErIbdJ!#6WReXBny*vi;P%as)s6|v| zNvaHIWKU4Bq+1s);D#YKk(coR1xO$(Wc4N43l=(A;=t4j1aH#@#&^^JBK9$kQw*!5 z5|rdi=+@07d~qZYY*g;I)BzX;vrS8CxGiL{O;FWnO+3ZK%+f@vqr!p8#ht~NE(j;g z7>3#(%G9Sur%{#NstKmVmNEnY5W?8|M>B@ANmDaPsUb>gj0Hp;s-cdfsemmEEFgn6 zAYlIhY}VB>JyTRGQ_w;-hjQK+5RO(~4SY`yGEPe17IJ_v0~6QOoa@%5D6i&Y+H^_o zfLltF`Cv&REf|J9Eh+TPGAdVN@P!4ysATEXKqb7JfB~5}GFx>_^)$218K<`*V9NDK z#%aTXAxd?WffOzZx1C3c_`IuwY)pC@nx+5By zhalGo#S|}nBleRhCcSs8^ z)bgny!kVboO9Bi*RSL0ZH)2SEX@iAQ%F_&$b*Ze*I%*Ndk#N-*vH0mJ z(zY_tVsC_(P*)n-DVaQVkh8O?J|!@5=JsZ%u`x@ib@1hDX}WS^?#V;T+GZ6Z2)tNM3+T!HJ5Ep ziWy45igd$V5d;zlo0GIlZMt?=;i%)DuFmla1qO~NCs`z^Gweh&JfU*Iv9(k#A0v^1 zz@lB$wGjFgsscgO9srYVj97R(j6lpH&WeRKolOz|({fY}Sx1v^1Ym?a4Rx_m&s|#6 z*3U-+1)U+lj|9C`f)>lhkSHlAA)Lkop&WH{mTHQV7EEFfpxL|_dWx<_RYJyopmN2B>Nr^%y zP$O@0Ma}UH|&Hx0~R(S4v}*on6!A-Ir!TMo@8$nA^Z39%2aubA!^?d7p%c8|soK1@0q} z{V>f)ASsL74bAqGX!-a*Oc&*;5=Lbx2ZvGN>}4Tcj$83yfG|M|!6!WXbn>ZaXc~0@ zM!?*eBVcxjiHl-0x+b6v$PxhuMfQ&#NHZdRuoGKy0Hel6)e02kc}YHC$WNl<052PT z51=nBGYGY#Yu-f1u>CyPV!E|yHi-Ph+GKA#MXqmvBU>!2>lpKS+XxDIP;QfgeODl% zKKTbeolI5SDA*Hwd!4!Q=M~jz7qN&2<9Q~)&(CXPY%@seBP|*67dx_`xgKMWW*`7a z7$XFZat}hA3mI99Z4!61`%K#i5g?uj{dU{lf9D;^=iinpix}KDV6%Sd3<2Qd2P1dp z4_r2qZUB=TnG!es=lRAZfuvFpC5aMXukkZR#uPx~>y23iDfP>opbR&F4>-orgT{0A zQhH2DO+>_#2btjT4;*=si0`XaLE6L++P7r502q(TcKX|kPUy^vo|tT+WCc9udC2s} z2_Cu6upKo}sDUxK{bR=49(~Rl1%%#Ag$z${Jn7!vMD6p(WD&l^Pjdxr+E_V>FP+*iHFe*y?c8Z6vHhp^h|-L%<+O2g!>Y1W1U}sFMVf5+-jJ zB*aJQ?4jxXS~P_vT-y>$)%gW2F(`M@63nl65H=J@v9rY!7RhD|o0$hwDAnl880yr3 zHX0%cV!XiEnYodMYE$Z!7tp>uSe3Y*)6MPrV6E`)W_y>!p0kojjDapx)dEG_pq95& zIdakr_>9DvOXQYrNzO~Oa|>3zbOd!3lrWPaT_iv^k^wxy+DQ#grmoD(6%7@#I>?ryj#&O)s-3t==;~nkdb(E(e+5N6lEmQT6p*d}J#RfMXj*Il z8g!TfU~mVMCVWmYeyR;hj0K6+Bzd_O-qwM!J7das#;;(tpTfVyCa3MmTDpxhajCg$ zKG)PyLnS?}^j+%XS9P{kP}I3tq`li}nrmfsBEH}$jUgU&>KV2Y8=A`oHpxTtEix_vs~^_%~c&_?^6Y`-?5;- zU8{1Gl`*WNWK@v2X&GGrqpC-Mup}{NV5w=jfE3x?#fbL#&u}35!$c@LU>znd4Y(kU zOF9Y#ooU9{hFM#Gky$j7Pggb&k)r!@^VzfXKgMQx*zsq8F!hoxex zdk2fCDt=1S4Z@zGQl)BZB@FBGk;xQrA({UGWFeS^Zk7f@aVyc8Rzpj$UnoJ`hCAXj2Ofd<@Lrt!hW9r0AJzJgA{jp zeSJ=NKAGbq*Z6%n=)sJRaC!Fs00|zy$NvBx{TMNU-S3}6o)7p(ukrpzB=lgw9;nlH zty^Na>D$#ZRa>rf?@c^RykWsz%aC@upE9;`2+lyqQFEC}S=_Z;wRP7{s+C}U{CNJ& z&L!kCxsOiG(avRD)2%_nqYq;wA0YBSrXb_KJ*B;Ni&)KVs-~6fH4@17YlAsjd8rwQ zjuOW!^HC`Ql%4E3A6~w9`$yuwZ)~bx!g&B$f0O?dLl0d&rh}>Cu-w1t8L~Qw$j8MkwvEmtRs1E-C6kIk zT;r_El4fT@nFVf4c?3xSkuYuyjj^=LzM(Y0XCRWT0d*7F5X@?2+#QL&_z;TX)Y1uj zS1U19rUQ}5spjbghu6yIFeP&s^MNUA_paQlFK47*y=c3ws1X4q=PLb zUBtA*E}#sL1Q`ti($j6+p`?HWDODthElt!NAT*1DE)4ftJYhVZN;L!KT7B;MmZqHq z&kRCOD1Q?X5|{u(xpF;nI&E5rjb+OglTik?RhvwJpiatS*mcEIJt0oZD^1B=MmHK| zi9f^?-Z_k3oto)W4Mg>dDXHDzLh(mO^3<$BHFpU^WnGnV5naP`1p^F7ok*JQrK+e! zZ6LCWdJv!UD>nt8g@8ou?+UDCQPQ0#sZ~QlyH)DdACihdkfirX1PCVr7^a3*g4Z-I z?C2%BO*5ENEM6*D;ZXGK`&&76bLeDa!0Jwf3=)&8G>NXx#X*u*nv0>gkbmwtK&?=w zyu~*P0|A$&iW#5))gAk408NNe0Ryyh4HOU>YDP26%^ZgzqN)88!fqO@M>s6`(Q&2|=u&Yg0>RE}_Z(qHVN4cc zG^(+(lO*lDVL$Z~N|j2^XsgbeE}%R%p{Y`ohGL@cro)LC2Go{{GjE!Pno&zIW~XdZ zcz-7YNEZ-@RF!y_cJkYrq02T)mBOphrYV|W=qhwhjXgCa2vD*^DBgZDWXXYtGFghv zSX8S_)j|zGML^wG(n%~_fu-66C<2%O5HBg6Pid_6^l(?LL6WLPYAU*_@J%~-!N<#? zMJgbXSxOR~E(Tfm1sy@D>GT?ys2sBuG^$mrWg4UkVk873VnJc%U}ACgN~>L{H9x{r z)k<_@r~>IGrOcNELkWr4Kqm$|EdgcI_K4z&irrePNQoRtJ3>&v3ri{q6a(O}+$DK3 z?5pXXq~)?=l_gbLbrVP$Rmd`+lK{XWP2`i}BG|0WXQ|b$&dpMbhdt()aSla{5<@Vx zfdEdEB5;Cg>Pu;$xHFj{tEm+Mp*|FdDZ-amLYxsZ9kK`WBQDoQRtKi3<^KTBsCBEc zAgcgCUx*bT+&0a~CI})9AE}r+=^~16O#;DL2U)h34d7j1Z6pwE8l7#LNoyx;8glDT z0R_shTxYNF-3J=TOApbrex?QJJ+5g?oj8Ad(3-5&+OFKqmO*da2XW z0)Ey7?!NAm22P)G8M3z+1N6~lO|DNWK42~=&w0CUsASxLCs1Y8kf0gH&g zk-syDRVt!L)F$$xNi0;G$g~UCfg%O(gvU@-(9{yt;z0rymOA8YtxL0yA*E0oVuP`Q zt1i*M8P86I20#tuFqk*~5Cyol-#kS*mmv0nNPrKuf&FiJ-{dfx-0BKQ&_^Rj6FHN@ zkdg$fpfj-mI{NHP`VT-lc@||rg*O1n0K^^O&jLO}5T31?V^9Q^9D8_@cH_sm0Fq1= zDI4u=le76sMn=)(A+mFhMhgynr;#BSNfH#qgJ>XIV0oTR;`>_>DpXRsK_+4h5qa3! zJl}#Nka3{|qE;DFyEdwV8N9>PpWH3V`ho!3Ip?Q=Ai!=dU}T;r!JW<`xe7V*H$ShR zFgy*0Hp*lM5Ka`8+r3Ya`VbgrB~J~UWO{U>S^(N00APukvHt*F{{WDtK{od@zlk0{ z(;ZUG*oFlpGpi7&LjplKmAwcY-~*G4dX9Q!*cef}PS+#JZKNM)0(j-oQS}2er)d@v zAc6Dtush?iBa%>CEM&^400l+br9lMcSxMxM51Z@KWH10UlX+7*OnHr_K#)(i8zc)J zW>3^uMZp3u;@00AW2Y$UlIIMoow#=125?ReBWz*)TO=HiPf1__K*GgHi|RJG5okNe z_7^t7NwAIugIm}ebKv-%MhsT!ebUDAM!N$=Cx+y(0SN*!pl*C;f%tbH-XpH6fI$`q zOGJ`8cAH)&Z#TaU2Rfh_2V$eZ-sblPXM1iiW2>)AWim}v6{A&iLrIKE^2kdF!Teql zZ;p>byboT zoyr*f0EtlMIHOV+nA14}%2@e{>5ic#S?tD0<486D4nP9`0M`$(r=?XzgEY0lGA>Vv zFgGB5aP&S9G-vBh<7)j!`*|98EmZ3ypauDX3HgvPrzH|7)Z;CN#z6F$=`>AGP|jBG zA(ntvI~LJ(Q6>Ta0Wm$sCL5o3muxidm;DOHo@5Se9?S{kpQM(;a-@k-g z&ZD-_y-#qv8uDw6J0&I-zU8LlQkt^G<8bmuC`h}}#-xbuG;z8wnoZAU>2DUl;g?qhB5zcwQLh`_Zi@>*jRJG9jFak#e9h?+H;xoHWO zvc7N#aI?FkzdsH(Yn2CWb$k_ids9hMRcF!lb+pM( z1r@fY8XJbHnx^9ftqoP$?vuk!LlMJLtd$aB&N}X2)iYUEbf(~joiwJ}ROvNjiI!=w zF}WaH4d!w*Gg@7i7+AQFZ#{$!;>Ja|7L0r9Bh%CA>7Q@RamU}=uS3Q=6bA#->*@J@ z{eJxPV8sk`kE!o{{ZKoUbt`l{{Vlk zP1(A`kat|XQ=iZ~%eIqUE`8t_; z^wF4xG+6GnAeB0zR$9c5gkJk%AM@KeQQC%w-Oakm=?qRDj{g?sXF-4WWl<<7^}F z*A}RmA(AxmunL(cb7j0i6O$TBPYba5jtLn(XZ3y~s%eum0F!eh=rXFrSP%uppcuyX zoEmEHsOci)fEWW2sCO0eTb@ogT`th9Fe1p!?<}aS?<}D)zF60Bje_n++`DA-2XgdQ zWdUs>+L&FPq9uR?p#VX)mfGauR8h-0Awkqatc@y~tf9X(&Z(26&49iOk=&M=R&i^8hW6;x|b zT}Xo@5p$@6Ajg#i&D!H^B&w&Yj#@ZUp=Xve1cDHENmA|tth^U0iusM#B^!*KbnvN8 zpfrG~t(B32ShYfI3Aq*`4akm3IE-o3rt4U;6ju&4k=slT;)7{u?wBM&f^aWlv%CU0 zMMW$$^!p)ds6Jv@N|wu|T`?J+u6$xS3Widn7~I*Jl%i>XfvKvjuTe`oo(j4V-%)@7 z69f;gB4+a|P?t37)Ov-OQ92bQY-!Y!qMbRCBc+q^y$(YBvaJ zV1Y{ym+-dAj!yX|jo*99!FW{}yUU^qij0m`*fyp;l+gi@nm}O2?8;5aiGVRnUFwu- zf$4&ZP^~b!syi_F=d^$bMPRTJNF}X>hQkFP>eiCUEEN#b)kJ^5>K*kn3zgadFv>yL9yq+>hc@*^U^8mS?@4rY;sGXg8-;0` zm4UedvCmbferaW&$4KhxWTy`*#;A`fxs@VghTjQp7DeN5ZR{AYU3{6StkM>vlq|tO z1(fQ7Ovu!1K(PmNu%4sQWla?g8e!Njwl-m>Qh@*%vnlofK*1)e%~17UD2pL#UNt59k%I)svpif)A5s|eIJ zNZtdG7!6%W8g)dlhgZ@~^!Gy>k?n+3%oXj_6d^1e3xI6E z6EGUm1j)HLP4(NPjTAHq`w9U?U0q!&e$>dN*wB_Ej~FQMl@z|x0Vg>qbO3;WfVy6z zpNdI6hsfF^gYr0OYDt$OTT&vd5$w^-b1)|M!&UArY;nbNs;G=4)e*~pWHLNbra+Iw z+q6fql_648nHzb@ULU3yf=KwJi6onTSl%{{Ntn3A4Ao^&2s)KWjh1b>JR2F>+~Kp_ z?&z`7+eE7XaWvBIV$A`O0)#>dX$-2kV%|`r&>VF!X_!&9ND)03{h(OcA*@pO`$K=wk%>xt^kDo5lU1D&^ZOKsiFv;~*A1fzRL99XQH- z!5rAe+l{|SzR+;fRwYP-aRf+#f6F6tYnbu0Mwu54;bb^+tX)`*%!3Vpcp_lT^Vl{Pd3a7H~3xda>zI&V}4y}_}7 zC2e7}eQ=O>jmHpn+iCjjVs<8QD+N5V4a%VSq~MGzV*m^Qc7g!P@Hx(L&}D%EV_6^& zU;sIZCgN;;{$(sg057)I8}0`@$)A**4pPz?0d63S)+E7WkqxCH1x3@!43fzP=(>7)p_ z14w`sqCA3P;^T3+jpAm9;PXJen@HR4RaD|So4S6nX4px@zzF$e5@f&>`LIUp4Epu5 z^gOgvM_>a#a}g%yAd+r-V{#zh#xdTlnAGl|p5EV}Hxh4Vxwr)TVn!%)4hRPbs<`#R zPzT{71dcuU&s&OPO*K&#oAVLI89tPrbkr1{;jQ?*j9K*1#6+9nu(^7G9LK^>mbtb8Swo|#!>qheyJh_Wh)LXgRo1Q}+XMB8|>sJuY7leim67;jR= z;0qCP7d(%hxC7@n5vjY=Pg2uGM+@C5DXF8Qc(EK7i&Y#-)73(_*%ylJ@ySmx-w59n z*~mS2P?G{!ffll;6RAPu&B54M?-=Y%UekXDBwo@*qSz6#-C}|1>i&FE*Uuyn+m@I* zMvwCd^10f5(KkkogC0RfXxVVNFr=6y2;7UFd>9f3ztU6nsroSqQJuU7m3GuBsU-RqK zae~DI!1eliAN3#9^kBsgf6V=TKacux^ytBiLHs_v4tQ^;*kJzvc<8~4obmae@p@F?2l7@XtyAMt;Le-B@;r{|uG7|4)6@$2ir{$JilMhqc6 z_U~<*vszBN;>s?XntDpdv1#}vQ(0d6W6^TxuW^ zh&QOfY(J^-x3rA5S@TtrlAQ`zYp6u6H6#fqX_5dQ`18fw&h$;(3ftDcyXrf2`5N0( zS0&=+UMp#|Tqzx?VxV}@q_N#J-FD$T0y1jgf!NO8_YZ zDtdh~B+{!v#o!%462@d>)qN2v`bR}F%Tk3v;#CB>bzof71cj|mve+AGV`zbdR^P8- zwbWW|*UPnvd$m;d%S8oU9epy%s;h4C8LhKfwArYV@dP!%h-f9NkLIeXB9Vj3_}eqBr;cDC_&XQ%WFZ#^gV)VV@;`o2+~6UBsCMLs|T48A%U^SQ`IC+ zvqG`dVVG3Fpm!sm?1xJ!YqK?XrE~c3v0%COnU|ud~ z3e?P{9i2e~Lqswmm0-&-w~a0!osF@L9op25wppQ}xHO?u`0wIK>^CS#TM~$aVHr*k z5D8#9T^iI^<7J~;P+1N^X0ZSv@6rq@1S*aQ7-q6oA`~@hAV^&+0A6K;p<*scxsw87 zO_m8@ou-Ot<1$RlKVvB~_?ZnQLm-no0*+4Q8Eg!N!LiD^xpiO(V{HxHs9l_iu#bD+ zjp1f>uT7Q6>Hh#4j-Hu?O9LiM0S)HXg)-L9OCw1YLp*S+Ej%-^NlOq;LJ|b%GC?Ro zaNeX2ZZghkv0%~^9SY>DY-UBZad2eKjwceqn-5FBDBdr!sGHM}Gx-_6K+91SUkekTfOn^5y z&gUsDI)Q_AH5g9ofh6g3y1}xA02u<-$7^0*BMFJ-D3hp+{>{Z)Bot-v@a01&{hVWK zG`S)~!97kDwCNy|+#t%GV&iL*BVhtsCJrl&62;~gRLA7;}XH~=Gfo)ZnRlhB$~)>PcHhHyxA1QDbN783wk3~g*fs^p_EAbbg= zeo|z28L>AlZa0&F4P$jwH>!s4ruoZ(tfQr4ktAyehZ`&?7xu<7C1W92*J~(lIptUG zsAEuirPM@9feJ0j5=q;{VN^gWh)D%06lM%W5=#*?wDygOKdE9`_Nk_hzkOXq)5cJv z#^NYM2uipLoUEBSB;}ZZ19}t6Qp|2i5vD9OjsOBd7ch78w8YJjR0Rv9k}q;d1}-F9 zk0hQ>8#V3e;u6aP11iL-9oV}CW?xZ|RDy6aSd!jsXRAtd)l@Q>ByMDo2@pt&07$gl z%*=s|^=(9u)&P+L)3g9Z-kTHM z7QN)Bjiue?c={>p;)-UT=JtiX8>d|8;Jk`w2Wlr;0}0T0%VA>fC&=@MEvhI z=guE9ee6guJOStWdB=1#=4A}IR~S}OxY|8VGB&$y^;N*n?{IOzp``46)L2?%9!~rl zfgV#a01_{-F$2NBo6YBp3Q|$*a!M}jHX~(6!}42h(s(0Fw)ser?+|6Cx5pYR)9r{jS0SG+GBJ}Mu?xuC#t6s=f6Y<_&ikVzE^zA%S zNNzRhC1N7E6!ywpvQ<>e<zyVMJmJ7s7$a=~O6nvlM8mnW*w(^3qAxSPiG)1D)@~ zIl8MuFIuA!+MpvzmS)%pJoELxBhcq=ED>65R8*11BZiWmIAT;73W$oar>7t)g#$jh z!T0OZvQz@9C;$K=FYE{OGx}rA^R?uVNz~0ZBGYqugL6OA3j{@rfJqoQCnt~wal!T+ zeR=lxy4V5WMk$WxoEW}kBZ(gaX#p?+K5TmrQaImVBr*&wL! z4ZZwDvE26<*XE#@%T8WE*NVqbWr7ojmMGbLjq`X|m6!Hao>$?64w6|Un6y{@7=OtaeUv?%mx zR~5p7hN^NTiQ!tBiqw^uNJUJE3^6Qj$nv`eRZ|Y4RwwZFM3E}$rU&s7CwYJ^xjbUd zjY?n;(82)Wm>FNBsFk>P~1Y_Ipo_?NQ zf79O`7%`@K;iieFs-8M{V^(P-nnjK^P`s9BAw~c#>&HI6z`23H_s-bl$M^j|PuC3( zyZH`x?k7xQEAO3e4u)mw5FibH+e-oOHFZxWv9AXu51NXccQbEBhLLt z)$8YTB^Zq-wu*|HY0z-QP^(S*RO^r)o123p#y43XO{J2c3IbyFHB&D2QJ~eOQkW%y zPzgstXumRyTwd(5K@9}A+hNl3ExM;tQE97X-pz8?h?2#sbl-7w%#8H6jVpYHSY)yb zH62Xu^)F3JBT6JaRCOvdXwy*w5lW?H%Oy%@G-PHdX6TYtsMQP&BS~3|=~8ctXV4Iq zWOG;+T1KlQCSJycT(wXOB}8CWpmrN-VG)M8Zog_9e|i2I?Uf0oESf6Y@s-;v!f0D2 zptN7tLe@Rh(_QUUR^wS;f6&^0Qdb1N+H~E*VD^c{MG`|x45kjW8634BnOw5c%h5`C z`YzdZWvH2F*QlZ+GgQl?FxO6tL8fE?qDCrf)NL8oT9ujGAzqQK4u-OoAQoT(RVq6f zz#+x&k5``&KLp*e@6^`|<)u@$z0i4{c(vA^x5XrPXGtH$r`1*?Bs4du>VagQ;rkn` zZtGAgq%kaQWA?B7KJ>p{q}j}_pGozG(^LMTLYQQ%-w{maTryLxl|douK(3^R6&pZ8 zkFsClH>~}bG_tjc^>0N3OL}%@p$$TRHcK(3s%6n!R*&M>s#C`@l;pR3X5Ei6wO&k2h7_(W|+lQ7mTGuQ^s0S#DVkotomQ5`W|ue z`MMorN~0jJmshJrs#EyoZ1j=PhEhSaOX`u2sJ$1}eKXf`6mxkx?M-XZO2Up|(w$8; zM5?RIRVez9=^*M2+AV~hO=Pa-qMf68WfDM=O$1;f#z5tqc)OMJ69P#L22UduokghH z)G22SfwTi*6E-a%_8Z9FNyO(JBhzhKRvf5u0r>$7bKE@N!NH$T>nEO~G-=ig-Bl4uGVMM1!TZd9lSh zP+Y=_D@Okg6LS=(c_QPSa>vayTHQ1MA5=^HtJoT8^I z9C50~d=QMq)weP%i<8vK9-~8}N}LfdToBaT80HW zVijZrFd$Q^z>-^6d0-%jSyKZATi(5^mPAW+LIsvtmN{UIGu0j2V~_UWh$10XBtBMl zS8?mqkNSmDR8wIEj+Q|>RS@?lb%0@c)aQdA2)jU&0}V5|nuGPsH4p;=(TJ*q&rK%wo~%mG z;6_*<46YTNH=U8NgoD&@-BHs6vKSJk<>Z(iAY90j4%~)Vx)Rb^iCqEiRdj)>+qZ}y zdBSaD))ROsS4xRB(uN9pb$4vTPZb<c&cLlRMsWkxMweN00gi0%xa^JDLH!&K^7T8_F#o-}r9PQrnbqR`-FODBr&L7lZ*h4$Z}J!O;s#>BRrCdr6^SH` zBYWCl-+A+dZu2^rWRMdVhz{3s0!WBF%2iJd!kjS6GYlTBX`odz+AjhuV*7D;x#sw! zBnCE;Ncc?Yw*-OQ2B{l}!8&lQ7SO>Ykx_|3w5pM~5ZNPW1DqV>k~#HR0!RnsL7Q=Z z_1^eo*vSHBE(N0h08t`uAFZ*nGK&CRrb$Z^`!WOVDiyFj)UF?Ejok6|=?%!-o(~>R zxAfm^1Bvr<#KaSCG2_I6#`}FIEcq;^K&V+T0p~a#gb#jB2tNFD$r22C+KQZ=N&8$Aeq|M`o-hSe>lR+ zp4-CTR-*#{0K#{->tTUy?3zjW_+>l8lBP0hIA&0I9ErL2mpu<$aQUn4C z@B?_*%yS0|k}gRDc;>R=tg-w4}OqkjEkcf z1RaE(xtm^O{D8-KxRJ0t+zt8Q%!&G9@Gvey>}caSm6?Ks+m>vDmCg?#a!v<0JtPnx zRf?|U$O;5WAk6#RL{Av#B}6H^5I_?!EIe3}d5^8JCm#dduar_(Yul|OtzF_+;kOA! z*M`j#kr2rk&0FSX1JOd@;Ps*O46{_%o2anWOjG2F0QRx)U*a%rBN^{m%w00--L!#b z{{Xt7g2eBzB~IYR+l))ymYpG^jUyOcxd5D%AP@flRsj64dFPI|xmAP)@BtI=xW3x} zeE7aGS%ayh{{X2IBmwO|D@V+Z!mi8!CzI$7F_X!`=bZX`6Yqo6oJPRQ02NDaApqD) z;ejM6E$j~m=ufXFqXrPai2neFZrOZQ_WqkhcP4_Zn$1;HU8eN~uBE7NT59E8Olf7T zqMr>6u}>I|I;uL9lAfhiRl?(NZmkurg;|+7S6_)**A^gxEJ56F7C3FI3M?!cSQ6?) zmI5O4+Xi5cY%%9I;v@7*_x}L3HB~oG*W9Ulsbi)``8dRDXVo^^HQrfL-tslNwnjpC zy&S8I`Bah@s;Zeh%_u6Oxg~7MDyk{V)3!WNDp7n@E`;qycx66i0GyceH9-Y$ zaAXi<2!nZxk33>MT5Ux4f)59D?iTJAU_l3Qf2aYp_t>UfOHk3&)zry6)4XJSvc!$@ z(M7cGRUm~o1HZvT_wa>Ih6fGyK(t@I< zrgxU9CV?Rev$=#x8>2IATp^K10mxYhcMJ*1EYt+t2{Up&TUc?n&?EJem#L<8OAmqD?dE;4_JAO9%YO`?Z-1xq{vS_6#$OZ%1D5`y>A~ZH{C>RjV8y`X`ud-!9^cqM z_UOTkK+ZXAfzR8IOq^ps*P{kCR8IvgPc=-@!xSj6VTYqDPYrKbBipW zrPs|mmYNi0b=75(s__gd{6$XsfG|C=6?*UEBfXv7x!!4-;c^;!<)&$GdP=6|-|)Vi z6H-*i7O&BoqMnMPTIxIWYvVy=t202-ZE4yQ3YktzH};D=n=YAYrA4U4DE+oTXr zG#LsUkZTzqH>#^u6)EPIFe=auDEUWyM!<0b-bjPF0s!;!$C(iTi%Pbg_!1l6e>37m<~zPO`%Z258gA>^=@07r;H0r@ zB&Q693#1uaCE@mhu}519wXU*e0zKn8{yd zj+V89co#cdkx)qa&y2DZUj^zx!V@fPSSSJU$6iaA$xy7o)TF6U7SU3XT6%`gu19HU zu?!D@V;0B)>Hb5+sQGmMZze zsgXpFpALPakRvErhH=i*0lhw=mK2CBVirKC@UwI9kq2Nwo(YUTGnC0aNKiop!O*?H zSVXCwPM`;vBL;mZt?H-)!(AOjasrUNGe;uL5sNJ3!U};J^2B2#0K;%NDWau|1`LEA z;NXG^k~SA08`xiaS0pae)TSk5IweJ53DyfGK%kMObw$hq028&YaN0R-1!~l#QFSO3 zw5>{7p-FSO01FvtlN;ayvrxTU4?MxeQbQuC6U7=WEMp%pOAJN4Ab^OR%bcMnIpd@X zrl8b8))a}v;qDU}cmL$dS>wu?7VW6;Lz!oB*Fdf~aRG#QjW5Hu1Gc!9K70w&kw;kIh4{kq+5mYUq*@??@} z3zcabB^^fmo$jo-DxigC$jJmw%Y{HyIV6%! zM}zJ2C=dL7OK+^Kja)?qO*{avKv2J*H5xv`Cs5IdQHP#FRYUJM+U!8c=c)ARC?vrO zz|Hq-z>mx?B%O_bfr`qNJ3-ehv!HB9+!OD3<70AnOK-Zt?le%x6RL?`SAP+hZI5yA z&j)kKj4t)thQ{OX)AT8*xll}kP2dZ}0&aP<$M1-hYOp2CwvaAll0o{<&)E4GN2;pe zmZhAuk}{FM#VW}lOovt=oTfgWY>|`ouuz56oj`yjFc*t|P4DFMh|DVrY&4+`%mf%= zsD=hiUgku|=LGAb$vc%1t3#LBxBwX(oxBgiGw;So0Q&R>l2>7UI)?Ea@o(H>GpH5> z>VO+bxM;YJW7=(e05v<75wh}y0+0sQQO?7Gj3MBHcp1Ps&p{v(Ha7amvH3;0G9w7- zf(e-fk$)f#H-Wh^1pP)j=&iLAPoEEJp${yC7LAMHL2umW=scr+)x$pvyr2ab|#3V{*0 z_ZE^(%-ZD78ys*dz&cF91Q>zhV1WnCuWR5&o*3g%BjAPe7G4SC0dv7&jNpuMz!~*S z>Da`0kpuc{CjKz3BGLgLGDP`1_=8{vza1<~pD6=rBj^Hw=vRPwCm24y{Po5p+?&{3 zeE^GprWH2ri~B`~KSF)^wl%)gUD7sk4s*#EQUNMHqxXFj`;+LBbe58436203AV<0W zcuj%1B*giFYYCmMXM1?S6~=6jEA0mXROfEc0L}-f`VX)4;b6-FWNidMkvEI&eKx#X zoO9wcqzgjqZYE3{L~moi2LLWh5gaSD?gjSwPDmT~7RJy9HV;zYOmx{l2v3D#`(7ZE zs6~#z-^SQ^NERfp3j>liA|}ze2Z1qsX8GS5j|{Ss0C3nKWD={+;f(W)=dP0ui)a!C z)4U&R!Pr~Q6EPwP5(jK^am9z5&pt4B?Z$?y?nbt&poFEcL!j?GHy)h_Na zwpxbUPY`35W;o8?xG5agW}Znzbvvq&FqBk{Y|#KS{2&-4Ol>%3yAk0~I}0SP1m4;zQ5InDP0-EcWrgrTO@D? zm4VN$a6tb6Bht78UxFfJgZ_t)apw?gvl^G!K~*DQZv=m-COO6u8heEb`0=EUv6YZG z&z*Q?=bfwvraefSI|Bpjjs{_fGvo=)g6WI zu7|Id-&LpTE^(PyM^|T2avpSp&$}WgLk0&m@n0*0MjveC_x54^7;P&q~18W zQ^QCbO^@sdF^{w{1MkPL0RI3&4n4gG@W-d2&mZ6S{{9X!*wH-D(?-(NOB4|xEYi&B z6lw-COECdJ=Q$vb2|aWIOaUjr!GsUE-xPh0?PgO}Yx@l?S(-Q!h6>1PYaXIz3k*Lm z1H7uzNL3WFZDPyG5j(f8jF?kw&N|5$#>Kc$w_Rlywbc)S7?qvO43{n8_PW;b$$_*qR8^| z)h2h>^0`tIE~7D3j)c^7(rUYun2^C_fWQMA#qo8M^eXknyvuYc03E;@sx3AK8J6ZI z#H^7!VTo$LioWaJB)QS*O;f6_l$wTnm7eXYD{J7iR(88x9nxvNHK}xjazQkj7Vys< zEk3HDYRh~wOBB~xUI*AR`LDFO%+tLSQTjdT^(h6SGC7q8rB1yWS2QZ@E2BCBL30Ne zbiETTLrE0W)KIP!%T)W-6Fo5)v#PhXteiqv>vW?I%`tt8=WLE)k$Kk zh6{>P&-+A*nNdu|s#!>@mvybxE1ICSMO@Citt{mVs!a;CDgX;pBT!Rt1YzKeA(EmR zVJ9z9kR=E|=4GqX{{S^Ap_p(=f;`~a6$F}ZLu!3NbT56Lz8W1_s-l}uezLc%Wtyc0 zyH(X_YitwO*<-fb>ERc8o(?G!-(PQ(WazRRnvCS4k|=UUdHeb9+Oo?NsqiY`nuMil0yTtwgU=LlaV#d($gYQKG6eE@FjPb1+mHBE&T`xFWT3=S3z~q=BF# z<#W_sj;d_GyGz^aySO=1HBOtiEagr~Aj=!` z_0J=oy)uPSTQ5n#I$Dyqi8?`&V{%D8ev^+n%^|0mu9oesQ~(59S&5s-7+ZA}g3+q1 zcWpU-qKe^XzEI6?xY5k2R%%*^$~XnHwn)hmLm(UCl~P0@(Mq*mjV#3~lq(|CrCA!C zL|_PIaRy`?fwADh1P}=BS2bTFnW3A@RBBc7)l#i0ib!R2U{u?6Hw+Dmk`0N(A9ugA zcW%(?nvF4YM!4zvw3fF`Ugw2ET)ctO2(qhC zR>e^?Z%aFsN8XAgFiNFTLJ;K=Q-?Sns!vgc0NP4}Mxdy}L!Q&9omxl`bd9Im15_eN z(@}IO4x&hjAQdxdo36kdAex`Jn<_-InIl-{mA5!;?0nnZ-ajOh79$IeR~XJZ6C}aZ zK_Iy@V)MC>E zASaRHrU5^RPvORRw4;(hN{w1gjF=K68-ZYa?fmgqS36aSG9vK62{Xh=+BY1@f=&@@ z&bzOxX&!yPF>eYY9FZ82b_d(IkYWHX;xa(qLF(3qMxL(khWkJU1^vgro_LzP#%89{ z(q>7UT#>bj@q3s%-wE9E)>RTm?FlXjA^eg7{{T~X;o0%Dka+|ic|A-S8Y22k03ZTD zJjveV$m3&(X1j?Ri7kCmCO?E7g{}#}e9K=dM2Z3`45)woOc8(|h@6fAz#{+|9faCc-g-+Nq;tM|Y@o8QQp21RVMi z2`0iM$+?ZV-t)#XF`VqmkTI29 z9m4|$)9dIDq2rE`KT#Kp*!kuU$l+{-0W7ho0ILL@`;DwDG|ZEXl@wv0Dl?J^05&}j zrf@I_=NTCvP?G=+P5i+pk9&VSH3LZ0NQr?aOxSHZPqck58B;WF%#vpu?ZTEAMI_{p zKr@nl{)BYXI+DSO0`U?g4V3R*9#m=f~9Y73+Z5fKJQo5>>9++x$e zg_&F-kv5ps6pifX%NWi}G=z=^yI>9vL(~*isy&JVY!5J008Gnp0hv2(hFIz$5EOuRswo-Z2=N}s`>W*<-5+f?4Ev3}G|4Q*kPEv6bxnWCaVKr0+d!JGq^kd|(= zK7){SR?JodubMqdpxC0v;nRrO7xiL(xsO)O^;<$1rA|WL#O%%IREf62BG$yH*{Rl= zB|(72K{y!31_wU806@-hk79b>WvQssVq|Tw0Bt_plZ=&j4$y7~JacH^0dq1W?}Jn^ zhB+MLoMRb2zHIOh+uw|H)WhP|00@|mA524IJ|uY9{eP#<_%Km67<&PXlgQe9t+$L4 zay@a6W5DZ}N&ch8{{UQf&E{nUC;_%}kQ9t^-(o!nu|HAKj!4>M__Y53Olzr?MI4|V zt>y(zeE1m3pK^E^#z(RC=|FN#x3%IgG5U#v20<8Q^s|AWF&1Mg2G&L-i`+DL5^!9g zxF}x^Voqn-?pteuaM3aCDe;Ec8a-6d^Wg3AWnr8fn{{8VLncu*P2bm=DK40A8J3EJ>C}g>bB!m*o+^!d# z9D}reMEidn^;=S$*pgt+Xqb_=`{H#oD;FCcIpAAik6b;?{V$1GUnRG-8bS(7BTXf) zePOBVW26+92}H0{R@>5L{Z)3h(botdyL`QIs-zVWAD1PvEwdkJ@>E8gx_#xf1?s&) zPKxdcz1kRnj?U@)boZ;c^wku) zgSyt5S`$q(+$(MGTACusb(N!_x7qb`TEF~XPt(;;H_X~EEg#EGQW4xe7-Q8AW9=St zqOywgs3wvbsp{z~5)>t8ABjv7W}A=!BgXd>eG4f_YB_q9NMHw0j-w6B(?baD00&Vf z{1^qINq@T6Txsd`W#>`dwf3B}-UZI}Rc@reU97rVj;=b&n)|it-t_dElFd}3!?azI zC@blfdU{#woE?Wg)$6-yt6Hr}w9(5u0afYJolMTl3sRXd5~phk3e6LXM59WW{3>Zq zl}23(7@|EwAO%Au90M$*l`vaQ#C2(nWu`4}RjVp%p6{zJ6z{6Er)+5~)z(@qRZU>0 zk~?ms(w7RlYO68sO%;i%Dz4TzjZIx(hxSS1FqASXBCA&?sZjnUESQuvv;tDC4NA&$ zLY}5%5?TNNlQ?~m%u`j;s}$Cg7ts0 zT&=Y-=sJxvO=ybW-RetZ63>0IREwnTS$pnYosca(^F!+k#Wg(X6Mn0-yph9B@fGRk zLeq9?t5I2~ntd|4@}QcuoYZY^nWQ^vWb0H_F)D=i;loVjLoyXcR#8w?FRLnA%Hv4V zv?^|usi`-HYuu|rMNz1A6o07bt~$QuELOT5Ck@g$6GC@}iq#vLdtXIyxYF9>v3Dy; zz-FC0bx~}iw+QK^dP;hk8C|00=`%c2UZrTFxq3vE%X*bGlDR5w>Vlqrg2@>@D!NqY z3~z}PTp~q6DI_ygVcl0M%s@GU0XpbaJJ-}qkO^CWyHaW^wN9Lx$J?1LutQk|_rTWI zi%n#9KGW*E6i+S7w>`;*dm71MIb253gG#PUBI-^xp z>KaZdY$VmfJ7oQ5}^(gG?`UZmDiBS+yYuTwQi$kSghR+$vb2-M3^ zNFAhJN_%IzTq|_llJTgd)HVsNH+?y&X)ZTg)xwsWw|5$-UXM{)?AOGaT3d%}?~$|+ zEvHh%Y2$HC0zxX;+$l2%`D#^aE6{3fPOvQOtCV&cYSX7!LcUUIUD`$UgDxx7fkZ8?dOB~<&VsZN2bN~Jr!L`7e_)z&K0 zHFBkyGZ{R}zL%_uSw4D3J3Va`Yl?2Q098h2ZmlAwn}x0+sb*-hN+Hr3BtV%f#YuX( zT5tMC=QO1ihMMt1tSV}*SNhcLhiq$>Z<)SpyG>mr6q>V1+io?Hcs4%WQq_vRXR25& zM}uy+PERt$>b*>=tv;A#u85VRC6sHmY}(Waweqx?gj30e*O{y|z(hDJnrIfUezJ{3 z%`kI0l#MBuU`eG`pi?cFE2fPriDnopcUrE|aj4c->z=Bk(iJ-9#^T=>aOibaEg(S_^rQMGb(~u7^n3gqZQmAF&_{1uvTMZA4SzA?U} zrE}SxQ6`~#8Ti0&l*v0{Nppai8Q`2}k;owX^zRYvh&W8Ux7!Un-K`y6r8N{J!!Yrv zE-(PK_G^r2eqP~2DI1nV&LxLF4NN8Am=$dGTk77Gm-UR5T$W)>Fx5_~n0hq;I%*;E zKQfy-lBUKnbM}AMvwnf|3lxQk0I+LpK_Ke86)jA4a#Jg#M6rffMT$jf z07k&aGZF|w0pkIe->J!6JG8J7q!8mv4MH|2`7pEijg%pay8RjsHJ{jIdYSvR~3%-ia4-SrNitBA~%G;y+x*>#Hy&457I zdEA2;^Aa#X>Pj-9x`PsS6FwsR?H@msR|SV_5n=_+rf=fkEF|@oT6pDYWq?M&pA6%2 z?fvHj`Mu6p)lZ=I>RQxL0n#IB1aEobd`SH`#8;w8y+URtOzpJ&Ie;Yiz%@-Dhvkim zDhz}xg&YzYcpkammK=S0b!vvj2)+wk?Ia{&OZG#>;N*L%#W;JapDa4 z!jMhoAc-D-yW>%eg~MQsdh%BQ9GAx+=NQjFanwdrJAxqdxQ*<5dHQ+7ppZcf<9~$2 z9zB6K+#l94$0LaIwLouBN%JTp)Z_O^`W*3*>Cz8k_KA*nBye^Ggnpj*u__>o zfxhE!*ZTo=bs#dC4&2}>43=yTameKQ5)T<1A6}Yrdqdk)K>lDEo7hG9Bw@H`ylf_5 z#7^Y+z5;4$)s(w{xXLOdoT7!vW*N!+KsjJX7#%iQOcoXvfMKHKN#}8UewZ||CI=hD z377y{B!N7CJa8;>xdf09;hc{!VSsSQ2hI>=CmUG$5z!{Z7JzO=$s25M^BWU=u(bpo zS__-N*aLmYJ00(9i{lBIa>sI&jSB-IAo4v({3_VU1dc~M;Pt`1hy`K@KcRwl{$$LM zP9zF}5R#*KA#V%-v65^f;+QvqHw%Zur)*{JR;*!wBy8D zek8{#NCb|h05RqF!sFYFj=c{lOGpHZa$|dcyu`to-x$2jL2xEd z?SAXn@%#9~(Qko*1L)3odV#fA=Na`G9>>!-A8Wcx3JgIaM*ALrQSXX+tYqy3?mP(h z{dkNIL@)pxoD6~WIp-w%dXeea`OB`{JKtFhlfEbQ(>Bl~ublTVc zQS%<+HaOt{qIh7#<}ui_232P)M<-{de!s&R!8s@E&;*zq`Tp(n$4CN93601A!1v?z z{cs;&a7I$9*Z=}UbLueaPIx#TzjKZ{a3+!oJ6b*V`Tb)M+NgA8(WJCqK{GqR{S57b zI#v9o=A~pp)U|ZRNZ1uC6DunRDo%KBP(4BV=b#SaPVsN$^p7688f~v`>EfH#A zU3j3n+}lpm!)?<#mg7AurA1DWq>5Cfwcan3QB%}QLeD+LtL9TrXqA8X>>()g+7a^_&N>L3j_I6)3aP82$?QRp-lrr?;& zWvTHEZ06egaFw^TCQFSPG1CG%B90C+@P)@+K7D$)ErzGZ&) zMMul0r`AI&QM3oHDO6IRE>@c*K*Ut803#1jr78;48miJicOh1(%+fX}3l*mBgdg*m zGH*_qH^!|=Q*5%!aML%-y$z=8rG8txl4#@3o&&%*GZ_Bs-nO&?6-RBouZq# zx?2ALM?RT?*W5!xMFmyoxtbEuPjjiDYuz*m@Ym2$SEq6{G}5hA;-=S4ns#QjJk3`$ z!Wxd@b5v^qL{rSVC}z#%=`BV==q&meXDd#pWM0xCq@X#d5mk)`Qd~6v=eCAniU!h6 z)UfDN5UL#C7Q5Y7R?t#v9VJo!020mIxhde&7x^mdZ5EA3s%>)`d#7hRiBe#tyl8z- zVxsZu5=*>`WT}+X#SDg;0prItC%%K3k2y(9#Vsp%7? zLDB&>H0c^(({&VvTT|AjrCF)cd1cP!)=Fk6I{>hq;7Kbcz(O%ecBInu758eZO&$8- z6@)`#g6Ug+uo++)!?k_Lj%RvZLuj*BDU!phEr@C=1B$4m8&2i*P%_Y?S(#R|tth0m zTCEu$dB|rKj8;lbdU>V0Oo+!;lQK1SLon0-^&E?9CRGHS*D7?WD9N@uW zHtjtp&uN=Q+qiI2#ZxYl(ezgne$=|6g4cAGt5<0qJ%5zTQE}AzHafX#E&6W0Ax#_7 zL@7(fwN;T%E*Di3Q#DCL^k`Fmyyhy3Z?7?yrBs$@%;njoGVj_58f9&SzfuQPlP<ra!;)T>i2?v%s2sbr#QI_0&~R;H$nMOx^ZOp3}`je`M-+|pCf$gNPN zA{L3LuB}*8a)r%mWYMU^{#uK02?Udg$^8P_jymsxdff)I%RNVFyTjZ)BQjM6N|@>8 zxTVI7O&owr8yIRbqD2hcljhyl-_ojw$tc{bx=8RC5C|Xn6F&Fa*$-Py8RFIgtvYTa zX^kXbe~0uUJmPK+1~|(8=*~YszpvM;3{+z0k%BM^@H6Uo#yto;SEsw5 zrmC#h%0CpTl4?4%+O>Atu#Bl!M=?_INHgagq{<37An{%5-j$T~jH6}qC>jB3Y%KJu z5dxwZI!NX$MTm@D`VX#WeG5F9yrn?9ElO=Bm0EKwl~!St-V92Us9z9&-2UBaKGf>z z?Kk9-YIeg~?ypqd1^i11Q%m!p&8kJzD zr&&hQeid~asoR+s$J4%n>-jIV9-fu5WV;e^iOw6)TB zan9a6?7L$r97ds6ag`Ou;V6W8k<^Bblr9_7syA?4Xk)FQ1t2MSyJ_4oQL)@a8O89V zR*@}C8fvT$abZlDf=27C#EqCV@iuRNl2cKOOwNEVl1X3)nHX$( zhqdm8sUk*=x3aPj5W~dQ`ARU6@44WxTgAc zbX*d&xrSdIEd8hpodi~H8P9 zxLd4QVM}&}nEH6d)a6P2na&1%RJKkBmmGBBr7&kvG5qEra$s-s-x14I7HVWHou)^D za~Iwx--y9w=-|!;MLeoWP^MID7B~SAk(JI*9D~okI(z{F;!lzSG?U_Q z{J+~A=AJ-52bg0A)C20d7{g~d$o2L5b<6(%519Azf2rK>gu`zZBY6`8+r@_Dc;6WK zEL4_c3|W(LIARFNCzZ|yPSQPbj(TpOBm)A*9_OB-Ror)BgadjCyVL3QiB#8TK78ex4`${_XRgfg@1jbdAYB_|BsY^w4h(2sAWlN#I1JvPH#i5MbCJ|jBuONZ1l*E8oJHm@Fi7yGq*Q4g+MpBphp__M zR@X6m9B@XI^Sb!);fpc?`13NkVBWy)ZZJs)0DwT@A{fi=OafrY21pZccsm|Ezo3O+ zl?WsPNC5E!Z6HATi-W}Ms09d&Fk}+>nMPS#0YCt8z$YY(5(xkwPU*3W-^r2uuYHcu zffZ18$b=)fh$cyrOikl&>2SIV3!bvn_Wc>BkknS(B~`4JFdyYxAiRUUycstDi8IFHZayD- zOK;HHdfRNIfntiDD9bTXx>}9Dwy2YE1j!>7IVbRtzM1Q3=~*Pp(x*vO1Xuv_%w?I0 z+?H#W{jH3ab28N#-Heka)3*R#2)FHPVeHze5n+i!h6hGT!;F1;*X7U! zQE_>gdsgOn}Bpw%^&1F`h;}0mrE)jB}BWGmy0U*ndCx{MJN5)mkjxbp+zGz_FM1A+$pS_W)OK0NAtpUtSA|aHU`28 z-N!l4lnf8d{ptDp(r)};jH7)0K zMf-*S0Lu#Xt-SX7!(AFj2XHKw`Xx4-Tj=YQ5Jjl1mUD8{6fsGQjZALlBj#wNQl{}) z%Q#%m-3WKfp%%>3M4D8^2UQhSb=6DiGDyb6)YVb`0R!-Q;HuPdKZ3;f9-#OOX+yfK ziNL<0)Hge!u8UaHShdEmyf1~SH5QW86&hEz{ln9im~AzBLs{!#MM}3#L#=K$>ges) zt3HOOj_X}hPNMBJYOVi`}Nz!l9x2ZAm_x(v)V4RNUj#F+kdvL;nE6 z2ERmWjX!hos_QCY(f255F7!3_NPH`7*9dO(_nJ0OoxI*Rot;3hP3h94tJbKMO08U~ zc6t18u2G^pkUcFjFJn=~Iu%~oXTX7bNcO62n2c+4S$>LCQ- z(NUDJdS#ZP2dPV@l#-=w&TfhWu8may1753Arob6lFhs7MywcXI-kg(1$F6C$E}E&h zTYGD)!MWVE7M8EAF+q6kZ1M>16qTK(uU`@?cWrLBE3UbYN|8ZImdZ8pkVd6Sr8+bl zGL>jlWy#jnQl)IUs~t~Ga>Af&l|V?PlzNpjYFnhDnh6{=YC5^9D4I^8tI~y3tci8a z01C!oEw3<&v`hvijj%ge+r1xi(i)!CEssqYV%1jtM<$=q)wLG-KHX~gV}?2PrISuc zay9xMj+4PZuPqh|%FR0k${(84S4ifkYir7>l%ZEIn51aaN=CX>=}>2;GMSMRUXm9r zlu@Q?Ql#xmP@1(YQwgP7s@A09twQ}WiuF}XW+@pxCvdS;nIRd%wvqxN2UZj<4OLNM z{{ZF%ZmZN4%>^A^lGMH3sfy=CUv;)y+Mne#Rs1;?X)aikyhGx15q-f?zlU9lcT7QX9h9C(p>h$O( zDr+TbQpy4uRhXHrN|_^HT9KV70B5zNei~hAW{N=_ZkeR3V*|_qWrxnu@A9>tM9oH6@C?X(!dRmDGzIx;s`$n3T#R|lxzL?BWZ@Zkz)L8qTYdJy|sSO&P>X^|uiPd`DtmTrPw9>$9 zYIPH>&>+g!qe7`Bl&CPOihH0Yy8i%6X}w{s?ABi7_eV!tEIM}Qr}d@#L25g!x?*nR z*50lZ@Y*}nYMfl9*Y-<%6!jJ@5o3v&D74+GOT^-xs>+$QhN_iv{Yo_G7Fzk_sZnUY zX=*yHEXkKX!y;?0gwzdsT-3>ton(ckQqE(jLQE#+X+imMC zlG0UER?r%{8L7_PlRlc$q|OC0X;clHsP!qOW>a0o9I}F?bW+lS;tI;mw~11VFjneK zUfjJfl^UF_1lO2i42Nw^8b~0)2i{YELw=~QxA*(w8@Cq-Emq@tqV11#($i|X$#kTn zxYb)G)0e2}q^SvA94Re55D;7=Ta*pDI_8oV`x1&89}JCu7I@r)7e>z=x>EOs-#z|72Zw%c3A3^$JT_Lj@s zjXzUux>6+3$sFDcs-b73s4L{Dr;`PvkqMP-Y_-k%3xzu!nrGtCH#qCUQq!6YE}!U(xFdH3v~OD^RXPEkL%@ ztj>pnEf+B(+v$Hm`$LuW?6|E>`fsJF=IJ3U)b$NPfDm4sh*=%B4I5yT^^zE#87<*S za;BbF-h4-t24|Di)%l4aj3BY!j}u6m_t*Rcv(ds;WgiOkOyA5d6!>m`bQhuIvUIgBZ&6|pyx2fsX+@f%{IwpOTUGVvnP00h_zOc)pEYha5Go~v+% zq8f-iIb)5;Pd*!hz=8yYPBO9cgOkbW!=0G8n@!?JHUcNiM-jEz`?C$wMaUPp8^{wP z-%opEs!cO3J4o~8L2?jOGcH4CXvimPs`9{vVf7%&^e5^PiuMA#eL$HXJX#=-^>3P@&9O3H#@#?d6tKRCb79nVOq3OQwrJV9Lu23aNq zlA((bq<@5xK;r~wEU+YSy1@kU2>wz4k$4{XG>}g6CQlL|&Ek3H2>_cM2FU~o8p`>= zk(FJJ;=5E5IR60dDItN#8OG2CdP1O)5=m=ZY&e@lE+I$OoTJEj@x5q+BY0C76%{!l5z$^^?wgdH5#haAX8EG zu_ok+5@z;3*kP*>H9nY7OvC{rNgKhnug8eQoO~;MIzgbQmg{wo=QVZVW2m~;><8t9 zn2{(Tkb-u^#F+@;n>aYfSDu&Yf{eR`desOn;7MQMLC%%rT21-Jb32+fNdRf4q=i|& z`;mJcgzOE*BCNJP&N2P^OC<7Q6;E{}RjBp71kG?&6xu&5hfC#)8=01Nv);^f2b~m{0 zGZAn;f6M)Z2u2&6{w$A9008qAVJReSl1Rv+;n|~sHm``s}WSl!Kx6z(1R+micP^$n0c9ULBkMAf-rqCfI4&g@rc+XYP+h`B#BO{d?=g5 zJd?Ww0tcy5at;nobBuMvCuqOYKfjf{9vwxLX8`L{Dhxr>aUk(ODG_`!KH%LYnypnC z!AV;p5a0#cK;w)KFb;VjoDQKs#>8w+_nU3M)=xNp;!$xnCxLKmJdYdB_*JXvYOIGv zPWK&uO{1vwWMfZvO2a{JroDDgU8Py2uh5$FL)x9GEBj-rWNI47E!96WGQ&{wJ$+st zPQ1@pq7`e^uS$rl7LIP6H6L`Zt{W>_jWZv1t=K}4NS5y+_}Lj!j5*YO=LPR-gm%D~2YOC1xd-ogy@d z2UA-So;0e8)pH~eiA94`YV^rHl#0blnpfg_gSzBGlYq*oZ_8)ax4nH)dAHj2)r#9m zsC4d-H>j&_+SF7x{4?H;%~3sb>K@!jd3L6)xm&x8`hQDbfO)8QB!j4+)~s_6ntHU7 zwKUaAp0X-tB()s>0H)KPy(OzFt#eCCg+>y#-ArkzqO<}tQ+Cqz3Y`?-8kt<-fli@Y zg=!k=rp?9+8ggr`rla-ecB=Hxbgx=(P9Dx(?sOL^9*?=>>MBMP{F#k~O!-@inKe zk3z|8?c!YMZV;)Zx!z(Ws0D=*iy-g zfxw2Ta&Y;kAG0i4f>dw3AY}y6sJCHM8~*^)+-n7^l`2RoqyjMDwB^sd_L!rm)H>?3 zS5Hez4vUt0jUbvsO6v~TU+Utbx@cWpWPvA(N&HMuTG$J1UX@CljmAP`zFa9;JY=x+ z_sorSTQIqbv{)mt%N(@|*?R62rCM-B4_c*8;c05B^QqZI@eeYYXA{urBTZ1fUad-5 zgc6l0xzg2rHJjo!G^*@?%wU@hw)JJGx7@9FKx*{Ob>Bqx=UiMbVxq45+Z)8QjZN_X z0Nt8feJjhYDQuF>B@EiTOo{E&41==Xmr zOD@jHl{48rX9%H(C{lo=;EdO&dahW_QC5vrDMvIE zb>3A;Ffj_IT^6&@3e3QzH&t)O4NQYaJCV#;0yQ!XN=9@I@JsDpn%A}VJ9S+JS8(ro zjp=oS6X=T#kGA?WXa;4VuBy-{xqZ%^uXK7^m1@N})7o<1ZkrQD>^$@w5S&X$B<0iFfR?TIqRi{pawMx|V zQ>ZEgrTB8%S)q!l78s3L*y^c9qE@R&=2nx_%T}V3m;#!(E}BajZI~>8N#71r^ip>w z+hF+L(Kl<8N2c!o01+Lq?lm>TNi`izQ`5Zqs$E~9CpFTurEC(}C?%$(N1j=!VesO} zA)i-#ge z09e7tto8u6I3LF!OnZOd-<~?q<1LJU9DZ2!{JlT!G5-K#1~p0P&!ZpDDt$0Lv7SFX zW1|KGYNA;c)qpD8HgUB1agmQgefj<)r7v&-FJpNTdxLRcHi6B#I0SE>Ld^mPL!I*M774GlzRlw>55Jl<5WQoq(dty?PO~P1V+SP5Z&D#*J@7G zU8(K2XzMF%^_9Tc^+Q4oO7Y8|rNsR`E^bJtyUDGDN>VpN9GusdLZc`$D>C-sPc z2OUN&O`)NeQ-Qp%01bc~$b)P%y>JT?LRccC8@X?r{hJMx>TH;6~ zz}QO4pOzbq&qAfH<6N~gLX6bt-NF6^!Gkj%LfhS7SZBc9UC*SHl;#Wlq!~#W@bpa%7EzgiP zi}Em#)JU-Jk`pw@k@;K0@Jw6zXvzYKxtBT5D)=FJ;%XyVfswe824?oR0sxD6II1#i zL=!gNNZ6ShTkGO5Uapo&Bg(8$!68;kX(V0oi4X#g%a?G?mR29Wahwh(qa8MY4$4T7 zNZ5<-1K3=P?;VG51Q~;=fPhFpI2JH?Hy$uksHfPHNhg9K7z(7jKZtXk%9&!@G9$+< zK+Xy2ERi~t0eA$GceR9r9C`X-SC|(k&$JFajlKBs#?*@}aFPRo#UKyK}!@!`wF2O z%z;=Hg>ku1Fx<>a0z#9wX=fh+E3VsEtGK3j_c2MKafS(|0F zM)MZDM47jl6NIN$YI=K2COGju!llwGN@&+`c_dJZiyUJu=5H%)+(_H%dFz^V6p{v} zjWHdwYYUP#5xwFk5D#|tAQqBf#K~_H5C9PuwT2&e!hgeMYAq*lb)CJAqqr)|Y^AD3 zf7H}60Ltu)0*bkni+XN}SPbWpZRuW~?!z;fPsVA`7*9JKA~{W{oXa?!+0exI}rzkRP6 z+{R!4OvxmR>>_Sp-&Z$3t`$mJV;PMjU84hz0U5vmk6aA?E>1eQL-OOLV~=5E9Gr8_4kKs_YQbk3GGchFlkCxx*hv}$dR^6i0BtS9X+)sgQI_*7qtJK!Zb#9)gqtx+N(#fJ_?v=Wx zgG zqqA!1B)L>Vs|=JvB2HMW$`?g8rkOmwV)QW%@LYvij?VA zsI_t+D=UYpfId&uP?J%JiJ_dV%SoxQAwsAaVxSKBc2;_iNnLXeNPvQ4F_oxBg%SQ{ zUYIo`5j*3*OvO!jxamtRZ4{bzUgJ{BrL=9!QcENny3gDTbYC@h>_)GqvYKix&i1!d zPO&|YROlG2Rkx~mA(r)ZmX3KhMwF|X%T#tW25K^yN|lQ)Wix8U>Uvj20H=`4SAc0| zGTk?KLP1>l_y8Dxji;>LrRAtGvb4U3x7^^BJ0BDoI|gS~aLu zt?603yL853>9X{zdV9cnMM+g8m^BQJ6sV6*ic}RrC6bkDY?QO~D)$_?aKY*3mUOCvASJ?IDkY_fo`}TI4iDkHHs;k8a z1|_4S8bJ+iy$}r*s1=f>8nHPn+cXCV>O~f&N`MJdrCR~_AJ&a$)s`Ad&93=#zgu+G z(^_9AmY$MM<99YhTO1c^2ql)Li%VBj+3Dyl_YF;NN?OU9mi=^`xu8QNQ(1*N)S9(A zrm9eURHB;7W$GGAl-jasCM#AX^zQUi)lQ&CM5fhOE|5<{FM5Stpc;s^ z3o_DeO9q+^@LH+WFIf$;#j7QKSKXQ`-pw0f(V9~IbfALmaEb~@``f83(okC7?O;{5 z!`t4>Q$my5?8)=GuH`Sx)p(^;R%x-U)Z05wsr$VO6zfzq>o^Nb)GAUbOtxBzBISKK zJE^M{%(H8Ah|HuuszB4r8go{qTC~)yAW3YRG`v-IZoX}d6Wd8etiEcV*wo%BtUA+E z+qBKj@p8FW)yb!|m4WN(Akqf-uDj)Ra0UM^#XW&qc-3mRx)g z8?@G_ji@HjV31A|eK&2@I+EdRuF^WEP*hoOx+bo!T@hjUFVPKXHVgdKZET=FDOxIS zmGrc6fA~epTm4Pj<)NxdYI48;uS%|S6kG1Kvg+{FG%wluwF=Xy$4w&@UZYn&)k?OidPyg=AVz2mx&rMc_y^Q_$5nRcU+7N#Nl8f#v+Un? z`)hTEly>J(_O|sy+N}qs>Bg^)J3Zo}Xsa#N)U_20ShO_~#42NN5e$ra+NZ^;0 z2ND3(V||bO4UNtIm z0`hGzZaiWbyRq4AN7{)hs-}j%^`la@dE%`|%}sWnS4e!B(@t2APoN=tRLo+7|Ghz9tY8;7Q_PO+2*nfA=ZcL*THJmhlt@4BX)0 ziV;YFT#YBN&4QIPrIu`UZzE%GCmM>?k)oJj;OYbT!>ZNn&Fu5)wkWXm4s;-q{HYBrZKa`kaE%U@e z!lbB?rDO&xX*)>m1jMfpX2T4txK-Qgn%_@$se*cmgH%sVO;;^c(Jv-C%Y&hcIF(~l zPXY~_wxQ(bs~QLk0xBI_vjKLE!##l5ePZ_q6*;9U3ltHs1dS^v@~=1ek0yATLo24Y zJ51!sEle@SS!eO12;mH#G_j5ht}wt1;1CEL^K1k|Z6k zwi@nYVrFh8MaT1=F9#V$uUWNel6Q0gnn)>&kef2DUToorAnsxUfKSt|GR>4Uo00_Z zcbWdq5(b}&Zftg*1(%*Z$@$~4t&tn&YJZD`dD-acJni5*xH z!IWk!`tS(GFirsa_39>F4M&-_g%LOQJ4N>vIEwGq42l3i46%@4K?D*lHh~{A2M+V$ zFX007t8P}_>h~goSZSq^D|FS8t`-aIVXT|LFyURNu^AKq(ed2kuW^ZC+XngW-Pi+3w$XBJP8;Gi?}E( z6acDojB$g;2h$|=wxyQ<1p*=jz?*yQOc)$_=NZbi%&{;h;Q-#}=WlX+S~)+_(ku#8 z0yZf07~p#z2PE=I`PI7afKncLd zuN@^~@+RM>C;e@I-wflC!6zTX*yG%=A927QgPh|zE|2f}V~ljiYcVHf5=YE&Cc~NH z^ML8dROOTaTaa_l?%;Z7o=2yyG40%U{RjO0e{2HHI7SRk0OJ_RV~!O-9Atavj(*)B zoiQ>^?m6@F`E7$5*102G`9|VblZ~JNN%bHQa6N`k->w(6xBb7rrv66hD2?$bB<@9x zw!gRh7x)rWu@3j8_XWG*n{aLF>XrsGg*6c$J$+*}1< zrbobTeRw&^^}zJ#!GPUMScy#jBPc=}C(=QH0RZQ3p}+tU#yxs4e%OmYi>+rzLNx6K zuDYt8pw`t?RD7j6%JBMDnAFo@ZIAE2)^R&5#q~Co zn+uY*{{T~I9%p_YbZz@dLj1UePgLywp~r+KqboRce`q%2%k1UY1UdWkDHwnW}1w zT@y4TqgI(z1pXt$V_4Kms`OT?Xr|R^(_)WZ>9y)52QAYki9P7@(mPghs^d+lEp4bO z`@J1TjFQiMwoz*e8ofbhj`yOp{bgWH6RNv=d9qQ|=}kSLZ=kGqjczFK`oe-Ifu^nA z^1N@l)?-uew3{!Xk!w@xQd+rWW+N||%QA+cMulN&xstVOs>gJjHBEx)`>_>uBbsa# znJSP0s+CoW)Ox5cD9Tf4h}#&}_WuA-)61>tHGSUgrYfvd_B~B6X|6Pvd$q2&N8BzB zl^yHTwX`=HyZ->hO|F*Q!di(nKC3nxWh#lT8hRQyp@o_IwRbhqi=_~WQnpQ%wDi^V zwtAD6HT_zPE!ftsDI%;j5Rfq>SE9m^P>flcn%4zXtw6Fe%_=G67_fjT(=JSfdA=15 zNd>aMxmu3xY`WbkC~jT9v|sL%SgtocQ7>|PFG|#~KBRl*l(tdFPoXGaNosHXu z4Mjr{FkEjiQHG4Wp--q((&b(9)Sj(mcdPfGPgVhHQmaOq(_E_jRkE3CeR^PpYN2Fe zJvywk6-q2EYKp4iQ=yq4lA0>9V^o_aVzU}ddzPGx4_@@#ms+h;L#K5$uD?iD=zA8n zslM7S5=}|3I~PY1(^J!FyM+x+B(d0ZgF#Uhe`Pd_HnF+oo1x8-tA8|VUJN* z9{RQ`nyL6oNhqD82YYvOG(BYtX-z##Ppj`Y-5E`;dvT|z6HHOsdx@pAF%jElp{=cs z8cH7JY3qJ#^w(?d7W#cV+xnQ&r@_BoB$ld36=-Ga4HS(E)gFnjm&&Q2SJWuwSafPr zE(I!CoT39$FOn!IWvU%+D^-GC(NzGb>hx7B8a1jgs9P^qtZP>S?Lwm+HFGM)rDg3? zO>6>gTGA_pPL8-~+pIS_EqL?Yduyw!ZMRgn>YI(Ko#*Zs!``rC40IMg=EDozCbL{* zk^^_tLTklC$xtZL6r}a3RO?Ww_ogQ$QYt8}=nH1OH!vfnx#-sGP!ZLvO-GUv7Dz;O zbaXV~a|js;rWk=kJxb-DFQ_PV*(vq_C5i2#)oob?6)u^mH%q0q%XOsf)zW(nqH08BwBGdYw<`wL;@jcRM;-Q`D9B{7(E<@C#PN>SWQKpo0 zX;2lZ=$@jnsdH3UP@!4m(g4&jj9UR{CtNDjWjTaejjoGRAg8G0c9TY^TuB>MQR3m zDN3jdOa@TFfmiCWsLBYUm3qXQ)UwZ+HC<6js+nLSomNt!p><)ZM2HwS=siDZ)biE3O;0yMyJhl!eDx+{N}Xg4Uoyu+)23fVMH)j0GR=G{qE)6U^{AKEMx`TD zGWkrarnaVk4=jgRkO4z72q1uaa9nFA>s!8??WVM}(#?L**IFuCtIckp)%rV3L8QBJ z+X~%Jex$vPGgD-$jta|_-9@sZI;O0ml24YWilR3q(@QS&m}OXKtfrP<@ak5}Q53Sd zH_YY@ccs#C)HORCu&A#976i&4PJ@_MV@jg4{{WXxy+c;MVQJCntxaRKRO%6>hURwH zu50YHw%D}BpBZrauD_kBGl$~8}Jd#tg^1$?bv8$oY15nQCB zSmhNn?xtqddMf+7uu;M*L{Y$R(6|JLsZA-k!(^t zR(YypkeQL*-m46PPcV3WeF5~`rD2%MQhAp_(WnT6sUu4_yDWUPoM639fy?J=tQ{2( zTAADxcqSu>HnskEmqCxW3(p7b_UEY>fs2BL>zfXCz5%`q2q#a?Vf+9T~;b*`~Lp`(*#e__y?(jda{r=`)G?)>!3@(W6&i z+9^}GGLTo-KTMBKp=PovRapwDB}fJVR|k6=Zf*|#;`p)2`i*R@L?Ouml*lFs22`vW z1Rg=&Z+t`-e7+j*x<md1~~XRE}s2?-5t4vW6Qi^$s%9Qn56ZFT$)c z?QXoE*Z#`pC{(MN$x~)SF8NlyHgdOWAO04LvR<3-+F;||e$4&3%I0ZN%KD8+ZpBRE zfGdSol}y01RYf8L+0krut+3K5YnI_`ns}VYQ%Yo@tF<*dQP$~; z%2O;9#LlHpSd~&~mhMugq|})WI*P&wE~H3;qylU$1dMt&Qjw^tG_tx1t5h(lNtD2Z zX^Vmwh1DRL0EohWf49iObpsN3VV)`1#FUv7w}?bXa&KS^VmS!izyOnm*%)gam?u@( z?R#8FjUW?qBXBVAWzswnVSy+mOjr;$5(yw!-)uK+aES~Oi4-+rMKm!ypFE2ni~*h` zSr#uWibA@xGH@i~-f1 zGz19|%ovknzsSwUA6!zghA`Fu>Wlffn7AZu?mk8MsKP4>h?q?xhVa&3I;P#R$jsT= z08xO70aKUB#$QS!NH9q}NilmFzsd!V>4?rkFqZA$#iH6&Ma;>Wi1TrQdM1*jtE#*{ z8B!UXtRR!O%oGNhl}I6-d@OK2%Wy{0Hsi#DHo4v{CU_Wd0JgEP5&4fM39tml$9W!b zDR-4AX@bh@C{-RavZ!Rj`P>bs%uoF=pd1oC0O~D8011W!-qH29({3=mLJI*Fv>4uC z?l>18%J^%Y!q!nzRFt7f-ey!twz+2negLWoV$GeQ04!TR`05>6ia74$$@3r@gNEg8`z#Y$4&u;HGdMy<~34&a-mW#N?z^NsiX`Y=M;sL*j{Ajo%;2~oPKvD`?;Z`HkR zC@IQim@$C0YAjiz7!5qyFJL}+nwl*bma1?TnIMKJlfzYw0)zl6M-m`VsHy_0jsgL| z>vc;i6c|$j^4ihz;B6d#EQL(js0>LYnLO_zedLl(<6tqSYBYy&18F1<7vCeF$Q}Uv zBl-0yD6qEQ`5pd4+jIW_7>r!Ev6-2jw*H^#jgUg}5<=i9JAqy}00J}XyC?XLq-|v2 za5wUIK6i=U@rGHvM1p45o=l&gk0<6S1S=i}!V7Rl-zOk)Mm<#iFXzWeCU@Wa{_Ss; z8zyc|=WlO5G1)3$43VA>ILTf?1Mv)FARO>H`gPR!zF+bEanIVsexg0F7RXCy9)zeI z`LccU$-u|B zpz)49Kpj4(Qi5;q{e7_v?tXiC_V@YYp)ctLWzu@Zjxx0L*#&S&9wrKtfKREw=O;d$ zE1CZQSpNQ3#}E2>+v)P-+l)27>33wW%+k?MlBP|*b=stPRNxbgoa2&n?T(tMRa8vd znBV9OZ+SZp(;Y=;Frs9clNx=GH#QJwZ=_mxZ(qj-rfR#&)yYF5y)={4FvJ%qgfd41 zmdV{cGtD3a3Pc(89cMj9IEv~VwuwE!k=QD`An@Cli|@?=E8use9f z(P^fryii)jGZ5FfbouX+0eJi4CH6y{?lVtH8Iq!YR*HKMt z9x71Sl9?EFh^3KbR}#jpe5Fc(8ih)f>*Q&*v}IbW4^V14h&3~LrGX)7Duay$O3+ti zT6u+CNC@FZfSR(_1wS=BkrG%|)fH!h1%hI^RKE zrjzG1Mf13IF(#A$0D!5gU}H(8J8f;&`j<#mLEuYRV@4)AC2FZ=EDH1)>Ee%CcrdTQYU(`sEOqb$OyHGgt68^T(Ox~o}9 zp=^3}mBla2I|NDQtxU0@_hx75QmscVmo#fub)w@c>HGC~ll8xB^t5`C@kec%dTWhkESn})GL_bi6Gn&L zDQXV+Zk)ADqoacPSE?SRE{VKD*LI_&Qge^f) z0fAnrr%agArg6(jNgj=_rm3RPSA7qC(;DK3Qs~PyTUXE~k=B=Fl08RXr8G?yMea+! zl+?B6YKHAJ65TakqLfKjUiLaOg+!$!BxUPm>QbyL(LyTI`?hAWD^$>-HBCwtor@fZ zH7nJzb44KG!#MT-R?KFtF-B@HCK41k5gMUmDZ}8Lg}m31zb^S ziiWUSZL+lbu6;>aOI<@f(u&J}?#8MyRYxTjk)V)D-CCJ}R;6k>DA7uZu8wJnWobGv z(BxA>1w&PZMKuA?zQL|1845Um+SIFccanNRkwAE1UoV<{b*ZUjSB)m9bpSI9#?n#T^)pEB!G>k^(xX={vtG3XB9pqS zl|90qlPsW(_6een^LwDVX}j&>$E~#W6&w^d+D`NQNS@#Jp2K9*HrqqVV$;31?d=7s z<$SHXU901e+##r}OKmIyFA%WsnYDA7$!5^CT-6jtrf636DjuDZppltDK~(n5tV$B6{W&Z$(FVNLNOmwcKON|r`k|gp=PN3=iJMT?jty+~z zbm?Yu11hhV%jOn_S1nGB1$_*44y8cH@T!(jZcJi|s?!wIDb=ZI>WbB<8kMUxO3tB| zx3Nehy*&+i0!%nx(GA`>J01E#yP??|g>00%Yrk4n)qkOisyg~8PQA2(wedwmby)5+ z6%L``dRpN1Nw7!a&l1NYdbgqGQlnL%4E3okT5uRmN@57o(8@>`2294|8BbixIm=MY zX%k7BlR;8KF_a~N(%gVYxG}apd3%n1iQo@RjAMiTr;e`w0KY%q_w&YI`~Lp`zJ0Nm zzpH;PKc3ulV8#pik-+x*pRxY)^x(mZ4^Lm-KbPV6<2d^Lx-er*kp|9vIUa{Ukt5uD z3>2^OU068E;Dd~oApHRK1Y;oj4|DA@o9kcuu0((Yfe|}_ zxskryVMqi(CPva^e_PzZ^TrUZcctT+nrCQC$U|fWU7>w;fI!G34l|MU_39;L)})X% zY|2E2AXt-rZ8In7iCJ3hPM~05*hsM#5PpZp>EI-opZZsv13nMLEIX)yWk+k{uuYH|d*=qSl8GO}=Ayui>+^ScnwL}IY z`qy>f4_o^)_Oh-;6EB@#y=2Y6)fH&W25h^DG}gmD?*Lx|MohlT4NE z)O#I_hQ}7Lg4tUIOl6h9PsT@!^mZ+dV*7lqxD?D(lWl`CPCepX_JxC%a?i^cabg#F;E1xC_}6vY&RpqUCwNi*+j5F*%*j^@zN+3ITKqp!BqG@;)V zDJJOIh&e`;9yN90WRgM-2H*n%dbZ1C!B`q*-v~a?0ck%YzSD9sSDVbU+=dY#myPcP zfPa?}1PnC$tyEIfNmA(Tje%Kk0~W^z>WyHOp*l}!^{F_kDm7Z z{LU#VX2Q9Gq#4pCJQ=^#Uz>A+RaJ64&eJ=?6BSVed(g&PKeTDcW_2TJCW>FzYpNXKv2_h^f+<3VWj=DRDQppNSPXJN6V-q{N$fJPo zi~>$~8~_N$2)=8$-CK~EfEM(PH@Z3D-PdD|X)_m*mqDCZmz$RzMj^XZ2d+QXRSl6S#}^GZ?F2`#`mNL_e$UqxBw3CVS;^q z0SDjj)2JX{o;LRJBj0~GVy!}~0*GLstw2SCT!=O^&i)1Mf*t;yqujt{aCsQcaz+LR z9%3>_ILSX!m)sxk`@TCx*~4li!Lc!U+z8$e*MAs9?}kNr6p}XX2yj9uKI%#HW7PYS zM@-aW2vAG`#>De^zv*wD7V;(u_KD!!&xrQM)+rUa0iHp1*oC(8 z2R!_|eSTPKB*)kEy|3*t{1wVLEK11-%|%g5I8w@XsxVep1#?;V>C|!44y@|~PO_|_!*3iFBj<}+3K?}BK->=C zvJR3r7mLC7#GfUQUiBQheun=5S7_5Hmi<}U3n9=`OQ@(d%raC|UNsMGyHi6oea_d} zomEK96~^D(YVAL0G0ZCAg`Hfj3ubA#8Fa6vnMAFURms0mGa!>vrc)*hRBVM+GT(V> zRQtPUNsFBY7pTe^`>Ey_*IfpL02aPr!ko=A2A+s_BF$*VHkAJWiFF5$X`$8KxzW}O z-9KbFUYDL4AVBPjjD9XddcN)~u8r z{OnB}C9j&Zw)*C-mY$~n0B6*Rru4M6rr}TpWik!X!OgNLtmCi$>kVmV)BVIfs;Hr>i%xe|hh;5?yIq`nH5}CUh&7zBL2K?d zjM1^wwW+Eq;JV10USrkFDHUqety3y%SErZFK2?#HmUIx5v%a3x)w-X1U@7Kud0_8J ziCTeRoHpnIR7zs6PMcKAit;sOi6!#+g<}cQ1ic!yO6njLo)5N~yT!v;!F%p4y5VfM z$El#vefXfJqNJ^|cH;4Ag{br|d;2$g)6HF5L42;MrjDaoc8%>$*Asv6_13TMGkQ>#NM>J=$6HByeknLmh-VGf)-N~)bkm=u2W za_^;9iKx{ovn5K|WT+WwN~v%TlQ&@?VMwxe#oqUMueVd`DX(?7p}f%cbFvycwH=MM zGS$rYbi8*nx_1YVnwn{(Yo*5DIgzMfN?9AlAw%MhV!dNlhf`gtKc{+MrVf*nEmpN( zQO_GG1of&T1EfayU2NqwqfVQY3a47v&u7}MWXuH#mdc1A5HurOQ6vkTYqwQdXzpud zxN93VEV_pB&8aT^y40E`{{V2eS?hHr`r~PXOzH@&ckMkr#*)#eD6Vf>fU3megm^6S zD?XyNI)|rLkgD|vu4vTB<~lUnFwN6a7PS_tw5bO(#HEd}(QxS|okLEV9-7rk^o2qx zqO&rFM+#n{So1A&vA5MC$yzrug;6_W%k-G z+Ky@(xodR&75GupMQOWRuqM*0Bz0e^VYs~YOHWX-K~ps{h@;v1UT&p2>s=nBEj-m! z1=(1dYT!aTk{Xxr6MZHmff%XHQ5CZFvaYnjY`r(qfr5uBTe%zm0FY01(m^MZee(7@ zx)y%$_OnHI0?AVqO(vz&*1M{@I=J0gNfgp4#(76(S013L9=&=+P^U#?{{Swshg*LT zpVN51K5^#dSzVE&6k?`%gBQQI*NGD<;2h`6@8~)HdH#Jhj^h>Q*m@6P^*>B~Kg;NH zV8wwOeLc^v52EMk{ePZE9T+io^%*~0ap{h8k8||;eL65>o=Af+#~EYjIsO!6Tie}6lS7y-H4W2uTrWQ;J8Sy?bV%0@WPzag+NamUxGOHeq{;Ya<@cRK?SJ_+}= zu%#wqNFSCsZ!#eJT*vfiebUl2R>qdAVRt2h1yb@zSzByKi^dLifCwbuk_V-3a)K<> zTU@{Z+70*?B%AT%j9vO}Vae%8-*(smy^olmJB&nU#OK5Ihwi<)zK>McSHh){>uKi- zv0W`U3~#5n*(%U@w#xXxU)o0Dg94JPuLlq7evOp%G<3~UR;CY88p5S2gKD%};-=yO z45VHrM9-u82d`%RCDhQZc7-c5PNGZ{tO)H1ikJ|bjAQybF|p8 z1eR$nxEI{p#{?8Lm2EtsBs9=A1g} z3FL9>U6=;sO^Ck`L|$zlK5;b|6+%yOgBP{-1DO{m$d7y*yLH?C;CHWDT02+S$_Ccj z^6M%>mTO)flF>>4@$WjS?-u$iEuxM;+SFB6%$`sqfhC#II;E>w`iqv!Bj+>K2uc|$ z1U-7B$PCdUl_i;}RpC`c6EF;?uR|x7Y}Rp?FPEowty0n^$xTc%)H4bY65haD(ucuU z=x@+{nz-9F_j_T3xt-lrS(d)xK;Q75o2ZdPnr$g=tqzhbAAxT*h}D%O7lmL#Gp+QW zv5VBFn)QN}^NS9da0$xg2;CN7)^)VhVH2B!q+gW~!mzMZPuePZQFee76#y#pfS@m@J#U6qkX2D5NQqDY z^AWTSxV6B>4YO4XF*ht`Cz-h>KVLrQ36`hr#iq}15=M_DY`JD~J(@_MHO!y=bZGn(Kp`1NRyVNkkK;QsLo_)o?)-Q&utIG$j%DV{pnS&om-}S`oyA3@tGNO67B$*r7e}3UHjAY=FLk>T6 zM?Sc~BzoX+>Ffz*Qf_wr=llNvd_G7QBmsMy3vng{_!!!Vs65y$yC4vKIr6FGVG0Ddu@=JQ{JaD6qM?7%Vj zE(qG==lv2Z?U#8hxWhj9z)&`o_9xe$bsU^@#YB)cks>&YAD<_G<%xD+3Yh@FJTSDI z@9*^-;1Z71ke5CRlB9xFbDt?AoMSEMNY4YDW27oUmb@EZaw1RsN1cW^soZDf17c!8 z_Zxii-3b&4Q6v$MJYXAg09-_OXKv*Htc!fi z$i3tb`J6P(e^Gs@)>W0(ddcneDMvbBkPB$DwMbcNinn^)NdRA0KN$qeR+JMp{Y$tY9ctPr;%=UlxgE;Slw1? ziaAJ{9qa)<3p{a*obWn`)dZMuWFxF$~%;o?3Y#kH)x14J!tm(1$=< ztiF1n4lP8h_mN()qMF5-hKXY4M(`jQo$+l*F$5`XYXVUgqi8<}Vn_gc3+*sQB>r)# z;4~lY03zi-*>FO=*l^YYD#TaRc498NgOmY zp>o;bMzK&B<{gxpRcO;&`j@9xj+SnPFhy3YK~Lj#O)(0NJuDU@${{T5a^Mf-qa`giBNJB%@Tz&4CRr|hUBI-pv_D+yf zm!+A@l3Oy08JH_8B;O8dK>8JmRn2M?oa!|x=46(kU8GbrDuEQ3kUP6rL}6dEU1PG? zJDsi!-OIU61KIT}_Qua0!pm##{{Uxim6T?WyU|utv)ntYsC4DHx6Ekz+l;zemMEut zU7m!AV`iCX)BEmd9NU12UanG-x+kjSUC>j{B~SA+%&FYjVCOEXCY?1Pj5g|6(5I%5 zF!aS|Dt_mf0{Lwa7cQiLI;3?8-Ol*t{{V`$H9cm#)%ta5Ak;SPD?@qFtEX=D)Yab+ z9hJ1pB$w+pjx@AXgSXc$H%~iHbVA@)tN}A9Sl+3UiUaXVWSBMpJ49b(* zqzoy#7g=gc4wbH|($(?mT{$+DpI>%oL3Zm;(CJ6lJ-E8lNgleR?G65xd7;qV&C~Nm zaiP?3PWLY3>Wi%-q#BBvIVO-udXALXWtN>>vQcd2Mvh97QmdQG)ldD)6 zlAx>9&DM3(N~(fzho?>4bpunVYOY^3TQcRv8pwYK?=;|bvef}y8g%99sqRA2gw}ey zB_(B|PTuMo8*Pucws<1!ES7tX$l7(qoj|yE8?*X`x`N|9*F|??6D7@WHtRLQhfr$@ zwW|Gff2xjEjJPQpqLqA|a-rRC3n-BZdk4Tv9>kGeGPpEkfOC*t`IGKUZtp83ExZGw*qq@*re^gtcxMrq=;wp*W2~i#8%jXI$FTGQ7TP9g@>FL?LwKQt^ znk}2_RH$N2I(<56P==<&>Ld|_7NQCKAb~3qYK-j+#Ya`6RcMt}5~MR~VxkDz;|YGD zxy7okw|!}<>NLDCP)$!1wyj&+{b#S%$7$|u_fhH>6q+v8c7saYrLD)dziY%dic zA2B?U7D9@3L)Gpym1xsIXjiA2bJERKs>~T^IHbcxB{COKQ6!OUbkNYSs^q-OqtH!H zK@omBfVz_J1Go)W0&r@mI_{#3MQ^qD3%OTX3JR*tF($L^uWWu7bcK?^da~DBY3>$# ze~D$dUTSR=)&BrHEYyiSHI%P|3(j_%FrcXvDXwfKM{v1Jl|M_%qEto=S*lj)wMM6} zx#fcau_g-&QApOwmIp$)If~w+RjMm1XoU`lDrtzc6MjYk^i>5eo43+eGl8z>SgzC>su5?hYi{Y*TJ80c=}PNw!3DO*Y}I;>zS&o0xm{~t zOw?NLl#^K|YUih_WJ_Hy%ZXM=TN!URMQCQa#d6@&rt?cL_Hwl}%~fh_w8&(BtkP{v z6`@04QLqWi%TN@H1eS)^>msE}D6ANg8BH_P1Oo)I1}%m!-;FO7x3_)8?cGJQxNE0+No1y_K@Wx&NhM}&+RsJGoV^94 zYAXtPOtmUXid98I8nsgD&}q14DpUYgAd+v2+}%?34P{*drF!*TF$Ibew2-M19Y_JD zb|i>6ozKt#@q-q;?Avy8P~5j&v~Y>-G1SkxceK@Hn2;w!NK!!%2$q5mkUg!853ADqwr#2#EoT9YST@%r@;q~MAmh^vY^fs>KX+dT2o$bv!K7(Y)Kf-Ha)@dMvDG2B=mFSn`o2bRySHsjt)s?`$(f$SFi!U{ZK%Ij(NsM?nWd_ZqUTjp87Q$WI+v8mBW=pyDzPZcqmbrL?A>ot zVkuK%nxX0tLJLW~rq|{O9tgzN_0`C(yv0RUQ7Ek%oDsl)OC5nAfw?0dOuO~^PIX6f zYo?1%+aG@}Kkh9Z=d!IugV48#MU5H@a5lKRol3+<;0!-Lm^AUqx2XVVqM+3ln0jH`fS_sT_vg>QD3}?e3 z5~3S*2pMK}A~k9Fbz&Q6IrI#t{+4M~rnNI(xmtwAs&pu7D8v$1Q?Uj&Bm-@)7{unk z^)Z>FRjK8&6sxe3ty-#{ppdG{5he>rStDaM1mk9&?=Fqe^^)FCVLNfIu0FKZe&_0L z;A#yq625pkV%2=K&|InG04Wy-n{$9wuuf&r{{YgT*!QlLJzLhk(RzgyB%HoiGfyQz zh`l=BA zs5Ld1TJ;1`Q!16Bgx0+sDzWh?rsEpVQvU!7zr)|ObZOAcdMbKGZ5Kr!QS?f!lWK~V zikWv6vh2i=U5zbuE%=ME&EFD@L_>gNphVK*;{4Dos;#0$w}O4J{{R7g(*2+7XFUq4{iXEEdfcT7BA=^Jq_ZZbP%|cA zQ&3r-D(*lUimbr)kFsCmFWJAeW}OV-Uqnt^KO&FS*rjo8A(N$B-jU1HoLnM&OjIu_>SQFv( zDUih(O1hGaj+z-6Y{8VnD*^~0fWU${81^bv149Ud3>ZP}Ysg{4Ovv6uP8fcxib>=W zRhI@*S%?G&m4RmQGJQ#Wv+$rH<2cL;iE?)r2aaQJe{H=hr9LbkMX97X7)xAd~&X4}StbY;;JOkdQX30(_;s zxXwz9`g)EzIpZ9TnyGR)j(H;X`A_HMvSZViNBw%ZQ@j(I1KDfBD>_9u*wT%V^+ zZHX@r2?d(&6b0B=m~P*Yi9bwiXWCTm_0HUYO8xfoNMb#}`*e~dj{;}=-}-sj0oY8KHj((>$u{GAKm@`0OsS#whPs^(KreQ7k1<11COaE z(*ppIK{?%V8 zNw6ST`Q-D!9z5Y{=|c zr&eWFcvdjvyNH!ZGGTnZSLS;uH10zI`V&3}w1RiUth*~z+`s_rR`FndSCfC&5z(n@ zbsgDkmb$%DXQ3B6M0%DjNkwRe=QZB8o~EYRd84nr-D5LfW=6>2bEr6ml#K>8K+9Zaqn-*yD71yBHyd|LpjB~h9Vf}w(uV8DO~vA@JiZFt0r zT=nH8F15SqC}?gMtshsQD?6hGn!eoUg2zXvKUb|)-rsqnv&l((*ZPtH6->68om;CX zvps9m%Jeq$k6_OX!me$oel1Eha>qGI9;St(OGqzHpr#h4YO42?dezF3z-T}t7xePw zsMDw!QmL=^V(N-ns%k2%rKKp-CN&ClwSgcrTMAx_z3I(irF&?t zJAJ-EVbmJ3j?+D4*0?EbItHBCyI-Pjbn?kPI_gQ_*SANblvK?$)k)zqzN(Fv%h0Vu zGgT?j%R7qCN}Wo=n<#{(l?_iPPNccjUa-u(8G=R8OZw?U zuT=;W(_Vtjw!@>;78~5vnm4s}+kJ~q_XdL9PpCBg1&;p!sHl5vx_a_NH8%}mdihCp z?x@tY@W&+A%MFz@MvuBnJJZJv3?H=WvXwfN>d?w6B`ncY%yg+{YyHlm<`|BqV=&5d zbt(TC309*0 zZ=zea`nyx=8=dCgsC$D|Z0z+`lv-UEs&sYo&jd8uopjvvaa7p5DWz-LtzxOQ==)Z? zylWab3SY0b+3IDKT)E6rOulNPpvxTE(8!Fm(9GrQu+x|n8XlfQEc~r8nypw`r9_fP zXo_`BdNk4;W%`+(sWoZTLj?^(YMH8_Omz(!bc|?Lj1=eY-jvW9A5C9wRC>y72~Xc! zjfc0^ttoJ}X}wEk?tOJkQQzw{)q6)@LD}6oaICpCT~?&h&}$uGa+XTjMKz?=yh0~h zjU2L7R?Jb#Q}rMyu3c#*bk0*g7YFsDyZ7;?QQYOWP&HFwIP zs%q+LRVYW{^@_vhT}ITOrA=TBO#!f0pHQ{aUfla-plz0&9jz!V7cTB<8skKj8dJ7c zI|W@ypH=p#qYK`%?%ttT)h`lw^RevokvKyruddz{|Fr@Z| z?{=r{WuIN&FFKo8>Z^{5?;mucxZE{G!%fpvU3DI*wrCqQ+P2xH;G?FB{XrZu_^(XQ zO-&6`sEXC3lxf_6Oa&kd;l$cIHLOye?{L$-zwK3By4QWEvMqmb zyTjjYZFLt3%uw7e5!z>`qqZW?ahaxz!LFvMiZxl5bf~~tYHGfAzD?+y$fSi{u5;CM zmF3()(LiO;1soozalC`HW0|BDlbY3O>k<LXgSS3?k z5}2pU)_f`wEpc9_L>tFiSR$L=-%07u!huWccdLcuucx3&O%Bew3Wur=hSIia}dRf0v&1Q2Y zdwOW^mm@_+l6r-lhn+=c*hAM`y%nogwRB2|YgEf*>1FchO+%@Gsyo2&G=ipJnZU)n6CYRJbzB;8erB;v9w(VbQ z_=E2@jn@`froVx)i2GD5-U3X3|N# z3lL;ss#&${ea+UlO)(wIS+=6nGi$v^sHWDJTV}M2P(coxtg+F$>Z$Fv>-<%g{o!Gz zsJBl~Gy{87#WodK`#K?IX=Y$g8yqtCuK{{V-diz-uLYN>6|>xzvzSwkI1maf-d zR#ZmY_9EJ42lB<<(h8824Lt$eNHQ0@ea zNCb%+dq@+Hqc?3eJL-)kXS=j-6IIaDOjXL3UlJJK2XB`kK0iKkde&!XigiRscn4_s ziQnJpjC}_zgrCYv9%QEHjr?)@;YCNuBL^Y2`kWs_l0Ls*OyuXNIDZ)iILFaJ&)0x) z?f!qmo{Si|9=Z1fpI>iJetms7AJYa5XjMCoc=zL+j(IuvIP?b|opa~?{{SzP@A{k= z&Bv9AWSEck1`YkMt*vhS)cu}f>RO$*blExxLz zDH18_d}-p4pqFm;gJB% zQA=-Gn|H}tp{RBg)RFKNKn~<@a#;20i9(KEn&tB7DN?4thMT+rS*)}F;c1}C3VX1*PNwhGASmU(KV$?1*6TBKg+v)mw0RcC=(UBiqVA8*)nE;0l_E zb-_BJx?)MR2?P-a#!r*9;_jYg8Z1JD?OMk|gC*R`on**197V|9+%z{@$ac*Xg=3xM zjyTVo21ZdC&$V*n1UsAipX zT$MUwh6RP<3;<61m;;$OqtE37vsa?VhGv#6v2-l)OcD2r1(Hi;>OO@~p$IgX8g(QPD88zX>Vvtq1*M9^ zQA1MlTQ1hib?%L7&@F1xU1_4Or;e>+X(3vaid9M0DP@E(Wk-=YKMZH`uawMI%G6|M zqfzOWNzz#uf<%B~M2P_T82eizU2{}LRZ^=`oi_;IlvGgTVr~ZDT6Q}Sn>1f53a&#W zfT+O1jImW44;&UbY@aHOARSix_vaEm9l$gD5J>$k?Ks`?%5a%D39y`yO9PfXdk{Xy zJoM3~NhWW`{^syUKSx`0UHz~Wengb7-GJFo#O*1o<~2Qu6ke@ zpJN}V{NhUk)jCW!MU)=|v`^9jo&LDxa&pH%gM*Qh27MIgIL>~a+;PxI0{;Lkc9Ry? z3lpXyM%Drc{{Uc5$o(<79F3soX(xf~4?Jg#fH8tG*MFwpEJLbEYJ|XGV8-3MMZAA; zjw+DFm=X@cJ-tC)-k|#XALpN3m@&=bEP+NCZX`ZWsZa^QIUsZC_8y%d-^=^?V8CsA zVNO6lvm?{#z{t-d1Cj1|{JVIcnEwD@=lt+tKdgk*twd#)VAx1x86XxMHg^whJqPsb zm@wM)MP!!kNpYovK2ZrQSnVP}+pxI&SO8}^#~H_5J0Acaudxxg*BmlT0~WofeZP_Y zx5Fs-gVmMBYMMrK@|L?K_j-tmmyFTDSxR5Qgi8>pt#(j>DkYAW!)7vX$A;OjSj`$L zvLt9VOmG!|g_F4?112I(&Mk5@bwLdTl@dkFgSor`dky`t#C!QY&M9xY2%0N|dN;Tg z7fU_vsU)PiMQGPH8f)uWR8xszhLRenym@J1Re>r%cvzv@xy;+KMx;PvPPt@bViK|k h(P6M7ZLA}lTTxZ*f8wSC0s~7^Vw$gOj(0rc|JjNf{#^h7 diff --git a/demos/Zend/Service/LiveDocx/MailMerge/conference-pass/generate-document.php b/demos/Zend/Service/LiveDocx/MailMerge/conference-pass/generate-document.php deleted file mode 100755 index dd3a0e6739..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/conference-pass/generate-document.php +++ /dev/null @@ -1,36 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -/** - * Image Source: - * iStock_000003413016Medium_business-man-with-hands-up.jpg - */ -$photoFilename = 'dailemaitre.jpg'; - -if (!$mailMerge->imageExists($photoFilename)) { - $mailMerge->uploadImage($photoFilename); -} - -$mailMerge->setLocalTemplate('template.docx'); - -$mailMerge->assign('name', 'Daï Lemaitre') - ->assign('company', 'Megasoft Co-operation') - ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->assign('image:photo', $photoFilename); - -$mailMerge->createDocument(); - -$document = $mailMerge->retrieveDocument('pdf'); - -file_put_contents('document.pdf', $document); - -$mailMerge->deleteImage($photoFilename); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/conference-pass/template.docx b/demos/Zend/Service/LiveDocx/MailMerge/conference-pass/template.docx deleted file mode 100755 index 4c2bc00cb1058bbd8cf361cdff7d8f4e7ddd5575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4300 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'https://api.example.com/1.2/mailmerge.asmx?WSDL') - ->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->getTemplateFormats(); // then call methods as usual - -printf('Username : %s%sPassword : %s%s WSDL : %s%s%s', - $mailMerge->getUsername(), - PHP_EOL, - $mailMerge->getPassword(), - PHP_EOL, - $mailMerge->getWsdl(), - PHP_EOL, - PHP_EOL -); - -unset($mailMerge, $mySoapClient); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/constructors/public-zend_config.php b/demos/Zend/Service/LiveDocx/MailMerge/constructors/public-zend_config.php deleted file mode 100755 index 8c64e60113..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/constructors/public-zend_config.php +++ /dev/null @@ -1,32 +0,0 @@ -getTemplateFormats(); // then call methods as usual - -printf('Username : %s%sPassword : %s%s WSDL : %s%s%s', - $mailMerge->getUsername(), - PHP_EOL, - $mailMerge->getPassword(), - PHP_EOL, - $mailMerge->getWsdl(), - PHP_EOL, - PHP_EOL -); - -unset($mailMerge, $options); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/constructors/public.php b/demos/Zend/Service/LiveDocx/MailMerge/constructors/public.php deleted file mode 100755 index a5973cad84..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/constructors/public.php +++ /dev/null @@ -1,58 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->getTemplateFormats(); // then call methods as usual - -printf('Username : %s%sPassword : %s%s WSDL : %s%s%s', - $mailMerge->getUsername(), - PHP_EOL, - $mailMerge->getPassword(), - PHP_EOL, - $mailMerge->getWsdl(), - PHP_EOL, - PHP_EOL -); - -unset($mailMerge); - -// ----------------------------------------------------------------------------- - -// Alternatively, you can pass username and password in the constructor. - -$mailMerge = new Zend_Service_LiveDocx_MailMerge( - array ( - 'username' => DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME, - 'password' => DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD, - ) -); - -$mailMerge->getTemplateFormats(); // then call methods as usual - -printf('Username : %s%sPassword : %s%s WSDL : %s%s%s', - $mailMerge->getUsername(), - PHP_EOL, - $mailMerge->getPassword(), - PHP_EOL, - $mailMerge->getWsdl(), - PHP_EOL, - PHP_EOL -); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/convert/convert-document.php b/demos/Zend/Service/LiveDocx/MailMerge/convert/convert-document.php deleted file mode 100755 index 28d97bcb55..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/convert/convert-document.php +++ /dev/null @@ -1,36 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->setLocalTemplate('document.doc'); - -$mailMerge->assign('dummyFieldName', 'dummyFieldValue'); // necessary as of LiveDocx 1.2 - -$mailMerge->createDocument(); - -$document = $mailMerge->retrieveDocument('pdf'); - -file_put_contents('document.pdf', $document); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/convert/document.doc b/demos/Zend/Service/LiveDocx/MailMerge/convert/document.doc deleted file mode 100755 index c8441c5c3fa3648ea04b43289062c6c6edfa5097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51712 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 - -$counter = 1; -foreach ($mailMerge->listImages() as $result) { - printf('%d) %s', $counter, $result['filename']); - $mailMerge->deleteImage($result['filename']); - print(' - DELETED.' . PHP_EOL); - $counter++; -} - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/images/download.php b/demos/Zend/Service/LiveDocx/MailMerge/images/download.php deleted file mode 100755 index ba6e48e8cd..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/images/download.php +++ /dev/null @@ -1,30 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$counter = 1; -foreach ($mailMerge->listImages() as $result) { - printf('%d) %s', $counter, $result['filename']); - $image = $mailMerge->downloadImage($result['filename']); - file_put_contents('downloaded-' . $result['filename'], $image); - print(" - DOWNLOADED.\n"); - $counter++; -} - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/images/image-1.png b/demos/Zend/Service/LiveDocx/MailMerge/images/image-1.png deleted file mode 100755 index 50f44d2dbd055ba75193c1bbbf75de990396ac5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfEiP7eRgGI>!jFJLk|nMYCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5(HleBwYwa-J@ZArXh)9yDYG@(wNd>YvLIzW~StfgilGbqtK|o-h7`c%H6) JF6*2UngB;lD^vgg diff --git a/demos/Zend/Service/LiveDocx/MailMerge/images/image-2.png b/demos/Zend/Service/LiveDocx/MailMerge/images/image-2.png deleted file mode 100755 index 51df1173d8d6909c752c8a17a2866cde584ea72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfEiP7eRnwgU_0~Wk$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj z3setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -print('Checking whether an image is available... '); -if (true === $mailMerge->imageExists('image-1.png')) { - print('EXISTS. '); -} else { - print('DOES NOT EXIST. '); -} -print('DONE' . PHP_EOL); - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/images/list.php b/demos/Zend/Service/LiveDocx/MailMerge/images/list.php deleted file mode 100755 index 4f35b28e0c..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/images/list.php +++ /dev/null @@ -1,23 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -print(Demos_Zend_Service_LiveDocx_Helper::listDecorator($mailMerge->listImages())); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/images/upload.php b/demos/Zend/Service/LiveDocx/MailMerge/images/upload.php deleted file mode 100755 index 4908f76217..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/images/upload.php +++ /dev/null @@ -1,29 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -print('Uploading image... '); -$mailMerge->uploadImage('image-1.png'); -print('DONE.' . PHP_EOL); - -print('Uploading image... '); -$mailMerge->uploadImage('image-2.png'); -print('DONE.' . PHP_EOL); - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document-concat.php b/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document-concat.php deleted file mode 100755 index 5f33ba2152..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document-concat.php +++ /dev/null @@ -1,250 +0,0 @@ -log(sprintf('Making temporary directory %s.', $tempDirectory), Zend_Log::INFO); - -mkdir($tempDirectory); - -// ----------------------------------------------------------------------------- - -// Generate temporary documents - -$tempFilenames = array(); - -$mailMerge = new Zend_Service_LiveDocx_MailMerge(); - -$mailMerge->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->setLocalTemplate('template.docx'); - -for ($iteration = 1; $iteration <= $iterations; $iteration ++) { - - $tempFilename = sprintf('%s/%010s.pdf', $tempDirectory, $iteration); - $tempFilenames[] = $tempFilename; - - $mailMerge->assign('software', randomString()) - ->assign('licensee', randomString()) - ->assign('company', randomString()) - ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->assign('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) - ->assign('city', randomString()) - ->assign('country', randomString()); - - $mailMerge->createDocument(); - - file_put_contents($tempFilename, $mailMerge->retrieveDocument('pdf')); - - $logger->log(sprintf('Generating temporary document %s.', $tempFilename), Zend_Log::INFO); -} - -unset($mailMerge); - -// ----------------------------------------------------------------------------- - -// Concatenate temporary documents and write output document - -$outputFilename = './document-concat.pdf'; - -$logger->log('Concatenating temporary documents...', Zend_Log::INFO); - -if (true === concatenatePdfFilenames($tempFilenames, $outputFilename, $processor)) { - $logger->log(sprintf('...DONE. Saved output document as %s.', $outputFilename), Zend_Log::INFO); -} else { - $logger->log(sprintf('...ERROR.'), Zend_Log::ERR); -} - -// ----------------------------------------------------------------------------- - -// Delete temporary directory - -$logger->log(sprintf('Deleting temporary directory %s.', $tempDirectory), Zend_Log::INFO); - -if (is_dir($tempDirectory)) { - recursiveRemoveDirectory($tempDirectory); -} - -// ============================================================================= - -// Helper functions - -/** - * Create a random string - * - * @return string - */ -function randomString() -{ - $ret = ''; - - $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - - $poolLen = strlen($pool); - $stringLen = rand(5, 25); - - for ($i = 0; $i < $stringLen; $i ++) { - $pos = (rand() % $poolLen); - $ret .= $pool{$pos}; - } - - return $ret; -} - -/** - * Recursively remove directory - * - * @param string $dir - * @return void - */ -function recursiveRemoveDirectory($dir) -{ - $files = glob($dir . '*', GLOB_MARK); - - foreach ($files as $file) { - if ('/' === substr($file, - 1)) { - recursiveRemoveDirectory($file); - } else { - unlink($file); - } - } - - if (is_dir($dir)) { - rmdir($dir); - } -} - -/** - * Concatenate the files in passed array $inputFilenames into one file - * $outputFilename, using concatenation processor (external 3rd party command - * line tool) specified in $processor - * - * @param array $inputFilenames - * @param array $outputFilename - * @param string $processor - * @return boolean - */ -function concatenatePdfFilenames($inputFilenames, $outputFilename, $processor = EXEC_PDFTK) -{ - $ret = false; - - $logger = Zend_Registry::get('logger'); - - if (! (is_file(EXEC_PDFTK) || is_file(EXEC_GHOSTSCRIPT))) { - $logger->log('Either pdftk or ghostscript are required for this sample application.', Zend_Log::CRIT); - exit(); - } - - if (is_file($outputFilename)) { - unlink($outputFilename); - } - - switch ($processor) { - - case PROCESSOR_PDFTK : - $format = '%s %s cat output %s'; - $command = sprintf($format, EXEC_PDFTK, implode($inputFilenames, ' '), $outputFilename); - break; - - case PROCESSOR_GHOSTSCRIPT : - $format = '%s -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dAutoFilterColorImages=false '; - $format .= '-dAutoFilterGrayImages=false -dAutoFilterMonoImages=false '; - $format .= '-dColorImageFilter=/FlateEncode -dCompatibilityLevel=1.3 -dEmbedAllFonts=true '; - $format .= '-dGrayImageFilter=/FlateEncode -dMaxSubsetPct=100 -dMonoImageFilter=/CCITTFaxEncode '; - $format .= '-dSubsetFonts=true -sOUTPUTFILE=%s %s'; - $command = sprintf($format, EXEC_GHOSTSCRIPT, $outputFilename, implode($inputFilenames, ' ')); - break; - - default: - $logger->log('Invalid concatenation processor - use PROCESSOR_PDFTK or PROCESSOR_GHOSTSCRIPT only.', Zend_Log::CRIT); - exit(); - break; - } - - $command = escapeshellcmd($command); - - exec($command); - - if (is_file($outputFilename) && filesize($outputFilename) > 0) { - $ret = true; - } - - return $ret; -} diff --git a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document.php b/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document.php deleted file mode 100755 index 4895379769..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/generate-document.php +++ /dev/null @@ -1,82 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->setLocalTemplate('template.docx'); - -$mailMerge->assign('software', 'Magic Graphical Compression Suite v1.9') - ->assign('licensee', 'Henry Döner-Meyer') - ->assign('company', 'Co-Operation') - ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->assign('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) - ->assign('city', 'Berlin') - ->assign('country', 'Germany'); - -/** - * ALTERNATIVE: Concatenating PDF files locally - basic - * - * You can also assign multiple sets of data. In this case, each set of data - * will populate the template and the resulting document (one per set of data) - * will be appended to the previous document. Thus, in this example, we create - * two documents that are concatenated into one PDF file. - * - * NOTE: In the case that you wish to generate several thousand documents that - * are concatenated into one PDF, please take a look at the sample - * application 'generate-document-pdftk.php' in this directory. - */ -/* -$fieldValues = array ( - // set 1 - array ( - 'software' => 'Magic Graphical Compression Suite v2.5', - 'licensee' => 'Henry Döner-Meyer', - 'company' => 'Megasoft Co-Operation', - 'date' => Zend_Date::now()->toString(Zend_Date::DATE_LONG), - 'time' => Zend_Date::now()->toString(Zend_Date::TIME_LONG), - 'city' => 'Berlin', - 'country' => 'Germany' - ), - // set 2 - array ( - 'software' => 'Magic CAD Suite v1.9', - 'licensee' => 'Brüno Döner-Meyer', - 'company' => 'Future Co-Operation', - 'date' => Zend_Date::now()->toString(Zend_Date::DATE_LONG), - 'time' => Zend_Date::now()->toString(Zend_Date::TIME_LONG), - 'city' => 'Berlin', - 'country' => 'Germany' - ) -); - -$mailMerge->assign($fieldValues); -*/ - -$mailMerge->createDocument(); - -$document = $mailMerge->retrieveDocument('pdf'); - -file_put_contents('document.pdf', $document); - -/* - * ALTERNATIVE: Retrieve document in all supported formats - * - * You can also retrieve the document in all supported formats. In this case, - * the generated document is written to the file system multiple times (one file - * per format). This is only for exemplary purposes. In a real-world - * application, you would probably decide on one or the other format. - */ -/* -foreach ($mailMerge->getDocumentFormats() as $format) { - $document = $mailMerge->retrieveDocument($format); - file_put_contents('document.' . $format, $document); -} - -*/ - -unset($mailMerge); diff --git a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template-screenshot.png deleted file mode 100755 index a993087a7b496aed3a24f4765475932b67aef40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126090 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

~{F_aK)3+oJQr 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 OmF3l*6h1P0_x}LAkG9VM diff --git a/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template.docx b/demos/Zend/Service/LiveDocx/MailMerge/license-agreement/template.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 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 - -$mailMerge->setLocalTemplate('template.docx'); - -$mailMerge->setFieldValue('software', 'Magic Graphical Compression Suite v1.9') - ->setFieldValue('licensee', 'Henry Döner-Meyer') - ->setFieldValue('company', 'Megasoft Co-operation') - ->setFieldValue('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->setFieldValue('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) - ->setFieldValue('city', 'Bremen') - ->setFieldValue('country', 'Germany'); - -$mailMerge->createDocument(); - -// Get all metafiles -$metaFiles = $mailMerge->getAllMetafiles(); - -// Get just metafiles in specified range -//$metaFiles = $mailMerge->getMetafiles(1, 2); // fromPage, toPage - -foreach ($metaFiles as $pageNumber => $metaFileData) { - $filename = sprintf('document-page-%d.wmf', $pageNumber); - file_put_contents($filename, $metaFileData); -} - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/metafiles/template-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/metafiles/template-screenshot.png deleted file mode 100755 index a993087a7b496aed3a24f4765475932b67aef40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126090 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

~{F_aK)3+oJQr z5J~&Bloy}ps#a{e3ajTTZV8xgZQe|0=Ad_XLV2lrhcVC99`|E|jf$o2=Qx#HW8!Z| z2>%IBf$)yn2FpnGOFW%sviSXSW(sv4gI^8JJX3Y;f;L-E1xc{t@40MkkEK6Cg*zE! z2QWA(#sr)dqq4wY_jd9F-KinTyjeGL0K{QZ8c|Y|QO;Z8Z ztx6_R%>lSEMRhLTiq_>|CzyQ`A5@|3|f(NLMxHG&P z4Cx|<cY7hteywe=~KoN+x=0n&JI2L6_K?$UXCr6Mqsqa zxHsp9SH=U%abvcHR4#j}AYA9Z$k0M>>Xg^ANfb#Y$8fn>zB)y72(1~f)>r~(YtDJ= ztiCfoVjG09zj>O0!s!JstivmGA~IYCJkI@Man2 zzJ}p3M#-d=eBSoRUv;paOO)_KJZE~*$SPnSQ_^{e*#UHKQ$d|;tL0fxsM4gyWvaGX zqah50U}rmecqUF*l6JOb?+-$DA_+qPR(!6(r7O>e_rmrAY|$Dx>8uQIR4`lj1hhJ( zRfmN0CWSq}S$q$(O(@2R)hy3>t8eYFR~?l~WadHa>xhqq)s4lh=Yo*OPEv;)M}E)! z2XCtOGuZ#^9V9FR?#T%Y{>EyoC~K2Z!?@J!n~=F`yg4C9s*rwb*;4S@DKj)%o=!Vp z97bH@{y0~O=BFAY)!`VEO`6+$cXpL%Uu0H1mZ+t9S)etu2qO7_fn;jo?sVU7N^5~5 zIB~4Z1Q}zzhmtjAv=EzV2kQB4`phUl9$=&o%$mbkrCP0qxa@-N zYU|*$zya*}%`c664+7T!1O-rI1(|(g`^(m$r}gkt`b{zd_|hHMTg0iSnQ*W`2DPUF z?Lu+`Toxw#vE`d%0@*)u3BkLC9PO`kk-~VKF;Dim!XNK(I=QW;BYhR;4`A)8Isq=gW^mf32`m(T zLH#R&O<~4Smhy)(|Mypri!6_W8Y>r3fSKSEOK|M!x)CrzFp7?PEqen&jgC9@j3a*c8SjPU>^Co*o67724 z?@%OYL=u*%ky>x4I09PR4wYG3C2P0X$TtdzGy&F%j%Rb~4Tyqz|5I z=q3{IbS^3XF*QZP`+Ce6B~H-qG8!H#e7J`2pyO}!F$p~Aj^US8+#Vk zE*iX0xIu!&`+E6FZJ()}hWYjXaX_u)2EJK#Vsxd|BOG$l`og0EvJCn-uKW>tU`X0o zRMk=;VE982eVjr5?VTO3dsx z$J)>Hd#k{-1PUPy=H{kESeFgOL#!id;C zOW&-kuMP6gBF#*B?e>zTESpO<@ak5AM)P5XI~wktI}Tnik_B-bC_jD2^FJQs_2R*k zKMI-7Iflv0eQsiMP0+2`KDJs&&UjwBGHIyXu&^emc~A1+#Ed6m+8{9_f478o%E|w+ zxFpESV0QJ|smhA#Ddagln8_Eola!V?KjdUS{Ht6~{YcxQQdT2$?uFCv55$T?%C6K8 zFNYQj&a`kN9a+Hw5JTO%wKEi~d&|FYIO{uVAS*;+AXVv@Kr|{>LU=MWsA1)pA^exS zJ7lN>)ZGr#0R}tLB!mY>x74-wY_YDasQZo52l0rn>}5t&%n1+fs2|TR6BMp`lmF6N z;}vf|I06Kr)(u`){VFAiW?Hts_G$O0E>Nw?gwAd_)9ubg(M1nMfV%g5S<71riCN{E z)LC`W+MOanVRXpSiu{u&$}8fWqo-&^zYaiM zZAAkMVoC#*bT)0mu5xBgBz>i!;ZI;T5GZ z*q?2Qco(n=yEh{|GUwRqEj%cq*0Ps|*-TY_CCyv7Q^W^^ax>c*cTu*-o=|-FbkyT~ zB{xI!a0#s-={j45v`XJ-P!#^7A#WG|s;!mg%b$dVaiAa8WaL|CMSHWtit3>FE68 zI(bGTWsR~o$F4sU#j|(*u{bcb*cm+cz0$B>=2?m8%5b9fEu-;_v^5BV#jc}4e&U@X z5CVb>-a{v=0X1%^AG8_2M6r_N7|oydN7p&@Qt-hr&LuVN=Pb5|JXb0O$}YcS*oD}@^r*vN7E ztKjF4XL=};%$0YpF_Skg{UAkqZscTUDw*Iq4gqyyX#CY^hg<6OrgmoFRwIX@E zXGQk3-7z2$GbY?%m?wiAh8PrRJJq(4^{%$`8zN@93eystk2|@8a0^is*>5ny*Hp%x zBE*6Yu*VKNCmdwDhirZv;Jl!5c6S)`(SiY`qWSO+ zL9CN$d^Q^7day8)=Y$769qnf8Qdp_Vj$!|1?4=2#pA-}-&XU|zR={it?3K3^_vk0R`jFOV@}WIVtSiglbT#s7jNE)%w2g@oi6V1d+og2#3eC zZSeA3!)^w1diV_xdw?Z{P~a|Q(EbYs!XIy|WySa&TI!|VTE=2lpKJ1~Y(a(Rx8{6k ztyoZkZX52*+3%u3zg9cHZy(wW_H%A}GzxEs&|Hy&A$X=z4~U@6tZtdlL1M?R4z345 z_}pzf+_2y>^DWG6?dwJdABOZg2`@pszg~Cb*)1)b$8tJ6(oIg``?SkAQYD+8q<=0-5)hh8-PiMYmK0-rC1T>>fRovr#=sQ>moL5DK#Qzkl-d(Zik?qdpn;ENH*= z;g&$+ky*D-R&hn^5CL*L5E^3hAlADOVomuJZ8t^c;Dn%ow%tJlEOh?kXejRp*0V;| zAhc-|l$>UEAFbkREk`K8m?D69G0+e$A0VwkzP45EU705k{Yy1`&>VyX!3in5JO>mo zL(!lEw@;g&B5xkq42Y{kx!pnbdajZWTd_FHX~26B1V_p=vKI(g6vJCST%Gl(wOjDQ zGres?Ziw|NG+~H>goR;2_|O|B$O+To=V`mWB5F!5X-$!$`+koRNsKD)D^fJ@&gK)e zrhYc?KM*7>4b98gS~&r#ga%NZjdQp|d-qD7W7tXUGL<8<6T$FXe25DC_CL=>xAFh^ z_xWGx@nNxFLu6UouPD}=n{y#-6h#blxP1B*YwfO~{PQY0JrrEHAY*Ie6!gW~(QkE4 z-~)w&-Y3&>RzB~Gslm&0=e-iG*;lCb8VeGsKoxjJrkU@W_ihOH`18>B-8%&?GtV8i z(SO6=LBrQ#p{_!q(ZL02qy7`-(#p>J4)cQ&h0e9hw(bdRFCYEW2;BiXq`zC~V=9cCTdIGC zbFn4P*XH+U7gL4!_l^JeE7P)&GUV`6d);=Ihjkb?J)g900FW4<{xwtIpV-=vO0|~; zBpe;d1IC%Bg)0#W(0YOC9_x|!pzzJsZ%EB@1*SER(p7t9X8hSv^;XJg>=UD{!-2li zGyUy(zke5r9uAwh1j?F_N$kUFzvEFCggN5c{QN8^H5OVv( zJ{3s=UA#~Qf8IZzKu#i<7WF*!@c!Es#GsjM2o2<9#uXSq{m)CX2$U+QH1GKXE=IB$ zEQs>wE^eOXClq+d7CO|rPnjDFmXjPCT5gQsrvC5VM1ZP+=ujw+VQ+Orzw}>g1qM@t z0{`@Y5b|P16L`g^X+s|)voe+*UufZmQx+fmdUI*dxNmRFHRwlP~u z^ZCceECi3`kAi)-d)!1lA3|7y984tpp#s6OsY)9b<+mPgSky|(#>-O&+f7AmW>0t$ z;E3;iH%SuAUaoQcK*qx3`n{6_M=2QxcG2TF$Ug{;^R*b-N&dna*7#nH<$2WyoNTJxEYA$vGxwPnaW)ot^QK` z)sI#7o?milB583JOqi$d)j_Y%h zkrucO+Em14u-D<@?#OC9^1m+hB3cRK?DVBZ((mpg4>Veos`dI!?3)Q3H$B3 zD)ZEK1WP&w`(+e3KQ_V~gP#%&kxie&H+2X4;TtRd_DqF(2yfsTB!?pMhWmx?#F4*E z@7AeKDnjQPi@!zU#@ma@fnu4Vd`JJ)MRt$X6}B%Fc8hC$n+FVkDWS%FmVeF-6@2K4 z&M-PFCIwV+!*uM>I-G4$C0J~deBv9-KJ=R;hgMu*EqB;Iht7j| zUyKR;k&+8#2zHm|{^*!4Uxz*wWMQbq?=Y~!Scw8(%)-F3T}bXyf*wW?-QB9K{N`eK zt9n$Ns$5M_s8eCCy%L4WFSL^4cG_20ba1F$JQo|63W5-FqE)L07at-!eys$`M%&Kr z?Run$s;tH3aiHiP21JD=17q_N=+K|z)YCoQ8ro2NIliWa`Heb1k5p6*90Y#`7Yj#63=fw-wY9zRWN*hVLe&lp`mHdV zWuSZU_iBl+7ceW6qg1I$!oi^;nH+aHMdZNAh{xbcf%A%_(GL5crXUC?NrN>kNZ=+c zcJ115g|^L=Jln9*+GR>TOzRsJ#VP;42MfG{s-*S1t@x1`#?e)HJjrf~KHp~YR+RH1 z+tjPI%vg_PDxFI~Tkm_4c8Oq5zoZdHXWgAv`%=EqEH?7xx?=9t3z>B@)N=*T3DaWuqlx2=`MwFutKv>EVnOIHJ!r2cMt3f9ooXfI z(~BWY@CoO%XbyZU(ZpETaM8AY;`=(sV%IW$cJh01k8RGinv^}>34X$~UvaO0?v(^s zxkQMyfdCQ&8R}Uk$b+Vt1-id<=J)fDaVY%0=&A%)^hvuPC{J@E#{_4V43wks%P=82%zAV3w-Wxy9Rsr9X=i>Kl#^pOG5(5H*ZO3Mv)`HiC8WV+_$Akih zS1wmRCUe9>TY+Mvq5xMs6!X3 z@xcm_9f#Hj4UO@e%@1&e{{*8GlZ7@*&?&0eVNS>tJzug<<12D zpSWX7B1CGDpb+3=`5^mK{h_h=e!OSH&q8uIpXTn;GYF{&25F44t~s*LYufEd^J&Hx zGPGwuTzMjAR$V$(#`A>l+1^~khD{@*FWOmDgDD58sZXz2oi0`CK<=9XXHBsVG9U>T zG6cB~5)VV$6%vux6$~9dmUc-}8S*D}+Sk6pmDIdHW|?|D;;4pDh~`zBU9CiA{ffni zvGrtgNf!zTE74j+F@TwD$3`LLnj_jzto78 zte3ry1SVXKZrcYhz}1cFXb`tS=enwda2MrS@if_GvfS_N}%*F*-U_>RTj2-oq-YDaqRwi;Lc997Y?v z8z1(18SYmEx{-x3Y>F3gvbwiMptJi$xGjk;s>HFr`jy<_%MEc_S>s|6B#z)h-_Y}n z(l)z^peJoSropA|Ej2i#to$@eviiE6oCHvOY3>u;94+2!bB{LId?VIWYn?7f4J^=E z^(0`?UDF?Hi&cUG^Y1*h_u!ZIXk>@MEhP|4zh@%t$~?B{7j5h#J@vRpiahK~j`4de z>>nQzct1A1`%t+71%6+8c184S0N1;s`6$|Tt)7gmAziIoVT%>RFPWYLqX9k;XQi3N z);DP=4rMR@$Lw1+gOuwobfGvCFtyXJgF|g9(8%aak4RtxSdoVzGStv?^1+%d%kz>) ztr*m>y(g8es_>0n(j@X7zB^C$YhLY1*8Hlg&l*~4ls3_~ta+@;{EJm?;ZxM*dz$OT zE0Ql%W;U>{)ZNy`_Q2Avc!EjyWpzD{myRsmuVxyTwY>6R?J~13{!9k&3eeM(bAIcI zyU)VD82p;BzES>u_e~SOp5(_t9hTDm(AUi-Q7AA`nB$)=AiGy%#NNz*E zXstQcm7qalYLv7@`Vm&EGBm*?-SQcVy=ktY60v=!RI*xB`|+Y%u0LtvIK3`*-92ce z`xLh{d5P6%%os;te;dsqVNL!Y{Ty_RQgwClu)in15FKe{BA~$W-m{VGJ{4p)U5URO z#qUN1-AMXA7`p!6dR@0^?^PH1`Xb4jw{}UG9+91mcZjZRJQ#Puh_*wExg#wJ+!!z) zdMV8Zk}Y&CIA59+er$A2WES)_yQcnP3Xkjcx8>%C63*3$U<*zbr(n1PBuWI~eAX64 zx;T!0Fa|JTL9_>yl8&uis8v7hrs^g1f*H{wi}|7VhtW(sEY(iF8DQLuG3bc*i$4vyBfadbx0YnZD+nT>ll z+T5&tb|vKtlVo_z9DpgHUOA;bp{bc>|DgyL+a~>jI6!OAqXuU>;OT(@E(t0s^~Z@C zHK9~vlKEvAm9k|UA>P|Dv_uIa26q7nttN!CJ7E1{-kjwh3gMDcghF^dj zpC%gO{p8It)GE!;aFjoW4n)$vji#UKFTb757-=#k znAM$i447&>drOlZx(+z46f>X&<+nONGWyJaL##l^tYTev&c<@;m!zcD?K|(phcZ~h zZOkgf=_xZ{U#U!9A0*la5erI^Bym(-TRC06N&aSv&|1?cb}Z+`Fe==3&g_Tf1JhgEM34k&@r<^~Px?)Nx`g>@*Q6C@xs$;Bn+i81 zr*5CMxE(S=x0@(Ov!JkTfg9T_-wzqvL+=j(UAHL)HQgTTAW6Cvw=)y-s=Oy9OH700 z6LQEId%9k_*uU2m1b;;&>?On+;STF}3$-`wqxY$AXmO`nafVpU@=EV(@FPxvU5q?S zbMHb-m;%e}{09tG-~ytI`!e$fYef!elRiGQ`2x-7@OofI=)kxZK61lQIoMIJ-B`gT zMIOu$#EVh|2V!FZ#D)oojVKTs&i{xFTCDDIWkEW)qfO#NV)rlwUX8oHim95vZv`u$ zZWeB-pPkA4|~wUy*ox;a zvo4OH`EHk9(<86J2W`M_CbM}NYE2pTnR#UTXEX+fC~*3xZZPSQjcI|eY+DK4m`mvF zvHrmgQkYG^ze7}cd^oLN*prUULko-TK1vk32EEe0k;o9_NDapMj~NXHDg{UiaR@Fx ziC3K9KbofdZ6P3S1;p|t=&K@vBG;NleN6RXlo#*;RhchrC;`QviXL@5^2~F32mSLJzL}Nl&+g{Hn&z=@>u%@mTcR5rpN&mPMV{Ez@X#giYj&e*V z?8I`v;|onlYfkHLPTsR-4)tJe#~hnrx?gN7Xi5M7b@dfsQFQOyL$_d35`v0?bV{RA zA|=wP(nzz!QmY84NC-;G(%s!Gh*C>;H_{yoyDa++zVUni-?{eUx`3UTGjq;)p8L7) zduCKj?@6DlR}vwge^;z8NlP~&+{kohR#{Ig=J6hEr620-{AhS1b$7`|nVY&~(YTq# z3_0;Z0Gn$?cSv6gG0H30UBAIWonim8*pa;a+rV?>QzY6rTFKGZ{VG!q?_geV$*7|v z%NHf3=ttJ&@@eRMJ6gGreSX_S5gXSatW8Dwb}pvl9xA>bbK71rt&ttM<2)@*3V7nn zDux5Qo428dfop%NFGDbEGF#&KB(f*lFNWyGM?ixBItKaa5)Saq+R}kkk^m#VEHec# zLu>BBWQQK})0c2m#(Z})TlcLYv1}SM6A^ZDgGW`8W80dGH{TXB1~;*Gc=JR8tRY#q z8|W!OVp-lZGiWdKk|CUWra4}8CSydZ(XDvbe2rqcp{mETQ|F6fXIyKaAeKNqO)|Pw zUNZ&)Y6ctTVv_m>^(zAbTler`Ccev3j}g6nvC5+kNs+a863M#L9j{bj%w#&ZJOYA* zi@MlR7P-*aKytwq4_E?$)`x# z8qNpCw5WD`7%SYl`WZP9pjmwxp2H2q(n&|^yRXErzb{Kk5$tUcNQK+pQ%wn6J?}^S+vxyK%C=4uI?t zv9LT|q&)Tp9Ce;KeglGJU9V#+{QI2rSqcqVRJVoK*r_Hw?|OX;MOEvt5P}iluVkn} zh!6Bacs8Hrx};H=@_G!9CNA$oISGx>sXTZzzqF!fJ`(}sbA!8a3iz-GZ#1O|kskxw zI-4LWkZ|G7UJRlMDO=QK&io)3`ZBhSnEA$20!736$YEvYxWLKuu9Hu(3d?|atY4J$ zV}X!21JV`{q@EbxTEa8*NHq}<1&scvPKD;^MfzkHrwiu zS-^Uc_;eHZDahmglg~SQuTCZ?|D_aRr>xowc**g@)IDx=-K8DVUux_+*(rc`o~cJ|M1s+;Aezx=o((~AaN*B$juR(C=uEmneGfAc~Vg! z-!RkbTSzVS|E^~~zN|Gh&}<-HqsijA_7nw>zR!!FCo8=5BKOn}Wr%|s=}X>O>y8I# z=Ho7-fQUhU0LfL@!&PRU@GLsR5)4B0M?#pj-*yEl?Vq{l& z_^`+f1anPa+EODcbi(NCxsWbCOrIrZx|IqOmXBxy1LnnS`1xx)P3Il6J7cpnQT11G zYQrZ?B>q;ypFu)(ofeFv;{>v`uglCt$TSVMd52>*%qSE$A6poN>yk9A(Rt`!=txB;`)F`a1MwL|dlHbDtm+ zv{80p`@X#1je0QD^-o(EjwuMt@J}cA(tMK0+|qhp_0EfKo(m8^5?K0?zwVKD6qa^m z5r4$jgWeME;=J+>BRrYl$9C(QAAnFIUk`OM<#Jh+tGO#WHQe^dU++w69q{-Tu+pY}b@ghH4~z-wXpgb9gA za}VIm=>~JN7dJ3xf03du+AHwxQPNsOI6F`;*76@J5~Qf76^E}?{6j1M^Zg6Hl#~d@ zfv!)xeUXR$mzY8FmQWHfaA$sSTM`_Pe;df$K2ia;?XZtN5Y-c!U0;1!^<`59K;{P( zkJ-`;>$HFhM|;eFxNZ$Rv)j|NE5^{1@s7i>5SGac_Bghoh6dS$3lNz!DG zLOm;KLIJRTY7i02p$xm7-zN}`vif`0W;bc871>9H`4x?fxQQg+{D_%>=I z!JtOoS0UxAhuk+iVr<465C8cU-aQk-i+G~sfPcbURW&?A=p=Y?aDt&-^Vb>I?49##)N_3nZaD-GqX)u&1h8Kx1} zr%G)Y=9_o~v@d!TH#QR<4K+tH+Ljq8ZvDa5JRDj5UhFwAVy*(3N7rAGx9FU?> zs{WeF)YPxIu55f+zDvzQF(47bU?e>kju2HlZ!Qv*dTZtRL-mDg=UbwsZbj3kPd@vB z+#iEm&7`9b_XSP9i+*xZtI3&I;XEWMpIVHhM5@813j{*1sjHnj4e<0RYBD{4zro-| z=Ez7LU12FTcgQ=jWjMBC^EE)I@g~YjQ%d=l46ScMw$U}`UWFR61Cu>U8~83f=4E{7 z1i%aDKYlyDDk^mFXv{QdA_);Ti8_Vq1ZzuDp310(jj9@`W)|Q1n(`B{8}T;AaBp~v5Njdy#}B(L(6cYowvZAaNlVmlGzv&o{0B!J+9G78(-EF z>(6=f8$iP_N4&@z7Ucn0tmNI}b}$G~h}{|UEqp26v2fYOlH(DyM&!Naj1v3{bD#WW zK(Enj`*rUgCEXEH?UvK(SDPizT+4$er`g$$8JK~Y`qBeMj-9XgFb7QZ5kFgsaz6?A z!J|lAqf4j!?2QMs+EZnk4!P&X`=4c{M*U5G3Rw-wAUlP_q-BEq9<%eNV>6z5QjWC9 zvcyfJ-uH~XKe+U5iKwa(v;Rma^YUSmfd%1G62Lch8Q@%7Y@S-4U|Woj&z>JydCRz}JM>rYGA!+L%@`DJjse zr5y2s40vlL7!b#6X1*wuGU%YXPUPtIwAf)i>?&m^DGZETO`zT*wn>Y3vC@Hs5;V5Z z@dvH;uIMkX{$wSwtI40j=UMf=qlFUiWu3+Y%=?<@o!X->y=W6&joRLP@KF&=$&aA& zWnaX-(r!M0THbngZib9t^#hN zhM&Nq^@4G4NKZunT;cAh|CE2y7*l4X=nslE89ym(K5A$CmBE`QB8OcmnTH#{G=C z7tyOv=yYwpj6Q07mxJd_O@>){;QAk$0uUf_^fh)0HFIJzUY9QfRR|K;iXHI~5rX)CR z-}}tzmpwwBu!YyeeKiqEqYXqH^QVs6%ClrA(3Wh1r!?*m3> ziMHV<@~|^dQP0P_D1J9ZY>6QBU?Qb5wifk>r?*3b zU6QY8LGSzs5paC+E~rNrFt2^d6j)P zlxDm|aiop3Q_dUZtpWRetra zZ(T?}P6Pjj3NT(IYqq)9BJuvHJ=bO>Qu!y;r?y1SwBOD}0v8*AJTDyB9n?gSMu_6e zQva=6d*tD{RWLlV%9C>|W@x>70rkKp3jnZJ#b*Ra40*#eF+vt-siz}?)q$a2{*`2f z4|por|8pv!RCDC%4bhx@C(r_~xW$e)7yI{8y4c&FhA#^TOTb=F1~TxWZmi*iu!`hh zi?s0=z!pR*UA8nK`9b`>wydU)|JeYz5SjWx;Xlv-arW{5>Y>p3hD=Zw`nFfZj$e)6 zRQcNPGVq7Qur~Lc!gnoZrn$%C>46Gn6bJX#N(&Ie9$g2(l4X|+Xxmo?=<049M%erG z`?^sJ?DU$aQw6hX>7@Q z@AHSgl@B*x$6M`Y`61`LrViqQI8+RI)-_j8Pha>$h(Y%XxehS*6*A9*BK;~u2xIf& zMgHiHY0T+cuM69ykOl5ZQp4^g;dQ;noAd5#DXkjSqcY1FrinJBdQ~#a_uG(aiIEhb zv%Z!BXgvM+BxeWH+@VFrseF6DxxF2BoO$Q0;nl1l#B%XK2~bjyAW4cOrBc!1*>QkTmfhF#5ITzk1jV^|Pxl=JoA1MVaqx^o=!SL|-;!aN|eS zCV88h+_jrH`}V+Y<- zI)_%%MgS3AR?|Xc(URHgB|D8~Skg-l0R#r_n?J)1XW51f;iS*mXx!_apWgn7)^ZYjrb$MF;R1k-|Nzovn<-AqGdu}VRHt{63?o_T+qE@`_E3`L)Pr6P`dl@RFp~P zYdraCao?zyzEPFlD}L^wGUv_iR~n?3(;K;( zCTpKzY!7_@t`NCX*^|f1GKYckLPm+ zdikw=+Dxb!olU@Uc~{c(iA9RG%;VmVI=_Dlrlz7o#$Df!GDto)QPd8C{FIDp_JY?W)wQJwWwL{=8V{K?R@KwU#r`X zBLg}%PKndjC~IG(NruTSBy!*XXxAzo!wgK|!(=rEa=dfz067A$ap(r|AA+jl_P>T8 zFODAGn*r(#Tr;)qwstIZkeTX*)o0w7d)b?gn5((YSkAH5>RtL;-{cnu@V@@i3yTyj znb-FZKo-gp`$byOrJzIb875wA|H1w~b%(Rj-eL%wuZ%GgfNdrkVj@T{o1fa3bfE_we6n{ zZBzZ(nw0p;6zx~@8$Ud0?$ZgiTMkzT#lO)#gH5LXu-9p*^J9e%WKh1X-=}OJ#L8uW4xE%7Y$f%b@A$pq~>~eN&!YiR60pUJ5(sWv_|?-!=6p6k6pV<6?Yo(nmt;s zFC{*JPYL8j^WtUSILo|deoY}jXZH3}#7BS?nMX$ihy?ViCS~_n52?#D4RIbQ;lr|x zRN-m4!KEIt)$sSyWjS{!6>K=f@t+#u!#LrWe}*evt;9sc%L- z68DJu?%~VE+;TJR?H^jmK@76{W@&8bN>}{Fd$-*H9$c8eq}mEEE{hT&43Zq&wUx2C zrLFT=4>a-I(P=s9v1Ofo1Xz>f!(22XD5!z%?ulxNSvx3T-Rr(~NoVS9wN-=IuVNCI zpc3h&E58H>z##i%f{<^?FDZot#x+%ZRKr|lhY{Nyf8yYaw2o>npU+*iXJe)dnRs`5 zM<9M&iwuyX27V<^juEid-;Gc5)54Ses=G%9D2HR4My0Mn6pH*T4SqXQ0G9)awkp4W zw0ic;YXm$m%Dp!asDV(ALd`m>quIq7^6&;?MoDK>7aN#@iN${O?Zn0ZcP!iH_vQbZQUq zVS_kWb2(=_mU!gSzv0%GANkh@4+qn$^bS7sn>gcWR0`I9@ z8&m<6uXf5U1o_2vWj>=GWh);Efy7<075#e1v1niX5$(66)NSSU2B)hn8s|#u37QR| zoPgd6*OhldofGdkcb4{q(Bv>{4kxA<-@zh43C(X}n!JU_+Qs!T3s$;KQGXen{6;a? z?IyMD;@H2{tP2Ldb$`8-Te$8@G-^xtX2KMY6;}#ds-XX^uR{pS-uvo#)k5G#1oVCm z`tE^8kzZZR$M*gWEr*T&o*vBSxw;UgAkcnI^(AX;$j&6~0czS+pXusYEM_ddu)+Z{o|Q^x|8z5U^I~ ziBM_*_i{ZPq8w3lrb}6W%qp4B!L{~BV*;rchRF*DcW=oCNQhmd$59Fk3yWy8$(~aH zi+_%Tk@^;@uR5(TtPxWct&%U35F}I%>QI7&}}*Y$8C8} z;Jg7}*2}Br1!224UUJNZAMf|^K#MIfT@chaY)g}vAJor`|Ih9KB2GYPM>vSt2Q39H z-+2M5R963b!~Sx)9`)3MjD#0H%FsCxPzQ_T*cUHRPFG6s^5bP|&zpRn1#u{4+U z4joBv*6XDBAf;s`A`O-Z=H=W3Vum9o?a6@`aPd#Oz&{L{z!)iX>>%+7w7b~}zt`3Y z(6bc&9H>K(^X?+$%gR?+2oX&o<1`bp3&RuvQu>A3!l}Spz}Sz#2dZzE3H)06gp(gS zoTp&wk$3fs-o29T+cj@ftKSsMYu~2L&GOE{`I4hKLV5(ZuzwIyAd0gXflI)vv<+G z(hDb;Iv76$G{}K>ckt^m=?d0*fKtqL%;-+{{8f@Cy&7BKJv=4zd(Y;`fz&%!BCUuP z?}R9>N`C`by)%ChBu^yqobx-zDQK|vJrn(NHEDoPFMyM^*rY$pgP$Bw9$hS-rxP$w z1!2qhvy5B1FnriRUNi0&K}}t4C$Lh3Ej#D}APpi@uXiACGl(ArJUoLC52Me&!q^Y5 z(WILmKggg-O<)dOjTFRV^)wNj{&O5zka+>88$Li&2Sf7Ede?p4SiZ`dXw=jgU=KDn*x;6Wq0*`eEwA9nf+Sr&0mUU6B zE>Sx76<@I@*44w8-4}!j1cWY@@=g)J*zc~=t@cdd4h8lHc1-{{U*z&FxbyKZxr*kL zeJ-H%Pz8QRu$5{sjT<05zOfrqkOOF3QM3B$MsRVOeJA*`RrCLo+-Wnl67Wp_c**}( z0}fq6FJ|gr?j8+UeAzL+(MiJMCpCT#-_QgaS9_@trAn*c23Fsa=_?jSHw&Kp3)cNzU+H zmIOGjEVvA-daV9=buLIi{5=E!5PFwwjg;u3#}`V}CrwZ?Z~DXR1F~j+qLidl|8(d%b*8%kBv|xDRlkf(yfQiQAjQ`7WpkKV< zyny%7K+`Jdr2nT~OdwU9AdC-v>z_aUnXa;+ZP!qi+8cpvBrKk>CABLc)&xz!cR;^9 z$=|{A;-EKx8Bp0e1F7iW>;VOnxOc$Fb`AME)>w}&Jz&gviNU%lK1p3`I)`|PXrJOi zDmnm4`HofZrlj9CF;zlE;3c?CvUXkJi5O&_nStMq9l|U?-6cSxZm5_vdXw^-T#7TY zG4BvLZ)a5M8VGNEW$`+Ot888!O(B$-ZX@Ae0h=v{sAVZbKZuB#--TO@PN$xOzPhbX@Rpo5tn0nla!Hul22uZ z6MH`(Zq{q;&gV}%M-?gf|V`)o*2f1Ft>Tq1kLWchA>IW8G|{2C7vB&)LiBc4UF@1lGL;b*8_rgMX>9q5)R)1sphr_*v$!JY% zcIBo+Zk)05^>0s>%c3?#)1*5(j$ZuU9m%ro-z~_LFt~Hq1y37VuUSm(PF}a&J8N^RnD@BFvMGUV zETkFC;v7AQiR!YbAqMZKnZR$FnAVje@T)eXW)dHS)wj#}abxF6wf(BzS31tB#fUuM zfEKX#ZzQg*H^JQ&Yjn!J4)B)v*TYps4thWP=f=q$MPW3JgAHvI^trr$Bffe3MkFOw zMGvP=2Y^fJ{&poLuJrP7`Gy{WZ`o;SxN%Td8ijYv;P{qlhM099D-?S)x;Ct9nn7#o z)8DoN_YQ+Y*YB^7mvKP0CWIl>6t71Hq{^LpPp|2VIo9t5b>k5bpY%wbE=9T1If!lV zAa2$!Q3MCh-w7GzDyn~kMIWVE!M%c@N9)UVrq|S7v|bNGZnyjn?qr><@$1!Q5UUBY z?83Y~WLM9hk%5-`a=T3SK|S zbYn&iTGnROc}1vWDnyIuur^3Z1l{O%t&;Gh+F&GiuyxOVfso(AwTa@F0S)Xs-3g*O z^DEs?)TLyHw%pMLP?H-Q2~~{<_3Pd)db6qvYXuU4R~+m7)<$)w(OQNkmc3`A>O5I! zyn^h)VQ!(c;pqWm_{PS^?d?9^AF++Ay5Q<~^{H#u!+E(?b<)}j zA-ITJjiYc|UD8ir5_eOYF2k%|Hx+X*GBRp#Pwe?#r$iE-m}!jDABL)_cQUGV zHuLuqB2x@*#?(?Juy7La(mEP61{!3)3nyE)7Q~2aS)k}!v4&Lm@T)$S?9=F#A%!_FU4c7Zm*ve zbw&Ny-rn>rlA^waf))E7gEOvzveu(b|6`0)Z&z^kb`$B`Pi3OqYiYM zb{vQnly<9L41HH#L;9RJ^d$Q2p?QU?q($nm*xdn|W#2g0r>C;$mIi{g@R=1xei{$n zyp_HvEulh+-L0a^Nr@KDr0)Hk74g|U7JY+G6nbDqDog=e9lX$XUs0kr(UarA|B~wb z(lm?k2F$@v+d)ii@vd6hr%!u_Gu}J>tNm&A%k^-58%h#?_VwY`xl2Ct5OfPu(V)!C zzIa6<^GQPsd9QGpP4X`4x?8Yo<16$Vv|{h6ghHZ5YxA;)%#hZr7sA~}yH~j}^EBPY z{$Fnl!Ba9Odk0ImXsv60S;*8$s;l_rX6;mdPuG@V%DC?;qE&R+b&Jm}DTdeFxe>Fr zRt{YuimzSx+AVsQC!OW^cKG-XN^gaN-#*pFxLR1hFu2DkYeWjIwE@Sj?T&BgbC3Qu zM%tI+1aAPjRVL4!m@3LCyRv9K!#M_u!5U}Hdr&aUzm!rRC$+ufDu$BiOt2svL--2u zV-fqOsdh%fy$vE*#@EPjb5vP*HvG%dSW(qvVN<7%Az$#hIeo8I;^NEb=8@7VjNxuv zy-@n#Y^l`%T@piQ%g4sEI9vLy4n95lj|U@Ry^8fdyXV`{kU8-inH=_Uzjc>U!PY0c z^X1+shg#=F;zS9Lu#qBD^}#Ilti8oHt(KCnh{o`r}!4TM0E|-lTihy7kq+UF!*s?rS^dZ@kWzac6qv4d@Z1 zb(ZQJclle$%Nt0(D#PkZmHQP+D7+|ZjCQcs%+!`CpOgZTl3w4G_d;z0NmJ%5&p`F5 zqVMJl=@>AaBqJ+!GTM!>5YX#W`6jM5IFLWZMPm5OM@0U2?#>b56zZqoah#N*ou`xI zUCC0vO2M&&=Y$ncl=66ciAh4fZaplW5ZH0`nkVeAT$x75t-nv(z@w=T->RW`Kp-76 zuvJyBV4qprCZm}k0X}Vxy%X<81$;UoJR|~;RLm8 zn$fe?%|YS@#i#d}9(oTi2#f3ZCx*d~iqGRM_)IcdvUo4TYL3gY+Qtm^7T+^?9QDN< z%CRYTA0>(}+5g&&ph{3C2{*39fx+x;GR1D&^Q`CD+PuR;P>S6@G?auMtR(JPla6xij&C z0lOR_&eAz)-Y7X?XVz(^60OXKsBi1=93xIC&QD#|9dDO%+dMoPq6n$MB+2;0{m%9j z4QgEOV9)1du3(RFtmrJ$;Ni^)_s| zxfWBwg!|{PQPT`}U-aNrUy}-4<;Kw`*EjuW+*lmf3oY;WI&a1maWhB85}#u@3OMie z7#&hz6~jN4H`@v(6-ikPUI)f-n;v&*iZ{r)?LW`B7}qYt?5C=fzoq%rgz@LAOA0K? z+`uy%=Z(2$q*&l%7s4@c4>fi85k5;Y;HomUF^vmoJ1?d)R2}td6qOu4ojWi`t(!#s zu6C>(>_-z9*jZ6ADOFvXRzXI0r5Jh_mH9IcPb!yv^EiIEDAXQ?8gNDFTg*$UXlLfE zl%0$(=R$SFjs2?~FLi&qkC4`Ta(FlU^n&-Xg z`s}6|Gd_m-R5TuIdQMwVsu8*TmP7SH=sdJLudddDwz{W!i*zA=XHV@{_^_&@)Ucgv z?N;}7;7p4JPVa9uf~f4dOy)i^nF)kl6?y^kwTC=vgTqjEMy3KR^mbhjVjNi{EedmBj6O@ax%0kgzQm=4Y*NF=&X$TQaZf6= zXhN;-l4*KyZQ~Pah<6%!GyV)YmO4mLj+K=PjcbTg=+=|3f)o|EjCs$!klP#U za2+~cUMsKIzQT>GnSpOv;y0bAb-X^t7^|yQTmS}sC=zngwPRyAO%F|WHC=QW&O<`M ziczoTp!D5Fc7<^4PThlD%xC4w%O_r|@pDI|t}$scrk*oPUcdKpPL6541^Eg#V!Bgg z484Th$7F4#TB00%NBYO4r3Mi68FCPxIBAyFdY-%eV~LqwmEq_a+OtI3Fu%sNCEd2S zjB6p^Rvxnf32O+qwJV8vXYbw5t7Q5z=~?=Q^K{oH9T6FUNJLgqu79#{+FiP#JA=?n ztr$0C&w+n><<&ynB-$tSiQ>X7j4NhR$odBDXNBb(pX(}rtx5E_>rr;u zQ}dLHz=wuE7@r6kkj1!~Q=(#nErc?h9+|M%br``hGcTSg94UMpj(6wRyJ?L*+|eswwABP&K$3 zwoRL?K79YCrSZ{hVq2{@L`^5scs(%LI=Syw3h^ z!vaQ?IsD;9nC3xNRv!$NYqOcPVLfoRRlYJNpDW?@D_2){Z7wIzZEi_h+#EaYzaW6M zOq}%EeV}>*rJ(v=9n0)#Tgnt<5`PfL#+&5h+@fIOjr7?1hfpK zTN;|;MU6h#^<8(ZFLq1XnXi_9yCR(Q*pzceI~ch*%jKVPHTqVvhm^{WEZX%zS*QnN zbUevDGy80S6={ld-I^uzVuZr4vK-fWV`ExKTy`q_)qn9GoS_{K^lkecnHpqvu0dED zyE*W`i$gx?6q%@MYikR={6QEmu;t3&Alx+bcvK^yaaLoNpYe02daF}yy%%qGUCRC* zGsQV=C6m5hvsLDXdShF{uOihXWw_XCmDKdHjtT!`sRKkA+?LKR%8dwi@)sP)mh{Pd z3-`04FPQWS3i98}3ui*E3@kHUcXJrNdOzM19OPoYyIs@rA^zeqsT+7rmbeCHV6#YN zl%T0$C5s@&cfMF1>*c(KhCnwReb>%kM)yl>kwCphZJ;jGnox&hq1vob*B?&x=Be*6 zF^W4CsZMTEz&jNG1-|s@NyAkyYeUT+p{q(oMm#H3_s?mQyo8SstEk(f{p?kt83LkR zla_rUn>aGTRhEhD#r^IH_8~jZ>qowIk%fv#L( zp)?mN)x@&+yZ$xrI4yb7od;J2XBGS&Gnrt9E)6!2%g>|eetG%FPRL9&yE}c4aV?yA=ajsnr2X6jc{FH&80cCrp#PTV(e1x0_8QNu z#WCi(k)nM;GaAX|g^(z0QdiqIEpt&@k1`){jlL`h#~y#QcqUoHbGYfKNO@Spb5Kb3 z>ldxA=G4QN6onKnkA`{O_Rpw7eN<$E>8)m=evG)=yxhb#G{1|go_*gX@~WG!@;!8M zojIsSNGvasjpDq0PAj_BR}-X+AE(Jk&0WQ_?1kI+p7a)(D5Y_{&>WATdNFZiSlh7T z!ys}*V(^;Yt=1yN&}0U>*UNsqcQ73znz|o}<>iz~L?b)fao#3vm?-7%;sv_FZX4lT z0AH1#ccQ;Vf&E!o9PSgn@Nt)n;5m}Z_Bl9Z#5VXZ5agISvH?zC^}P|dEJTHU6CC~w zsIIlTVm$F(ssAT9D?sQ7>1Q@*H~?!&&z-@n@b1!5fh3Y9_HfBpjOU-h8pCuQZhFah zFK{qVm)AQ=h8MR{pgxdP+o0gl_%I<}eM+_p(GVR^P4^ge>}NvvhX_!)3lJh%+iBtJ zJ1o62Cd=OqRk&5AOM2;c)c%622!rq;6q^l zvBqdx7}vb`nFz*>;j#Lr&CX45a{lnex8;?kPgl7g&m9Ibs^-sPvJpe$>+EK)Jg_;L|EVZn1B<#Fgr>>eKadON=suq+LQd zc>8i2f$Uv?Pk`1x1}yojhycqoZ+}tYYE#Ct2nU<-fOyq2E@77GZ|6HC!2|x-12c?= zw%8k;87wjl%mm=dzk2b$pq(?9WxsWu^Xm=LFYyXaPg(7!9f#j8#;i82ak;H_X^Xr3 zCTEg_{BplFtK$(r;wYn3gg_-qsYu#4_qvPEwI*6b!Je5 zy@|D}Iz4P%N*r=rn3coGz^#J-HZ;9^pRMMcux2`!<`t&n&*?NqF^*IQCjJGVlKJ=J+7o#){Z` zW2C^>T;jNF8W*?cKWgl80f&4{%92F38rW_N9<%r!YGR63of;;t^*kar zZgg)EVdyogep*MJnAtC=)3?amn_iM+U%bOzen|Y#`V)lvL+G@@_tYn}_l_zV&T zmcNxu_4o|CY3qrVw?Hz`#LpM8D2dHLRvoH``#$wR<)(UA?WA*i_ui7x^zZw_X6Enz zJSB$u`A`+0*XSCgA!Qe9+4=CQ?U<+lNM`1aFr_42G64zbL~HBF`D$}~*y4V zLDiGYXy_$O^mzmLVm1+fLF~!KWpR%+&cv#d#ljYly=BL$#CYUj=8CMRRv2wIX$>g^ z3V3E?qkpd;{Z;xg-nX)NX_wcH7mLJuKuX?kmE5{XUj@~7e`6W!yMv#-gwy!leVQW< zmI=lQuy8eVjvxbkagC8W4pNT@q>Xl7XYG5r9sGP#>vggd*H8YspPIwEt)G$Jc{V3O zRp4gKGk`Q&F2(62zx%Kw($r@4PjC+3_m3MJee6JM{kgfUxE4U z6r{&bJRb7jH(*I(u8XzgnUP1ZB*xOK`zau+5;GIq9L#?mLA@3@SukOyYP^kAKj3jaUlU)Erri&I&4`QA3GM_4o3(G@ zC6BxS^v({h_rXl_rIZtnO&*)DBAVE8WwP7AqV88SlVaf@#Z{d_>bkJOpN@Wj98H(R zJ|S!(8E`^B*8{}dwms0RWtqQteqfT%bKXjvX_&6+pHI}2E zeu4k0<)KO4<+vIz5|IqFVsXL2?~p zO|F_`Rv_f(?--P|Aw$Y7QSt_f{JeeZri=5r*LnwYja>?t_Klw0-Kk1KF8mlU&j?+< zj1-Mt$^SlLxLn)JIUA}YHDNydP{&b}rB==`U!-`MZ*k`^fGqqPi$7uWgMQu7O%Zp& zU)*=iw@x)m?HTvX;yX|V0S~Ef$N3?QMN?_;8ofY03C5!X(_hTVJnW#3H zj;`-kaSeEEF|TsuTO)+L(pPw|-OaeWc>$~RIX(x_zdO(f!b28h1)TroBYNIHM_ zb8$pLanGn8s-XObfxXm$_l9v*GqlaVbp3K3E`Qo{Qn%o<;;(#hw_i7acu_~SJ6jVK zX?RyH2Nu$FZ7|MsMP|>s;s7T>5`5VkPhbQOY4DCkBY~#N_>W%6J|(m!{Q!tAu{GV2 zJ}@8@`_6c|iG$eu9`I(L%uZ7t@V#aBIJd`ApK>gVmslu>G$IKf23oa;ZV>cX@ZfK{ zJb{@Gvo*C6bjW!tu*rV;gvY1XoF9URcX^J49gp=s{*&wYY!m?VEmm55*cTd_G@w{| zosJiI@k_DpEy8*B$AcBkk!aX-g8>mh= z=Y^LY2zy5hxZETDc?bA8f7xt-su=IjeaxEmcs;*l;iOI-J&3QQX5X%JO;TZ^0vrqp ziyQDFiGNbl;IRTQuZ_zQ5J%WoTF_Pnt06TT)BwgJ%2p`5GVXf%~k+tWF}qImlwR1y7k-aY-_vASkW?@G9d+D~0z z-#rPZ+TW4(MGR*Er*l+IhUBcr#B*eLqIZyZeyFloB3NuR{?C%zW@$x@qNRXY@y$7m zZ;d{Au}Jkb*63w`Hon~j=9;n$*ga>1Es~inHb~3ShOBmO+HEVZ(!+j(wAf=znuD;N{ OmF3l*6h1P0_x}LAkG9VM diff --git a/demos/Zend/Service/LiveDocx/MailMerge/metafiles/template.docx b/demos/Zend/Service/LiveDocx/MailMerge/metafiles/template.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 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'https://api.example.com/1.2/mailmerge.asmx?WSDL'); - -$mailMerge->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$mailMerge->setLocalTemplate('template.docx'); - -$mailMerge->assign('software', 'Magic Graphical Compression Suite v1.9') - ->assign('licensee', 'Henry Döner-Meyer') - ->assign('company', 'Co-Operation') - ->assign('date', Zend_Date::now()->toString(Zend_Date::DATE_LONG)) - ->assign('time', Zend_Date::now()->toString(Zend_Date::TIME_LONG)) - ->assign('city', 'Berlin') - ->assign('country', 'Germany'); - -// Available on premium service only -$mailMerge->setDocumentPassword('aaaaaaaaaa'); - -// Available on premium service only -$mailMerge->setDocumentAccessPermissions( - array( - 'AllowHighLevelPrinting' , // getDocumentAccessOptions() returns - 'AllowExtractContents' // array of permitted values - ), - 'myDocumentAccessPassword' -); - -$mailMerge->createDocument(); - -$document = $mailMerge->retrieveDocument('pdf'); - -file_put_contents('document.pdf', $document); - -unset($mailMerge); diff --git a/demos/Zend/Service/LiveDocx/MailMerge/pdf-security/template.docx b/demos/Zend/Service/LiveDocx/MailMerge/pdf-security/template.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 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 2592000, // 30 days - 'automatic_serialization' => true -); - -$cacheBackendOptions = array( - 'cache_dir' => dirname(__FILE__) . '/cache' -); - -$cache = Zend_Cache::factory('Core', 'File', $cacheFrontendOptions, $cacheBackendOptions); - -if (! $fonts = $cache->load($cacheId)) { - - // Cache miss. Connect to backend service (expensive). - - $mailMerge = new Zend_Service_LiveDocx_MailMerge(); - - $mailMerge->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - - $fonts = $mailMerge->getFontNames(); - - $cache->save($fonts, $cacheId); - - unset($mailMerge); - -} else { - - // Cache hit. Continue. - -} - -unset($cache); - -print(Demos_Zend_Service_LiveDocx_Helper::wrapLine( - PHP_EOL . 'Supported Fonts' . - PHP_EOL . - PHP_EOL . 'The following fonts are installed on the backend server and may be used in templates. Fonts used in templates, which are NOT listed below, will be substituted. If you would like to use a font, which is not installed on the backend server, please contact your LiveDocx provider.' . - PHP_EOL . - PHP_EOL . '(Note this method call is cached for maximum performance. The supported formats change very infrequently, hence, they are good candidates to be cached.)' . - PHP_EOL . - PHP_EOL . Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($fonts) . - PHP_EOL . - PHP_EOL) -); - -print(PHP_EOL); - -unset($mailMerge); diff --git a/demos/Zend/Service/LiveDocx/MailMerge/supported-fonts/show-supported-fonts.php b/demos/Zend/Service/LiveDocx/MailMerge/supported-fonts/show-supported-fonts.php deleted file mode 100755 index 10f59c239b..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/supported-fonts/show-supported-fonts.php +++ /dev/null @@ -1,23 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -system('clear'); - -print(Demos_Zend_Service_LiveDocx_Helper::wrapLine( - PHP_EOL . 'Supported Fonts' . - PHP_EOL . - PHP_EOL . 'The following fonts are installed on the backend server and may be used in templates. Fonts used in templates, which are NOT listed below, will be substituted. If you would like to use a font, which is not installed on the backend server, please contact your LiveDocx provider.' . - PHP_EOL . - PHP_EOL . Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($mailMerge->getFontNames()) . - PHP_EOL . - PHP_EOL) -); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats-cached.php b/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats-cached.php deleted file mode 100755 index 5780c2af38..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats-cached.php +++ /dev/null @@ -1,71 +0,0 @@ - 2592000, // 30 days - 'automatic_serialization' => true -); - -$cacheBackendOptions = array( - 'cache_dir' => dirname(__FILE__) . '/cache' -); - -$cache = Zend_Cache::factory('Core', 'File', $cacheFrontendOptions, $cacheBackendOptions); - -if (! $formats = $cache->load($cacheId)) { - - // Cache miss. Connect to backend service (expensive). - - $mailMerge = new Zend_Service_LiveDocx_MailMerge(); - - $mailMerge->setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - - $formats = new StdClass(); - - $formats->template = $mailMerge->getTemplateFormats(); - $formats->document = $mailMerge->getDocumentFormats(); - $formats->imageImport = $mailMerge->getImageImportFormats(); - $formats->imageExport = $mailMerge->getImageExportFormats(); - - $cache->save($formats, $cacheId); - - unset($mailMerge); - -} else { - - // Cache hit. Continue. - -} - -unset($cache); - -printf("Supported TEMPLATE file formats (input) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($formats->template), PHP_EOL); - -printf("Supported DOCUMENT file formats (output) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($formats->document), PHP_EOL . PHP_EOL); - -printf("Supported IMAGE file formats (import) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($formats->imageImport), PHP_EOL); - -printf("Supported IMAGE file formats (export) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($formats->imageExport), PHP_EOL); - -print(PHP_EOL); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats.php b/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats.php deleted file mode 100755 index 69db419f65..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/supported-formats/show-supported-formats.php +++ /dev/null @@ -1,35 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -printf("Supported TEMPLATE file formats (input) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($mailMerge->getTemplateFormats()), PHP_EOL); - -printf("Supported DOCUMENT file formats (output) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($mailMerge->getDocumentFormats()), PHP_EOL . PHP_EOL); - -printf("Supported IMAGE file formats (import) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($mailMerge->getImageImportFormats()), PHP_EOL); - -printf("Supported IMAGE file formats (export) : %s%s", - Demos_Zend_Service_LiveDocx_Helper::arrayDecorator($mailMerge->getImageExportFormats()), PHP_EOL); - -print PHP_EOL; - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/generate-document.php b/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/generate-document.php deleted file mode 100755 index 29fe389441..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/generate-document.php +++ /dev/null @@ -1,82 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -/* - * ALTERNATIVE: Specify username and password in constructor - */ - -/* -$mailMerge = new Zend_Service_LiveDocx_MailMerge( - array ( - 'username' => DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME, - 'password' => DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD - ) -); -*/ - -$mailMerge->setLocalTemplate('template.doc'); - - -$mailMerge->assign('customer_number', sprintf("#%'10s", rand(0,1000000000))) - ->assign('invoice_number', sprintf("#%'10s", rand(0,1000000000))) - ->assign('account_number', sprintf("#%'10s", rand(0,1000000000))); - - -$billData = array ( - 'phone' => '+22 (0)333 444 555', - 'date' => Zend_Date::now()->toString(Zend_Date::DATE_LONG), - 'name' => 'James Henry Brown', - 'service_phone' => '+22 (0)333 444 559', - 'service_fax' => '+22 (0)333 444 558', - 'month' => sprintf('%s %s', Zend_Date::now()->toString(Zend_Date::MONTH_NAME), - Zend_Date::now()->toString(Zend_Date::YEAR)), - 'monthly_fee' => '15.00', - 'total_net' => '19.60', - 'tax' => '19.00', - 'tax_value' => '3.72', - 'total' => '23.32' -); - -$mailMerge->assign($billData); - - -$billConnections = array( - array( - 'connection_number' => '+11 (0)222 333 441', - 'connection_duration' => '00:01:01', - 'fee' => '1.15' - ), - array( - 'connection_number' => '+11 (0)222 333 442', - 'connection_duration' => '00:01:02', - 'fee' => '1.15' - ), - array( - 'connection_number' => '+11 (0)222 333 443', - 'connection_duration' => '00:01:03', - 'fee' => '1.15' - ), - array( - 'connection_number' => '+11 (0)222 333 444', - 'connection_duration' => '00:01:04', - 'fee' => '1.15' - ) -); - -$mailMerge->assign('connection', $billConnections); - - -$mailMerge->createDocument(); - -$document = $mailMerge->retrieveDocument('pdf'); - -unset($mailMerge); - -file_put_contents('document.pdf', $document); diff --git a/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template-screenshot.png deleted file mode 100755 index b90d27b669ad7d46e6871abfca0dbcd1ae8143ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99168 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 diff --git a/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template.doc b/demos/Zend/Service/LiveDocx/MailMerge/telephone-bill/template.doc deleted file mode 100755 index 1da17f99cc160dc0d8bb494842bfa7798b3b6c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20992 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 A`Tzg` diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/list-template-info.php b/demos/Zend/Service/LiveDocx/MailMerge/template-info/list-template-info.php deleted file mode 100755 index 9d1b737158..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/template-info/list-template-info.php +++ /dev/null @@ -1,80 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -// ----------------------------------------------------------------------------- - -$templateName = 'template-1-text-field.docx'; - -$mailMerge->setLocalTemplate($templateName); - -printf('Field names in %s:%s', $templateName, PHP_EOL); - -$fieldNames = $mailMerge->getFieldNames(); -foreach ($fieldNames as $fieldName) { - printf('- %s%s', $fieldName, PHP_EOL); -} - -// ----------------------------------------------------------------------------- - -$templateName = 'template-2-text-fields.doc'; - -$mailMerge->setLocalTemplate($templateName); - -printf('%sField names in %s:%s', PHP_EOL, $templateName, PHP_EOL); - -$fieldNames = $mailMerge->getFieldNames(); -foreach ($fieldNames as $fieldName) { - printf('- %s%s', $fieldName, PHP_EOL); -} - -// ----------------------------------------------------------------------------- - -$templateName = 'template-block-fields.doc'; - -$mailMerge->setLocalTemplate($templateName); - -printf('%sField names in %s:%s', PHP_EOL, $templateName, PHP_EOL); - -$fieldNames = $mailMerge->getFieldNames(); -foreach ($fieldNames as $fieldName) { - printf('- %s%s', $fieldName, PHP_EOL); -} - -printf('%sBlock names in %s:%s', PHP_EOL, $templateName, PHP_EOL); - -$blockNames = $mailMerge->getBlockNames(); -foreach ($blockNames as $blockName) { - printf('- %s%s', $blockName, PHP_EOL); -} - -printf('%sBlock field names in %s:%s', PHP_EOL, $templateName, PHP_EOL); - -foreach ($blockNames as $blockName) { - $blockFieldNames = $mailMerge->getBlockFieldNames($blockName); - foreach ($blockFieldNames as $blockFieldName) { - printf('- %s::%s%s', $blockName, $blockFieldName, PHP_EOL); - } -} - -print(PHP_EOL); - -// ----------------------------------------------------------------------------- - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field-screenshot.png deleted file mode 100755 index 5eb07cf36aaa4f716451cbf67513cb087114d4fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80061 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 diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.doc b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.doc deleted file mode 100644 index 294e01fd648edbe79b984dfc3ef65ddac7c231c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 zcmeI0OKg-?6vxj@r#Mq>ZJ|IZAOlp3Jcem4Ef1;mDHNnw#$dFj0XwzSzHBR^q9H*S z>}WKa7!$+7g&{E&*$@`$k_C~(uwYjc6BFY?NnDW7j=%q%@8i)HC{1Im&YAr0}_Uy`m~4@<6A^$!Muo01+(v6 zYK`eEo%UPB+4zx*fh<)yKST%6K49%uPyVXCX+4&7<4FH||FqbG0cn&>jpP13(&tvW z7By662|H+qtQ);Ep*-~a-#=ab3sH2@8A1DPzx(PQMj_kp;_Ew{O~e_p!<2jPF|akB ze(l}q>X*14Po{rBCrH(1WUm(upB%F zR)8p2308sCpaeV)o&cp_4R{i)1?#|iumQwC9Fzf_N#*2EfeNq*RDvq78EgStf!aMy zz8zG9XFQ&4_J5{vc1$)qX!OG`u3c~L%s(?6wsoc7Ue&so$dk=wKi}_bel_<|kM|1; zNOP<8op`bBKyyodw5%c)k8LUgaZQmert?oKc=Y?1KTwKj>COKx%}bvQaLxg(wYyOy zw8;E@tTr#*t)a(HrL=0(G0RkCubIobU0N(NKz^RCO`WQZcEEHgMtkk3tzPc;dxN@G zZX>yN(mzdKp*N~2_NbM*W;8g3G2ki4O$dmm&7ael5jdH>7On< zc(&oZQXdQT;~CA*v%Xmb8)3AGY{Fw^6T^z>04-S!H+Yd)!dAW3YS&r^to}|U;Z`8;M9y&)C48Yybr<}2<(vOy3Nx_)R%`(Y@IE*WJ_etF z&%jwAi{JRm{chZtiH=O4e}M&Z>zWEJt4kw!Ash&)rtA5Hc^HQQY$4RuB&?+ZV7EBbPTu zM@F}=92p3$J~a?pMP5R_c;s@h2rQ2WBJm*Cu>{xlEq2s)yX#t7&{S!Sb4GHVy5u?a zlzRQbR9)`ih3tg?33u=_m07hwd{(77VSXsYdMiIsV1MMh$HaT-X{f4*C6DS6=7ZGA z_eOs`Z;3>f#f!#{sFwmlUDJID=YBhHCohd1DfI8J!7G=pd>&hx|Iw%1U)Nv%S_7EK ztB038p*N`6qb-Y5fPI~21beoP1qeOE_K2t9~z4jVWUMqduiHKEKgsitY#iM#JlcXfP z*Im7zI#kPMZsZZ9#>#mPY2XQ@(xnxIvq^TVY%3cEgTu$(4GbT<0E)6Fjp@POqc-!U d66%u%azENegB%%emdMwwe3nE$keIow|8L>_6EXk* diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.docx b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-1-text-field.docx deleted file mode 100644 index 9a4a18dada1d0a9e53c793984af5ac62abcc5ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4143 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 diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields-screenshot.png b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields-screenshot.png deleted file mode 100755 index 4d2fb29f600080435866516a0c19746e19f65655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79755 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 gy1NTpY5G=EKN2z@mh)L~ylixk(d~@zO=YHq$ zefM7fvGCT_FUo$i33AYu*k~qhOULOQ^1_n>vj`cLM>Cm>uQVf@l?7yhyNvbGU=E|C zIiNXz1Y!_}T+kegto*+$&}!%TrOmZ^OOf{3+syXdrGym|T102T(zs3qv#-6YHTa2t zb#HGOOuqTOvqVMC56KC7@3XU3M|#HIuwLu%#^L`v`?bs>j(Sv^8prH+_~%xo7Bx~~ zZFb5|TMzx-kL1&T`22J2zl4r{^^BnXcHDdFUPd9?AL8lHc{Y(IZC&J3GYo7~(7*QX zT>DpZy+NDd`K{s1wEuNRJO+7?508VUun?9(5fsC6SOqJf6jnkRY=_mb2A+Vm;KDj6 zhxM=lo`k1hBW!}FVKZ!jt*{Lekc0}*nN&%-19rkL*bRGNFFXVLK=qy_Jpc#cxj-kI zEoK>I$KSS}-FZBDGU(LN6=zeDbX>PR!+Fouy z(cD_+R_sh96T2!PsVSNyw?F#^U0h3V*;oF*{>gymFVI?>PU6uL3-__=T%4|ApwDEq zYWQtg2MTCUNr>mTA? z*D1=H(X3=G@Gvb9v70p4W}W!Besl449eAY+cw+gz4m6$Q^iMY)vLBu5yoEn>@sM5A z=pk;<|6O=UT~%Wn6u}F`Gp+VK*9LrQy&WOKaH)Nsd)11(t@mYymRnV?*xDPNXm4XYnu2~v!@YLHT#Z#%4QH-e4T_akO{CNBjp`znn%Htb z5m+aEba^&XZ|Sg^Anmr%^Nh^trW|9;N5>+S9(xsC4lzN+2BV*;M%UbA)&j?%wyD(W z8}ZjM+a0q#F*~@~YBt+BR2MpF3Acm=)$Hh2jx!8`B) zd<37sr|>O&2S35j@CyusEIIP`xZlXg;$>gv$tOsIDfo!(=$di7mKt4rTHBtzgu8l*0$j=mvCr?ym9 zUhk;wEr;sbj~qIBxTgAeJ!SQ;_u*>N(@@J-h?Cs)@2^~nUc)%^IFV$UpQ729q3;7$`>f#ujEV`)BL_i?d3_we?OVaIQCO1SH^otGT;6m MQnzExEad+G0otSslK=n! diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields.docx b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-2-text-fields.docx deleted file mode 100644 index 37ba0c52b13b4791ab12efc3ff1ad400ffc87723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4171 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 diff --git a/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-block-fields.doc b/demos/Zend/Service/LiveDocx/MailMerge/template-info/template-block-fields.doc deleted file mode 100755 index 1da17f99cc160dc0d8bb494842bfa7798b3b6c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20992 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 A`Tzg` diff --git a/demos/Zend/Service/LiveDocx/MailMerge/templates/delete-all.php b/demos/Zend/Service/LiveDocx/MailMerge/templates/delete-all.php deleted file mode 100755 index e695f1a66a..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/templates/delete-all.php +++ /dev/null @@ -1,29 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$counter = 1; -foreach ($mailMerge->listTemplates() as $result) { - printf('%d) %s', $counter, $result['filename']); - $mailMerge->deleteTemplate($result['filename']); - print(' - DELETED.' . PHP_EOL); - $counter++; -} - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/templates/download.php b/demos/Zend/Service/LiveDocx/MailMerge/templates/download.php deleted file mode 100755 index 47a8b421fd..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/templates/download.php +++ /dev/null @@ -1,30 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -$counter = 1; -foreach ($mailMerge->listTemplates() as $result) { - printf('%d) %s', $counter, $result['filename']); - $template = $mailMerge->downloadTemplate($result['filename']); - file_put_contents('downloaded-' . $result['filename'], $template); - print(" - DOWNLOADED.\n"); - $counter++; -} - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/templates/list.php b/demos/Zend/Service/LiveDocx/MailMerge/templates/list.php deleted file mode 100755 index 6e849bd64f..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/templates/list.php +++ /dev/null @@ -1,23 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -print(Demos_Zend_Service_LiveDocx_Helper::listDecorator($mailMerge->listTemplates())); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/templates/template-1.docx b/demos/Zend/Service/LiveDocx/MailMerge/templates/template-1.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 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 - -print('Checking whether a template is available... '); -if (true === $mailMerge->templateExists('template-1.docx')) { - print('EXISTS. '); -} else { - print('DOES NOT EXIST. '); -} -print('DONE' . PHP_EOL); - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/MailMerge/templates/upload.php b/demos/Zend/Service/LiveDocx/MailMerge/templates/upload.php deleted file mode 100755 index f78a159d34..0000000000 --- a/demos/Zend/Service/LiveDocx/MailMerge/templates/upload.php +++ /dev/null @@ -1,29 +0,0 @@ -setUsername(DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - -print('Uploading template... '); -$mailMerge->uploadTemplate('template-1.docx'); -print('DONE.' . PHP_EOL); - -print('Uploading template... '); -$mailMerge->uploadTemplate('template-2.docx'); -print('DONE.' . PHP_EOL); - -print(PHP_EOL); - -unset($mailMerge); \ No newline at end of file diff --git a/demos/Zend/Service/LiveDocx/check-environment.php b/demos/Zend/Service/LiveDocx/check-environment.php deleted file mode 100755 index f12862e57d..0000000000 --- a/demos/Zend/Service/LiveDocx/check-environment.php +++ /dev/null @@ -1,280 +0,0 @@ - 'IP address', - 'City' => 'city', - 'RegionName' => 'region', - 'CountryName' => 'country' -); - -if (false !== $geoData) { - $simplexml = new SimpleXMLElement($geoData); - foreach ($keys as $key => $value) { - printLine($counter, sprintf('Checking your %s (%s)', $keys[$key], $simplexml->$key), TEST_PASS); - $counter ++; - } -} else { - printLine($counter, 'Checking your geo data', TEST_FAIL); - $failed = true; -} - -// ----------------------------------------------------------------------------- - -$microtime = microtime(true); - -if (false !== file_get_contents(Zend_Service_LiveDocx_MailMerge::WSDL)) { - $duration = microtime(true) - $microtime; - $result = TEST_PASS; -} else { - $duration = -1; - $result = TEST_FAIL; - $failed = true; -} - -printLine($counter, sprintf('Checking backend WSDL (%01.2fs)', $duration), $result); - -$counter ++; - -// ----------------------------------------------------------------------------- - -if (defined('DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME') && - defined('DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD')) { - $result = TEST_PASS; -} else { - $result = TEST_FAIL; - $failed = true; -} - -printLine($counter, 'Checking backend credentials are defined', $result); - -$counter ++; - -// ----------------------------------------------------------------------------- - -$errorMessage = null; - -try { - $microtime = microtime(true); - $mailMerge = new Zend_Service_LiveDocx_MailMerge( - array ( - 'username' => DEMOS_ZEND_SERVICE_LIVEDOCX_USERNAME, - 'password' => DEMOS_ZEND_SERVICE_LIVEDOCX_PASSWORD - ) - ); - $mailMerge->logIn(); - $duration = microtime(true) - $microtime; -} catch (Zend_Service_LiveDocx_Exception $e) { - $duration = -1; - $errorMessage = $e->getMessage(); -} - -if (is_null($errorMessage)) { - $result = TEST_PASS; -} else { - $result = TEST_FAIL; - $failed = true; -} - -printLine($counter, sprintf('Logging into backend service (%01.2fs)', $duration), $result); - -$counter ++; - -// ----------------------------------------------------------------------------- - -if (true === $failed) { - $message = 'One or more tests failed. The web server environment, in which this script is running, does not meet the requirements for Zend_Service_LiveDocx_*.'; -} else { - $message = 'Congratulations! All tests passed. The server environment, in which this script is running, is suitable for Zend_Service_LiveDocx_*.'; -} - -print(Demos_Zend_Service_LiveDocx_Helper::wrapLine(PHP_EOL . $message . PHP_EOL . PHP_EOL)); - -// ----------------------------------------------------------------------------- - -/** - * Print result line - * - * @param int $counter - * @param string $testString - * @param mixed $testResult - * @return void - */ -function printLine($counter, $testString, $testResult) -{ - $lineLength = Demos_Zend_Service_LiveDocx_Helper::LINE_LENGTH; - - // counter result - $padding = $lineLength - (4 + strlen(TEST_PASS)); - - $counter = sprintf('%2s: ', $counter); - $testString = str_pad($testString, $padding, '.', STR_PAD_RIGHT); - - printf('%s%s%s%s', $counter, $testString, $testResult, PHP_EOL); -} - -// ----------------------------------------------------------------------------- diff --git a/demos/Zend/Service/LiveDocx/common.php b/demos/Zend/Service/LiveDocx/common.php deleted file mode 100755 index 7abfaf3c3e..0000000000 --- a/demos/Zend/Service/LiveDocx/common.php +++ /dev/null @@ -1,27 +0,0 @@ -setBlogUrl($blog) - ->setApiKey($apiKey) - ->setUserAgent('Zend Framework/' . Zend_Version::VERSION . ' | Akismet/1.11'); - } - - /** - * Retrieve blog URL - * - * @return string - */ - public function getBlogUrl() - { - return $this->_blogUrl; - } - - /** - * Set blog URL - * - * @param string $blogUrl - * @return Zend_Service_Akismet - * @throws Zend_Service_Exception if invalid URL provided - */ - public function setBlogUrl($blogUrl) - { - #require_once 'Zend/Uri.php'; - if (!Zend_Uri::check($blogUrl)) { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Invalid url provided for blog'); - } - - $this->_blogUrl = $blogUrl; - return $this; - } - - /** - * Retrieve API key - * - * @return string - */ - public function getApiKey() - { - return $this->_apiKey; - } - - /** - * Set API key - * - * @param string $apiKey - * @return Zend_Service_Akismet - */ - public function setApiKey($apiKey) - { - $this->_apiKey = $apiKey; - return $this; - } - - /** - * Retrieve charset - * - * @return string - */ - public function getCharset() - { - return $this->_charset; - } - - /** - * Set charset - * - * @param string $charset - * @return Zend_Service_Akismet - */ - public function setCharset($charset) - { - $this->_charset = $charset; - return $this; - } - - /** - * Retrieve TCP/IP port - * - * @return int - */ - public function getPort() - { - return $this->_port; - } - - /** - * Set TCP/IP port - * - * @param int $port - * @return Zend_Service_Akismet - * @throws Zend_Service_Exception if non-integer value provided - */ - public function setPort($port) - { - if (!is_int($port)) { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Invalid port'); - } - - $this->_port = $port; - return $this; - } - - /** - * Retrieve User Agent string - * - * @return string - */ - public function getUserAgent() - { - return $this->_userAgent; - } - - /** - * Set User Agent - * - * Should be of form "Some user agent/version | Akismet/version" - * - * @param string $userAgent - * @return Zend_Service_Akismet - * @throws Zend_Service_Exception with invalid user agent string - */ - public function setUserAgent($userAgent) - { - if (!is_string($userAgent) - || !preg_match(":^[^\n/]*/[^ ]* \| Akismet/[0-9\.]*$:i", $userAgent)) - { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Invalid User Agent string; must be of format "Application name/version | Akismet/version"'); - } - - $this->_userAgent = $userAgent; - return $this; - } - - /** - * Post a request - * - * @param string $host - * @param string $path - * @param array $params - * @return mixed - */ - protected function _post($host, $path, array $params) - { - $uri = 'http://' . $host . ':' . $this->getPort() . $path; - $client = self::getHttpClient(); - $client->setUri($uri); - $client->setConfig(array( - 'useragent' => $this->getUserAgent(), - )); - - $client->setHeaders(array( - 'Host' => $host, - 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . $this->getCharset() - )); - $client->setParameterPost($params); - - $client->setMethod(Zend_Http_Client::POST); - return $client->request(); - } - - /** - * Verify an API key - * - * @param string $key Optional; API key to verify - * @param string $blog Optional; blog URL against which to verify key - * @return boolean - */ - public function verifyKey($key = null, $blog = null) - { - if (null === $key) { - $key = $this->getApiKey(); - } - - if (null === $blog) { - $blog = $this->getBlogUrl(); - } - - $response = $this->_post('rest.akismet.com', '/1.1/verify-key', array( - 'key' => $key, - 'blog' => $blog - )); - - return ('valid' == $response->getBody()); - } - - /** - * Perform an API call - * - * @param string $path - * @param array $params - * @return Zend_Http_Response - * @throws Zend_Service_Exception if missing user_ip or user_agent fields - */ - protected function _makeApiCall($path, $params) - { - if (empty($params['user_ip']) || empty($params['user_agent'])) { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Missing required Akismet fields (user_ip and user_agent are required)'); - } - - if (!isset($params['blog'])) { - $params['blog'] = $this->getBlogUrl(); - } - - return $this->_post($this->getApiKey() . '.rest.akismet.com', $path, $params); - } - - /** - * Check a comment for spam - * - * Checks a comment to see if it is spam. $params should be an associative - * array with one or more of the following keys (unless noted, all keys are - * optional): - * - blog: URL of the blog. If not provided, uses value returned by {@link getBlogUrl()} - * - user_ip (required): IP address of comment submitter - * - user_agent (required): User Agent used by comment submitter - * - referrer: contents of HTTP_REFERER header - * - permalink: location of the entry to which the comment was submitted - * - comment_type: typically, one of 'blank', 'comment', 'trackback', or 'pingback', but may be any value - * - comment_author: name submitted with the content - * - comment_author_email: email submitted with the content - * - comment_author_url: URL submitted with the content - * - comment_content: actual content - * - * Additionally, Akismet suggests returning the key/value pairs in the - * $_SERVER array, and these may be included in the $params. - * - * This method implements the Akismet comment-check REST method. - * - * @param array $params - * @return boolean - * @throws Zend_Service_Exception with invalid API key - */ - public function isSpam($params) - { - $response = $this->_makeApiCall('/1.1/comment-check', $params); - - $return = trim($response->getBody()); - - if ('invalid' == $return) { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Invalid API key'); - } - - if ('true' == $return) { - return true; - } - - return false; - } - - /** - * Submit spam - * - * Takes the same arguments as {@link isSpam()}. - * - * Submits known spam content to Akismet to help train it. - * - * This method implements Akismet's submit-spam REST method. - * - * @param array $params - * @return void - * @throws Zend_Service_Exception with invalid API key - */ - public function submitSpam($params) - { - $response = $this->_makeApiCall('/1.1/submit-spam', $params); - $value = trim($response->getBody()); - if ('invalid' == $value) { - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Invalid API key'); - } - } - - /** - * Submit ham - * - * Takes the same arguments as {@link isSpam()}. - * - * Submits a comment that has been falsely categorized as spam by Akismet - * as a false positive, telling Akismet's filters not to filter such - * comments as spam in the future. - * - * Unlike {@link submitSpam()} and {@link isSpam()}, a valid API key is - * never necessary; as a result, this method never throws an exception - * (unless an exception happens with the HTTP client layer). - * - * this method implements Akismet's submit-ham REST method. - * - * @param array $params - * @return void - */ - public function submitHam($params) - { - $response = $this->_makeApiCall('/1.1/submit-ham', $params); - } -} diff --git a/library/Zend/Service/Amazon.php b/library/Zend/Service/Amazon.php deleted file mode 100644 index 01d3e15bf7..0000000000 --- a/library/Zend/Service/Amazon.php +++ /dev/null @@ -1,326 +0,0 @@ - 'http://webservices.amazon.com', - 'UK' => 'http://webservices.amazon.co.uk', - 'DE' => 'http://webservices.amazon.de', - 'JP' => 'http://webservices.amazon.co.jp', - 'FR' => 'http://webservices.amazon.fr', - 'CA' => 'http://webservices.amazon.ca'); - - /** - * Reference to REST client object - * - * @var Zend_Rest_Client - */ - protected $_rest = null; - - - /** - * Constructs a new Amazon Web Services Client - * - * @param string $appId Developer's Amazon appid - * @param string $countryCode Country code for Amazon service; may be US, UK, DE, JP, FR, CA - * @throws Zend_Service_Exception - * @return Zend_Service_Amazon - */ - public function __construct($appId, $countryCode = 'US', $secretKey = null) - { - $this->appId = (string) $appId; - $this->_secretKey = $secretKey; - - $countryCode = (string) $countryCode; - if (!isset($this->_baseUriList[$countryCode])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Unknown country code: $countryCode"); - } - - $this->_baseUri = $this->_baseUriList[$countryCode]; - } - - - /** - * Search for Items - * - * @param array $options Options to use for the Search Query - * @throws Zend_Service_Exception - * @return Zend_Service_Amazon_ResultSet - * @see http://www.amazon.com/gp/aws/sdk/main.html/102-9041115-9057709?s=AWSEcommerceService&v=2011-08-01&p=ApiReference/ItemSearchOperation - */ - public function itemSearch(array $options) - { - $client = $this->getRestClient(); - $client->setUri($this->_baseUri); - - $defaultOptions = array('ResponseGroup' => 'Small'); - $options = $this->_prepareOptions('ItemSearch', $options, $defaultOptions); - $client->getHttpClient()->resetParameters(); - $response = $client->restGet('/onca/xml', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Amazon_ResultSet - */ - #require_once 'Zend/Service/Amazon/ResultSet.php'; - return new Zend_Service_Amazon_ResultSet($dom); - } - - - /** - * Look up item(s) by ASIN - * - * @param string $asin Amazon ASIN ID - * @param array $options Query Options - * @see http://www.amazon.com/gp/aws/sdk/main.html/102-9041115-9057709?s=AWSEcommerceService&v=2011-08-01&p=ApiReference/ItemLookupOperation - * @throws Zend_Service_Exception - * @return Zend_Service_Amazon_Item|Zend_Service_Amazon_ResultSet - */ - public function itemLookup($asin, array $options = array()) - { - $client = $this->getRestClient(); - $client->setUri($this->_baseUri); - $client->getHttpClient()->resetParameters(); - - $defaultOptions = array('ResponseGroup' => 'Small'); - $options['ItemId'] = (string) $asin; - $options = $this->_prepareOptions('ItemLookup', $options, $defaultOptions); - $response = $client->restGet('/onca/xml', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception( - 'An error occurred sending request. Status code: ' . $response->getStatus() - ); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - $xpath = new DOMXPath($dom); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - $items = $xpath->query('//az:Items/az:Item'); - - if ($items->length == 1) { - /** - * @see Zend_Service_Amazon_Item - */ - #require_once 'Zend/Service/Amazon/Item.php'; - return new Zend_Service_Amazon_Item($items->item(0)); - } - - /** - * @see Zend_Service_Amazon_ResultSet - */ - #require_once 'Zend/Service/Amazon/ResultSet.php'; - return new Zend_Service_Amazon_ResultSet($dom); - } - - - /** - * Returns a reference to the REST client - * - * @return Zend_Rest_Client - */ - public function getRestClient() - { - if($this->_rest === null) { - $this->_rest = new Zend_Rest_Client(); - } - return $this->_rest; - } - - /** - * Set REST client - * - * @param Zend_Rest_Client - * @return Zend_Service_Amazon - */ - public function setRestClient(Zend_Rest_Client $client) - { - $this->_rest = $client; - return $this; - } - - - /** - * Prepare options for request - * - * @param string $query Action to perform - * @param array $options User supplied options - * @param array $defaultOptions Default options - * @return array - */ - protected function _prepareOptions($query, array $options, array $defaultOptions) - { - $options['AWSAccessKeyId'] = $this->appId; - $options['Service'] = 'AWSECommerceService'; - $options['Operation'] = (string) $query; - $options['Version'] = '2011-08-01'; - - // de-canonicalize out sort key - if (isset($options['ResponseGroup'])) { - $responseGroup = explode(',', $options['ResponseGroup']); - - if (!in_array('Request', $responseGroup)) { - $responseGroup[] = 'Request'; - $options['ResponseGroup'] = implode(',', $responseGroup); - } - } - - $options = array_merge($defaultOptions, $options); - - if($this->_secretKey !== null) { - $options['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z");; - ksort($options); - $options['Signature'] = self::computeSignature($this->_baseUri, $this->_secretKey, $options); - } - - return $options; - } - - /** - * Compute Signature for Authentication with Amazon Product Advertising Webservices - * - * @param string $baseUri - * @param string $secretKey - * @param array $options - * @return string - */ - static public function computeSignature($baseUri, $secretKey, array $options) - { - #require_once "Zend/Crypt/Hmac.php"; - - $signature = self::buildRawSignature($baseUri, $options); - return base64_encode( - Zend_Crypt_Hmac::compute($secretKey, 'sha256', $signature, Zend_Crypt_Hmac::BINARY) - ); - } - - /** - * Build the Raw Signature Text - * - * @param string $baseUri - * @param array $options - * @return string - */ - static public function buildRawSignature($baseUri, $options) - { - ksort($options); - $params = array(); - foreach($options AS $k => $v) { - $params[] = $k."=".rawurlencode($v); - } - - return sprintf("GET\n%s\n/onca/xml\n%s", - str_replace('http://', '', $baseUri), - implode("&", $params) - ); - } - - - /** - * Check result for errors - * - * @param DOMDocument $dom - * @throws Zend_Service_Exception - * @return void - */ - protected static function _checkErrors(DOMDocument $dom) - { - $xpath = new DOMXPath($dom); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - - if ($xpath->query('//az:Error')->length >= 1) { - $code = $xpath->query('//az:Error/az:Code/text()')->item(0)->data; - $message = $xpath->query('//az:Error/az:Message/text()')->item(0)->data; - - switch($code) { - case 'AWS.ECommerceService.NoExactMatches': - break; - default: - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("$message ($code)"); - } - } - } -} diff --git a/library/Zend/Service/Amazon/Abstract.php b/library/Zend/Service/Amazon/Abstract.php deleted file mode 100644 index 5877a407e3..0000000000 --- a/library/Zend/Service/Amazon/Abstract.php +++ /dev/null @@ -1,119 +0,0 @@ -_accessKey = $accessKey; - $this->_secretKey = $secretKey; - } - - - - /** - * Method to fetch the Access Key - * - * @return string - */ - protected function _getAccessKey() - { - return $this->_accessKey; - } - - /** - * Method to fetch the Secret AWS Key - * - * @return string - */ - protected function _getSecretKey() - { - return $this->_secretKey; - } -} diff --git a/library/Zend/Service/Amazon/Accessories.php b/library/Zend/Service/Amazon/Accessories.php deleted file mode 100644 index 53c62ece3d..0000000000 --- a/library/Zend/Service/Amazon/Accessories.php +++ /dev/null @@ -1,58 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - foreach (array('ASIN', 'Title') as $el) { - $this->$el = (string) $xpath->query("./az:$el/text()", $dom)->item(0)->data; - } - } -} diff --git a/library/Zend/Service/Amazon/Authentication.php b/library/Zend/Service/Amazon/Authentication.php deleted file mode 100644 index 477ac126aa..0000000000 --- a/library/Zend/Service/Amazon/Authentication.php +++ /dev/null @@ -1,82 +0,0 @@ -setAccessKey($accessKey); - $this->setSecretKey($secretKey); - $this->setApiVersion($apiVersion); - } - - /** - * Set access key - * - * @param string $accessKey - * @return void - */ - public function setAccessKey($accessKey) - { - $this->_accessKey = $accessKey; - } - - /** - * Set secret key - * - * @param string $secretKey - * @return void - */ - public function setSecretKey($secretKey) - { - $this->_secretKey = $secretKey; - } - - /** - * Set API version - * - * @param string $apiVersion - * @return void - */ - public function setApiVersion($apiVersion) - { - $this->_apiVersion = $apiVersion; - } -} diff --git a/library/Zend/Service/Amazon/Authentication/Exception.php b/library/Zend/Service/Amazon/Authentication/Exception.php deleted file mode 100644 index ed9d30fb3b..0000000000 --- a/library/Zend/Service/Amazon/Authentication/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ - $val) { - if (strcasecmp($key, 'content-type') == 0) { - $type = $val; - } else if (strcasecmp($key, 'content-md5') == 0) { - $md5 = $val; - } else if (strcasecmp($key, 'date') == 0) { - $date = $val; - } - } - - // If we have an x-amz-date header, use that instead of the normal Date - if (isset($headers['x-amz-date']) && isset($date)) { - $date = ''; - } - - $sig_str = "$method\n$md5\n$type\n$date\n"; - - // For x-amz- headers, combine like keys, lowercase them, sort them - // alphabetically and remove excess spaces around values - $amz_headers = array(); - foreach ($headers as $key => $val) { - $key = strtolower($key); - if (substr($key, 0, 6) == 'x-amz-') { - if (is_array($val)) { - $amz_headers[$key] = $val; - } else { - $amz_headers[$key][] = preg_replace('/\s+/', ' ', $val); - } - } - } - if (!empty($amz_headers)) { - ksort($amz_headers); - foreach ($amz_headers as $key => $val) { - $sig_str .= $key . ':' . implode(',', $val) . "\n"; - } - } - - $sig_str .= '/'.parse_url($path, PHP_URL_PATH); - if (strpos($path, '?location') !== false) { - $sig_str .= '?location'; - } else - if (strpos($path, '?acl') !== false) { - $sig_str .= '?acl'; - } else - if (strpos($path, '?torrent') !== false) { - $sig_str .= '?torrent'; - } - - $signature = base64_encode(Zend_Crypt_Hmac::compute($this->_secretKey, 'sha1', utf8_encode($sig_str), Zend_Crypt_Hmac::BINARY)); - $headers['Authorization'] = 'AWS ' . $this->_accessKey . ':' . $signature; - - return $sig_str; - } -} diff --git a/library/Zend/Service/Amazon/Authentication/V1.php b/library/Zend/Service/Amazon/Authentication/V1.php deleted file mode 100644 index ec56a0edaa..0000000000 --- a/library/Zend/Service/Amazon/Authentication/V1.php +++ /dev/null @@ -1,108 +0,0 @@ -_accessKey; - $parameters['SignatureVersion'] = $this->_signatureVersion; - $parameters['Version'] = $this->_apiVersion; - if(!isset($parameters['Timestamp'])) { - $parameters['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z', time()+10); - } - - $data = $this->_signParameters($url, $parameters); - - return $data; - } - - /** - * Computes the RFC 2104-compliant HMAC signature for request parameters - * - * This implements the Amazon Web Services signature, as per the following - * specification: - * - * 1. Sort all request parameters (including SignatureVersion and - * excluding Signature, the value of which is being created), - * ignoring case. - * - * 2. Iterate over the sorted list and append the parameter name (in its - * original case) and then its value. Do not URL-encode the parameter - * values before constructing this string. Do not use any separator - * characters when appending strings. - * - * @param string $queue_url Queue URL - * @param array $parameters the parameters for which to get the signature. - * - * @return string the signed data. - */ - protected function _signParameters($url, array &$paramaters) - { - $data = ''; - - uksort($paramaters, 'strcasecmp'); - unset($paramaters['Signature']); - - foreach($paramaters as $key => $value) { - $data .= $key . $value; - } - - $hmac = Zend_Crypt_Hmac::compute($this->_secretKey, 'SHA1', $data, Zend_Crypt_Hmac::BINARY); - - $paramaters['Signature'] = base64_encode($hmac); - - return $data; - } -} diff --git a/library/Zend/Service/Amazon/Authentication/V2.php b/library/Zend/Service/Amazon/Authentication/V2.php deleted file mode 100644 index e19bda9aff..0000000000 --- a/library/Zend/Service/Amazon/Authentication/V2.php +++ /dev/null @@ -1,138 +0,0 @@ -_accessKey; - $parameters['SignatureVersion'] = $this->_signatureVersion; - $parameters['Version'] = $this->_apiVersion; - $parameters['SignatureMethod'] = $this->_signatureMethod; - if(!isset($parameters['Timestamp'])) { - $parameters['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z', time()+10); - } - - $data = $this->_signParameters($url, $parameters); - - return $data; - } - - /** - * Set http request type to POST or GET - * @param string $method - */ - public function setHttpMethod($method = "POST") { - $this->_httpMethod = strtoupper($method); - } - - /** - * Get the current http request type - * @return string - */ - public function getHttpMethod() - { - return $this->_httpMethod; - } - - /** - * Computes the RFC 2104-compliant HMAC signature for request parameters - * - * This implements the Amazon Web Services signature, as per the following - * specification: - * - * 1. Sort all request parameters (including SignatureVersion and - * excluding Signature, the value of which is being created), - * ignoring case. - * - * 2. Iterate over the sorted list and append the parameter name (in its - * original case) and then its value. Do not URL-encode the parameter - * values before constructing this string. Do not use any separator - * characters when appending strings. - * - * @param string $queue_url Queue URL - * @param array $parameters the parameters for which to get the signature. - * - * @return string the signed data. - */ - protected function _signParameters($url, array &$paramaters) - { - $data = $this->_httpMethod . "\n"; - $data .= parse_url($url, PHP_URL_HOST) . "\n"; - $data .= ('' == $path = parse_url($url, PHP_URL_PATH)) ? '/' : $path; - $data .= "\n"; - - uksort($paramaters, 'strcmp'); - unset($paramaters['Signature']); - - $arrData = array(); - foreach($paramaters as $key => $value) { - $arrData[] = $key . '=' . str_replace('%7E', '~', rawurlencode($value)); - } - - $data .= implode('&', $arrData); - - $hmac = Zend_Crypt_Hmac::compute($this->_secretKey, 'SHA256', $data, Zend_Crypt_Hmac::BINARY); - - $paramaters['Signature'] = base64_encode($hmac); - - return $data; - } -} diff --git a/library/Zend/Service/Amazon/CustomerReview.php b/library/Zend/Service/Amazon/CustomerReview.php deleted file mode 100644 index 4934a96145..0000000000 --- a/library/Zend/Service/Amazon/CustomerReview.php +++ /dev/null @@ -1,86 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - foreach (array('Rating', 'HelpfulVotes', 'CustomerId', 'TotalVotes', 'Date', 'Summary', 'Content') as $el) { - $result = $xpath->query("./az:$el/text()", $dom); - if ($result->length == 1) { - $this->$el = (string) $result->item(0)->data; - } - } - } -} diff --git a/library/Zend/Service/Amazon/Ec2.php b/library/Zend/Service/Amazon/Ec2.php deleted file mode 100644 index 82f70d56d7..0000000000 --- a/library/Zend/Service/Amazon/Ec2.php +++ /dev/null @@ -1,87 +0,0 @@ -_region = $region; - - parent::__construct($accessKey, $secretKey); - } - - /** - * Set which region you are working in. It will append the - * end point automaticly - * - * @param string $region - */ - public static function setRegion($region) - { - if(in_array(strtolower($region), self::$_validEc2Regions, true)) { - self::$_defaultRegion = $region; - } else { - #require_once 'Zend/Service/Amazon/Exception.php'; - throw new Zend_Service_Amazon_Exception('Invalid Amazon Ec2 Region'); - } - } - - /** - * Method to fetch the AWS Region - * - * @return string - */ - protected function _getRegion() - { - return (!empty($this->_region)) ? $this->_region . '.' : ''; - } - - /** - * Sends a HTTP request to the queue service using Zend_Http_Client - * - * @param array $params List of parameters to send with the request - * @return Zend_Service_Amazon_Ec2_Response - * @throws Zend_Service_Amazon_Ec2_Exception - */ - protected function sendRequest(array $params = array()) - { - $url = 'https://' . $this->_getRegion() . $this->_ec2Endpoint . '/'; - - $params = $this->addRequiredParameters($params); - - try { - /* @var $request Zend_Http_Client */ - $request = self::getHttpClient(); - $request->resetParameters(); - - $request->setConfig(array( - 'timeout' => $this->_httpTimeout - )); - - $request->setUri($url); - $request->setMethod(Zend_Http_Client::POST); - $request->setParameterPost($params); - - $httpResponse = $request->request(); - - - } catch (Zend_Http_Client_Exception $zhce) { - $message = 'Error in request to AWS service: ' . $zhce->getMessage(); - throw new Zend_Service_Amazon_Ec2_Exception($message, $zhce->getCode(), $zhce); - } - $response = new Zend_Service_Amazon_Ec2_Response($httpResponse); - $this->checkForErrors($response); - - return $response; - } - - /** - * Adds required authentication and version parameters to an array of - * parameters - * - * The required parameters are: - * - AWSAccessKey - * - SignatureVersion - * - Timestamp - * - Version and - * - Signature - * - * If a required parameter is already set in the $parameters array, - * it is overwritten. - * - * @param array $parameters the array to which to add the required - * parameters. - * - * @return array - */ - protected function addRequiredParameters(array $parameters) - { - $parameters['AWSAccessKeyId'] = $this->_getAccessKey(); - $parameters['SignatureVersion'] = $this->_ec2SignatureVersion; - $parameters['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z'); - $parameters['Version'] = $this->_ec2ApiVersion; - $parameters['SignatureMethod'] = $this->_ec2SignatureMethod; - $parameters['Signature'] = $this->signParameters($parameters); - - return $parameters; - } - - /** - * Computes the RFC 2104-compliant HMAC signature for request parameters - * - * This implements the Amazon Web Services signature, as per the following - * specification: - * - * 1. Sort all request parameters (including SignatureVersion and - * excluding Signature, the value of which is being created), - * ignoring case. - * - * 2. Iterate over the sorted list and append the parameter name (in its - * original case) and then its value. Do not URL-encode the parameter - * values before constructing this string. Do not use any separator - * characters when appending strings. - * - * @param array $parameters the parameters for which to get the signature. - * @param string $secretKey the secret key to use to sign the parameters. - * - * @return string the signed data. - */ - protected function signParameters(array $paramaters) - { - $data = "POST\n"; - $data .= $this->_getRegion() . $this->_ec2Endpoint . "\n"; - $data .= "/\n"; - - uksort($paramaters, 'strcmp'); - unset($paramaters['Signature']); - - $arrData = array(); - foreach($paramaters as $key => $value) { - $arrData[] = $key . '=' . str_replace("%7E", "~", rawurlencode($value)); - } - - $data .= implode('&', $arrData); - - #require_once 'Zend/Crypt/Hmac.php'; - $hmac = Zend_Crypt_Hmac::compute($this->_getSecretKey(), 'SHA256', $data, Zend_Crypt_Hmac::BINARY); - - return base64_encode($hmac); - } - - /** - * Checks for errors responses from Amazon - * - * @param Zend_Service_Amazon_Ec2_Response $response the response object to - * check. - * - * @return void - * - * @throws Zend_Service_Amazon_Ec2_Exception if one or more errors are - * returned from Amazon. - */ - private function checkForErrors(Zend_Service_Amazon_Ec2_Response $response) - { - $xpath = new DOMXPath($response->getDocument()); - $list = $xpath->query('//Error'); - if ($list->length > 0) { - $node = $list->item(0); - $code = $xpath->evaluate('string(Code/text())', $node); - $message = $xpath->evaluate('string(Message/text())', $node); - throw new Zend_Service_Amazon_Ec2_Exception($message, 0, $code); - } - - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Availabilityzones.php b/library/Zend/Service/Amazon/Ec2/Availabilityzones.php deleted file mode 100644 index 0c7dfb8bc2..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Availabilityzones.php +++ /dev/null @@ -1,76 +0,0 @@ -$name) { - $params['ZoneName.' . ($k+1)] = $name; - } - } elseif($zoneName) { - $params['ZoneName.1'] = $zoneName; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:item'); - - $return = array(); - foreach ($nodes as $k => $node) { - $item = array(); - $item['zoneName'] = $xpath->evaluate('string(ec2:zoneName/text())', $node); - $item['zoneState'] = $xpath->evaluate('string(ec2:zoneState/text())', $node); - - $return[] = $item; - unset($item); - } - - return $return; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/CloudWatch.php b/library/Zend/Service/Amazon/Ec2/CloudWatch.php deleted file mode 100644 index c1c8e9152a..0000000000 --- a/library/Zend/Service/Amazon/Ec2/CloudWatch.php +++ /dev/null @@ -1,357 +0,0 @@ -_validMetrics, true)) { - throw new Zend_Service_Amazon_Ec2_Exception('Invalid Metric Type: ' . $options['MeasureName']); - } - - if(!isset($options['Statistics'])) { - $options['Statistics'][] = 'Average'; - } elseif(!is_array($options['Statistics'])) { - $options['Statistics'][] = $options['Statistics']; - } - - foreach($options['Statistics'] as $k=>$s) { - if(!in_array($s, $this->_validStatistics, true)) continue; - $options['Statistics.member.' . ($k+1)] = $s; - $_usedStatistics[] = $s; - } - unset($options['Statistics']); - - if(isset($options['StartTime'])) { - if(!is_numeric($options['StartTime'])) $options['StartTime'] = strtotime($options['StartTime']); - $options['StartTime'] = gmdate('c', $options['StartTime']); - } else { - $options['StartTime'] = gmdate('c', strtotime('-1 hour')); - } - - if(isset($options['EndTime'])) { - if(!is_numeric($options['EndTime'])) $options['EndTime'] = strtotime($options['EndTime']); - $options['EndTime'] = gmdate('c', $options['EndTime']); - } else { - $options['EndTime'] = gmdate('c'); - } - - if(isset($options['Dimensions'])) { - $x = 1; - foreach($options['Dimensions'] as $dimKey=>$dimVal) { - if(!in_array($dimKey, $this->_validDimensionsKeys, true)) continue; - $options['Dimensions.member.' . $x . '.Name'] = $dimKey; - $options['Dimensions.member.' . $x . '.Value'] = $dimVal; - $x++; - } - - unset($options['Dimensions']); - } - - $params = array_merge($params, $options); - - $response = $this->sendRequest($params); - $response->setNamespace($this->_xmlNamespace); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:GetMetricStatisticsResult/ec2:Datapoints/ec2:member'); - - $return = array(); - $return['label'] = $xpath->evaluate('string(//ec2:GetMetricStatisticsResult/ec2:Label/text())'); - foreach ( $nodes as $node ) { - $item = array(); - - $item['Timestamp'] = $xpath->evaluate('string(ec2:Timestamp/text())', $node); - $item['Unit'] = $xpath->evaluate('string(ec2:Unit/text())', $node); - $item['Samples'] = $xpath->evaluate('string(ec2:Samples/text())', $node); - foreach($_usedStatistics as $us) { - $item[$us] = $xpath->evaluate('string(ec2:' . $us . '/text())', $node); - } - - $return['datapoints'][] = $item; - unset($item, $node); - } - - return $return; - - } - - /** - * Return the Metrics that are aviable for your current monitored instances - * - * @param string $nextToken The NextToken parameter is an optional parameter - * that allows you to retrieve the next set of results - * for your ListMetrics query. - * @return array - */ - public function listMetrics($nextToken = null) - { - $params = array(); - $params['Action'] = 'ListMetrics'; - if (!empty($nextToken)) { - $params['NextToken'] = $nextToken; - } - - $response = $this->sendRequest($params); - $response->setNamespace($this->_xmlNamespace); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:ListMetricsResult/ec2:Metrics/ec2:member'); - - $return = array(); - foreach ( $nodes as $node ) { - $item = array(); - - $item['MeasureName'] = $xpath->evaluate('string(ec2:MeasureName/text())', $node); - $item['Namespace'] = $xpath->evaluate('string(ec2:Namespace/text())', $node); - $item['Deminsions']['name'] = $xpath->evaluate('string(ec2:Dimensions/ec2:member/ec2:Name/text())', $node); - $item['Deminsions']['value'] = $xpath->evaluate('string(ec2:Dimensions/ec2:member/ec2:Value/text())', $node); - - if (empty($item['Deminsions']['name'])) { - $item['Deminsions'] = array(); - } - - $return[] = $item; - unset($item, $node); - } - - return $return; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Ebs.php b/library/Zend/Service/Amazon/Ec2/Ebs.php deleted file mode 100644 index 913b3df766..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Ebs.php +++ /dev/null @@ -1,342 +0,0 @@ -sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - $return['volumeId'] = $xpath->evaluate('string(//ec2:volumeId/text())'); - $return['size'] = $xpath->evaluate('string(//ec2:size/text())'); - $return['status'] = $xpath->evaluate('string(//ec2:status/text())'); - $return['createTime'] = $xpath->evaluate('string(//ec2:createTime/text())'); - $return['availabilityZone'] = $xpath->evaluate('string(//ec2:availabilityZone/text())'); - - return $return; - } - - /** - * Creates a new Amazon EBS volume that you can mount from any Amazon EC2 instance. - * - * You must specify an availability zone when creating a volume. The volume and - * any instance to which it attaches must be in the same availability zone. - * - * @param string $snapshotId The snapshot from which to create the new volume. - * @param string $availabilityZone The availability zone in which to create the new volume. - * @return array - */ - public function createVolumeFromSnapshot($snapshotId, $availabilityZone) - { - $params = array(); - $params['Action'] = 'CreateVolume'; - $params['AvailabilityZone'] = $availabilityZone; - $params['SnapshotId'] = $snapshotId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - $return['volumeId'] = $xpath->evaluate('string(//ec2:volumeId/text())'); - $return['size'] = $xpath->evaluate('string(//ec2:size/text())'); - $return['status'] = $xpath->evaluate('string(//ec2:status/text())'); - $return['createTime'] = $xpath->evaluate('string(//ec2:createTime/text())'); - $return['availabilityZone'] = $xpath->evaluate('string(//ec2:availabilityZone/text())'); - $return['snapshotId'] = $xpath->evaluate('string(//ec2:snapshotId/text())'); - - return $return; - } - - /** - * Lists one or more Amazon EBS volumes that you own, If you do not - * specify any volumes, Amazon EBS returns all volumes that you own. - * - * @param string|array $volumeId The ID or array of ID's of the volume(s) to list - * @return array - */ - public function describeVolume($volumeId = null) - { - $params = array(); - $params['Action'] = 'DescribeVolumes'; - - if(is_array($volumeId) && !empty($volumeId)) { - foreach($volumeId as $k=>$name) { - $params['VolumeId.' . ($k+1)] = $name; - } - } elseif($volumeId) { - $params['VolumeId.1'] = $volumeId; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:volumeSet/ec2:item', $response->getDocument()); - - $return = array(); - foreach ($nodes as $node) { - $item = array(); - - $item['volumeId'] = $xpath->evaluate('string(ec2:volumeId/text())', $node); - $item['size'] = $xpath->evaluate('string(ec2:size/text())', $node); - $item['status'] = $xpath->evaluate('string(ec2:status/text())', $node); - $item['createTime'] = $xpath->evaluate('string(ec2:createTime/text())', $node); - - $attachmentSet = $xpath->query('ec2:attachmentSet/ec2:item', $node); - if($attachmentSet->length == 1) { - $_as = $attachmentSet->item(0); - $as = array(); - $as['volumeId'] = $xpath->evaluate('string(ec2:volumeId/text())', $_as); - $as['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $_as); - $as['device'] = $xpath->evaluate('string(ec2:device/text())', $_as); - $as['status'] = $xpath->evaluate('string(ec2:status/text())', $_as); - $as['attachTime'] = $xpath->evaluate('string(ec2:attachTime/text())', $_as); - $item['attachmentSet'] = $as; - } - - $return[] = $item; - unset($item, $node); - } - - return $return; - } - - public function describeAttachedVolumes($instanceId) - { - $volumes = $this->describeVolume(); - - $return = array(); - foreach($volumes as $vol) { - if(isset($vol['attachmentSet']) && $vol['attachmentSet']['instanceId'] == $instanceId) { - $return[] = $vol; - } - } - - return $return; - } - - /** - * Attaches an Amazon EBS volume to an instance - * - * @param string $volumeId The ID of the Amazon EBS volume - * @param string $instanceId The ID of the instance to which the volume attaches - * @param string $device Specifies how the device is exposed to the instance (e.g., /dev/sdh). - * @return array - */ - public function attachVolume($volumeId, $instanceId, $device) - { - $params = array(); - $params['Action'] = 'AttachVolume'; - $params['VolumeId'] = $volumeId; - $params['InstanceId'] = $instanceId; - $params['Device'] = $device; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $return = array(); - $return['volumeId'] = $xpath->evaluate('string(//ec2:volumeId/text())'); - $return['instanceId'] = $xpath->evaluate('string(//ec2:instanceId/text())'); - $return['device'] = $xpath->evaluate('string(//ec2:device/text())'); - $return['status'] = $xpath->evaluate('string(//ec2:status/text())'); - $return['attachTime'] = $xpath->evaluate('string(//ec2:attachTime/text())'); - - return $return; - } - - /** - * Detaches an Amazon EBS volume from an instance - * - * @param string $volumeId The ID of the Amazon EBS volume - * @param string $instanceId The ID of the instance from which the volume will detach - * @param string $device The device name - * @param boolean $force Forces detachment if the previous detachment attempt did not occur cleanly - * (logging into an instance, unmounting the volume, and detaching normally). - * This option can lead to data loss or a corrupted file system. Use this option - * only as a last resort to detach an instance from a failed instance. The - * instance will not have an opportunity to flush file system caches nor - * file system meta data. - * @return array - */ - public function detachVolume($volumeId, $instanceId = null, $device = null, $force = false) - { - $params = array(); - $params['Action'] = 'DetachVolume'; - $params['VolumeId'] = $volumeId; - $params['InstanceId'] = strval($instanceId); - $params['Device'] = strval($device); - $params['Force'] = strval($force); - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $return = array(); - $return['volumeId'] = $xpath->evaluate('string(//ec2:volumeId/text())'); - $return['instanceId'] = $xpath->evaluate('string(//ec2:instanceId/text())'); - $return['device'] = $xpath->evaluate('string(//ec2:device/text())'); - $return['status'] = $xpath->evaluate('string(//ec2:status/text())'); - $return['attachTime'] = $xpath->evaluate('string(//ec2:attachTime/text())'); - - return $return; - } - - /** - * Deletes an Amazon EBS volume - * - * @param string $volumeId The ID of the volume to delete - * @return boolean - */ - public function deleteVolume($volumeId) - { - $params = array(); - $params['Action'] = 'DeleteVolume'; - $params['VolumeId'] = $volumeId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Creates a snapshot of an Amazon EBS volume and stores it in Amazon S3. You can use snapshots for backups, - * to launch instances from identical snapshots, and to save data before shutting down an instance - * - * @param string $volumeId The ID of the Amazon EBS volume to snapshot - * @return array - */ - public function createSnapshot($volumeId) - { - $params = array(); - $params['Action'] = 'CreateSnapshot'; - $params['VolumeId'] = $volumeId; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $return = array(); - $return['snapshotId'] = $xpath->evaluate('string(//ec2:snapshotId/text())'); - $return['volumeId'] = $xpath->evaluate('string(//ec2:volumeId/text())'); - $return['status'] = $xpath->evaluate('string(//ec2:status/text())'); - $return['startTime'] = $xpath->evaluate('string(//ec2:startTime/text())'); - $return['progress'] = $xpath->evaluate('string(//ec2:progress/text())'); - - return $return; - } - - /** - * Describes the status of Amazon EBS snapshots - * - * @param string|array $snapshotId The ID or arry of ID's of the Amazon EBS snapshot - * @return array - */ - public function describeSnapshot($snapshotId = null) - { - $params = array(); - $params['Action'] = 'DescribeSnapshots'; - - if(is_array($snapshotId) && !empty($snapshotId)) { - foreach($snapshotId as $k=>$name) { - $params['SnapshotId.' . ($k+1)] = $name; - } - } elseif($snapshotId) { - $params['SnapshotId.1'] = $snapshotId; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:snapshotSet/ec2:item', $response->getDocument()); - - $return = array(); - foreach ($nodes as $node) { - $item = array(); - - $item['snapshotId'] = $xpath->evaluate('string(ec2:snapshotId/text())', $node); - $item['volumeId'] = $xpath->evaluate('string(ec2:volumeId/text())', $node); - $item['status'] = $xpath->evaluate('string(ec2:status/text())', $node); - $item['startTime'] = $xpath->evaluate('string(ec2:startTime/text())', $node); - $item['progress'] = $xpath->evaluate('string(ec2:progress/text())', $node); - - $return[] = $item; - unset($item, $node); - } - - return $return; - } - - /** - * Deletes a snapshot of an Amazon EBS volume that is stored in Amazon S3 - * - * @param string $snapshotId The ID of the Amazon EBS snapshot to delete - * @return boolean - */ - public function deleteSnapshot($snapshotId) - { - $params = array(); - $params['Action'] = 'DeleteSnapshot'; - $params['SnapshotId'] = $snapshotId; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Elasticip.php b/library/Zend/Service/Amazon/Ec2/Elasticip.php deleted file mode 100644 index f4237a18e7..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Elasticip.php +++ /dev/null @@ -1,158 +0,0 @@ -sendRequest($params); - - $xpath = $response->getXPath(); - $ip = $xpath->evaluate('string(//ec2:publicIp/text())'); - - return $ip; - } - - /** - * Lists elastic IP addresses assigned to your account. - * - * @param string|array $publicIp Elastic IP or list of addresses to describe. - * @return array - */ - public function describe($publicIp = null) - { - $params = array(); - $params['Action'] = 'DescribeAddresses'; - - if(is_array($publicIp) && !empty($publicIp)) { - foreach($publicIp as $k=>$name) { - $params['PublicIp.' . ($k+1)] = $name; - } - } elseif($publicIp) { - $params['PublicIp.1'] = $publicIp; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:item'); - - $return = array(); - foreach ($nodes as $k => $node) { - $item = array(); - $item['publicIp'] = $xpath->evaluate('string(ec2:publicIp/text())', $node); - $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $node); - - $return[] = $item; - unset($item); - } - - return $return; - } - - /** - * Releases an elastic IP address that is associated with your account - * - * @param string $publicIp IP address that you are releasing from your account. - * @return boolean - */ - public function release($publicIp) - { - $params = array(); - $params['Action'] = 'ReleaseAddress'; - $params['PublicIp'] = $publicIp; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Associates an elastic IP address with an instance - * - * @param string $instanceId The instance to which the IP address is assigned - * @param string $publicIp IP address that you are assigning to the instance. - * @return boolean - */ - public function associate($instanceId, $publicIp) - { - $params = array(); - $params['Action'] = 'AssociateAddress'; - $params['PublicIp'] = $publicIp; - $params['InstanceId'] = $instanceId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Disassociates the specified elastic IP address from the instance to which it is assigned. - * This is an idempotent operation. If you enter it more than once, Amazon EC2 does not return an error. - * - * @param string $publicIp IP address that you are disassociating from the instance. - * @return boolean - */ - public function disassocate($publicIp) - { - $params = array(); - $params['Action'] = 'DisssociateAddress'; - $params['PublicIp'] = $publicIp; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - -} diff --git a/library/Zend/Service/Amazon/Ec2/Exception.php b/library/Zend/Service/Amazon/Ec2/Exception.php deleted file mode 100644 index f5bb2709c6..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Exception.php +++ /dev/null @@ -1,51 +0,0 @@ -awsErrorCode = $awsErrorCode; - } - - public function getErrorCode() - { - return $this->awsErrorCode; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Image.php b/library/Zend/Service/Amazon/Ec2/Image.php deleted file mode 100644 index 02ab715ca0..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Image.php +++ /dev/null @@ -1,333 +0,0 @@ -sendRequest($params); - $xpath = $response->getXPath(); - - $amiId = $xpath->evaluate('string(//ec2:imageId/text())'); - - return $amiId; - } - - /** - * Returns information about AMIs, AKIs, and ARIs available to the user. - * Information returned includes image type, product codes, architecture, - * and kernel and RAM disk IDs. Images available to the user include public - * images available for any user to launch, private images owned by the user - * making the request, and private images owned by other users for which the - * user has explicit launch permissions. - * - * Launch permissions fall into three categories: - * public: The owner of the AMI granted launch permissions for the AMI - * to the all group. All users have launch permissions for these AMIs. - * explicit: The owner of the AMI granted launch permissions to a specific user. - * implicit: A user has implicit launch permissions for all AMIs he or she owns. - * - * The list of AMIs returned can be modified by specifying AMI IDs, AMI owners, - * or users with launch permissions. If no options are specified, Amazon EC2 returns - * all AMIs for which the user has launch permissions. - * - * If you specify one or more AMI IDs, only AMIs that have the specified IDs are returned. - * If you specify an invalid AMI ID, a fault is returned. If you specify an AMI ID for which - * you do not have access, it will not be included in the returned results. - * - * If you specify one or more AMI owners, only AMIs from the specified owners and for - * which you have access are returned. The results can include the account IDs of the - * specified owners, amazon for AMIs owned by Amazon or self for AMIs that you own. - * - * If you specify a list of executable users, only users that have launch permissions - * for the AMIs are returned. You can specify account IDs (if you own the AMI(s)), self - * for AMIs for which you own or have explicit permissions, or all for public AMIs. - * - * @param string|array $imageId A list of image descriptions - * @param string|array $owner Owners of AMIs to describe. - * @param string|array $executableBy AMIs for which specified users have access. - * @return array - */ - public function describe($imageId = null, $owner = null, $executableBy = null) - { - $params = array(); - $params['Action'] = 'DescribeImages'; - - if(is_array($imageId) && !empty($imageId)) { - foreach($imageId as $k=>$name) { - $params['ImageId.' . ($k+1)] = $name; - } - } elseif($imageId) { - $params['ImageId.1'] = $imageId; - } - - if(is_array($owner) && !empty($owner)) { - foreach($owner as $k=>$name) { - $params['Owner.' . ($k+1)] = $name; - } - } elseif($owner) { - $params['Owner.1'] = $owner; - } - - if(is_array($executableBy) && !empty($executableBy)) { - foreach($executableBy as $k=>$name) { - $params['ExecutableBy.' . ($k+1)] = $name; - } - } elseif($executableBy) { - $params['ExecutableBy.1'] = $executableBy; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:imagesSet/ec2:item'); - - $return = array(); - foreach ($nodes as $node) { - $item = array(); - - $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $node); - $item['imageLocation'] = $xpath->evaluate('string(ec2:imageLocation/text())', $node); - $item['imageState'] = $xpath->evaluate('string(ec2:imageState/text())', $node); - $item['imageOwnerId'] = $xpath->evaluate('string(ec2:imageOwnerId/text())', $node); - $item['isPublic'] = $xpath->evaluate('string(ec2:isPublic/text())', $node); - $item['architecture'] = $xpath->evaluate('string(ec2:architecture/text())', $node); - $item['imageType'] = $xpath->evaluate('string(ec2:imageType/text())', $node); - $item['kernelId'] = $xpath->evaluate('string(ec2:kernelId/text())', $node); - $item['ramdiskId'] = $xpath->evaluate('string(ec2:ramdiskId/text())', $node); - $item['platform'] = $xpath->evaluate('string(ec2:platform/text())', $node); - - $return[] = $item; - unset($item, $node); - } - - return $return; - } - - /** - * Deregisters an AMI. Once deregistered, instances of the AMI can no longer be launched. - * - * @param string $imageId Unique ID of a machine image, returned by a call - * to RegisterImage or DescribeImages. - * @return boolean - */ - public function deregister($imageId) - { - $params = array(); - $params['Action'] = 'DeregisterImage'; - $params['ImageId'] = $imageId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Modifies an attribute of an AMI. - * - * Valid Attributes: - * launchPermission: Controls who has permission to launch the AMI. Launch permissions - * can be granted to specific users by adding userIds. - * To make the AMI public, add the all group. - * productCodes: Associates a product code with AMIs. This allows developers to - * charge users for using AMIs. The user must be signed up for the - * product before they can launch the AMI. This is a write once attribute; - * after it is set, it cannot be changed or removed. - * - * @param string $imageId AMI ID to modify. - * @param string $attribute Specifies the attribute to modify. See the preceding - * attributes table for supported attributes. - * @param string $operationType Specifies the operation to perform on the attribute. - * See the preceding attributes table for supported operations for attributes. - * Valid Values: add | remove - * Required for launchPermssion Attribute - * - * @param string|array $userId User IDs to add to or remove from the launchPermission attribute. - * Required for launchPermssion Attribute - * @param string|array $userGroup User groups to add to or remove from the launchPermission attribute. - * Currently, the all group is available, which will make it a public AMI. - * Required for launchPermssion Attribute - * @param string $productCode Attaches a product code to the AMI. Currently only one product code - * can be associated with an AMI. Once set, the product code cannot be changed or reset. - * Required for productCodes Attribute - * @return boolean - */ - public function modifyAttribute($imageId, $attribute, $operationType = 'add', $userId = null, $userGroup = null, $productCode = null) - { - $params = array(); - $params['Action'] = 'ModifyImageAttribute'; - $parmas['ImageId'] = $imageId; - $params['Attribute'] = $attribute; - - switch($attribute) { - case 'launchPermission': - // break left out - case 'launchpermission': - $params['Attribute'] = 'launchPermission'; - $params['OperationType'] = $operationType; - - if(is_array($userId) && !empty($userId)) { - foreach($userId as $k=>$name) { - $params['UserId.' . ($k+1)] = $name; - } - } elseif($userId) { - $params['UserId.1'] = $userId; - } - - if(is_array($userGroup) && !empty($userGroup)) { - foreach($userGroup as $k=>$name) { - $params['UserGroup.' . ($k+1)] = $name; - } - } elseif($userGroup) { - $params['UserGroup.1'] = $userGroup; - } - - break; - case 'productCodes': - // break left out - case 'productcodes': - $params['Attribute'] = 'productCodes'; - $params['ProductCode.1'] = $productCode; - break; - default: - #require_once 'Zend/Service/Amazon/Ec2/Exception.php'; - throw new Zend_Service_Amazon_Ec2_Exception('Invalid Attribute Passed In. Valid Image Attributes are launchPermission and productCode.'); - break; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Returns information about an attribute of an AMI. Only one attribute can be specified per call. - * - * @param string $imageId ID of the AMI for which an attribute will be described. - * @param string $attribute Specifies the attribute to describe. Valid Attributes are - * launchPermission, productCodes - */ - public function describeAttribute($imageId, $attribute) - { - $params = array(); - $params['Action'] = 'DescribeImageAttribute'; - $params['ImageId'] = $imageId; - $params['Attribute'] = $attribute; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - $return['imageId'] = $xpath->evaluate('string(//ec2:imageId/text())'); - - // check for launchPermission - if($attribute == 'launchPermission') { - $lPnodes = $xpath->query('//ec2:launchPermission/ec2:item'); - - if($lPnodes->length > 0) { - $return['launchPermission'] = array(); - foreach($lPnodes as $node) { - $return['launchPermission'][] = $xpath->evaluate('string(ec2:userId/text())', $node); - } - } - } - - // check for product codes - if($attribute == 'productCodes') { - $pCnodes = $xpath->query('//ec2:productCodes/ec2:item'); - if($pCnodes->length > 0) { - $return['productCodes'] = array(); - foreach($pCnodes as $node) { - $return['productCodes'][] = $xpath->evaluate('string(ec2:productCode/text())', $node); - } - } - } - - return $return; - - } - - /** - * Resets an attribute of an AMI to its default value. The productCodes attribute cannot be reset - * - * @param string $imageId ID of the AMI for which an attribute will be reset. - * @param String $attribute Specifies the attribute to reset. Currently, only launchPermission is supported. - * In the case of launchPermission, all public and explicit launch permissions for - * the AMI are revoked. - * @return boolean - */ - public function resetAttribute($imageId, $attribute) - { - $params = array(); - $params['Action'] = 'ResetImageAttribute'; - $params['ImageId'] = $imageId; - $params['Attribute'] = $attribute; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Instance.php b/library/Zend/Service/Amazon/Ec2/Instance.php deleted file mode 100644 index 9128425aa2..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Instance.php +++ /dev/null @@ -1,532 +0,0 @@ - 1, - 'maxCount' => 1, - 'instanceType' => Zend_Service_Amazon_Ec2_Instance::SMALL - ); - - // set / override the defualt optoins if they are not passed into the array; - $options = array_merge($_defaultOptions, $options); - - if(!isset($options['imageId'])) { - #require_once 'Zend/Service/Amazon/Ec2/Exception.php'; - throw new Zend_Service_Amazon_Ec2_Exception('No Image Id Provided'); - } - - - $params = array(); - $params['Action'] = 'RunInstances'; - $params['ImageId'] = $options['imageId']; - $params['MinCount'] = $options['minCount']; - $params['MaxCount'] = $options['maxCount']; - - if(isset($options['keyName'])) { - $params['KeyName'] = $options['keyName']; - } - - if(is_array($options['securityGroup']) && !empty($options['securityGroup'])) { - foreach($options['securityGroup'] as $k=>$name) { - $params['SecurityGroup.' . ($k+1)] = $name; - } - } elseif(isset($options['securityGroup'])) { - $params['SecurityGroup.1'] = $options['securityGroup']; - } - - if(isset($options['userData'])) { - $params['UserData'] = base64_encode($options['userData']); - } - - if(isset($options['instanceType'])) { - $params['InstanceType'] = $options['instanceType']; - } - - if(isset($options['placement'])) { - $params['Placement.AvailabilityZone'] = $options['placement']; - } - - if(isset($options['kernelId'])) { - $params['KernelId'] = $options['kernelId']; - } - - if(isset($options['ramdiskId'])) { - $params['RamdiskId'] = $options['ramdiskId']; - } - - if(isset($options['blockDeviceVirtualName']) && isset($options['blockDeviceName'])) { - $params['BlockDeviceMapping.n.VirtualName'] = $options['blockDeviceVirtualName']; - $params['BlockDeviceMapping.n.DeviceName'] = $options['blockDeviceName']; - } - - if(isset($options['monitor']) && $options['monitor'] === true) { - $params['Monitoring.Enabled'] = true; - } - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - - $return['reservationId'] = $xpath->evaluate('string(//ec2:reservationId/text())'); - $return['ownerId'] = $xpath->evaluate('string(//ec2:ownerId/text())'); - - $gs = $xpath->query('//ec2:groupSet/ec2:item'); - foreach($gs as $gs_node) { - $return['groupSet'][] = $xpath->evaluate('string(ec2:groupId/text())', $gs_node); - unset($gs_node); - } - unset($gs); - - $is = $xpath->query('//ec2:instancesSet/ec2:item'); - foreach($is as $is_node) { - $item = array(); - - $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $is_node); - $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $is_node); - $item['instanceState']['code'] = $xpath->evaluate('string(ec2:instanceState/ec2:code/text())', $is_node); - $item['instanceState']['name'] = $xpath->evaluate('string(ec2:instanceState/ec2:name/text())', $is_node); - $item['privateDnsName'] = $xpath->evaluate('string(ec2:privateDnsName/text())', $is_node); - $item['dnsName'] = $xpath->evaluate('string(ec2:dnsName/text())', $is_node); - $item['keyName'] = $xpath->evaluate('string(ec2:keyName/text())', $is_node); - $item['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $is_node); - $item['amiLaunchIndex'] = $xpath->evaluate('string(ec2:amiLaunchIndex/text())', $is_node); - $item['launchTime'] = $xpath->evaluate('string(ec2:launchTime/text())', $is_node); - $item['availabilityZone'] = $xpath->evaluate('string(ec2:placement/ec2:availabilityZone/text())', $is_node); - - $return['instances'][] = $item; - unset($item); - unset($is_node); - } - unset($is); - - return $return; - - } - - /** - * Returns information about instances that you own. - * - * If you specify one or more instance IDs, Amazon EC2 returns information - * for those instances. If you do not specify instance IDs, Amazon EC2 - * returns information for all relevant instances. If you specify an invalid - * instance ID, a fault is returned. If you specify an instance that you do - * not own, it will not be included in the returned results. - * - * Recently terminated instances might appear in the returned results. - * This interval is usually less than one hour. - * - * @param string|array $instaceId Set of instances IDs of which to get the status. - * @param boolean Ture to ignore Terminated Instances. - * @return array - */ - public function describe($instanceId = null, $ignoreTerminated = false) - { - $params = array(); - $params['Action'] = 'DescribeInstances'; - - if(is_array($instanceId) && !empty($instanceId)) { - foreach($instanceId as $k=>$name) { - $params['InstanceId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['InstanceId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $nodes = $xpath->query('//ec2:reservationSet/ec2:item'); - - $return = array(); - $return['instances'] = array(); - - foreach($nodes as $node) { - if($xpath->evaluate('string(ec2:instancesSet/ec2:item/ec2:instanceState/ec2:code/text())', $node) == 48 && $ignoreTerminated) continue; - $item = array(); - - $item['reservationId'] = $xpath->evaluate('string(ec2:reservationId/text())', $node); - $item['ownerId'] = $xpath->evaluate('string(ec2:ownerId/text())', $node); - - $gs = $xpath->query('ec2:groupSet/ec2:item', $node); - foreach($gs as $gs_node) { - $item['groupSet'][] = $xpath->evaluate('string(ec2:groupId/text())', $gs_node); - unset($gs_node); - } - unset($gs); - - $is = $xpath->query('ec2:instancesSet/ec2:item', $node); - - foreach($is as $is_node) { - - $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $is_node); - $item['imageId'] = $xpath->evaluate('string(ec2:imageId/text())', $is_node); - $item['instanceState']['code'] = $xpath->evaluate('string(ec2:instanceState/ec2:code/text())', $is_node); - $item['instanceState']['name'] = $xpath->evaluate('string(ec2:instanceState/ec2:name/text())', $is_node); - $item['privateDnsName'] = $xpath->evaluate('string(ec2:privateDnsName/text())', $is_node); - $item['dnsName'] = $xpath->evaluate('string(ec2:dnsName/text())', $is_node); - $item['keyName'] = $xpath->evaluate('string(ec2:keyName/text())', $is_node); - $item['productCode'] = $xpath->evaluate('string(ec2:productCodesSet/ec2:item/ec2:productCode/text())', $is_node); - $item['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $is_node); - $item['launchTime'] = $xpath->evaluate('string(ec2:launchTime/text())', $is_node); - $item['availabilityZone'] = $xpath->evaluate('string(ec2:placement/ec2:availabilityZone/text())', $is_node); - $item['kernelId'] = $xpath->evaluate('string(ec2:kernelId/text())', $is_node); - $item['ramediskId'] = $xpath->evaluate('string(ec2:ramediskId/text())', $is_node); - $item['amiLaunchIndex'] = $xpath->evaluate('string(ec2:amiLaunchIndex/text())', $is_node); - $item['monitoringState'] = $xpath->evaluate('string(ec2:monitoring/ec2:state/text())', $is_node); - - $return['instances'][] = $item; - unset($is_node); - } - unset($item); - unset($is); - } - - return $return; - } - - /** - * Returns information about instances that you own that were started from - * a specific imageId - * - * Recently terminated instances might appear in the returned results. - * This interval is usually less than one hour. - * - * @param string $imageId The imageId used to start the Instance. - * @param boolean Ture to ignore Terminated Instances. - * @return array - */ - public function describeByImageId($imageId, $ignoreTerminated = false) - { - $arrInstances = $this->describe(null, $ignoreTerminated); - - $return = array(); - - foreach($arrInstances['instances'] as $instance) { - if($instance['imageId'] !== $imageId) continue; - $return[] = $instance; - } - - return $return; - } - - /** - * Shuts down one or more instances. This operation is idempotent; if you terminate - * an instance more than once, each call will succeed. - * - * Terminated instances will remain visible after termination (approximately one hour). - * - * @param string|array $instanceId One or more instance IDs returned. - * @return array - */ - public function terminate($instanceId) - { - $params = array(); - $params['Action'] = 'TerminateInstances'; - - if(is_array($instanceId) && !empty($instanceId)) { - foreach($instanceId as $k=>$name) { - $params['InstanceId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['InstanceId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $nodes = $xpath->query('//ec2:instancesSet/ec2:item'); - - $return = array(); - foreach($nodes as $node) { - $item = array(); - - $item['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $node); - $item['shutdownState']['code'] = $xpath->evaluate('string(ec2:shutdownState/ec2:code/text())', $node); - $item['shutdownState']['name'] = $xpath->evaluate('string(ec2:shutdownState/ec2:name/text())', $node); - $item['previousState']['code'] = $xpath->evaluate('string(ec2:previousState/ec2:code/text())', $node); - $item['previousState']['name'] = $xpath->evaluate('string(ec2:previousState/ec2:name/text())', $node); - - $return[] = $item; - unset($item); - } - - return $return; - } - - /** - * Requests a reboot of one or more instances. - * - * This operation is asynchronous; it only queues a request to reboot the specified instance(s). The operation - * will succeed if the instances are valid and belong to the user. Requests to reboot terminated instances are ignored. - * - * @param string|array $instanceId One or more instance IDs. - * @return boolean - */ - public function reboot($instanceId) - { - $params = array(); - $params['Action'] = 'RebootInstances'; - - if(is_array($instanceId) && !empty($instanceId)) { - foreach($instanceId as $k=>$name) { - $params['InstanceId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['InstanceId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = $xpath->evaluate('string(//ec2:return/text())'); - - return ($return === "true"); - } - - /** - * Retrieves console output for the specified instance. - * - * Instance console output is buffered and posted shortly after instance boot, reboot, and termination. - * Amazon EC2 preserves the most recent 64 KB output which will be available for at least one hour after the most recent post. - * - * @param string $instanceId An instance ID - * @return array - */ - public function consoleOutput($instanceId) - { - $params = array(); - $params['Action'] = 'GetConsoleOutput'; - $params['InstanceId'] = $instanceId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - - $return['instanceId'] = $xpath->evaluate('string(//ec2:instanceId/text())'); - $return['timestamp'] = $xpath->evaluate('string(//ec2:timestamp/text())'); - $return['output'] = base64_decode($xpath->evaluate('string(//ec2:output/text())')); - - return $return; - } - - /** - * Returns true if the specified product code is attached to the specified instance. - * The operation returns false if the product code is not attached to the instance. - * - * The confirmProduct operation can only be executed by the owner of the AMI. - * This feature is useful when an AMI owner is providing support and wants to - * verify whether a user's instance is eligible. - * - * @param string $productCode The product code to confirm. - * @param string $instanceId The instance for which to confirm the product code. - * @return array|boolean An array if the product code is attached to the instance, false if it is not. - */ - public function confirmProduct($productCode, $instanceId) - { - $params = array(); - $params['Action'] = 'ConfirmProductInstance'; - $params['ProductCode'] = $productCode; - $params['InstanceId'] = $instanceId; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $result = $xpath->evaluate('string(//ec2:result/text())'); - - if($result === "true") { - $return['result'] = true; - $return['ownerId'] = $xpath->evaluate('string(//ec2:ownerId/text())'); - - return $return; - } - - return false; - } - - /** - * Turn on Amazon CloudWatch Monitoring for an instance or a list of instances - * - * @param array|string $instanceId The instance or list of instances you want to enable monitoring for - * @return array - */ - public function monitor($instanceId) - { - $params = array(); - $params['Action'] = 'MonitorInstances'; - - if(is_array($instanceId) && !empty($instanceId)) { - foreach($instanceId as $k=>$name) { - $params['InstanceId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['InstanceId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - - $items = $xpath->query('//ec2:instancesSet/ec2:item'); - - $arrReturn = array(); - foreach($items as $item) { - $i = array(); - $i['instanceid'] = $xpath->evaluate('string(//ec2:instanceId/text())', $item); - $i['monitorstate'] = $xpath->evaluate('string(//ec2:monitoring/ec2:state/text())'); - $arrReturn[] = $i; - unset($i); - } - - return $arrReturn; - } - /** - * Turn off Amazon CloudWatch Monitoring for an instance or a list of instances - * - * @param array|string $instanceId The instance or list of instances you want to disable monitoring for - * @return array - */ - public function unmonitor($instanceId) - { - $params = array(); - $params['Action'] = 'UnmonitorInstances'; - - if(is_array($instanceId) && !empty($instanceId)) { - foreach($instanceId as $k=>$name) { - $params['InstanceId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['InstanceId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - - $items = $xpath->query('//ec2:instancesSet/ec2:item'); - - $arrReturn = array(); - foreach($items as $item) { - $i = array(); - $i['instanceid'] = $xpath->evaluate('string(//ec2:instanceId/text())', $item); - $i['monitorstate'] = $xpath->evaluate('string(//ec2:monitoring/ec2:state/text())'); - $arrReturn[] = $i; - unset($i); - } - - return $arrReturn; - } - -} - diff --git a/library/Zend/Service/Amazon/Ec2/Instance/Reserved.php b/library/Zend/Service/Amazon/Ec2/Instance/Reserved.php deleted file mode 100644 index 08abbe1f87..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Instance/Reserved.php +++ /dev/null @@ -1,143 +0,0 @@ -$name) { - $params['ReservedInstancesId.' . ($k+1)] = $name; - } - } elseif($instanceId) { - $params['ReservedInstancesId.1'] = $instanceId; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $items = $xpath->query('//ec2:reservedInstancesSet/ec2:item'); - - $return = array(); - foreach($items as $item) { - $i = array(); - $i['reservedInstancesId'] = $xpath->evaluate('string(ec2:reservedInstancesId/text())', $item); - $i['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $item); - $i['availabilityZone'] = $xpath->evaluate('string(ec2:availabilityZone/text())', $item); - $i['duration'] = $xpath->evaluate('string(ec2:duration/text())', $item); - $i['fixedPrice'] = $xpath->evaluate('string(ec2:fixedPrice/text())', $item); - $i['usagePrice'] = $xpath->evaluate('string(ec2:usagePrice/text())', $item); - $i['productDescription'] = $xpath->evaluate('string(ec2:productDescription/text())', $item); - $i['instanceCount'] = $xpath->evaluate('string(ec2:instanceCount/text())', $item); - $i['state'] = $xpath->evaluate('string(ec2:state/text())', $item); - - $return[] = $i; - unset($i); - } - - return $return; - } - - /** - * Describes Reserved Instance offerings that are available for purchase. - * With Amazon EC2 Reserved Instances, you purchase the right to launch Amazon - * EC2 instances for a period of time (without getting insufficient capacity - * errors) and pay a lower usage rate for the actual time used. - * - * @return array - */ - public function describeOfferings() - { - $params = array(); - $params['Action'] = 'DescribeReservedInstancesOfferings'; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $items = $xpath->query('//ec2:reservedInstancesOfferingsSet/ec2:item'); - - $return = array(); - foreach($items as $item) { - $i = array(); - $i['reservedInstancesOfferingId'] = $xpath->evaluate('string(ec2:reservedInstancesOfferingId/text())', $item); - $i['instanceType'] = $xpath->evaluate('string(ec2:instanceType/text())', $item); - $i['availabilityZone'] = $xpath->evaluate('string(ec2:availabilityZone/text())', $item); - $i['duration'] = $xpath->evaluate('string(ec2:duration/text())', $item); - $i['fixedPrice'] = $xpath->evaluate('string(ec2:fixedPrice/text())', $item); - $i['usagePrice'] = $xpath->evaluate('string(ec2:usagePrice/text())', $item); - $i['productDescription'] = $xpath->evaluate('string(ec2:productDescription/text())', $item); - - $return[] = $i; - unset($i); - } - - return $return; - } - - /** - * Purchases a Reserved Instance for use with your account. With Amazon EC2 - * Reserved Instances, you purchase the right to launch Amazon EC2 instances - * for a period of time (without getting insufficient capacity errors) and - * pay a lower usage rate for the actual time used. - * - * @param string $offeringId The offering ID of the Reserved Instance to purchase - * @param integer $intanceCount The number of Reserved Instances to purchase. - * @return string The ID of the purchased Reserved Instances. - */ - public function purchaseOffering($offeringId, $intanceCount = 1) - { - $params = array(); - $params['Action'] = 'PurchaseReservedInstancesOffering'; - $params['OfferingId.1'] = $offeringId; - $params['instanceCount.1'] = intval($intanceCount); - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $reservedInstancesId = $xpath->evaluate('string(//ec2:reservedInstancesId/text())'); - - return $reservedInstancesId; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Instance/Windows.php b/library/Zend/Service/Amazon/Ec2/Instance/Windows.php deleted file mode 100644 index 0ece9624e1..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Instance/Windows.php +++ /dev/null @@ -1,195 +0,0 @@ -_getAccessKey(); - $params['Storage.S3.Bucket'] = $s3Bucket; - $params['Storage.S3.Prefix'] = $s3Prefix; - $uploadPolicy = $this->_getS3UploadPolicy($s3Bucket, $s3Prefix, $uploadExpiration); - $params['Storage.S3.UploadPolicy'] = $uploadPolicy; - $params['Storage.S3.UploadPolicySignature'] = $this->_signS3UploadPolicy($uploadPolicy); - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $return = array(); - $return['instanceId'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:instanceId/text())'); - $return['bundleId'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:bundleId/text())'); - $return['state'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:state/text())'); - $return['startTime'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:startTime/text())'); - $return['updateTime'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:updateTime/text())'); - $return['progress'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:progress/text())'); - $return['storage']['s3']['bucket'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:storage/ec2:S3/ec2:bucket/text())'); - $return['storage']['s3']['prefix'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:storage/ec2:S3/ec2:prefix/text())'); - - return $return; - } - - /** - * Cancels an Amazon EC2 bundling operation - * - * @param string $bundleId The ID of the bundle task to cancel - * @return array Information on the bundle task - */ - public function cancelBundle($bundleId) - { - $params = array(); - $params['Action'] = 'CancelBundleTask'; - $params['BundleId'] = $bundleId; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $return = array(); - $return['instanceId'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:instanceId/text())'); - $return['bundleId'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:bundleId/text())'); - $return['state'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:state/text())'); - $return['startTime'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:startTime/text())'); - $return['updateTime'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:updateTime/text())'); - $return['progress'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:progress/text())'); - $return['storage']['s3']['bucket'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:storage/ec2:S3/ec2:bucket/text())'); - $return['storage']['s3']['prefix'] = $xpath->evaluate('string(//ec2:bundleInstanceTask/ec2:storage/ec2:S3/ec2:prefix/text())'); - - return $return; - } - - /** - * Describes current bundling tasks - * - * @param string|array $bundleId A single or a list of bundle tasks that you want - * to find information for. - * @return array Information for the task that you requested - */ - public function describeBundle($bundleId = '') - { - $params = array(); - $params['Action'] = 'DescribeBundleTasks'; - - if(is_array($bundleId) && !empty($bundleId)) { - foreach($bundleId as $k=>$name) { - $params['bundleId.' . ($k+1)] = $name; - } - } elseif(!empty($bundleId)) { - $params['bundleId.1'] = $bundleId; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - - $items = $xpath->evaluate('//ec2:bundleInstanceTasksSet/ec2:item'); - $return = array(); - - foreach($items as $item) { - $i = array(); - $i['instanceId'] = $xpath->evaluate('string(ec2:instanceId/text())', $item); - $i['bundleId'] = $xpath->evaluate('string(ec2:bundleId/text())', $item); - $i['state'] = $xpath->evaluate('string(ec2:state/text())', $item); - $i['startTime'] = $xpath->evaluate('string(ec2:startTime/text())', $item); - $i['updateTime'] = $xpath->evaluate('string(ec2:updateTime/text())', $item); - $i['progress'] = $xpath->evaluate('string(ec2:progress/text())', $item); - $i['storage']['s3']['bucket'] = $xpath->evaluate('string(ec2:storage/ec2:S3/ec2:bucket/text())', $item); - $i['storage']['s3']['prefix'] = $xpath->evaluate('string(ec2:storage/ec2:S3/ec2:prefix/text())', $item); - - $return[] = $i; - unset($i); - } - - - return $return; - } - - /** - * Generates the S3 Upload Policy Information - * - * @param string $bucketName Which bucket you want the ami to live in on S3 - * @param string $prefix The prefix you want to assign to the AMI on S3 - * @param integer $expireInMinutes The expiration of the upload policy. Amazon recommends 12 hours or longer. - * This is based in nubmer of minutes. Default is 1440 minutes (24 hours) - * @return string Base64 encoded string that is the upload policy - */ - protected function _getS3UploadPolicy($bucketName, $prefix, $expireInMinutes = 1440) - { - $arrParams = array(); - $arrParams['expiration'] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", (time() + ($expireInMinutes * 60))); - $arrParams['conditions'][] = array('bucket' => $bucketName); - $arrParams['conditions'][] = array('acl' => 'ec2-bundle-read'); - $arrParams['conditions'][] = array('starts-with', '$key', $prefix); - - return base64_encode(Zend_Json::encode($arrParams)); - } - - /** - * Signed S3 Upload Policy - * - * @param string $policy Base64 Encoded string that is the upload policy - * @return string SHA1 encoded S3 Upload Policy - */ - protected function _signS3UploadPolicy($policy) - { - $hmac = Zend_Crypt_Hmac::compute($this->_getSecretKey(), 'SHA1', $policy, Zend_Crypt_Hmac::BINARY); - return $hmac; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Keypair.php b/library/Zend/Service/Amazon/Ec2/Keypair.php deleted file mode 100644 index f45071bbdc..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Keypair.php +++ /dev/null @@ -1,137 +0,0 @@ -sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - $return['keyName'] = $xpath->evaluate('string(//ec2:keyName/text())'); - $return['keyFingerprint'] = $xpath->evaluate('string(//ec2:keyFingerprint/text())'); - $return['keyMaterial'] = $xpath->evaluate('string(//ec2:keyMaterial/text())'); - - return $return; - } - - /** - * Returns information about key pairs available to you. If you specify - * key pairs, information about those key pairs is returned. Otherwise, - * information for all registered key pairs is returned. - * - * @param string|rarray $keyName Key pair IDs to describe. - * @return array - */ - public function describe($keyName = null) - { - $params = array(); - - $params['Action'] = 'DescribeKeyPairs'; - if(is_array($keyName) && !empty($keyName)) { - foreach($keyName as $k=>$name) { - $params['KeyName.' . ($k+1)] = $name; - } - } elseif($keyName) { - $params['KeyName.1'] = $keyName; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $nodes = $xpath->query('//ec2:keySet/ec2:item'); - - $return = array(); - foreach ($nodes as $k => $node) { - $item = array(); - $item['keyName'] = $xpath->evaluate('string(ec2:keyName/text())', $node); - $item['keyFingerprint'] = $xpath->evaluate('string(ec2:keyFingerprint/text())', $node); - - $return[] = $item; - unset($item); - } - - return $return; - } - - /** - * Deletes a key pair - * - * @param string $keyName Name of the key pair to delete. - * @throws Zend_Service_Amazon_Ec2_Exception - * @return boolean Return true or false from the deletion. - */ - public function delete($keyName) - { - $params = array(); - - $params['Action'] = 'DeleteKeyPair'; - - if(!$keyName) { - #require_once 'Zend/Service/Amazon/Ec2/Exception.php'; - throw new Zend_Service_Amazon_Ec2_Exception('Invalid Key Name'); - } - - $params['KeyName'] = $keyName; - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - return ($success === "true"); - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Region.php b/library/Zend/Service/Amazon/Ec2/Region.php deleted file mode 100644 index 6bf36291a0..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Region.php +++ /dev/null @@ -1,77 +0,0 @@ -$name) { - $params['Region.' . ($k+1)] = $name; - } - } elseif($region) { - $params['Region.1'] = $region; - } - - $response = $this->sendRequest($params); - - $xpath = $response->getXPath(); - $nodes = $xpath->query('//ec2:item'); - - $return = array(); - foreach ($nodes as $k => $node) { - $item = array(); - $item['regionName'] = $xpath->evaluate('string(ec2:regionName/text())', $node); - $item['regionUrl'] = $xpath->evaluate('string(ec2:regionUrl/text())', $node); - - $return[] = $item; - unset($item); - } - - return $return; - } -} diff --git a/library/Zend/Service/Amazon/Ec2/Response.php b/library/Zend/Service/Amazon/Ec2/Response.php deleted file mode 100644 index 50e94beed5..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Response.php +++ /dev/null @@ -1,164 +0,0 @@ -_httpResponse = $httpResponse; - } - - /** - * Gets the XPath object for this response - * - * @return DOMXPath the XPath object for response. - */ - public function getXPath() - { - if ($this->_xpath === null) { - $document = $this->getDocument(); - if ($document === false) { - $this->_xpath = false; - } else { - $this->_xpath = new DOMXPath($document); - $this->_xpath->registerNamespace('ec2', - $this->getNamespace()); - } - } - - return $this->_xpath; - } - - /** - * Gets the document object for this response - * - * @return DOMDocument the DOM Document for this response. - */ - public function getDocument() - { - try { - $body = $this->_httpResponse->getBody(); - } catch (Zend_Http_Exception $e) { - $body = false; - } - - if ($this->_document === null) { - if ($body !== false) { - // turn off libxml error handling - $errors = libxml_use_internal_errors(); - - $this->_document = new DOMDocument(); - $this->_document = Zend_Xml_Security::scan($body, $this->_document); - - // reset libxml error handling - libxml_clear_errors(); - libxml_use_internal_errors($errors); - } else { - $this->_document = false; - } - } - - return $this->_document; - } - - /** - * Return the current set XML Namespace. - * - * @return string - */ - public function getNamespace() - { - return $this->_xmlNamespace; - } - - /** - * Set a new XML Namespace - * - * @param string $namespace - */ - public function setNamespace($namespace) - { - $this->_xmlNamespace = $namespace; - } - -} diff --git a/library/Zend/Service/Amazon/Ec2/Securitygroups.php b/library/Zend/Service/Amazon/Ec2/Securitygroups.php deleted file mode 100644 index 90cc3478ca..0000000000 --- a/library/Zend/Service/Amazon/Ec2/Securitygroups.php +++ /dev/null @@ -1,301 +0,0 @@ -sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - return ($success === "true"); - } - - /** - * Returns information about security groups that you own. - * - * If you specify security group names, information about those security group is returned. - * Otherwise, information for all security group is returned. If you specify a group - * that does not exist, a fault is returned. - * - * @param string|array $name List of security groups to describe - * @return array - */ - public function describe($name = null) - { - $params = array(); - $params['Action'] = 'DescribeSecurityGroups'; - if(is_array($name) && !empty($name)) { - foreach($name as $k=>$name) { - $params['GroupName.' . ($k+1)] = $name; - } - } elseif($name) { - $params['GroupName.1'] = $name; - } - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - - $return = array(); - - $nodes = $xpath->query('//ec2:securityGroupInfo/ec2:item'); - - foreach($nodes as $node) { - $item = array(); - - $item['ownerId'] = $xpath->evaluate('string(ec2:ownerId/text())', $node); - $item['groupName'] = $xpath->evaluate('string(ec2:groupName/text())', $node); - $item['groupDescription'] = $xpath->evaluate('string(ec2:groupDescription/text())', $node); - - $ip_nodes = $xpath->query('ec2:ipPermissions/ec2:item', $node); - - foreach($ip_nodes as $ip_node) { - $sItem = array(); - - $sItem['ipProtocol'] = $xpath->evaluate('string(ec2:ipProtocol/text())', $ip_node); - $sItem['fromPort'] = $xpath->evaluate('string(ec2:fromPort/text())', $ip_node); - $sItem['toPort'] = $xpath->evaluate('string(ec2:toPort/text())', $ip_node); - - $ips = $xpath->query('ec2:ipRanges/ec2:item', $ip_node); - - $sItem['ipRanges'] = array(); - foreach($ips as $ip) { - $sItem['ipRanges'][] = $xpath->evaluate('string(ec2:cidrIp/text())', $ip); - } - - if(count($sItem['ipRanges']) == 1) { - $sItem['ipRanges'] = $sItem['ipRanges'][0]; - } - - $item['ipPermissions'][] = $sItem; - unset($ip_node, $sItem); - } - - $return[] = $item; - - unset($item, $node); - } - - - return $return; - } - - /** - * Deletes a security group. - * - * If you attempt to delete a security group that contains instances, a fault is returned. - * If you attempt to delete a security group that is referenced by another security group, - * a fault is returned. For example, if security group B has a rule that allows access - * from security group A, security group A cannot be deleted until the allow rule is removed. - * - * @param string $name Name of the security group to delete. - * @return boolean - */ - public function delete($name) - { - $params = array(); - $params['Action'] = 'DeleteSecurityGroup'; - $params['GroupName'] = $name; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - return ($success === "true"); - } - - /** - * Adds permissions to a security group - * - * Permissions are specified by the IP protocol (TCP, UDP or ICMP), the source of the request - * (by IP range or an Amazon EC2 user-group pair), the source and destination port ranges - * (for TCP and UDP), and the ICMP codes and types (for ICMP). When authorizing ICMP, -1 - * can be used as a wildcard in the type and code fields. - * - * Permission changes are propagated to instances within the security group as quickly as - * possible. However, depending on the number of instances, a small delay might occur. - * - * - * @param string $name Name of the group to modify. - * @param string $ipProtocol IP protocol to authorize access to when operating on a CIDR IP. - * @param integer $fromPort Bottom of port range to authorize access to when operating on a CIDR IP. - * This contains the ICMP type if ICMP is being authorized. - * @param integer $toPort Top of port range to authorize access to when operating on a CIDR IP. - * This contains the ICMP code if ICMP is being authorized. - * @param string $cidrIp CIDR IP range to authorize access to when operating on a CIDR IP. - * @return boolean - */ - public function authorizeIp($name, $ipProtocol, $fromPort, $toPort, $cidrIp) - { - $params = array(); - $params['Action'] = 'AuthorizeSecurityGroupIngress'; - $params['GroupName'] = $name; - $params['IpProtocol'] = $ipProtocol; - $params['FromPort'] = $fromPort; - $params['ToPort'] = $toPort; - $params['CidrIp'] = $cidrIp; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - return ($success === "true"); - - } - - /** - * Adds permissions to a security group - * - * When authorizing a user/group pair permission, GroupName, SourceSecurityGroupName and - * SourceSecurityGroupOwnerId must be specified. - * - * Permission changes are propagated to instances within the security group as quickly as - * possible. However, depending on the number of instances, a small delay might occur. - * - * @param string $name Name of the group to modify. - * @param string $groupName Name of security group to authorize access to when operating on a user/group pair. - * @param string $ownerId Owner of security group to authorize access to when operating on a user/group pair. - * @return boolean - */ - public function authorizeGroup($name, $groupName, $ownerId) - { - $params = array(); - $params['Action'] = 'AuthorizeSecurityGroupIngress'; - $params['GroupName'] = $name; - $params['SourceSecurityGroupName'] = $groupName; - $params['SourceSecurityGroupOwnerId'] = $ownerId; - - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - - return ($success === "true"); - } - - /** - * Revokes permissions from a security group. The permissions used to revoke must be specified - * using the same values used to grant the permissions. - * - * Permissions are specified by the IP protocol (TCP, UDP or ICMP), the source of the request - * (by IP range or an Amazon EC2 user-group pair), the source and destination port ranges - * (for TCP and UDP), and the ICMP codes and types (for ICMP). When authorizing ICMP, -1 - * can be used as a wildcard in the type and code fields. - * - * Permission changes are propagated to instances within the security group as quickly as - * possible. However, depending on the number of instances, a small delay might occur. - * - * - * @param string $name Name of the group to modify. - * @param string $ipProtocol IP protocol to revoke access to when operating on a CIDR IP. - * @param integer $fromPort Bottom of port range to revoke access to when operating on a CIDR IP. - * This contains the ICMP type if ICMP is being revoked. - * @param integer $toPort Top of port range to revoked access to when operating on a CIDR IP. - * This contains the ICMP code if ICMP is being revoked. - * @param string $cidrIp CIDR IP range to revoke access to when operating on a CIDR IP. - * @return boolean - */ - public function revokeIp($name, $ipProtocol, $fromPort, $toPort, $cidrIp) - { - $params = array(); - $params['Action'] = 'RevokeSecurityGroupIngress'; - $params['GroupName'] = $name; - $params['IpProtocol'] = $ipProtocol; - $params['FromPort'] = $fromPort; - $params['ToPort'] = $toPort; - $params['CidrIp'] = $cidrIp; - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - return ($success === "true"); - } - - /** - * Revokes permissions from a security group. The permissions used to revoke must be specified - * using the same values used to grant the permissions. - * - * Permission changes are propagated to instances within the security group as quickly as - * possible. However, depending on the number of instances, a small delay might occur. - * - * When revoking a user/group pair permission, GroupName, SourceSecurityGroupName and - * SourceSecurityGroupOwnerId must be specified. - * - * @param string $name Name of the group to modify. - * @param string $groupName Name of security group to revoke access to when operating on a user/group pair. - * @param string $ownerId Owner of security group to revoke access to when operating on a user/group pair. - * @return boolean - */ - public function revokeGroup($name, $groupName, $ownerId) - { - $params = array(); - $params['Action'] = 'RevokeSecurityGroupIngress'; - $params['GroupName'] = $name; - $params['SourceSecurityGroupName'] = $groupName; - $params['SourceSecurityGroupOwnerId'] = $ownerId; - - - $response = $this->sendRequest($params); - $xpath = $response->getXPath(); - $success = $xpath->evaluate('string(//ec2:return/text())'); - - - return ($success === "true"); - } -} diff --git a/library/Zend/Service/Amazon/EditorialReview.php b/library/Zend/Service/Amazon/EditorialReview.php deleted file mode 100644 index a9f48f655d..0000000000 --- a/library/Zend/Service/Amazon/EditorialReview.php +++ /dev/null @@ -1,58 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - foreach (array('Source', 'Content') as $el) { - $this->$el = (string) $xpath->query("./az:$el/text()", $dom)->item(0)->data; - } - } -} diff --git a/library/Zend/Service/Amazon/Exception.php b/library/Zend/Service/Amazon/Exception.php deleted file mode 100755 index 1236237121..0000000000 --- a/library/Zend/Service/Amazon/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - $this->Url = Zend_Uri::factory($xpath->query('./az:URL/text()', $dom)->item(0)->data); - $this->Height = (int) $xpath->query('./az:Height/text()', $dom)->item(0)->data; - $this->Width = (int) $xpath->query('./az:Width/text()', $dom)->item(0)->data; - } -} diff --git a/library/Zend/Service/Amazon/Item.php b/library/Zend/Service/Amazon/Item.php deleted file mode 100644 index d91a0a413a..0000000000 --- a/library/Zend/Service/Amazon/Item.php +++ /dev/null @@ -1,272 +0,0 @@ - element - * - * @param null|DOMElement $dom - * @return void - * @throws Zend_Service_Amazon_Exception - * - * @group ZF-9547 - */ - public function __construct($dom) - { - if (null === $dom) { - #require_once 'Zend/Service/Amazon/Exception.php'; - throw new Zend_Service_Amazon_Exception('Item element is empty'); - } - if (!$dom instanceof DOMElement) { - #require_once 'Zend/Service/Amazon/Exception.php'; - throw new Zend_Service_Amazon_Exception('Item is not a valid DOM element'); - } - $xpath = new DOMXPath($dom->ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - $this->ASIN = $xpath->query('./az:ASIN/text()', $dom)->item(0)->data; - - $result = $xpath->query('./az:DetailPageURL/text()', $dom); - if ($result->length == 1) { - $this->DetailPageURL = $result->item(0)->data; - } - - if ($xpath->query('./az:ItemAttributes/az:ListPrice', $dom)->length >= 1) { - $this->CurrencyCode = (string) $xpath->query('./az:ItemAttributes/az:ListPrice/az:CurrencyCode/text()', $dom)->item(0)->data; - $this->Amount = (int) $xpath->query('./az:ItemAttributes/az:ListPrice/az:Amount/text()', $dom)->item(0)->data; - $this->FormattedPrice = (string) $xpath->query('./az:ItemAttributes/az:ListPrice/az:FormattedPrice/text()', $dom)->item(0)->data; - } - - $result = $xpath->query('./az:ItemAttributes/az:*/text()', $dom); - if ($result->length >= 1) { - foreach ($result as $v) { - if (isset($this->{$v->parentNode->tagName})) { - if (is_array($this->{$v->parentNode->tagName})) { - array_push($this->{$v->parentNode->tagName}, (string) $v->data); - } else { - $this->{$v->parentNode->tagName} = array($this->{$v->parentNode->tagName}, (string) $v->data); - } - } else { - $this->{$v->parentNode->tagName} = (string) $v->data; - } - } - } - - foreach (array('SmallImage', 'MediumImage', 'LargeImage') as $im) { - $result = $xpath->query("./az:ImageSets/az:ImageSet[position() = 1]/az:$im", $dom); - if ($result->length == 1) { - /** - * @see Zend_Service_Amazon_Image - */ - #require_once 'Zend/Service/Amazon/Image.php'; - $this->$im = new Zend_Service_Amazon_Image($result->item(0)); - } - } - - $result = $xpath->query('./az:SalesRank/text()', $dom); - if ($result->length == 1) { - $this->SalesRank = (int) $result->item(0)->data; - } - - $result = $xpath->query('./az:CustomerReviews/az:Review', $dom); - if ($result->length >= 1) { - /** - * @see Zend_Service_Amazon_CustomerReview - */ - #require_once 'Zend/Service/Amazon/CustomerReview.php'; - foreach ($result as $review) { - $this->CustomerReviews[] = new Zend_Service_Amazon_CustomerReview($review); - } - $this->AverageRating = (float) $xpath->query('./az:CustomerReviews/az:AverageRating/text()', $dom)->item(0)->data; - $this->TotalReviews = (int) $xpath->query('./az:CustomerReviews/az:TotalReviews/text()', $dom)->item(0)->data; - } - - $result = $xpath->query('./az:EditorialReviews/az:*', $dom); - if ($result->length >= 1) { - /** - * @see Zend_Service_Amazon_EditorialReview - */ - #require_once 'Zend/Service/Amazon/EditorialReview.php'; - foreach ($result as $r) { - $this->EditorialReviews[] = new Zend_Service_Amazon_EditorialReview($r); - } - } - - $result = $xpath->query('./az:SimilarProducts/az:*', $dom); - if ($result->length >= 1) { - /** - * @see Zend_Service_Amazon_SimilarProduct - */ - #require_once 'Zend/Service/Amazon/SimilarProduct.php'; - foreach ($result as $r) { - $this->SimilarProducts[] = new Zend_Service_Amazon_SimilarProduct($r); - } - } - - $result = $xpath->query('./az:ListmaniaLists/*', $dom); - if ($result->length >= 1) { - /** - * @see Zend_Service_Amazon_ListmaniaList - */ - #require_once 'Zend/Service/Amazon/ListmaniaList.php'; - foreach ($result as $r) { - $this->ListmaniaLists[] = new Zend_Service_Amazon_ListmaniaList($r); - } - } - - $result = $xpath->query('./az:Tracks/az:Disc', $dom); - if ($result->length > 1) { - foreach ($result as $disk) { - foreach ($xpath->query('./*/text()', $disk) as $t) { - // TODO: For consistency in a bugfix all tracks are appended to one single array - // Erroreous line: $this->Tracks[$disk->getAttribute('number')] = (string) $t->data; - $this->Tracks[] = (string) $t->data; - } - } - } else if ($result->length == 1) { - foreach ($xpath->query('./*/text()', $result->item(0)) as $t) { - $this->Tracks[] = (string) $t->data; - } - } - - $result = $xpath->query('./az:Offers', $dom); - $resultSummary = $xpath->query('./az:OfferSummary', $dom); - if ($result->length > 1 || $resultSummary->length == 1) { - /** - * @see Zend_Service_Amazon_OfferSet - */ - #require_once 'Zend/Service/Amazon/OfferSet.php'; - $this->Offers = new Zend_Service_Amazon_OfferSet($dom); - } - - $result = $xpath->query('./az:Accessories/*', $dom); - if ($result->length > 1) { - /** - * @see Zend_Service_Amazon_Accessories - */ - #require_once 'Zend/Service/Amazon/Accessories.php'; - foreach ($result as $r) { - $this->Accessories[] = new Zend_Service_Amazon_Accessories($r); - } - } - - $this->_dom = $dom; - } - - - /** - * Returns the item's original XML - * - * @return string - */ - public function asXml() - { - return $this->_dom->ownerDocument->saveXML($this->_dom); - } -} diff --git a/library/Zend/Service/Amazon/ListmaniaList.php b/library/Zend/Service/Amazon/ListmaniaList.php deleted file mode 100644 index cd9376403d..0000000000 --- a/library/Zend/Service/Amazon/ListmaniaList.php +++ /dev/null @@ -1,58 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - foreach (array('ListId', 'ListName') as $el) { - $this->$el = (string) $xpath->query("./az:$el/text()", $dom)->item(0)->data; - } - } -} diff --git a/library/Zend/Service/Amazon/Offer.php b/library/Zend/Service/Amazon/Offer.php deleted file mode 100644 index 09927d6e2a..0000000000 --- a/library/Zend/Service/Amazon/Offer.php +++ /dev/null @@ -1,111 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - $this->MerchantId = (string) $xpath->query('./az:Merchant/az:MerchantId/text()', $dom)->item(0)->data; - $name = $xpath->query('./az:Merchant/az:Name/text()', $dom); - if ($name->length == 1) { - $this->MerchantName = (string) $name->item(0)->data; - } - $this->GlancePage = (string) $xpath->query('./az:Merchant/az:GlancePage/text()', $dom)->item(0)->data; - $this->Condition = (string) $xpath->query('./az:OfferAttributes/az:Condition/text()', $dom)->item(0)->data; - $this->OfferListingId = (string) $xpath->query('./az:OfferListing/az:OfferListingId/text()', $dom)->item(0)->data; - $Price = $xpath->query('./az:OfferListing/az:Price/az:Amount', $dom); - if ($Price->length == 1) { - $this->Price = (int) $xpath->query('./az:OfferListing/az:Price/az:Amount/text()', $dom)->item(0)->data; - $this->CurrencyCode = (string) $xpath->query('./az:OfferListing/az:Price/az:CurrencyCode/text()', $dom)->item(0)->data; - } - $availability = $xpath->query('./az:OfferListing/az:Availability/text()', $dom)->item(0); - if($availability instanceof DOMText) { - $this->Availability = (string) $availability->data; - } - $result = $xpath->query('./az:OfferListing/az:IsEligibleForSuperSaverShipping/text()', $dom); - if ($result->length >= 1) { - $this->IsEligibleForSuperSaverShipping = (bool) $result->item(0)->data; - } - } -} diff --git a/library/Zend/Service/Amazon/OfferSet.php b/library/Zend/Service/Amazon/OfferSet.php deleted file mode 100644 index 37f4fe6adf..0000000000 --- a/library/Zend/Service/Amazon/OfferSet.php +++ /dev/null @@ -1,118 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - - $offer = $xpath->query('./az:OfferSummary', $dom); - if ($offer->length == 1) { - $lowestNewPrice = $xpath->query('./az:OfferSummary/az:LowestNewPrice/az:Amount', $dom); - if ($lowestNewPrice->length == 1) { - $this->LowestNewPrice = (int) $xpath->query('./az:OfferSummary/az:LowestNewPrice/az:Amount/text()', $dom)->item(0)->data; - $this->LowestNewPriceCurrency = (string) $xpath->query('./az:OfferSummary/az:LowestNewPrice/az:CurrencyCode/text()', $dom)->item(0)->data; - } - $lowestUsedPrice = $xpath->query('./az:OfferSummary/az:LowestUsedPrice/az:Amount', $dom); - if ($lowestUsedPrice->length == 1) { - $this->LowestUsedPrice = (int) $xpath->query('./az:OfferSummary/az:LowestUsedPrice/az:Amount/text()', $dom)->item(0)->data; - $this->LowestUsedPriceCurrency = (string) $xpath->query('./az:OfferSummary/az:LowestUsedPrice/az:CurrencyCode/text()', $dom)->item(0)->data; - } - $this->TotalNew = (int) $xpath->query('./az:OfferSummary/az:TotalNew/text()', $dom)->item(0)->data; - $this->TotalUsed = (int) $xpath->query('./az:OfferSummary/az:TotalUsed/text()', $dom)->item(0)->data; - $this->TotalCollectible = (int) $xpath->query('./az:OfferSummary/az:TotalCollectible/text()', $dom)->item(0)->data; - $this->TotalRefurbished = (int) $xpath->query('./az:OfferSummary/az:TotalRefurbished/text()', $dom)->item(0)->data; - } - $offers = $xpath->query('./az:Offers/az:Offer', $dom); - if ($offers->length >= 1) { - /** - * @see Zend_Service_Amazon_Offer - */ - #require_once 'Zend/Service/Amazon/Offer.php'; - foreach ($offers as $offer) { - $this->Offers[] = new Zend_Service_Amazon_Offer($offer); - } - } - } -} diff --git a/library/Zend/Service/Amazon/Query.php b/library/Zend/Service/Amazon/Query.php deleted file mode 100644 index dbd25dfd52..0000000000 --- a/library/Zend/Service/Amazon/Query.php +++ /dev/null @@ -1,98 +0,0 @@ -_searchIndex = 'asin'; - $this->_search['ItemId'] = $args[0]; - return $this; - } - - if (strtolower($method) === 'category') { - $this->_searchIndex = $args[0]; - $this->_search['SearchIndex'] = $args[0]; - } else if (isset($this->_search['SearchIndex']) || $this->_searchIndex !== null || $this->_searchIndex === 'asin') { - $this->_search[$method] = $args[0]; - } else { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('You must set a category before setting the search parameters'); - } - - return $this; - } - - /** - * Search using the prepared query - * - * @return Zend_Service_Amazon_Item|Zend_Service_Amazon_ResultSet - */ - public function search() - { - if ($this->_searchIndex === 'asin') { - return $this->itemLookup($this->_search['ItemId'], $this->_search); - } - return $this->itemSearch($this->_search); - } -} diff --git a/library/Zend/Service/Amazon/ResultSet.php b/library/Zend/Service/Amazon/ResultSet.php deleted file mode 100644 index acda306002..0000000000 --- a/library/Zend/Service/Amazon/ResultSet.php +++ /dev/null @@ -1,170 +0,0 @@ - elements - * - * @var DOMNodeList - */ - protected $_results = null; - - /** - * Amazon Web Service Return Document - * - * @var DOMDocument - */ - protected $_dom; - - /** - * XPath Object for $this->_dom - * - * @var DOMXPath - */ - protected $_xpath; - - /** - * Current index for SeekableIterator - * - * @var int - */ - protected $_currentIndex = 0; - - /** - * Create an instance of Zend_Service_Amazon_ResultSet and create the necessary data objects - * - * @param DOMDocument $dom - * @return void - */ - public function __construct(DOMDocument $dom) - { - $this->_dom = $dom; - $this->_xpath = new DOMXPath($dom); - $this->_xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - $this->_results = $this->_xpath->query('//az:Item'); - } - - /** - * Total Number of results returned - * - * @return int Total number of results returned - */ - public function totalResults() - { - $result = $this->_xpath->query('//az:TotalResults/text()'); - return (int) $result->item(0)->data; - } - - /** - * Total Number of pages returned - * - * @return int Total number of pages returned - */ - public function totalPages() - { - $result = $this->_xpath->query('//az:TotalPages/text()'); - return (int) $result->item(0)->data; - } - - /** - * Implement SeekableIterator::current() - * - * @return Zend_Service_Amazon_Item - */ - public function current() - { - return new Zend_Service_Amazon_Item($this->_results->item($this->_currentIndex)); - } - - /** - * Implement SeekableIterator::key() - * - * @return int - */ - public function key() - { - return $this->_currentIndex; - } - - /** - * Implement SeekableIterator::next() - * - * @return void - */ - public function next() - { - $this->_currentIndex += 1; - } - - /** - * Implement SeekableIterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->_currentIndex = 0; - } - - /** - * Implement SeekableIterator::seek() - * - * @param int $index - * @throws OutOfBoundsException - * @return void - */ - public function seek($index) - { - $indexInt = (int) $index; - if ($indexInt >= 0 && (null === $this->_results || $indexInt < $this->_results->length)) { - $this->_currentIndex = $indexInt; - } else { - throw new OutOfBoundsException("Illegal index '$index'"); - } - } - - /** - * Implement SeekableIterator::valid() - * - * @return boolean - */ - public function valid() - { - return null !== $this->_results && $this->_currentIndex < $this->_results->length; - } -} diff --git a/library/Zend/Service/Amazon/S3.php b/library/Zend/Service/Amazon/S3.php deleted file mode 100755 index 04fb0f4aa1..0000000000 --- a/library/Zend/Service/Amazon/S3.php +++ /dev/null @@ -1,1015 +0,0 @@ -valid()) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception('Invalid endpoint supplied'); - } - $this->_endpoint = $endpoint; - return $this; - } - - /** - * Get current S3 endpoint - * - * @return Zend_Uri_Http - */ - public function getEndpoint() - { - return $this->_endpoint; - } - - /** - * Constructor - * - * @param string $accessKey - * @param string $secretKey - * @param string $region - */ - public function __construct($accessKey=null, $secretKey=null, $region=null) - { - parent::__construct($accessKey, $secretKey, $region); - - $this->setEndpoint('http://'.self::S3_ENDPOINT); - } - - /** - * Verify if the bucket name is valid - * - * @param string $bucket - * @return boolean - */ - public function _validBucketName($bucket) - { - $len = strlen($bucket); - if ($len < 3 || $len > 255) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Bucket name \"$bucket\" must be between 3 and 255 characters long"); - } - - if (preg_match('/[^a-z0-9\._-]/', $bucket)) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Bucket name \"$bucket\" contains invalid characters"); - } - - if (preg_match('/(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}/', $bucket)) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Bucket name \"$bucket\" cannot be an IP address"); - } - return true; - } - - /** - * Add a new bucket - * - * @param string $bucket - * @return boolean - */ - public function createBucket($bucket, $location = null) - { - $this->_validBucketName($bucket); - $headers=array(); - if($location) { - $data = ''.$location.''; - $headers[self::S3_CONTENT_TYPE_HEADER]= 'text/plain'; - $headers['Content-size']= strlen($data); - } else { - $data = null; - } - $response = $this->_makeRequest('PUT', $bucket, null, $headers, $data); - - return ($response->getStatus() == 200); - } - - /** - * Checks if a given bucket name is available - * - * @param string $bucket - * @return boolean - */ - public function isBucketAvailable($bucket) - { - $response = $this->_makeRequest('HEAD', $bucket, array('max-keys'=>0)); - - return ($response->getStatus() != 404); - } - - /** - * Checks if a given object exists - * - * @param string $object - * @return boolean - */ - public function isObjectAvailable($object) - { - $object = $this->_fixupObjectName($object); - $response = $this->_makeRequest('HEAD', $object); - - return ($response->getStatus() == 200); - } - - /** - * Remove a given bucket. All objects in the bucket must be removed prior - * to removing the bucket. - * - * @param string $bucket - * @return boolean - */ - public function removeBucket($bucket) - { - $response = $this->_makeRequest('DELETE', $bucket); - - // Look for a 204 No Content response - return ($response->getStatus() == 204); - } - - /** - * Get metadata information for a given object - * - * @param string $object - * @return array|false - */ - public function getInfo($object) - { - $info = array(); - - $object = $this->_fixupObjectName($object); - $response = $this->_makeRequest('HEAD', $object); - - if ($response->getStatus() == 200) { - $info['type'] = $response->getHeader('Content-type'); - $info['size'] = $response->getHeader('Content-length'); - $info['mtime'] = strtotime($response->getHeader('Last-modified')); - $info['etag'] = $response->getHeader('ETag'); - } - else { - return false; - } - - return $info; - } - - /** - * List the S3 buckets - * - * @return array|false - */ - public function getBuckets() - { - $response = $this->_makeRequest('GET'); - - if ($response->getStatus() != 200) { - return false; - } - - $xml = new SimpleXMLElement($response->getBody()); - - $buckets = array(); - foreach ($xml->Buckets->Bucket as $bucket) { - $buckets[] = (string)$bucket->Name; - } - - return $buckets; - } - - /** - * Remove all objects in the bucket. - * - * @param string $bucket - * @return boolean - */ - public function cleanBucket($bucket) - { - $objects = $this->getObjectsByBucket($bucket); - if (!$objects) { - return false; - } - - while (!empty($objects)) { - foreach ($objects as $object) { - $this->removeObject("$bucket/$object"); - } - $params= array ( - 'marker' => $objects[count($objects)-1] - ); - $objects = $this->getObjectsByBucket($bucket,$params); - } - - return true; - } - - /** - * List the objects in a bucket. - * - * Provides the list of object keys that are contained in the bucket. Valid params include the following. - * prefix - Limits the response to keys which begin with the indicated prefix. You can use prefixes to separate a bucket into different sets of keys in a way similar to how a file system uses folders. - * marker - Indicates where in the bucket to begin listing. The list will only include keys that occur lexicographically after marker. This is convenient for pagination: To get the next page of results use the last key of the current page as the marker. - * max-keys - The maximum number of keys you'd like to see in the response body. The server might return fewer than this many keys, but will not return more. - * delimiter - Causes keys that contain the same string between the prefix and the first occurrence of the delimiter to be rolled up into a single result element in the CommonPrefixes collection. These rolled-up keys are not returned elsewhere in the response. - * - * @param string $bucket - * @param array $params S3 GET Bucket Paramater - * @return array|false - */ - public function getObjectsByBucket($bucket, $params = array()) - { - $response = $this->_makeRequest('GET', $bucket, $params); - - if ($response->getStatus() != 200) { - return false; - } - - $xml = new SimpleXMLElement($response->getBody()); - - $objects = array(); - if (isset($xml->Contents)) { - foreach ($xml->Contents as $contents) { - foreach ($contents->Key as $object) { - $objects[] = (string)$object; - } - } - } - - return $objects; - } - /** - * List the objects and common prefixes in a bucket. - * - * Provides the list of object keys and common prefixes that are contained in the bucket. Valid params include the following. - * prefix - Limits the response to keys which begin with the indicated prefix. You can use prefixes to separate a bucket into different sets of keys in a way similar to how a file system uses folders. - * marker - Indicates where in the bucket to begin listing. The list will only include keys that occur lexicographically after marker. This is convenient for pagination: To get the next page of results use the last key of the current page as the marker. - * max-keys - The maximum number of keys you'd like to see in the response body. The server might return fewer than this many keys, but will not return more. - * delimiter - Causes keys that contain the same string between the prefix and the first occurrence of the delimiter to be rolled up into a single result element in the CommonPrefixes collection. These rolled-up keys are not returned elsewhere in the response. - * - * @see ZF-11401 - * @param string $bucket - * @param array $params S3 GET Bucket Paramater - * @return array|false - */ - public function getObjectsAndPrefixesByBucket($bucket, $params = array()) - { - $response = $this->_makeRequest('GET', $bucket, $params); - - if ($response->getStatus() != 200) { - return false; - } - - $xml = new SimpleXMLElement($response->getBody()); - - $objects = array(); - if (isset($xml->Contents)) { - foreach ($xml->Contents as $contents) { - foreach ($contents->Key as $object) { - $objects[] = (string)$object; - } - } - } - $prefixes = array(); - if (isset($xml->CommonPrefixes)) { - foreach ($xml->CommonPrefixes as $prefix) { - foreach ($prefix->Prefix as $object) { - $prefixes[] = (string)$object; - } - } - } - - return array( - 'objects' => $objects, - 'prefixes' => $prefixes - ); - } - /** - * Make sure the object name is valid - * - * @param string $object - * @return string - */ - protected function _fixupObjectName($object) - { - $nameparts = explode('/', $object); - - $this->_validBucketName($nameparts[0]); - - $firstpart = array_shift($nameparts); - if (count($nameparts) == 0) { - return $firstpart; - } - - return $firstpart.'/'.join('/', array_map('rawurlencode', $nameparts)); - } - - /** - * Get an object - * - * @param string $object - * @param bool $paidobject This is "requestor pays" object - * @return string|false - */ - public function getObject($object, $paidobject=false) - { - $object = $this->_fixupObjectName($object); - if ($paidobject) { - $response = $this->_makeRequest('GET', $object, null, array(self::S3_REQUESTPAY_HEADER => 'requester')); - } - else { - $response = $this->_makeRequest('GET', $object); - } - - if ($response->getStatus() != 200) { - return false; - } - - return $response->getBody(); - } - - /** - * Get an object using streaming - * - * Can use either provided filename for storage or create a temp file if none provided. - * - * @param string $object Object path - * @param string $streamfile File to write the stream to - * @param bool $paidobject This is "requestor pays" object - * @return Zend_Http_Response_Stream|false - */ - public function getObjectStream($object, $streamfile = null, $paidobject=false) - { - $object = $this->_fixupObjectName($object); - self::getHttpClient()->setStream($streamfile?$streamfile:true); - if ($paidobject) { - $response = $this->_makeRequest('GET', $object, null, array(self::S3_REQUESTPAY_HEADER => 'requester')); - } - else { - $response = $this->_makeRequest('GET', $object); - } - self::getHttpClient()->setStream(null); - - if ($response->getStatus() != 200 || !($response instanceof Zend_Http_Response_Stream)) { - return false; - } - - return $response; - } - - /** - * Upload an object by a PHP string - * - * @param string $object Object name - * @param string|resource $data Object data (can be string or stream) - * @param array $meta Metadata - * @return boolean - */ - public function putObject($object, $data, $meta=null) - { - $object = $this->_fixupObjectName($object); - $headers = (is_array($meta)) ? $meta : array(); - - if(!is_resource($data)) { - $headers['Content-MD5'] = base64_encode(md5($data, true)); - } - $headers['Expect'] = '100-continue'; - - if (!isset($headers[self::S3_CONTENT_TYPE_HEADER])) { - $headers[self::S3_CONTENT_TYPE_HEADER] = self::getMimeType($object); - } - - $response = $this->_makeRequest('PUT', $object, null, $headers, $data); - - // Check the MD5 Etag returned by S3 against and MD5 of the buffer - if ($response->getStatus() == 200) { - // It is escaped by double quotes for some reason - $etag = str_replace('"', '', $response->getHeader('Etag')); - - if (is_resource($data) || $etag == md5($data)) { - return true; - } - } - - return false; - } - - /** - * Put file to S3 as object - * - * @param string $path File name - * @param string $object Object name - * @param array $meta Metadata - * @return boolean - */ - public function putFile($path, $object, $meta=null) - { - $data = @file_get_contents($path); - if ($data === false) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Cannot read file $path"); - } - - if (!is_array($meta)) { - $meta = array(); - } - - if (!isset($meta[self::S3_CONTENT_TYPE_HEADER])) { - $meta[self::S3_CONTENT_TYPE_HEADER] = self::getMimeType($path); - } - - return $this->putObject($object, $data, $meta); - } - - /** - * Put file to S3 as object, using streaming - * - * @param string $path File name - * @param string $object Object name - * @param array $meta Metadata - * @return boolean - */ - public function putFileStream($path, $object, $meta=null) - { - $data = @fopen($path, "rb"); - if ($data === false) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Cannot open file $path"); - } - - if (!is_array($meta)) { - $meta = array(); - } - - if (!isset($meta[self::S3_CONTENT_TYPE_HEADER])) { - $meta[self::S3_CONTENT_TYPE_HEADER] = self::getMimeType($path); - } - - if(!isset($meta['Content-MD5'])) { - $meta['Content-MD5'] = base64_encode(md5_file($path, true)); - } - - return $this->putObject($object, $data, $meta); - } - - /** - * Remove a given object - * - * @param string $object - * @return boolean - */ - public function removeObject($object) - { - $object = $this->_fixupObjectName($object); - $response = $this->_makeRequest('DELETE', $object); - - // Look for a 204 No Content response - return ($response->getStatus() == 204); - } - - /** - * Copy an object - * - * @param string $sourceObject Source object name - * @param string $destObject Destination object name - * @param array $meta (OPTIONAL) Metadata to apply to desination object. - * Set to null to copy metadata from source object. - * @return boolean - */ - public function copyObject($sourceObject, $destObject, $meta = null) - { - $sourceObject = $this->_fixupObjectName($sourceObject); - $destObject = $this->_fixupObjectName($destObject); - - $headers = (is_array($meta)) ? $meta : array(); - $headers['x-amz-copy-source'] = $sourceObject; - $headers['x-amz-metadata-directive'] = $meta === null ? 'COPY' : 'REPLACE'; - - $response = $this->_makeRequest('PUT', $destObject, null, $headers); - - if ($response->getStatus() == 200 && !stristr($response->getBody(), '')) { - return true; - } - - return false; - } - - /** - * Move an object - * - * Performs a copy to dest + verify + remove source - * - * @param string $sourceObject Source object name - * @param string $destObject Destination object name - * @param array $meta (OPTIONAL) Metadata to apply to destination object. - * Set to null to retain existing metadata. - */ - public function moveObject($sourceObject, $destObject, $meta = null) - { - $sourceInfo = $this->getInfo($sourceObject); - - $this->copyObject($sourceObject, $destObject, $meta); - $destInfo = $this->getInfo($destObject); - - if ($sourceInfo['etag'] === $destInfo['etag']) { - return $this->removeObject($sourceObject); - } else { - return false; - } - } - - /** - * Make a request to Amazon S3 - * - * @param string $method Request method - * @param string $path Path to requested object - * @param array $params Request parameters - * @param array $headers HTTP headers - * @param string|resource $data Request data - * @return Zend_Http_Response - */ - public function _makeRequest($method, $path='', $params=null, $headers=array(), $data=null) - { - $retry_count = 0; - - if (!is_array($headers)) { - $headers = array($headers); - } - - $headers['Date'] = gmdate(DATE_RFC1123, time()); - - if(is_resource($data) && $method != 'PUT') { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Only PUT request supports stream data"); - } - - // build the end point out - $parts = explode('/', $path, 2); - $endpoint = clone($this->_endpoint); - if ($parts[0]) { - // prepend bucket name to the hostname - $endpoint->setHost($parts[0].'.'.$endpoint->getHost()); - } - if (!empty($parts[1])) { - // ZF-10218, ZF-10122 - $pathparts = explode('?',$parts[1]); - $endpath = $pathparts[0]; - $endpoint->setPath('/'.$endpath); - - } - else { - $endpoint->setPath('/'); - if ($parts[0]) { - $path = $parts[0].'/'; - } - } - self::addSignature($method, $path, $headers); - - $client = self::getHttpClient(); - - $client->resetParameters(true); - $client->setUri($endpoint); - $client->setAuth(false); - // Work around buglet in HTTP client - it doesn't clean headers - // Remove when ZHC is fixed - /* - $client->setHeaders(array('Content-MD5' => null, - 'Content-Encoding' => null, - 'Expect' => null, - 'Range' => null, - 'x-amz-acl' => null, - 'x-amz-copy-source' => null, - 'x-amz-metadata-directive' => null)); - */ - $client->setHeaders($headers); - - if (is_array($params)) { - foreach ($params as $name=>$value) { - $client->setParameterGet($name, $value); - } - } - - if (($method == 'PUT') && ($data !== null)) { - if (!isset($headers['Content-type'])) { - $headers['Content-type'] = self::getMimeType($path); - } - $client->setRawData($data, $headers['Content-type']); - } - do { - $retry = false; - - $response = $client->request($method); - $response_code = $response->getStatus(); - - // Some 5xx errors are expected, so retry automatically - if ($response_code >= 500 && $response_code < 600 && $retry_count <= 5) { - $retry = true; - $retry_count++; - sleep($retry_count / 4 * $retry_count); - } - else if ($response_code == 307) { - // Need to redirect, new S3 endpoint given - // This should never happen as Zend_Http_Client will redirect automatically - } - else if ($response_code == 100) { - // echo 'OK to Continue'; - } - } while ($retry); - - return $response; - } - - /** - * Add the S3 Authorization signature to the request headers - * - * @param string $method - * @param string $path - * @param array &$headers - * @return string - */ - protected function addSignature($method, $path, &$headers) - { - if (!is_array($headers)) { - $headers = array($headers); - } - - $type = $md5 = $date = ''; - - // Search for the Content-type, Content-MD5 and Date headers - foreach ($headers as $key=>$val) { - if (strcasecmp($key, 'content-type') == 0) { - $type = $val; - } - else if (strcasecmp($key, 'content-md5') == 0) { - $md5 = $val; - } - else if (strcasecmp($key, 'date') == 0) { - $date = $val; - } - } - - // If we have an x-amz-date header, use that instead of the normal Date - if (isset($headers['x-amz-date']) && isset($date)) { - $date = ''; - } - - $sig_str = "$method\n$md5\n$type\n$date\n"; - // For x-amz- headers, combine like keys, lowercase them, sort them - // alphabetically and remove excess spaces around values - $amz_headers = array(); - foreach ($headers as $key=>$val) { - $key = strtolower($key); - if (substr($key, 0, 6) == 'x-amz-') { - if (is_array($val)) { - $amz_headers[$key] = $val; - } - else { - $amz_headers[$key][] = preg_replace('/\s+/', ' ', $val); - } - } - } - if (!empty($amz_headers)) { - ksort($amz_headers); - foreach ($amz_headers as $key=>$val) { - $sig_str .= $key.':'.implode(',', $val)."\n"; - } - } - - $sig_str .= '/'.parse_url($path, PHP_URL_PATH); - if (strpos($path, '?location') !== false) { - $sig_str .= '?location'; - } - else if (strpos($path, '?acl') !== false) { - $sig_str .= '?acl'; - } - else if (strpos($path, '?torrent') !== false) { - $sig_str .= '?torrent'; - } - else if (strpos($path, '?versions') !== false) { - $sig_str .= '?versions'; - } - - $signature = base64_encode(Zend_Crypt_Hmac::compute($this->_getSecretKey(), 'sha1', utf8_encode($sig_str), Zend_Crypt_Hmac::BINARY)); - $headers['Authorization'] = 'AWS '.$this->_getAccessKey().':'.$signature; - - return $sig_str; - } - - /** - * Attempt to get the content-type of a file based on the extension - * - * @param string $path - * @return string - */ - public static function getMimeType($path) - { - $ext = substr(strrchr($path, '.'), 1); - - if(!$ext) { - // shortcut - return 'binary/octet-stream'; - } - - switch (strtolower($ext)) { - case 'xls': - $content_type = 'application/excel'; - break; - case 'hqx': - $content_type = 'application/macbinhex40'; - break; - case 'doc': - case 'dot': - case 'wrd': - $content_type = 'application/msword'; - break; - case 'pdf': - $content_type = 'application/pdf'; - break; - case 'pgp': - $content_type = 'application/pgp'; - break; - case 'ps': - case 'eps': - case 'ai': - $content_type = 'application/postscript'; - break; - case 'ppt': - $content_type = 'application/powerpoint'; - break; - case 'rtf': - $content_type = 'application/rtf'; - break; - case 'tgz': - case 'gtar': - $content_type = 'application/x-gtar'; - break; - case 'gz': - $content_type = 'application/x-gzip'; - break; - case 'php': - case 'php3': - case 'php4': - $content_type = 'application/x-httpd-php'; - break; - case 'js': - $content_type = 'application/x-javascript'; - break; - case 'ppd': - case 'psd': - $content_type = 'application/x-photoshop'; - break; - case 'swf': - case 'swc': - case 'rf': - $content_type = 'application/x-shockwave-flash'; - break; - case 'tar': - $content_type = 'application/x-tar'; - break; - case 'zip': - $content_type = 'application/zip'; - break; - case 'mid': - case 'midi': - case 'kar': - $content_type = 'audio/midi'; - break; - case 'mp2': - case 'mp3': - case 'mpga': - $content_type = 'audio/mpeg'; - break; - case 'ra': - $content_type = 'audio/x-realaudio'; - break; - case 'wav': - $content_type = 'audio/wav'; - break; - case 'bmp': - $content_type = 'image/bitmap'; - break; - case 'gif': - $content_type = 'image/gif'; - break; - case 'iff': - $content_type = 'image/iff'; - break; - case 'jb2': - $content_type = 'image/jb2'; - break; - case 'jpg': - case 'jpe': - case 'jpeg': - $content_type = 'image/jpeg'; - break; - case 'jpx': - $content_type = 'image/jpx'; - break; - case 'png': - $content_type = 'image/png'; - break; - case 'tif': - case 'tiff': - $content_type = 'image/tiff'; - break; - case 'wbmp': - $content_type = 'image/vnd.wap.wbmp'; - break; - case 'xbm': - $content_type = 'image/xbm'; - break; - case 'css': - $content_type = 'text/css'; - break; - case 'txt': - $content_type = 'text/plain'; - break; - case 'htm': - case 'html': - $content_type = 'text/html'; - break; - case 'xml': - $content_type = 'text/xml'; - break; - case 'xsl': - $content_type = 'text/xsl'; - break; - case 'mpg': - case 'mpe': - case 'mpeg': - $content_type = 'video/mpeg'; - break; - case 'qt': - case 'mov': - $content_type = 'video/quicktime'; - break; - case 'avi': - $content_type = 'video/x-ms-video'; - break; - case 'eml': - $content_type = 'message/rfc822'; - break; - default: - $content_type = 'binary/octet-stream'; - break; - } - - return $content_type; - } - - /** - * Register this object as stream wrapper client - * - * @param string $name - * @return Zend_Service_Amazon_S3 - */ - public function registerAsClient($name) - { - self::$_wrapperClients[$name] = $this; - return $this; - } - - /** - * Unregister this object as stream wrapper client - * - * @param string $name - * @return Zend_Service_Amazon_S3 - */ - public function unregisterAsClient($name) - { - unset(self::$_wrapperClients[$name]); - return $this; - } - - /** - * Get wrapper client for stream type - * - * @param string $name - * @return Zend_Service_Amazon_S3 - */ - public static function getWrapperClient($name) - { - return self::$_wrapperClients[$name]; - } - - /** - * Register this object as stream wrapper - * - * @param string $name - * @return Zend_Service_Amazon_S3 - */ - public function registerStreamWrapper($name='s3') - { - /** - * @see Zend_Service_Amazon_S3_Stream - */ - #require_once 'Zend/Service/Amazon/S3/Stream.php'; - - stream_register_wrapper($name, 'Zend_Service_Amazon_S3_Stream'); - $this->registerAsClient($name); - } - - /** - * Unregister this object as stream wrapper - * - * @param string $name - * @return Zend_Service_Amazon_S3 - */ - public function unregisterStreamWrapper($name='s3') - { - stream_wrapper_unregister($name); - $this->unregisterAsClient($name); - } -} diff --git a/library/Zend/Service/Amazon/S3/Exception.php b/library/Zend/Service/Amazon/S3/Exception.php deleted file mode 100755 index bb6ec82c81..0000000000 --- a/library/Zend/Service/Amazon/S3/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -_s3 === null) { - $url = explode(':', $path); - - if (!$url) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Unable to parse URL $path"); - } - - $this->_s3 = Zend_Service_Amazon_S3::getWrapperClient($url[0]); - if (!$this->_s3) { - /** - * @see Zend_Service_Amazon_S3_Exception - */ - #require_once 'Zend/Service/Amazon/S3/Exception.php'; - throw new Zend_Service_Amazon_S3_Exception("Unknown client for wrapper {$url[0]}"); - } - } - - return $this->_s3; - } - - /** - * Extract object name from URL - * - * @param string $path - * @return string - */ - protected function _getNamePart($path) - { - $url = parse_url($path); - if ($url['host']) { - return !empty($url['path']) ? $url['host'].$url['path'] : $url['host']; - } - - return ''; - } - /** - * Open the stream - * - * @param string $path - * @param string $mode - * @param integer $options - * @param string $opened_path - * @return boolean - */ - public function stream_open($path, $mode, $options, $opened_path) - { - $name = $this->_getNamePart($path); - // If we open the file for writing, just return true. Create the object - // on fflush call - if (strpbrk($mode, 'wax')) { - $this->_objectName = $name; - $this->_objectBuffer = null; - $this->_objectSize = 0; - $this->_position = 0; - $this->_writeBuffer = true; - $this->_getS3Client($path); - return true; - } else { - // Otherwise, just see if the file exists or not - $info = $this->_getS3Client($path)->getInfo($name); - if ($info) { - $this->_objectName = $name; - $this->_objectBuffer = null; - $this->_objectSize = $info['size']; - $this->_position = 0; - $this->_writeBuffer = false; - $this->_getS3Client($path); - return true; - } - } - return false; - } - - /** - * Close the stream - * - * @return void - */ - public function stream_close() - { - $this->_objectName = null; - $this->_objectBuffer = null; - $this->_objectSize = 0; - $this->_position = 0; - $this->_writeBuffer = false; - unset($this->_s3); - } - - /** - * Read from the stream - * - * http://bugs.php.net/21641 - stream_read() is always passed PHP's - * internal read buffer size (8192) no matter what is passed as $count - * parameter to fread(). - * - * @param integer $count - * @return string - */ - public function stream_read($count) - { - if (!$this->_objectName) { - return false; - } - - // make sure that count doesn't exceed object size - if ($count + $this->_position > $this->_objectSize) { - $count = $this->_objectSize - $this->_position; - } - - $range_start = $this->_position; - $range_end = $this->_position + $count - 1; - - // Only fetch more data from S3 if we haven't fetched any data yet (postion=0) - // OR, the range end position plus 1 is greater than the size of the current - // object buffer - if ($this->_objectBuffer === null || $range_end >= strlen($this->_objectBuffer)) { - $headers = array( - 'Range' => "bytes=$range_start-$range_end" - ); - - $response = $this->_s3->_makeRequest('GET', $this->_objectName, null, $headers); - - if ($response->getStatus() == 206) { // 206 Partial Content - $this->_objectBuffer .= $response->getBody(); - } - } - - $data = substr($this->_objectBuffer, $this->_position, $count); - $this->_position += strlen($data); - return $data; - } - - /** - * Write to the stream - * - * @param string $data - * @return integer - */ - public function stream_write($data) - { - if (!$this->_objectName) { - return 0; - } - $len = strlen($data); - $this->_objectBuffer .= $data; - $this->_objectSize += $len; - // TODO: handle current position for writing! - return $len; - } - - /** - * End of the stream? - * - * @return boolean - */ - public function stream_eof() - { - if (!$this->_objectName) { - return true; - } - - return ($this->_position >= $this->_objectSize); - } - - /** - * What is the current read/write position of the stream - * - * @return integer - */ - public function stream_tell() - { - return $this->_position; - } - - /** - * Update the read/write position of the stream - * - * @param integer $offset - * @param integer $whence - * @return boolean - */ - public function stream_seek($offset, $whence) - { - if (!$this->_objectName) { - return false; - } - - switch ($whence) { - case SEEK_CUR: - // Set position to current location plus $offset - $new_pos = $this->_position + $offset; - break; - case SEEK_END: - // Set position to end-of-file plus $offset - $new_pos = $this->_objectSize + $offset; - break; - case SEEK_SET: - default: - // Set position equal to $offset - $new_pos = $offset; - break; - } - $ret = ($new_pos >= 0 && $new_pos <= $this->_objectSize); - if ($ret) { - $this->_position = $new_pos; - } - return $ret; - } - - /** - * Flush current cached stream data to storage - * - * @return boolean - */ - public function stream_flush() - { - // If the stream wasn't opened for writing, just return false - if (!$this->_writeBuffer) { - return false; - } - - $ret = $this->_s3->putObject($this->_objectName, $this->_objectBuffer); - - $this->_objectBuffer = null; - - return $ret; - } - - /** - * Returns data array of stream variables - * - * @return array - */ - public function stream_stat() - { - if (!$this->_objectName) { - return false; - } - - $stat = array(); - $stat['dev'] = 0; - $stat['ino'] = 0; - $stat['mode'] = 0777; - $stat['nlink'] = 0; - $stat['uid'] = 0; - $stat['gid'] = 0; - $stat['rdev'] = 0; - $stat['size'] = 0; - $stat['atime'] = 0; - $stat['mtime'] = 0; - $stat['ctime'] = 0; - $stat['blksize'] = 0; - $stat['blocks'] = 0; - - if(($slash = strchr($this->_objectName, '/')) === false || $slash == strlen($this->_objectName)-1) { - /* bucket */ - $stat['mode'] |= 040000; - } else { - $stat['mode'] |= 0100000; - } - $info = $this->_s3->getInfo($this->_objectName); - if (!empty($info)) { - $stat['size'] = $info['size']; - $stat['atime'] = time(); - $stat['mtime'] = $info['mtime']; - } - - return $stat; - } - - /** - * Attempt to delete the item - * - * @param string $path - * @return boolean - */ - public function unlink($path) - { - return $this->_getS3Client($path)->removeObject($this->_getNamePart($path)); - } - - /** - * Attempt to rename the item - * - * @param string $path_from - * @param string $path_to - * @return boolean False - */ - public function rename($path_from, $path_to) - { - // TODO: Renaming isn't supported, always return false - return false; - } - - /** - * Create a new directory - * - * @param string $path - * @param integer $mode - * @param integer $options - * @return boolean - */ - public function mkdir($path, $mode, $options) - { - return $this->_getS3Client($path)->createBucket(parse_url($path, PHP_URL_HOST)); - } - - /** - * Remove a directory - * - * @param string $path - * @param integer $options - * @return boolean - */ - public function rmdir($path, $options) - { - return $this->_getS3Client($path)->removeBucket(parse_url($path, PHP_URL_HOST)); - } - - /** - * Attempt to open a directory - * - * @param string $path - * @param integer $options - * @return boolean - */ - public function dir_opendir($path, $options) - { - - if (preg_match('@^([a-z0-9+.]|-)+://$@', $path)) { - $this->_bucketList = $this->_getS3Client($path)->getBuckets(); - } - else { - $host = parse_url($path, PHP_URL_HOST); - $this->_bucketList = $this->_getS3Client($path)->getObjectsByBucket($host); - } - - return ($this->_bucketList !== false); - } - - /** - * Return array of URL variables - * - * @param string $path - * @param integer $flags - * @return array - */ - public function url_stat($path, $flags) - { - $stat = array(); - $stat['dev'] = 0; - $stat['ino'] = 0; - $stat['mode'] = 0777; - $stat['nlink'] = 0; - $stat['uid'] = 0; - $stat['gid'] = 0; - $stat['rdev'] = 0; - $stat['size'] = 0; - $stat['atime'] = 0; - $stat['mtime'] = 0; - $stat['ctime'] = 0; - $stat['blksize'] = 0; - $stat['blocks'] = 0; - - $name = $this->_getNamePart($path); - if(($slash = strchr($name, '/')) === false || $slash == strlen($name)-1) { - /* bucket */ - $stat['mode'] |= 040000; - } else { - $stat['mode'] |= 0100000; - } - $info = $this->_getS3Client($path)->getInfo($name); - - if (!empty($info)) { - $stat['size'] = $info['size']; - $stat['atime'] = time(); - $stat['mtime'] = $info['mtime']; - } - - return $stat; - } - - /** - * Return the next filename in the directory - * - * @return string - */ - public function dir_readdir() - { - $object = current($this->_bucketList); - if ($object !== false) { - next($this->_bucketList); - } - return $object; - } - - /** - * Reset the directory pointer - * - * @return boolean True - */ - public function dir_rewinddir() - { - reset($this->_bucketList); - return true; - } - - /** - * Close a directory - * - * @return boolean True - */ - public function dir_closedir() - { - $this->_bucketList = array(); - return true; - } -} diff --git a/library/Zend/Service/Amazon/SimilarProduct.php b/library/Zend/Service/Amazon/SimilarProduct.php deleted file mode 100644 index 6b300187ae..0000000000 --- a/library/Zend/Service/Amazon/SimilarProduct.php +++ /dev/null @@ -1,61 +0,0 @@ -ownerDocument); - $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01'); - foreach (array('ASIN', 'Title') as $el) { - $text = $xpath->query("./az:$el/text()", $dom)->item(0); - if($text instanceof DOMText) { - $this->$el = (string)$text->data; - } - } - } -} diff --git a/library/Zend/Service/Amazon/SimpleDb.php b/library/Zend/Service/Amazon/SimpleDb.php deleted file mode 100644 index 3459a7584b..0000000000 --- a/library/Zend/Service/Amazon/SimpleDb.php +++ /dev/null @@ -1,579 +0,0 @@ -setEndpoint("https://" . $this->_sdbEndpoint); - } - - /** - * Set SimpleDB endpoint to use - * - * @param string|Zend_Uri_Http $endpoint - * @throws Zend_Service_Amazon_SimpleDb_Exception - * @throws Zend_Uri_Exception - * @return Zend_Service_Amazon_SimpleDb - */ - public function setEndpoint($endpoint) - { - if(!($endpoint instanceof Zend_Uri_Http)) { - $endpoint = Zend_Uri::factory($endpoint); - } - if(!$endpoint->valid()) { - #require_once 'Zend/Service/Amazon/SimpleDb/Exception.php'; - throw new Zend_Service_Amazon_SimpleDb_Exception("Invalid endpoint supplied"); - } - $this->_endpoint = $endpoint; - return $this; - } - - /** - * Get SimpleDB endpoint - * - * @return Zend_Uri_Http - */ - public function getEndpoint() - { - return $this->_endpoint; - } - - /** - * Get attributes API method - * - * @param string $domainName Domain name within database - * @param string $itemName - * @param string|null $attributeName - * @throws Zend_Service_Amazon_SimpleDb_Exception - * @return array - */ - public function getAttributes( - $domainName, $itemName, $attributeName = null - ) { - $params = array(); - $params['Action'] = 'GetAttributes'; - $params['DomainName'] = $domainName; - $params['ItemName'] = $itemName; - - if (isset($attributeName)) { - $params['AttributeName'] = $attributeName; - } - - $response = $this->_sendRequest($params); - $document = $response->getSimpleXMLDocument(); - - $attributeNodes = $document->GetAttributesResult->Attribute; - - // Return an array of arrays - $attributes = array(); - foreach($attributeNodes as $attributeNode) { - $name = (string)$attributeNode->Name; - $valueNodes = $attributeNode->Value; - $data = null; - if (is_array($valueNodes) && !empty($valueNodes)) { - $data = array(); - foreach($valueNodes as $valueNode) { - $data[] = (string)$valueNode; - } - } elseif (isset($valueNodes)) { - $data = (string)$valueNodes; - } - if (isset($attributes[$name])) { - $attributes[$name]->addValue($data); - } else { - $attributes[$name] = new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $name, $data); - } - } - return $attributes; - } - - /** - * Push attributes - * - * @param string $domainName - * @param string $itemName - * @param array|Traversable $attributes - * @param array $replace - * @return void - */ - public function putAttributes( - $domainName, $itemName, $attributes, $replace = array() - ) { - $params = array(); - $params['Action'] = 'PutAttributes'; - $params['DomainName'] = $domainName; - $params['ItemName'] = $itemName; - - $index = 0; - foreach ($attributes as $attribute) { - $attributeName = $attribute->getName(); - foreach ($attribute->getValues() as $value) { - $params['Attribute.' . $index . '.Name'] = $attributeName; - $params['Attribute.' . $index . '.Value'] = $value; - - // Check if it should be replaced - if(array_key_exists($attributeName, $replace) && $replace[$attributeName]) { - $params['Attribute.' . $index . '.Replace'] = 'true'; - } - $index++; - } - } - - // Exception should get thrown if there's an error - $response = $this->_sendRequest($params); - } - - /** - * Add many attributes at once - * - * @param array $items - * @param string $domainName - * @param array $replace - * @return void - */ - public function batchPutAttributes($items, $domainName, array $replace = array()) - { - - $params = array(); - $params['Action'] = 'BatchPutAttributes'; - $params['DomainName'] = $domainName; - - $itemIndex = 0; - foreach ($items as $name => $attributes) { - $params['Item.' . $itemIndex . '.ItemName'] = $name; - $attributeIndex = 0; - foreach ($attributes as $attribute) { - // attribute value cannot be array, so when several items are passed - // they are treated as separate values with the same attribute name - foreach($attribute->getValues() as $value) { - $params['Item.' . $itemIndex . '.Attribute.' . $attributeIndex . '.Name'] = $attribute->getName(); - $params['Item.' . $itemIndex . '.Attribute.' . $attributeIndex . '.Value'] = $value; - if (isset($replace[$name]) - && isset($replace[$name][$attribute->getName()]) - && $replace[$name][$attribute->getName()] - ) { - $params['Item.' . $itemIndex . '.Attribute.' . $attributeIndex . '.Replace'] = 'true'; - } - $attributeIndex++; - } - } - $itemIndex++; - } - - $response = $this->_sendRequest($params); - } - - /** - * Delete attributes - * - * @param string $domainName - * @param string $itemName - * @param array $attributes - * @return void - */ - public function deleteAttributes($domainName, $itemName, array $attributes = array()) - { - $params = array(); - $params['Action'] = 'DeleteAttributes'; - $params['DomainName'] = $domainName; - $params['ItemName'] = $itemName; - - $attributeIndex = 0; - foreach ($attributes as $attribute) { - foreach ($attribute->getValues() as $value) { - $params['Attribute.' . $attributeIndex . '.Name'] = $attribute->getName(); - $params['Attribute.' . $attributeIndex . '.Value'] = $value; - $attributeIndex++; - } - } - - $response = $this->_sendRequest($params); - - return true; - } - - /** - * List domains - * - * @param int $maxNumberOfDomains - * @param int $nextToken - * @return array 0 or more domain names - */ - public function listDomains($maxNumberOfDomains = 100, $nextToken = null) - { - $params = array(); - $params['Action'] = 'ListDomains'; - $params['MaxNumberOfDomains'] = $maxNumberOfDomains; - - if (null !== $nextToken) { - $params['NextToken'] = $nextToken; - } - $response = $this->_sendRequest($params); - - $domainNodes = $response->getSimpleXMLDocument()->ListDomainsResult->DomainName; - - $data = array(); - foreach ($domainNodes as $domain) { - $data[] = (string)$domain; - } - - $nextTokenNode = $response->getSimpleXMLDocument()->ListDomainsResult->NextToken; - $nextToken = (string)$nextTokenNode; - - return new Zend_Service_Amazon_SimpleDb_Page($data, $nextToken); - } - - /** - * Retrieve domain metadata - * - * @param string $domainName Name of the domain for which metadata will be requested - * @return array Key/value array of metadatum names and values. - */ - public function domainMetadata($domainName) - { - $params = array(); - $params['Action'] = 'DomainMetadata'; - $params['DomainName'] = $domainName; - $response = $this->_sendRequest($params); - - $document = $response->getSimpleXMLDocument(); - - $metadataNodes = $document->DomainMetadataResult->children(); - $metadata = array(); - foreach ($metadataNodes as $metadataNode) { - $name = $metadataNode->getName(); - $metadata[$name] = (string)$metadataNode; - } - - return $metadata; - } - - /** - * Create a new domain - * - * @param string $domainName Valid domain name of the domain to create - * @return boolean True if successful, false if not - */ - public function createDomain($domainName) - { - $params = array(); - $params['Action'] = 'CreateDomain'; - $params['DomainName'] = $domainName; - $response = $this->_sendRequest($params); - return $response->getHttpResponse()->isSuccessful(); - } - - /** - * Delete a domain - * - * @param string $domainName Valid domain name of the domain to delete - * @return boolean True if successful, false if not - */ - public function deleteDomain($domainName) - { - $params = array(); - $params['Action'] = 'DeleteDomain'; - $params['DomainName'] = $domainName; - $response = $this->_sendRequest($params); - return $response->getHttpResponse()->isSuccessful(); - } - - /** - * Select items from the database - * - * @param string $selectExpression - * @param null|string $nextToken - * @return Zend_Service_Amazon_SimpleDb_Page - */ - public function select($selectExpression, $nextToken = null) - { - $params = array(); - $params['Action'] = 'Select'; - $params['SelectExpression'] = $selectExpression; - - if (null !== $nextToken) { - $params['NextToken'] = $nextToken; - } - - $response = $this->_sendRequest($params); - $xml = $response->getSimpleXMLDocument(); - - $attributes = array(); - foreach ($xml->SelectResult->Item as $item) { - $itemName = (string)$item->Name; - - foreach ($item->Attribute as $attribute) { - $attributeName = (string)$attribute->Name; - - $values = array(); - foreach ($attribute->Value as $value) { - $values[] = (string)$value; - } - $attributes[$itemName][$attributeName] = new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName, $values); - } - } - - $nextToken = (string)$xml->NextToken; - - return new Zend_Service_Amazon_SimpleDb_Page($attributes, $nextToken); - } - - /** - * Quote SDB value - * - * Wraps it in '' - * - * @param string $value - * @return string - */ - public function quote($value) - { - // wrap in single quotes and convert each ' inside to '' - return "'" . str_replace("'", "''", $value) . "'"; - } - - /** - * Quote SDB column or table name - * - * Wraps it in `` - * - * @param string $name - * @throws Zend_Service_Amazon_SimpleDb_Exception - * @return string - */ - public function quoteName($name) - { - if (preg_match('/^[a-z_$][a-z0-9_$-]*$/i', $name) == false) { - throw new Zend_Service_Amazon_SimpleDb_Exception("Invalid name: can contain only alphanumeric characters, \$ and _"); - } - return "`$name`"; - } - - /** - * Sends a HTTP request to the SimpleDB service using Zend_Http_Client - * - * @param array $params List of parameters to send with the request - * @return Zend_Service_Amazon_SimpleDb_Response - * @throws Zend_Service_Amazon_SimpleDb_Exception - */ - protected function _sendRequest(array $params = array()) - { - // UTF-8 encode all parameters and replace '+' characters - foreach ($params as $name => $value) { - unset($params[$name]); - $params[utf8_encode($name)] = $value; - } - - $params = $this->_addRequiredParameters($params); - - try { - /* @var $request Zend_Http_Client */ - $request = self::getHttpClient(); - $request->resetParameters(); - - $request->setConfig(array( - 'timeout' => $this->_httpTimeout - )); - - - $request->setUri($this->getEndpoint()); - $request->setMethod(Zend_Http_Client::POST); - foreach ($params as $key => $value) { - $params_out[] = rawurlencode($key)."=".rawurlencode($value); - } - $request->setRawData(join('&', $params_out), Zend_Http_Client::ENC_URLENCODED); - $httpResponse = $request->request(); - } catch (Zend_Http_Client_Exception $zhce) { - $message = 'Error in request to AWS service: ' . $zhce->getMessage(); - throw new Zend_Service_Amazon_SimpleDb_Exception($message, $zhce->getCode()); - } - $response = new Zend_Service_Amazon_SimpleDb_Response($httpResponse); - $this->_checkForErrors($response); - return $response; - } - - /** - * Adds required authentication and version parameters to an array of - * parameters - * - * The required parameters are: - * - AWSAccessKey - * - SignatureVersion - * - Timestamp - * - Version and - * - Signature - * - * If a required parameter is already set in the $parameters array, - * it is overwritten. - * - * @param array $parameters the array to which to add the required - * parameters. - * - * @return array - */ - protected function _addRequiredParameters(array $parameters) - { - $parameters['AWSAccessKeyId'] = $this->_getAccessKey(); - $parameters['SignatureVersion'] = $this->_signatureVersion; - $parameters['Timestamp'] = gmdate('c'); - $parameters['Version'] = $this->_sdbApiVersion; - $parameters['SignatureMethod'] = $this->_signatureMethod; - $parameters['Signature'] = $this->_signParameters($parameters); - - return $parameters; - } - - /** - * Computes the RFC 2104-compliant HMAC signature for request parameters - * - * This implements the Amazon Web Services signature, as per the following - * specification: - * - * 1. Sort all request parameters (including SignatureVersion and - * excluding Signature, the value of which is being created), - * ignoring case. - * - * 2. Iterate over the sorted list and append the parameter name (in its - * original case) and then its value. Do not URL-encode the parameter - * values before constructing this string. Do not use any separator - * characters when appending strings. - * - * @param array $parameters the parameters for which to get the signature. - * @return string the signed data. - */ - protected function _signParameters(array $parameters) - { - $data = "POST\n"; - $data .= $this->getEndpoint()->getHost() . "\n"; - $data .= "/\n"; - - uksort($parameters, 'strcmp'); - unset($parameters['Signature']); - - $arrData = array(); - foreach ($parameters as $key => $value) { - $value = urlencode($value); - $value = str_replace("%7E", "~", $value); - $value = str_replace("+", "%20", $value); - $arrData[] = urlencode($key) . '=' . $value; - } - - $data .= implode('&', $arrData); - - #require_once 'Zend/Crypt/Hmac.php'; - $hmac = Zend_Crypt_Hmac::compute($this->_getSecretKey(), 'SHA256', $data, Zend_Crypt_Hmac::BINARY); - - return base64_encode($hmac); - } - - /** - * Checks for errors responses from Amazon - * - * @param Zend_Service_Amazon_SimpleDb_Response $response the response object to - * check. - * @throws Zend_Service_Amazon_SimpleDb_Exception if one or more errors are - * returned from Amazon. - */ - private function _checkForErrors(Zend_Service_Amazon_SimpleDb_Response $response) - { - $xpath = new DOMXPath($response->getDocument()); - $list = $xpath->query('//Error'); - if ($list->length > 0) { - $node = $list->item(0); - $code = $xpath->evaluate('string(Code/text())', $node); - $message = $xpath->evaluate('string(Message/text())', $node); - throw new Zend_Service_Amazon_SimpleDb_Exception($message, 0, $code); - } - } -} diff --git a/library/Zend/Service/Amazon/SimpleDb/Attribute.php b/library/Zend/Service/Amazon/SimpleDb/Attribute.php deleted file mode 100644 index b8a7cca7e1..0000000000 --- a/library/Zend/Service/Amazon/SimpleDb/Attribute.php +++ /dev/null @@ -1,108 +0,0 @@ -_itemName = $itemName; - $this->_name = $name; - - if (!is_array($values)) { - $this->_values = array($values); - } else { - $this->_values = $values; - } - } - - /** - * Return the item name to which the attribute belongs - * - * @return string - */ - public function getItemName () - { - return $this->_itemName; - } - - /** - * Retrieve attribute values - * - * @return array - */ - public function getValues() - { - return $this->_values; - } - - /** - * Retrieve the attribute name - * - * @return string - */ - public function getName () - { - return $this->_name; - } - - /** - * Add value - * - * @param mixed $value - * @return void - */ - public function addValue($value) - { - if (is_array($value)) { - $this->_values += $value; - } else { - $this->_values[] = $value; - } - } - - public function setValues($values) - { - if (!is_array($values)) { - $values = array($values); - } - $this->_values = $values; - } -} diff --git a/library/Zend/Service/Amazon/SimpleDb/Exception.php b/library/Zend/Service/Amazon/SimpleDb/Exception.php deleted file mode 100644 index 3ab7c55a7e..0000000000 --- a/library/Zend/Service/Amazon/SimpleDb/Exception.php +++ /dev/null @@ -1,66 +0,0 @@ -_awsErrorCode = $awsErrorCode; - } - - /** - * Get AWS error code - * - * @return string - */ - public function getErrorCode() - { - return $this->_awsErrorCode; - } -} diff --git a/library/Zend/Service/Amazon/SimpleDb/Page.php b/library/Zend/Service/Amazon/SimpleDb/Page.php deleted file mode 100644 index 5c66f45652..0000000000 --- a/library/Zend/Service/Amazon/SimpleDb/Page.php +++ /dev/null @@ -1,124 +0,0 @@ -setData($data); - $this->setToken($token); - } - - /** - * Set page data - * - * @param string $data - */ - public function setData($data) - { - $this->_data = $data; - } - - /** - * Retrieve page data - * - * @return string - */ - public function getData() - { - return $this->_data; - } - - /** - * Set token - * - * @param string|null $token - */ - public function setToken($token) - { - $this->_token = (trim($token) === '') ? null : $token; - } - - /** - * Retrieve token - * - * @return string|null - */ - public function getToken() - { - return $this->_token; - } - - /** - * Determine whether this is the last page of data - * - * @return bool - */ - public function isLast() - { - return (null === $this->_token); - } - - /** - * Cast to string - * - * @return string - */ - public function __toString() - { - return "Page with token: " . $this->_token - . "\n and data: " . $this->_data; - } -} diff --git a/library/Zend/Service/Amazon/SimpleDb/Response.php b/library/Zend/Service/Amazon/SimpleDb/Response.php deleted file mode 100644 index 9ef2bf250e..0000000000 --- a/library/Zend/Service/Amazon/SimpleDb/Response.php +++ /dev/null @@ -1,190 +0,0 @@ -_httpResponse = $httpResponse; - } - - /** - * Gets the XPath object for this response - * - * @return DOMXPath the XPath object for response. - */ - public function getXPath() - { - if ($this->_xpath === null) { - $document = $this->getDocument(); - if ($document === false) { - $this->_xpath = false; - } else { - $this->_xpath = new DOMXPath($document); - $this->_xpath->registerNamespace('sdb', - $this->getNamespace()); - } - } - - return $this->_xpath; - } - - /** - * Gets the SimpleXML document object for this response - * - * @return SimpleXMLElement - */ - public function getSimpleXMLDocument() - { - try { - $body = $this->_httpResponse->getBody(); - } catch (Zend_Http_Exception $e) { - $body = false; - } - - return Zend_Xml_Security::scan($body); - } - - /** - * Get HTTP response object - * - * @return Zend_Http_Response - */ - public function getHttpResponse() - { - return $this->_httpResponse; - } - - /** - * Gets the document object for this response - * - * @return DOMDocument the DOM Document for this response. - */ - public function getDocument() - { - try { - $body = $this->_httpResponse->getBody(); - } catch (Zend_Http_Exception $e) { - $body = false; - } - - if ($this->_document === null) { - if ($body !== false) { - // turn off libxml error handling - $errors = libxml_use_internal_errors(); - - $this->_document = new DOMDocument(); - $this->_document = Zend_Xml_Security::scan($body, $this->_document); - - // reset libxml error handling - libxml_clear_errors(); - libxml_use_internal_errors($errors); - } else { - $this->_document = false; - } - } - - return $this->_document; - } - - /** - * Return the current set XML Namespace. - * - * @return string - */ - public function getNamespace() - { - return $this->_xmlNamespace; - } - - /** - * Set a new XML Namespace - * - * @param string $namespace - */ - public function setNamespace($namespace) - { - $this->_xmlNamespace = $namespace; - } -} diff --git a/library/Zend/Service/Amazon/Sqs.php b/library/Zend/Service/Amazon/Sqs.php deleted file mode 100644 index f2bf4f1a0d..0000000000 --- a/library/Zend/Service/Amazon/Sqs.php +++ /dev/null @@ -1,542 +0,0 @@ - 'sqs.us-east-1.amazonaws.com', - 'us-west-1' => 'sqs.us-west-1.amazonaws.com', - 'eu-west-1' => 'sqs.eu-west-1.amazonaws.com', - 'ap-southeast-1' => 'sqs.ap-southeast-1.amazonaws.com', - 'ap-northeast-1' => 'sqs.ap-northeast-1.amazonaws.com'); - /** - * Constructor - * - * The default region is us-east-1. Use the region to set it to one of the regions that is build-in into ZF. - * To add a new AWS region use the setEndpoint() method. - * - * @param string $accessKey - * @param string $secretKey - * @param string $region - */ - public function __construct($accessKey = null, $secretKey = null, $region = null) - { - parent::__construct($accessKey, $secretKey, $region); - - if (null !== $region) { - $this->_setEndpoint($region); - } - } - - /** - * Set SQS endpoint - * - * Checks and sets endpoint if region exists in $_sqsEndpoints. If a new SQS region is added by amazon, - * please use the setEndpoint function to set it. - * - * @param string $region region - * @throws Zend_Service_Amazon_Sqs_Exception - */ - protected function _setEndpoint($region) - { - if (array_key_exists($region, $this->_sqsEndpoints)) { - $this->_sqsEndpoint = $this->_sqsEndpoints[$region]; - } else { - throw new Zend_Service_Amazon_Sqs_Exception('Invalid SQS region specified.'); - } - } - - /** - * Set SQS endpoint - * - * You can set SQS to on of the build-in regions. If the region does not exsist it will be added. - * - * @param string $region region - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function setEndpoint($region) - { - if (!empty($region)) { - if (array_key_exists($region, $this->_sqsEndpoints)) { - $this->_sqsEndpoint = $this->_sqsEndpoints[$region]; - } else { - $this->_sqsEndpoints[$region] = "sqs.$region.amazonaws.com"; - $this->_sqsEndpoint = $this->_sqsEndpoints[$region]; - } - } else { - throw new Zend_Service_Amazon_Sqs_Exception('Empty region specified.'); - } - } - - /** - * Get the SQS endpoint - * - * @return string - */ - public function getEndpoint() - { - return $this->_sqsEndpoint; - } - - /** - * Get possible SQS endpoints - * - * Since there is not an SQS webserive to get all possible endpoints, a hardcoded list is available. - * For the actual region list please check: - * http://docs.amazonwebservices.com/AWSSimpleQueueService/2009-02-01/APIReference/index.html?QueueServiceWsdlArticle.html - * - * @param string $region region - * @return array - */ - public function getEndpoints() - { - return $this->_sqsEndpoints; - } - - /** - * Create a new queue - * - * Visibility timeout is how long a message is left in the queue "invisible" - * to other readers. If the message is acknowleged (deleted) before the - * timeout, then the message is deleted. However, if the timeout expires - * then the message will be made available to other queue readers. - * - * @param string $queue_name queue name - * @param integer $timeout default visibility timeout - * @return string|boolean - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function create($queue_name, $timeout = null) - { - $params = array(); - $params['QueueName'] = $queue_name; - $timeout = ($timeout === null) ? self::CREATE_TIMEOUT_DEFAULT : (int)$timeout; - $params['DefaultVisibilityTimeout'] = $timeout; - - $retry_count = 0; - - do { - $retry = false; - $result = $this->_makeRequest(null, 'CreateQueue', $params); - - if (!isset($result->CreateQueueResult->QueueUrl) - || empty($result->CreateQueueResult->QueueUrl) - ) { - if ($result->Error->Code == 'AWS.SimpleQueueService.QueueNameExists') { - return false; - } elseif ($result->Error->Code == 'AWS.SimpleQueueService.QueueDeletedRecently') { - // Must sleep for 60 seconds, then try re-creating the queue - sleep(60); - $retry = true; - $retry_count++; - } else { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } - } else { - return (string) $result->CreateQueueResult->QueueUrl; - } - - } while ($retry); - - return false; - } - - /** - * Delete a queue and all of it's messages - * - * Returns false if the queue is not found, true if the queue exists - * - * @param string $queue_url queue URL - * @return boolean - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function delete($queue_url) - { - $result = $this->_makeRequest($queue_url, 'DeleteQueue'); - - if ($result->Error->Code !== null) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } - - return true; - } - - /** - * Get an array of all available queues - * - * @return array - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function getQueues() - { - $result = $this->_makeRequest(null, 'ListQueues'); - - if (isset($result->Error)) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } - - if (!isset($result->ListQueuesResult->QueueUrl) - || empty($result->ListQueuesResult->QueueUrl) - ) { - return array(); - } - - $queues = array(); - foreach ($result->ListQueuesResult->QueueUrl as $queue_url) { - $queues[] = (string)$queue_url; - } - - return $queues; - } - - /** - * Return the approximate number of messages in the queue - * - * @param string $queue_url Queue URL - * @return integer - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function count($queue_url) - { - return (int)$this->getAttribute($queue_url, 'ApproximateNumberOfMessages'); - } - - /** - * Send a message to the queue - * - * @param string $queue_url Queue URL - * @param string $message Message to send to the queue - * @return string Message ID - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function send($queue_url, $message) - { - $params = array(); - $params['MessageBody'] = urlencode($message); - - $checksum = md5($params['MessageBody']); - - $result = $this->_makeRequest($queue_url, 'SendMessage', $params); - - if (!isset($result->SendMessageResult->MessageId) - || empty($result->SendMessageResult->MessageId) - ) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } else if ((string) $result->SendMessageResult->MD5OfMessageBody != $checksum) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception('MD5 of body does not match message sent'); - } - - return (string) $result->SendMessageResult->MessageId; - } - - /** - * Get messages in the queue - * - * @param string $queue_url Queue name - * @param integer $max_messages Maximum number of messages to return - * @param integer $timeout Visibility timeout for these messages - * @return array - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function receive($queue_url, $max_messages = null, $timeout = null) - { - $params = array(); - - // If not set, the visibility timeout on the queue is used - if ($timeout !== null) { - $params['VisibilityTimeout'] = (int)$timeout; - } - - // SQS will default to only returning one message - if ($max_messages !== null) { - $params['MaxNumberOfMessages'] = (int)$max_messages; - } - - $result = $this->_makeRequest($queue_url, 'ReceiveMessage', $params); - - if (isset($result->Error)) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } - - if (!isset($result->ReceiveMessageResult->Message) - || empty($result->ReceiveMessageResult->Message) - ) { - // no messages found - return array(); - } - - $data = array(); - foreach ($result->ReceiveMessageResult->Message as $message) { - $data[] = array( - 'message_id' => (string)$message->MessageId, - 'handle' => (string)$message->ReceiptHandle, - 'md5' => (string)$message->MD5OfBody, - 'body' => urldecode((string)$message->Body), - ); - } - - return $data; - } - - /** - * Delete a message from the queue - * - * Returns true if the message is deleted, false if the deletion is - * unsuccessful. - * - * @param string $queue_url Queue URL - * @param string $handle Message handle as returned by SQS - * @return boolean - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function deleteMessage($queue_url, $handle) - { - $params = array(); - $params['ReceiptHandle'] = (string)$handle; - - $result = $this->_makeRequest($queue_url, 'DeleteMessage', $params); - - if (isset($result->Error->Code) - && !empty($result->Error->Code) - ) { - return false; - } - - // Will always return true unless ReceiptHandle is malformed - return true; - } - - /** - * Get the attributes for the queue - * - * @param string $queue_url Queue URL - * @param string $attribute - * @return string - * @throws Zend_Service_Amazon_Sqs_Exception - */ - public function getAttribute($queue_url, $attribute = 'All') - { - $params = array(); - $params['AttributeName'] = $attribute; - - $result = $this->_makeRequest($queue_url, 'GetQueueAttributes', $params); - - if (!isset($result->GetQueueAttributesResult->Attribute) - || empty($result->GetQueueAttributesResult->Attribute) - ) { - #require_once 'Zend/Service/Amazon/Sqs/Exception.php'; - throw new Zend_Service_Amazon_Sqs_Exception($result->Error->Code); - } - - if(count($result->GetQueueAttributesResult->Attribute) > 1) { - $attr_result = array(); - foreach($result->GetQueueAttributesResult->Attribute as $attribute) { - $attr_result[(string)$attribute->Name] = (string)$attribute->Value; - } - return $attr_result; - } else { - return (string) $result->GetQueueAttributesResult->Attribute->Value; - } - } - - /** - * Make a request to Amazon SQS - * - * @param string $queue Queue Name - * @param string $action SQS action - * @param array $params - * @return SimpleXMLElement - */ - private function _makeRequest($queue_url, $action, $params = array()) - { - $params['Action'] = $action; - $params = $this->addRequiredParameters($queue_url, $params); - - if ($queue_url === null) { - $queue_url = '/'; - } - - $client = self::getHttpClient(); - - switch ($action) { - case 'ListQueues': - case 'CreateQueue': - $client->setUri('http://'.$this->_sqsEndpoint); - break; - default: - $client->setUri($queue_url); - break; - } - - $retry_count = 0; - - do { - $retry = false; - - $client->resetParameters(); - $client->setParameterGet($params); - - $response = $client->request('GET'); - - $response_code = $response->getStatus(); - - // Some 5xx errors are expected, so retry automatically - if ($response_code >= 500 && $response_code < 600 && $retry_count <= 5) { - $retry = true; - $retry_count++; - sleep($retry_count / 4 * $retry_count); - } - } while ($retry); - - unset($client); - - return new SimpleXMLElement($response->getBody()); - } - - /** - * Adds required authentication and version parameters to an array of - * parameters - * - * The required parameters are: - * - AWSAccessKey - * - SignatureVersion - * - Timestamp - * - Version and - * - Signature - * - * If a required parameter is already set in the $parameters array, - * it is overwritten. - * - * @param string $queue_url Queue URL - * @param array $parameters the array to which to add the required - * parameters. - * @return array - */ - protected function addRequiredParameters($queue_url, array $parameters) - { - $parameters['AWSAccessKeyId'] = $this->_getAccessKey(); - $parameters['SignatureVersion'] = $this->_sqsSignatureVersion; - $parameters['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z', time()+10); - $parameters['Version'] = $this->_sqsApiVersion; - $parameters['SignatureMethod'] = $this->_sqsSignatureMethod; - $parameters['Signature'] = $this->_signParameters($queue_url, $parameters); - - return $parameters; - } - - /** - * Computes the RFC 2104-compliant HMAC signature for request parameters - * - * This implements the Amazon Web Services signature, as per the following - * specification: - * - * 1. Sort all request parameters (including SignatureVersion and - * excluding Signature, the value of which is being created), - * ignoring case. - * - * 2. Iterate over the sorted list and append the parameter name (in its - * original case) and then its value. Do not URL-encode the parameter - * values before constructing this string. Do not use any separator - * characters when appending strings. - * - * @param string $queue_url Queue URL - * @param array $parameters the parameters for which to get the signature. - * - * @return string the signed data. - */ - protected function _signParameters($queue_url, array $paramaters) - { - $data = "GET\n"; - $data .= $this->_sqsEndpoint . "\n"; - if ($queue_url !== null) { - $data .= parse_url($queue_url, PHP_URL_PATH); - } - else { - $data .= '/'; - } - $data .= "\n"; - - uksort($paramaters, 'strcmp'); - unset($paramaters['Signature']); - - $arrData = array(); - foreach($paramaters as $key => $value) { - $arrData[] = $key . '=' . str_replace('%7E', '~', urlencode($value)); - } - - $data .= implode('&', $arrData); - - $hmac = Zend_Crypt_Hmac::compute($this->_getSecretKey(), 'SHA256', $data, Zend_Crypt_Hmac::BINARY); - - return base64_encode($hmac); - } -} diff --git a/library/Zend/Service/Amazon/Sqs/Exception.php b/library/Zend/Service/Amazon/Sqs/Exception.php deleted file mode 100644 index 0a404c72c5..0000000000 --- a/library/Zend/Service/Amazon/Sqs/Exception.php +++ /dev/null @@ -1,38 +0,0 @@ -set('version', '1.0'); - - if (PHP_VERSION_ID < 50600) { - iconv_set_encoding('output_encoding', 'UTF-8'); - iconv_set_encoding('input_encoding', 'UTF-8'); - iconv_set_encoding('internal_encoding', 'UTF-8'); - } else { - ini_set('output_encoding', 'UTF-8'); - ini_set('input_encoding', 'UTF-8'); - ini_set('default_charset', 'UTF-8'); - } - } - - /** - * Set Http Client - * - * @param Zend_Http_Client $client - */ - public function setHttpClient(Zend_Http_Client $client) - { - $this->_client = $client; - } - - /** - * Get current http client. - * - * @return Zend_Http_Client - */ - public function getHttpClient() - { - if($this->_client == null) { - $this->lazyLoadHttpClient(); - } - return $this->_client; - } - - /** - * Lazy load Http Client if none is instantiated yet. - * - * @return void - */ - protected function lazyLoadHttpClient() - { - $this->_client = new Zend_Http_Client(); - } - - /** - * Returns a field value, or false if the named field does not exist - * - * @param string $field - * @return string|false - */ - public function get($field) - { - if (array_key_exists($field, $this->_params)) { - return $this->_params[$field]; - } else { - return false; - } - } - - /** - * Generic set action for a field in the parameters being used - * - * @param string $field name of field to set - * @param string $value value to assign to the named field - * @return Zend_Service_Audioscrobbler Provides a fluent interface - */ - public function set($field, $value) - { - $this->_params[$field] = urlencode($value); - - return $this; - } - - /** - * Protected method that queries REST service and returns SimpleXML response set - * - * @param string $service name of Audioscrobbler service file we're accessing - * @param string $params parameters that we send to the service if needded - * @throws Zend_Http_Client_Exception - * @throws Zend_Service_Exception - * @return SimpleXMLElement result set - * @access protected - */ - protected function _getInfo($service, $params = null) - { - $service = (string) $service; - $params = (string) $params; - - if ($params === '') { - $this->getHttpClient()->setUri("http://ws.audioscrobbler.com{$service}"); - } else { - $this->getHttpClient()->setUri("http://ws.audioscrobbler.com{$service}?{$params}"); - } - - $response = $this->getHttpClient()->request(); - $responseBody = $response->getBody(); - - if (preg_match('/No such path/', $responseBody)) { - /** - * @see Zend_Http_Client_Exception - */ - #require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Could not find: ' . $this->_client->getUri()); - } elseif (preg_match('/No user exists with this name/', $responseBody)) { - /** - * @see Zend_Http_Client_Exception - */ - #require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('No user exists with this name'); - } elseif (!$response->isSuccessful()) { - /** - * @see Zend_Http_Client_Exception - */ - #require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('The web service ' . $this->_client->getUri() . ' returned the following status code: ' . $response->getStatus()); - } - - set_error_handler(array($this, '_errorHandler')); - - if (!$simpleXmlElementResponse = Zend_Xml_Security::scan($responseBody)) { - restore_error_handler(); - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - $exception = new Zend_Service_Exception('Response failed to load with SimpleXML'); - $exception->error = $this->_error; - $exception->response = $responseBody; - throw $exception; - } - - restore_error_handler(); - - return $simpleXmlElementResponse; - } - - /** - * Utility function to get Audioscrobbler profile information (eg: Name, Gender) - * - * @return array containing information - */ - public function userGetProfileInformation() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/profile.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function get this user's 50 most played artists - * - * @return array containing info - */ - public function userGetTopArtists() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/topartists.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function to get this user's 50 most played albums - * - * @return SimpleXMLElement object containing result set - */ - public function userGetTopAlbums() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/topalbums.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function to get this user's 50 most played tracks - * @return SimpleXML object containing resut set - */ - public function userGetTopTracks() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/toptracks.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function to get this user's 50 most used tags - * - * @return SimpleXMLElement object containing result set - */ - public function userGetTopTags() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/tags.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns the user's top tags used most used on a specific artist - * - * @return SimpleXMLElement object containing result set - */ - public function userGetTopTagsForArtist() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/artisttags.xml"; - $params = "artist={$this->get('artist')}"; - return $this->_getInfo($service, $params); - } - - /** - * Utility function that returns this user's top tags for an album - * - * @return SimpleXMLElement object containing result set - */ - public function userGetTopTagsForAlbum() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/albumtags.xml"; - $params = "artist={$this->get('artist')}&album={$this->get('album')}"; - return $this->_getInfo($service, $params); - } - - /** - * Utility function that returns this user's top tags for a track - * - * @return SimpleXMLElement object containing result set - */ - public function userGetTopTagsForTrack() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/tracktags.xml"; - $params = "artist={$this->get('artist')}&track={$this->get('track')}"; - return $this->_getInfo($service, $params); - } - - /** - * Utility function that retrieves this user's list of friends - * @return SimpleXMLElement object containing result set - */ - public function userGetFriends() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/friends.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of people with similar listening preferences to this user - * - * @return SimpleXMLElement object containing result set - */ - public function userGetNeighbours() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/neighbours.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of the 10 most recent tracks played by this user - * - * @return SimpleXMLElement object containing result set - */ - public function userGetRecentTracks() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/recenttracks.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of the 10 tracks most recently banned by this user - * - * @return SimpleXMLElement object containing result set - */ - public function userGetRecentBannedTracks() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/recentbannedtracks.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of the 10 tracks most recently loved by this user - * - * @return SimpleXMLElement object containing result set - */ - public function userGetRecentLovedTracks() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/recentlovedtracks.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of dates of available weekly charts for a this user - * - * Should actually be named userGetWeeklyChartDateList() but we have to follow audioscrobbler's naming - * - * @return SimpleXMLElement object containing result set - */ - public function userGetWeeklyChartList() - { - $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklychartlist.xml"; - return $this->_getInfo($service); - } - - - /** - * Utility function that returns weekly album chart data for this user - * - * @param integer $from optional UNIX timestamp for start of date range - * @param integer $to optional UNIX timestamp for end of date range - * @return SimpleXMLElement object containing result set - */ - public function userGetWeeklyAlbumChart($from = NULL, $to = NULL) - { - $params = ""; - - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&to={$to}"; - } - - $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklyalbumchart.xml"; - return $this->_getInfo($service, $params); - } - - /** - * Utility function that returns weekly artist chart data for this user - * - * @param integer $from optional UNIX timestamp for start of date range - * @param integer $to optional UNIX timestamp for end of date range - * @return SimpleXMLElement object containing result set - */ - public function userGetWeeklyArtistChart($from = NULL, $to = NULL) - { - $params = ""; - - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&to={$to}"; - } - - $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklyartistchart.xml"; - return $this->_getInfo($service, $params); - } - - /** - * Utility function that returns weekly track chart data for this user - * - * @param integer $from optional UNIX timestamp for start of date range - * @param integer $to optional UNIX timestamp for end of date range - * @return SimpleXMLElement object containing result set - */ - public function userGetWeeklyTrackChart($from = NULL, $to = NULL) - { - $params = ""; - - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&to={$to}"; - } - - $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklytrackchart.xml"; - return $this->_getInfo($service, $params); - } - - - /** - * Utility function that returns a list of artists similiar to this artist - * - * @return SimpleXMLElement object containing result set - */ - public function artistGetRelatedArtists() - { - $service = "/{$this->get('version')}/artist/{$this->get('artist')}/similar.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of this artist's top listeners - * - * @return SimpleXMLElement object containing result set - */ - public function artistGetTopFans() - { - $service = "/{$this->get('version')}/artist/{$this->get('artist')}/fans.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of this artist's top-rated tracks - * - * @return SimpleXMLElement object containing result set - */ - public function artistGetTopTracks() - { - $service = "/{$this->get('version')}/artist/{$this->get('artist')}/toptracks.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of this artist's top-rated albums - * - * @return SimpleXMLElement object containing result set - */ - public function artistGetTopAlbums() - { - $service = "/{$this->get('version')}/artist/{$this->get('artist')}/topalbums.xml"; - return $this->_getInfo($service); - } - - /** - * Utility function that returns a list of this artist's top-rated tags - * - * @return SimpleXMLElement object containing result set - */ - public function artistGetTopTags() - { - $service = "/{$this->get('version')}/artist/{$this->get('artist')}/toptags.xml"; - return $this->_getInfo($service); - } - - - /** - * Get information about an album - * - * @return SimpleXMLElement - */ - public function albumGetInfo() - { - $service = "/{$this->get('version')}/album/{$this->get('artist')}/{$this->get('album')}/info.xml"; - return $this->_getInfo($service); - } - - /** - * Get top fans of the current track. - * - * @return SimpleXMLElement - */ - public function trackGetTopFans() - { - $service = "/{$this->get('version')}/track/{$this->get('artist')}/{$this->get('track')}/fans.xml"; - return $this->_getInfo($service); - } - - /** - * Get top tags of the current track. - * - * @return SimpleXMLElement - */ - public function trackGetTopTags() - { - $service = "/{$this->get('version')}/track/{$this->get('artist')}/{$this->get('track')}/toptags.xml"; - return $this->_getInfo($service); - } - - /** - * Get Top Tags. - * - * @return SimpleXMLElement - */ - public function tagGetTopTags() - { - $service = "/{$this->get('version')}/tag/toptags.xml"; - return $this->_getInfo($service); - } - - /** - * Get top albums by current tag. - * - * @return SimpleXMLElement - */ - public function tagGetTopAlbums() - { - $service = "/{$this->get('version')}/tag/{$this->get('tag')}/topalbums.xml"; - return $this->_getInfo($service); - } - - /** - * Get top artists by current tag. - * - * @return SimpleXMLElement - */ - public function tagGetTopArtists() - { - $service = "/{$this->get('version')}/tag/{$this->get('tag')}/topartists.xml"; - return $this->_getInfo($service); - } - - /** - * Get Top Tracks by currently set tag. - * - * @return SimpleXMLElement - */ - public function tagGetTopTracks() - { - $service = "/{$this->get('version')}/tag/{$this->get('tag')}/toptracks.xml"; - return $this->_getInfo($service); - } - - /** - * Get weekly chart list by current set group. - * - * @see set() - * @return SimpleXMLElement - */ - public function groupGetWeeklyChartList() - { - $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklychartlist.xml"; - return $this->_getInfo($service); - } - - /** - * Retrieve weekly Artist Charts - * - * @param int $from - * @param int $to - * @return SimpleXMLElement - */ - public function groupGetWeeklyArtistChartList($from = NULL, $to = NULL) - { - - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&$to={$to}"; - } else { - $params = ""; - } - - $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklyartistchart.xml"; - return $this->_getInfo($service, $params); - } - - /** - * Retrieve Weekly Track Charts - * - * @param int $from - * @param int $to - * @return SimpleXMLElement - */ - public function groupGetWeeklyTrackChartList($from = NULL, $to = NULL) - { - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&to={$to}"; - } else { - $params = ""; - } - - $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklytrackchart.xml"; - return $this->_getInfo($service, $params); - } - - /** - * Retrieve Weekly album charts. - * - * @param int $from - * @param int $to - * @return SimpleXMLElement - */ - public function groupGetWeeklyAlbumChartList($from = NULL, $to = NULL) - { - if ($from != NULL && $to != NULL) { - $from = (int)$from; - $to = (int)$to; - $params = "from={$from}&to={$to}"; - } else { - $params = ""; - } - - $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklyalbumchart.xml"; - return $this->_getInfo($service, $params); - } - - /** - * Saves the provided error information to this instance - * - * @param integer $errno - * @param string $errstr - * @param string $errfile - * @param integer $errline - * @param array $errcontext - * @return void - */ - public function _errorHandler($errno, $errstr, $errfile, $errline, array $errcontext) - { - $this->_error = array( - 'errno' => $errno, - 'errstr' => $errstr, - 'errfile' => $errfile, - 'errline' => $errline, - 'errcontext' => $errcontext - ); - } - - /** - * Call Intercept for set($name, $field) - * - * @param string $method - * @param array $args - * @return Zend_Service_Audioscrobbler - */ - public function __call($method, $args) - { - if(substr($method, 0, 3) !== "set") { - #require_once "Zend/Service/Exception.php"; - throw new Zend_Service_Exception( - "Method ".$method." does not exist in class Zend_Service_Audioscrobbler." - ); - } - $field = strtolower(substr($method, 3)); - - if(!is_array($args) || count($args) != 1) { - #require_once "Zend/Service/Exception.php"; - throw new Zend_Service_Exception( - "A value is required for setting a parameter field." - ); - } - $this->set($field, $args[0]); - - return $this; - } -} diff --git a/library/Zend/Service/Console/Command.php b/library/Zend/Service/Console/Command.php deleted file mode 100644 index 22135451b9..0000000000 --- a/library/Zend/Service/Console/Command.php +++ /dev/null @@ -1,413 +0,0 @@ -_handler; - } - - /** - * Sets the handler. - * - * @param array $handler - * @return Zend_Service_Console_Command - */ - public function setHandler($handler) - { - $this->_handler = $handler; - return $this; - } - - /** - * Replaces PHP's error handler - * - * @param mixed $errno - * @param mixed $errstr - * @param mixed $errfile - * @param mixed $errline - */ - public static function phpstderr($errno, $errstr, $errfile, $errline) - { - self::stderr($errno . ': Error in ' . $errfile . ':' . $errline . ' - ' . $errstr); - } - - /** - * Replaces PHP's exception handler - * - * @param Exception $exception - */ - public static function phpstdex($exception) - { - self::stderr('Error: ' . $exception->getMessage()); - } - - /** - * Writes output to STDERR, followed by a newline (optional) - * - * @param string $errorMessage - * @param string $newLine - */ - public static function stderr($errorMessage, $newLine = true) - { - if (error_reporting() === 0) { - return; - } - file_put_contents('php://stderr', $errorMessage . ($newLine ? "\r\n" : '')); - } - - /** - * Bootstrap the shell command. - * - * @param array $argv PHP argument values. - */ - public static function bootstrap($argv) - { - // Abort bootstrapping depending on the MICROSOFT_CONSOLE_COMMAND_HOST constant. - if (defined('MICROSOFT_CONSOLE_COMMAND_HOST') && strtolower(MICROSOFT_CONSOLE_COMMAND_HOST) != 'console') { - return; - } - - // Replace error handler - set_error_handler(array('Zend_Service_Console_Command', 'phpstderr')); - set_exception_handler(array('Zend_Service_Console_Command', 'phpstdex')); - - // Build the application model - $model = self::_buildModel(); - - // Find a class that corresponds to the $argv[0] script name - $requiredHandlerName = str_replace('.bat', '', str_replace('.sh', '', str_replace('.php', '', strtolower(basename($argv[0]))))); - $handler = null; - foreach ($model as $possibleHandler) { - if ($possibleHandler->handler == strtolower($requiredHandlerName)) { - $handler = $possibleHandler; - break; - } - } - if (is_null($handler)) { - self::stderr("No class found that implements handler '" . $requiredHandlerName . "'. Create a class that is named '" . $requiredHandlerName . "' and extends Zend_Service_Console_Command or is decorated with a docblock comment '@command-handler " . $requiredHandlerName . "'. Make sure it is loaded either through an autoloader or explicitly using require_once()."); - die(); - } - - // Find a method that matches the command name - $command = null; - foreach ($handler->commands as $possibleCommand) { - if (in_array(strtolower(isset($argv[1]) ? $argv[1] : ''), $possibleCommand->aliases)) { - $command = $possibleCommand; - break; - } - } - if (is_null($command)) { - $commandName = (isset($argv[1]) ? $argv[1] : ''); - self::stderr("No method found that implements command " . $commandName . ". Create a method in class '" . $handler->class . "' that is named '" . strtolower($commandName) . "Command' or is decorated with a docblock comment '@command-name " . $commandName . "'."); - die(); - } - - // Parse parameter values - $parameterValues = array(); - $missingParameterValues = array(); - $parameterInputs = array_splice($argv, 2); - foreach ($command->parameters as $parameter) { - // Default value: null - $value = null; - - // Consult value providers for value. First one wins. - foreach ($parameter->valueproviders as $valueProviderName) { - if (!class_exists($valueProviderName)) { - $valueProviderName = 'Zend_Service_Console_Command_ParameterSource_' . $valueProviderName; - } - $valueProvider = new $valueProviderName(); - - $value = $valueProvider->getValueForParameter($parameter, $parameterInputs); - if (!is_null($value)) { - break; - } - } - if (is_null($value) && $parameter->required) { - $missingParameterValues[] = $parameter->aliases[0]; - } else if (is_null($value)) { - $value = $parameter->defaultvalue; - } - - // Set value - $parameterValues[] = $value; - $argvValues[$parameter->aliases[0]] = $value; - } - - // Mising parameters? - if (count($missingParameterValues) > 0) { - self::stderr("Some parameters are missing:\r\n" . implode("\r\n", $missingParameterValues)); - die(); - } - - // Supply argv in a nice way - $parameterValues['argv'] = $parameterInputs; - - // Run the command - $className = $handler->class; - $classInstance = new $className(); - $classInstance->setHandler($handler); - call_user_func_array(array($classInstance, $command->method), $parameterValues); - - // Restore error handler - restore_exception_handler(); - restore_error_handler(); - } - - /** - * Builds the handler model. - * - * @return array - */ - protected static function _buildModel() - { - $model = array(); - - $classes = get_declared_classes(); - foreach ($classes as $class) { - $type = new ReflectionClass($class); - - $handlers = self::_findValueForDocComment('@command-handler', $type->getDocComment()); - if (count($handlers) == 0 && $type->isSubclassOf('Zend_Service_Console_Command')) { - // Fallback: if the class extends Zend_Service_Console_Command, register it as - // a command handler. - $handlers[] = $class; - } - $handlerDescriptions = self::_findValueForDocComment('@command-handler-description', $type->getDocComment()); - $handlerHeaders = self::_findValueForDocComment('@command-handler-header', $type->getDocComment()); - $handlerFooters = self::_findValueForDocComment('@command-handler-footer', $type->getDocComment()); - - for ($hi = 0; $hi < count($handlers); $hi++) { - $handler = $handlers[$hi]; - $handlerDescription = isset($handlerDescriptions[$hi]) ? $handlerDescriptions[$hi] : isset($handlerDescriptions[0]) ? $handlerDescriptions[0] : ''; - $handlerDescription = str_replace('\r\n', "\r\n", $handlerDescription); - $handlerDescription = str_replace('\n', "\n", $handlerDescription); - - $handlerModel = (object)array( - 'handler' => strtolower($handler), - 'description' => $handlerDescription, - 'headers' => $handlerHeaders, - 'footers' => $handlerFooters, - 'class' => $class, - 'commands' => array() - ); - - $methods = $type->getMethods(); - foreach ($methods as $method) { - $commands = self::_findValueForDocComment('@command-name', $method->getDocComment()); - if (substr($method->getName(), -7) == 'Command' && !in_array(substr($method->getName(), 0, -7), $commands)) { - // Fallback: if the method is named Command, - // register it as a command. - $commands[] = substr($method->getName(), 0, -7); - } - for ($x = 0; $x < count($commands); $x++) { - $commands[$x] = strtolower($commands[$x]); - } - $commands = array_unique($commands); - $commandDescriptions = self::_findValueForDocComment('@command-description', $method->getDocComment()); - $commandExamples = self::_findValueForDocComment('@command-example', $method->getDocComment()); - - if (count($commands) > 0) { - $command = $commands[0]; - $commandDescription = isset($commandDescriptions[0]) ? $commandDescriptions[0] : ''; - - $commandModel = (object)array( - 'command' => $command, - 'aliases' => $commands, - 'description' => $commandDescription, - 'examples' => $commandExamples, - 'class' => $class, - 'method' => $method->getName(), - 'parameters' => array() - ); - - $parameters = $method->getParameters(); - $parametersFor = self::_findValueForDocComment('@command-parameter-for', $method->getDocComment()); - for ($pi = 0; $pi < count($parameters); $pi++) { - // Initialize - $parameter = $parameters[$pi]; - $parameterFor = null; - $parameterForDefaultValue = null; - - // Is it a "catch-all" parameter? - if ($parameter->getName() == 'argv') { - continue; - } - - // Find the $parametersFor with the same name defined - foreach ($parametersFor as $possibleParameterFor) { - $possibleParameterFor = explode(' ', $possibleParameterFor, 4); - if ($possibleParameterFor[0] == '$' . $parameter->getName()) { - $parameterFor = $possibleParameterFor; - break; - } - } - if (is_null($parameterFor)) { - die('@command-parameter-for missing for parameter $' . $parameter->getName()); - } - - if (is_null($parameterForDefaultValue) && $parameter->isOptional()) { - $parameterForDefaultValue = $parameter->getDefaultValue(); - } - - $parameterModel = (object)array( - 'name' => '$' . $parameter->getName(), - 'defaultvalue' => $parameterForDefaultValue, - 'valueproviders' => explode('|', $parameterFor[1]), - 'aliases' => explode('|', $parameterFor[2]), - 'description' => (isset($parameterFor[3]) ? $parameterFor[3] : ''), - 'required' => (isset($parameterFor[3]) ? strpos(strtolower($parameterFor[3]), 'required') !== false && strpos(strtolower($parameterFor[3]), 'required if') === false : false), - ); - - // Add to model - $commandModel->parameters[] = $parameterModel; - } - - // Add to model - $handlerModel->commands[] = $commandModel; - } - } - - // Add to model - $model[] = $handlerModel; - } - } - - return $model; - } - - /** - * Finds the value for a specific docComment. - * - * @param string $docCommentName Comment name - * @param unknown_type $docComment Comment object - * @return array - */ - protected static function _findValueForDocComment($docCommentName, $docComment) - { - $returnValue = array(); - - $commentLines = explode("\n", $docComment); - foreach ($commentLines as $commentLine) { - if (strpos($commentLine, $docCommentName . ' ') !== false) { - $returnValue[] = trim(substr($commentLine, strpos($commentLine, $docCommentName) + strlen($docCommentName) + 1)); - } - } - - return $returnValue; - } - - /** - * Display information on an object - * - * @param object $object Object - * @param array $propertiesToDump Property names to display - */ - protected function _displayObjectInformation($object, $propertiesToDump = array()) - { - foreach ($propertiesToDump as $property) { - printf('%-16s: %s' . "\r\n", $property, $object->$property); - } - printf("\r\n"); - } - - /** - * Displays the help information. - * - * @command-name - * @command-name -h - * @command-name -help - * @command-description Displays the current help information. - */ - public function helpCommand() { - $handler = $this->getHandler(); - $newline = "\r\n"; - - if (count($handler->headers) > 0) { - foreach ($handler->headers as $header) { - printf('%s%s', $header, $newline); - } - printf($newline); - } - printf('%s%s', $handler->description, $newline); - printf($newline); - printf('Available commands:%s', $newline); - foreach ($handler->commands as $command) { - $description = str_split($command->description, 50); - printf(' %-25s %s%s', implode(', ', $command->aliases), $description[0], $newline); - for ($di = 1; $di < count($description); $di++) { - printf(' %-25s %s%s', '', $description[$di], $newline); - } - printf($newline); - - if (count($command->parameters) > 0) { - foreach ($command->parameters as $parameter) { - $description = str_split($parameter->description, 50); - printf(' %-23s %s%s', implode(', ', $parameter->aliases), $description[0], $newline); - for ($di = 1; $di < count($description); $di++) { - printf(' %-23s %s%s', '', $description[$di], $newline); - } - printf($newline); - } - } - printf($newline); - - if (count($command->examples) > 0) { - printf(' Example usage:%s', $newline); - foreach ($command->examples as $example) { - printf(' %s%s', $example, $newline); - } - printf($newline); - } - } - - if (count($handler->footers) > 0) { - printf($newline); - foreach ($handler->footers as $footer) { - printf('%s%s', $footer, $newline); - } - printf($newline); - } - } -} diff --git a/library/Zend/Service/Console/Command/ParameterSource/Argv.php b/library/Zend/Service/Console/Command/ParameterSource/Argv.php deleted file mode 100644 index 010c37ca42..0000000000 --- a/library/Zend/Service/Console/Command/ParameterSource/Argv.php +++ /dev/null @@ -1,71 +0,0 @@ -aliases)) { - $parameterValue = isset($parameterInput[1]) ? $parameterInput[1] : true; - break; - } - } - if (strtolower($parameterValue) == 'true') { - $parameterValue = true; - } else if (strtolower($parameterValue) == 'false') { - $parameterValue = false; - } - - // Done! - return $parameterValue; - } -} diff --git a/library/Zend/Service/Console/Command/ParameterSource/ConfigFile.php b/library/Zend/Service/Console/Command/ParameterSource/ConfigFile.php deleted file mode 100644 index c14d6855f5..0000000000 --- a/library/Zend/Service/Console/Command/ParameterSource/ConfigFile.php +++ /dev/null @@ -1,104 +0,0 @@ -aliases as $alias) { - if (array_key_exists($alias, $iniValues)) { - $parameterValue = $iniValues[$alias]; break; - } else if (array_key_exists(strtolower($alias), $iniValues)) { - $parameterValue = $iniValues[strtolower($alias)]; break; - } else if (array_key_exists(str_replace('-', '', $alias), $iniValues)) { - $parameterValue = $iniValues[str_replace('-', '', $alias)]; break; - } else if (array_key_exists(strtolower(str_replace('-', '', $alias)), $iniValues)) { - $parameterValue = $iniValues[strtolower(str_replace('-', '', $alias))]; break; - } - } - - if (strtolower($parameterValue) == 'true') { - $parameterValue = true; - } else if (strtolower($parameterValue) == 'false') { - $parameterValue = false; - } - - // Done! - return $parameterValue; - } -} diff --git a/library/Zend/Service/Console/Command/ParameterSource/Env.php b/library/Zend/Service/Console/Command/ParameterSource/Env.php deleted file mode 100644 index c7e959e072..0000000000 --- a/library/Zend/Service/Console/Command/ParameterSource/Env.php +++ /dev/null @@ -1,75 +0,0 @@ -aliases as $alias) { - while (strpos($alias, '-') !== false) { - $alias = substr($alias, 1); - } - $value = getenv($alias); - - if (!is_null($value) && $value !== false) { - $parameterValue = $value; - break; - } - } - - if (strtolower($parameterValue) == 'true') { - $parameterValue = true; - } else if (strtolower($parameterValue) == 'false') { - $parameterValue = false; - } - - // Done! - return $parameterValue; - } -} diff --git a/library/Zend/Service/Console/Command/ParameterSource/ParameterSourceInterface.php b/library/Zend/Service/Console/Command/ParameterSource/ParameterSourceInterface.php deleted file mode 100644 index 598204eccd..0000000000 --- a/library/Zend/Service/Console/Command/ParameterSource/ParameterSourceInterface.php +++ /dev/null @@ -1,43 +0,0 @@ -aliases[0] . ": "); - /*if ($parameter->description != '' && !is_null($parameter->description)) { - fwrite(STDOUT, $parameter->description . ".\r\n"); - }*/ - - while (is_null($parameterValue) || $parameterValue == '') { - $parameterValue = trim(fgets(STDIN)); - } - - // Done! - return $parameterValue; - } -} diff --git a/library/Zend/Service/Console/Command/ParameterSource/StdIn.php b/library/Zend/Service/Console/Command/ParameterSource/StdIn.php deleted file mode 100644 index b381ff56fb..0000000000 --- a/library/Zend/Service/Console/Command/ParameterSource/StdIn.php +++ /dev/null @@ -1,81 +0,0 @@ -_rest = new Zend_Rest_Client(); - $this->_rest->getHttpClient()->setConfig(array('ssltransport' => 'ssl')); - $this->setAuth($uname, $pass); - } - - /** - * Set client username and password - * - * @param string $uname Client user name - * @param string $pass Client password - * @return Zend_Service_Delicious Provides a fluent interface - */ - public function setAuth($uname, $pass) - { - $this->_authUname = $uname; - $this->_authPass = $pass; - - return $this; - } - - /** - * Get time of the last update - * - * @throws Zend_Service_Delicious_Exception - * @return Zend_Date - */ - public function getLastUpdate() - { - $response = $this->makeRequest(self::PATH_UPDATE); - - $rootNode = $response->documentElement; - if ($rootNode && $rootNode->nodeName == 'update') { - /** - * @todo replace strtotime() with Zend_Date equivalent - */ - return new Zend_Date(strtotime($rootNode->getAttribute('time'))); - } else { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('del.icio.us web service has returned something odd!'); - } - } - - /** - * Get all tags, returning an array with tags as keys and number of corresponding posts as values - * - * @return array list of tags - */ - public function getTags() - { - $response = $this->makeRequest(self::PATH_TAGS); - - return self::_xmlResponseToArray($response, 'tags', 'tag', 'tag', 'count'); - } - - /** - * Rename a tag - * - * @param string $old Old tag name - * @param string $new New tag name - * @return Zend_Service_Delicious Provides a fluent interface - */ - public function renameTag($old, $new) - { - $response = $this->makeRequest(self::PATH_TAG_RENAME, array('old' => $old, 'new' => $new)); - - self::_evalXmlResult($response); - - return $this; - } - - /** - * Get all bundles, returning an array with bundles as keys and array of tags as values - * - * @return array list of bundles - */ - public function getBundles() - { - $response = $this->makeRequest(self::PATH_BUNDLES); - - $bundles = self::_xmlResponseToArray($response, 'bundles', 'bundle', 'name', 'tags'); - foreach ($bundles as &$tags) { - $tags = explode(' ', $tags); - } - return $bundles; - } - - /** - * Adds a new bundle - * - * @param string $bundle Name of new bundle - * @param array $tags Array of tags - * @return Zend_Service_Delicious Provides a fluent interface - */ - public function addBundle($bundle, array $tags) - { - $tags = implode(' ', (array) $tags); - $response = $this->makeRequest(self::PATH_BUNDLE_ADD, array('bundle' => $bundle, 'tags' => $tags)); - - self::_evalXmlResult($response); - - return $this; - } - - /** - * Delete a bundle - * - * @param string $bundle Name of bundle to be deleted - * @return Zend_Service_Delicious Provides a fluent interface - */ - public function deleteBundle($bundle) - { - $response = $this->makeRequest(self::PATH_BUNDLE_DELETE, array('bundle' => $bundle)); - - self::_evalXmlResult($response); - - return $this; - } - - /** - * Delete a post - * - * @param string $url URL of post to be deleted - * @return Zend_Service_Delicious Provides a fluent interface - */ - public function deletePost($url) - { - $response = $this->makeRequest(self::PATH_POST_DELETE, array('url' => $url)); - - self::_evalXmlResult($response); - - return $this; - } - - /** - * Get number of posts by date - * - * Returns array where keys are dates and values are numbers of posts - * - * @param string $tag Optional filtering by tag - * @return array list of dates - */ - public function getDates($tag = null) - { - $parms = array(); - if ($tag) { - $parms['tag'] = $tag; - } - - $response = $this->makeRequest(self::PATH_DATES, $parms); - - return self::_xmlResponseToArray($response, 'dates', 'date', 'date', 'count'); - } - - /** - * Get posts matching the arguments - * - * If no date or url is given, most recent date will be used - * - * @param string $tag Optional filtering by tag - * @param Zend_Date $dt Optional filtering by date - * @param string $url Optional filtering by url - * @throws Zend_Service_Delicious_Exception - * @return Zend_Service_Delicious_PostList - */ - public function getPosts($tag = null, Zend_Date $dt = null, $url = null) - { - $parms = array(); - if ($tag) { - $parms['tag'] = $tag; - } - if ($url) { - $parms['url'] = $url; - } - if ($dt) { - $parms['dt'] = $dt->get('Y-m-d\TH:i:s\Z'); - } - - $response = $this->makeRequest(self::PATH_POSTS_GET, $parms); - - return $this->_parseXmlPostList($response); - } - - /** - * Get all posts - * - * @param string $tag Optional filtering by tag - * @return Zend_Service_Delicious_PostList - */ - public function getAllPosts($tag = null) - { - $parms = array(); - if ($tag) { - $parms['tag'] = $tag; - } - - $response = $this->makeRequest(self::PATH_POSTS_ALL, $parms); - - return $this->_parseXmlPostList($response); - } - - /** - * Get recent posts - * - * @param string $tag Optional filtering by tag - * @param string $count Maximum number of posts to be returned (default 15) - * @return Zend_Service_Delicious_PostList - */ - public function getRecentPosts($tag = null, $count = 15) - { - $parms = array(); - if ($tag) { - $parms['tag'] = $tag; - } - if ($count) { - $parms['count'] = $count; - } - - $response = $this->makeRequest(self::PATH_POSTS_RECENT, $parms); - - return $this->_parseXmlPostList($response); - } - - /** - * Create new post - * - * @return Zend_Service_Delicious_Post - */ - public function createNewPost($title, $url) - { - return new Zend_Service_Delicious_Post($this, array('title' => $title, 'url' => $url)); - } - - /** - * Get posts of a user - * - * @param string $user Owner of the posts - * @param int $count Number of posts (default 15, max. 100) - * @param string $tag Optional filtering by tag - * @return Zend_Service_Delicious_PostList - */ - public function getUserPosts($user, $count = null, $tag = null) - { - $parms = array(); - if ($count) { - $parms['count'] = $count; - } - - $path = sprintf(self::JSON_POSTS, $user, $tag); - $res = $this->makeRequest($path, $parms, 'json'); - - return new Zend_Service_Delicious_PostList($this, $res); - } - - /** - * Get tags of a user - * - * Returned array has tags as keys and number of posts as values - * - * @param string $user Owner of the posts - * @param int $atleast Include only tags for which there are at least ### number of posts - * @param int $count Number of tags to get (default all) - * @param string $sort Order of returned tags ('alpha' || 'count') - * @return array - */ - public function getUserTags($user, $atleast = null, $count = null, $sort = 'alpha') - { - $parms = array(); - if ($atleast) { - $parms['atleast'] = $atleast; - } - if ($count) { - $parms['count'] = $count; - } - if ($sort) { - $parms['sort'] = $sort; - } - - $path = sprintf(self::JSON_TAGS, $user); - - return $this->makeRequest($path, $parms, 'json'); - } - - /** - * Get network of a user - * - * @param string $user Owner of the network - * @return array - */ - public function getUserNetwork($user) - { - $path = sprintf(self::JSON_NETWORK, $user); - return $this->makeRequest($path, array(), 'json'); - } - - /** - * Get fans of a user - * - * @param string $user Owner of the fans - * @return array - */ - public function getUserFans($user) - { - $path = sprintf(self::JSON_FANS, $user); - return $this->makeRequest($path, array(), 'json'); - } - - /** - * Get details on a particular bookmarked URL - * - * Returned array contains four elements: - * - hash - md5 hash of URL - * - top_tags - array of tags and their respective usage counts - * - url - URL for which details were returned - * - total_posts - number of users that have bookmarked URL - * - * If URL hasen't been bookmarked null is returned. - * - * @param string $url URL for which to get details - * @return array - */ - public function getUrlDetails($url) - { - $parms = array('hash' => md5($url)); - - $res = $this->makeRequest(self::JSON_URL, $parms, 'json'); - - if(isset($res[0])) { - return $res[0]; - } else { - return null; - } - } - - /** - * Handles all GET requests to a web service - * - * @param string $path Path - * @param array $parms Array of GET parameters - * @param string $type Type of a request ("xml"|"json") - * @return mixed decoded response from web service - * @throws Zend_Service_Delicious_Exception - */ - public function makeRequest($path, array $parms = array(), $type = 'xml') - { - // if previous request was made less then 1 sec ago - // wait until we can make a new request - $timeDiff = microtime(true) - self::$_lastRequestTime; - if ($timeDiff < 1) { - usleep((1 - $timeDiff) * 1000000); - } - - $this->_rest->getHttpClient()->setAuth($this->_authUname, $this->_authPass); - - switch ($type) { - case 'xml': - $this->_rest->setUri(self::API_URI); - break; - case 'json': - $parms['raw'] = true; - $this->_rest->setUri(self::JSON_URI); - break; - default: - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('Unknown request type'); - } - - self::$_lastRequestTime = microtime(true); - $response = $this->_rest->restGet($path, $parms); - - if (!$response->isSuccessful()) { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception("Http client reported an error: '{$response->getMessage()}'"); - } - - $responseBody = $response->getBody(); - - switch ($type) { - case 'xml': - $dom = new DOMDocument() ; - - if (!$dom = @Zend_Xml_Security::scan($responseBody, $dom)) { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('XML Error'); - } - - return $dom; - case 'json': - return Zend_Json_Decoder::decode($responseBody); - } - } - - /** - * Transform XML string to array - * - * @param DOMDocument $response - * @param string $root Name of root tag - * @param string $child Name of children tags - * @param string $attKey Attribute of child tag to be used as a key - * @param string $attValue Attribute of child tag to be used as a value - * @return array - * @throws Zend_Service_Delicious_Exception - */ - private static function _xmlResponseToArray(DOMDocument $response, $root, $child, $attKey, $attValue) - { - $rootNode = $response->documentElement; - $arrOut = array(); - - if ($rootNode->nodeName == $root) { - $childNodes = $rootNode->childNodes; - - for ($i = 0; $i < $childNodes->length; $i++) { - $currentNode = $childNodes->item($i); - if ($currentNode->nodeName == $child) { - $arrOut[$currentNode->getAttribute($attKey)] = $currentNode->getAttribute($attValue); - } - } - } else { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('del.icio.us web service has returned something odd!'); - } - - return $arrOut; - } - - /** - * Constructs Zend_Service_Delicious_PostList from XML response - * - * @param DOMDocument $response - * @return Zend_Service_Delicious_PostList - * @throws Zend_Service_Delicious_Exception - */ - private function _parseXmlPostList(DOMDocument $response) - { - $rootNode = $response->documentElement; - - if ($rootNode->nodeName == 'posts') { - return new Zend_Service_Delicious_PostList($this, $rootNode->childNodes); - } else { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('del.icio.us web service has returned something odd!'); - } - } - - /** - * Evaluates XML response - * - * @param DOMDocument $response - * @return void - * @throws Zend_Service_Delicious_Exception - */ - private static function _evalXmlResult(DOMDocument $response) - { - $rootNode = $response->documentElement; - - if ($rootNode && $rootNode->nodeName == 'result') { - - if ($rootNode->hasAttribute('code')) { - $strResponse = $rootNode->getAttribute('code'); - } else { - $strResponse = $rootNode->nodeValue; - } - - if ($strResponse != 'done' && $strResponse != 'ok') { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception("del.icio.us web service: '{$strResponse}'"); - } - } else { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('del.icio.us web service has returned something odd!'); - } - } -} diff --git a/library/Zend/Service/Delicious/Exception.php b/library/Zend/Service/Delicious/Exception.php deleted file mode 100644 index 3e38b2de0c..0000000000 --- a/library/Zend/Service/Delicious/Exception.php +++ /dev/null @@ -1,39 +0,0 @@ -_service = $service; - - if ($values instanceof DOMElement) { - $values = self::_parsePostNode($values); - } - - if (!is_array($values) || !isset($values['url']) || !isset($values['title'])) { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception("Second argument must be array with at least 2 keys ('url' and" - . " 'title')"); - } - - if (isset($values['date']) && ! $values['date'] instanceof Zend_Date) { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception("Date has to be an instance of Zend_Date"); - } - - foreach (array('url', 'title', 'notes', 'others', 'tags', 'date', 'shared', 'hash') as $key) { - if (isset($values[$key])) { - $this->{"_$key"} = $values[$key]; - } - } - } - - /** - * Setter for title - * - * @param string $newTitle - * @return Zend_Service_Delicious_Post - */ - public function setTitle($newTitle) - { - $this->_title = (string) $newTitle; - - return $this; - } - - /** - * Setter for notes - * - * @param string $newNotes - * @return Zend_Service_Delicious_Post - */ - public function setNotes($newNotes) - { - $this->_notes = (string) $newNotes; - - return $this; - } - - /** - * Setter for tags - * - * @param array $tags - * @return Zend_Service_Delicious_Post - */ - public function setTags(array $tags) - { - $this->_tags = $tags; - - return $this; - } - - /** - * Add a tag - * - * @param string $tag - * @return Zend_Service_Delicious_Post - */ - public function addTag($tag) - { - $this->_tags[] = (string) $tag; - - return $this; - } - - /** - * Remove a tag - * - * @param string $tag - * @return Zend_Service_Delicious_Post - */ - public function removeTag($tag) - { - $this->_tags = array_diff($this->_tags, array((string) $tag)); - - return $this; - } - - /** - * Getter for date - * - * @return Zend_Date - */ - public function getDate() - { - return $this->_date; - } - - /** - * Getter for others - * - * This property is only populated when posts are retrieved - * with getPosts() method. The getAllPosts() and getRecentPosts() - * methods will not populate this property. - * - * @return int - */ - public function getOthers() - { - return $this->_others; - } - - /** - * Getter for hash - * - * @return string - */ - public function getHash() - { - return $this->_hash; - } - - /** - * Getter for shared - * - * @return bool - */ - public function getShared() - { - return $this->_shared; - } - - /** - * Setter for shared - * - * @param bool $isShared - * @return Zend_Service_Delicious_Post - */ - public function setShared($isShared) - { - $this->_shared = (bool) $isShared; - - return $this; - } - - /** - * Deletes post - * - * @return Zend_Service_Delicious - */ - public function delete() - { - return $this->_service->deletePost($this->_url); - } - - /** - * Saves post - * - * @return DOMDocument - */ - public function save() - { - $parms = array( - 'url' => $this->_url, - 'description'=> $this->_title, - 'extended' => $this->_notes, - 'shared' => ($this->_shared ? 'yes' : 'no'), - 'tags' => implode(' ', (array) $this->_tags), - 'replace' => 'yes' - ); - /* - if ($this->_date instanceof Zend_Date) { - $parms['dt'] = $this->_date->get('Y-m-d\TH:i:s\Z'); - } - */ - - return $this->_service->makeRequest(Zend_Service_Delicious::PATH_POSTS_ADD, $parms); - } - - /** - * Extracts content from the DOM element of a post - * - * @param DOMElement $node - * @return array - */ - protected static function _parsePostNode(DOMElement $node) - { - return array( - 'url' => $node->getAttribute('href'), - 'title' => $node->getAttribute('description'), - 'notes' => $node->getAttribute('extended'), - 'others' => (int) $node->getAttribute('others'), - 'tags' => explode(' ', $node->getAttribute('tag')), - /** - * @todo replace strtotime() with Zend_Date equivalent - */ - 'date' => new Zend_Date(strtotime($node->getAttribute('time'))), - 'shared' => ($node->getAttribute('shared') == 'no' ? false : true), - 'hash' => $node->getAttribute('hash') - ); - } -} diff --git a/library/Zend/Service/Delicious/PostList.php b/library/Zend/Service/Delicious/PostList.php deleted file mode 100644 index 23906fad43..0000000000 --- a/library/Zend/Service/Delicious/PostList.php +++ /dev/null @@ -1,300 +0,0 @@ -_service = $service; - if ($posts instanceof DOMNodeList) { - $this->_constructFromNodeList($posts); - } else if (is_array($posts)) { - $this->_constructFromArray($posts); - } - } - - /** - * Transforms DOMNodeList to array of posts - * - * @param DOMNodeList $nodeList - * @return void - */ - private function _constructFromNodeList(DOMNodeList $nodeList) - { - for ($i = 0; $i < $nodeList->length; $i++) { - $curentNode = $nodeList->item($i); - if($curentNode->nodeName == 'post') { - $this->_addPost(new Zend_Service_Delicious_Post($this->_service, $curentNode)); - } - } - } - - /** - * Transforms the Array to array of posts - * - * @param array $postList - * @return void - */ - private function _constructFromArray(array $postList) - { - foreach ($postList as $f_post) { - $this->_addPost(new Zend_Service_Delicious_SimplePost($f_post)); - } - } - - /** - * Add a post - * - * @param Zend_Service_Delicious_SimplePost $post - * @return Zend_Service_Delicious_PostList - */ - protected function _addPost(Zend_Service_Delicious_SimplePost $post) - { - $this->_posts[] = $post; - - return $this; - } - - /** - * Filter list by list of tags - * - * @param array $tags - * @return Zend_Service_Delicious_PostList - */ - public function withTags(array $tags) - { - $postList = new self($this->_service); - - foreach ($this->_posts as $post) { - if (count(array_diff($tags, $post->getTags())) == 0) { - $postList->_addPost($post); - } - } - - return $postList; - } - - /** - * Filter list by tag - * - * @param string $tag - * @return Zend_Service_Delicious_PostList - */ - public function withTag($tag) - { - return $this->withTags(func_get_args()); - } - - /** - * Filter list by urls matching a regular expression - * - * @param string $regexp - * @return Zend_Service_Delicious_PostList - */ - public function withUrl($regexp) - { - $postList = new self($this->_service); - - foreach ($this->_posts as $post) { - if (preg_match($regexp, $post->getUrl())) { - $postList->_addPost($post); - } - } - - return $postList; - } - - /** - * Return number of posts - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->_posts); - } - - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Delicious_SimplePost - */ - public function current() - { - return $this->_posts[$this->_iteratorKey]; - } - - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->_iteratorKey; - } - - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->_iteratorKey += 1; - } - - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->_iteratorKey = 0; - } - - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return bool - */ - public function valid() - { - $numItems = $this->count(); - - if ($numItems > 0 && $this->_iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws OutOfBoundsException - * @return Zend_Service_Delicious_SimplePost - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->_posts[$offset]; - } else { - throw new OutOfBoundsException('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Delicious_Exception - */ - public function offsetSet($offset, $value) - { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Delicious_Exception - */ - public function offsetUnset($offset) - { - /** - * @see Zend_Service_Delicious_Exception - */ - #require_once 'Zend/Service/Delicious/Exception.php'; - throw new Zend_Service_Delicious_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/Delicious/SimplePost.php b/library/Zend/Service/Delicious/SimplePost.php deleted file mode 100644 index 1054eae2bf..0000000000 --- a/library/Zend/Service/Delicious/SimplePost.php +++ /dev/null @@ -1,123 +0,0 @@ -_url = $post['u']; - $this->_title = $post['d']; - - if (isset($post['t'])) { - $this->_tags = $post['t']; - } - if (isset($post['n'])) { - $this->_notes = $post['n']; - } - } - - /** - * Getter for URL - * - * @return string - */ - public function getUrl() - { - return $this->_url; - } - - /** - * Getter for title - * - * @return string - */ - public function getTitle() - { - return $this->_title; - } - - /** - * Getter for notes - * - * @return string - */ - public function getNotes() - { - return $this->_notes; - } - - /** - * Getter for tags - * - * @return array - */ - public function getTags() - { - return $this->_tags; - } -} diff --git a/library/Zend/Service/Ebay/Abstract.php b/library/Zend/Service/Ebay/Abstract.php deleted file mode 100644 index 4def6c7741..0000000000 --- a/library/Zend/Service/Ebay/Abstract.php +++ /dev/null @@ -1,309 +0,0 @@ -setOption($options); - } - - /** - * @param string|Zend_Config|array $name - * @param mixed $value - * @return Zend_Service_Ebay_Abstract Provides a fluent interface - */ - public function setOption($name, $value = null) - { - if ($name instanceof Zend_Config) { - $name = $name->toArray(); - } - if (is_array($name)) { - $this->_options = $name + $this->_options; - } else { - $this->_options[$name] = $value; - } - return $this; - } - - /** - * @param string $name - * @return mixed - */ - public function getOption($name = null) - { - if (null === $name) { - return $this->_options; - } - if ($this->hasOption($name)) { - return $this->_options[$name]; - } - return null; - } - - /** - * @param string $name - * @return boolean - */ - public function hasOption($name) - { - return array_key_exists($name, $this->_options); - } - - /** - * @param mixed $client - * @return Zend_Service_Ebay_Abstract Provides a fluent interface - */ - abstract public function setClient($client); - - /** - * @return mixed - */ - abstract public function getClient(); - - /** - * @param Zend_Config|array $options - * @throws Zend_Service_Ebay_Finding_Exception When $options is not an array neither a Zend_Config object - * @return array - */ - public static function optionsToArray($options) - { - if (null === $options) { - $options = array(); - } else if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } - - if (!is_array($options)) { - /** - * @see Zend_Service_Ebay_Exception - */ - #require_once 'Zend/Service/Ebay/Exception.php'; - throw new Zend_Service_Ebay_Exception('Invalid options provided.'); - } - - return $options; - } - - /** - * Implements Name-value Syntax translator. - * - * Example: - * - * array( - * 'paginationInput' => array( - * 'entriesPerPage' => 5, - * 'pageNumber' => 2 - * ), - * 'itemFilter' => array( - * array( - * 'name' => 'MaxPrice', - * 'value' => 25, - * 'paramName' => 'Currency', - * 'paramValue' => 'USD' - * ), - * array( - * 'name' => 'FreeShippingOnly', - * 'value' => true - * ), - * array( - * 'name' => 'ListingType', - * 'value' => array( - * 'AuctionWithBIN', - * 'FixedPrice', - * 'StoreInventory' - * ) - * ) - * ), - * 'productId' => array( - * '' => 123, - * 'type' => 'UPC' - * ) - * ) - * - * this above is translated to - * - * array( - * 'paginationInput.entriesPerPage' => '5', - * 'paginationInput.pageNumber' => '2', - * 'itemFilter(0).name' => 'MaxPrice', - * 'itemFilter(0).value' => '25', - * 'itemFilter(0).paramName' => 'Currency', - * 'itemFilter(0).paramValue' => 'USD', - * 'itemFilter(1).name' => 'FreeShippingOnly', - * 'itemFilter(1).value' => '1', - * 'itemFilter(2).name' => 'ListingType', - * 'itemFilter(2).value(0)' => 'AuctionWithBIN', - * 'itemFilter(2).value(1)' => 'FixedPrice', - * 'itemFilter(2).value(2)' => 'StoreInventory', - * 'productId' => '123', - * 'productId.@type' => 'UPC' - * ) - * - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#nvsyntax - * @return array A simple array of strings - */ - protected function _optionsToNameValueSyntax($options) - { - $options = self::optionsToArray($options); - ksort($options); - $new = array(); - $runAgain = false; - foreach ($options as $name => $value) { - if (is_array($value)) { - // parse an array value, check if it is associative - $keyRaw = array_keys($value); - $keyNumber = range(0, count($value) - 1); - $isAssoc = count(array_diff($keyRaw, $keyNumber)) > 0; - // check for tag representation, like - // empty key refers to text value - // when there is a root tag, attributes receive flags - $hasAttribute = array_key_exists('', $value); - foreach ($value as $subName => $subValue) { - // generate new key name - if ($isAssoc) { - // named keys - $newName = $name; - if ($subName !== '') { - // when $subName is empty means that current value - // is the main value for the main key - $glue = $hasAttribute ? '.@' : '.'; - $newName .= $glue . $subName; - } - } else { - // numeric keys - $newName = $name . '(' . $subName . ')'; - } - // save value - if (is_array($subValue)) { - // it is necessary run this again, value is an array - $runAgain = true; - } else { - // parse basic type - $subValue = self::toEbayValue($subValue); - } - $new[$newName] = $subValue; - } - } else { - // parse basic type - $new[$name] = self::toEbayValue($value); - } - } - if ($runAgain) { - // this happens if any $subValue found is an array - $new = $this->_optionsToNameValueSyntax($new); - } - return $new; - } - - /** - * Translate native PHP values format to ebay format for request. - * - * Boolean is translated to "0" or "1", date object generates ISO 8601, - * everything else is translated to string. - * - * @param mixed $value - * @return string - */ - public static function toEbayValue($value) - { - if (is_bool($value)) { - $value = $value ? '1' : '0'; - } else if ($value instanceof Zend_Date) { - $value = $value->getIso(); - } else if ($value instanceof DateTime) { - $value = $value->format(DateTime::ISO8601); - } else { - $value = (string) $value; - } - return $value; - } - - /** - * Translate an ebay value format to native PHP type. - * - * @param string $value - * @param string $type - * @see http://developer.ebay.com/DevZone/finding/CallRef/types/simpleTypes.html - * @throws Zend_Service_Ebay_Finding_Exception When $type is not valid - * @return mixed - */ - public static function toPhpValue($value, $type) - { - switch ($type) { - // cast for: boolean - case 'boolean': - $value = (string) $value == 'true'; - break; - - // cast for: Amount, decimal, double, float, MeasureType - case 'float': - $value = floatval((string) $value); - break; - - // cast for: int, long - // integer type generates a string value, because 32 bit systems - // have an integer range of -2147483648 to 2147483647 - case 'integer': - // break intentionally omitted - - // cast for: anyURI, base64Binary, dateTime, duration, string, token - case 'string': - $value = (string) $value; - break; - - default: - /** - * @see Zend_Service_Ebay_Exception - */ - #require_once 'Zend/Service/Ebay/Exception.php'; - throw new Zend_Service_Ebay_Exception("Invalid type '{$type}'."); - } - return $value; - } -} diff --git a/library/Zend/Service/Ebay/Exception.php b/library/Zend/Service/Ebay/Exception.php deleted file mode 100644 index 19348c92dd..0000000000 --- a/library/Zend/Service/Ebay/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ - 'http://www.ebay.com/marketplace/search/v1/services', - self::XMLNS_MS => 'http://www.ebay.com/marketplace/services' - ); - - /** - * - * @var array - */ - protected $_options = array( - self::OPTION_GLOBAL_ID => 'EBAY-US' - ); - - /** - * @return array - */ - public static function getXmlNamespaces() - { - return self::$_xmlNamespaces; - } - - /** - * @param Zend_Config|array|string $options Application Id or array of options - * @throws Zend_Service_Ebay_Finding_Exception When application id is missing - * @return void - */ - public function __construct($options) - { - // prepare options - if (is_string($options)) { - // application id was given - $options = array(self::OPTION_APP_ID => $options); - } else { - // check application id - $options = parent::optionsToArray($options); - if (!array_key_exists(self::OPTION_APP_ID, $options)) { - /** - * @see Zend_Service_Ebay_Finding_Exception - */ - #require_once 'Zend/Service/Ebay/Finding/Exception.php'; - throw new Zend_Service_Ebay_Finding_Exception( - 'Application Id is missing.'); - } - } - - // load options - parent::setOption($options); - } - - /** - * @param Zend_Rest_Client $client - * @return Zend_Service_Ebay_Finding Provides a fluent interface - */ - public function setClient($client) - { - if (!$client instanceof Zend_Rest_Client) { - /** - * @see Zend_Service_Ebay_Finding_Exception - */ - #require_once 'Zend/Service/Ebay/Finding/Exception.php'; - throw new Zend_Service_Ebay_Finding_Exception( - 'Client object must extend Zend_Rest_Client.'); - } - $this->_client = $client; - - return $this; - } - - /** - * @return Zend_Rest_Client - */ - public function getClient() - { - if (!$this->_client instanceof Zend_Rest_Client) { - /** - * @see Zend_Rest_Client - */ - #require_once 'Zend/Rest/Client.php'; - $this->_client = new Zend_Rest_Client(); - } - return $this->_client; - } - - /** - * Finds items by a keyword query and/or category and allows searching - * within item descriptions. - * - * @param string $keywords - * @param boolean $descriptionSearch - * @param integer $categoryId - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/findItemsAdvanced.html - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsAdvanced($keywords, $descriptionSearch = true, $categoryId = null, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['keywords'] = $keywords; - $options['descriptionSearch'] = $descriptionSearch; - if (!empty($categoryId)) { - $options['categoryId'] = $categoryId; - } - - // do request - return $this->_findItems($options, 'findItemsAdvanced'); - } - - /** - * Finds items in a specific category. Results can be filtered and sorted. - * - * @param integer $categoryId - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/findItemsByCategory.html - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsByCategory($categoryId, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['categoryId'] = $categoryId; - - // do request - return $this->_findItems($options, 'findItemsByCategory'); - } - - /** - * Finds items on eBay based upon a keyword query and returns details for - * matching items. - * - * @param string $keywords - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/findItemsByKeywords.html - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsByKeywords($keywords, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['keywords'] = $keywords; - - // do request - return $this->_findItems($options, 'findItemsByKeywords'); - } - - /** - * Finds items based upon a product ID, such as an ISBN, UPC, EAN, or ePID. - * - * @param integer $productId - * @param string $productIdType Default value is ReferenceID - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/findItemsByProduct.html - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsByProduct($productId, $productIdType = null, $options = null) - { - if (null == $productIdType) { - $productIdType = 'ReferenceID'; - } - - // prepare options - $options = parent::optionsToArray($options); - $options['productId'] = array('' => $productId, - 'type' => $productIdType); - - // do request - return $this->_findItems($options, 'findItemsByProduct'); - } - - /** - * Finds items in eBay stores. Can search a specific store or can search all - * stores with a keyword query. - * - * @param string $storeName - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/findItemsIneBayStores.html - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsInEbayStores($storeName, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['storeName'] = $storeName; - - // do request - return $this->_findItems($options, 'findItemsIneBayStores'); - } - - /** - * @param array $options - * @param string $operation - * @return Zend_Service_Ebay_Finding_Response_Items - */ - protected function _findItems(array $options, $operation) - { - // set default output selector value - if (!array_key_exists('outputSelector', $options)) { - $options['outputSelector'] = array('AspectHistogram', - 'CategoryHistogram', - 'SellerInfo', - 'StoreInfo'); - } - - // do request - $dom = $this->_request($operation, $options); - - /** - * @see Zend_Service_Ebay_Finding_Response_Items - */ - #require_once 'Zend/Service/Ebay/Finding/Response/Items.php'; - $response = new Zend_Service_Ebay_Finding_Response_Items($dom->firstChild); - return $response->setOperation($operation) - ->setOption($options); - } - - /** - * Gets category and/or aspect metadata for the specified category. - * - * @param integer $categoryId - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/getHistograms.html - * @return Zend_Service_Ebay_Finding_Response_Histograms - */ - public function getHistograms($categoryId, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['categoryId'] = $categoryId; - - // do request - $operation = 'getHistograms'; - $dom = $this->_request($operation, $options); - - /** - * @see Zend_Service_Ebay_Finding_Response_Histograms - */ - #require_once 'Zend/Service/Ebay/Finding/Response/Histograms.php'; - $response = new Zend_Service_Ebay_Finding_Response_Histograms($dom->firstChild); - return $response->setOperation($operation) - ->setOption($options); - } - - /** - * Checks specified keywords and returns correctly spelled keywords for best - * search results. - * - * @param string $keywords - * @param Zend_Config|array $options - * @link http://developer.ebay.com/DevZone/finding/CallRef/getSearchKeywordsRecommendation.html - * @return Zend_Service_Ebay_Finding_Response_Keywords - */ - public function getSearchKeywordsRecommendation($keywords, $options = null) - { - // prepare options - $options = parent::optionsToArray($options); - $options['keywords'] = $keywords; - - // do request - $operation = 'getSearchKeywordsRecommendation'; - $dom = $this->_request($operation, $options); - - /** - * @see Zend_Service_Ebay_Finding_Response_Keywords - */ - #require_once 'Zend/Service/Ebay/Finding/Response/Keywords.php'; - $response = new Zend_Service_Ebay_Finding_Response_Keywords($dom->firstChild); - return $response->setOperation($operation) - ->setOption($options); - } - - /** - * @param string $operation - * @param array $options - * @link http://developer.ebay.com/DevZone/finding/Concepts/MakingACall.html#StandardURLParameters - * @return DOMDocument - */ - protected function _request($operation, array $options = null) - { - // generate default options - // constructor load global-id and application-id values - $default = array('OPERATION-NAME' => $operation, - 'SERVICE-NAME' => self::SERVICE_NAME, - 'SERVICE-VERSION' => self::SERVICE_VERSION, - 'GLOBAL-ID' => $this->getOption(self::OPTION_GLOBAL_ID), - 'SECURITY-APPNAME' => $this->getOption(self::OPTION_APP_ID), - 'RESPONSE-DATA-FORMAT' => self::RESPONSE_DATA_FORMAT, - 'REST-PAYLOAD' => ''); - - // prepare options to ebay syntax - $options = $default + $this->_optionsToNameValueSyntax($options); - - // do request - $client = $this->getClient(); - $client->getHttpClient()->resetParameters(); - $response = $client->setUri(self::ENDPOINT_URI) - ->restGet(self::ENDPOINT_PATH, $options); - - return $this->_parseResponse($response); - } - - /** - * Search for error from request. - * - * If any error is found a DOMDocument is returned, this object contains a - * DOMXPath object as "ebayFindingXPath" attribute. - * - * @param Zend_Http_Response $response - * @link http://developer.ebay.com/DevZone/finding/CallRef/types/ErrorSeverity.html - * @see Zend_Service_Ebay_Finding_Abstract::_initXPath() - * @throws Zend_Service_Ebay_Finding_Exception When any error occurrs during request - * @return DOMDocument - */ - protected function _parseResponse(Zend_Http_Response $response) - { - // error message - $message = ''; - - // first trying, loading XML - $dom = new DOMDocument(); - if (!$dom = @Zend_Xml_Security::scan($response->getBody(), $dom)) { - $message = 'It was not possible to load XML returned.'; - } - - // second trying, check request status - if ($response->isError()) { - $message = $response->getMessage() - . ' (HTTP status code #' . $response->getStatus() . ')'; - } - - // third trying, search for error message into XML response - // only first error that contains severiry=Error is read - $xpath = new DOMXPath($dom); - foreach (self::$_xmlNamespaces as $alias => $uri) { - $xpath->registerNamespace($alias, $uri); - } - $ns = self::XMLNS_FINDING; - $nsMs = self::XMLNS_MS; - $expression = "//$nsMs:errorMessage[1]/$ns:error/$ns:severity[.='Error']"; - $severityNode = $xpath->query($expression)->item(0); - if ($severityNode) { - $errorNode = $severityNode->parentNode; - // ebay message - $messageNode = $xpath->query("//$ns:message[1]", $errorNode)->item(0); - if ($messageNode) { - $message = 'eBay error: ' . $messageNode->nodeValue; - } else { - $message = 'eBay error: unknown'; - } - // ebay error id - $errorIdNode = $xpath->query("//$ns:errorId[1]", $errorNode)->item(0); - if ($errorIdNode) { - $message .= ' (#' . $errorIdNode->nodeValue . ')'; - } - } - - // throw exception when an error was detected - if (strlen($message) > 0) { - /** - * @see Zend_Service_Ebay_Finding_Exception - */ - #require_once 'Zend/Service/Ebay/Finding/Exception.php'; - throw new Zend_Service_Ebay_Finding_Exception($message); - } - - // add xpath to dom document - // it allows service_ebay_finding classes use this - $dom->ebayFindingXPath = $xpath; - - return $dom; - } -} diff --git a/library/Zend/Service/Ebay/Finding/Abstract.php b/library/Zend/Service/Ebay/Finding/Abstract.php deleted file mode 100644 index 2b568cc754..0000000000 --- a/library/Zend/Service/Ebay/Finding/Abstract.php +++ /dev/null @@ -1,169 +0,0 @@ -_dom = $dom; - $this->_initXPath(); - $this->_init(); - } - - /** - * @param string $tag - * @param string $attribute - * @return mixed - */ - public function attributes($tag, $attribute = null) - { - if (null === $attribute) { - // all attributes - if (array_key_exists($tag, $this->_attributes)) { - return $this->_attributes[$tag]; - } - return array(); - } - - // a specific attribute - if (isset($this->_attributes[$tag][$attribute])) { - return $this->_attributes[$tag][$attribute]; - } - return null; - } - - /** - * Initialize object. - * - * Post construct logic, classes must read their members here. Called from - * {@link __construct()} as final step of object initialization. - * - * @return void - */ - protected function _init() - { - } - - /** - * Load DOMXPath for current DOM object. - * - * @see Zend_Service_Ebay_Finding::_parseResponse() - * @return void - */ - protected function _initXPath() - { - $document = $this->_dom->ownerDocument; - if (!isset($document->ebayFindingXPath)) { - $xpath = new DOMXPath($document); - foreach (Zend_Service_Ebay_Finding::getXmlNamespaces() as $alias => $uri) { - $xpath->registerNamespace($alias, $uri); - } - $document->ebayFindingXPath = $xpath; - } - $this->_xPath = $document->ebayFindingXPath; - } - - /** - * @return DOMElement - */ - public function getDom() - { - return $this->_dom; - } - - /** - * @return DOMXPath - */ - public function getXPath() - { - return $this->_xPath; - } - - /** - * @param string $path - * @param string $type - * @param string $array When true means it expects more than one node occurence - * @return mixed - */ - protected function _query($path, $type, $array = false) - { - // find values - $values = array(); - $nodes = $this->_xPath->query($path, $this->_dom); - foreach ($nodes as $node) { - $value = (string) $node->nodeValue; - $values[] = Zend_Service_Ebay_Abstract::toPhpValue($value, $type); - if (!$array) { - break; - } - } - - // array - if ($array) { - return $values; - } - - // single value - if (count($values)) { - return reset($values); - } - - // no nodes fount - return null; - } -} diff --git a/library/Zend/Service/Ebay/Finding/Aspect.php b/library/Zend/Service/Ebay/Finding/Aspect.php deleted file mode 100644 index 804e15c64c..0000000000 --- a/library/Zend/Service/Ebay/Finding/Aspect.php +++ /dev/null @@ -1,68 +0,0 @@ -_attributes['valueHistogram'] = array( - 'valueName' => $this->_query(".//$ns:valueHistogram/@valueName", 'string', true) - ); - - $nodes = $this->_xPath->query(".//$ns:valueHistogram", $this->_dom); - if ($nodes->length > 0) { - /** - * @see Zend_Service_Ebay_Finding_Aspect_Histogram_Value_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Aspect/Histogram/Value/Set.php'; - $this->valueHistogram = new Zend_Service_Ebay_Finding_Aspect_Histogram_Value_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Container.php b/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Container.php deleted file mode 100644 index 65fa07897a..0000000000 --- a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Container.php +++ /dev/null @@ -1,106 +0,0 @@ -domainDisplayName = $this->_query(".//$ns:domainDisplayName[1]", 'string'); - $this->domainName = $this->_query(".//$ns:domainName[1]", 'string'); - - $this->_attributes['aspect'] = array( - 'name' => $this->_query(".//$ns:aspect/@name", 'string', true) - ); - - $nodes = $this->_xPath->query(".//$ns:aspect", $this->_dom); - if ($nodes->length > 0) { - /** - * @see Zend_Service_Ebay_Finding_Aspect_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Aspect/Set.php'; - $this->aspect = new Zend_Service_Ebay_Finding_Aspect_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value.php b/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value.php deleted file mode 100644 index 5e381785b8..0000000000 --- a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value.php +++ /dev/null @@ -1,56 +0,0 @@ -count = $this->_query(".//$ns:count[1]", 'integer'); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value/Set.php b/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value/Set.php deleted file mode 100644 index 4ed5e3079b..0000000000 --- a/library/Zend/Service/Ebay/Finding/Aspect/Histogram/Value/Set.php +++ /dev/null @@ -1,57 +0,0 @@ -_nodes->item($this->_key); - if (!$node) { - return null; - } - - /** - * @see Zend_Service_Ebay_Finding_Aspect_Histogram_Value - */ - #require_once 'Zend/Service/Ebay/Finding/Aspect/Histogram/Value.php'; - return new Zend_Service_Ebay_Finding_Aspect_Histogram_Value($node); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Aspect/Set.php b/library/Zend/Service/Ebay/Finding/Aspect/Set.php deleted file mode 100644 index bc94882b4b..0000000000 --- a/library/Zend/Service/Ebay/Finding/Aspect/Set.php +++ /dev/null @@ -1,57 +0,0 @@ -_nodes->item($this->_key); - if (!$node) { - return null; - } - - /** - * @see Zend_Service_Ebay_Finding_Aspect - */ - #require_once 'Zend/Service/Ebay/Finding/Aspect.php'; - return new Zend_Service_Ebay_Finding_Aspect($node); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Category.php b/library/Zend/Service/Ebay/Finding/Category.php deleted file mode 100644 index 87910d1bd0..0000000000 --- a/library/Zend/Service/Ebay/Finding/Category.php +++ /dev/null @@ -1,73 +0,0 @@ -categoryId = $this->_query(".//$ns:categoryId[1]", 'string'); - $this->categoryName = $this->_query(".//$ns:categoryName[1]", 'string'); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param Zend_Config|array $options - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItems(Zend_Service_Ebay_Finding $proxy, $options = null) - { - return $proxy->findItemsByCategory($this->categoryId, $options); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Category/Histogram.php b/library/Zend/Service/Ebay/Finding/Category/Histogram.php deleted file mode 100644 index c970cb5a88..0000000000 --- a/library/Zend/Service/Ebay/Finding/Category/Histogram.php +++ /dev/null @@ -1,77 +0,0 @@ -count = $this->_query(".//$ns:count[1]", 'integer'); - - $nodes = $this->_xPath->query(".//$ns:childCategoryHistogram", $this->_dom); - if ($nodes->length > 0) { - /** - * @see Zend_Service_Ebay_Finding_Category_Histogram_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Category/Histogram/Set.php'; - $this->childCategoryHistogram = new Zend_Service_Ebay_Finding_Category_Histogram_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Category/Histogram/Container.php b/library/Zend/Service/Ebay/Finding/Category/Histogram/Container.php deleted file mode 100644 index 3fc355cc87..0000000000 --- a/library/Zend/Service/Ebay/Finding/Category/Histogram/Container.php +++ /dev/null @@ -1,66 +0,0 @@ -_xPath->query(".//$ns:categoryHistogram", $this->_dom); - if ($nodes->length > 0) { - /** - * @see Zend_Service_Ebay_Finding_Category_Histogram_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Category/Histogram/Set.php'; - $this->categoryHistogram = new Zend_Service_Ebay_Finding_Category_Histogram_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Category/Histogram/Set.php b/library/Zend/Service/Ebay/Finding/Category/Histogram/Set.php deleted file mode 100644 index ac61749e30..0000000000 --- a/library/Zend/Service/Ebay/Finding/Category/Histogram/Set.php +++ /dev/null @@ -1,57 +0,0 @@ -_nodes->item($this->_key); - if (!$node) { - return null; - } - - /** - * @see Zend_Service_Ebay_Finding_Category_Histogram - */ - #require_once 'Zend/Service/Ebay/Finding/Category/Histogram.php'; - return new Zend_Service_Ebay_Finding_Category_Histogram($node); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Error/Data.php b/library/Zend/Service/Ebay/Finding/Error/Data.php deleted file mode 100644 index e8265d7e3b..0000000000 --- a/library/Zend/Service/Ebay/Finding/Error/Data.php +++ /dev/null @@ -1,158 +0,0 @@ -category = $this->_query(".//$ns:category[1]", 'string'); - $this->domain = $this->_query(".//$ns:domain[1]", 'string'); - $this->errorId = $this->_query(".//$ns:errorId[1]", 'integer'); - $this->exceptionId = $this->_query(".//$ns:exceptionId[1]", 'string'); - $this->message = $this->_query(".//$ns:message[1]", 'string'); - $this->parameter = $this->_query(".//$ns:parameter", 'string', true); - $this->severity = $this->_query(".//$ns:severity[1]", 'string'); - $this->subdomain = $this->_query(".//$ns:subdomain[1]", 'string'); - - $this->_attributes['parameter'] = array( - 'name' => $this->_query(".//$ns:parameter/@name", 'string', true) - ); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Error/Data/Set.php b/library/Zend/Service/Ebay/Finding/Error/Data/Set.php deleted file mode 100644 index e164818278..0000000000 --- a/library/Zend/Service/Ebay/Finding/Error/Data/Set.php +++ /dev/null @@ -1,57 +0,0 @@ -_nodes->item($this->_key); - if (!$node) { - return null; - } - - /** - * @see Zend_Service_Ebay_Finding_Error_Data - */ - #require_once 'Zend/Service/Ebay/Finding/Error/Data.php'; - return new Zend_Service_Ebay_Finding_Error_Data($node); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Error/Message.php b/library/Zend/Service/Ebay/Finding/Error/Message.php deleted file mode 100644 index 4d50baeb0c..0000000000 --- a/library/Zend/Service/Ebay/Finding/Error/Message.php +++ /dev/null @@ -1,60 +0,0 @@ -_xPath->query(".//$ns:error", $this->_dom); - if ($nodes->length > 0) { - /** - * @see Zend_Service_Ebay_Finding_Error_Data_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Error/Data/Set.php'; - $this->error = new Zend_Service_Ebay_Finding_Error_Data_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Exception.php b/library/Zend/Service/Ebay/Finding/Exception.php deleted file mode 100644 index 9fbade1c8b..0000000000 --- a/library/Zend/Service/Ebay/Finding/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -bestOfferEnabled = $this->_query(".//$ns:bestOfferEnabled[1]", 'boolean'); - $this->buyItNowAvailable = $this->_query(".//$ns:buyItNowAvailable[1]", 'boolean'); - $this->buyItNowPrice = $this->_query(".//$ns:buyItNowPrice[1]", 'float'); - $this->convertedBuyItNowPrice = $this->_query(".//$ns:convertedBuyItNowPrice[1]", 'float'); - $this->endTime = $this->_query(".//$ns:endTime[1]", 'string'); - $this->gift = $this->_query(".//$ns:gift[1]", 'boolean'); - $this->listingType = $this->_query(".//$ns:listingType[1]", 'string'); - $this->startTime = $this->_query(".//$ns:startTime[1]", 'string'); - - $this->_attributes['buyItNowPrice'] = array( - 'currencyId' => $this->_query(".//$ns:buyItNowPrice[1]/@currencyId[1]", 'string') - ); - - $this->_attributes['convertedBuyItNowPrice'] = array( - 'currencyId' => $this->_query(".//$ns:convertedBuyItNowPrice[1]/@currencyId[1]", 'string') - ); - } -} diff --git a/library/Zend/Service/Ebay/Finding/PaginationOutput.php b/library/Zend/Service/Ebay/Finding/PaginationOutput.php deleted file mode 100644 index 4354590dc4..0000000000 --- a/library/Zend/Service/Ebay/Finding/PaginationOutput.php +++ /dev/null @@ -1,115 +0,0 @@ -entriesPerPage = $this->_query(".//$ns:entriesPerPage[1]", 'integer'); - $this->pageNumber = $this->_query(".//$ns:pageNumber[1]", 'integer'); - $this->totalEntries = $this->_query(".//$ns:totalEntries[1]", 'integer'); - $this->totalPages = $this->_query(".//$ns:totalPages[1]", 'integer'); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Response/Abstract.php b/library/Zend/Service/Ebay/Finding/Response/Abstract.php deleted file mode 100644 index f9d910b6db..0000000000 --- a/library/Zend/Service/Ebay/Finding/Response/Abstract.php +++ /dev/null @@ -1,185 +0,0 @@ -ack = $this->_query(".//$ns:ack[1]", 'string'); - $this->timestamp = $this->_query(".//$ns:timestamp[1]", 'string'); - $this->version = $this->_query(".//$ns:version[1]", 'string'); - - $node = $this->_xPath->query(".//$ns:errorMessage[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Error_Message - */ - #require_once 'Zend/Service/Ebay/Finding/Error/Message.php'; - $this->errorMessage = new Zend_Service_Ebay_Finding_Error_Message($node); - } - } - - /** - * @param string $operation - * @return Zend_Service_Ebay_Finding_Response_Abstract Provides a fluent interface - */ - public function setOperation($operation) - { - $this->_operation = (string) $operation; - return $this; - } - - /** - * @return string - */ - public function getOperation() - { - return $this->_operation; - } - - /** - * @param string|Zend_Config|array $name - * @param mixed $value - * @return Zend_Service_Ebay_Finding_Response_Abstract Provides a fluent interface - */ - public function setOption($name, $value = null) - { - if ($name instanceof Zend_Config) { - $name = $name->toArray(); - } - if (is_array($name)) { - $this->_options = $name; - } else { - $this->_options[$name] = $value; - } - return $this; - } - - /** - * @param string $name - * @return mixed - */ - public function getOption($name = null) - { - if (null === $name) { - return $this->_options; - } - if (array_key_exists($name, $this->_options)) { - return $this->_options[$name]; - } - return null; - } -} diff --git a/library/Zend/Service/Ebay/Finding/Response/Histograms.php b/library/Zend/Service/Ebay/Finding/Response/Histograms.php deleted file mode 100644 index 09c8024485..0000000000 --- a/library/Zend/Service/Ebay/Finding/Response/Histograms.php +++ /dev/null @@ -1,86 +0,0 @@ -_xPath->query(".//$ns:aspectHistogramContainer[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Aspect_Histogram_Container - */ - #require_once 'Zend/Service/Ebay/Finding/Aspect/Histogram/Container.php'; - $this->aspectHistogramContainer = new Zend_Service_Ebay_Finding_Aspect_Histogram_Container($node); - } - - $node = $this->_xPath->query(".//$ns:categoryHistogramContainer[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Category_Histogram_Container - */ - #require_once 'Zend/Service/Ebay/Finding/Category/Histogram/Container.php'; - $this->categoryHistogramContainer = new Zend_Service_Ebay_Finding_Category_Histogram_Container($node); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/Response/Items.php b/library/Zend/Service/Ebay/Finding/Response/Items.php deleted file mode 100644 index 10c37f165d..0000000000 --- a/library/Zend/Service/Ebay/Finding/Response/Items.php +++ /dev/null @@ -1,249 +0,0 @@ -_attributes['searchResult'] = array( - 'count' => $this->_query(".//$ns:searchResult[1]/@count[1]", 'string') - ); - - $node = $this->_xPath->query(".//$ns:searchResult[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Search_Result - */ - #require_once 'Zend/Service/Ebay/Finding/Search/Result.php'; - $this->searchResult = new Zend_Service_Ebay_Finding_Search_Result($node); - } - - $node = $this->_xPath->query(".//$ns:paginationOutput[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_PaginationOutput - */ - #require_once 'Zend/Service/Ebay/Finding/PaginationOutput.php'; - $this->paginationOutput = new Zend_Service_Ebay_Finding_PaginationOutput($node); - } - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param integer $number - * @throws Zend_Service_Ebay_Finding_Exception When $number is invalid - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function page(Zend_Service_Ebay_Finding $proxy, $number) - { - // check page number - if ($number < 1 || $number > $this->paginationOutput->totalPages) { - /** - * @see Zend_Service_Ebay_Finding_Exception - */ - #require_once 'Zend/Service/Ebay/Finding/Exception.php'; - throw new Zend_Service_Ebay_Finding_Exception( - "Page number '{$number}' is out of range."); - } - - // prepare arguments - $arguments = array(); - switch ($this->_operation) { - case 'findItemsAdvanced': - $arguments[] = $this->getOption('keywords'); - $arguments[] = $this->getOption('descriptionSearch'); - $arguments[] = $this->getOption('categoryId'); - break; - - case 'findItemsByCategory': - $arguments[] = $this->getOption('categoryId'); - break; - - case 'findItemsByKeywords': - $arguments[] = $this->getOption('keywords'); - break; - - case 'findItemsByProduct': - $productId = $this->getOption('productId'); - if (!is_array($productId)) { - $productId = array('' => $productId); - } - $arguments[] = array_key_exists('', $productId) - ? $productId[''] - : null; - $arguments[] = array_key_exists('type', $productId) - ? $productId['type'] - : null; - break; - - case 'findItemsIneBayStores': - $arguments[] = $this->getOption('storeName'); - break; - - default: - /** - * @see Zend_Service_Ebay_Finding_Exception - */ - #require_once 'Zend/Service/Ebay/Finding/Exception.php'; - throw new Zend_Service_Ebay_Finding_Exception( - "Invalid operation '{$this->_operation}'."); - } - - // prepare options - // remove every pagination entry from current option list - $options = $this->_options; - foreach (array_keys($options) as $optionName) { - if (substr($optionName, 0, 15) == 'paginationInput') { - unset($options[$optionName]); - } - } - - // set new pagination values - // see more at http://developer.ebay.com/DevZone/finding/CallRef/types/PaginationInput.html - $entriesPerPage = $this->paginationOutput->entriesPerPage; - $options['paginationInput'] = array('entriesPerPage' => $entriesPerPage, - 'pageNumber' => $number); - - // add current options as last argument - ksort($options); - $arguments[] = $options; - - // verify cache - $id = serialize($arguments); - if (!array_key_exists($id, self::$_pageCache)) { - if ($number == $this->paginationOutput->pageNumber) { - // add itself to cache - $new = $this; - } else { - // request new page - $callback = array($proxy, $this->_operation); - $new = call_user_func_array($callback, $arguments); - } - self::$_pageCache[$id] = $new; - } - - return self::$_pageCache[$id]; - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function pageFirst(Zend_Service_Ebay_Finding $proxy) - { - return $this->page($proxy, 1); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param integer $max - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function pageLast(Zend_Service_Ebay_Finding $proxy, $max = self::PAGE_MAX_DEFAULT) - { - $last = $this->paginationOutput->totalPages; - if ($max > 0 && $last > $max) { - $last = $max; - } - return $this->page($proxy, $last); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param integer $max - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function pageNext(Zend_Service_Ebay_Finding $proxy, $max = self::PAGE_MAX_DEFAULT) - { - $next = $this->paginationOutput->pageNumber + 1; - $last = $this->paginationOutput->totalPages; - if (($max > 0 && $next > $max) || $next > $last) { - return null; - } - return $this->page($proxy, $next); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function pagePrevious(Zend_Service_Ebay_Finding $proxy) - { - $previous = $this->paginationOutput->pageNumber - 1; - if ($previous < 1) { - return null; - } - return $this->page($proxy, $previous); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Response/Keywords.php b/library/Zend/Service/Ebay/Finding/Response/Keywords.php deleted file mode 100644 index 8ce280bb20..0000000000 --- a/library/Zend/Service/Ebay/Finding/Response/Keywords.php +++ /dev/null @@ -1,78 +0,0 @@ -keywords = $this->_query(".//$ns:keywords[1]", 'string'); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param Zend_Config|array $options - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItems(Zend_Service_Ebay_Finding $proxy, $options = null) - { - // prepare options - $options = Zend_Service_Ebay_Abstract::optionsToArray($options); - $options = $options + $this->_options; - - // find items - return $proxy->findItemsByKeywords($this->keywords, $options); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Search/Item.php b/library/Zend/Service/Ebay/Finding/Search/Item.php deleted file mode 100644 index 6ddb7a2a7c..0000000000 --- a/library/Zend/Service/Ebay/Finding/Search/Item.php +++ /dev/null @@ -1,394 +0,0 @@ -autoPay = $this->_query(".//$ns:autoPay[1]", 'boolean'); - $this->charityId = $this->_query(".//$ns:charityId[1]", 'integer'); - $this->country = $this->_query(".//$ns:country[1]", 'string'); - $this->distance = $this->_query(".//$ns:distance[1]", 'float'); - $this->galleryPlusPictureURL = $this->_query(".//$ns:galleryPlusPictureURL", 'string', true); - $this->galleryURL = $this->_query(".//$ns:galleryURL[1]", 'string'); - $this->globalId = $this->_query(".//$ns:globalId[1]", 'string'); - $this->itemId = $this->_query(".//$ns:itemId[1]", 'string'); - $this->location = $this->_query(".//$ns:location[1]", 'string'); - $this->paymentMethod = $this->_query(".//$ns:paymentMethod", 'string', true); - $this->postalCode = $this->_query(".//$ns:postalCode[1]", 'string'); - $this->productId = $this->_query(".//$ns:productId[1]", 'string'); - $this->subtitle = $this->_query(".//$ns:subtitle[1]", 'string'); - $this->title = $this->_query(".//$ns:title[1]", 'string'); - $this->viewItemURL = $this->_query(".//$ns:viewItemURL[1]", 'string'); - - $this->_attributes['distance'] = array( - 'unit' => $this->_query(".//$ns:distance[1]/@unit[1]", 'string') - ); - $this->_attributes['productId'] = array( - 'type' => $this->_query(".//$ns:productId[1]/@type[1]", 'string') - ); - - $node = $this->_xPath->query(".//$ns:listingInfo[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_ListingInfo - */ - #require_once 'Zend/Service/Ebay/Finding/ListingInfo.php'; - $this->listingInfo = new Zend_Service_Ebay_Finding_ListingInfo($node); - } - - $node = $this->_xPath->query(".//$ns:primaryCategory[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Category - */ - #require_once 'Zend/Service/Ebay/Finding/Category.php'; - $this->primaryCategory = new Zend_Service_Ebay_Finding_Category($node); - } - - $node = $this->_xPath->query(".//$ns:secondaryCategory[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Category - */ - #require_once 'Zend/Service/Ebay/Finding/Category.php'; - $this->secondaryCategory = new Zend_Service_Ebay_Finding_Category($node); - } - - $node = $this->_xPath->query(".//$ns:sellerInfo[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_SellerInfo - */ - #require_once 'Zend/Service/Ebay/Finding/SellerInfo.php'; - $this->sellerInfo = new Zend_Service_Ebay_Finding_SellerInfo($node); - } - - $node = $this->_xPath->query(".//$ns:sellingStatus[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_SellingStatus - */ - #require_once 'Zend/Service/Ebay/Finding/SellingStatus.php'; - $this->sellingStatus = new Zend_Service_Ebay_Finding_SellingStatus($node); - } - - $node = $this->_xPath->query("./$ns:shippingInfo", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_ShippingInfo - */ - #require_once 'Zend/Service/Ebay/Finding/ShippingInfo.php'; - $this->shippingInfo = new Zend_Service_Ebay_Finding_ShippingInfo($node); - } - - $node = $this->_xPath->query(".//$ns:storeInfo[1]", $this->_dom)->item(0); - if ($node) { - /** - * @see Zend_Service_Ebay_Finding_Storefront - */ - #require_once 'Zend/Service/Ebay/Finding/Storefront.php'; - $this->storeInfo = new Zend_Service_Ebay_Finding_Storefront($node); - } - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param Zend_Config|array $options - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItemsByProduct(Zend_Service_Ebay_Finding $proxy, $options = null) - { - $type = $this->attributes('productId', 'type'); - return $proxy->findItemsByProduct($this->productId, $type, $options); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Search/Item/Set.php b/library/Zend/Service/Ebay/Finding/Search/Item/Set.php deleted file mode 100644 index ee49524433..0000000000 --- a/library/Zend/Service/Ebay/Finding/Search/Item/Set.php +++ /dev/null @@ -1,57 +0,0 @@ -_nodes->item($this->_key); - if (!$node) { - return null; - } - - /** - * @see Zend_Service_Ebay_Finding_Search_Item - */ - #require_once 'Zend/Service/Ebay/Finding/Search/Item.php'; - return new Zend_Service_Ebay_Finding_Search_Item($node); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Search/Result.php b/library/Zend/Service/Ebay/Finding/Search/Result.php deleted file mode 100644 index 50b5757ff5..0000000000 --- a/library/Zend/Service/Ebay/Finding/Search/Result.php +++ /dev/null @@ -1,63 +0,0 @@ -_xPath->query(".//$ns:item", $this->_dom); - if ($nodes) { - /** - * @see Zend_Service_Ebay_Finding_Search_Item_Set - */ - #require_once 'Zend/Service/Ebay/Finding/Search/Item/Set.php'; - $this->item = new Zend_Service_Ebay_Finding_Search_Item_Set($nodes); - } - } -} diff --git a/library/Zend/Service/Ebay/Finding/SellerInfo.php b/library/Zend/Service/Ebay/Finding/SellerInfo.php deleted file mode 100644 index 918f47a451..0000000000 --- a/library/Zend/Service/Ebay/Finding/SellerInfo.php +++ /dev/null @@ -1,144 +0,0 @@ -feedbackRatingStar = $this->_query(".//$ns:feedbackRatingStar[1]", 'string'); - $this->feedbackScore = $this->_query(".//$ns:feedbackScore[1]", 'integer'); - $this->positiveFeedbackPercent = $this->_query(".//$ns:positiveFeedbackPercent[1]", 'float'); - $this->sellerUserName = $this->_query(".//$ns:sellerUserName[1]", 'string'); - $this->topRatedSeller = $this->_query(".//$ns:topRatedSeller[1]", 'boolean'); - } -} diff --git a/library/Zend/Service/Ebay/Finding/SellingStatus.php b/library/Zend/Service/Ebay/Finding/SellingStatus.php deleted file mode 100644 index 667ee34bec..0000000000 --- a/library/Zend/Service/Ebay/Finding/SellingStatus.php +++ /dev/null @@ -1,130 +0,0 @@ -bidCount = $this->_query(".//$ns:bidCount[1]", 'integer'); - $this->convertedCurrentPrice = $this->_query(".//$ns:convertedCurrentPrice[1]", 'float'); - $this->currentPrice = $this->_query(".//$ns:currentPrice[1]", 'float'); - $this->sellingState = $this->_query(".//$ns:sellingState[1]", 'string'); - $this->timeLeft = $this->_query(".//$ns:timeLeft[1]", 'string'); - - $this->_attributes['convertedCurrentPrice'] = array( - 'currencyId' => $this->_query(".//$ns:convertedCurrentPrice[1]/@currencyId[1]", 'string') - ); - - $this->_attributes['currentPrice'] = array( - 'currencyId' => $this->_query(".//$ns:currentPrice[1]/@currencyId[1]", 'string') - ); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Set/Abstract.php b/library/Zend/Service/Ebay/Finding/Set/Abstract.php deleted file mode 100644 index 08abf109f9..0000000000 --- a/library/Zend/Service/Ebay/Finding/Set/Abstract.php +++ /dev/null @@ -1,128 +0,0 @@ -_nodes = $nodes; - $this->_init(); - } - - /** - * Initialize object. - * - * Called from {@link __construct()} as final step of object initialization. - * - * @return void - */ - protected function _init() - { - } - - /** - * Implement SeekableIterator::seek() - * - * @param integer $key - * @throws OutOfBoundsException When $key is not seekable - * @return void - */ - public function seek($key) - { - if ($key < 0 || $key >= $this->count()) { - $message = "Position '{$key}' is not seekable."; - throw new OutOfBoundsException($message); - } - $this->_key = $key; - } - - /** - * Implement Iterator::key() - * - * @return integer - */ - public function key() - { - return $this->_key; - } - - /** - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->_key++; - } - - /** - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->_key = 0; - } - - /** - * Implement Iterator::valid() - * - * @return boolean - */ - public function valid() - { - return $this->_key >= 0 && $this->_key < $this->count(); - } - - /** - * Implement Countable::current() - * - * @return integer - */ - public function count() - { - return $this->_nodes ? $this->_nodes->length : 0; - } -} diff --git a/library/Zend/Service/Ebay/Finding/ShippingInfo.php b/library/Zend/Service/Ebay/Finding/ShippingInfo.php deleted file mode 100644 index 6306dacc9e..0000000000 --- a/library/Zend/Service/Ebay/Finding/ShippingInfo.php +++ /dev/null @@ -1,126 +0,0 @@ -shippingServiceCost = $this->_query(".//$ns:shippingServiceCost[1]", 'float'); - $this->shippingType = $this->_query(".//$ns:shippingType[1]", 'string'); - $this->shipToLocations = $this->_query(".//$ns:shipToLocations", 'string', true); - - $this->_attributes['shippingServiceCost'] = array( - 'currencyId' => $this->_query(".//$ns:shippingServiceCost[1]/@currencyId[1]", 'string') - ); - } -} diff --git a/library/Zend/Service/Ebay/Finding/Storefront.php b/library/Zend/Service/Ebay/Finding/Storefront.php deleted file mode 100644 index 31e96e7397..0000000000 --- a/library/Zend/Service/Ebay/Finding/Storefront.php +++ /dev/null @@ -1,73 +0,0 @@ -storeName = $this->_query(".//$ns:storeName[1]", 'string'); - $this->storeURL = $this->_query(".//$ns:storeURL[1]", 'string'); - } - - /** - * @param Zend_Service_Ebay_Finding $proxy - * @param Zend_Config|array $options - * @return Zend_Service_Ebay_Finding_Response_Items - */ - public function findItems(Zend_Service_Ebay_Finding $proxy, $options = null) - { - return $proxy->findItemsInEbayStores($this->storeName, $options); - } -} diff --git a/library/Zend/Service/Exception.php b/library/Zend/Service/Exception.php deleted file mode 100644 index 3cafa76367..0000000000 --- a/library/Zend/Service/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -apiKey = (string) $apiKey; - } - - - /** - * Find Flickr photos by tag. - * - * Query options include: - * - * # per_page: how many results to return per query - * # page: the starting page offset. first result will be (page - 1) * per_page + 1 - * # tag_mode: Either 'any' for an OR combination of tags, - * or 'all' for an AND combination. Default is 'any'. - * # min_upload_date: Minimum upload date to search on. Date should be a unix timestamp. - * # max_upload_date: Maximum upload date to search on. Date should be a unix timestamp. - * # min_taken_date: Minimum upload date to search on. Date should be a MySQL datetime. - * # max_taken_date: Maximum upload date to search on. Date should be a MySQL datetime. - * - * @param string|array $query A single tag or an array of tags. - * @param array $options Additional parameters to refine your query. - * @return Zend_Service_Flickr_ResultSet - * @throws Zend_Service_Exception - */ - public function tagSearch($query, array $options = array()) - { - static $method = 'flickr.photos.search'; - static $defaultOptions = array('per_page' => 10, - 'page' => 1, - 'tag_mode' => 'or', - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server'); - - $options['tags'] = is_array($query) ? implode(',', $query) : $query; - - $options = $this->_prepareOptions($method, $options, $defaultOptions); - - $this->_validateTagSearch($options); - - // now search for photos - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Flickr_ResultSet - */ - #require_once 'Zend/Service/Flickr/ResultSet.php'; - return new Zend_Service_Flickr_ResultSet($dom, $this); - } - - - /** - * Finds photos by a user's username or email. - * - * Additional query options include: - * - * # per_page: how many results to return per query - * # page: the starting page offset. first result will be (page - 1) * per_page + 1 - * # min_upload_date: Minimum upload date to search on. Date should be a unix timestamp. - * # max_upload_date: Maximum upload date to search on. Date should be a unix timestamp. - * # min_taken_date: Minimum upload date to search on. Date should be a MySQL datetime. - * # max_taken_date: Maximum upload date to search on. Date should be a MySQL datetime. - * - * @param string $query username or email - * @param array $options Additional parameters to refine your query. - * @return Zend_Service_Flickr_ResultSet - * @throws Zend_Service_Exception - */ - public function userSearch($query, array $options = null) - { - static $method = 'flickr.people.getPublicPhotos'; - static $defaultOptions = array('per_page' => 10, - 'page' => 1, - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server'); - - - // can't access by username, must get ID first - if (strchr($query, '@')) { - // optimistically hope this is an email - $options['user_id'] = $this->getIdByEmail($query); - } else { - // we can safely ignore this exception here - $options['user_id'] = $this->getIdByUsername($query); - } - - $options = $this->_prepareOptions($method, $options, $defaultOptions); - $this->_validateUserSearch($options); - - // now search for photos - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Flickr_ResultSet - */ - #require_once 'Zend/Service/Flickr/ResultSet.php'; - return new Zend_Service_Flickr_ResultSet($dom, $this); - } - - /** - * Finds photos in a group's pool. - * - * @param string $query group id - * @param array $options Additional parameters to refine your query. - * @return Zend_Service_Flickr_ResultSet - * @throws Zend_Service_Exception - */ - public function groupPoolGetPhotos($query, array $options = array()) - { - static $method = 'flickr.groups.pools.getPhotos'; - static $defaultOptions = array('per_page' => 10, - 'page' => 1, - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server'); - - if (empty($query) || !is_string($query)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('You must supply a group id'); - } - - $options['group_id'] = $query; - - $options = $this->_prepareOptions($method, $options, $defaultOptions); - - $this->_validateGroupPoolGetPhotos($options); - - // now search for photos - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Flickr_ResultSet - */ - #require_once 'Zend/Service/Flickr/ResultSet.php'; - return new Zend_Service_Flickr_ResultSet($dom, $this); - } - - - - /** - * Utility function to find Flickr User IDs for usernames. - * - * (You can only find a user's photo with their NSID.) - * - * @param string $username the username - * @return string the NSID (userid) - * @throws Zend_Service_Exception - */ - public function getIdByUsername($username) - { - static $method = 'flickr.people.findByUsername'; - - $options = array('api_key' => $this->apiKey, 'method' => $method, 'username' => (string) $username); - - if (empty($username)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('You must supply a username'); - } - - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - $xpath = new DOMXPath($dom); - return (string) $xpath->query('//user')->item(0)->getAttribute('id'); - } - - - /** - * Utility function to find Flickr User IDs for emails. - * - * (You can only find a user's photo with their NSID.) - * - * @param string $email the email - * @return string the NSID (userid) - * @throws Zend_Service_Exception - */ - public function getIdByEmail($email) - { - static $method = 'flickr.people.findByEmail'; - - if (empty($email)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('You must supply an e-mail address'); - } - - $options = array('api_key' => $this->apiKey, 'method' => $method, 'find_email' => (string) $email); - - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' - . $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - $xpath = new DOMXPath($dom); - return (string) $xpath->query('//user')->item(0)->getAttribute('id'); - } - - - /** - * Returns Flickr photo details by for the given photo ID - * - * @param string $id the NSID - * @return array of Zend_Service_Flickr_Image, details for the specified image - * @throws Zend_Service_Exception - */ - public function getImageDetails($id) - { - static $method = 'flickr.photos.getSizes'; - - if (empty($id)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('You must supply a photo ID'); - } - - $options = array('api_key' => $this->apiKey, 'method' => $method, 'photo_id' => $id); - - $restClient = $this->getRestClient(); - $restClient->getHttpClient()->resetParameters(); - $response = $restClient->restGet('/services/rest/', $options); - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - $xpath = new DOMXPath($dom); - self::_checkErrors($dom); - $retval = array(); - /** - * @see Zend_Service_Flickr_Image - */ - #require_once 'Zend/Service/Flickr/Image.php'; - foreach ($xpath->query('//size') as $size) { - $label = (string) $size->getAttribute('label'); - $retval[$label] = new Zend_Service_Flickr_Image($size); - } - - return $retval; - } - - - /** - * Returns a reference to the REST client, instantiating it if necessary - * - * @return Zend_Rest_Client - */ - public function getRestClient() - { - if (null === $this->_restClient) { - /** - * @see Zend_Rest_Client - */ - #require_once 'Zend/Rest/Client.php'; - $this->_restClient = new Zend_Rest_Client(self::URI_BASE); - } - - return $this->_restClient; - } - - - /** - * Validate User Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateUserSearch(array $options) - { - $validOptions = array('api_key', 'method', 'user_id', 'per_page', 'page', 'extras', 'min_upload_date', - 'min_taken_date', 'max_upload_date', 'max_taken_date', 'safe_search'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 500, true); - if (!$between->isValid($options['per_page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['per_page'] . ' is not valid for the "per_page" option'); - } - - /** - * @see Zend_Validate_Int - */ - #require_once 'Zend/Validate/Int.php'; - $int = new Zend_Validate_Int(); - if (!$int->isValid($options['page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['page'] . ' is not valid for the "page" option'); - } - - // validate extras, which are delivered in csv format - if ($options['extras']) { - $extras = explode(',', $options['extras']); - $validExtras = array('license', 'date_upload', 'date_taken', 'owner_name', 'icon_server'); - foreach($extras as $extra) { - /** - * @todo The following does not do anything [yet], so it is commented out. - */ - //in_array(trim($extra), $validExtras); - } - } - } - - - /** - * Validate Tag Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateTagSearch(array $options) - { - $validOptions = array('method', 'api_key', 'user_id', 'tags', 'tag_mode', 'text', 'min_upload_date', - 'max_upload_date', 'min_taken_date', 'max_taken_date', 'license', 'sort', - 'privacy_filter', 'bbox', 'accuracy', 'safe_search', 'content_type', 'machine_tags', - 'machine_tag_mode', 'group_id', 'contacts', 'woe_id', 'place_id', 'media', 'has_geo', - 'geo_context', 'lat', 'lon', 'radius', 'radius_units', 'is_commons', 'is_gallery', - 'extras', 'per_page', 'page'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 500, true); - if (!$between->isValid($options['per_page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['per_page'] . ' is not valid for the "per_page" option'); - } - - /** - * @see Zend_Validate_Int - */ - #require_once 'Zend/Validate/Int.php'; - $int = new Zend_Validate_Int(); - if (!$int->isValid($options['page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['page'] . ' is not valid for the "page" option'); - } - - // validate extras, which are delivered in csv format - if ($options['extras']) { - $extras = explode(',', $options['extras']); - $validExtras = array('license', 'date_upload', 'date_taken', 'owner_name', 'icon_server'); - foreach($extras as $extra) { - /** - * @todo The following does not do anything [yet], so it is commented out. - */ - //in_array(trim($extra), $validExtras); - } - } - - } - - - /** - * Validate Group Search Options - * - * @param array $options - * @throws Zend_Service_Exception - * @return void - */ - protected function _validateGroupPoolGetPhotos(array $options) - { - $validOptions = array('api_key', 'tags', 'method', 'group_id', 'per_page', 'page', 'extras', 'user_id'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 500, true); - if (!$between->isValid($options['per_page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['per_page'] . ' is not valid for the "per_page" option'); - } - - /** - * @see Zend_Validate_Int - */ - #require_once 'Zend/Validate/Int.php'; - $int = new Zend_Validate_Int(); - - if (!$int->isValid($options['page'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($options['page'] . ' is not valid for the "page" option'); - } - - // validate extras, which are delivered in csv format - if (isset($options['extras'])) { - $extras = explode(',', $options['extras']); - $validExtras = array('license', 'date_upload', 'date_taken', 'owner_name', 'icon_server'); - foreach($extras as $extra) { - /** - * @todo The following does not do anything [yet], so it is commented out. - */ - //in_array(trim($extra), $validExtras); - } - } - } - - - /** - * Throws an exception if and only if the response status indicates a failure - * - * @param DOMDocument $dom - * @return void - * @throws Zend_Service_Exception - */ - protected static function _checkErrors(DOMDocument $dom) - { - if ($dom->documentElement->getAttribute('stat') === 'fail') { - $xpath = new DOMXPath($dom); - $err = $xpath->query('//err')->item(0); - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Search failed due to error: ' . $err->getAttribute('msg') - . ' (error #' . $err->getAttribute('code') . ')'); - } - } - - - /** - * Prepare options for the request - * - * @param string $method Flickr Method to call - * @param array $options User Options - * @param array $defaultOptions Default Options - * @return array Merged array of user and default/required options - */ - protected function _prepareOptions($method, array $options, array $defaultOptions) - { - $options['method'] = (string) $method; - $options['api_key'] = $this->apiKey; - - return array_merge($defaultOptions, $options); - } - - - /** - * Throws an exception if and only if any user options are invalid - * - * @param array $options User options - * @param array $validOptions Valid options - * @return void - * @throws Zend_Service_Exception - */ - protected function _compareOptions(array $options, array $validOptions) - { - $difference = array_diff(array_keys($options), $validOptions); - if ($difference) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('The following parameters are invalid: ' . implode(',', $difference)); - } - } -} - diff --git a/library/Zend/Service/Flickr/Image.php b/library/Zend/Service/Flickr/Image.php deleted file mode 100644 index 197f953399..0000000000 --- a/library/Zend/Service/Flickr/Image.php +++ /dev/null @@ -1,76 +0,0 @@ -uri = (string) $image->getAttribute('source'); - $this->clickUri = (string) $image->getAttribute('url'); - $this->height = (int) $image->getAttribute('height'); - $this->width = (int) $image->getAttribute('width'); - } -} - diff --git a/library/Zend/Service/Flickr/Result.php b/library/Zend/Service/Flickr/Result.php deleted file mode 100644 index 8fad69a28a..0000000000 --- a/library/Zend/Service/Flickr/Result.php +++ /dev/null @@ -1,195 +0,0 @@ -ownerDocument); - - foreach ($xpath->query('./@*', $image) as $property) { - $this->{$property->name} = (string) $property->value; - } - - $this->_flickr = $flickr; - - foreach ($this->_flickr->getImageDetails($this->id) as $k => $v) { - $this->$k = $v; - } - } -} diff --git a/library/Zend/Service/Flickr/ResultSet.php b/library/Zend/Service/Flickr/ResultSet.php deleted file mode 100644 index 9885adae42..0000000000 --- a/library/Zend/Service/Flickr/ResultSet.php +++ /dev/null @@ -1,188 +0,0 @@ -_flickr = $flickr; - - $xpath = new DOMXPath($dom); - - $photos = $xpath->query('//photos')->item(0); - - $page = $photos->getAttribute('page'); - $pages = $photos->getAttribute('pages'); - $perPage = $photos->getAttribute('perpage'); - $total = $photos->getAttribute('total'); - - $this->totalResultsReturned = ($page == $pages || $pages == 0) ? ($total - ($page - 1) * $perPage) : (int) $perPage; - $this->firstResultPosition = ($page - 1) * $perPage + 1; - $this->totalResultsAvailable = (int) $total; - - if ($total > 0) { - $this->_results = $xpath->query('//photo'); - } - } - - /** - * Total Number of results returned - * - * @return int Total number of results returned - */ - public function totalResults() - { - return $this->totalResultsReturned; - } - - /** - * Implements SeekableIterator::current() - * - * @return Zend_Service_Flickr_Result - */ - public function current() - { - return new Zend_Service_Flickr_Result($this->_results->item($this->_currentIndex), $this->_flickr); - } - - /** - * Implements SeekableIterator::key() - * - * @return int - */ - public function key() - { - return $this->_currentIndex; - } - - /** - * Implements SeekableIterator::next() - * - * @return void - */ - public function next() - { - $this->_currentIndex += 1; - } - - /** - * Implements SeekableIterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->_currentIndex = 0; - } - - /** - * Implements SeekableIterator::seek() - * - * @param int $index - * @throws OutOfBoundsException - * @return void - */ - public function seek($index) - { - $indexInt = (int) $index; - if ($indexInt >= 0 && (null === $this->_results || $indexInt < $this->_results->length)) { - $this->_currentIndex = $indexInt; - } else { - throw new OutOfBoundsException("Illegal index '$index'"); - } - } - - /** - * Implements SeekableIterator::valid() - * - * @return boolean - */ - public function valid() - { - return null !== $this->_results && $this->_currentIndex < $this->_results->length; - } -} - diff --git a/library/Zend/Service/LiveDocx.php b/library/Zend/Service/LiveDocx.php deleted file mode 100644 index fec7423b1b..0000000000 --- a/library/Zend/Service/LiveDocx.php +++ /dev/null @@ -1,414 +0,0 @@ - 'myUsername', - * 'password' => 'myPassword', - * 'soapClient' => new Zend_Soap_Client('https://api.example.com/path/mailmerge.asmx?WSDL') - * ) - * ); - * {code} - * - * Replace the URI of the WSDL in the constructor of Zend_Soap_Client with - * that of your dedicated or licensed LiveDocx server. - * - * If you are using the public LiveDocx server, simply pass 'username' and - * 'password'. For example: - * - * {code} - * $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge( - * array ( - * 'username' => 'myUsername', - * 'password' => 'myPassword' - * ) - * ); - * {code} - * - * If you prefer to not pass the username and password through the - * constructor, you can also call the following methods: - * - * {code} - * $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - * - * $phpLiveDocx->setUsername('myUsername') - * ->setPassword('myPassword'); - * {/code} - * - * Or, if you want to specify your own SoapClient: - * - * {code} - * $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - * - * $phpLiveDocx->setUsername('myUsername') - * ->setPassword('myPassword'); - * - * $phpLiveDocx->setSoapClient( - * new Zend_Soap_Client('https://api.example.com/path/mailmerge.asmx?WSDL') - * ); - * {/code} - * - * @param array|Zend_Config $options - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function __construct($options = null) - { - $this->_credentials = array(); - $this->_loggedIn = false; - - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } - - if (is_array($options)) { - $this->setOptions($options); - } - } - - /** - * Set options - * One or more of username, password, soapClient - * - * @param array $options - * @return Zend_Service_LiveDocx - * @since LiveDocx 1.2 - */ - public function setOptions(array $options) - { - foreach ($options as $key => $value) { - $method = 'set' . $key; - if (method_exists($this, $method)) { - $this->$method($value); - } - } - - return $this; - } - - /** - * Clean up and log out of LiveDocx service - * - * @return boolean - * @since LiveDocx 1.0 - */ - public function __destruct() - { - return $this->logOut(); - } - - /** - * Init Soap client - connect to SOAP service - * - * @param string $endpoint - * @throws Zend_Service_LiveDocx_Exception - * @return void - * @since LiveDocx 1.2 - */ - protected function _initSoapClient($endpoint) - { - try { - #require_once 'Zend/Soap/Client.php'; - $this->_soapClient = new Zend_Soap_Client(); - $this->_soapClient->setWsdl($endpoint); - } catch (Zend_Soap_Client_Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception('Cannot connect to LiveDocx service at ' . $endpoint, 0, $e); - } - } - - /** - * Get SOAP client - * - * @return Zend_Soap_Client - * @since LiveDocx 1.2 - */ - public function getSoapClient() - { - return $this->_soapClient; - } - - /** - * Set SOAP client - * - * @param Zend_Soap_Client $soapClient - * @return Zend_Service_LiveDocx - * @since LiveDocx 1.2 - */ - public function setSoapClient(Zend_Soap_Client $soapClient) - { - $this->_soapClient = $soapClient; - return $this; - } - - /** - * Log in to LiveDocx service - * - * @throws Zend_Service_LiveDocx_Exception - * @return boolean - * @since LiveDocx 1.2 - */ - public function logIn() - { - if (!$this->isLoggedIn()) { - if (null === $this->getUsername()) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Username has not been set. To set username specify the options array in the constructor or call setUsername($username) after instantiation' - ); - } - - if (null === $this->getPassword()) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Password has not been set. To set password specify the options array in the constructor or call setPassword($password) after instantiation' - ); - } - - if (null === $this->getSoapClient()) { - $this->_initSoapClient($this->_wsdl); - } - - try { - $this->getSoapClient()->LogIn(array( - 'username' => $this->getUsername(), - 'password' => $this->getPassword(), - )); - $this->_loggedIn = true; - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot login into LiveDocx service - username and/or password are invalid', 0, $e - ); - } - } - - return $this->_loggedIn; - } - - /** - * Log out of the LiveDocx service - * - * @throws Zend_Service_LiveDocx_Exception - * @return boolean - * @since LiveDocx 1.2 - */ - public function logOut() - { - if ($this->isLoggedIn()) { - try { - $this->getSoapClient()->LogOut(); - $this->_loggedIn = false; - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot log out of LiveDocx service', 0, $e - ); - } - } - - return $this->_loggedIn; - } - - /** - * Return true, if session is currently logged into the backend server - * - * @return boolean - * @since LiveDocx 1.2 - */ - public function isLoggedIn() - { - return $this->_loggedIn; - } - - /** - * Set username - * - * @param string $username - * @return Zend_Service_LiveDocx - * @since LiveDocx 1.0 - */ - public function setUsername($username) - { - $this->_credentials['username'] = $username; - return $this; - } - - /** - * Set password - * - * @param string $password - * @return Zend_Service_LiveDocx - * @since LiveDocx 1.0 - */ - public function setPassword($password) - { - $this->_credentials['password'] = $password; - return $this; - } - - /** - * Set WSDL of LiveDocx web service - * - * @param string $wsdl - * @return Zend_Service_LiveDocx - * @since LiveDocx 1.0 - */ - public function setWsdl($wsdl) - { - $this->_wsdl = $wsdl; - return $this; - } - - /** - * Return current username - * - * @return string|null - * @since LiveDocx 1.0 - */ - public function getUsername() - { - if (isset($this->_credentials['username'])) { - return $this->_credentials['username']; - } - - return null; - } - - /** - * Return current password - * - * @return string|null - * @since LiveDocx 1.0 - */ - public function getPassword() - { - if (isset($this->_credentials['password'])) { - return $this->_credentials['password']; - } - - return null; - } - - /** - * Return WSDL of LiveDocx web service - * - * @return string - * @since LiveDocx 1.0 - */ - public function getWsdl() - { - return $this->_wsdl; - } - - /** - * Return the document format (extension) of a filename - * - * @param string $filename - * @return string - * @since LiveDocx 1.0 - */ - public function getFormat($filename) - { - return strtolower(substr(strrchr($filename, '.'), 1)); - } - - /** - * Return the current API version - * - * @return string - * @since LiveDocx 1.0 - */ - public function getVersion() - { - return self::VERSION; - } - - /** - * Compare the current API version with another version - * - * @param string $version (STRING NOT FLOAT) - * @return int -1 (version is less than API version), 0 (versions are equal), or 1 (version is greater than API version) - * @since LiveDocx 1.0 - */ - public function compareVersion($version) - { - return version_compare($version, $this->getVersion()); - } -} diff --git a/library/Zend/Service/LiveDocx/Exception.php b/library/Zend/Service/LiveDocx/Exception.php deleted file mode 100644 index 00a03c23be..0000000000 --- a/library/Zend/Service/LiveDocx/Exception.php +++ /dev/null @@ -1,39 +0,0 @@ -_wsdl = self::WSDL; - $this->_fieldValues = array(); - $this->_blockFieldValues = array(); - - parent::__construct($options); - } - - /** - * Set the filename of a LOCAL template - * (i.e. a template stored locally on YOUR server) - * - * @param string $filename - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function setLocalTemplate($filename) - { - if (!is_readable($filename)) { - throw new Zend_Service_LiveDocx_Exception( - 'Cannot read local template from disk.' - ); - } - - $this->logIn(); - - try { - $this->getSoapClient()->SetLocalTemplate(array( - 'template' => base64_encode(file_get_contents($filename)), - 'format' => self::getFormat($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set local template', 0, $e - ); - } - - return $this; - } - - /** - * Set the filename of a REMOTE template - * (i.e. a template stored remotely on the LIVEDOCX server) - * - * @param string $filename - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function setRemoteTemplate($filename) - { - $this->logIn(); - - try { - $this->getSoapClient()->SetRemoteTemplate(array( - 'filename' => $filename, - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set remote template', 0, $e - ); - } - - return $this; - } - - /** - * Set an associative or multi-associative array of keys and values pairs - * - * @param array $values - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function setFieldValues($values) - { - $this->logIn(); - - foreach ($values as $value) { - if (is_array($value)) { - $method = 'multiAssocArrayToArrayOfArrayOfString'; - } else { - $method = 'assocArrayToArrayOfArrayOfString'; - } - break; - } - - try { - $this->getSoapClient()->SetFieldValues(array( - 'fieldValues' => self::$method($values), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set field values', 0, $e - ); - } - - return $this; - } - - /** - * Set an array of key and value or array of values - * - * @param string $field - * @param array|string $value - * - * @throws Zend_Service_LiveDocx_Exception - * @return Zend_Service_LiveDocx_MailMerge - * @since LiveDocx 1.0 - */ - public function setFieldValue($field, $value) - { - $this->_fieldValues[$field] = $value; - - return $this; - } - - /** - * Set block field values - * - * @param string $blockName - * @param array $blockFieldValues - * - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function setBlockFieldValues($blockName, $blockFieldValues) - { - $this->logIn(); - - try { - $this->getSoapClient()->SetBlockFieldValues(array( - 'blockName' => $blockName, - 'blockFieldValues' => self::multiAssocArrayToArrayOfArrayOfString($blockFieldValues) - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set block field values', 0, $e - ); - } - - return $this; - } - - /** - * Assign values to template fields - * - * @param array|string $field - * @param array|string $value - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function assign($field, $value = null) - { - try { - if (is_array($field) && (null === $value)) { - foreach ($field as $fieldName => $fieldValue) { - $this->setFieldValue($fieldName, $fieldValue); - } - } elseif (is_array($value)) { - $this->setBlockFieldValues($field, $value); - } else { - $this->setFieldValue($field, $value); - } - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot assign data to template', 0, $e - ); - } - - return $this; - } - - /** - * Set a password to open to document - * - * This method can only be used for PDF documents - * - * @param string $password - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.2 Premium - */ - public function setDocumentPassword($password) - { - $this->logIn(); - - try { - $this->getSoapClient()->SetDocumentPassword(array( - 'password' => $password - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set document password. This method can be used on PDF files only.', 0, $e - ); - } - - return $this; - } - - /** - * Set a master password for document and determine which security features - * are accessible without using the master password. - * - * As default, nothing is allowed. To allow a security setting, - * explicatively set it using one of he DOCUMENT_ACCESS_PERMISSION_* class - * constants. - * - * {code} - * $phpLiveDocx->setDocumentAccessPermissions( - * array ( - * Zend_Service_LiveDocx_MailMerge::DOCUMENT_ACCESS_PERMISSION_ALLOW_PRINTING_HIGH_LEVEL, - * Zend_Service_LiveDocx_MailMerge::DOCUMENT_ACCESS_PERMISSION_ALLOW_EXTRACT_CONTENTS - * ), - * 'myDocumentAccessPassword' - * ); - * {code} - * - * This method can only be used for PDF documents - * - * @param array $permissions - * @param string $password - * @return Zend_Service_LiveDocx_MailMerge - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.2 Premium - */ - public function setDocumentAccessPermissions($permissions, $password) - { - $this->logIn(); - - try { - $this->getSoapClient()->SetDocumentAccessPermissions(array( - 'permissions' => $permissions, - 'password' => $password - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot set document access permissions', 0, $e - ); - } - - return $this; - } - - /** - * Merge assigned data with template to generate document - * - * @throws Zend_Service_LiveDocx_Excpetion - * @return void - * @since LiveDocx 1.0 - */ - public function createDocument() - { - $this->logIn(); - - if (count($this->_fieldValues) > 0) { - $this->setFieldValues($this->_fieldValues); - } - - $this->_fieldValues = array(); - $this->_blockFieldValues = array(); - - try { - $this->getSoapClient()->CreateDocument(); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot create document', 0, $e - ); - } - } - - /** - * Retrieve document in specified format - * - * @param string $format - * - * @throws Zend_Service_LiveDocx_Exception - * @return binary - * @since LiveDocx 1.0 - */ - public function retrieveDocument($format) - { - $this->logIn(); - - $format = strtolower($format); - - try { - $result = $this->getSoapClient()->RetrieveDocument(array( - 'format' => $format, - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot retrieve document - call setLocalTemplate() or setRemoteTemplate() first', 0, $e - ); - } - - return base64_decode($result->RetrieveDocumentResult); - } - - /** - * Return WMF (aka Windows metafile) data for specified page range of created document - * Return array contains WMF data (binary) - array key is page number - * - * @param integer $fromPage - * @param integer $toPage - * @return array - * @since LiveDocx 1.2 - */ - public function getMetafiles($fromPage, $toPage) - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetMetafiles(array( - 'fromPage' => (integer) $fromPage, - 'toPage' => (integer) $toPage, - )); - - if (isset($result->GetMetafilesResult->string)) { - $pageCounter = (integer) $fromPage; - if (is_array($result->GetMetafilesResult->string)) { - foreach ($result->GetMetafilesResult->string as $string) { - $ret[$pageCounter] = base64_decode($string); - $pageCounter++; - } - } else { - $ret[$pageCounter] = base64_decode($result->GetMetafilesResult->string); - } - } - - return $ret; - } - - /** - * Return WMF (aka Windows metafile) data for pages of created document - * Return array contains WMF data (binary) - array key is page number - * - * @return array - * @since LiveDocx 1.2 - */ - public function getAllMetafiles() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetAllMetafiles(); - - if (isset($result->GetAllMetafilesResult->string)) { - $pageCounter = 1; - if (is_array($result->GetAllMetafilesResult->string)) { - foreach ($result->GetAllMetafilesResult->string as $string) { - $ret[$pageCounter] = base64_decode($string); - $pageCounter++; - } - } else { - $ret[$pageCounter] = base64_decode($result->GetAllMetafilesResult->string); - } - } - - return $ret; - } - - /** - * Return graphical bitmap data for specified page range of created document - * Return array contains bitmap data (binary) - array key is page number - * - * @param integer $fromPage - * @param integer $toPage - * @param integer $zoomFactor - * @param string $format - * @return array - * @since LiveDocx 1.2 - */ - public function getBitmaps($fromPage, $toPage, $zoomFactor, $format) - { - $this->logIn(); - - $ret = array(); - - $result = $this->getSoapClient()->GetBitmaps(array( - 'fromPage' => (integer) $fromPage, - 'toPage' => (integer) $toPage, - 'zoomFactor' => (integer) $zoomFactor, - 'format' => (string) $format, - )); - - if (isset($result->GetBitmapsResult->string)) { - $pageCounter = (integer) $fromPage; - if (is_array($result->GetBitmapsResult->string)) { - foreach ($result->GetBitmapsResult->string as $string) { - $ret[$pageCounter] = base64_decode($string); - $pageCounter++; - } - } else { - $ret[$pageCounter] = base64_decode($result->GetBitmapsResult->string); - } - } - - return $ret; - } - - /** - * Return graphical bitmap data for all pages of created document - * Return array contains bitmap data (binary) - array key is page number - * - * @param integer $zoomFactor - * @param string $format - * @return array - * @since LiveDocx 1.2 - */ - public function getAllBitmaps($zoomFactor, $format) - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetAllBitmaps(array( - 'zoomFactor' => (integer) $zoomFactor, - 'format' => (string) $format, - )); - - if (isset($result->GetAllBitmapsResult->string)) { - $pageCounter = 1; - if (is_array($result->GetAllBitmapsResult->string)) { - foreach ($result->GetAllBitmapsResult->string as $string) { - $ret[$pageCounter] = base64_decode($string); - $pageCounter++; - } - } else { - $ret[$pageCounter] = base64_decode($result->GetAllBitmapsResult->string); - } - } - - return $ret; - } - - /** - * Return all the fields in the template - * - * @return array - * @since LiveDocx 1.0 - */ - public function getFieldNames() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetFieldNames(); - - if (isset($result->GetFieldNamesResult->string)) { - if (is_array($result->GetFieldNamesResult->string)) { - $ret = $result->GetFieldNamesResult->string; - } else { - $ret[] = $result->GetFieldNamesResult->string; - } - } - - return $ret; - } - - /** - * Return all the block fields in the template - * - * @param string $blockName - * @return array - * @since LiveDocx 1.0 - */ - public function getBlockFieldNames($blockName) - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetBlockFieldNames(array( - 'blockName' => $blockName - )); - - if (isset($result->GetBlockFieldNamesResult->string)) { - if (is_array($result->GetBlockFieldNamesResult->string)) { - $ret = $result->GetBlockFieldNamesResult->string; - } else { - $ret[] = $result->GetBlockFieldNamesResult->string; - } - } - - return $ret; - } - - /** - * Return all the block fields in the template - * - * @return array - * @since LiveDocx 1.0 - */ - public function getBlockNames() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetBlockNames(); - - if (isset($result->GetBlockNamesResult->string)) { - if (is_array($result->GetBlockNamesResult->string)) { - $ret = $result->GetBlockNamesResult->string; - } else { - $ret[] = $result->GetBlockNamesResult->string; - } - } - - return $ret; - } - - /** - * Upload a template file to LiveDocx service - * - * @param string $filename - * @return void - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function uploadTemplate($filename) - { - $this->logIn(); - - try { - $this->getSoapClient()->UploadTemplate(array( - 'template' => base64_encode(file_get_contents($filename)), - 'filename' => basename($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot upload template', 0, $e - ); - } - } - - /** - * Download template file from LiveDocx service - * - * @param string $filename - * @return binary - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function downloadTemplate($filename) - { - $this->logIn(); - - try { - $result = $this->getSoapClient()->DownloadTemplate(array( - 'filename' => basename($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot download template', 0, $e - ); - } - - return base64_decode($result->DownloadTemplateResult); - } - - /** - * Delete a template file from LiveDocx service - * - * @param string $filename - * @return void - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function deleteTemplate($filename) - { - $this->logIn(); - - $this->getSoapClient()->DeleteTemplate(array( - 'filename' => basename($filename), - )); - } - - /** - * List all templates stored on LiveDocx service - * - * @return array - * @since LiveDocx 1.0 - */ - public function listTemplates() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->ListTemplates(); - - if (isset($result->ListTemplatesResult)) { - $ret = $this->_backendListArrayToMultiAssocArray($result->ListTemplatesResult); - } - - return $ret; - } - - /** - * Check whether a template file is available on LiveDocx service - * - * @param string $filename - * @return boolean - * @since LiveDocx 1.0 - */ - public function templateExists($filename) - { - $this->logIn(); - - $result = $this->getSoapClient()->TemplateExists(array( - 'filename' => basename($filename), - )); - - return (boolean) $result->TemplateExistsResult; - } - - /** - * Share a document - i.e. the document is available to all over the Internet - * - * @return string - * @since LiveDocx 1.0 - */ - public function shareDocument() - { - $this->logIn(); - - $ret = null; - $result = $this->getSoapClient()->ShareDocument(); - - if (isset($result->ShareDocumentResult)) { - $ret = (string) $result->ShareDocumentResult; - } - - return $ret; - } - - /** - * List all shared documents stored on LiveDocx service - * - * @return array - * @since LiveDocx 1.0 - */ - public function listSharedDocuments() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->ListSharedDocuments(); - - if (isset($result->ListSharedDocumentsResult)) { - $ret = $this->_backendListArrayToMultiAssocArray( - $result->ListSharedDocumentsResult - ); - } - - return $ret; - } - - /** - * Delete a shared document from LiveDocx service - * - * @param string $filename - * @return void - * @since LiveDocx 1.0 - */ - public function deleteSharedDocument($filename) - { - $this->logIn(); - - $this->getSoapClient()->DeleteSharedDocument(array( - 'filename' => basename($filename), - )); - } - - /* - * Download a shared document from LiveDocx service - * - * @param string $filename - * @return binary - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 1.0 - */ - public function downloadSharedDocument($filename) - { - $this->logIn(); - - try { - $result = $this->getSoapClient()->DownloadSharedDocument(array( - 'filename' => basename($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot download shared document', 0, $e - ); - } - - return base64_decode($result->DownloadSharedDocumentResult); - } - - /** - * Check whether a shared document is available on LiveDocx service - * - * @param string $filename - * @return boolean - * @since LiveDocx 1.0 - */ - public function sharedDocumentExists($filename) - { - $this->logIn(); - - $ret = false; - $sharedDocuments = $this->listSharedDocuments(); - foreach ($sharedDocuments as $shareDocument) { - if (isset($shareDocument['filename']) - && (basename($filename) === $shareDocument['filename']) - ) { - $ret = true; - break; - } - } - - return $ret; - } - - /** - * Return supported template formats (lowercase) - * - * @return array - * @since LiveDocx 1.0 - */ - public function getTemplateFormats() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetTemplateFormats(); - - if (isset($result->GetTemplateFormatsResult->string)) { - $ret = $result->GetTemplateFormatsResult->string; - $ret = array_map('strtolower', $ret); - } - - return $ret; - } - - /** - * Return supported document formats (lowercase) - * - * @return array - * @since LiveDocx 1.1 - */ - public function getDocumentFormats() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetDocumentFormats(); - - if (isset($result->GetDocumentFormatsResult->string)) { - $ret = $result->GetDocumentFormatsResult->string; - $ret = array_map('strtolower', $ret); - } - - return $ret; - } - - /** - * Return the names of all fonts that are installed on backend server - * - * @return array - * @since LiveDocx 1.2 - */ - public function getFontNames() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetFontNames(); - - if (isset($result->GetFontNamesResult->string)) { - $ret = $result->GetFontNamesResult->string; - } - - return $ret; - } - - /** - * Return supported document access options - * - * @return array - * @since LiveDocx 1.2 Premium - */ - public function getDocumentAccessOptions() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetDocumentAccessOptions(); - - if (isset($result->GetDocumentAccessOptionsResult->string)) { - $ret = $result->GetDocumentAccessOptionsResult->string; - } - - return $ret; - } - - /** - * Return supported image formats from which can be imported (lowercase) - * - * @return array - * @since LiveDocx 2.0 - */ - public function getImageImportFormats() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetImageImportFormats(); - - if (isset($result->GetImageImportFormatsResult->string)) { - $ret = $result->GetImageImportFormatsResult->string; - $ret = array_map('strtolower', $ret); - } - - return $ret; - } - - /** - * Return supported image formats to which can be exported (lowercase) - * - * @return array - * @since LiveDocx 2.0 - */ - public function getImageExportFormats() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->GetImageExportFormats(); - - if (isset($result->GetImageExportFormatsResult->string)) { - $ret = $result->GetImageExportFormatsResult->string; - $ret = array_map('strtolower', $ret); - } - - return $ret; - } - - /* - * Return supported image formats (lowercase) - * - * @return array - * @since LiveDocx 1.2 - * @deprecated since LiveDocx 2.0 - */ - public function getImageFormats() - { - $replacement = 'getImageExportFormats'; - - /* - $errorMessage = sprintf( - "%s::%s is deprecated as of LiveDocx 2.0. " - . "It has been replaced by %s::%s() (drop in replacement)", - __CLASS__, __FUNCTION__, __CLASS__, $replacement); - - trigger_error($errorMessage, E_USER_NOTICE); - */ - - return $this->$replacement(); - } - - /** - * Upload an image file to LiveDocx service - * - * @param string $filename - * @return void - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 2.0 - */ - public function uploadImage($filename) - { - $this->logIn(); - - try { - $this->getSoapClient()->UploadImage(array( - 'image' => base64_encode(file_get_contents($filename)), - 'filename' => basename($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot upload image', 0, $e - ); - } - } - - /** - * Download an image file from LiveDocx service - * - * @param string $filename - * @return void - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 2.0 - */ - public function downloadImage($filename) - { - $this->logIn(); - - try { - $result = $this->getSoapClient()->DownloadImage(array( - 'filename' => basename($filename), - )); - } catch (Exception $e) { - #require_once 'Zend/Service/LiveDocx/Exception.php'; - throw new Zend_Service_LiveDocx_Exception( - 'Cannot download image', 0, $e - ); - } - - return base64_decode($result->DownloadImageResult); - } - - /** - * List all images stored on LiveDocx service - * - * @return array - * @since LiveDocx 2.0 - */ - public function listImages() - { - $this->logIn(); - - $ret = array(); - $result = $this->getSoapClient()->ListImages(); - - if (isset($result->ListImagesResult)) { - $ret = $this->_backendListArrayToMultiAssocArray($result->ListImagesResult); - } - - return $ret; - } - - /** - * Delete an image file from LiveDocx service - * - * @param string $filename - * @return void - * @throws Zend_Service_LiveDocx_Exception - * @since LiveDocx 2.0 - */ - public function deleteImage($filename) - { - $this->logIn(); - - $this->getSoapClient()->DeleteImage(array( - 'filename' => basename($filename), - )); - } - - /** - * Check whether an image file is available on LiveDocx service - * - * @param string $filename - * @return boolean - * @since LiveDocx 2.0 - */ - public function imageExists($filename) - { - $this->logIn(); - - $result = $this->getSoapClient()->ImageExists(array( - 'filename' => basename($filename), - )); - - return (boolean) $result->ImageExistsResult; - } - - /** - * Convert LiveDocx service return value from list methods to consistent PHP array - * - * @param array $list - * @return array - * @since LiveDocx 1.0 - */ - protected function _backendListArrayToMultiAssocArray($list) - { - $this->logIn(); - - $ret = array(); - if (isset($list->ArrayOfString)) { - foreach ($list->ArrayOfString as $a) { - if (is_array($a)) { // 1 template only - $o = new stdClass(); - $o->string = $a; - } else { // 2 or more templates - $o = $a; - } - unset($a); - - if (isset($o->string)) { - $date1 = new Zend_Date($o->string[3], Zend_Date::RFC_1123); - $date2 = new Zend_Date($o->string[1], Zend_Date::RFC_1123); - - $ret[] = array ( - 'filename' => $o->string[0], - 'fileSize' => (integer) $o->string[2], - 'createTime' => (integer) $date1->get(Zend_Date::TIMESTAMP), - 'modifyTime' => (integer) $date2->get(Zend_Date::TIMESTAMP), - ); - } - } - } - - return $ret; - } - - /** - * Convert assoc array to required SOAP type - * - * @param array $assoc - * - * @return array - * @since LiveDocx 1.0 - */ - public static function assocArrayToArrayOfArrayOfString($assoc) - { - $arrayKeys = array_keys($assoc); - $arrayValues = array_values($assoc); - - return array($arrayKeys, $arrayValues); - } - - /** - * Convert multi assoc array to required SOAP type - * - * @param array $multi - * @return array - * @since LiveDocx 1.0 - */ - public static function multiAssocArrayToArrayOfArrayOfString($multi) - { - $arrayKeys = array_keys($multi[0]); - $arrayValues = array(); - - foreach ($multi as $v) { - $arrayValues[] = array_values($v); - } - - $arrayKeys = array($arrayKeys); - - return array_merge($arrayKeys, $arrayValues); - } - - // ------------------------------------------------------------------------- - -} diff --git a/library/Zend/Service/Rackspace/Abstract.php b/library/Zend/Service/Rackspace/Abstract.php deleted file mode 100644 index 18a159b2ed..0000000000 --- a/library/Zend/Service/Rackspace/Abstract.php +++ /dev/null @@ -1,392 +0,0 @@ -setUser($user); - $this->setKey($key); - $this->setAuthUrl($authUrl); - } - /** - * Get User account - * - * @return string - */ - public function getUser() - { - return $this->user; - } - /** - * Get user key - * - * @return string - */ - public function getKey() - { - return $this->key; - } - /** - * Get authentication URL - * - * @return string - */ - public function getAuthUrl() - { - return $this->authUrl; - } - /** - * Get the storage URL - * - * @return string|boolean - */ - public function getStorageUrl() - { - if (empty($this->storageUrl)) { - if (!$this->authenticate()) { - return false; - } - } - return $this->storageUrl; - } - /** - * Get the CDN URL - * - * @return string|boolean - */ - public function getCdnUrl() - { - if (empty($this->cdnUrl)) { - if (!$this->authenticate()) { - return false; - } - } - return $this->cdnUrl; - } - /** - * Get the management server URL - * - * @return string|boolean - */ - public function getManagementUrl() - { - if (empty($this->managementUrl)) { - if (!$this->authenticate()) { - return false; - } - } - return $this->managementUrl; - } - /** - * Set the user account - * - * @param string $user - * @return void - */ - public function setUser($user) - { - if (!empty($user)) { - $this->user = $user; - } - } - /** - * Set the authentication key - * - * @param string $key - * @return void - */ - public function setKey($key) - { - if (!empty($key)) { - $this->key = $key; - } - } - /** - * Set the Authentication URL - * - * @param string $url - * @return void - */ - public function setAuthUrl($url) - { - if (!empty($url) && in_array($url, array(self::US_AUTH_URL, self::UK_AUTH_URL))) { - $this->authUrl = $url; - } else { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("The authentication URL is not valid"); - } - } - - /** - * Sets whether to use ServiceNet - * - * ServiceNet is Rackspace's internal network. Bandwidth on ServiceNet is - * not charged. - * - * @param boolean $useServiceNet - */ - public function setServiceNet($useServiceNet = true) - { - $this->useServiceNet = $useServiceNet; - return $this; - } - - /** - * Get whether we're using ServiceNet - * - * @return boolean - */ - public function getServiceNet() - { - return $this->useServiceNet; - } - - /** - * Get the authentication token - * - * @return string - */ - public function getToken() - { - if (empty($this->token)) { - if (!$this->authenticate()) { - return false; - } - } - return $this->token; - } - /** - * Get the error msg of the last HTTP call - * - * @return string - */ - public function getErrorMsg() - { - return $this->errorMsg; - } - /** - * Get the error code of the last HTTP call - * - * @return strig - */ - public function getErrorCode() - { - return $this->errorCode; - } - /** - * get the HttpClient instance - * - * @return Zend_Http_Client - */ - public function getHttpClient() - { - if (empty($this->httpClient)) { - $this->httpClient = new Zend_Http_Client(); - } - return $this->httpClient; - } - /** - * Return true is the last call was successful - * - * @return boolean - */ - public function isSuccessful() - { - return ($this->errorMsg==''); - } - /** - * HTTP call - * - * @param string $url - * @param string $method - * @param array $headers - * @param array $get - * @param string $body - * @return Zend_Http_Response - */ - protected function httpCall($url,$method,$headers=array(),$data=array(),$body=null) - { - $client = $this->getHttpClient(); - $client->resetParameters(true); - if ($method == 'PUT' && empty($body)) { - // if left at NULL a PUT request will always have - // Content-Type: x-url-form-encoded, which breaks copyObject() - $client->setEncType(''); - } - if (empty($headers[self::AUTHUSER_HEADER])) { - $headers[self::AUTHTOKEN]= $this->getToken(); - } - $client->setMethod($method); - if (empty($data['format'])) { - $data['format']= self::API_FORMAT; - } - $client->setParameterGet($data); - if (!empty($body)) { - $client->setRawData($body); - if (!isset($headers['Content-Type'])) { - $headers['Content-Type']= 'application/json'; - } - } - $client->setHeaders($headers); - $client->setUri($url); - $this->errorMsg=''; - $this->errorCode=''; - return $client->request(); - } - /** - * Authentication - * - * @return boolean - */ - public function authenticate() - { - if (empty($this->user)) { - /** - * @see Zend_Service_Rackspace_Exception - */ - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("User has not been set"); - } - - $headers = array ( - self::AUTHUSER_HEADER => $this->user, - self::AUTHKEY_HEADER => $this->key - ); - $result = $this->httpCall($this->authUrl.'/'.self::VERSION,'GET', $headers); - if ($result->getStatus()==204) { - $this->token = $result->getHeader(self::AUTHTOKEN); - $this->cdnUrl = $result->getHeader(self::CDNM_URL); - $this->managementUrl = $result->getHeader(self::MANAGEMENT_URL); - $storageUrl = $result->getHeader(self::STORAGE_URL); - if ($this->useServiceNet) { - $storageUrl = preg_replace('|(.*)://([^/]*)(.*)|', '$1://snet-$2$3', $storageUrl); - } - $this->storageUrl = $storageUrl; - return true; - } - $this->errorMsg = $result->getBody(); - $this->errorCode = $result->getStatus(); - return false; - } -} diff --git a/library/Zend/Service/Rackspace/Exception.php b/library/Zend/Service/Rackspace/Exception.php deleted file mode 100644 index 02b22c62fe..0000000000 --- a/library/Zend/Service/Rackspace/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -getInfoAccount(); - return $data['tot_containers']; - } - /** - * Return the size in bytes of all the containers - * - * @return int - */ - public function getSizeContainers() - { - $data= $this->getInfoAccount(); - return $data['size_containers']; - } - /** - * Return the count of objects contained in all the containers - * - * @return int - */ - public function getCountObjects() - { - $data= $this->getInfoAccount(); - return $data['tot_objects']; - } - /** - * Get all the containers - * - * @param array $options - * @return Zend_Service_Rackspace_Files_ContainerList|bool - */ - public function getContainers($options=array()) - { - $result= $this->httpCall($this->getStorageUrl(),'GET',null,$options); - if ($result->isSuccessful()) { - return new Zend_Service_Rackspace_Files_ContainerList($this,json_decode($result->getBody(),true)); - } - return false; - } - /** - * Get all the CDN containers - * - * @param array $options - * @return array|bool - */ - public function getCdnContainers($options=array()) - { - $options['enabled_only']= true; - $result= $this->httpCall($this->getCdnUrl(),'GET',null,$options); - if ($result->isSuccessful()) { - return new Zend_Service_Rackspace_Files_ContainerList($this,json_decode($result->getBody(),true)); - } - return false; - } - /** - * Get the metadata information of the accounts: - * - total count containers - * - size in bytes of all the containers - * - total objects in all the containers - * - * @return array|bool - */ - public function getInfoAccount() - { - $result= $this->httpCall($this->getStorageUrl(),'HEAD'); - if ($result->isSuccessful()) { - $output= array( - 'tot_containers' => $result->getHeader(self::ACCOUNT_CONTAINER_COUNT), - 'size_containers' => $result->getHeader(self::ACCOUNT_BYTES_USED), - 'tot_objects' => $result->getHeader(self::ACCOUNT_OBJ_COUNT) - ); - return $output; - } - return false; - } - - /** - * Get all the objects of a container - * - * Returns a maximum of 10,000 object names. - * - * @param string $container - * @param array $options - * @return bool|Zend_Service_Rackspace_Files_ObjectList - * @throws Zend_Service_Rackspace_Exception - */ - public function getObjects($container,$options=array()) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container),'GET',null,$options); - if ($result->isSuccessful()) { - return new Zend_Service_Rackspace_Files_ObjectList($this,json_decode($result->getBody(),true),$container); - } - return false; - } - - /** - * Create a container - * - * @param string $container - * @param array $metadata - * @return bool|Zend_Service_Rackspace_Files_Container - * @throws Zend_Service_Rackspace_Exception - */ - public function createContainer($container,$metadata=array()) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $headers=array(); - if (!empty($metadata)) { - foreach ($metadata as $key => $value) { - $headers[self::METADATA_CONTAINER_HEADER.rawurlencode(strtolower($key))]= rawurlencode($value); - } - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container),'PUT',$headers); - $status= $result->getStatus(); - switch ($status) { - case '201': // break intentionally omitted - $data= array( - 'name' => $container - ); - return new Zend_Service_Rackspace_Files_Container($this,$data); - case '202': - $this->errorMsg= self::ERROR_CONTAINER_EXIST; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Delete a container (only if it's empty) - * - * @param string $container - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function deleteContainer($container) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container),'DELETE'); - $status= $result->getStatus(); - switch ($status) { - case '204': // break intentionally omitted - return true; - case '409': - $this->errorMsg= self::ERROR_CONTAINER_NOT_EMPTY; - break; - case '404': - $this->errorMsg= self::ERROR_CONTAINER_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Get the metadata of a container - * - * @param string $container - * @return array|bool - * @throws Zend_Service_Rackspace_Exception - */ - public function getMetadataContainer($container) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container),'HEAD'); - $status= $result->getStatus(); - switch ($status) { - case '204': // break intentionally omitted - $headers= $result->getHeaders(); - $count= strlen(self::METADATA_CONTAINER_HEADER); - // Zend_Http_Response alters header name in array key, so match our header to what will be in the headers array - $headerName = ucwords(strtolower(self::METADATA_CONTAINER_HEADER)); - $metadata= array(); - foreach ($headers as $type => $value) { - if (strpos($type,$headerName)!==false) { - $metadata[strtolower(substr($type, $count))]= $value; - } - } - $data= array ( - 'name' => $container, - 'count' => $result->getHeader(self::CONTAINER_OBJ_COUNT), - 'bytes' => $result->getHeader(self::CONTAINER_BYTES_USE), - 'metadata' => $metadata - ); - return $data; - case '404': - $this->errorMsg= self::ERROR_CONTAINER_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get a container - * - * @param string $container - * @return Zend_Service_Rackspace_Files_Container|bool - */ - public function getContainer($container) { - $result= $this->getMetadataContainer($container); - if (!empty($result)) { - return new Zend_Service_Rackspace_Files_Container($this,$result); - } - return false; - } - - /** - * Get an object in a container - * - * @param string $container - * @param string $object - * @param array $headers - * @return bool|Zend_Service_Rackspace_Files_Object - * @throws Zend_Service_Rackspace_Exception - */ - public function getObject($container,$object,$headers=array()) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($object)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container).'/'.rawurlencode($object),'GET',$headers); - $status= $result->getStatus(); - switch ($status) { - case '200': // break intentionally omitted - $data= array( - 'name' => $object, - 'container' => $container, - 'hash' => $result->getHeader(self::HEADER_HASH), - 'bytes' => $result->getHeader(self::HEADER_CONTENT_LENGTH), - 'last_modified' => $result->getHeader(self::HEADER_LAST_MODIFIED), - 'content_type' => $result->getHeader(self::HEADER_CONTENT_TYPE), - 'content' => $result->getBody() - ); - return new Zend_Service_Rackspace_Files_Object($this,$data); - case '404': - $this->errorMsg= self::ERROR_OBJECT_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Store a file in a container - * - * @param string $container - * @param string $object - * @param string $content - * @param array $metadata - * @param string $content_type - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function storeObject($container,$object,$content,$metadata=array(),$content_type=null) { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($object)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - if (empty($content)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_CONTENT); - } - if (!empty($content_type)) { - $headers[self::HEADER_CONTENT_TYPE]= $content_type; - } - if (!empty($metadata) && is_array($metadata)) { - foreach ($metadata as $key => $value) { - $headers[self::METADATA_OBJECT_HEADER.$key]= $value; - } - } - $headers[self::HEADER_HASH]= md5($content); - $headers[self::HEADER_CONTENT_LENGTH]= strlen($content); - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container).'/'.rawurlencode($object),'PUT',$headers,null,$content); - $status= $result->getStatus(); - switch ($status) { - case '201': // break intentionally omitted - return true; - case '412': - $this->errorMsg= self::ERROR_OBJECT_MISSING_PARAM; - break; - case '422': - $this->errorMsg= self::ERROR_OBJECT_CHECKSUM; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Delete an object in a container - * - * @param string $container - * @param string $object - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function deleteObject($container,$object) { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($object)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container).'/'.rawurlencode($object),'DELETE'); - $status= $result->getStatus(); - switch ($status) { - case '204': // break intentionally omitted - return true; - case '404': - $this->errorMsg= self::ERROR_OBJECT_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Copy an object from a container to another - * - * @param string $container_source - * @param string $obj_source - * @param string $container_dest - * @param string $obj_dest - * @param array $metadata - * @param string $content_type - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function copyObject($container_source,$obj_source,$container_dest,$obj_dest,$metadata=array(),$content_type=null) { - if (empty($container_source)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_SOURCE_CONTAINER); - } - if (empty($obj_source)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_SOURCE_OBJECT); - } - if (empty($container_dest)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_DEST_CONTAINER); - } - if (empty($obj_dest)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_DEST_OBJECT); - } - $headers= array( - self::HEADER_COPY_FROM => '/'.rawurlencode($container_source).'/'.rawurlencode($obj_source), - self::HEADER_CONTENT_LENGTH => 0 - ); - if (!empty($content_type)) { - $headers[self::HEADER_CONTENT_TYPE]= $content_type; - } - if (!empty($metadata) && is_array($metadata)) { - foreach ($metadata as $key => $value) { - $headers[self::METADATA_OBJECT_HEADER.$key]= $value; - } - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container_dest).'/'.rawurlencode($obj_dest),'PUT',$headers); - $status= $result->getStatus(); - switch ($status) { - case '201': // break intentionally omitted - return true; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Get the metadata of an object - * - * @param string $container - * @param string $object - * @return array|bool - * @throws Zend_Service_Rackspace_Exception - */ - public function getMetadataObject($container,$object) { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($object)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container).'/'.rawurlencode($object),'HEAD'); - $status= $result->getStatus(); - switch ($status) { - case '200': // break intentionally omitted - $headers= $result->getHeaders(); - $count= strlen(self::METADATA_OBJECT_HEADER); - // Zend_Http_Response alters header name in array key, so match our header to what will be in the headers array - $headerName = ucwords(strtolower(self::METADATA_OBJECT_HEADER)); - $metadata= array(); - foreach ($headers as $type => $value) { - if (strpos($type,$headerName)!==false) { - $metadata[strtolower(substr($type, $count))]= $value; - } - } - $data= array ( - 'name' => $object, - 'container' => $container, - 'hash' => $result->getHeader(self::HEADER_HASH), - 'bytes' => $result->getHeader(self::HEADER_CONTENT_LENGTH), - 'content_type' => $result->getHeader(self::HEADER_CONTENT_TYPE), - 'last_modified' => $result->getHeader(self::HEADER_LAST_MODIFIED), - 'metadata' => $metadata - ); - return $data; - case '404': - $this->errorMsg= self::ERROR_OBJECT_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Set the metadata of a object in a container - * The old metadata values are replaced with the new one - * - * @param string $container - * @param string $object - * @param array $metadata - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function setMetadataObject($container,$object,$metadata) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($object)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - if (empty($metadata) || !is_array($metadata)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_OBJECT); - } - $headers=array(); - foreach ($metadata as $key => $value) { - $headers[self::METADATA_OBJECT_HEADER.$key]= $value; - } - $result= $this->httpCall($this->getStorageUrl().'/'.rawurlencode($container).'/'.rawurlencode($object),'POST',$headers); - $status= $result->getStatus(); - switch ($status) { - case '202': // break intentionally omitted - return true; - case '404': - $this->errorMsg= self::ERROR_OBJECT_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Enable the CDN for a container - * - * @param string $container - * @param int $ttl - * @return array|bool - * @throws Zend_Service_Rackspace_Exception - */ - public function enableCdnContainer ($container,$ttl=self::CDN_TTL_MIN) { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $headers=array(); - if (is_numeric($ttl) && ($ttl>=self::CDN_TTL_MIN) && ($ttl<=self::CDN_TTL_MAX)) { - $headers[self::CDN_TTL]= $ttl; - } else { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_CDN_TTL_OUT_OF_RANGE); - } - $result= $this->httpCall($this->getCdnUrl().'/'.rawurlencode($container),'PUT',$headers); - $status= $result->getStatus(); - switch ($status) { - case '201': - case '202': // break intentionally omitted - $data= array ( - 'cdn_uri' => $result->getHeader(self::CDN_URI), - 'cdn_uri_ssl' => $result->getHeader(self::CDN_SSL_URI) - ); - return $data; - case '404': - $this->errorMsg= self::ERROR_CONTAINER_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Update the attribute of a CDN container - * - * @param string $container - * @param int $ttl - * @param bool $cdn_enabled - * @param bool $log - * @return bool - * @throws Zend_Service_Rackspace_Exception - */ - public function updateCdnContainer($container,$ttl=null,$cdn_enabled=null,$log=null) - { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - if (empty($ttl) && (!isset($cdn_enabled)) && (!isset($log))) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_UPDATE_CDN); - } - $headers=array(); - if (isset($ttl)) { - if (is_numeric($ttl) && ($ttl>=self::CDN_TTL_MIN) && ($ttl<=self::CDN_TTL_MAX)) { - $headers[self::CDN_TTL]= $ttl; - } else { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_CDN_TTL_OUT_OF_RANGE); - } - } - if (isset($cdn_enabled)) { - if ($cdn_enabled===true) { - $headers[self::CDN_ENABLED]= 'true'; - } else { - $headers[self::CDN_ENABLED]= 'false'; - } - } - if (isset($log)) { - if ($log===true) { - $headers[self::CDN_LOG_RETENTION]= 'true'; - } else { - $headers[self::CDN_LOG_RETENTION]= 'false'; - } - } - $result= $this->httpCall($this->getCdnUrl().'/'.rawurlencode($container),'POST',$headers); - $status= $result->getStatus(); - switch ($status) { - case '200': - case '202': // break intentionally omitted - return true; - case '404': - $this->errorMsg= self::ERROR_CONTAINER_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - - /** - * Get the information of a Cdn container - * - * @param string $container - * @return array|bool - * @throws Zend_Service_Rackspace_Exception - */ - public function getInfoCdnContainer($container) { - if (empty($container)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME_CONTAINER); - } - $result= $this->httpCall($this->getCdnUrl().'/'.rawurlencode($container),'HEAD'); - $status= $result->getStatus(); - switch ($status) { - case '204': // break intentionally omitted - $data= array ( - 'ttl' => $result->getHeader(self::CDN_TTL), - 'cdn_uri' => $result->getHeader(self::CDN_URI), - 'cdn_uri_ssl' => $result->getHeader(self::CDN_SSL_URI) - ); - $data['cdn_enabled']= (strtolower($result->getHeader(self::CDN_ENABLED))!=='false'); - $data['log_retention']= (strtolower($result->getHeader(self::CDN_LOG_RETENTION))!=='false'); - return $data; - case '404': - $this->errorMsg= self::ERROR_CONTAINER_NOT_FOUND; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } -} diff --git a/library/Zend/Service/Rackspace/Files/Container.php b/library/Zend/Service/Rackspace/Files/Container.php deleted file mode 100644 index a621e46c8b..0000000000 --- a/library/Zend/Service/Rackspace/Files/Container.php +++ /dev/null @@ -1,405 +0,0 @@ -service = $service; - $this->name = $data['name']; - } - - /** - * Get the name of the container - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Get the size in bytes of the container - * - * @return integer|bool - */ - public function getSize() - { - $data = $this->getInfo(); - if (isset($data['bytes'])) { - return $data['bytes']; - } - - return false; - } - - /** - * Get the total count of objects in the container - * - * @return integer|bool - */ - public function getObjectCount() - { - $data = $this->getInfo(); - if (isset($data['count'])) { - return $data['count']; - } - - return false; - } - - /** - * Return true if the container is CDN enabled - * - * @return bool - */ - public function isCdnEnabled() - { - $data = $this->getCdnInfo(); - if (isset($data['cdn_enabled'])) { - return $data['cdn_enabled']; - } - - return false; - } - - /** - * Get the TTL of the CDN - * - * @return integer|bool - */ - public function getCdnTtl() - { - $data = $this->getCdnInfo(); - if (isset($data['ttl'])) { - return $data['ttl']; - } - - return false; - } - - /** - * Return true if the log retention is enabled for the CDN - * - * @return bool - */ - public function isCdnLogEnabled() - { - $data = $this->getCdnInfo(); - if (isset($data['log_retention'])) { - return $data['log_retention']; - } - - return false; - } - - /** - * Get the CDN URI - * - * @return string|bool - */ - public function getCdnUri() - { - $data = $this->getCdnInfo(); - if (isset($data['cdn_uri'])) { - return $data['cdn_uri']; - } - - return false; - } - - /** - * Get the CDN URI SSL - * - * @return string|bool - */ - public function getCdnUriSsl() - { - $data = $this->getCdnInfo(); - if (isset($data['cdn_uri_ssl'])) { - return $data['cdn_uri_ssl']; - } - - return false; - } - - /** - * Get the metadata of the container - * - * If $key is empty return the array of metadata - * - * @param string $key - * - * @return array|string|bool - */ - public function getMetadata($key = null) - { - $result = $this->service->getMetadataContainer($this->getName()); - if (!empty($result) && is_array($result)) { - if (empty($key)) { - return $result['metadata']; - } else { - if (isset ($result['metadata'][$key])) { - return $result['metadata'][$key]; - } - } - } - - return false; - } - - /** - * Get the information of the container (total of objects, total size) - * - * @return array|bool - */ - public function getInfo() - { - $result = $this->service->getMetadataContainer($this->getName()); - if (!empty($result) && is_array($result)) { - return $result; - } - - return false; - } - - /** - * Get all the object of the container - * - * @return Zend_Service_Rackspace_Files_ObjectList - */ - public function getObjects() - { - return $this->service->getObjects($this->getName()); - } - - /** - * Get an object of the container - * - * @param string $name - * @param array $headers - * - * @return Zend_Service_Rackspace_Files_Object|bool - */ - public function getObject($name, $headers = array()) - { - return $this->service->getObject($this->getName(), $name, $headers); - } - - /** - * Add an object in the container - * - * @param string $name - * @param string $file the content of the object - * @param array $metadata - * - * @return bool - */ - public function addObject($name, $file, $metadata = array()) - { - return $this->service->storeObject( - $this->getName(), $name, $file, $metadata - ); - } - - /** - * Delete an object in the container - * - * @param string $obj - * - * @return bool - */ - public function deleteObject($obj) - { - return $this->service->deleteObject($this->getName(), $obj); - } - - /** - * Copy an object to another container - * - * @param string $obj_source - * @param string $container_dest - * @param string $obj_dest - * @param array $metadata - * @param string $content_type - * - * @return bool - */ - public function copyObject( - $obj_source, $container_dest, $obj_dest, $metadata = array(), - $content_type = null - ) - { - return $this->service->copyObject( - $this->getName(), - $obj_source, - $container_dest, - $obj_dest, - $metadata, - $content_type - ); - } - - /** - * Get the metadata of an object in the container - * - * @param string $object - * - * @return array - */ - public function getMetadataObject($object) - { - return $this->service->getMetadataObject($this->getName(), $object); - } - - /** - * Set the metadata of an object in the container - * - * @param string $object - * @param array $metadata - * - * @return bool - */ - public function setMetadataObject($object, $metadata = array()) - { - return $this->service->setMetadataObject( - $this->getName(), $object, $metadata - ); - } - - /** - * Enable the CDN for the container - * - * @param integer $ttl - * - * @return array|bool - */ - public function enableCdn($ttl = Zend_Service_Rackspace_Files::CDN_TTL_MIN) - { - return $this->service->enableCdnContainer($this->getName(), $ttl); - } - - /** - * Disable the CDN for the container - * - * @return bool - */ - public function disableCdn() - { - $result = - $this->service->updateCdnContainer($this->getName(), null, false); - - return ($result !== false); - } - - /** - * Change the TTL for the CDN container - * - * @param integer $ttl - * - * @return bool - */ - public function changeTtlCdn($ttl) - { - $result = $this->service->updateCdnContainer($this->getName(), $ttl); - - return ($result !== false); - } - - /** - * Enable the log retention for the CDN - * - * @return bool - */ - public function enableLogCdn() - { - $result = $this->service->updateCdnContainer( - $this->getName(), null, null, true - ); - - return ($result !== false); - } - - /** - * Disable the log retention for the CDN - * - * @return bool - */ - public function disableLogCdn() - { - $result = $this->service->updateCdnContainer( - $this->getName(), null, null, false - ); - - return ($result !== false); - } - - /** - * Get the CDN information - * - * @return array|bool - */ - public function getCdnInfo() - { - return $this->service->getInfoCdnContainer($this->getName()); - } -} diff --git a/library/Zend/Service/Rackspace/Files/ContainerList.php b/library/Zend/Service/Rackspace/Files/ContainerList.php deleted file mode 100644 index ca605e4269..0000000000 --- a/library/Zend/Service/Rackspace/Files/ContainerList.php +++ /dev/null @@ -1,221 +0,0 @@ -service= $service; - $this->_constructFromArray($list); - } - /** - * Transforms the Array to array of container - * - * @param array $list - * @return void - */ - private function _constructFromArray(array $list) - { - foreach ($list as $container) { - $this->_addObject(new Zend_Service_Rackspace_Files_Container($this->service,$container)); - } - } - /** - * Add an object - * - * @param Zend_Service_Rackspace_Files_Container $obj - * @return Zend_Service_Rackspace_Files_ContainerList - */ - protected function _addObject (Zend_Service_Rackspace_Files_Container $obj) - { - $this->objects[] = $obj; - return $this; - } - /** - * Return number of servers - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->objects); - } - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Rackspace_Files_Container - */ - public function current() - { - return $this->objects[$this->iteratorKey]; - } - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->iteratorKey; - } - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->iteratorKey += 1; - } - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->iteratorKey = 0; - } - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return bool - */ - public function valid() - { - $numItems = $this->count(); - if ($numItems > 0 && $this->iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Files_Exception - * @return Zend_Service_Rackspace_Files_Container - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->objects[$offset]; - } else { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Rackspace_Files_Exception - */ - public function offsetSet($offset, $value) - { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Files_Exception - */ - public function offsetUnset($offset) - { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/Rackspace/Files/Exception.php b/library/Zend/Service/Rackspace/Files/Exception.php deleted file mode 100644 index 14a3dd7208..0000000000 --- a/library/Zend/Service/Rackspace/Files/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -name = $data['name']; - $this->hash = $data['hash']; - $this->size = $data['bytes']; - $this->contentType = $data['content_type']; - $this->lastModified = $data['last_modified']; - - if (!empty($data['content'])) { - $this->content = $data['content']; - } - } elseif (array_key_exists('subdir', $data)) { - $this->name = $data['subdir']; - } else { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception( - 'You must pass the name of the object in the array (name)' - ); - } - - $this->container = $data['container']; - $this->service = $service; - } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Get the name of the container - * - * @return string - */ - public function getContainer() - { - return $this->container; - } - - /** - * Get the MD5 of the object's content - * - * @return string|boolean - */ - public function getHash() - { - return $this->hash; - } - - /** - * Get the size (in bytes) of the object's content - * - * @return integer|boolean - */ - public function getSize() - { - return $this->size; - } - - /** - * Get the content type of the object's content - * - * @return string - */ - public function getContentType() - { - return $this->contentType; - } - - /** - * Get the data of the last modified of the object - * - * @return string - */ - public function getLastModified() - { - return $this->lastModified; - } - - /** - * Get the content of the object - * - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Get the metadata of the object - * If you don't pass the $key it returns the entire array of metadata value - * - * @param string $key - * @return string|array|boolean - */ - public function getMetadata($key=null) - { - $result= $this->service->getMetadataObject($this->container,$this->name); - if (!empty($result)) { - if (empty($key)) { - return $result['metadata']; - } - if (isset($result['metadata'][$key])) { - return $result['metadata'][$key]; - } - } - return false; - } - - /** - * Set the metadata value - * The old metadata values are replaced with the new one - * - * @param array $metadata - * @return boolean - */ - public function setMetadata($metadata) - { - return $this->service->setMetadataObject($this->container,$this->name,$metadata); - } - - /** - * Copy the object to another container - * You can add metadata information to the destination object, change the - * content_type and the name of the object - * - * @param string $container_dest - * @param string $name_dest - * @param array $metadata - * @param string $content_type - * @return boolean - */ - public function copyTo($container_dest,$name_dest,$metadata=array(),$content_type=null) - { - return $this->service->copyObject($this->container,$this->name,$container_dest,$name_dest,$metadata,$content_type); - } - - /** - * Get the CDN URL of the object - * - * @return string - */ - public function getCdnUrl() - { - $result= $this->service->getInfoCdnContainer($this->container); - if ($result!==false) { - if ($result['cdn_enabled']) { - return $result['cdn_uri'].'/'.$this->name; - } - } - return false; - } - - /** - * Get the CDN SSL URL of the object - * - * @return string - */ - public function getCdnUrlSsl() - { - $result= $this->service->getInfoCdnContainer($this->container); - if ($result!==false) { - if ($result['cdn_enabled']) { - return $result['cdn_uri_ssl'].'/'.$this->name; - } - } - return false; - } -} diff --git a/library/Zend/Service/Rackspace/Files/ObjectList.php b/library/Zend/Service/Rackspace/Files/ObjectList.php deleted file mode 100644 index 0b86b4bcc1..0000000000 --- a/library/Zend/Service/Rackspace/Files/ObjectList.php +++ /dev/null @@ -1,237 +0,0 @@ -service= $service; - $this->container= $container; - $this->_constructFromArray($list); - } - /** - * Transforms the Array to array of container - * - * @param array $list - * @return void - */ - private function _constructFromArray(array $list) - { - foreach ($list as $obj) { - $obj['container']= $this->container; - $this->_addObject(new Zend_Service_Rackspace_Files_Object($this->service,$obj)); - } - } - /** - * Add an object - * - * @param Zend_Service_Rackspace_Files_Object $obj - * @return Zend_Service_Rackspace_Files_ObjectList - */ - protected function _addObject (Zend_Service_Rackspace_Files_Object $obj) - { - $this->objects[] = $obj; - return $this; - } - /** - * Return number of servers - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->objects); - } - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Rackspace_Files_Object - */ - public function current() - { - return $this->objects[$this->iteratorKey]; - } - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->iteratorKey; - } - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->iteratorKey += 1; - } - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->iteratorKey = 0; - } - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return bool - */ - public function valid() - { - $numItems = $this->count(); - if ($numItems > 0 && $this->iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Files_Exception - * @return Zend_Service_Rackspace_Files_Object - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->objects[$offset]; - } else { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Rackspace_Files_Exception - */ - public function offsetSet($offset, $value) - { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Files_Exception - */ - public function offsetUnset($offset) - { - #require_once 'Zend/Service/Rackspace/Files/Exception.php'; - throw new Zend_Service_Rackspace_Files_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/Rackspace/Servers.php b/library/Zend/Service/Rackspace/Servers.php deleted file mode 100644 index 830047ba5f..0000000000 --- a/library/Zend/Service/Rackspace/Servers.php +++ /dev/null @@ -1,1281 +0,0 @@ -httpCall($this->getManagementUrl().$url,'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $servers= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_ServerList($this,$servers['servers']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the specified server - * - * @param string $id - * @return Zend_Service_Rackspace_Servers_Server - */ - public function getServer($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $server = json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_Server($this,$server['server']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Create a new server - * - * The required parameters are specified in $data (name, imageId, falvorId) - * The $files is an associative array with 'serverPath' => 'localPath' - * - * @param array $data - * @param array $metadata - * @param array $files - * @return Zend_Service_Rackspace_Servers_Server|boolean - */ - public function createServer(array $data, $metadata=array(),$files=array()) - { - if (empty($data) || !is_array($data) || !is_array($metadata) || !is_array($files)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ARRAY); - } - if (!isset($data['name'])) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); - } - if (!isset($data['flavorId'])) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_FLAVORID); - } - if (!isset($data['imageId'])) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_IMAGEID); - } - if (count($files)>self::LIMIT_NUM_FILE) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You can attach '.self::LIMIT_NUM_FILE.' files maximum'); - } - if (!empty($metadata)) { - $data['metadata']= $metadata; - } - $data['flavorId']= (integer) $data['flavorId']; - $data['imageId']= (integer) $data['imageId']; - if (!empty($files)) { - foreach ($files as $serverPath => $filePath) { - if (!file_exists($filePath)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception( - sprintf("The file %s doesn't exist",$filePath)); - } - $content= file_get_contents($filePath); - if (strlen($content) > self::LIMIT_FILE_SIZE) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception( - sprintf("The size of the file %s is greater than the max size of %d bytes", - $filePath,self::LIMIT_FILE_SIZE)); - } - $data['personality'][] = array ( - 'path' => $serverPath, - 'contents' => base64_encode(file_get_contents($filePath)) - ); - } - } - $result = $this->httpCall($this->getManagementUrl().'/servers','POST', - null,null,json_encode(array ('server' => $data))); - $status = $result->getStatus(); - switch ($status) { - case '200' : - case '202' : // break intentionally omitted - $server = json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_Server($this,$server['server']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Change the name or the admin password for a server - * - * @param string $id - * @param string $name - * @param string $password - * @return boolean - */ - protected function updateServer($id,$name=null,$password=null) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); - } - if (empty($name) && empty($password)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("You must specify the new name or password of server"); - } - $data= array(); - if (!empty($name)) { - $data['name']= $name; - } - if (!empty($password)) { - $data['adminPass']= $password; - } - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'PUT', - null,null,json_encode(array('server' => $data))); - $status = $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Change the server's name - * - * @param string $id - * @param string $name - * @return boolean - */ - public function changeServerName($id,$name) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); - } - if (empty($name)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("You must specify the new name of the server"); - } - return $this->updateServer($id, $name); - } - /** - * Change the admin password of the server - * - * @param string $id - * @param string $password - * @return boolean - */ - public function changeServerPassword($id,$password) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); - } - if (empty($password)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("You must specify the new password of the server"); - } - return $this->updateServer($id, null,$password); - } - /** - * Delete a server - * - * @param string $id - * @return boolean - */ - public function deleteServer($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); - } - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'DELETE'); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the server's IPs (public and private) - * - * @param string $id - * @return array|boolean - */ - public function getServerIp($id) - { - $result= $this->getServer($id); - if ($result===false) { - return false; - } - $result= $result->toArray(); - return $result['addresses']; - } - /** - * Get the Public IPs of a server - * - * @param string $id - * @return array|boolean - */ - public function getServerPublicIp($id) - { - $addresses= $this->getServerIp($id); - if ($addresses===false) { - return false; - } - return $addresses['public']; - } - /** - * Get the Private IPs of a server - * - * @param string $id - * @return array|boolean - */ - public function getServerPrivateIp($id) - { - $addresses= $this->getServerIp($id); - if ($addresses===false) { - return false; - } - return $addresses['private']; - } - /** - * Share an ip address for a server (id) - * - * @param string $id server - * @param string $ip - * @param string $groupId - * @return boolean - */ - public function shareIpAddress($id,$ip,$groupId,$configure=true) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - if (empty($ip)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the IP address to share'); - } - $validator = new Zend_Validate_Ip(); - if (!$validator->isValid($ip)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("The parameter $ip specified is not a valid IP address"); - } - if (empty($groupId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the group id to use'); - } - $data= array ( - 'sharedIpGroupId' => (integer) $groupId, - 'configureServer' => $configure - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/ips/public/'.rawurlencode($ip),'PUT', - null,null,json_encode(array('shareIp' => $data))); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Unshare IP address for a server ($id) - * - * @param string $id - * @param string $ip - * @return boolean - */ - public function unshareIpAddress($id,$ip) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - if (empty($ip)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the IP address to share'); - } - $validator = new Zend_Validate_Ip(); - if (!$validator->isValid($ip)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception("The parameter $ip specified is not a valid IP address"); - } - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/ips/public/'.rawurlencode($ip), - 'DELETE'); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Reboot a server - * - * $hard true is the equivalent of power cycling the server - * $hard false is a graceful shutdown - * - * @param string $id - * @param boolean $hard - * @return boolean - */ - public function rebootServer($id,$hard=false) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - if (!$hard) { - $type= 'SOFT'; - } else { - $type= 'HARD'; - } - $data= array ( - 'reboot' => array ( - 'type' => $type - ) - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', - 'POST', null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '200' : - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Rebuild a server - * - * The rebuild function removes all data on the server and replaces it with the specified image, - * serverId and IP addresses will remain the same. - * - * @param string $id - * @param string $imageId - * @return boolean - */ - public function rebuildServer($id,$imageId) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - if (empty($imageId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new imageId of the server'); - } - $data= array ( - 'rebuild' => array ( - 'imageId' => (integer) $imageId - ) - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', - 'POST', null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Resize a server - * - * The resize function converts an existing server to a different flavor, in essence, scaling the - * server up or down. The original server is saved for a period of time to allow rollback if there - * is a problem. All resizes should be tested and explicitly confirmed, at which time the original - * server is removed. All resizes are automatically confirmed after 24 hours if they are not - * explicitly confirmed or reverted. - * - * @param string $id - * @param string $flavorId - * @return boolean - */ - public function resizeServer($id,$flavorId) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - if (empty($flavorId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new flavorId of the server'); - } - $data= array ( - 'resize' => array ( - 'flavorId' => (integer) $flavorId - ) - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', - 'POST', null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '403' : - $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Confirm resize of a server - * - * During a resize operation, the original server is saved for a period of time to allow roll - * back if there is a problem. Once the newly resized server is tested and has been confirmed - * to be functioning properly, use this operation to confirm the resize. After confirmation, - * the original server is removed and cannot be rolled back to. All resizes are automatically - * confirmed after 24 hours if they are not explicitly confirmed or reverted. - * - * @param string $id - * @return boolean - */ - public function confirmResizeServer($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - $data= array ( - 'confirmResize' => null - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', - 'POST', null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '403' : - $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Revert resize of a server - * - * During a resize operation, the original server is saved for a period of time to allow for roll - * back if there is a problem. If you determine there is a problem with a newly resized server, - * use this operation to revert the resize and roll back to the original server. All resizes are - * automatically confirmed after 24 hours if they have not already been confirmed explicitly or - * reverted. - * - * @param string $id - * @return boolean - */ - public function revertResizeServer($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); - } - $data= array ( - 'revertResize' => null - ); - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', - 'POST', null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '403' : - $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the list of the flavors - * - * If $details is true returns detail info - * - * @param boolean $details - * @return array|boolean - */ - public function listFlavors($details=false) - { - $url= '/flavors'; - if ($details) { - $url.= '/detail'; - } - $result= $this->httpCall($this->getManagementUrl().$url,'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $flavors= json_decode($result->getBody(),true); - return $flavors['flavors']; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the detail of a flavor - * - * @param string $flavorId - * @return array|boolean - */ - public function getFlavor($flavorId) - { - if (empty($flavorId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new flavorId of the server'); - } - $result= $this->httpCall($this->getManagementUrl().'/flavors/'.rawurlencode($flavorId),'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $flavor= json_decode($result->getBody(),true); - return $flavor['flavor']; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the list of the images - * - * @param boolean $details - * @return Zend_Service_Rackspace_Servers_ImageList|boolean - */ - public function listImages($details=false) - { - $url= '/images'; - if ($details) { - $url.= '/detail'; - } - $result= $this->httpCall($this->getManagementUrl().$url,'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $images= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_ImageList($this,$images['images']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get detail about an image - * - * @param string $id - * @return Zend_Service_Rackspace_Servers_Image|boolean - */ - public function getImage($id) - { - $result= $this->httpCall($this->getManagementUrl().'/images/'.rawurlencode($id),'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $image= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_Image($this,$image['image']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Create an image for a serverId - * - * @param string $serverId - * @param string $name - * @return Zend_Service_Rackspace_Servers_Image - */ - public function createImage($serverId,$name) - { - if (empty($serverId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_SERVERID); - } - if (empty($name)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); - } - $data = array( - 'image' => array ( - 'serverId' => (integer) $serverId, - 'name' => $name - ) - ); - $result = $this->httpCall($this->getManagementUrl().'/images', 'POST', - null, null, json_encode($data)); - $status = $result->getStatus(); - switch ($status) { - case '202' : // break intentionally omitted - $image= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_Image($this,$image['image']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '403' : - $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Delete an image - * - * @param string $id - * @return boolean - */ - public function deleteImage($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result = $this->httpCall($this->getManagementUrl().'/images/'.rawurlencode($id),'DELETE'); - $status = $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the backup schedule of a server - * - * @param string $id server's Id - * @return array|boolean - */ - public function getBackupSchedule($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', - 'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $backup = json_decode($result->getBody(),true); - return $backup['backupSchedule']; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Change the backup schedule of a server - * - * @param string $id server's Id - * @param string $weekly - * @param string $daily - * @return boolean - */ - public function changeBackupSchedule($id,$weekly,$daily) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - if (empty($weekly)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_WEEKLY); - } - if (empty($daily)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_DAILY); - } - $data = array ( - 'backupSchedule' => array ( - 'enabled' => true, - 'weekly' => $weekly, - 'daily' => $daily - ) - ); - $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', - 'POST',null,null,json_encode($data)); - $status= $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Disable the backup schedule for a server - * - * @param string $id server's Id - * @return boolean - */ - public function disableBackupSchedule($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', - 'DELETE'); - $status = $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '409' : - $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the list of shared IP groups - * - * @param boolean $details - * @return Zend_Service_Rackspace_Servers_SharedIpGroupList|boolean - */ - public function listSharedIpGroups($details=false) - { - $url= '/shared_ip_groups'; - if ($details) { - $url.= '/detail'; - } - $result= $this->httpCall($this->getManagementUrl().$url,'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $groups= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_SharedIpGroupList($this,$groups['sharedIpGroups']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Get the shared IP group - * - * @param integer $id - * @return Zend_Service_Rackspace_Servers_SharedIpGroup|boolean - */ - public function getSharedIpGroup($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups/'.rawurlencode($id),'GET'); - $status= $result->getStatus(); - switch ($status) { - case '200' : - case '203' : // break intentionally omitted - $group= json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_SharedIpGroup($this,$group['sharedIpGroup']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Create a shared Ip group - * - * @param string $name - * @param string $serverId - * @return array|boolean - */ - public function createSharedIpGroup($name,$serverId) - { - if (empty($name)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); - } - if (empty($serverId)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $data = array ( - 'sharedIpGroup' => array ( - 'name' => $name, - 'server' => (integer) $serverId - ) - ); - $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups', - 'POST',null,null,json_encode($data)); - $status= $result->getStatus(); - switch ($status) { - case '201' : // break intentionally omitted - $group = json_decode($result->getBody(),true); - return new Zend_Service_Rackspace_Servers_SharedIpGroup($this,$group['sharedIpGroup']); - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } - /** - * Delete a Shared Ip Group - * - * @param integer $id - * @return boolean - */ - public function deleteSharedIpGroup($id) - { - if (empty($id)) { - #require_once 'Zend/Service/Rackspace/Exception.php'; - throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); - } - $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups/'.rawurlencode($id),'DELETE'); - $status= $result->getStatus(); - switch ($status) { - case '204' : // break intentionally omitted - return true; - case '503' : - $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; - break; - case '401' : - $this->errorMsg= self::ERROR_UNAUTHORIZED; - break; - case '404' : - $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; - break; - case '413' : - $this->errorMsg= self::ERROR_OVERLIMIT; - break; - default: - $this->errorMsg= $result->getBody(); - break; - } - $this->errorCode= $status; - return false; - } -} diff --git a/library/Zend/Service/Rackspace/Servers/Exception.php b/library/Zend/Service/Rackspace/Servers/Exception.php deleted file mode 100644 index caa398bc03..0000000000 --- a/library/Zend/Service/Rackspace/Servers/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -service= $service; - $this->name = $data['name']; - $this->id = $data['id']; - if (isset($data['serverId'])) { - $this->serverId= $data['serverId']; - } - if (isset($data['updated'])) { - $this->updated= $data['updated']; - } - if (isset($data['created'])) { - $this->created= $data['created']; - } - if (isset($data['status'])) { - $this->status= $data['status']; - } - if (isset($data['progress'])) { - $this->progress= $data['progress']; - } - } - /** - * Get the name of the image - * - * @return string - */ - public function getName() - { - return $this->name; - } - /** - * Get the image's id - * - * @return string - */ - public function getId() - { - return $this->id; - } - /** - * Get the server's id of the image - * - * @return string - */ - public function getServerId() - { - return $this->serverId; - } - /** - * Get the updated data - * - * @return string - */ - public function getUpdated() - { - return $this->updated; - } - /** - * Get the created data - * - * @return string - */ - public function getCreated() - { - return $this->created; - } - /** - * Get the image's status - * - * @return string|boolean - */ - public function getStatus() - { - $data= $this->service->getImage($this->id); - if ($data!==false) { - $data= $data->toArray(); - $this->status= $data['status']; - return $this->status; - } - return false; - } - /** - * Get the progress's status - * - * @return integer|boolean - */ - public function getProgress() - { - $data= $this->service->getImage($this->id); - if ($data!==false) { - $data= $data->toArray(); - $this->progress= $data['progress']; - return $this->progress; - } - return false; - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - return array ( - 'name' => $this->name, - 'id' => $this->id, - 'serverId' => $this->serverId, - 'updated' => $this->updated, - 'created' => $this->created, - 'status' => $this->status, - 'progress' => $this->progress - ); - } -} diff --git a/library/Zend/Service/Rackspace/Servers/ImageList.php b/library/Zend/Service/Rackspace/Servers/ImageList.php deleted file mode 100644 index 13c0b51512..0000000000 --- a/library/Zend/Service/Rackspace/Servers/ImageList.php +++ /dev/null @@ -1,234 +0,0 @@ -service= $service; - $this->constructFromArray($list); - } - /** - * Transforms the array to array of Server - * - * @param array $list - * @return void - */ - private function constructFromArray(array $list) - { - foreach ($list as $image) { - $this->addImage(new Zend_Service_Rackspace_Servers_Image($this->service,$image)); - } - } - /** - * Add an image - * - * @param Zend_Service_Rackspace_Servers_Image $image - * @return Zend_Service_Rackspace_Servers_ImageList - */ - protected function addImage (Zend_Service_Rackspace_Servers_Image $image) - { - $this->images[] = $image; - return $this; - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - $array= array(); - foreach ($this->images as $image) { - $array[]= $image->toArray(); - } - return $array; - } - /** - * Return number of images - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->images); - } - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Rackspace_Servers_Image - */ - public function current() - { - return $this->images[$this->iteratorKey]; - } - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->iteratorKey; - } - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->iteratorKey += 1; - } - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->iteratorKey = 0; - } - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return bool - */ - public function valid() - { - $numItems = $this->count(); - if ($numItems > 0 && $this->iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - * @return Zend_Service_Rackspace_Servers_Image - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->images[$offset]; - } else { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetSet($offset, $value) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetUnset($offset) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/Rackspace/Servers/Server.php b/library/Zend/Service/Rackspace/Servers/Server.php deleted file mode 100644 index cb1b88bbc8..0000000000 --- a/library/Zend/Service/Rackspace/Servers/Server.php +++ /dev/null @@ -1,325 +0,0 @@ -service = $service; - $this->name = $data['name']; - $this->id = $data['id']; - if (isset($data['imageId'])) { - $this->imageId= $data['imageId']; - } - if (isset($data['flavorId'])) { - $this->flavorId= $data['flavorId']; - } - if (isset($data['hostId'])) { - $this->hostId= $data['hostId']; - } - if (isset($data['status'])) { - $this->status= $data['status']; - } - if (isset($data['progress'])) { - $this->progress= $data['progress']; - } - if (isset($data['adminPass'])) { - $this->adminPass= $data['adminPass']; - } - if (isset($data['addresses']) && is_array($data['addresses'])) { - $this->addresses= $data['addresses']; - } - if (isset($data['metadata']) && is_array($data['metadata'])) { - $this->metadata= $data['metadata']; - } - } - /** - * Get the name of the server - * - * @return string - */ - public function getName() - { - return $this->name; - } - /** - * Get the server's id - * - * @return string - */ - public function getId() - { - return $this->id; - } - /** - * Get the server's image Id - * - * @return string - */ - public function getImageId() - { - return $this->imageId; - } - /** - * Get the server's flavor Id - * - * @return string - */ - public function getFlavorId() - { - return $this->flavorId; - } - /** - * Get the server's host Id - * - * @return string - */ - public function getHostId() - { - return $this->hostId; - } - /** - * Ge the server's admin password - * - * @return string - */ - public function getAdminPass() - { - return $this->adminPass; - } - /** - * Get the server's status - * - * @return string|boolean - */ - public function getStatus() - { - $data= $this->service->getServer($this->id); - if ($data!==false) { - $data= $data->toArray(); - $this->status= $data['status']; - return $this->status; - } - return false; - } - /** - * Get the progress's status - * - * @return integer|boolean - */ - public function getProgress() - { - $data= $this->service->getServer($this->id); - if ($data!==false) { - $data= $data->toArray(); - $this->progress= $data['progress']; - return $this->progress; - } - return false; - } - /** - * Get the private IPs - * - * @return array|boolean - */ - public function getPrivateIp() - { - if (isset($this->addresses['private'])) { - return $this->addresses['private']; - } - return false; - } - /** - * Get the public IPs - * - * @return array|boolean - */ - public function getPublicIp() - { - if (isset($this->addresses['public'])) { - return $this->addresses['public']; - } - return false; - } - /** - * Get the metadata of the container - * - * If $key is empty return the array of metadata - * - * @param string $key - * @return array|string - */ - public function getMetadata($key=null) - { - if (!empty($key) && isset($this->metadata[$key])) { - return $this->metadata[$key]; - } - return $this->metadata; - } - /** - * Change the name of the server - * - * @param string $name - * @return boolean - */ - public function changeName($name) - { - $result= $this->service->changeServerName($this->id, $name); - if ($result!==false) { - $this->name= $name; - return true; - } - return false; - } - /** - * Change the admin password of the server - * - * @param string $password - * @return boolean - */ - public function changePassword($password) - { - $result= $this->service->changeServerPassword($this->id, $password); - if ($result!==false) { - $this->adminPass= $password; - return true; - } - return false; - } - /** - * Reboot the server - * - * @return boolean - */ - public function reboot($hard=false) - { - return $this->service->rebootServer($this->id,$hard); - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - return array ( - 'name' => $this->name, - 'id' => $this->id, - 'imageId' => $this->imageId, - 'flavorId' => $this->flavorId, - 'hostId' => $this->hostId, - 'status' => $this->status, - 'progress' => $this->progress, - 'adminPass' => $this->adminPass, - 'addresses' => $this->addresses, - 'metadata' => $this->metadata - ); - } -} diff --git a/library/Zend/Service/Rackspace/Servers/ServerList.php b/library/Zend/Service/Rackspace/Servers/ServerList.php deleted file mode 100644 index d972744eb1..0000000000 --- a/library/Zend/Service/Rackspace/Servers/ServerList.php +++ /dev/null @@ -1,235 +0,0 @@ -service= $service; - $this->constructFromArray($list); - } - /** - * Transforms the array to array of Server - * - * @param array $list - * @return void - */ - private function constructFromArray(array $list) - { - foreach ($list as $server) { - $this->addServer(new Zend_Service_Rackspace_Servers_Server($this->service,$server)); - } - } - /** - * Add a server - * - * @param Zend_Service_Rackspace_Servers_Server $server - * @return Zend_Service_Rackspace_Servers_ServerList - */ - protected function addServer (Zend_Service_Rackspace_Servers_Server $server) - { - $this->servers[] = $server; - return $this; - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - $array= array(); - foreach ($this->servers as $server) { - $array[]= $server->toArray(); - } - return $array; - } - /** - * Return number of servers - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->servers); - } - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Rackspace_Servers_Server - */ - public function current() - { - return $this->servers[$this->iteratorKey]; - } - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->iteratorKey; - } - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->iteratorKey += 1; - } - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->iteratorKey = 0; - } - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return bool - */ - public function valid() - { - $numItems = $this->count(); - if ($numItems > 0 && $this->iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return bool - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - * @return Zend_Service_Rackspace_Servers_Server - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->servers[$offset]; - } else { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetSet($offset, $value) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetUnset($offset) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/Rackspace/Servers/SharedIpGroup.php b/library/Zend/Service/Rackspace/Servers/SharedIpGroup.php deleted file mode 100644 index 461682ad69..0000000000 --- a/library/Zend/Service/Rackspace/Servers/SharedIpGroup.php +++ /dev/null @@ -1,165 +0,0 @@ -service= $service; - $this->name = $data['name']; - $this->id = $data['id']; - if (isset($data['servers'])) { - $this->serversId= $data['servers']; - } - } - /** - * Get the name of the shared IP group - * - * @return string - */ - public function getName() - { - return $this->name; - } - /** - * Get the id of the shared IP group - * - * @return string - */ - public function getId() - { - return $this->id; - } - /** - * Get the server's array of the shared IP group - * - * @return string - */ - public function getServersId() - { - if (empty($this->serversId)) { - $info= $this->service->getSharedIpGroup($this->id); - if (($info!==false)) { - $info= $info->toArray(); - if (isset($info['servers'])) { - $this->serversId= $info['servers']; - } - } - } - return $this->serversId; - } - /** - * Get the server - * - * @param integer $id - * @return Zend_Service_Rackspace_Servers_Server|boolean - */ - public function getServer($id) - { - if (empty($this->serversId)) { - $this->getServersId(); - } - if (in_array($id,$this->serversId)) { - return $this->service->getServer($id); - } - return false; - } - /** - * Create a server in the shared Ip Group - * - * @param array $data - * @param array $metadata - * @param array $files - * @return Zend_Service_Rackspace_Servers_Server|boolean - */ - public function createServer(array $data, $metadata=array(),$files=array()) - { - $data['sharedIpGroupId']= (integer) $this->id; - return $this->service->createServer($data,$metadata,$files); - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - return array ( - 'name' => $this->name, - 'id' => $this->id, - 'servers' => $this->serversId - ); - } -} diff --git a/library/Zend/Service/Rackspace/Servers/SharedIpGroupList.php b/library/Zend/Service/Rackspace/Servers/SharedIpGroupList.php deleted file mode 100644 index abd5004174..0000000000 --- a/library/Zend/Service/Rackspace/Servers/SharedIpGroupList.php +++ /dev/null @@ -1,234 +0,0 @@ -service= $service; - $this->constructFromArray($list); - } - /** - * Transforms the array to array of Shared Ip Group - * - * @param array $list - * @return void - */ - private function constructFromArray(array $list) - { - foreach ($list as $share) { - $this->addSharedIpGroup(new Zend_Service_Rackspace_Servers_SharedIpGroup($this->service,$share)); - } - } - /** - * Add a shared Ip group - * - * @param Zend_Service_Rackspace_Servers_SharedIpGroup $shared - * @return Zend_Service_Rackspace_Servers_SharedIpGroupList - */ - protected function addSharedIpGroup (Zend_Service_Rackspace_Servers_SharedIpGroup $share) - { - $this->shared[] = $share; - return $this; - } - /** - * To Array - * - * @return array - */ - public function toArray() - { - $array= array(); - foreach ($this->shared as $share) { - $array[]= $share->toArray(); - } - return $array; - } - /** - * Return number of shared Ip Groups - * - * Implement Countable::count() - * - * @return int - */ - public function count() - { - return count($this->shared); - } - /** - * Return the current element - * - * Implement Iterator::current() - * - * @return Zend_Service_Rackspace_Servers_SharedIpGroup - */ - public function current() - { - return $this->shared[$this->iteratorKey]; - } - /** - * Return the key of the current element - * - * Implement Iterator::key() - * - * @return int - */ - public function key() - { - return $this->iteratorKey; - } - /** - * Move forward to next element - * - * Implement Iterator::next() - * - * @return void - */ - public function next() - { - $this->iteratorKey += 1; - } - /** - * Rewind the Iterator to the first element - * - * Implement Iterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->iteratorKey = 0; - } - /** - * Check if there is a current element after calls to rewind() or next() - * - * Implement Iterator::valid() - * - * @return boolean - */ - public function valid() - { - $numItems = $this->count(); - if ($numItems > 0 && $this->iteratorKey < $numItems) { - return true; - } else { - return false; - } - } - /** - * Whether the offset exists - * - * Implement ArrayAccess::offsetExists() - * - * @param int $offset - * @return boolean - */ - public function offsetExists($offset) - { - return ($offset < $this->count()); - } - /** - * Return value at given offset - * - * Implement ArrayAccess::offsetGet() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - * @return Zend_Service_Rackspace_Servers_SharedIpGroup - */ - public function offsetGet($offset) - { - if ($this->offsetExists($offset)) { - return $this->shared[$offset]; - } else { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('Illegal index'); - } - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetSet() - * - * @param int $offset - * @param string $value - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetSet($offset, $value) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to set read-only property'); - } - - /** - * Throws exception because all values are read-only - * - * Implement ArrayAccess::offsetUnset() - * - * @param int $offset - * @throws Zend_Service_Rackspace_Servers_Exception - */ - public function offsetUnset($offset) - { - #require_once 'Zend/Service/Rackspace/Servers/Exception.php'; - throw new Zend_Service_Rackspace_Servers_Exception('You are trying to unset read-only property'); - } -} diff --git a/library/Zend/Service/ReCaptcha.php b/library/Zend/Service/ReCaptcha.php deleted file mode 100644 index 63fa320b18..0000000000 --- a/library/Zend/Service/ReCaptcha.php +++ /dev/null @@ -1,502 +0,0 @@ - false, /* Use SSL or not when generating the recaptcha */ - 'error' => null, /* The error message to display in the recaptcha */ - 'xhtml' => false /* Enable XHTML output (this will not be XHTML Strict - compliant since the IFRAME is necessary when - Javascript is disabled) */ - ); - - /** - * Options for tailoring reCaptcha - * - * See the different options on http://recaptcha.net/apidocs/captcha/client.html - * - * @var array - */ - protected $_options = array( - 'theme' => 'red', - 'lang' => 'en', - 'custom_translations' => array(), - ); - - /** - * Response from the verify server - * - * @var Zend_Service_ReCaptcha_Response - */ - protected $_response = null; - - /** - * Class constructor - * - * @param string $publicKey - * @param string $privateKey - * @param array $params - * @param array $options - * @param string $ip - * @param array|Zend_Config $params - */ - public function __construct($publicKey = null, $privateKey = null, - $params = null, $options = null, $ip = null) - { - if ($publicKey !== null) { - $this->setPublicKey($publicKey); - } - - if ($privateKey !== null) { - $this->setPrivateKey($privateKey); - } - - if ($ip !== null) { - $this->setIp($ip); - } else if (isset($_SERVER['REMOTE_ADDR'])) { - $this->setIp($_SERVER['REMOTE_ADDR']); - } - - if ($params !== null) { - $this->setParams($params); - } - - if ($options !== null) { - $this->setOptions($options); - } - } - - /** - * Serialize as string - * - * When the instance is used as a string it will display the recaptcha. - * Since we can't throw exceptions within this method we will trigger - * a user warning instead. - * - * @return string - */ - public function __toString() - { - try { - $return = $this->getHtml(); - } catch (Exception $e) { - $return = ''; - trigger_error($e->getMessage(), E_USER_WARNING); - } - - return $return; - } - - /** - * Set the ip property - * - * @param string $ip - * @return Zend_Service_ReCaptcha - */ - public function setIp($ip) - { - $this->_ip = $ip; - - return $this; - } - - /** - * Get the ip property - * - * @return string - */ - public function getIp() - { - return $this->_ip; - } - - /** - * Set a single parameter - * - * @param string $key - * @param string $value - * @return Zend_Service_ReCaptcha - */ - public function setParam($key, $value) - { - $this->_params[$key] = $value; - - return $this; - } - - /** - * Set parameters - * - * @param array|Zend_Config $params - * @return Zend_Service_ReCaptcha - * @throws Zend_Service_ReCaptcha_Exception - */ - public function setParams($params) - { - if ($params instanceof Zend_Config) { - $params = $params->toArray(); - } - - if (is_array($params)) { - foreach ($params as $k => $v) { - $this->setParam($k, $v); - } - } else { - /** @see Zend_Service_ReCaptcha_Exception */ - #require_once 'Zend/Service/ReCaptcha/Exception.php'; - - throw new Zend_Service_ReCaptcha_Exception( - 'Expected array or Zend_Config object' - ); - } - - return $this; - } - - /** - * Get the parameter array - * - * @return array - */ - public function getParams() - { - return $this->_params; - } - - /** - * Get a single parameter - * - * @param string $key - * @return mixed - */ - public function getParam($key) - { - return $this->_params[$key]; - } - - /** - * Set a single option - * - * @param string $key - * @param string $value - * @return Zend_Service_ReCaptcha - */ - public function setOption($key, $value) - { - $this->_options[$key] = $value; - - return $this; - } - - /** - * Set options - * - * @param array|Zend_Config $options - * @return Zend_Service_ReCaptcha - * @throws Zend_Service_ReCaptcha_Exception - */ - public function setOptions($options) - { - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } - - if (is_array($options)) { - foreach ($options as $k => $v) { - $this->setOption($k, $v); - } - } else { - /** @see Zend_Service_ReCaptcha_Exception */ - #require_once 'Zend/Service/ReCaptcha/Exception.php'; - - throw new Zend_Service_ReCaptcha_Exception( - 'Expected array or Zend_Config object' - ); - } - - return $this; - } - - /** - * Get the options array - * - * @return array - */ - public function getOptions() - { - return $this->_options; - } - - /** - * Get a single option - * - * @param string $key - * @return mixed - */ - public function getOption($key) - { - return $this->_options[$key]; - } - - /** - * Get the public key - * - * @return string - */ - public function getPublicKey() - { - return $this->_publicKey; - } - - /** - * Set the public key - * - * @param string $publicKey - * @return Zend_Service_ReCaptcha - */ - public function setPublicKey($publicKey) - { - $this->_publicKey = $publicKey; - - return $this; - } - - /** - * Get the private key - * - * @return string - */ - public function getPrivateKey() - { - return $this->_privateKey; - } - - /** - * Set the private key - * - * @param string $privateKey - * @return Zend_Service_ReCaptcha - */ - public function setPrivateKey($privateKey) - { - $this->_privateKey = $privateKey; - - return $this; - } - - /** - * Get the HTML code for the captcha - * - * This method uses the public key to fetch a recaptcha form. - * - * @param null|string $name Base name for recaptcha form elements - * @return string - * @throws Zend_Service_ReCaptcha_Exception - */ - public function getHtml($name = null) - { - if ($this->_publicKey === null) { - /** @see Zend_Service_ReCaptcha_Exception */ - #require_once 'Zend/Service/ReCaptcha/Exception.php'; - - throw new Zend_Service_ReCaptcha_Exception('Missing public key'); - } - - $host = self::API_SERVER; - - if ((bool) $this->_params['ssl'] === true) { - $host = self::API_SECURE_SERVER; - } - - $htmlBreak = '
'; - $htmlInputClosing = '>'; - - if ((bool) $this->_params['xhtml'] === true) { - $htmlBreak = '
'; - $htmlInputClosing = '/>'; - } - - $errorPart = ''; - - if (!empty($this->_params['error'])) { - $errorPart = '&error=' . urlencode($this->_params['error']); - } - - $reCaptchaOptions = ''; - - if (!empty($this->_options)) { - $encoded = Zend_Json::encode($this->_options); - $reCaptchaOptions = << -SCRIPT; - } - $challengeField = 'recaptcha_challenge_field'; - $responseField = 'recaptcha_response_field'; - if (!empty($name)) { - $challengeField = $name . '[' . $challengeField . ']'; - $responseField = $name . '[' . $responseField . ']'; - } - - $return = $reCaptchaOptions; - $return .= << - -HTML; - $return .= << - {$htmlBreak} - - -HTML; - - return $return; - } - - /** - * Post a solution to the verify server - * - * @param string $challengeField - * @param string $responseField - * @return Zend_Http_Response - * @throws Zend_Service_ReCaptcha_Exception - */ - protected function _post($challengeField, $responseField) - { - if ($this->_privateKey === null) { - /** @see Zend_Service_ReCaptcha_Exception */ - #require_once 'Zend/Service/ReCaptcha/Exception.php'; - - throw new Zend_Service_ReCaptcha_Exception('Missing private key'); - } - - if ($this->_ip === null) { - /** @see Zend_Service_ReCaptcha_Exception */ - #require_once 'Zend/Service/ReCaptcha/Exception.php'; - - throw new Zend_Service_ReCaptcha_Exception('Missing ip address'); - } - - /* Fetch an instance of the http client */ - $httpClient = self::getHttpClient(); - $httpClient->resetParameters(true); - - $postParams = array('privatekey' => $this->_privateKey, - 'remoteip' => $this->_ip, - 'challenge' => $challengeField, - 'response' => $responseField); - - /* Make the POST and return the response */ - return $httpClient->setUri(self::VERIFY_SERVER) - ->setParameterPost($postParams) - ->request(Zend_Http_Client::POST); - } - - /** - * Verify the user input - * - * This method calls up the post method and returns a - * Zend_Service_ReCaptcha_Response object. - * - * @param string $challengeField - * @param string $responseField - * @return Zend_Service_ReCaptcha_Response - */ - public function verify($challengeField, $responseField) - { - $response = $this->_post($challengeField, $responseField); - - return new Zend_Service_ReCaptcha_Response(null, null, $response); - } -} diff --git a/library/Zend/Service/ReCaptcha/Exception.php b/library/Zend/Service/ReCaptcha/Exception.php deleted file mode 100644 index 4dde78b467..0000000000 --- a/library/Zend/Service/ReCaptcha/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -_requireMcrypt(); - - /* If options is a Zend_Config object we want to convert it to an array so we can merge it with the default options */ - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } - - /* Merge if needed */ - if (is_array($options)) { - $options = array_merge($this->getDefaultOptions(), $options); - } else { - $options = $this->getDefaultOptions(); - } - - parent::__construct($publicKey, $privateKey, null, $options); - - if ($email !== null) { - $this->setEmail($email); - } - } - - - /** - * Get emailValidator - * - * @return Zend_Validate_Interface - */ - public function getEmailValidator() - { - if (null === $this->_emailValidator) { - #require_once 'Zend/Validate/EmailAddress.php'; - $this->setEmailValidator(new Zend_Validate_EmailAddress()); - } - return $this->_emailValidator; - } - - /** - * Set email validator - * - * @param Zend_Validate_Interface $validator - * @return Zend_Service_ReCaptcha_MailHide - */ - public function setEmailValidator(Zend_Validate_Interface $validator) - { - $this->_emailValidator = $validator; - return $this; - } - - - /** - * See if the mcrypt extension is available - * - * @throws Zend_Service_ReCaptcha_MailHide_Exception - */ - protected function _requireMcrypt() - { - if (!extension_loaded('mcrypt')) { - /** @see Zend_Service_ReCaptcha_MailHide_Exception */ - #require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; - - throw new Zend_Service_ReCaptcha_MailHide_Exception('Use of the Zend_Service_ReCaptcha_MailHide component requires the mcrypt extension to be enabled in PHP'); - } - } - - /** - * Serialize as string - * - * When the instance is used as a string it will display the email address. Since we can't - * throw exceptions within this method we will trigger a user warning instead. - * - * @return string - */ - public function __toString() - { - try { - $return = $this->getHtml(); - } catch (Exception $e) { - $return = ''; - trigger_error($e->getMessage(), E_USER_WARNING); - } - - return $return; - } - - /** - * Get the default set of parameters - * - * @return array - */ - public function getDefaultOptions() - { - return array( - 'encoding' => 'UTF-8', - 'linkTitle' => 'Reveal this e-mail address', - 'linkHiddenText' => '...', - 'popupWidth' => 500, - 'popupHeight' => 300, - ); - } - - /** - * Override the setPrivateKey method - * - * Override the parent method to store a binary representation of the private key as well. - * - * @param string $privateKey - * @return Zend_Service_ReCaptcha_MailHide - */ - public function setPrivateKey($privateKey) - { - parent::setPrivateKey($privateKey); - - /* Pack the private key into a binary string */ - $this->_privateKeyPacked = pack('H*', $this->_privateKey); - - return $this; - } - - /** - * Set the email property - * - * This method will set the email property along with the local and domain parts - * - * @param string $email - * @return Zend_Service_ReCaptcha_MailHide - */ - public function setEmail($email) - { - $this->_email = $email; - - $validator = $this->getEmailValidator(); - if (!$validator->isValid($email)) { - #require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; - throw new Zend_Service_ReCaptcha_MailHide_Exception('Invalid email address provided'); - } - - $emailParts = explode('@', $email, 2); - - /* Decide on how much of the local part we want to reveal */ - if (strlen($emailParts[0]) <= 4) { - $emailParts[0] = substr($emailParts[0], 0, 1); - } else if (strlen($emailParts[0]) <= 6) { - $emailParts[0] = substr($emailParts[0], 0, 3); - } else { - $emailParts[0] = substr($emailParts[0], 0, 4); - } - - $this->_emailLocalPart = $emailParts[0]; - $this->_emailDomainPart = $emailParts[1]; - - return $this; - } - - /** - * Get the email property - * - * @return string - */ - public function getEmail() - { - return $this->_email; - } - - /** - * Get the local part of the email address - * - * @return string - */ - public function getEmailLocalPart() - { - return $this->_emailLocalPart; - } - - /** - * Get the domain part of the email address - * - * @return string - */ - public function getEmailDomainPart() - { - return $this->_emailDomainPart; - } - - /** - * Get the HTML code needed for the mail hide - * - * @param string $email - * @return string - * @throws Zend_Service_ReCaptcha_MailHide_Exception - */ - public function getHtml($email = null) - { - if ($email !== null) { - $this->setEmail($email); - } elseif (null === ($email = $this->getEmail())) { - /** @see Zend_Service_ReCaptcha_MailHide_Exception */ - #require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; - throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing email address'); - } - - if ($this->_publicKey === null) { - /** @see Zend_Service_ReCaptcha_MailHide_Exception */ - #require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; - throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing public key'); - } - - if ($this->_privateKey === null) { - /** @see Zend_Service_ReCaptcha_MailHide_Exception */ - #require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; - throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing private key'); - } - - /* Generate the url */ - $url = $this->_getUrl(); - - $enc = $this->getOption('encoding'); - - /* Genrate the HTML used to represent the email address */ - $html = htmlentities($this->getEmailLocalPart(), ENT_COMPAT, $enc) - . '
' . $this->_options['linkHiddenText'] . '@' - . htmlentities($this->getEmailDomainPart(), ENT_COMPAT, $enc); - - return $html; - } - - /** - * Get the url used on the "hidden" part of the email address - * - * @return string - */ - protected function _getUrl() - { - /* Figure out how much we need to pad the email */ - $numPad = self::ENCRYPTION_BLOCK_SIZE - (strlen($this->_email) % self::ENCRYPTION_BLOCK_SIZE); - - /* Pad the email */ - $emailPadded = str_pad($this->_email, strlen($this->_email) + $numPad, chr($numPad)); - - /* Encrypt the email */ - $emailEncrypted = mcrypt_encrypt(self::ENCRYPTION_CIPHER, $this->_privateKeyPacked, $emailPadded, self::ENCRYPTION_MODE, self::ENCRYPTION_IV); - - /* Return the url */ - return self::MAILHIDE_SERVER . '?k=' . $this->_publicKey . '&c=' . strtr(base64_encode($emailEncrypted), '+/', '-_'); - } -} diff --git a/library/Zend/Service/ReCaptcha/MailHide/Exception.php b/library/Zend/Service/ReCaptcha/MailHide/Exception.php deleted file mode 100644 index 2bdcf8b8c2..0000000000 --- a/library/Zend/Service/ReCaptcha/MailHide/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -setStatus($status); - } - - if ($errorCode !== null) { - $this->setErrorCode($errorCode); - } - - if ($httpResponse !== null) { - $this->setFromHttpResponse($httpResponse); - } - } - - /** - * Set the status - * - * @param string $status - * @return Zend_Service_ReCaptcha_Response - */ - public function setStatus($status) - { - if ($status === 'true') { - $this->_status = true; - } else { - $this->_status = false; - } - - return $this; - } - - /** - * Get the status - * - * @return boolean - */ - public function getStatus() - { - return $this->_status; - } - - /** - * Alias for getStatus() - * - * @return boolean - */ - public function isValid() - { - return $this->getStatus(); - } - - /** - * Set the error code - * - * @param string $errorCode - * @return Zend_Service_ReCaptcha_Response - */ - public function setErrorCode($errorCode) - { - $this->_errorCode = $errorCode; - - return $this; - } - - /** - * Get the error code - * - * @return string - */ - public function getErrorCode() - { - return $this->_errorCode; - } - - /** - * Populate this instance based on a Zend_Http_Response object - * - * @param Zend_Http_Response $response - * @return Zend_Service_ReCaptcha_Response - */ - public function setFromHttpResponse(Zend_Http_Response $response) - { - $body = $response->getBody(); - - // Default status and error code - $status = 'false'; - $errorCode = ''; - - $parts = explode("\n", $body); - - if ($parts[0] === 'true') { - $status = 'true'; - } - - if (!empty($parts[1])) { - $errorCode = $parts[1]; - } - - $this->setStatus($status); - $this->setErrorCode($errorCode); - - return $this; - } -} diff --git a/library/Zend/Service/ShortUrl/AbstractShortener.php b/library/Zend/Service/ShortUrl/AbstractShortener.php deleted file mode 100644 index fa39cd29cd..0000000000 --- a/library/Zend/Service/ShortUrl/AbstractShortener.php +++ /dev/null @@ -1,83 +0,0 @@ -_baseUri) !== 0) { - #require_once 'Zend/Service/ShortUrl/Exception.php'; - throw new Zend_Service_ShortUrl_Exception(sprintf( - 'The url "%s" is not valid for this service and the target cannot be resolved', - $shortenedUrl - )); - } - } -} diff --git a/library/Zend/Service/ShortUrl/BitLy.php b/library/Zend/Service/ShortUrl/BitLy.php deleted file mode 100644 index 9270114814..0000000000 --- a/library/Zend/Service/ShortUrl/BitLy.php +++ /dev/null @@ -1,167 +0,0 @@ -setOAuthAccessToken($login); - } else { - $this->setApiLogin($login, $apiKey); - } - } - - /** - * set OAuth credentials - * - * @param $accessToken - * @return Zend_Service_ShortUrl_BitLy - */ - public function setOAuthAccessToken($accessToken) - { - $this->_apiKey = $accessToken; - $this->_loginName = null; - return $this; - } - - /** - * set login credentials - * - * @param $login - * @param $apiKey - * @return Zend_Service_ShortUrl_BitLy - */ - public function setApiLogin($login, $apiKey) - { - $this->_apiKey = $apiKey; - $this->_loginName = $login; - return $this; - } - - /** - * prepare http client - * @return void - */ - protected function _setAccessParameter() - { - if(null === $this->_loginName) { - //OAuth login - $this->getHttpClient()->setParameterGet('access_token', $this->_apiKey); - } else { - //login/APIKey authentication - $this->getHttpClient()->setParameterGet('login',$this->_loginName); - $this->getHttpClient()->setParameterGet('apiKey',$this->_apiKey); - } - } - - /** - * handle bit.ly response - * - * @return string - * @throws Zend_Service_ShortUrl_Exception - */ - protected function _processRequest() - { - $response = $this->getHttpClient()->request(); - if(500 == $response->getStatus()) { - throw new Zend_Service_ShortUrl_Exception('Bit.ly :: '.$response->getBody()); - } - return $response->getBody(); - } - - /** - * This function shortens long url - * - * @param string $url URL to Shorten - * @throws Zend_Service_ShortUrl_Exception if bit.ly reports an error - * @return string Shortened Url - */ - public function shorten($url) - { - $this->_validateUri($url); - $this->_setAccessParameter(); - - $this->getHttpClient()->setUri($this->_apiUri.'/v3/shorten'); - $this->getHttpClient()->setParameterGet('longUrl',$url); - $this->getHttpClient()->setParameterGet('format','txt'); - - return $this->_processRequest(); - } - - /** - * Reveals target for short URL - * - * @param string $shortenedUrl URL to reveal target of - * @throws Zend_Service_ShortUrl_Exception if bit.ly reports an error - * @return string Unshortened Url - */ - public function unshorten($shortenedUrl) - { - $this->_validateUri($shortenedUrl); - $this->_setAccessParameter(); - - $this->getHttpClient()->setUri($this->_apiUri.'/v3/expand'); - $this->getHttpClient()->setParameterGet('shortUrl',$shortenedUrl); - $this->getHttpClient()->setParameterGet('format','txt'); - - return $this->_processRequest(); - } -} diff --git a/library/Zend/Service/ShortUrl/Exception.php b/library/Zend/Service/ShortUrl/Exception.php deleted file mode 100644 index 0ed2ad0b32..0000000000 --- a/library/Zend/Service/ShortUrl/Exception.php +++ /dev/null @@ -1,32 +0,0 @@ -_validateUri($url); - - $serviceUri = 'http://is.gd/api.php'; - - $this->getHttpClient()->resetParameters(true); - $this->getHttpClient()->setUri($serviceUri); - $this->getHttpClient()->setParameterGet('longurl', $url); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } - - /** - * Reveals target for short URL - * - * @param string $shortenedUrl URL to reveal target of - * @throws Zend_Service_ShortUrl_Exception When URL is not valid or is not shortened by this service - * @return string - */ - public function unshorten($shortenedUrl) - { - $this->_validateUri($shortenedUrl); - - $this->_verifyBaseUri($shortenedUrl); - - $this->getHttpClient()->resetParameters(true); - $this->getHttpClient()->setUri($shortenedUrl); - $this->getHttpClient()->setConfig(array('maxredirects' => 0)); - - $response = $this->getHttpClient()->request(); - if ($response->isError()) { - #require_once 'Zend/Service/ShortUrl/Exception.php'; - throw new Zend_Service_ShortUrl_Exception($response->getMessage()); - } - - if ($response->isRedirect()) { - return $response->getHeader('Location'); - } - - #require_once 'Zend/Service/ShortUrl/Exception.php'; - throw new Zend_Service_ShortUrl_Exception('Url unshortening was not successful'); - } -} diff --git a/library/Zend/Service/ShortUrl/JdemCz.php b/library/Zend/Service/ShortUrl/JdemCz.php deleted file mode 100644 index dd7e07db31..0000000000 --- a/library/Zend/Service/ShortUrl/JdemCz.php +++ /dev/null @@ -1,84 +0,0 @@ -_validateUri($url); - - $serviceUri = 'http://www.jdem.cz/get'; - - $this->getHttpClient()->setUri($serviceUri); - $this->getHttpClient()->setParameterGet('url', $url); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } - - /** - * Reveals target for short URL - * - * @param string $shortenedUrl URL to reveal target of - * @throws Zend_Service_ShortUrl_Exception When URL is not valid or is not shortened by this service - * @return string - */ - public function unshorten($shortenedUrl) - { - $this->_validateUri($shortenedUrl); - - $this->_verifyBaseUri($shortenedUrl); - - $this->getHttpClient()->setUri($shortenedUrl)->setParameterGet('kam', 1); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } -} diff --git a/library/Zend/Service/ShortUrl/MetamarkNet.php b/library/Zend/Service/ShortUrl/MetamarkNet.php deleted file mode 100644 index 904e4abb54..0000000000 --- a/library/Zend/Service/ShortUrl/MetamarkNet.php +++ /dev/null @@ -1,85 +0,0 @@ -_validateUri($url); - - $this->getHttpClient()->setUri($this->_apiUri); - $this->getHttpClient()->setParameterGet('long_url', $url); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } - - /** - * Reveals target for short URL - * - * @param string $shortenedUrl URL to reveal target of - * @throws Zend_Service_ShortUrl_Exception When URL is not valid or is not shortened by this service - * @return string - */ - public function unshorten($shortenedUrl) - { - $this->_validateUri($shortenedUrl); - - $this->_verifyBaseUri($shortenedUrl); - - $this->getHttpClient()->setUri($this->_apiUri); - $this->getHttpClient()->setParameterGet('short_url', $shortenedUrl); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } -} diff --git a/library/Zend/Service/ShortUrl/Shortener.php b/library/Zend/Service/ShortUrl/Shortener.php deleted file mode 100644 index 302030898e..0000000000 --- a/library/Zend/Service/ShortUrl/Shortener.php +++ /dev/null @@ -1,45 +0,0 @@ -_validateUri($url); - - $serviceUri = 'http://tinyurl.com/api-create.php'; - - $this->getHttpClient()->setUri($serviceUri); - $this->getHttpClient()->setParameterGet('url', $url); - - $response = $this->getHttpClient()->request(); - - return $response->getBody(); - } - - /** - * Reveals target for short URL - * - * @param string $shortenedUrl URL to reveal target of - * @throws Zend_Service_ShortUrl_Exception When URL is not valid or is not shortened by this service - * @return string - */ - public function unshorten($shortenedUrl) - { - $this->_validateUri($shortenedUrl); - - $this->_verifyBaseUri($shortenedUrl); - - //TinyUrl.com does not have an API for that, but we can use preview feature - //we need new Zend_Http_Client - $this->setHttpClient(new Zend_Http_Client()); - - $this->getHttpClient() - ->setCookie('preview', 1) - ->setUri($shortenedUrl); - - //get response - $response = $this->getHttpClient()->request(); - - #require_once 'Zend/Dom/Query.php'; - $dom = new Zend_Dom_Query($response->getBody()); - - //find the redirect url link - $results = $dom->query('a#redirecturl'); - - //get href - $originalUrl = $results->current()->getAttribute('href'); - - return $originalUrl; - } -} diff --git a/library/Zend/Service/SlideShare.php b/library/Zend/Service/SlideShare.php deleted file mode 100644 index 15f726115e..0000000000 --- a/library/Zend/Service/SlideShare.php +++ /dev/null @@ -1,676 +0,0 @@ -_httpclient = $client; - return $this; - } - - /** - * Returns the instance of the Zend_Http_Client which will be used. Creates - * an instance of Zend_Http_Client if no previous client was set. - * - * @return Zend_Http_Client The HTTP client which will be used - */ - public function getHttpClient() - { - - if (!($this->_httpclient instanceof Zend_Http_Client)) { - $client = new Zend_Http_Client(); - $client->setConfig( - array( - 'maxredirects' => 2, - 'timeout' => 5 - ) - ); - - $this->setHttpClient($client); - } - - $this->_httpclient->resetParameters(); - - return $this->_httpclient; - } - - /** - * Sets the Zend_Cache object to use to cache the results of API queries - * - * @param Zend_Cache_Core $cacheobject The Zend_Cache object used - * @return Zend_Service_SlideShare - */ - public function setCacheObject(Zend_Cache_Core $cacheobject) - { - $this->_cacheobject = $cacheobject; - return $this; - } - - /** - * Gets the Zend_Cache object which will be used to cache API queries. If no - * cache object was previously set the the default will be used (Filesystem - * caching in /tmp with a life time of 43200 seconds) - * - * @return Zend_Cache_Core The object used in caching - */ - public function getCacheObject() - { - - if (!($this->_cacheobject instanceof Zend_Cache_Core)) { - $cache = Zend_Cache::factory( - 'Core', - 'File', - array( - 'lifetime' => 43200, - 'automatic_serialization' => true - ), - array('cache_dir' => '/tmp') - ); - - $this->setCacheObject($cache); - } - - return $this->_cacheobject; - } - - /** - * Returns the user name used for API calls - * - * @return string The username - */ - public function getUserName() - { - return $this->_username; - } - - /** - * Sets the user name to use for API calls - * - * @param string $un The username to use - * @return Zend_Service_SlideShare - */ - public function setUserName($un) - { - $this->_username = $un; - return $this; - } - - /** - * Gets the password to use in API calls - * - * @return string the password to use in API calls - */ - public function getPassword() - { - return $this->_password; - } - - /** - * Sets the password to use in API calls - * - * @param string $pw The password to use - * @return Zend_Service_SlideShare - */ - public function setPassword($pw) - { - $this->_password = (string)$pw; - return $this; - } - - /** - * Gets the API key to be used in making API calls - * - * @return string the API Key - */ - public function getApiKey() - { - return $this->_apiKey; - } - - /** - * Sets the API key to be used in making API calls - * - * @param string $key The API key to use - * @return Zend_Service_SlideShare - */ - public function setApiKey($key) - { - $this->_apiKey = (string)$key; - return $this; - } - - /** - * Gets the shared secret used in making API calls - * - * @return string the Shared secret - */ - public function getSharedSecret() - { - return $this->_sharedSecret; - } - - /** - * Sets the shared secret used in making API calls - * - * @param string $secret the shared secret - * @return Zend_Service_SlideShare - */ - public function setSharedSecret($secret) - { - $this->_sharedSecret = (string)$secret; - return $this; - } - - /** - * The Constructor - * - * @param string $apikey The API key - * @param string $sharedSecret The shared secret - * @param string $username The username - * @param string $password The password - */ - public function __construct( - $apikey, $sharedSecret, $username = null, $password = null - ) - { - $this->setApiKey($apikey) - ->setSharedSecret($sharedSecret) - ->setUserName($username) - ->setPassword($password); - - $this->_httpclient = new Zend_Http_Client(); - } - - /** - * Uploads the specified Slide show the the server - * - * @param Zend_Service_SlideShare_SlideShow $ss The slide show - * object representing the - * slide show to upload - * @param boolean $makeSrcPublic Determines if the slide - * show's source file is public - * or not upon upload - * @return Zend_Service_SlideShare_SlideShow The passed Slide show object, - * with the new assigned ID - * provided - * @throws Zend_Service_SlideShare_Exception - */ - public function uploadSlideShow( - Zend_Service_SlideShare_SlideShow $ss, $makeSrcPublic = true - ) - { - $timestamp = time(); - - $params = array( - 'api_key' => $this->getApiKey(), - 'ts' => $timestamp, - 'hash' => sha1($this->getSharedSecret() . $timestamp), - 'username' => $this->getUserName(), - 'password' => $this->getPassword(), - 'slideshow_title' => $ss->getTitle() - ); - - $description = $ss->getDescription(); - $tags = $ss->getTags(); - - $filename = $ss->getFilename(); - - if (!file_exists($filename) || !is_readable($filename)) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Specified Slideshow for upload not found or unreadable' - ); - } - - if (!empty($description)) { - $params['slideshow_description'] = $description; - } else { - $params['slideshow_description'] = ""; - } - - if (!empty($tags)) { - $tmp = array(); - foreach ($tags as $tag) { - $tmp[] = "\"$tag\""; - } - $params['slideshow_tags'] = implode(' ', $tmp); - } else { - $params['slideshow_tags'] = ""; - } - - $client = $this->getHttpClient(); - $client->setUri(self::SERVICE_UPLOAD_URI); - $client->setParameterPost($params); - $client->setFileUpload($filename, "slideshow_srcfile"); - - #require_once 'Zend/Http/Client/Exception.php'; - try { - $response = $client->request('POST'); - } catch (Zend_Http_Client_Exception $e) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - "Service Request Failed: {$e->getMessage()}", 0, $e - ); - } - - $sxe = Zend_Xml_Security::scan($response->getBody()); - - if ($sxe->getName() == "SlideShareServiceError") { - $message = (string)$sxe->Message[0]; - list($code, $errorStr) = explode(':', $message); - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - trim($errorStr), - $code - ); - } - - if (!$sxe->getName() == "SlideShowUploaded") { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Unknown XML Respons Received' - ); - } - - $ss->setId((int)(string)$sxe->SlideShowID); - - return $ss; - } - - /** - * Retrieves a slide show's information based on slide show ID - * - * @param int $ssId The slide show ID - * @return Zend_Service_SlideShare_SlideShow the Slideshow object - * @throws Zend_Service_SlideShare_Exception - */ - public function getSlideShow($ssId) - { - $timestamp = time(); - - $params = array( - 'api_key' => $this->getApiKey(), - 'ts' => $timestamp, - 'hash' => sha1($this->getSharedSecret() . $timestamp), - 'slideshow_id' => $ssId - ); - - $cache = $this->getCacheObject(); - $cacheKey = md5("__zendslideshare_cache_$ssId"); - - if (!$retval = $cache->load($cacheKey)) { - $client = $this->getHttpClient(); - - $client->setUri(self::SERVICE_GET_SHOW_URI); - $client->setParameterPost($params); - - #require_once 'Zend/Http/Client/Exception.php'; - try { - $response = $client->request('POST'); - } catch (Zend_Http_Client_Exception $e) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - "Service Request Failed: {$e->getMessage()}", 0, $e - ); - } - - $sxe = Zend_Xml_Security::scan($response->getBody()); - - if ($sxe->getName() == "SlideShareServiceError") { - $message = (string)$sxe->Message[0]; - list($code, $errorStr) = explode(':', $message); - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - trim($errorStr), - $code - ); - } - - if (!($sxe->getName() == 'Slideshow')) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Unknown XML Repsonse Received' - ); - } - $retval = $this->_slideShowNodeToObject(clone $sxe); - - $cache->save($retval, $cacheKey); - } - - return $retval; - } - - /** - * Retrieves an array of slide shows for a given username - * - * @param string $username The username to retrieve slide shows from - * @param int $offset The offset of the list to start retrieving from - * @param int $limit The maximum number of slide shows to retrieve - * @return array An array of Zend_Service_SlideShare_SlideShow objects - */ - public function getSlideShowsByUsername( - $username, $offset = null, $limit = null - ) - { - return $this->_getSlideShowsByType( - 'username_for', $username, $offset, $limit - ); - } - - /** - * Retrieves an array of slide shows based on tag - * - * @param string $tag The tag to retrieve slide shows with - * @param int $offset The offset of the list to start retrieving from - * @param int $limit The maximum number of slide shows to retrieve - * @return array An array of Zend_Service_SlideShare_SlideShow objects - */ - public function getSlideShowsByTag($tag, $offset = null, $limit = null) - { - - if (is_array($tag)) { - $tmp = array(); - foreach ($tag as $t) { - $tmp[] = "\"$t\""; - } - - $tag = implode(" ", $tmp); - } - - return $this->_getSlideShowsByType('tag', $tag, $offset, $limit); - } - - /** - * Retrieves an array of slide shows based on group name - * - * @param string $group The group name to retrieve slide shows for - * @param int $offset The offset of the list to start retrieving from - * @param int $limit The maximum number of slide shows to retrieve - * @return array An array of Zend_Service_SlideShare_SlideShow objects - */ - public function getSlideShowsByGroup($group, $offset = null, $limit = null) - { - return $this->_getSlideShowsByType('group_name', $group, $offset, $limit); - } - - /** - * Retrieves Zend_Service_SlideShare_SlideShow object arrays based on the type of - * list desired - * - * @param string $key The type of slide show object to retrieve - * @param string $value The specific search query for the slide show type to look up - * @param int $offset The offset of the list to start retrieving from - * @param int $limit The maximum number of slide shows to retrieve - * @return array An array of Zend_Service_SlideShare_SlideShow objects - * @throws Zend_Service_SlideShare_Exception - */ - protected function _getSlideShowsByType( - $key, $value, $offset = null, $limit = null - ) - { - $key = strtolower($key); - - switch ($key) { - case 'username_for': - $responseTag = 'User'; - $queryUri = self::SERVICE_GET_SHOW_BY_USER_URI; - break; - case 'group_name': - $responseTag = 'Group'; - $queryUri = self::SERVICE_GET_SHOW_BY_GROUP_URI; - break; - case 'tag': - $responseTag = 'Tag'; - $queryUri = self::SERVICE_GET_SHOW_BY_TAG_URI; - break; - default: - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Invalid SlideShare Query' - ); - } - - $timestamp = time(); - - $params = array( - 'api_key' => $this->getApiKey(), - 'ts' => $timestamp, - 'hash' => sha1($this->getSharedSecret() . $timestamp), - $key => $value - ); - - if ($offset !== null) { - $params['offset'] = (int)$offset; - } - - if ($limit !== null) { - $params['limit'] = (int)$limit; - } - - $cache = $this->getCacheObject(); - $cacheKey = md5($key . $value . $offset . $limit); - - if (!$retval = $cache->load($cacheKey)) { - $client = $this->getHttpClient(); - - $client->setUri($queryUri); - $client->setParameterPost($params); - - #require_once 'Zend/Http/Client/Exception.php'; - try { - $response = $client->request('POST'); - } catch (Zend_Http_Client_Exception $e) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - "Service Request Failed: {$e->getMessage()}", 0, $e - ); - } - - $sxe = Zend_Xml_Security::scan($response->getBody()); - - if ($sxe->getName() == "SlideShareServiceError") { - $message = (string)$sxe->Message[0]; - list($code, $errorStr) = explode(':', $message); - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - trim($errorStr), $code - ); - } - - if (!$sxe->getName() == $responseTag) { - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Unknown or Invalid XML Repsonse Received' - ); - } - - $retval = array(); - - foreach ($sxe->children() as $node) { - if ($node->getName() == 'Slideshow') { - $retval[] = $this->_slideShowNodeToObject($node); - } - } - - $cache->save($retval, $cacheKey); - } - - return $retval; - } - - /** - * Converts a SimpleXMLElement object representing a response from the service - * into a Zend_Service_SlideShare_SlideShow object - * - * @see http://www.slideshare.net/developers/documentation#get_slideshow - * - * @param SimpleXMLElement $node The input XML from the slideshare.net service - * @return Zend_Service_SlideShare_SlideShow The resulting object - * @throws Zend_Service_SlideShare_Exception - */ - protected function _slideShowNodeToObject(SimpleXMLElement $node) - { - - if ($node->getName() == 'Slideshow') { - $ss = new Zend_Service_SlideShare_SlideShow(); - - $ss->setId((string)$node->ID); - $ss->setDescription((string)$node->Description); - $ss->setEmbedCode((string)$node->Embed); - $ss->setNumViews((string)$node->Views); - $ss->setUrl((string)$node->URL); - $ss->setStatus((string)$node->Status); - $ss->setStatusDescription((string)$node->StatusDescription); - - foreach (explode(",", (string)$node->Tags) as $tag) { - if (!in_array($tag, $ss->getTags())) { - $ss->addTag($tag); - } - } - - $ss->setThumbnailUrl((string)$node->ThumbnailURL); - $ss->setTitle((string)$node->Title); - $ss->setLocation((string)$node->Location); - $ss->setTranscript((string)$node->Transcript); - - return $ss; - } - - #require_once 'Zend/Service/SlideShare/Exception.php'; - throw new Zend_Service_SlideShare_Exception( - 'Was not provided the expected XML Node for processing' - ); - } -} diff --git a/library/Zend/Service/SlideShare/Exception.php b/library/Zend/Service/SlideShare/Exception.php deleted file mode 100644 index 68c53203bf..0000000000 --- a/library/Zend/Service/SlideShare/Exception.php +++ /dev/null @@ -1,38 +0,0 @@ -_location; - } - - /** - * Sets the location of the slide show - * - * @param string $loc The location to use - * @return Zend_Service_SlideShare_SlideShow - */ - public function setLocation($loc) - { - $this->_location = (string)$loc; - return $this; - } - - /** - * Gets the transcript for this slide show - * - * @return string the Transcript - */ - public function getTranscript() - { - return $this->_transcript; - } - - /** - * Sets the transcript for this slide show - * - * @param string $t The transcript - * @return Zend_Service_SlideShare_SlideShow - */ - public function setTranscript($t) - { - $this->_transcript = (string)$t; - return $this; - } - - /** - * Adds a tag to the slide show - * - * @param string $tag The tag to add - * @return Zend_Service_SlideShare_SlideShow - */ - public function addTag($tag) - { - $this->_tags[] = (string)$tag; - return $this; - } - - /** - * Sets the tags for the slide show - * - * @param array $tags An array of tags to set - * @return Zend_Service_SlideShare_SlideShow - */ - public function setTags(Array $tags) - { - $this->_tags = $tags; - return $this; - } - - /** - * Gets all of the tags associated with the slide show - * - * @return array An array of tags for the slide show - */ - public function getTags() - { - return $this->_tags; - } - - /** - * Sets the filename on the local filesystem of the slide show - * (for uploading a new slide show) - * - * @param string $file The full path & filename to the slide show - * @return Zend_Service_SlideShare_SlideShow - */ - public function setFilename($file) - { - $this->_slideShowFilename = (string)$file; - return $this; - } - - /** - * Retrieves the filename on the local filesystem of the slide show - * which will be uploaded - * - * @return string The full path & filename to the slide show - */ - public function getFilename() - { - return $this->_slideShowFilename; - } - - /** - * Sets the ID for the slide show - * - * @param int $id The slide show ID - * @return Zend_Service_SlideShare_SlideShow - */ - public function setId($id) - { - $this->_slideShowId = (string)$id; - return $this; - } - - /** - * Gets the ID for the slide show - * - * @return int The slide show ID - */ - public function getId() - { - return $this->_slideShowId; - } - - /** - * Sets the HTML embed code for the slide show - * - * @param string $code The HTML embed code - * @return Zend_Service_SlideShare_SlideShow - */ - public function setEmbedCode($code) - { - $this->_embedCode = (string)$code; - return $this; - } - - /** - * Retrieves the HTML embed code for the slide show - * - * @return string the HTML embed code - */ - public function getEmbedCode() - { - return $this->_embedCode; - } - - /** - * Sets the Thumbnail URI for the slide show - * - * @param string $url The URI for the thumbnail image - * @return Zend_Service_SlideShare_SlideShow - */ - public function setThumbnailUrl($url) - { - $this->_thumbnailUrl = (string) $url; - return $this; - } - - /** - * Retrieves the Thumbnail URi for the slide show - * - * @return string The URI for the thumbnail image - */ - public function getThumbnailUrl() - { - return $this->_thumbnailUrl; - } - - /** - * Sets the title for the Slide show - * - * @param string $title The slide show title - * @return Zend_Service_SlideShare_SlideShow - */ - public function setTitle($title) - { - $this->_title = (string)$title; - return $this; - } - - /** - * Retrieves the Slide show title - * - * @return string the Slide show title - */ - public function getTitle() - { - return $this->_title; - } - - /** - * Sets the description for the Slide show - * - * @param string $desc The description of the slide show - * @return Zend_Service_SlideShare_SlideShow - */ - public function setDescription($desc) - { - $this->_description = (string)$desc; - return $this; - } - - /** - * Gets the description of the slide show - * - * @return string The slide show description - */ - public function getDescription() - { - return $this->_description; - } - - /** - * Sets the numeric status of the slide show on the server - * - * @param int $status The numeric status on the server - * @return Zend_Service_SlideShare_SlideShow - */ - public function setStatus($status) - { - $this->_status = (int)$status; - return $this; - } - - /** - * Gets the numeric status of the slide show on the server - * - * @return int A Zend_Service_SlideShare_SlideShow Status constant - */ - public function getStatus() - { - return $this->_status; - } - - /** - * Sets the textual description of the status of the slide show on the server - * - * @param string $desc The textual description of the status of the slide show - * @return Zend_Service_SlideShare_SlideShow - */ - public function setStatusDescription($desc) - { - $this->_statusDescription = (string)$desc; - return $this; - } - - /** - * Gets the textual description of the status of the slide show on the server - * - * @return string the textual description of the service - */ - public function getStatusDescription() - { - return $this->_statusDescription; - } - - /** - * Sets the permanent link of the slide show - * - * @see Zend_Service_SlideShare_SlideShow::setUrl() - * - * @param string $url The permanent URL for the slide show - * @return Zend_Service_SlideShare_SlideShow - * @deprecated Since 1.12.10, use setUrl() - */ - public function setPermaLink($url) - { - $this->setUrl($url); - return $this; - } - - /** - * Gets the permanent link of the slide show - * - * @see Zend_Service_SlideShare_SlideShow::getUrl() - * - * @return string the permanent URL for the slide show - * @deprecated Since 1.12.10, use getUrl() - */ - public function getPermaLink() - { - return $this->getUrl(); - } - - /** - * Sets the URL of the slide show - * - * @param string $url The URL for the slide show - * @return self - */ - public function setUrl($url) - { - $this->_url = (string)$url; - return $this; - } - - /** - * Gets the URL of the slide show - * - * @return string The URL for the slide show - */ - public function getUrl() - { - return $this->_url; - } - - /** - * Sets the number of views the slide show has received - * - * @param int $views The number of views - * @return Zend_Service_SlideShare_SlideShow - */ - public function setNumViews($views) - { - $this->_numViews = (int)$views; - return $this; - } - - /** - * Gets the number of views the slide show has received - * - * @return int The number of views - */ - public function getNumViews() - { - return $this->_numViews; - } -} diff --git a/library/Zend/Service/SqlAzure/Exception.php b/library/Zend/Service/SqlAzure/Exception.php deleted file mode 100644 index 181da94614..0000000000 --- a/library/Zend/Service/SqlAzure/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -_subscriptionId = $subscriptionId; - $this->_certificatePath = $certificatePath; - $this->_certificatePassphrase = $certificatePassphrase; - - $this->_retryPolicy = $retryPolicy; - if (is_null($this->_retryPolicy)) { - $this->_retryPolicy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::noRetry(); - } - - // Setup default Zend_Http_Client channel - $options = array( - 'adapter' => 'Zend_Http_Client_Adapter_Socket', - 'ssltransport' => 'ssl', - 'sslcert' => $this->_certificatePath, - 'sslpassphrase' => $this->_certificatePassphrase, - 'sslusecontext' => true, - ); - if (function_exists('curl_init')) { - // Set cURL options if cURL is used afterwards - $options['curloptions'] = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_TIMEOUT => 120, - ); - } - $this->_httpClientChannel = new Zend_Http_Client(null, $options); - } - - /** - * Set the HTTP client channel to use - * - * @param Zend_Http_Client_Adapter_Interface|string $adapterInstance Adapter instance or adapter class name. - */ - public function setHttpClientChannel($adapterInstance = 'Zend_Http_Client_Adapter_Socket') - { - $this->_httpClientChannel->setAdapter($adapterInstance); - } - - /** - * Retrieve HTTP client channel - * - * @return Zend_Http_Client_Adapter_Interface - */ - public function getHttpClientChannel() - { - return $this->_httpClientChannel; - } - - /** - * Returns the Windows Azure subscription ID - * - * @return string - */ - public function getSubscriptionId() - { - return $this->_subscriptionId; - } - - /** - * Returns the last request ID. - * - * @return string - */ - public function getLastRequestId() - { - return $this->_lastRequestId; - } - - /** - * Get base URL for creating requests - * - * @return string - */ - public function getBaseUrl() - { - return self::URL_MANAGEMENT . '/' . $this->_subscriptionId; - } - - /** - * Perform request using Zend_Http_Client channel - * - * @param string $path Path - * @param string $queryString Query string - * @param string $httpVerb HTTP verb the request will use - * @param array $headers x-ms headers to add - * @param mixed $rawData Optional RAW HTTP data to be sent over the wire - * @return Zend_Http_Response - */ - protected function _performRequest( - $path = '/', - $queryString = '', - $httpVerb = Zend_Http_Client::GET, - $headers = array(), - $rawData = null - ) { - // Clean path - if (strpos($path, '/') !== 0) { - $path = '/' . $path; - } - - // Clean headers - if (is_null($headers)) { - $headers = array(); - } - - // Ensure cUrl will also work correctly: - // - disable Content-Type if required - // - disable Expect: 100 Continue - if (!isset($headers["Content-Type"])) { - $headers["Content-Type"] = ''; - } - //$headers["Expect"] = ''; - - // Add version header - $headers['x-ms-version'] = $this->_apiVersion; - - // URL encoding - $path = self::urlencode($path); - $queryString = self::urlencode($queryString); - - // Generate URL and sign request - $requestUrl = $this->getBaseUrl() . $path . $queryString; - $requestHeaders = $headers; - - // Prepare request - $this->_httpClientChannel->resetParameters(true); - $this->_httpClientChannel->setUri($requestUrl); - $this->_httpClientChannel->setHeaders($requestHeaders); - $this->_httpClientChannel->setRawData($rawData); - - // Execute request - $response = $this->_retryPolicy->execute( - array($this->_httpClientChannel, 'request'), - array($httpVerb) - ); - - // Store request id - $this->_lastRequestId = $response->getHeader('x-ms-request-id'); - - return $response; - } - - /** - * Parse result from Zend_Http_Response - * - * @param Zend_Http_Response $response Response from HTTP call - * @return object - * @throws Zend_Service_WindowsAzure_Exception - */ - protected function _parseResponse(Zend_Http_Response $response = null) - { - if (is_null($response)) { - #require_once 'Zend/Service/SqlAzure/Exception.php'; - throw new Zend_Service_SqlAzure_Exception('Response should not be null.'); - } - - $xml = @Zend_Xml_Security::scan($response->getBody()); - - if ($xml !== false) { - // Fetch all namespaces - $namespaces = array_merge($xml->getNamespaces(true), $xml->getDocNamespaces(true)); - - // Register all namespace prefixes - foreach ($namespaces as $prefix => $ns) { - if ($prefix != '') { - $xml->registerXPathNamespace($prefix, $ns); - } - } - } - - return $xml; - } - - /** - * URL encode function - * - * @param string $value Value to encode - * @return string Encoded value - */ - public static function urlencode($value) - { - return str_replace(' ', '%20', $value); - } - - /** - * Builds a query string from an array of elements - * - * @param array Array of elements - * @return string Assembled query string - */ - public static function createQueryStringFromArray($queryString) - { - return count($queryString) > 0 ? '?' . implode('&', $queryString) : ''; - } - - /** - * Get error message from Zend_Http_Response - * - * @param Zend_Http_Response $response Repsonse - * @param string $alternativeError Alternative error message - * @return string - */ - protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') - { - $response = $this->_parseResponse($response); - if ($response && $response->Message) { - return (string)$response->Message; - } else { - return $alternativeError; - } - } - - /** - * The Create Server operation adds a new SQL Azure server to a subscription. - * - * @param string $administratorLogin Administrator login. - * @param string $administratorPassword Administrator password. - * @param string $location Location of the server. - * @return Zend_Service_SqlAzure_Management_ServerInstance Server information. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function createServer($administratorLogin, $administratorPassword, $location) - { - if ($administratorLogin == '' || is_null($administratorLogin)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Administrator login should be specified.'); - } - if ($administratorPassword == '' || is_null($administratorPassword)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Administrator password should be specified.'); - } - if (is_null($location) && is_null($affinityGroup)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Please specify a location for the server.'); - } - - $response = $this->_performRequest(self::OP_SERVERS, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $administratorLogin . '' . $administratorPassword . '' . $location . ''); - - if ($response->isSuccessful()) { - $xml = $this->_parseResponse($response); - - return new Zend_Service_SqlAzure_Management_ServerInstance( - (string)$xml, - $administratorLogin, - $location - ); - } else { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Servers operation enumerates SQL Azure servers that are provisioned for a subscription. - * - * @return array An array of Zend_Service_SqlAzure_Management_ServerInstance. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function listServers() - { - $response = $this->_performRequest(self::OP_SERVERS); - - if ($response->isSuccessful()) { - $xml = $this->_parseResponse($response); - $xmlServices = null; - - if (!$xml->Server) { - return array(); - } - if (count($xml->Server) > 1) { - $xmlServices = $xml->Server; - } else { - $xmlServices = array($xml->Server); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_SqlAzure_Management_ServerInstance( - (string)$xmlServices[$i]->Name, - (string)$xmlServices[$i]->AdministratorLogin, - (string)$xmlServices[$i]->Location - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Drop Server operation drops a SQL Azure server from a subscription. - * - * @param string $serverName Server to drop. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function dropServer($serverName) - { - if ($serverName == '' || is_null($serverName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Server name should be specified.'); - } - - $response = $this->_performRequest(self::OP_SERVERS . '/' . $serverName, '', Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Set Server Administrator Password operation sets the administrative password of a SQL Azure server for a subscription. - * - * @param string $serverName Server to set password for. - * @param string $administratorPassword Administrator password. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function setAdministratorPassword($serverName, $administratorPassword) - { - if ($serverName == '' || is_null($serverName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Server name should be specified.'); - } - if ($administratorPassword == '' || is_null($administratorPassword)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Administrator password should be specified.'); - } - - $response = $this->_performRequest(self::OP_SERVERS . '/' . $serverName, '?op=ResetPassword', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $administratorPassword . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Set Server Firewall Rule operation updates an existing firewall rule or adds a new firewall rule for a SQL Azure server that belongs to a subscription. - * - * @param string $serverName Server name. - * @param string $ruleName Firewall rule name. - * @param string $startIpAddress Start IP address. - * @param string $endIpAddress End IP address. - * @return Zend_Service_SqlAzure_Management_FirewallRuleInstance - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function createFirewallRule($serverName, $ruleName, $startIpAddress, $endIpAddress) - { - if ($serverName == '' || is_null($serverName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Server name should be specified.'); - } - if ($ruleName == '' || is_null($ruleName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Rule name should be specified.'); - } - if ($startIpAddress == '' || is_null($startIpAddress) || !filter_var($startIpAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Start IP address should be specified.'); - } - if ($endIpAddress == '' || is_null($endIpAddress) || !filter_var($endIpAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('End IP address should be specified.'); - } - - $response = $this->_performRequest(self::OP_SERVERS . '/' . $serverName . '/' . self::OP_FIREWALLRULES . '/' . $ruleName, '', - Zend_Http_Client::PUT, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $startIpAddress . '' . $endIpAddress . ''); - - if ($response->isSuccessful()) { - - return new Zend_Service_SqlAzure_Management_FirewallRuleInstance( - $ruleName, - $startIpAddress, - $endIpAddress - ); - } else { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Server Firewall Rules operation retrieves a list of all the firewall rules for a SQL Azure server that belongs to a subscription. - * - * @param string $serverName Server name. - * @return Array of Zend_Service_SqlAzure_Management_FirewallRuleInstance. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function listFirewallRules($serverName) - { - if ($serverName == '' || is_null($serverName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Server name should be specified.'); - } - - $response = $this->_performRequest(self::OP_SERVERS . '/' . $serverName . '/' . self::OP_FIREWALLRULES); - - if ($response->isSuccessful()) { - $xml = $this->_parseResponse($response); - $xmlServices = null; - - if (!$xml->FirewallRule) { - return array(); - } - if (count($xml->FirewallRule) > 1) { - $xmlServices = $xml->FirewallRule; - } else { - $xmlServices = array($xml->FirewallRule); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_SqlAzure_Management_FirewallRuleInstance( - (string)$xmlServices[$i]->Name, - (string)$xmlServices[$i]->StartIpAddress, - (string)$xmlServices[$i]->EndIpAddress - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Delete Server Firewall Rule operation deletes a firewall rule from a SQL Azure server that belongs to a subscription. - * - * @param string $serverName Server name. - * @param string $ruleName Rule name. - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function deleteFirewallRule($serverName, $ruleName) - { - if ($serverName == '' || is_null($serverName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Server name should be specified.'); - } - if ($ruleName == '' || is_null($ruleName)) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception('Rule name should be specified.'); - } - - $response = $this->_performRequest(self::OP_SERVERS . '/' . $serverName . '/' . self::OP_FIREWALLRULES . '/' . $ruleName, '', - Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Creates a firewall rule for Microsoft Services. This is required if access to SQL Azure is required from other services like Windows Azure. - * - * @param string $serverName Server name. - * @param boolean $allowAccess Allow access from other Microsoft Services? - * @throws Zend_Service_SqlAzure_Management_Exception - */ - public function createFirewallRuleForMicrosoftServices($serverName, $allowAccess) - { - if ($allowAccess) { - $this->createFirewallRule($serverName, 'MicrosoftServices', '0.0.0.0', '0.0.0.0'); - } else { - $this->deleteFirewallRule($serverName, 'MicrosoftServices'); - } - } - -} diff --git a/library/Zend/Service/SqlAzure/Management/Exception.php b/library/Zend/Service/SqlAzure/Management/Exception.php deleted file mode 100644 index 704a5e555f..0000000000 --- a/library/Zend/Service/SqlAzure/Management/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -_data = array( - 'name' => $name, - 'startipaddress' => $startIpAddress, - 'endipaddress' => $endIpAddress - ); - } -} diff --git a/library/Zend/Service/SqlAzure/Management/ServerInstance.php b/library/Zend/Service/SqlAzure/Management/ServerInstance.php deleted file mode 100644 index 86ee93d528..0000000000 --- a/library/Zend/Service/SqlAzure/Management/ServerInstance.php +++ /dev/null @@ -1,59 +0,0 @@ -_data = array( - 'name' => $name, - 'dnsname' => $name . '.database.windows.net', - 'administratorlogin' => $administratorLogin, - 'location' => $location - ); - } -} diff --git a/library/Zend/Service/SqlAzure/Management/ServiceEntityAbstract.php b/library/Zend/Service/SqlAzure/Management/ServiceEntityAbstract.php deleted file mode 100644 index 338931defb..0000000000 --- a/library/Zend/Service/SqlAzure/Management/ServiceEntityAbstract.php +++ /dev/null @@ -1,67 +0,0 @@ -_data)) { - $this->_data[strtolower($name)] = $value; - return; - } - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception("Unknown property: " . $name); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - if (array_key_exists(strtolower($name), $this->_data)) { - return $this->_data[strtolower($name)]; - } - #require_once 'Zend/Service/SqlAzure/Management/Exception.php'; - throw new Zend_Service_SqlAzure_Management_Exception("Unknown property: " . $name); - } -} diff --git a/library/Zend/Service/StrikeIron.php b/library/Zend/Service/StrikeIron.php deleted file mode 100644 index 6319a32c88..0000000000 --- a/library/Zend/Service/StrikeIron.php +++ /dev/null @@ -1,92 +0,0 @@ -_options = $options; - } - - /** - * Factory method to return a preconfigured Zend_Service_StrikeIron_* - * instance. - * - * @param null|string $options Service options - * @return object Zend_Service_StrikeIron_* instance - * @throws Zend_Service_StrikeIron_Exception - */ - public function getService($options = array()) - { - $class = isset($options['class']) ? $options['class'] : 'Base'; - unset($options['class']); - - if (strpos($class, '_') === false) { - $class = "Zend_Service_StrikeIron_{$class}"; - } - - try { - if (!class_exists($class)) { - #require_once 'Zend/Loader.php'; - @Zend_Loader::loadClass($class); - } - if (!class_exists($class, false)) { - throw new Exception('Class file not found'); - } - } catch (Exception $e) { - $msg = "Service '$class' could not be loaded: " . $e->getMessage(); - /** - * @see Zend_Service_StrikeIron_Exception - */ - #require_once 'Zend/Service/StrikeIron/Exception.php'; - throw new Zend_Service_StrikeIron_Exception($msg, $e->getCode(), $e); - } - - // instantiate and return the service - $service = new $class(array_merge($this->_options, $options)); - return $service; - } - -} diff --git a/library/Zend/Service/StrikeIron/Base.php b/library/Zend/Service/StrikeIron/Base.php deleted file mode 100644 index 7d9aec1469..0000000000 --- a/library/Zend/Service/StrikeIron/Base.php +++ /dev/null @@ -1,274 +0,0 @@ - null, - 'password' => null, - 'client' => null, - 'options' => null, - 'headers' => null, - 'wsdl' => null); - - /** - * Output headers returned by the last call to SOAPClient->__soapCall() - * @param array - */ - protected $_outputHeaders = array(); - - /** - * Class constructor - * - * @param array $options Key/value pair options - * @throws Zend_Service_StrikeIron_Exception - */ - public function __construct($options = array()) - { - if (!extension_loaded('soap')) { - /** - * @see Zend_Service_StrikeIron_Exception - */ - #require_once 'Zend/Service/StrikeIron/Exception.php'; - throw new Zend_Service_StrikeIron_Exception('SOAP extension is not enabled'); - } - - $this->_options = array_merge($this->_options, $options); - - $this->_initSoapHeaders(); - $this->_initSoapClient(); - } - - /** - * Proxy method calls to the SOAPClient instance, transforming method - * calls and responses for convenience. - * - * @param string $method Method name - * @param array $params Parameters for method - * @return mixed Result - * @throws Zend_Service_StrikeIron_Exception - */ - public function __call($method, $params) - { - // prepare method name and parameters for soap call - list($method, $params) = $this->_transformCall($method, $params); - $params = isset($params[0]) ? array($params[0]) : array(); - - // make soap call, capturing the result and output headers - try { - $result = $this->_options['client']->__soapCall($method, - $params, - $this->_options['options'], - $this->_options['headers'], - $this->_outputHeaders); - } catch (Exception $e) { - $message = get_class($e) . ': ' . $e->getMessage(); - /** - * @see Zend_Service_StrikeIron_Exception - */ - #require_once 'Zend/Service/StrikeIron/Exception.php'; - throw new Zend_Service_StrikeIron_Exception($message, $e->getCode(), $e); - } - - // transform/decorate the result and return it - $result = $this->_transformResult($result, $method, $params); - return $result; - } - - /** - * Initialize the SOAPClient instance - * - * @return void - */ - protected function _initSoapClient() - { - if (! isset($this->_options['options'])) { - $this->_options['options'] = array(); - } - - if (! isset($this->_options['client'])) { - $this->_options['client'] = new SoapClient($this->_options['wsdl'], - $this->_options['options']); - } - } - - /** - * Initialize the headers to pass to SOAPClient->__soapCall() - * - * @return void - * @throws Zend_Service_StrikeIron_Exception - */ - protected function _initSoapHeaders() - { - // validate headers and check if LicenseInfo was given - $foundLicenseInfo = false; - if (isset($this->_options['headers'])) { - if (! is_array($this->_options['headers'])) { - $this->_options['headers'] = array($this->_options['headers']); - } - - foreach ($this->_options['headers'] as $header) { - if (! $header instanceof SoapHeader) { - /** - * @see Zend_Service_StrikeIron_Exception - */ - #require_once 'Zend/Service/StrikeIron/Exception.php'; - throw new Zend_Service_StrikeIron_Exception('Header must be instance of SoapHeader'); - } else if ($header->name == 'LicenseInfo') { - $foundLicenseInfo = true; - break; - } - } - } else { - $this->_options['headers'] = array(); - } - - // add default LicenseInfo header if a custom one was not supplied - if (! $foundLicenseInfo) { - $this->_options['headers'][] = new SoapHeader('http://ws.strikeiron.com', - 'LicenseInfo', - array('RegisteredUser' => array('UserID' => $this->_options['username'], - 'Password' => $this->_options['password']))); - } - } - - /** - * Transform a method name or method parameters before sending them - * to the remote service. This can be useful for inflection or other - * transforms to give the method call a more PHP-like interface. - * - * @see __call() - * @param string $method Method name called from PHP - * @param mixed $param Parameters passed from PHP - * @return array [$method, $params] for SOAPClient->__soapCall() - */ - protected function _transformCall($method, $params) - { - return array(ucfirst($method), $params); - } - - /** - * Transform the result returned from a method before returning - * it to the PHP caller. This can be useful for transforming - * the SOAPClient returned result to be more PHP-like. - * - * The $method name and $params passed to the method are provided to - * allow decisions to be made about how to transform the result based - * on what was originally called. - * - * @see __call() - * @param object $result Raw result returned from SOAPClient_>__soapCall() - * @param string $method Method name that was passed to SOAPClient->__soapCall() - * @param array $params Method parameters that were passed to SOAPClient->__soapCall() - * @return mixed Transformed result - */ - protected function _transformResult($result, $method, $params) - { - $resultObjectName = "{$method}Result"; - if (isset($result->$resultObjectName)) { - $result = $result->$resultObjectName; - } - if (is_object($result)) { - $result = new Zend_Service_StrikeIron_Decorator($result, $resultObjectName); - } - return $result; - } - - /** - * Get the WSDL URL for this service. - * - * @return string - */ - public function getWsdl() - { - return $this->_options['wsdl']; - } - - /** - * Get the SOAP Client instance for this service. - */ - public function getSoapClient() - { - return $this->_options['client']; - } - - /** - * Get the StrikeIron output headers returned with the last method response. - * - * @return array - */ - public function getLastOutputHeaders() - { - return $this->_outputHeaders; - } - - /** - * Get the StrikeIron subscription information for this service. - * If any service method was recently called, the subscription info - * should have been returned in the SOAP headers so it is cached - * and returned from the cache. Otherwise, the getRemainingHits() - * method is called as a dummy to get the subscription info headers. - * - * @param boolean $now Force a call to getRemainingHits instead of cache? - * @param string $queryMethod Method that will cause SubscriptionInfo header to be sent - * @return Zend_Service_StrikeIron_Decorator Decorated subscription info - * @throws Zend_Service_StrikeIron_Exception - */ - public function getSubscriptionInfo($now = false, $queryMethod = 'GetRemainingHits') - { - if ($now || empty($this->_outputHeaders['SubscriptionInfo'])) { - $this->$queryMethod(); - } - - // capture subscription info if returned in output headers - if (isset($this->_outputHeaders['SubscriptionInfo'])) { - $info = (object)$this->_outputHeaders['SubscriptionInfo']; - $subscriptionInfo = new Zend_Service_StrikeIron_Decorator($info, 'SubscriptionInfo'); - } else { - $msg = 'No SubscriptionInfo header found in last output headers'; - /** - * @see Zend_Service_StrikeIron_Exception - */ - #require_once 'Zend/Service/StrikeIron/Exception.php'; - throw new Zend_Service_StrikeIron_Exception($msg); - } - - return $subscriptionInfo; - } -} diff --git a/library/Zend/Service/StrikeIron/Decorator.php b/library/Zend/Service/StrikeIron/Decorator.php deleted file mode 100644 index 023fd8c7f6..0000000000 --- a/library/Zend/Service/StrikeIron/Decorator.php +++ /dev/null @@ -1,143 +0,0 @@ -_object = $object; - $this->_name = $name; - } - - /** - * Proxy property access to the decorated object, inflecting - * the property name and decorating any child objects returned. - * If the property is not found in the decorated object, return - * NULL as a convenience feature to avoid notices. - * - * @param string $property Property name to retrieve - * @return mixed Value of property or NULL - */ - public function __get($property) - { - $result = null; - - if (! isset($this->_object->$property)) { - $property = $this->_inflect($property); - } - - if (isset($this->_object->$property)) { - $result = $this->_object->$property; - $result = $this->_decorate($result); - } - return $result; - } - - /** - * Proxy method calls to the decorated object. This will only - * be used when the SOAPClient returns a custom PHP object via - * its classmap option so no inflection is done. - * - * @param string $method Name of method called - * @param array $args Arguments for method - */ - public function __call($method, $args) - { - return call_user_func_array(array($this->_object, $method), $args); - } - - /** - * Inflect a property name from PHP-style to the result object's - * style. The default implementation here only inflects the case - * of the first letter, e.g. from "fooBar" to "FooBar". - * - * @param string $property Property name to inflect - * @return string Inflected property name - */ - protected function _inflect($property) - { - return ucfirst($property); - } - - /** - * Decorate a value returned by the result object. The default - * implementation here only decorates child objects. - * - * @param mixed $result Value to decorate - * @return mixed Decorated result - */ - protected function _decorate($result) - { - if (is_object($result)) { - $result = new self($result); - } - return $result; - } - - /** - * Return the object being decorated - * - * @return object - */ - public function getDecoratedObject() - { - return $this->_object; - } - - /** - * Return the name of the object being decorated - * - * @return null|string - */ - public function getDecoratedObjectName() - { - return $this->_name; - } -} diff --git a/library/Zend/Service/StrikeIron/Exception.php b/library/Zend/Service/StrikeIron/Exception.php deleted file mode 100644 index 307e3f6962..0000000000 --- a/library/Zend/Service/StrikeIron/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ - null, - 'password' => null, - 'client' => null, - 'options' => null, - 'headers' => null, - 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/taxdatabasic4?WSDL'); -} diff --git a/library/Zend/Service/StrikeIron/USAddressVerification.php b/library/Zend/Service/StrikeIron/USAddressVerification.php deleted file mode 100644 index bd23841c8e..0000000000 --- a/library/Zend/Service/StrikeIron/USAddressVerification.php +++ /dev/null @@ -1,45 +0,0 @@ - null, - 'password' => null, - 'client' => null, - 'options' => null, - 'headers' => null, - 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/USAddressVerification4_0?WSDL'); -} diff --git a/library/Zend/Service/StrikeIron/ZipCodeInfo.php b/library/Zend/Service/StrikeIron/ZipCodeInfo.php deleted file mode 100644 index 0408b67900..0000000000 --- a/library/Zend/Service/StrikeIron/ZipCodeInfo.php +++ /dev/null @@ -1,45 +0,0 @@ - null, - 'password' => null, - 'client' => null, - 'options' => null, - 'headers' => null, - 'wsdl' => 'http://sdpws.strikeiron.com/zf1.StrikeIron/sdpZIPCodeInfo?WSDL'); -} diff --git a/library/Zend/Service/Twitter.php b/library/Zend/Service/Twitter.php deleted file mode 100755 index 702fae96f0..0000000000 --- a/library/Zend/Service/Twitter.php +++ /dev/null @@ -1,1307 +0,0 @@ -toArray(); - } - if (!is_array($options)) { - $options = array(); - } - - $this->options = $options; - - if (isset($options['username'])) { - $this->setUsername($options['username']); - } - - $accessToken = false; - if (isset($options['accessToken'])) { - $accessToken = $options['accessToken']; - } elseif (isset($options['access_token'])) { - $accessToken = $options['access_token']; - } - - $oauthOptions = array(); - if (isset($options['oauthOptions'])) { - $oauthOptions = $options['oauthOptions']; - } elseif (isset($options['oauth_options'])) { - $oauthOptions = $options['oauth_options']; - } - $oauthOptions['siteUrl'] = self::OAUTH_BASE_URI; - - $httpClientOptions = array(); - if (isset($options['httpClientOptions'])) { - $httpClientOptions = $options['httpClientOptions']; - } elseif (isset($options['http_client_options'])) { - $httpClientOptions = $options['http_client_options']; - } - - // If we have an OAuth access token, use the HTTP client it provides - if ($accessToken && is_array($accessToken) - && (isset($accessToken['token']) && isset($accessToken['secret'])) - ) { - $token = new Zend_Oauth_Token_Access(); - $token->setToken($accessToken['token']); - $token->setTokenSecret($accessToken['secret']); - $accessToken = $token; - } - if ($accessToken && $accessToken instanceof Zend_Oauth_Token_Access) { - $oauthOptions['token'] = $accessToken; - $this->setHttpClient($accessToken->getHttpClient($oauthOptions, self::OAUTH_BASE_URI, $httpClientOptions)); - return; - } - - // See if we were passed an http client - if (isset($options['httpClient']) && null === $httpClient) { - $httpClient = $options['httpClient']; - } elseif (isset($options['http_client']) && null === $httpClient) { - $httpClient = $options['http_client']; - } - if ($httpClient instanceof Zend_Http_Client) { - $this->httpClient = $httpClient; - } else { - $this->setHttpClient(new Zend_Http_Client(null, $httpClientOptions)); - } - - // Set the OAuth consumer - if ($consumer === null) { - $consumer = new Zend_Oauth_Consumer($oauthOptions); - } - $this->oauthConsumer = $consumer; - } - - /** - * Proxy service methods - * - * @param string $type - * @return Twitter - * @throws Exception\DomainException If method not in method types list - */ - public function __get($type) - { - $type = strtolower($type); - $type = str_replace('_', '', $type); - if (!in_array($type, $this->methodTypes)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Invalid method type "' . $type . '"' - ); - } - $this->methodType = $type; - return $this; - } - - /** - * Method overloading - * - * @param string $method - * @param array $params - * @return mixed - * @throws Exception\BadMethodCallException if unable to find method - */ - public function __call($method, $params) - { - if (method_exists($this->oauthConsumer, $method)) { - $return = call_user_func_array(array($this->oauthConsumer, $method), $params); - if ($return instanceof Zend_Oauth_Token_Access) { - $this->setHttpClient($return->getHttpClient($this->options)); - } - return $return; - } - if (empty($this->methodType)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Invalid method "' . $method . '"' - ); - } - - $test = str_replace('_', '', strtolower($method)); - $test = $this->methodType . $test; - if (!method_exists($this, $test)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Invalid method "' . $test . '"' - ); - } - - return call_user_func_array(array($this, $test), $params); - } - - /** - * Set HTTP client - * - * @param Zend_Http_Client $client - * @return self - */ - public function setHttpClient(Zend_Http_Client $client) - { - $this->httpClient = $client; - $this->httpClient->setHeaders(array('Accept-Charset' => 'ISO-8859-1,utf-8')); - return $this; - } - - /** - * Get the HTTP client - * - * Lazy loads one if none present - * - * @return Zend_Http_Client - */ - public function getHttpClient() - { - if (null === $this->httpClient) { - $this->setHttpClient(new Zend_Http_Client()); - } - return $this->httpClient; - } - - /** - * Retrieve username - * - * @return string - */ - public function getUsername() - { - return $this->username; - } - - /** - * Set username - * - * @param string $value - * @return self - */ - public function setUsername($value) - { - $this->username = $value; - return $this; - } - - /** - * Checks for an authorised state - * - * @return bool - */ - public function isAuthorised() - { - if ($this->getHttpClient() instanceof Zend_Oauth_Client) { - return true; - } - return false; - } - - /** - * Verify Account Credentials - * - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function accountVerifyCredentials() - { - $this->init(); - $response = $this->get('account/verify_credentials'); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Returns the number of api requests you have left per hour. - * - * @todo Have a separate payload object to represent rate limits - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function applicationRateLimitStatus() - { - $this->init(); - $response = $this->get('application/rate_limit_status'); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Blocks the user specified in the ID parameter as the authenticating user. - * Destroys a friendship to the blocked user if it exists. - * - * @param integer|string $id The ID or screen name of a user to block. - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function blocksCreate($id) - { - $this->init(); - $path = 'blocks/create'; - $params = $this->createUserParameter($id, array()); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Un-blocks the user specified in the ID parameter for the authenticating user - * - * @param integer|string $id The ID or screen_name of the user to un-block. - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function blocksDestroy($id) - { - $this->init(); - $path = 'blocks/destroy'; - $params = $this->createUserParameter($id, array()); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Returns an array of user ids that the authenticating user is blocking - * - * @param integer $cursor Optional. Specifies the cursor position at which to begin listing ids; defaults to first "page" of results. - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function blocksIds($cursor = -1) - { - $this->init(); - $path = 'blocks/ids'; - $response = $this->get($path, array('cursor' => $cursor)); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Returns an array of user objects that the authenticating user is blocking - * - * @param integer $cursor Optional. Specifies the cursor position at which to begin listing ids; defaults to first "page" of results. - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function blocksList($cursor = -1) - { - $this->init(); - $path = 'blocks/list'; - $response = $this->get($path, array('cursor' => $cursor)); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Destroy a direct message - * - * @param int $id ID of message to destroy - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function directMessagesDestroy($id) - { - $this->init(); - $path = 'direct_messages/destroy'; - $params = array('id' => $this->validInteger($id)); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Retrieve direct messages for the current user - * - * $options may include one or more of the following keys - * - count: return page X of results - * - since_id: return statuses only greater than the one specified - * - max_id: return statuses with an ID less than (older than) or equal to that specified - * - include_entities: setting to false will disable embedded entities - * - skip_status:setting to true, "t", or 1 will omit the status in returned users - * - * @param array $options - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function directMessagesMessages(array $options = array()) - { - $this->init(); - $path = 'direct_messages'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'count': - $params['count'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - case 'skip_status': - $params['skip_status'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Send a direct message to a user - * - * @param int|string $user User to whom to send message - * @param string $text Message to send to user - * @throws Exception\InvalidArgumentException if message is empty - * @throws Exception\OutOfRangeException if message is too long - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function directMessagesNew($user, $text) - { - $this->init(); - $path = 'direct_messages/new'; - - $len = iconv_strlen($text, 'UTF-8'); - if (0 == $len) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Direct message must contain at least one character' - ); - } elseif (140 < $len) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Direct message must contain no more than 140 characters' - ); - } - - $params = $this->createUserParameter($user, array()); - $params['text'] = $text; - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Retrieve list of direct messages sent by current user - * - * $options may include one or more of the following keys - * - count: return page X of results - * - page: return starting at page - * - since_id: return statuses only greater than the one specified - * - max_id: return statuses with an ID less than (older than) or equal to that specified - * - include_entities: setting to false will disable embedded entities - * - * @param array $options - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function directMessagesSent(array $options = array()) - { - $this->init(); - $path = 'direct_messages/sent'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'count': - $params['count'] = (int) $value; - break; - case 'page': - $params['page'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Mark a status as a favorite - * - * @param int $id Status ID you want to mark as a favorite - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function favoritesCreate($id) - { - $this->init(); - $path = 'favorites/create'; - $params = array('id' => $this->validInteger($id)); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Remove a favorite - * - * @param int $id Status ID you want to de-list as a favorite - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function favoritesDestroy($id) - { - $this->init(); - $path = 'favorites/destroy'; - $params = array('id' => $this->validInteger($id)); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Fetch favorites - * - * $options may contain one or more of the following: - * - user_id: Id of a user for whom to fetch favorites - * - screen_name: Screen name of a user for whom to fetch favorites - * - count: number of tweets to attempt to retrieve, up to 200 - * - since_id: return results only after the specified tweet id - * - max_id: return results with an ID less than (older than) or equal to the specified ID - * - include_entities: when set to false, entities member will be omitted - * - * @param array $params - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function favoritesList(array $options = array()) - { - $this->init(); - $path = 'favorites/list'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'user_id': - $params['user_id'] = $this->validInteger($value); - break; - case 'screen_name': - $params['screen_name'] = $value; - break; - case 'count': - $params['count'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Create friendship - * - * @param int|string $id User ID or name of new friend - * @param array $params Additional parameters to pass - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function friendshipsCreate($id, array $params = array()) - { - $this->init(); - $path = 'friendships/create'; - $params = $this->createUserParameter($id, $params); - $allowed = array( - 'user_id' => null, - 'screen_name' => null, - 'follow' => null, - ); - $params = array_intersect_key($params, $allowed); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Destroy friendship - * - * @param int|string $id User ID or name of friend to remove - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function friendshipsDestroy($id) - { - $this->init(); - $path = 'friendships/destroy'; - $params = $this->createUserParameter($id, array()); - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Search tweets - * - * $options may include any of the following: - * - geocode: a string of the form "latitude, longitude, radius" - * - lang: restrict tweets to the two-letter language code - * - locale: query is in the given two-letter language code - * - result_type: what type of results to receive: mixed, recent, or popular - * - count: number of tweets to return per page; up to 100 - * - until: return tweets generated before the given date - * - since_id: return resutls with an ID greater than (more recent than) the given ID - * - max_id: return results with an ID less than (older than) the given ID - * - include_entities: whether or not to include embedded entities - * - * @param string $query - * @param array $options - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function searchTweets($query, array $options = array()) - { - $this->init(); - $path = 'search/tweets'; - - $len = iconv_strlen($query, 'UTF-8'); - if (0 == $len) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Query must contain at least one character' - ); - } - - $params = array('q' => $query); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'geocode': - if (!substr_count($value, ',') !== 2) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - '"geocode" must be of the format "latitude,longitude,radius"' - ); - } - list($latitude, $longitude, $radius) = explode(',', $value); - $radius = trim($radius); - if (!preg_match('/^\d+(mi|km)$/', $radius)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Radius segment of "geocode" must be of the format "[unit](mi|km)"' - ); - } - $latitude = (float) $latitude; - $longitude = (float) $longitude; - $params['geocode'] = $latitude . ',' . $longitude . ',' . $radius; - break; - case 'lang': - if (strlen($value) > 2) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Query language must be a 2 character string' - ); - } - $params['lang'] = strtolower($value); - break; - case 'locale': - if (strlen($value) > 2) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Query locale must be a 2 character string' - ); - } - $params['locale'] = strtolower($value); - break; - case 'result_type': - $value = strtolower($value); - if (!in_array($value, array('mixed', 'recent', 'popular'))) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'result_type must be one of "mixed", "recent", or "popular"' - ); - } - $params['result_type'] = $value; - break; - case 'count': - $value = (int) $value; - if (1 > $value || 100 < $value) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'count must be between 1 and 100' - ); - } - $params['count'] = $value; - break; - case 'until': - if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - '"until" must be a date in the format YYYY-MM-DD' - ); - } - $params['until'] = $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Destroy a status message - * - * @param int $id ID of status to destroy - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesDestroy($id) - { - $this->init(); - $path = 'statuses/destroy/' . $this->validInteger($id); - $response = $this->post($path); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Friend Timeline Status - * - * $options may include one or more of the following keys - * - count: number of tweets to attempt to retrieve, up to 200 - * - since_id: return results only after the specified tweet id - * - max_id: return results with an ID less than (older than) or equal to the specified ID - * - trim_user: when set to true, "t", or 1, user object in tweets will include only author's ID. - * - contributor_details: when set to true, includes screen_name of each contributor - * - include_entities: when set to false, entities member will be omitted - * - exclude_replies: when set to true, will strip replies appearing in the timeline - * - * @param array $params - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesHomeTimeline(array $options = array()) - { - $this->init(); - $path = 'statuses/home_timeline'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'count': - $params['count'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'trim_user': - if (in_array($value, array(true, 'true', 't', 1, '1'))) { - $value = true; - } else { - $value = false; - } - $params['trim_user'] = $value; - break; - case 'contributor_details:': - $params['contributor_details:'] = (bool) $value; - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - case 'exclude_replies': - $params['exclude_replies'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Get status replies - * - * $options may include one or more of the following keys - * - count: number of tweets to attempt to retrieve, up to 200 - * - since_id: return results only after the specified tweet id - * - max_id: return results with an ID less than (older than) or equal to the specified ID - * - trim_user: when set to true, "t", or 1, user object in tweets will include only author's ID. - * - contributor_details: when set to true, includes screen_name of each contributor - * - include_entities: when set to false, entities member will be omitted - * - * @param array $options - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesMentionsTimeline(array $options = array()) - { - $this->init(); - $path = 'statuses/mentions_timeline'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'count': - $params['count'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'trim_user': - if (in_array($value, array(true, 'true', 't', 1, '1'))) { - $value = true; - } else { - $value = false; - } - $params['trim_user'] = $value; - break; - case 'contributor_details:': - $params['contributor_details:'] = (bool) $value; - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Public Timeline status - * - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesSample() - { - $this->init(); - $path = 'statuses/sample'; - $response = $this->get($path); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Show a single status - * - * @param int $id Id of status to show - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesShow($id) - { - $this->init(); - $path = 'statuses/show/' . $this->validInteger($id); - $response = $this->get($path); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Update user's current status - * - * @todo Support additional parameters supported by statuses/update endpoint - * @param string $status - * @param null|int $inReplyToStatusId - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\OutOfRangeException if message is too long - * @throws Exception\InvalidArgumentException if message is empty - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesUpdate($status, $inReplyToStatusId = null) - { - $this->init(); - $path = 'statuses/update'; - $len = iconv_strlen(htmlspecialchars($status, ENT_QUOTES, 'UTF-8'), 'UTF-8'); - if ($len > self::STATUS_MAX_CHARACTERS) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Status must be no more than ' - . self::STATUS_MAX_CHARACTERS - . ' characters in length' - ); - } elseif (0 == $len) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Status must contain at least one character' - ); - } - - $params = array('status' => $status); - $inReplyToStatusId = $this->validInteger($inReplyToStatusId); - if ($inReplyToStatusId) { - $params['in_reply_to_status_id'] = $inReplyToStatusId; - } - $response = $this->post($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * User Timeline status - * - * $options may include one or more of the following keys - * - user_id: Id of a user for whom to fetch favorites - * - screen_name: Screen name of a user for whom to fetch favorites - * - count: number of tweets to attempt to retrieve, up to 200 - * - since_id: return results only after the specified tweet id - * - max_id: return results with an ID less than (older than) or equal to the specified ID - * - trim_user: when set to true, "t", or 1, user object in tweets will include only author's ID. - * - exclude_replies: when set to true, will strip replies appearing in the timeline - * - contributor_details: when set to true, includes screen_name of each contributor - * - include_rts: when set to false, will strip native retweets - * - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function statusesUserTimeline(array $options = array()) - { - $this->init(); - $path = 'statuses/user_timeline'; - $params = array(); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'user_id': - $params['user_id'] = $this->validInteger($value); - break; - case 'screen_name': - $params['screen_name'] = $this->validateScreenName($value); - break; - case 'count': - $params['count'] = (int) $value; - break; - case 'since_id': - $params['since_id'] = $this->validInteger($value); - break; - case 'max_id': - $params['max_id'] = $this->validInteger($value); - break; - case 'trim_user': - if (in_array($value, array(true, 'true', 't', 1, '1'))) { - $value = true; - } else { - $value = false; - } - $params['trim_user'] = $value; - break; - case 'contributor_details:': - $params['contributor_details:'] = (bool) $value; - break; - case 'exclude_replies': - $params['exclude_replies'] = (bool) $value; - break; - case 'include_rts': - $params['include_rts'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Search users - * - * $options may include any of the following: - * - page: the page of results to retrieve - * - count: the number of users to retrieve per page; max is 20 - * - include_entities: if set to boolean true, include embedded entities - * - * @param string $query - * @param array $options - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function usersSearch($query, array $options = array()) - { - $this->init(); - $path = 'users/search'; - - $len = iconv_strlen($query, 'UTF-8'); - if (0 == $len) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Query must contain at least one character' - ); - } - - $params = array('q' => $query); - foreach ($options as $key => $value) { - switch (strtolower($key)) { - case 'count': - $value = (int) $value; - if (1 > $value || 20 < $value) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'count must be between 1 and 20' - ); - } - $params['count'] = $value; - break; - case 'page': - $params['page'] = (int) $value; - break; - case 'include_entities': - $params['include_entities'] = (bool) $value; - break; - default: - break; - } - } - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - - /** - * Show extended information on a user - * - * @param int|string $id User ID or name - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @throws Exception\DomainException if unable to decode JSON payload - * @return Zend_Service_Twitter_Response - */ - public function usersShow($id) - { - $this->init(); - $path = 'users/show'; - $params = $this->createUserParameter($id, array()); - $response = $this->get($path, $params); - return new Zend_Service_Twitter_Response($response); - } - - /** - * Initialize HTTP authentication - * - * @return void - * @throws Exception\DomainException if unauthorised - */ - protected function init() - { - if (!$this->isAuthorised() && $this->getUsername() !== null) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Twitter session is unauthorised. You need to initialize ' - . __CLASS__ . ' with an OAuth Access Token or use ' - . 'its OAuth functionality to obtain an Access Token before ' - . 'attempting any API actions that require authorisation' - ); - } - $client = $this->getHttpClient(); - $client->resetParameters(); - if (null === $this->cookieJar) { - $cookieJar = $client->getCookieJar(); - if (null === $cookieJar) { - $cookieJar = new Zend_Http_CookieJar(); - } - $this->cookieJar = $cookieJar; - $this->cookieJar->reset(); - } else { - $client->setCookieJar($this->cookieJar); - } - } - - /** - * Protected function to validate that the integer is valid or return a 0 - * - * @param $int - * @throws Zend_Http_Client_Exception if HTTP request fails or times out - * @return integer - */ - protected function validInteger($int) - { - if (preg_match("/(\d+)/", $int)) { - return $int; - } - return 0; - } - - /** - * Validate a screen name using Twitter rules - * - * @param string $name - * @return string - * @throws Exception\InvalidArgumentException - */ - protected function validateScreenName($name) - { - if (!preg_match('/^[a-zA-Z0-9_]{0,20}$/', $name)) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Screen name, "' . $name - . '" should only contain alphanumeric characters and' - . ' underscores, and not exceed 15 characters.'); - } - return $name; - } - - /** - * Call a remote REST web service URI - * - * @param string $path The path to append to the URI - * @param Zend_Http_Client $client - * @throws Zend_Http_Client_Exception - * @return void - */ - protected function prepare($path, Zend_Http_Client $client) - { - $client->setUri(self::API_BASE_URI . $path . '.json'); - - /** - * Do this each time to ensure oauth calls do not inject new params - */ - $client->resetParameters(); - } - - /** - * Performs an HTTP GET request to the $path. - * - * @param string $path - * @param array $query Array of GET parameters - * @throws Zend_Http_Client_Exception - * @return Zend_Http_Response - */ - protected function get($path, array $query = array()) - { - $client = $this->getHttpClient(); - $this->prepare($path, $client); - $client->setParameterGet($query); - $response = $client->request(Zend_Http_Client::GET); - return $response; - } - - /** - * Performs an HTTP POST request to $path. - * - * @param string $path - * @param mixed $data Raw data to send - * @throws Zend_Http_Client_Exception - * @return Zend_Http_Response - */ - protected function post($path, $data = null) - { - $client = $this->getHttpClient(); - $this->prepare($path, $client); - $response = $this->performPost(Zend_Http_Client::POST, $data, $client); - return $response; - } - - /** - * Perform a POST or PUT - * - * Performs a POST or PUT request. Any data provided is set in the HTTP - * client. String data is pushed in as raw POST data; array or object data - * is pushed in as POST parameters. - * - * @param mixed $method - * @param mixed $data - * @return Zend_Http_Response - */ - protected function performPost($method, $data, Zend_Http_Client $client) - { - if (is_string($data)) { - $client->setRawData($data); - } elseif (is_array($data) || is_object($data)) { - $client->setParameterPost((array) $data); - } - return $client->request($method); - } - - /** - * Create a parameter representing the user - * - * Determines if $id is an integer, and, if so, sets the "user_id" parameter. - * If not, assumes the $id is the "screen_name". - * - * @param int|string $id - * @param array $params - * @return array - */ - protected function createUserParameter($id, array $params) - { - if ($this->validInteger($id)) { - $params['user_id'] = $id; - return $params; - } - - $params['screen_name'] = $this->validateScreenName($id); - return $params; - } -} diff --git a/library/Zend/Service/Twitter/Exception.php b/library/Zend/Service/Twitter/Exception.php deleted file mode 100755 index d26023c67e..0000000000 --- a/library/Zend/Service/Twitter/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -httpResponse = $httpResponse; - $this->rawBody = $httpResponse->getBody(); - try { - $jsonBody = Zend_Json::decode($this->rawBody, Zend_Json::TYPE_OBJECT); - $this->jsonBody = $jsonBody; - } catch (Zend_Json_Exception $e) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception(sprintf( - 'Unable to decode response from twitter: %s', - $e->getMessage() - ), 0, $e); - } - } - - /** - * Property overloading to JSON elements - * - * If a named property exists within the JSON response returned, - * proxies to it. Otherwise, returns null. - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - if (null === $this->jsonBody) { - return null; - } - if (!isset($this->jsonBody->{$name})) { - return null; - } - return $this->jsonBody->{$name}; - } - - /** - * Was the request successful? - * - * @return bool - */ - public function isSuccess() - { - return $this->httpResponse->isSuccessful(); - } - - /** - * Did an error occur in the request? - * - * @return bool - */ - public function isError() - { - return !$this->httpResponse->isSuccessful(); - } - - /** - * Retrieve the errors. - * - * Twitter _should_ return a standard error object, which contains an - * "errors" property pointing to an array of errors. This method will - * return that array if present, and raise an exception if not detected. - * - * If the response was successful, an empty array is returned. - * - * @return array - * @throws Exception\DomainException if unable to detect structure of error response - */ - public function getErrors() - { - if (!$this->isError()) { - return array(); - } - if (null === $this->jsonBody - || !isset($this->jsonBody->errors) - ) { - #require_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception( - 'Either no JSON response received, or JSON error response is malformed; cannot return errors' - ); - } - return $this->jsonBody->errors; - } - - /** - * Retrieve the raw response body - * - * @return string - */ - public function getRawResponse() - { - return $this->rawBody; - } - - /** - * Retun the decoded response body - * - * @return array|stdClass - */ - public function toValue() - { - return $this->jsonBody; - } -} diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Certificate.php b/library/Zend/Service/WindowsAzure/CommandLine/Certificate.php deleted file mode 100644 index 7e33c508b2..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Certificate.php +++ /dev/null @@ -1,180 +0,0 @@ -" -cert:"mycert.pem" -sn:"phptest" - */ - public function listCertificatesCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->listCertificates($serviceName); - - if (count($result) == 0) { - echo 'No data to display.'; - } - foreach ($result as $object) { - $this->_displayObjectInformation($object, array('Thumbprint', 'CertificateUrl', 'ThumbprintAlgorithm')); - } - } - - /** - * Add a certificate for a specified hosted service in a specified subscription. - * - * @command-name Add - * @command-description Add a certificate for a specified hosted service in a specified subscription. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --ServiceName|-sn Required. The name of the hosted service. - * @command-parameter-for $certificateLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateLocation Required. Path to the .pfx certificate to be added. - * @command-parameter-for $certificatePassword Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --CertificatePassword Required. The password for the certificate that will be added. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Add certificates for service name "phptest": - * @command-example Add -sid:"" -cert:"mycert.pem" -sn:"phptest" --CertificateLocation:"cert.pfx" --CertificatePassword:"certpassword" - */ - public function addCertificateCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $certificateLocation, $certificatePassword, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->addCertificate($serviceName, $certificateLocation, $certificatePassword, 'pfx'); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Gets a certificate from a specified hosted service in a specified subscription. - * - * @command-name Get - * @command-description Gets a certificate from a specified hosted service in a specified subscription. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --ServiceName|-sn Required. The name of the hosted service. - * @command-parameter-for $thumbprint Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateThumbprint Required. The certificate thumbprint for which to retrieve the certificate. - * @command-parameter-for $algorithm Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateAlgorithm Required. The certificate's algorithm. - * @command-example Get certificate for service name "phptest": - * @command-example Get -sid:"" -cert:"mycert.pem" -sn:"phptest" --CertificateThumbprint:"" --CertificateAlgorithm:"sha1" - */ - public function getCertificateCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $thumbprint, $algorithm = "sha1") - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getCertificate($serviceName, $algorithm, $thumbprint); - - $this->_displayObjectInformation($result, array('Thumbprint', 'CertificateUrl', 'ThumbprintAlgorithm')); - } - - /** - * Gets a certificate property from a specified hosted service in a specified subscription. - * - * @command-name GetProperty - * @command-description Gets a certificate property from a specified hosted service in a specified subscription. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --ServiceName|-sn Required. The name of the hosted service. - * @command-parameter-for $thumbprint Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateThumbprint Required. The certificate thumbprint for which to retrieve the certificate. - * @command-parameter-for $algorithm Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateAlgorithm Required. The certificate's algorithm. - * @command-parameter-for $property Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Property|-prop Required. The property to retrieve for the certificate. - * @command-example Get certificate for service name "phptest": - * @command-example Get -sid:"" -cert:"mycert.pem" -sn:"phptest" --CertificateThumbprint:"" --CertificateAlgorithm:"sha1" - */ - public function getCertificatePropertyCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $thumbprint, $algorithm = "sha1", $property) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getCertificate($serviceName, $algorithm, $thumbprint); - - printf("%s\r\n", $result->$property); - } - - /** - * Deletes a certificate from a specified hosted service in a specified subscription. - * - * @command-name Delete - * @command-description Deletes a certificate from a specified hosted service in a specified subscription. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --ServiceName|-sn Required. The name of the hosted service. - * @command-parameter-for $thumbprint Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateThumbprint Required. The certificate thumbprint for which to retrieve the certificate. - * @command-parameter-for $algorithm Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --CertificateAlgorithm Required. The certificate's algorithm. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Get certificate for service name "phptest": - * @command-example Get -sid:"" -cert:"mycert.pem" -sn:"phptest" --CertificateThumbprint:"" --CertificateAlgorithm:"sha1" - */ - public function deleteCertificateCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $thumbprint, $algorithm = "sha1", $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->deleteCertificate($serviceName, $algorithm, $thumbprint); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } -} - -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Deployment.php b/library/Zend/Service/WindowsAzure/CommandLine/Deployment.php deleted file mode 100644 index f11e4acad6..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Deployment.php +++ /dev/null @@ -1,585 +0,0 @@ -" -cert:"mycert.pem" --Name:"hostedservicename" --DeploymentName:"deploymentname" - * @command-example --Label:"deploymentlabel" --Production - * @command-example --PackageUrl:"http://acct.blob.core.windows.net/pkgs/service.cspkg" - * @command-example --ServiceConfigLocation:".\ServiceConfiguration.cscfg" --StartImmediately --WaitFor - */ - public function createFromStorageCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentName, $label, $staging = false, $production = false, $packageUrl, $serviceConfigurationLocation, $startImmediately = true, $warningsAsErrors = false, $waitForOperation = false) - { - $deploymentSlot = 'staging'; - if (!$staging && !$production) { - #require_once 'Zend/Service/Console/Exception.php'; - throw new Zend_Service_Console_Exception('Either --Staging or --Production should be specified.'); - } - if ($production) { - $deploymentSlot = 'production'; - } - - $client->createDeployment($serviceName, $deploymentSlot, $deploymentName, $label, $packageUrl, $serviceConfigurationLocation, $startImmediately, $warningsAsErrors); - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Creates a deployment from a local package file and service configuration. - * - * @command-name CreateFromLocal - * @command-description Creates a deployment from a local package file and service configuration. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --DeploymentName Required. The name for the deployment. - * @command-parameter-for $label Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Label Required. The label for the deployment. - * @command-parameter-for $staging Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Staging Host the service in the staging slot. - * @command-parameter-for $production Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Production Host the service in the staging slot. - * @command-parameter-for $packageLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --PackageLocation Required. The location of the .cspkg file. - * @command-parameter-for $serviceConfigurationLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ServiceConfigLocation Required. The location of the .cspkg file. - * @command-parameter-for $storageAccount Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --StorageAccount Required. Storage account to use when creating the deployment. - * @command-parameter-for $startImmediately Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --StartImmediately Optional. Start the deployment after creation. - * @command-parameter-for $warningsAsErrors Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WarningsAsErrors Optional. Treat warnings as errors. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Create a deployment from a local .cspkg: - * @command-example CreateFromLocal -sid:"" -cert:"mycert.pem" --Name:"hostedservicename" --DeploymentName:"deploymentname" - * @command-example --Label:"deploymentlabel" --Production --PackageLocation:".\service.cspkg" - * @command-example --ServiceConfigLocation:".\ServiceConfiguration.cscfg" --StorageAccount:"mystorage" - * @command-example --StartImmediately --WaitFor - */ - public function createFromLocalCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentName, $label, $staging = false, $production = false, $packageLocation, $serviceConfigurationLocation, $storageAccount, $startImmediately = true, $warningsAsErrors = false, $waitForOperation = false) - { - $deploymentSlot = 'staging'; - if (!$staging && !$production) { - #require_once 'Zend/Service/Console/Exception.php'; - throw new Zend_Service_Console_Exception('Either --Staging or --Production should be specified.'); - } - if ($production) { - $deploymentSlot = 'production'; - } - - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $blobClient = $client->createBlobClientForService($storageAccount); - $blobClient->createContainerIfNotExists('phpazuredeployments'); - $blobClient->putBlob('phpazuredeployments', basename($packageLocation), $packageLocation); - $package = $blobClient->getBlobInstance('phpazuredeployments', basename($packageLocation)); - - $client->createDeployment($serviceName, $deploymentSlot, $deploymentName, $label, $package->Url, $serviceConfigurationLocation, $startImmediately, $warningsAsErrors); - - $client->waitForOperation(); - $blobClient->deleteBlob('phpazuredeployments', basename($packageLocation)); - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Get deployment properties. - * - * @command-name GetProperties - * @command-description Get deployment properties. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-example Get deployment properties for service "phptest" (production slot): - * @command-example GetProperties -sid:"" -cert:"mycert.pem" --Name:"servicename" --BySlot:"production" - */ - public function getPropertiesCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - $result = null; - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $result = $client->getDeploymentBySlot($serviceName, $deploymentSlot); - } else { - $result = $client->getDeploymentByDeploymentId($serviceName, $deploymentName); - } - - $this->_displayObjectInformation($result, array('Name', 'DeploymentSlot', 'Label', 'Url', 'Status')); - } - - /** - * Get hosted service account property. - * - * @command-name GetProperty - * @command-description Get deployment property. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $property Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Property|-prop Required. The property to retrieve for the hosted service account. - * @command-example Get deployment property "Name" for service "phptest" (production slot): - * @command-example GetProperties -sid:"" -cert:"mycert.pem" - * @command-example --Name:"servicename" --BySlot:"production" --Property:"Name" - */ - public function getPropertyCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $property) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - $result = null; - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $result = $client->getDeploymentBySlot($serviceName, $deploymentSlot); - } else { - $result = $client->getDeploymentByDeploymentId($serviceName, $deploymentName); - } - - printf("%s\r\n", $result->$property); - } - - /** - * Swap deployment slots (perform VIP swap). - * - * @command-name Swap - * @command-description Swap deployment slots (perform VIP swap). - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Swap deployment slots: - * @command-example Swap -sid:"" -cert:"mycert.pem" --Name:"servicename" - */ - public function swapCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - $productionDeploymentName = null; - try { $productionDeploymentName = $client->getDeploymentBySlot($serviceName, 'production')->Name; } catch (Exception $ex) {} - - $stagingDeploymentName = null; - try { $stagingDeploymentName = $client->getDeploymentBySlot($serviceName, 'staging')->Name; } catch (Exception $ex) {} - - if (is_null($productionDeploymentName)) { - $productionDeploymentName = $stagingDeploymentName; - } - if (is_null($stagingDeploymentName)) { - #require_once 'Zend/Service/Console/Exception.php'; - throw new Zend_Service_Console_Exception('Swapping deployment slots is only possible when both slots have an active deployment or when production slot is empty.'); - } - - $client->swapDeployment($serviceName, $productionDeploymentName, $stagingDeploymentName); - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Deletes a deployment. - * - * @command-name Delete - * @command-description Deletes a deployment. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Delete a deployment: - * @command-example Delete -sid:"" -cert:"mycert.pem" --Name:"hostedservicename" --DeploymentName:"deploymentname" - */ - public function deleteCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->deleteDeploymentBySlot($serviceName, $deploymentSlot); - } else { - $client->deleteDeploymentByDeploymentId($serviceName, $deploymentName); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Updates a deployment's configuration. - * - * @command-name UpdateConfig - * @command-description Updates a deployment's configuration. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $serviceConfigurationLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ServiceConfigLocation Required. The location of the .cspkg file. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Update configuration: - * @command-example UpdateConfig -sid:"" -cert:"mycert.pem" - * @command-example --Name:"hostedservicename" --ByName:"deploymentname" - * @command-example --ServiceConfigLocation:".\ServiceConfiguration.cscfg" - */ - public function updateConfigurationCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $serviceConfigurationLocation, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->configureDeploymentBySlot($serviceName, $deploymentSlot, $serviceConfigurationLocation); - } else { - $client->configureDeploymentByDeploymentId($serviceName, $deploymentName, $serviceConfigurationLocation); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Updates a deployment's status. - * - * @command-name UpdateStatus - * @command-description Updates a deployment's status. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $newStatus Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Status Required. New status (Suspended|Running) - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Suspend a deployment: - * @command-example UpdateStatus -sid:"" -cert:"mycert.pem" - * @command-example --Name:"hostedservicename" --ByName:"deploymentname" - * @command-example --Status:"Suspended" - */ - public function updateStatusCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $newStatus, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->updateDeploymentStatusBySlot($serviceName, $deploymentSlot, $newStatus); - } else { - $client->updateDeploymentStatusByDeploymentId($serviceName, $deploymentName, $newStatus); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Updates the number of instances. - * - * @command-name EditInstanceNumber - * @command-description Updates the number of instances. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $roleName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RoleName|-r Required. Role name to update the number of instances for. - * @command-parameter-for $newInstanceNumber Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --NewInstanceNumber|-i Required. New number of instances. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Suspend a deployment: - * @command-example EditInstanceNumber -sid:"" -cert:"mycert.pem" - * @command-example --Name:"hostedservicename" --ByName:"deploymentname" - * @command-example --NewInstanceNumber:"4" - */ - public function editInstanceNumberCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $roleName, $newInstanceNumber = 1, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->setInstanceCountBySlot($serviceName, $deploymentSlot, $roleName, $newInstanceNumber); - } else { - $client->setInstanceCountByDeploymentId($serviceName, $deploymentName, $roleName, $newInstanceNumber); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Reboots a role instance. - * - * @command-name RebootInstance - * @command-description Reboots a role instance. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $instanceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RoleInstanceName Required. The name of the role instance to work with. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Reboot a role instance: - * @command-example RebootInstance -sid:"" -cert:"mycert.pem" - * @command-example --Name:"hostedservicename" --ByName:"deploymentname" - * @command-example --RoleInstanceName:"PhpOnAzure.Web_IN_0" - */ - public function rebootInstanceCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $instanceName, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->rebootRoleInstanceBySlot($serviceName, $deploymentSlot, $instanceName); - } else { - $client->rebootRoleInstanceByDeploymentId($serviceName, $deploymentName, $instanceName); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Reimages a role instance. - * - * @command-name ReimageInstance - * @command-description Reimages a role instance. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $instanceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RoleInstanceName Required. The name of the role instance to work with. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Reimage a role instance: - * @command-example ReimageInstance -sid:"" -cert:"mycert.pem" - * @command-example --Name:"hostedservicename" --ByName:"deploymentname" - * @command-example --RoleInstanceName:"PhpOnAzure.Web_IN_0" - */ - public function reimageInstanceCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $instanceName, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->reimageRoleInstanceBySlot($serviceName, $deploymentSlot, $instanceName); - } else { - $client->reimageRoleInstanceByDeploymentId($serviceName, $deploymentName, $instanceName); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Upgrades a deployment from a remote package file and service configuration. - * - * @command-name UpgradeFromStorage - * @command-description Upgrades a deployment from a remote package file and service configuration. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $label Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Label Required. The label for the deployment. - * @command-parameter-for $packageUrl Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --PackageUrl Required. The remote location of the .cspkg file. - * @command-parameter-for $serviceConfigurationLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ServiceConfigLocation Required. The location of the .cspkg file. - * @command-parameter-for $mode Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Mode Required. Set to auto|manual. - * @command-parameter-for $roleName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RoleName Optional. Role name to upgrade. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - */ - public function upgradeFromStorageCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $label, $packageUrl, $serviceConfigurationLocation, $mode = 'auto', $roleName = null, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->upgradeDeploymentBySlot($serviceName, $deploymentSlot, $label, $packageUrl, $serviceConfigurationLocation, $mode, $roleName); - } else { - $client->upgradeDeploymentByDeploymentId($serviceName, $deploymentName, $label, $packageUrl, $serviceConfigurationLocation, $mode, $roleName); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Upgrades a deployment from a local package file and service configuration. - * - * @command-name UpgradeFromLocal - * @command-description Upgrades a deployment from a local package file and service configuration. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $label Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Label Required. The label for the deployment. - * @command-parameter-for $packageLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --PackageLocation Required. The location of the .cspkg file. - * @command-parameter-for $serviceConfigurationLocation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ServiceConfigLocation Required. The location of the .cspkg file. - * @command-parameter-for $storageAccount Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --StorageAccount Required. Storage account to use when creating the deployment. - * @command-parameter-for $mode Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Mode Required. Set to auto|manual. - * @command-parameter-for $roleName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RoleName Optional. Role name to upgrade. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - */ - public function upgradeFromLocalCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $label, $packageLocation, $serviceConfigurationLocation, $storageAccount, $mode = 'auto', $roleName = null, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - $blobClient = $client->createBlobClientForService($storageAccount); - $blobClient->createContainerIfNotExists('phpazuredeployments'); - $blobClient->putBlob('phpazuredeployments', basename($packageLocation), $packageLocation); - $package = $blobClient->getBlobInstance('phpazuredeployments', basename($packageLocation)); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->upgradeDeploymentBySlot($serviceName, $deploymentSlot, $label, $package->Url, $serviceConfigurationLocation, $mode, $roleName); - } else { - $client->upgradeDeploymentByDeploymentId($serviceName, $deploymentName, $label, $package->Url, $serviceConfigurationLocation, $mode, $roleName); - } - - $client->waitForOperation(); - $blobClient->deleteBlob('phpazuredeployments', basename($packageLocation)); - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Walks upgrade domains. - * - * @command-name WalkUpgradeDomains - * @command-description Walks upgrade domains. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $deploymentSlot Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --BySlot Required if deployment name is omitted. The slot to retrieve property information for. - * @command-parameter-for $deploymentName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --ByName Required if deployment slot is omitted. The deployment name to retrieve property information for. - * @command-parameter-for $upgradeDomain Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --UpgradeDomain Required. The upgrade domain index. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - */ - public function walkUpgradeDomainsCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $deploymentSlot, $deploymentName, $upgradeDomain, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - - if (!is_null($deploymentSlot) && $deploymentSlot != '') { - $deploymentSlot = strtolower($deploymentSlot); - - $client->walkUpgradeDomainBySlot($serviceName, $deploymentSlot, $upgradeDomain); - } else { - $client->walkUpgradeDomainByDeploymentId($serviceName, $deploymentName, $upgradeDomain); - } - - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } -} - -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/CommandLine/GetAsynchronousOperation.php b/library/Zend/Service/WindowsAzure/CommandLine/GetAsynchronousOperation.php deleted file mode 100644 index c40cadf4d6..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/GetAsynchronousOperation.php +++ /dev/null @@ -1,98 +0,0 @@ -" -cert:"mycert.pem" -r:"dab87a4b70e94a36805f5af2d20fc593" - */ - public function getInfoCommand($subscriptionId, $certificate, $certificatePassphrase, $requestId) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getOperationStatus($requestId); - - $this->_displayObjectInformation($result, array('ID', 'Status', 'ErrorMessage')); - } - - /** - * Wait for a specific asynchronous request to complete. - * - * @command-name WaitFor - * @command-description Wait for a specific asynchronous request to complete. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $requestId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RequestId|-r Required. The value returned by a call that starts an asynchronous operation to monitor. - * @command-parameter-for $interval Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Interval|-i Optional. The interval between two status checks (in milliseconds). - * @command-example Wait for a specific asynchronous operation: - * @command-example WaitFor -sid:"" -cert:"mycert.pem" -r:"dab87a4b70e94a36805f5af2d20fc593" - */ - public function waitForCommand($subscriptionId, $certificate, $certificatePassphrase, $requestId, $interval = 250) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->waitForOperation($requestId, $interval); - } -} - -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Package.php b/library/Zend/Service/WindowsAzure/CommandLine/Package.php deleted file mode 100644 index 4f2c957f56..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Package.php +++ /dev/null @@ -1,205 +0,0 @@ -invoke($archive, $path, $options); - } - - - /** - * Packages a Windows Azure project structure. - * - * @command-name Create - * @command-description Packages a Windows Azure project structure. - * - * @command-parameter-for $path Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Path|-p Required. The path to package. - * @command-parameter-for $runDevFabric Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --RunDevFabric|-dev Required. Switch. Run and deploy to the Windows Azure development fabric. - * @command-parameter-for $outputPath Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --OutputPath|-out Optional. The output path for the resulting package. - */ - public function createPackageCommand($path, $runDevFabric, $outputPath) - { - // Create output paths - if ($outputPath == '') { - $outputPath = realpath($path . '/../'); - } - $packageOut = $outputPath . '/' . basename($path) . '.cspkg'; - - // Find Windows Azure SDK bin folder - $windowsAzureSdkFolderCandidates = array_merge( - isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramFiles'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array(), - isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramFiles(x86)'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array(), - isset($_SERVER['ProgramFiles']) ? glob($_SERVER['ProgramW6432'] . '\Windows Azure SDK\*\bin', GLOB_NOSORT) : array() - ); - if (count($windowsAzureSdkFolderCandidates) == 0) { - throw new Zend_Service_Console_Exception('Could not locate Windows Azure SDK for PHP.'); - } - $cspack = '"' . $windowsAzureSdkFolderCandidates[0] . '\cspack.exe' . '"'; - $csrun = '"' . $windowsAzureSdkFolderCandidates[0] . '\csrun.exe' . '"'; - - // Open the ServiceDefinition.csdef file and check for role paths - $serviceDefinitionFile = $path . '/ServiceDefinition.csdef'; - if (!file_exists($serviceDefinitionFile)) { - #require_once 'Zend/Service/Console/Exception.php'; - throw new Zend_Service_Console_Exception('Could not locate ServiceDefinition.csdef at ' . $serviceDefinitionFile . '.'); - } - $serviceDefinition = Zend_Xml_Security::scanFile($serviceDefinitionFile); - $xmlRoles = array(); - if ($serviceDefinition->WebRole) { - if (count($serviceDefinition->WebRole) > 1) { - $xmlRoles = array_merge($xmlRoles, $serviceDefinition->WebRole); - } else { - $xmlRoles = array_merge($xmlRoles, array($serviceDefinition->WebRole)); - } - } - if ($serviceDefinition->WorkerRole) { - if (count($serviceDefinition->WorkerRole) > 1) { - $xmlRoles = array_merge($xmlRoles, $serviceDefinition->WorkerRole); - } else { - $xmlRoles = array_merge($xmlRoles, array($serviceDefinition->WorkerRole)); - } - } - - // Build '/role:' command parameter - $roleArgs = array(); - foreach ($xmlRoles as $xmlRole) { - if ($xmlRole["name"]) { - $roleArgs[] = '/role:' . $xmlRole["name"] . ';' . realpath($path . '/' . $xmlRole["name"]); - } - } - - // Build command - $command = $cspack; - $args = array( - $path . '\ServiceDefinition.csdef', - implode(' ', $roleArgs), - '/out:' . $packageOut - ); - if ($runDevFabric) { - $args[] = '/copyOnly'; - } - passthru($command . ' ' . implode(' ', $args)); - - // Can we copy a configuration file? - $serviceConfigurationFile = $path . '/ServiceConfiguration.cscfg'; - $serviceConfigurationFileOut = $outputPath . '/ServiceConfiguration.cscfg'; - if (file_exists($serviceConfigurationFile) && !file_exists($serviceConfigurationFileOut)) { - copy($serviceConfigurationFile, $serviceConfigurationFileOut); - } - - // Do we have to start the development fabric? - if ($runDevFabric) { - passthru($csrun . ' /devstore:start /devfabric:start'); - passthru($csrun . ' /removeAll'); - passthru($csrun . ' /run:"' . $packageOut . ';' . $serviceConfigurationFileOut . '" /launchBrowser'); - } - } - - /** - * Creates a scaffolder from a given path. - * - * @command-name CreateScaffolder - * @command-description Creates a scaffolder from a given path. - * - * @command-parameter-for $rootPath Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Path|-p Required. The path to package into a scaffolder. - * @command-parameter-for $scaffolderFile Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --OutFile|-out Required. The filename of the scaffolder. - */ - public function createScaffolderCommand($rootPath, $scaffolderFile) - { - $archive = new Phar($scaffolderFile); - $archive->buildFromIterator( - new RecursiveIteratorIterator( - new RecursiveDirectoryIterator(realpath($rootPath))), - realpath($rootPath)); - } -} -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php b/library/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php deleted file mode 100644 index 113e7beb32..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/PackageScaffolder/PackageScaffolderAbstract.php +++ /dev/null @@ -1,251 +0,0 @@ -deleteDirectory($path); - $phar->extractTo($path); - @unlink($path . '/index.php'); - @unlink($path . '/build.bat'); - $this->copyDirectory($path . '/resources', $path, false); - $this->deleteDirectory($path . '/resources'); - } - - /** - * Apply file transforms. - * - * @param string $rootPath Root path. - * @param array $values Key/value array. - */ - protected function applyTransforms($rootPath, $values) - { - if (is_null($rootPath) || !is_string($rootPath) || empty($rootPath)) { - throw new InvalidArgumentException("Undefined \"rootPath\""); - } - - if (is_dir($rootPath)) { - $d = dir($rootPath); - while ( false !== ( $entry = $d->read() ) ) { - if ( $entry == '.' || $entry == '..' ) { - continue; - } - $entry = $rootPath . '/' . $entry; - - $this->applyTransforms($entry, $values); - } - $d->close(); - } else { - $contents = file_get_contents($rootPath); - foreach ($values as $key => $value) { - $contents = str_replace('$' . $key . '$', $value, $contents); - } - file_put_contents($rootPath, $contents); - } - - return true; - } - - /** - * Create directory - * - * @param string $path Path of directory to create. - * @param boolean $abortIfExists Abort if directory exists. - * @param boolean $recursive Create parent directories if not exist. - * - * @return boolean - */ - protected function createDirectory($path, $abortIfExists = true, $recursive = true) { - if (is_null($path) || !is_string($path) || empty($path)) { - throw new InvalidArgumentException ("Undefined \"path\"" ); - } - - if (is_dir($path) && $abortIfExists) { - return false; - } - - if (is_dir($path) ) { - @chmod($path, '0775'); - if (!self::deleteDirectory($path) ) { - throw new RuntimeException("Failed to delete \"{$path}\"."); - } - } - - if (!mkdir($path, '0775', $recursive) || !is_dir($path)) { - throw new RuntimeException( "Failed to create directory \"{$path}\"." ); - } - - return true; - } - - /** - * Fully copy a source directory to a target directory. - * - * @param string $sourcePath Source directory - * @param string $destinationPath Target directory - * @param boolean $abortIfExists Query re-creating target directory if exists - * @param octal $mode Changes access mode - * - * @return boolean - */ - protected function copyDirectory($sourcePath, $destinationPath, $abortIfExists = true, $mode = '0775') { - $mode = $mode & ~0002; - - if (is_null($sourcePath) || !is_string($sourcePath) || empty($sourcePath)) { - throw new InvalidArgumentException("Undefined \"sourcePath\""); - } - - if (is_null($destinationPath) || !is_string($destinationPath) || empty($destinationPath)) { - throw new InvalidArgumentException("Undefined \"destinationPath\""); - } - - if (is_dir($destinationPath) && $abortIfExists) { - return false; - } - - if (is_dir($sourcePath)) { - if (!is_dir($destinationPath) && !mkdir($destinationPath, $mode)) { - throw new RuntimeException("Failed to create target directory \"{$destinationPath}\"" ); - } - $d = dir($sourcePath); - while ( false !== ( $entry = $d->read() ) ) { - if ( $entry == '.' || $entry == '..' ) { - continue; - } - $strSourceEntry = $sourcePath . '/' . $entry; - $strTargetEntry = $destinationPath . '/' . $entry; - if (is_dir($strSourceEntry) ) { - $this->copyDirectory( - $strSourceEntry, - $strTargetEntry, - false, - $mode - ); - continue; - } - if (!copy($strSourceEntry, $strTargetEntry) ) { - throw new RuntimeException ( - "Failed to copy" - . " file \"{$strSourceEntry}\"" - . " to \"{$strTargetEntry}\"" - ); - } - } - $d->close(); - } else { - if (!copy($sourcePath, $destinationPath)) { - throw new RuntimeException ( - "Failed to copy" - . " file \"{$sourcePath}\"" - . " to \"{$destinationPath}\"" - - ); - } - } - - return true; - } - - /** - * Delete directory and all of its contents; - * - * @param string $path Directory path - * @return boolean - */ - protected function deleteDirectory($path) - { - if (is_null($path) || !is_string($path) || empty($path)) { - throw new InvalidArgumentException( "Undefined \"path\"" ); - } - - $handleDir = false; - if (is_dir($path) ) { - $handleDir = @opendir($path); - } - if (!$handleDir) { - return false; - } - @chmod($path, 0775); - while ($file = readdir($handleDir)) { - if ($file == '.' || $file == '..') { - continue; - } - - $fsEntity = $path . "/" . $file; - - if (is_dir($fsEntity)) { - $this->deleteDirectory($fsEntity); - continue; - } - - if (is_file($fsEntity)) { - @unlink($fsEntity); - continue; - } - - throw new LogicException ( - "Unexpected file type: \"{$fsEntity}\"" - ); - } - - @chmod($path, 0775); - closedir($handleDir); - @rmdir($path); - - return true; - } -} diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder.phar b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder.phar deleted file mode 100644 index e25ec460e2a1b038a3b93b55e69b4e8bbe3db41a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4404199 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 z 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�@y!1Gzh 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�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 z%0A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

wwaz&*T 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 c4NZWZUj!aG^Xtdd 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 z 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

+$hqIn|&CrFj@1 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 z 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

QPEKywJ7%4jOkRYKOSEg~Z8JxW1H)Y8 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 z

Gp%zB!~~Tn#@FjehlF0dQJf@hWsOtJj)3Q?B)2) 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

ysmubmm;1{o5>dV&IJUftm+8m7}_8ukE~Noq3p8 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

T&WlgYF(F~8 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

s+>rtXtSFw$`v+YHeh@%=&?C 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

s_dk&u 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¤JvqX=aYBp@}O{n|Mm8(K(@ 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%0Av{Jbe*rTB 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 z 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 c4NZWZUj!aG^Xtdd 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 hNA+8Jgg~`#-UvpxFQb diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/build.bat b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/build.bat deleted file mode 100644 index 6a444217b8..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/build.bat +++ /dev/null @@ -1 +0,0 @@ -php ..\..\Package.php CreateScaffolder -p:"./" -out:"..\DefaultScaffolder.phar" \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/index.php b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/index.php deleted file mode 100644 index 0ebc4e8832..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/index.php +++ /dev/null @@ -1,63 +0,0 @@ -log('Extracting resources...'); - $this->createDirectory($rootPath); - $this->extractResources($phar, $rootPath); - $this->log('Extracted resources.'); - - // Apply transforms - $this->log('Applying transforms...'); - $this->applyTransforms($rootPath, $options); - $this->log('Applied transforms.'); - - // Show "to do" message - $contentRoot = realpath($rootPath . '/PhpOnAzure.Web'); - echo "\r\n"; - echo "Note: before packaging your application, please copy your application code to $contentRoot"; - } -} diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/Web.config b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/Web.config deleted file mode 100644 index c9c2671eb1..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/Web.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.cmd b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.cmd deleted file mode 100644 index 6883c92622..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -ECHO "Adding extra environment variables..." >> ..\startup-tasks-log.txt - -powershell.exe Set-ExecutionPolicy Unrestricted -powershell.exe .\add-environment-variables.ps1 >> ..\startup-tasks-log.txt 2>>..\startup-tasks-error-log.txt - -ECHO "Added extra environment variables." >> ..\startup-tasks-log.txt \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.ps1 b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.ps1 deleted file mode 100644 index 5ebdec2a68..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/add-environment-variables.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -[Reflection.Assembly]::LoadWithPartialName("zend.service.windowsazure.ServiceRuntime") - -$rdRoleId = [Environment]::GetEnvironmentVariable("RdRoleId", "Machine") - -[Environment]::SetEnvironmentVariable("RdRoleId", [zend.service.windowsazure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id, "Machine") -[Environment]::SetEnvironmentVariable("RoleName", [zend.service.windowsazure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Role.Name, "Machine") -[Environment]::SetEnvironmentVariable("RoleInstanceID", [zend.service.windowsazure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id, "Machine") -[Environment]::SetEnvironmentVariable("RoleDeploymentID", [zend.service.windowsazure.ServiceRuntime.RoleEnvironment]::DeploymentId, "Machine") - - -if ($rdRoleId -ne [zend.service.windowsazure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id) { - Restart-Computer -} - -[Environment]::SetEnvironmentVariable('Path', $env:RoleRoot + '\base\x86;' + [Environment]::GetEnvironmentVariable('Path', 'Machine'), 'Machine') \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/install-php.cmd b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/install-php.cmd deleted file mode 100644 index 64bcb452db..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/bin/install-php.cmd +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -ECHO "Starting PHP installation..." >> ..\startup-tasks-log.txt - -md "%~dp0appdata" -cd "%~dp0appdata" -cd .. - -reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f -"..\resources\WebPICmdLine\webpicmdline" /Products:PHP53,SQLDriverPHP53IIS /AcceptEula >> ..\startup-tasks-log.txt 2>>..\startup-tasks-error-log.txt -reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f - -ECHO "Completed PHP installation." >> ..\startup-tasks-log.txt \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/diagnostics.wadcfg b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/diagnostics.wadcfg deleted file mode 100644 index 10bdbba128..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/diagnostics.wadcfg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.Deployment.dll b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.Deployment.dll deleted file mode 100644 index 230f75def0cbfe4afdd03575f3c35c48f768c1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1201991 zcmeFad7NBD)yIA3cF*me+cQaeX3{g0g_#5rF1<{afslk9AqXNQfU?TIhUG#xxTMo@ z6j4OL1#yXj5XD^-0YzmK5qCudWC?@Y^E~eQ__#0O{r*nfUM9h3`Qv^6d7aPny|tV= zb?Vfqs#B+y`{EPc;-x&#OY?i~InTR`xBm9G=YRj0Bznf^=Vy3#^n7cv>YxEh~RJ?+A=GfuncqWIFW)6W{KUUt#gc^8cxbmY-v7sh9vHQpEQl3-qYu;(4# zmGZuI<>D7NGy8$(FUWOeJ#SXO=Z(40Z!b*T`|}oY3ZLc3#%1K|?M)I-c+nrASo>dL z9{laMxfEc3uLSSWa)EbJJZS#mKXnMtsr_CruOBSv_vSU@{x|P2&!YsbzbyV2wtSv9 ze(71SycGYVeo`)#)#z*kk>u3zYOQ((K}H)i8O#{(j=%k(e!P0t1u=l4RWuvi(jDLq z>`3-6=f61cFAn^R1OMW{zc}zO4*ZJ)|Kh;EIPfnH{EGws;=uopIPfXWtNGL1)c3l* zt6!Ayj(I%vdMwoQ9{y3cclWtn-r6zdph?(&_qzGERTu0r@rF(F&w9y)nbUXuK&E!U zuV(Kv`CpIz{fw^&wXEB`TB3JSTgX*-=^w2tv%rK$NrRi z(TkoQKIP@_*!Nd!o}It^{@afHx3BiBf91!2x?t|owD(2`?DD+)CMN7*=nob8y$BOW zP{~E}390SGV?*$8K#8MK+|d}1Tjb59`n&4GSQFOq9^h>#q6Ng4$I?j{FL;)|XwyQ1 z*PnP^v@`E@rBr%w-PB;vks=79ZnE846g|xCeJ}7Xy3`vK|K=`Dc^~2JLubFYZMJf^ zq`7|2Z_EULzh@bwV@xIC2@Pf0@1>(f_!=Uu-y3d#iuYgxLj~`lMxVX?#teI>8Y)V^ zSBNldOfUV^M8CIv0eh36Xfau2I?IvSz8o{Wb1w5HRF1`dDjiY4klz4h`U+w2IvBM82m=#b4~;h6d85 zT?lSW*XKmi78uH%m+m)QvrhDV1CGo z5(b4T^>gu-VDdu3lXAl|gBfYTj2O&N72yGPxVoE5Q*Eb7Ln{IT-uqw?ct=;?5KP_; zfD6fG3Zvy4GL!eTLVB}>(eWFyllQhl`g$fwoFo`X=hKDJy>7^-C+}|u!kWV9k{j~f zlV5BH26?hO>4tnT`2c~#M!`TPPmVxlh7^^V{8Ag9x+shmZ^&mSA8ZHqZnfcc z@H2onwcV+Su(k)!TxMvfwgN|QkoDs|ab)9_JTry$g?JT?#hG|DuV^nGeN%(ka*&NP zxVL7?LB_dytS!!sln= z{dxCJ4Yp|w%0b|$&KA8cqj{zmjx=e`c=L8{(~Oj<&(5c!0}O9EK2Uh4W-NY~?y1ZA zx!jbOvGN;T0O!3KirmSMUI1|MgQ@DvsD!z$EskvZDU~s+t6J#tE>5SSg8+%Bys$V} zTyKEYh?q^PvUm;QlY%cck&Uat2Wp8yF>zCsEjJa~a#N=*H`Us5Q@JfS_1kh&$t^c^ z(sENXEjQe4x#4ij4VPPPIMs5)t(F^RwA_@sRh_}Ad^s~=WnkY!j~tH9q_;QiABe`|q1m>&3_7Dy}TO#V9yoHsr2zbtSyfl1E4 zw}7+T0e`T7s|gr#wEfWnK2E@3?O4(ECkxox4*0VL^rpOvXV;Dv#9u66cLIi7z+Wxk zI06zJf3tu~+W~*KfEx)&2-{`>UpE}aqkmYyzY{RF^fJ$Lh@Z2-d1(S^21y_exOw>W zz%C1XIe|$Az5+%Eui1(2gI4UyA-^uh)8G4bF?≤@8FCEx{bWE~ah?=K6Ip za!WAJuZw|Og86=3jN20IhtU32Cf-? zU2MQL)32+zxMulvaROJ~udB4U`u)0!h-<*Fs~B5?#;=I-BL=;|uS>`l#SOW)1q!NN z#3Q1&4lj);ZM+F@ae#i3vU@qnsig`1K@-qcx8+BNk*2uZMaQpEG76Xie{rFoYM4X) z?NQ+A1<$4z0dL|SAC8NHi>^Kf?^1tHKD{}Y31Y|y@@d9vhPobfga4QcTN!TkBQ>*L z>-b}3N3G6M|31sxbx+q8iAOco@~GBY9@SjSquOhERD&&Ss+5*T zRoe2XTH_;=d{nb7k197_o5ZMoTOL(x3ruy}@~BcQ#lXO6yN|<%3Mk0CxUN=cd?E3rOeUrW2p6N0_o8_1 zf_wQ})V4HM&F=ENerSnef@>G^2v;KBUTU-)U4l>TboN9#l`Dm*LOvZ=3Cm?h_i>S^ zrn4u)OrNp1x3pWPfKD!uzI=DaavC~*Nna-4J#<`LBe=H|IM5!aArF`uyDMsJd@0dM zpsBG7QD7~wFPj9L3JYwu6V_B%V0$dEH|U8k15r8S_rx#95%l;y+4vQ>;#cyZEaP+X z=~R=n87cKeM%t{dQfhEkSIQ)0)jzg9_ncS+kJ8q^4XBP^1qw7slc59scmv+v?C6;B z0%d>MXpk*rto(7ExNIiD?I25!W}D)dwRm->uJIn_Z`w$L@vOgzjys(2hl+)wmqNa1 z%=VY$+T-ePWQkuW`a>o%n-HgPVwOK_K1pm)CcR(i@XtzMTd`nwWkV0rgciM1r7HV= z(dAV3Q^nNilF^gmR}(&~%a0J`V3wD1m7&SbNjC)Xq>D^Nj1FqH#;;ZX4NgCzT};Qb zWCuLU{pwp7s-yL4hIroI@@!~R=cnezuWizt5OAYkeHXCtLbqXxe?MG6yKKUeyIr2 z4E%J2NCtj)gd7F_jC6zu*a+L-9AV8tXFbpiFb4sH%>Z){Kr?oOvN;Gq>30FCLpP%Yj75W;fbzd z;4EX-uQNn?1$gT+^CP-0s-Ip74bkf3T9OS#w2c4-tgASD4S96+^`Hrhlr24I!h+k< z6TKNoMzAh=25FV3XCKYR3>QIZ3*!W`#OQ2)RD?HKdkf%`s-F(8IBb(47b{+lrCPw^ z+8Fhnq*a}b&YD!Uj*X!FO{#8-E1Y?4D0-{PyRToro_B;K22ubvJAa4K3yBoOY|Alv zhY}4Tc+yuFLG6%ulX7}$P!5B%X+6xh2XmboX=}diGwaVMb9as5$gR_vu#-_mFtOqf zHuWXq1T$v`nCbeEI$_bX8*szZ=;;aKcS3P)Y9KMc{ZpD|&v$z95q@f?(~pC1rysYz zdvy5pi;lYxJ51L5I=DxKJAM}k!|2^SgLt!$*WSakuO}1Jys%t^J!M8uHQ=q;YtNf= z;x$ho5CiGLKzFH}@1Ao4V|6;;oy`YtY06o7D&D zCTll<54%*_8T`g&@Vg$vV5a)Gy5^%kjLPZ3ghKaag86*D+E|Eqw54(&^#u3yPO9O z`Q|7GspuwUv!)r4p@wf($brLc5F{UvW`IE6Zy+OWkPjG0Ge97>D1`cu-gqEy_(Ab7KY~Sp>&YD4 zz|z1wkNoCSh8m>{z>wZaD<0qvD#d7KKa=;{K^5Jh$MOL$7`}!I?Ly&9ZOIJzTQapf ziPbi|M*J;%^pv853VaJL3dEtysmp~^(ngeInjf{mm)kJ3~gQqDJCO_@}@22{lWe& zgdL#>f=unp!1iVzMlhYlJAR0O#ZwFVdZH6r!fmT0{ubJDibw4$fNa3R?s!RW=nX9P z7W^2m=C}J0zKimyOZv*=bE2nP5@dEi6EG(}4krF82+>pppD4^XMqeW={<u@bi zO5c{A9r%b{px+x&e3X8`xP+E!v*+( zDXootK!E#M5;gXgd#JIma5Bxcx9U@KNqR2UPmjSwI2ukA{Y4f#besYEetj<`t?$S4 zxQ4k44S7mOy1>G+HBPvL%97M*-?$L0CLRQO{Wl0^04YpB>gCX_rgO%M);EC$p!Ag? ze>5yaG|!;iO9=$IlEK*{v8W-jUMsIukfkUr8%YQ%&zcTYI@`y#DXb3P0n?-LbrNnK zzb-DC-D@I(MCEmiuYMuGtjerUDX@K7Na-f`4vJTij}oTMm^3~UuWG<~oh{`Azu*{D z=;Uf~b!v2MygN18>D)-)ygVtQ^FtXahOkiNpP+Ip2+uK{o|8L0=e9g9 zW$Ot|qK)yu`0Z?ul@S#9gwABAh$-ah<-f2@uWVsMINF6Vn!tRKvH8`X zf$0c&(hd3|>zo9uPO9lwwCY*9BPydeu6l`B$_ZAz53gSrvQ&)n8Lqxo0Tvf`;qNP5 z&=Uix;b+fYrdlk%VVf`Qhe@6VKUBo{xttg5G%=ouyNFLEde^8QksMVQbuX~)IMT>b z&ZL8NL%mZ=N#0HJ%3V{vY^h zU9#%eRqRw8fEH1*A`QhEe1+nsW)ZV4(je1u55Df9qY73}$~iC#YIg(aAo@GT4xZ)vF{*?^cvNENLZCdbgtF zNz_2;$u9#xx)Aj?3^moaNhq(KNoxwKAD8>hxT%Z}^17u8DZSY_6TJ>N!mt(;gX%-T zMRRcXWqYbm;PIm&e9>#Dm}of#bu!{hKS{=3PeJmZh>2&Z}$o04wBZ&PO& z8S#3Yo|W-VC;d`rtri1if;AZvASUD>%E1!4N36#|d=fdPg7~Ana+$OvY^vOwjdIg9 z?o{<8(4;M`l<%OWd}~vV%YVq5zq?mH8t+qneXZEYm>iZD`W<;qBV=cCZ3xhTyZu^o zTIDW?*xi7ESP>q~wdsT!l~wz#e*LIcE*Na`!1x;#jFxk?sUXPnjSkVT|*BG+T5yR!0JJqNk_oR%6Ynyq8(Od<>zEO^5rD z3S2!EJ~Jm;NXp7GhpakDm!}h*g10Y$3EZwC&E(r) zOy4^ay3mO8>_;I-lZITz3~%Ao%HHhQ72TQ1=q{+NCAQLBwEWI|rn09CsXn2~e|E~u$OU+~pd!NaQD#EXEANlfjR~<*QBsaTth;Y&s zN-`Pg+C5&{C?UP(Q){TEJuLl9($h5v&1&t&bd81nS7K3}kxAIrTj(pTb&bn0MVn7L zc!CIQ&y)FCRj-SuD{I>w zDJ3#m0CnuoRu`)v8d)Svu2LL^d=sA|C7K5#rYhPC8~u(6wKEjjwoONg_HDZU7nhqK z!_xy8&-It#M-S>T+L-M?{kZsj1K}&$^>vQpa#+Zf4iBs#nRaXI%^HVYVOnFA%iVR} z<$-C5BqF6jR?2gk^)4c503Vnt(Tn`4T?}oGZ5AWlDn?=eQoq{lV=lSGD~a}|s*q|N zuMRQYI6*xkeY?DRn}3BLErxBWcm^%o`oJyVLT^SF9qaMZxy->S0(^cO`K{$w+ThP_ zD2_?t0$#BY#Eh?DV`qg9S!8L6?{Ab}13}nW=-~BgjLJQ1P($I=o=JiPn*KbjJlM>^ zFl;OAkLa6jRtTpuzSGjot~bl<wwCsa%kZN)h?Mu>2O+MBPo>gGkpkC3kRU~vN}v0rg&x^&&F*Cz>6>3E5v zjrU8Fc)z;88f|~*1(&WtdRQNv zGu4G`M<9i^fsDF%fnhqx(G)Ml*ISz3??+G?YX6rCvW_xDyBO}=)B++G;jTP2HKX6( zRyeTPTDGzW+$JtE)~SE+y)(VywGwB^cG|lHDc(nA==ZSKFQ@PFQ9k{gDX zJ;V}>aagDm&n|ePM+hFsxsd2AMl5!98Y5s~$Ot^#-y30YWr;Ogn=4p4FqJve@3ZvMP!bFbL#msA7{l-k82YARa10d724<8_@1J2j8_4u$ zj8_SoEZ!m@G5iZ+2GMX}CTBTj#tft(V@#IqRMY|biI^WqR03jcruZZ?#hJ_$XSzO! z9E|bTL&=Oz#%I|_2v2~{0iAQuQ&~o)5}DYUngibMy49no3)x6t!Otp&w>p@&@!ORj z%QVx%nbFD?>e2q(1QfU6ALSSGdja8{cxdMy#qsFwr@?EU!JOPXmtPjQ{xHWJCUK{q zvL-cN)7*Yi0->p=CJ&X2Un7g4SldTWQV0b3Qrnvg4%wBX|7^{kup_ZYm&J;pb`5f~ zVLIGz|0x`ZS1SY4dEN!yeTA1ohuyY--#k^}$NK{|RHI?DcoGy?n~CXYSRbNW;z^ep zcATtWh3v@ZJ6h4#bJXj#=OOAn(Isb-o9&{TYNp?1aB`lFYWf4W$CuF80}&l@K1_C$D9$uRvcI_-g!BDLvE1g1uJ!j_8(o@{*{ zofYqnE2cLI*^;?}*R|(egT<{Y-V-+`NLKP{oK8aAtK>dIQimieOmFjxo5*XB=}vh) zxK1Ap4a=g3cVQ%z$b^&1U2^00qHZkFibagp>^Ht%E*~+rOX;^4=8Qw0tc=LQ{ggkGT{k?fVr0&dpk~c4v(0&;m z(F>q`D6BF6#-dWameH{G**>~aI*l+>y;1&4XC!`%1qTrvAIu|K!vkZH1stN#7xEaG zwelBalb;pSM}?QB$%v+UIC*P8S@j*or7eB+Q=qoRoAN93>FVA1%s>=Vk9NY&sRD(; z>O%s&m7N9EABdWdL)`{a{CRo`raaG+Vp}VPUq1^uW4})jA4U!o z2_kH%w*SWntktnX>R4cWIgZQduYJvER{b0D3eS!U8}!MivE0P~KZw7|y%K^cPq=GoPqU>Dn))&Y`bOf^ud zx*PxM9;VDtFw0ReJ3ku=W;+V}_$VOQ>um}AOmqPVX{z15u3XIu?26PnWvjvlGoTFEF z!y;4kg)f3v`t$1o(8fq}#J|p0;qV!wbQ2ZMLd=BKnZfnaExumvoGj={5&bSA)=q68utP7K;gr!=~sl-ykj(KSAHg$;1{& zWlk#oiS?)DS;1v@c6oj!>t}*U{gPxy=?lDtJ6*U2De1y`>6OT)1teKH9vC>3PsJQG z56WZ6jEO#k1eN~8=OPVvDt-*O7%OR*E6vEn$Kk+C8L2rWb^G(}hNDDR-`$&Ygd2~f zt1}(dId}GqFl%F)$DF+-pM9l+dfL*7?dV`KsUAh^nq#)T@}iC)Gw_*tFBh2n_I9&D z46@h&X(D{b)L@U3G`d(MEm;ma1OejmuPv&?~w@>>Vn) z>or2zZ0px3df1SUI;<;6^>vUMqoIan;MyVT3=@!cVF!9v{si2p=k4~GiQ!0C{c5Yk ztG@_Hf#W1 z+PjB(r>{urGiIhsqbySX_+l|3z4BgFVmdyR2qbpBVqVV!p*)4x4*U+{6A8{pU8G$b znav>ezb;jINkXP1!9`o0xY&X2{%*I|mKjZG!%h&NuZ-W%!%c5WJ0Ng1t3{&@U`q`3 zRy`|JJ=2yDS;7TlxsV{!IOl>aT`Jy{*um%w!Em6mCGal73Yq{;2xKe);SvDQC@8*$ zfjYXEDP{tyr*i(pwcs?na#M4T#Z6Dq+-#VdtOOjR3p zZGPDM?$4YqsC{LxB%HCdS+{8D)a@FcAxDgwjmr&qXzk&0&U7mCzzu1o<>^W*7nD}vxtlt5?H|`N^P&Ep3nBvFtL+f&RU7;+8u%Ejvxg!-xXDBC}}H4 z5}<0Bk%VX~gXMKF=v7YH#pd%SRkIHgyfu^L=v-Nw+?%lDz#h?tRo(0W8{J0@UHWy} z1LF`2-s#5*uroSxaJL?I!RW{I2G=@*y7B6%~z{wZf~-8B>fKOBFR_5T!GK zk-x1|G{#*@y-d4kEKxvR&+_gGO6N_`x47FV33AvlW1l@N$t1}^0$+Jcn>1x>gGFPR zWuPbLjp}+^54D}i*5oNo>3;gt={DOV#mkK<@QyayS0y%E@u8uI86K*M%~teIx7n&c z!v;b<3g7eCY|H8_UA{4 ze$X*wl}o9Pu=Xe|W1=-($+L+V2F0dj&&jRqu4`Me7^76trIu$jn-gjnreZ&mI+jSi z3u?9jHDD*#DO)#R*T&V+woAj!)Q13HaIMp+;7&NtC%E!-l7om~^RtVw>^K1Jpaatr ztSzLxlb{{@0s7Phr06TH>Q8Cz5Qb=OjI&`J8=~m75Z~*^OtYM3L-fVCt$WW}D<>gp zNLaZSYg}qufx*Wu8Z_934WtdrzT8wvgR5wx_y=xX)1z1YL$wK14Y zopMqGtbCScGBPu;>JAMzLI+M~`YHW?hqlj&PQhnZzK+siZ=`XB+_e$E0rXiL=8R(2 zv6NpiWn$o>lL9GXAlp0}(i*R_@pVLWj8}_0)3%4I4mih~O!RVSSbedEsu}&6Z3SdB zVUHg_ObN^Rl+DMS&k{{zN+D%hTEZC>B!PKKiRY%O>H+;&zU@XQKmIm>eLW0J%yH(V zsx}4<^z`?%ho=PB6A2+2hx}N+B%-B5b8*fRbRTKa1K8swo(#j%z-<6Rm19nBlg|`W zGBc%#m=6dJvos9V2ZC!i+itR-F>72qlc^_l#Lb`6n z9px?7mY_~*IZ1)B^g?%p$Bn$zJK%{k{jh=DweBsM_!SV%?opJcro^pI;O_EH8cMa^M}ShLyIXG{3No(RB;msk`f2{$VSh+GQSBX zrU#=pkgU8|*L^`o;?286ba}y~ph|&zTasq}m_HmIYPpGLK?GH8JiVKchxDWXghKC4 zdf3|EuB1Of{JjziIQ2L?dLxcrPQ+E1tCjk)h0S)NUiIhr*=_fapQtqVkWD!oF^7id zv!nZ*cgVbf3r_0H4~kCii$0?DoXRzAi9-AK_WiM#7nU%|8B&Kfl6x(U&f z(^=QIR&Uf>8Js#QOBTO{eBtL?d2IldlEiPr(^w@GL(MGYYwV?Uqa=C{sX|i)5AylC3A=isN+V&In@Xr@qmO`?PDL2N^eq0`?}Zn4Mo(G7_{Dk|IhsM_}!xSc*K+&k){361J)Epc0~ z6ui?bhZFkHD-%*0B86jZqC!_SskfO_{kOJ>rW*9PvdhqYSzj)%axuU9o^I=VPBz*4 zHItPvxdQMVh);Rv_R%|58q{#ySeBgGcs+yehM@S6Z>xk2`d&;UsNPu2;_Fn?bd&5+ zjo&Ue9kd9cZ?-m^(cH;9#qvdN;iZx<%DF}7x>A;R8`DMwTi(Ggp&(n{<7_ysFQ{D) z+8}-h&&5+2w#4Dk!m88N2fT?ju5M+EcrAII+R95-C(CUh-I?8fE{|0FPB78=4LX1P zF1&1@RsK`^rQ&zvy%dFYE^8IEExYt$GhrdiyWARxYim%Z5vZi7JAG_fdb0|sUPf)! z(O2*eJ;g1%n)y@Qp$0LD1QG0F->%n5~?&6JvZlZJ73&Qk*sd`Zxh{#a%36TLV@ed{^^VNNk zHTvrDk<7^PwlnBGfUGBaZ+kY8mga0B zE-1cHkOv8*&^VY^=|tMT`Rnp-ZtSl(zphvGNl0uQpn$rb)tI*3goDM%-#q~|lNK98egD*x}N2oh>*k4I5(kjYE^sQ*x zMdmWYZj)3ql5xmY{M6i5nZ(p-%-!k|V`|-ghgCa~7%+_y%fH2nR*-goD%xFt8YVoUKTV1+Sxv~29VQ5>0lH>uUfZB2b8ZQ>WkVC`)0etZag&(Q# zLSrqj(j}xYe_h_qjUyCSKa^*A5mEBSJ1fy4iWoLzjE|=zcuPAsfp%#DjWmH)w=)-V zT83V1NVlhQz4pBQHZp5WN;^&Rw0E*8cXQ#Jew}hxqO@n4+=)>;%H3O&G4(KF8!C^D zqgN#|sM54$P<`7j;B(`s@U>)+T&3CAub9xOQO*#w>t1PG-RBd!sQZM3hDb>IJEzm0 zCAu}Ha@JrhHzwrKDXk%pW1|^v2YDwQ_F(T+6u7C)P7dt%EwI*UUDIj1Egr)9(WYR?$86-km0?b-^xGofRl<&)(vk~&vvx@bv;en zFeNYELX01M9LnSO2E*`qmZTaB?jiJL-qlZT=H_+d7Z!Go1@6 z*(WWNw(Ki$yWbPN$bLea>-VUKq~ALh*hD5|{m|%sF7M3Tz4~yjJedcgAt>s=UM39D zL-4tAqJj&JlX#U5qvp+Dmv?jHIK|cVw4qv##!D48Y-kv&l|d6JI~|FmL(k#iKGhPtmkDgdFs;;JMdk`}Vt2eE=QwKF0*%j+d$Pg{jZ=7)4k3m4>+)`HoS?Y6 zo;GUB;mDnvkUMo+8>Ny!t6pqmw5M=E>qioz5^_ugPjw<_%rhz_f=2BQBG}o-Vi@rB z+g|?8G5Hg=9p&%lmi%o_JlhIRP(hD(#|KP<<>qVmlR#+ zlCJAqQg@w88gF!)l=hp5^|!5)8%hvi1-9SWtp z4P%ti&`|9dDl&Eq6(u`_HrF@y@m}>Ax8LAe9ggRYy^24(n5yWQd^{5tr0h9YI&D~d z9vImiQf7HbU^I95C_-``b+UvAExZc7`_;jYSUNnQ(S>@c5?>ZV6WpU%8uaIHWJZ;Km?1p*2Eb>*)3`|~EXJ=Zb%W6pmDEC_yPJsoy3oZ}LQlE#lL9W> z-^ko19en}lX&)RYzN0f8n>gx%i|-=eBtlLV@QWl(wh`<8q)(~b+usj#5!RyXiHPpm zKA)j~eyPy%+0p07qxKcjkdZ@hFP@>|>-{=yFg>%&UR(!Rr_so(7hKg{W6~crIG#@( z>YD}F9+1Y-1r4R-GXo95%8c?2P);I5*4K2&?&e)Unwg%sqF&)UA^?0T-CJh(W^#+@ zMu%sk&_v$?gk4F?t3ghOPrs)W%d7ou&&htpE;hpMEfB6rj2<<#;7uz(o5QE#1g}TijFR{yv7>X@uHM6CuC85(V527gU zb}01A>Zi%VOq~MUk{xC>#>zA0b#CRtYNYt2HISd?sz{>OH|8zb8Ly9f-*v9fRlSc9 z8;hpe(+Gpk$~?>4J!_BSOwP+_p89%VFBYtIEy+qorurb1&GI=^Lf;gQj*rhA9k&}g z)3zCP76(tuYWbPyOR#EIS8{vPgLp#rmA!^ImNug==?A{j>DVEz|#VdUp?Eb-Vm)6{eET_KDt^jBer#rKw)_D8|L>`Uv?% zn%+&)wB2fS`j5uRfiIRs5ZAdAR)0ex*h@1X6tMZeI0t zA=k8s7F1@v{OB>B+KXy&3HcNbp=W1;`dZqH#y|E6e4j9PFJ6jW_fOypYESZHx2Gy1 zfmh#*sB2G~&EgmPLu?uNPin$lhbY@O-IRAJFx)l9mum{q?}(*&FQ3U-r-F?(aR#F} zK}%L-b)Ol>nZ|ND^UY`%loz@+uem+Z?{=K=H+R!3A6D}0T#RoxIxOiZ4>}q16);N& zmn~o|I_zc8l-xNqrvq9?Te%)8AG%eQL2f-8?6u=?y6lfn?+m%i=zb4z*5NL}B<)9k z!rR|vQNgf-_^&3!@>HhM0?N2D!-+Ucu?@w3H$zvj>ODNiWb0AS#D+<8vy(C3-5-p7 zh{*UKLaCz!WXee~Wy%8l1SMk|L(jI^jA?#kW z5S|LFjd@bWX^}!exrLXV19gGh*}Ro&w54H`EzwzbZ3Wvf?6wScotIe`2tmGhYfrLI za+$YnNtdSV#_Qkme)&J)wTc3-Go8G)UhMxpUN27t?aKIHa2sV++)k=E;dbBuffqM^ z$4tZCfl)6^u0Ej=7~4Qlymb@(O){p8RDZAVk5QA=S-lCwq~Z-odM}}Y-HhN4WBi!lRc|1$`fgAK@lWta|HgxDpa0HlF{gi&bQY@2iGKVa zI62MlSHA&t8$%h@*-~mOt1L`BKLt3tlFpkOqZ~5!@%)THErUAb@y~@YTe&ree}O9~ zra1H5?OjTndnL3-IoJ^G4GQ*#4}{OWjPTmg0HXCND*mMs#lPZ-DkKaUBXMyi{xzQJ z_r;#y;3^j~j+>vPW3XU%%p_C&#q@&oXRIKT;#tNK=}`8r{2pA&#J>gG(Ej(E+w$n? zBaf|=d)3<&*q`c8v#WI`)UA^G#?|liadt^V`9d};(VRG!dPZ`Xr7|zMZYam@7`OSj z!X3EAoYKjTmVt~FStnIYESMrmCamn7I#A(tZpDi4=X;_)vK|Phc5k8?$~ZnuFo|<~ zNy?rufAy|vuqmz_^^5tiDEmh9?*jO(AMzpi;Tqx1POJsIoV zC;6@d@-U~lr#j`tVqIxv5;@utnQlhTO(OSeM`pW|NI#}0rS2;?r`9?JF_%sprdYnT z`VvxE-5EL7D44*^ch_C%9@zny!?4YzXYrvZzfoTP6fpC)`MMoZFoo@42HP-pgQ8$Y zwu2dJ!pv>s;d?jJ@|xpdj)-=`fk4MAnMY_g&y7;i7-0#W&NI&u{rIaH;M36`D0pQj zw}!W32J4O&@QAKP4r+fSYEnQBl8)Z?4$6+H`PHk`pQh}>2AYcQ>d8%IlMZ=nawnqh z6z$2oxwX=1?Va(joo@RJDSBlr0oA&p+|*1RX?}j3iz-c=Y3~Ve)(xj!R>LLNk#3{O zaS5yL)M@Xp?9JNz#odBZ=`~L_dJQd%i*qdvriJa&XlQhbbdS|M*F-O5USn5wa?_plzWgocmi{5#VxxGm=}R73_E7w1lWVRqU5*B_*_C7{TGKMS zB)4L|6|fDu?R42vt}h)uX>^Hw5Fz1FQe2Hf`tDlVK0;yS=SqRGF^7V-d0jfAi%+Gq z?*knT(NTT9Wa@q%v94a?{;2J*_%SZ^PR-iBS(yeas=6TYok9sxv4eDBuW88H#)2;gEv9xNVZ=sVt|c$4bjKV-jP+QlTgJBWs1R~qT2qP}#K z_OLst*80hfdLbL8-%nm$_el(SQb^n=e zPx*{Yl&9x2e|kPMI`T2ZNg0md%^ZNa$@7&!_ae`kSVEKUD8U#VM@I>`Hh*&!iA>6u zAaBxrxp1@egehI$C@@2U>;yi)3cnKHDUI$zLc-F{qeFwW=U_xw8Xhe)oqeOjO{YJI zde=0(l2+~eSl+KA54UTVoTz+|qY=&?kAh4g>powzlB2HxRLp`_i4+ zp@>?U!d?9(p^0Dy)xYB@x(Ley?fBw?%R}V~yx)NP^;R!Zh|8nV-qUvGVX3MPlBTsC z&xQdfcJ4CkIqsr)x;AQ$ThFU&1-_D%Q%~LhzSqi;)N4Z40jgM9S(D6V0FF%TI>%<_ zATk*cD#7Uf^kEQ>IK*@|xzc_@pnMX9X~Ig%?YJh2PFjK?P!M@M_qU?a``9AgUeJdi zjR^%ZxeBH;B?hXubfS$vK_MG;1K!t@PBGjPKafsW#l9rZG5eBDkR?s_cmqu~kjntZ z0DK|eZpcoZGZ17dsXU5|=kD`bdNTb z%q@F{svE?dd~ziKqdL8t>BIBA{Z8^iWWP%io4?+<)lOzp-YY3@+OCDP3k=zRo{Dys z$Pp))b-dpwp4hjS*aY?zk(J$3(Gq&N%EDAUgeDlxC$Ky_)9-U|Vi(-mo>a6K@37R% zHzHP=%g-?N(bUf{HSwPV{;Q1VhY*#j1hoJzZ{X1I6nY`s{4j*^(M@b8VP(MWmev&p zVyc6v3ogRQ5Vq1_6`(&o?R0I@YxG>bK%et^$(ZuM1L> zG}@H&_%4(EC>!1Ltlp8ACg8FG%-=)?q57Qo-7P} zSjr-~eT%5o5h-d+vGxl(nH50u+L799{8DHppVY;%AgB$8f3(JPNKkw7l411A@N)N~3 z#gKtaz-@e?U8vB!crTx01Jb@)FL%7c22R#G1DLk6*k@2SF1AcD-7r@ z&F=T@x+4tX0?7KfhJb0ym*eIj?2 z(K)2ME1Bxu@VnGqy`NWfgyrqrHkefyh!kO-v51RM+8^4`XE4x|ZBeJjgqA6ROSzRQ zqaM2L{4hgAJHMGJ(-5N5pgzfr3#ORZhLuj_7*<(50eQ9qIsLl&FztzXvv3+iQt@mO zGZo*(agS@q4zx1B?4-$vZ>*Rwo7T|;!*L)u-qND0yVdMm1D=Id+!9&yE6?#$h3Lf~ zkPH zEn&9Cxs=8@?`^HT-Pib@H`6otGC)#}7_&hbV+WAlyBxK4E>3+yBWpyche#UajGpR) z)IXz2jw4xHLM@j?HD`szCUiOd$K9)4!@WqcUP21vd}vl*hubmPh;wH$LSJOSiyW@eTts~`ql=8nzysb+t zSKWv=#TP&ePD+i_mDBATL_tGrPnh3BHNO;2aV~hs9OZNPVlnaMQ`}o0u}ThuEPx4R zZE;t;h1<7y9J-+fV+LQ&t?R{-*k?@e%iNWr+~O~i7Gf01-OLK29yMkj0HMq;7&AYu zI$s$^_qXoJVq9o{DJdBoa?zh?Fx5-pfAkuV@)=tU6X6EXnOyMlvRQY(GHbJvGw!^p zvnY_R%)l1hpfykd@-uu}xZaXF-36d``~@fxKCKCy#~Xt>e6^_05~a@|T!G|pIAl)r zmln0QPA2P%oBwC}rk2yZA0XbHGqXKR#CH#M6p9^9U!fEmnif4>BcAB~z20tnctzK~ zdcC8Qb0Qi8WZ-{~(Zo7NdNtDk&s~^#Go3c_{|L+pqVpluul}gREkj!p9>fdbn$55p zLQ-Jig{ebmXBzrSgFSYHfy*2fnaMKrAD2t+h51QmH|YRsuOu%`9%#QxKp|WkJ>DC8 zm20CK%hy0C`)J@L%Q0zgb~c_?*?-f~cX3A5x_tY_QbT|ayfY7ll812a56<_R{B&HV zftg)C-GfkK)0(auF&h>eSuVrP%AkvieuFI47D;||CjSNC(w`qM5!CMP9WPe$#Sl5i znTY1O@aS|3ZSzY%I!)!*kjW~y-0r)zFLCI&BS`|UW%YJj7))BBwKZa_O)KP1`#eaAk-NQ*M0=SA$U{7>?hk=F-)pz6Zln+_Dhx(vix~0gB;amn!ntcQra?0| z+BFj&4|ruh-&9t1Ha)cA!$uCL6#9d9Cd%S!#{kA%dKue~k}00x$HO!)x*fX;6keRG z?5U?Nv#HW4)?g^=Hos( zMZUS0v-&zRk(hZ3@p7tZF@bCh#0x4=8`G;iK+Sc#-_^Y(5Qe^NH$F_WmPYpSuh5$ekC z71>O3%lDInce>+e2r&7zjt*wDW0lX?>C?$?#@PwfE4_+kr5CN_hk>zsGRL-{4_{#~5^4 z6Yv%;!N-sCxM=wu*|-8oVV^yjKB}{q3Z#Bk?P5>fTj1X&R-co#oJFH^66;~`@IF+m zZRw0LFln_HYjij%SW8e$u11wWwl?3S8>|=Vs~jv!+8`sZ@-=^Z8ybsi?we5PusUv$ zw@n#gH{V~Wv$~e9oa=1!iIHm8=;dkweqHI}vb0N6I1fZSYXz+n1647}`&=D6VUk?!JB1olb4O)My;+aLF1L*}a}{iH(K0~=`kvp<(T z)MH1N$q9?S&R^+ON3&1YJ}k8hn|~`5-9HIs`77PcCsMkH?TBfiwuH)U{DaULY5FE^ zw{DPU13P6Ag)F`uWOD@OpIYQCvsw3Y3Tt|g>WC)qz4#?wite*Z2e-w9RPBvSU>capDX57sStjW0W-{rPqASL2%A%~Q2<`*l^JV)TyR3N?&)R;_i_lw$O5 zetBDNzpk29jNZ){t8L?kVyx6FVFcLZo<4r6{j)fOPGXp%1QR+{Sb^CJjNS|>A@(u% zwGZ38wV{TYSz4#;PbF~B6zPMp`Ce_nWW3fkS66yc&cQD0+d=A5Yc8MBK639vq^n(L zX@(kTVClhJy4;)U?+Oah6$F>U{w|hJ%^h7sz)%gVa+v9G`-Q@AbS+VA)oy1o)t@PI z$A%Sz5&A9-gDt&mruV{QSvTZQ>jtB|X(oAp496@!D2PzJX?uLuC*-^z0>YGlHBQ@g z_BO!!jQ)Xi?JaniN;1=YgIqy(c~!o9%wvRV6ewB0pYPs?6(T(py`K1fJ~OfrO9Wqu zH*XhS%nXTlES>hUY~0@fWO*c&9vmFP?l=z)4(7XiqN|iawltCtc8GeTMdh=VWyTFm zlHDducCJDimQ5?=u!*)DY+t#9*9I_ir*Lf}7&Jbls9VgS_UFFQ+Q34be6F?8*LGsJ zZH8iMNt^|%sD=vc5+?yF^0WXII_buIS>D42_G=ALYBy~iQivqadN(EAkk^G#F?u&+ zESI`aD@N~TjLYsY%G>I^o8JgXvR?qS%CG+C7~UV1Y`FXO8EX?-qdOQm;;L3!OA9jb z-q5X`%KPxv?TrEq;$e=9n29F2;_~~Q`)L!MY@Sy+v^f^I{hc;PU>>6z-IA5@@fysxt8^~H|t#8l&k~Xg&&WZxE099wKkt~Jq?jW#SnfFqUbK=p30(H?hoGP{aJk1c+}Y) zUfLRb88|igGVDokntGL+>yc5qLcb~)n^kfv98S~SSOhOq7w%*14MB3h9M9qw2QPvw zT?TQ5Aj@aa0XFZbkHkSfbCCo)_-?RnAC^~`=Ff{MGu9ZSlu@^J+eCCXcrYk`lo#I@ zX`Tq8JWeM1yjkUazTyCePyCCsh{4h(3aIL3wy|R`fe2(yd!T zbPNLhEXbhHq{iT%7kyDg>nnEG{7oA51I8SUo%6w`@fW*Yy1+R}EuF}~-&IVd3xVC? zU-~y-)RthU_Lt^UhD4ieMs$QFbG#*DKW9)onA96GSw5tbT8<^y@iI@k+eCA`M#z~Y zAHrKJ$1YxT=uay?dJww!s<4UVGKtF?KLt%M1f0!mhw^Hs8BEd`aLRp)fa`o8Qo&R% z>B335HlfX>3-)Z6?`I&A{c9C)4BGh`HdRO)9*zz(+J*`>mOfaG#Da^Cf*##I7dWjG zC4CpeqP{N^E_D5Rg$X_gC@#lNa zCI-~4J3}RYrMX{<)Tk6X_8+54|Q^Ty>@K0V_DcWr&uPCt9>2UkA%$U94if2QZ2jkj&eRPOqZ zx6Z%sEoaX9?EK%2eQNy+FZtYmO&xIW>l%+fHRl&UdFH}(cRu?2uUzrH%U}Ag3kL50 z@cCzM_{-`4_~qBmy6VW2x(1)TAUNZUeP;gk4}IBdzB+c%UMJ5w@9>`-aOz{#OU~Ky z-JhiPKIGB#i~ey%-y`SW8Q${O58t`R1@HRwfscRf3s3L=m%Bgy;|rcxe%VRS9{ioY z$G0B8&v!re@ug2LUhPe-n_Tz(uNF>w_`W-Tf5(EIAH4mg@4o)?-^|kwPxd~v%g=JRy^E<` z;bG>w{o?PluRZp`nSXfb$xofN_Gh2% z|M^|_zG>r?pZoi>^Pf5W(8^P@|7+v-u0HGVNB?%*X`g=ax7Xdd`cm)i_y1_=7al#} zmS+$9{`F7nbK!&E{lMRT|M>UT|LnXM{Qb#`c3*SlIiGm=u2Y|?RniCj+x*nTDTjw2 z{o2O9XZF6Nd+kRL@OPaxD|hef$9liE=+1MGz5R-Ktmo0QKli?$oc8S*f0;V@U0-{0 zw}tO|_)~X$`1@ZO+UNG;U(5`0?xZI`i%OuD`JF!zZlYko(SzpWN_V&vm=r>V>!6 zm}wkz-OS%U^8V}_&i!52PTL*`&U@Lhr~m02=bSZp$%+d`{v$a5qLnd>QCSQ_~V3~v(r-?E_9f4r^WooId(pC2 z-Fx1et8YK;8*?r{`|g__i5IQ-(YZ%m|BBvkrVhz{;d2Fl;gZGOFS&QG&wn|}-Sg?U zop47fz5e!-KJ?u8A6WLChwpsTjZc>6-#T^Trye--J&S*L#xLLd{`HrI*Inp;B|A9r(bc=zK5;Kw;bIYba{KC|$zw_xse)im* zOXvOWo_nr(;PYQ!dfn|ufAIZx?9#pB;m=s6FhQ`%UKtH;gtt<1I6m{;)W5Ae(uQT;%JM~~Ybx$y7#CCcV2kBQeZXF5^EI^Ev zvhwh$l+sepVklp(lpdd8J5IoO%d99YW;bDG4#$VHn;Lr0%5Gw_Z8)w?7K?I)C115& zBC;$QrwxC~*3MZQVytDx99B?+Eu&;dM)U-XsLY-oXlN&r%K)3;AqsV1bg_vc(ahbQ`ctT&{E%dpl7L~?t6 zC8^CY7(K~0&*U<*#|vy6a=EpFXS1PSyX#S$&XVG^ex_G{3$l69=-BBv-z?{;(Tkii zF@PQ5C}?0iV}6WL+?}in$Mk_no9_ArPJYe;*d5vW5e$;*IHB@IXY!2p?c9^>UyYUB zXPX9DhsA|soDG@uxr<%;Qw;jgsjQHC?9xMm(V0sZ1>Dh;CjX21VW;viYj{ucCUUQX zX=N*!PvIHc>moeC=-RzLV((-3I$V)66*&g~yrsjzXnn886lwmwzDnRq*8A{(8|PlX z64J3Br*ImIu^Y&CuWN+mYdqY}9V{51VLNl}aLT*EmF}~xGj(pqwG}K?d$Ax|iLTN* z&JpcIZ|YP>wXa0nZ~(0|OJQ5>$ab1#EjH>fGkY&AjRCkcs}?|~BWl+c{?@9Wf&0;4 zsh`?f!+MQ~TG!6teXWwTmI7TKM+t^Y9ZA}WAfYrLl|a-P;bX`%xXusOR!rTftDyh;5gffV8?PS*A=GB^!`TqisRNRM1PlC zbFs$}i_cqsV11xj8FD7-z1-eBdkezM2YToQtrHQqnZG|vYBuZI(ah)_AeZ@4DEm`& zW`k*4inp!Pm4li=KM{_tz*d$KbOTVMvrZ|eQssqhZzaVHD#J!d!(us_^&(52KLCB@ zeO46PKi5Cbn!hX5RG~@B0@1>v(+>e&tYa?8+;PDB*uC~y5!zwa`x9mU0%dju2>qdg z6?kOK^TwQIDEci3boDhWY~k#QJuKTCXF>AWq`d}ePW+gf**l*dtxp8Cm#DH>NfWQx zD>nP%@NewHd?Sm!JeEnJA1mMf+(w;t{mCByRC&thFx7qd4yO@>$ zu3n)ShpZ#1v957mi#(IjF>SOz#hw#;Ccy7kEzytOWPNI9pj92$UI2d?!_yWwv7-HPzd(+{JR{Yj4~;ksM>*hUp;$NQH) zV)rlc`8r}7BE`0;ZAtE85^tJ@I%juX13t}%{krhkT})KD^xoF5IJN8lt|)E0|2)s% z$xKVS8_Y6oFGngLx9*ou%EG-$3E2&iEpv+Lh--P@18rj>#dZaU)~mA>z^N+iM*bs= zF7N8}l|_*>gXP70_1Z!dKsYW9xQ!b&(7|l+4|>+ z7K7ft_1^@KI%C?c|Ml${HNegmzDts#)xyV5>I_ly9zQH8X$NxGb6nb@ywwbK%cz1I z=PPd5xWKlvOPdU_aydkT8YwkG5M`engTHLIGPSz|)8j-m5 ze2wS;>{QY<_4jo+r{DH%=w53>s@xsh&}~T@x`^0@YTMe-N0TccKcB|Xg>+b4UybxKj`k>eZ*@`_h!VT z-%Hi9>h#`?JoHnx_ozoL^n07$izE6Kjich)h|}XWU$|dliI(tFK`ga;W0tmI zJd<@AKwyT_oIfwasj?>Ah*OnH`6M<~;JA;i97tbLU-lyKe-ZqJKHVRbihd#ViG~$8 zdHrsAp0)m*J$qB=JU{P%g0kpm9e%go`9API0NzCJDXh==g%N9}QhmJtM)m2M;*s;8Fxi-MZjI56%`d{#$|N&G5o*3b8c-3sPFrE|M{fr-h1wS z?sD#S?m6e4+b4ZO!$ms2l^h`mlYbqk2bA6WLFpx;BRP!`{D6Yz*gfLkkkE)W=l7SQ zt6%MMj;@Y_aKjLGJ5WoKCqV{r*nCFkW$G@@NasJJb3NYqeO4#C)N{UGW=zofdD@*> zu|6|fUorzP8Er8-Tx?LJp=Ei=S7$-V`);+gn=^CV46y|*n~afU#88!4vx_9=O`zAr zHuxLOyXApKoZSqm{Y@eo@p5jv7$um?woj+BUdD*tk8?XDwas)V_dsE5xNkc=4flN} z94^1#(_7+-aI3(|eX}1k%-=pk^ycZb0^NuS>R9DXaJ);^qGJGCa6Ffssp2Kid<5m` zUtHZ(h}S%T5srMV3Vm~*KUr|+h+sFT=Qe5dUB59xRzAQjts_*XFd8{MX$f(TqRu%D)GOM z3U>WSJAz-VjPsQE$X>(R*3yA+MJ=a&8Y}Q1qA$>wSQ^I`^7_&IiuEVtS1+tTseaZ- zV`AiTRjyGOxkYYsCev6Nj%)dh9f0TC=c}+GxX!rq?F;mqypyhJKgGP?!D||h)*&t% z&6&RC7b%~6nxu-871WKfXG1ENJXJ9MRWY~zH2irq>Mp`9>_3)Vj9ZijDT1&#c{*-? z4a`Mbj`U?)aw^yq(QTBW`>f9(T_a|ACzr^V&DGAqpSpie{!87z>Kv*ldj^v}PO4rf zME_F)$Y5NEsfC!D$K32}Jw}OLXKr6cespZ-r<#GDwDU8~yu1FwgmJdrB9G2}`iM1M z8O^^U-l1^PCPwStfmAAho(X6{B=h_Y4%xlz5(qYKkO0dhztCEv%RBm9=LG5ZD9_~E z3cUT#WGt#X`A?;^@q!u*U!tL6GszJQA7a{!rMDEE_2<6&`2v*~Aflkq8^ zulDk()`s#y;I?NzGAp)cK3z0n>_j+o(_{MwOgKuYa~!Rutgl&F#wW=o_o(|TVbPyi zpASpDuRU2y&x*#}xAZ%H`>t_i~yq%2zxvvA_itm7x@zl*YVZG@~n!hUt$>`UC<%R_f?*O2RHoVzi%$G(Lw<-opGE)4El<=!^# zgwd5y4zX+h*v7}M{?BScph*zc@1fsRj4o>V8g+@*itXB8Y^~sJHQ^&&E({;)=*}eT z6!JA&>)AKd2I~n1h57<%^4XcqW%%Do!qLT9K3>;jhjLRT?!Fq-pBvbApZz6uzQH%6xcxjn?SK{SRZjw0 zadMJ=Gs(%q+~<ZHR)ynuI+|%jj~D%{hSudJP`t?#h{p<~ z@))gNT+Z0DU1Ryi7?LK-O$lJesHI#%d_L(4)%Jw|(-#O6`KI4MuA|qe^xW3HNqUSb z>$~cs|GOe;Uc?J2Lg#}<5f$|FDYQ8rXF`_Asf5k$$O2^{fTUfq>UAU4n99~q<&&H6 zhW)AW2=B+n5vYc!QKLC)YiJwyFV(i}K*2l}g8^eJwSaDml}DZ|v8Co)hwX2AzsYXO zxtF-DP04s(PrZ=eU?1^v%A47YLXgmyNuRB1zDVes_qe&uhXTF~u-#I$ilJrJPo1;c z@q8Rf+E3NzFCO^3dB|R0L-_Q+&hPcL_1*lcOp+rnA0K`v@CWL%@af-BMBpaXSLf1m zN$Q5jLgu;jDXNJj%QYACenA_`4bm$+|GwBJOlv3WQ}PnB%1BeRlq}(!gri5vn%c3n zS}R=#?uRNrc{+@ACfrMy)P5xhE6sfCCRD|X7kM#%^G*)i;i5ow^_=u%ORW#7xG&I0 zyA)|DynSvj`fkhrbm}m=^H(I`(r*SMrTrJ* zM>+zB`85w^yXE(UtvH;g7i;=(Xg}{p5OSyeH78tMq z*HJRip)~a6@`H-e$=N9Sv5obej5kT5%~aS3&0S5D{@$92qWk#UGDm=suY~MXSDSNj z=M{3}h3DfWXR420DM0(x>iJjUZNCQJx_HN{@$X*t4zh4R@A(1ge1iV!0 z;?fo=gm{^(erj^Opw8ihwu_D`=kgbyRw``$0I3S;r9c{uf|0t7Nq1+~7u_?r8I1*f zTJU_*$CEle?%oavzeD6`w{7z zfUm393u&7#{cuw*6pWrupSed#h4js&rf?zelA~6d86(5M!i#|%RhJOkb5Cz1WqK1o zo!1h@)}*1kWsPZYyIr{@qy6X=CvVonbpLSshP-8>^dHtBD_GGF+0hr$r(nVnewd>vUA@S!+{mYUCa` zKzfr=O{{PCBz|sL58rf;Od6|)GMVdUvUps`A$IiK40^WRA&iD;Z{Xe4=dgIVNqZX= z>6588m6n52oDG0r{caAw}z{KEG72uk$Ci%4`J=?PsM+)?d@vJ z9(z0Q#(p;J?Yo2pO*uxxRq|{7!2bgIg92Qz%>-Wk@P8*pqx3WTUPzy4y9d=$J7G9dbDB%{Xp0V68i#*Rt$qqVrrB3{tL9WD!^N4?lDFcz zk*9M0j(5^(lWrwz$m$ja$HvjCGm_}k5j-Mv(kFr>-V+$*H#f7}2UReZ)ND}xS_va#KME{tELB*7k&eMKfyvUof`VLTRnR*O(a*d; zFVo5C8vXc|R-TM);~ID@aZv)jD zpt4Wxbl5?BcSiTS=hIlMpB)RE!R^AhT5E09H6P*Oo~|Y0Y>tm53!%Jle$JZg83b06 zd{0%?Uyi`|QaD5*m+*Jwe@?pgEmVbVCw)6^M%Ex^3&k4{0;KOy9l7eN+lZxgX7GX6 z-8bEfd2Ik%2X&U+fcp#8+c$x+*o=dv?aq4t0Ao3OFut8K zc#}){5fM~O-UkXA8BE=ZFWmo#G-$uJ$E3TbFq6Vw`%qD&i7MrYdc6vKcG%QZ>74CJXb2u z^~uXAV5j+IQ)Y}jP%E$8@yLE28oNVr1Nr;7F6dpA=+}J53v!fEuAjmp@j-kg&FjC% zlfH>LoxW0coAZr>@7Tn2umywY4-vg)*_tStj;|5ic^;gt^bYKWv@-bzQmi9KxH_fg zEpD>$xn0^rM{S!QG1SA^7iycvzC-IdGa8ic)-`127SvLBRi#{canor2@_*yY=0yJTN7C8N zLjH0l@{&d^AM(@)lX;u0o4(pTXZCKHQxP|1R~!><@-@TPfZwWpYIORsP%xY?s;xC; zBVRyT!&K+yT&?xEn%tSzZ_S-;T|1-jTx)(-uG%d8iN0eOs_a}1Zkvzv zXAW*7Nph_rRAX;lcvQ$G4l)gf{2}E4hy@f*eWhLcwmw?5Dp!>-Z%L%jOpN)(aON)^e*E~LXBiT(As#C@K!5E_}V!D%uVvKL!zqsO*>uX>AvpE zQt$ZdquFkMHc9!f;3G~xZ}@FJLzTZ3KYO6PqUcXL7N-3P$BW6&`)XjWUjoo3V}I;k zO}@WZKcaY$-L^~hxrvsS7RN@Dimi%P=Y&0oYXe~+9G|PMnOGxEh?c?fp3C4^vEYl~ z`oTp|BX?*K%+^@`vNL+g&L>H2mnzZS14~h1($~Bvv_4B?cOfFpwrb1qq2$nKx@S83 z5`@cvovCa*(%D~;w(etpCHjMKwxATg5p%9pz(gND>5rI84y2(2hUVf0Wo7n~WO6QE zP?p_byD$QJc+GDuy9MH)&(Ni#`Ektj;lc7Itg#aIhOH1dW2L#|fPU_}Y%-L4ZaDXx zhang?7Bh!6Slj$?e)*Zu_FL#vU0D&aqmkTt33xQt zh(hdIT}yy|U-`V~?9a04*uOKP*4LvapJ01W*6w`S`N)wsbhB*rrVShjuV5jckE^RU znP|Lv?WY-Z=`Mg0YjZRxRhOr523ZKJ8?kH1fx_cZDTtH5rJm{A`O(6q= zt6_=ERIza9A+uRVg#9wtyoG%9Yu~BQh4n%gb^UAELug!!S+U>u)bo5*P2SJf8jN?b zdC4f^66U8YEUnn$xR3_IA&=bpS`pqg9Wl4iq0P-|F?z`o5m(tuZkBA!1WF3r+YCiRVjrRT)JGFkm&_+{xJQ@*5Opo_fZB) zKoz=>j9+O)SvlEGqDoNS$9m;yZxYYpKWTd=fwjyyv+WN(lvLYaURoBPCVfN3IX

\n"; - echo "

Please check your request and try again.

"; - endHTML(true); - } - } - } - - // Check for an invalid command. If so, display an error and exit. - if (!empty($_REQUEST['command'])) { - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

Invalid command.

\n"; - echo "

Please check your request and try again.

"; - endHTML(true); - } - // If a menu parameter is available, display a submenu. - - if (!empty($_REQUEST['menu'])) { - switch ($_REQUEST['menu']) { - case 'list': - startHTML(); - displayListMenu(); - endHTML(); - case 'query': - startHTML(); - displayQueryMenu(); - endHTML(); - case 'upload': - startHTML(); - displayUploadMenu(); - endHTML(); - case 'logout': - startHTML(false); - logout(); - endHTML(); - default: - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

Invalid menu selection.

\n"; - echo "

Please check your request and try again.

"; - endHTML(true); - } - } - // If we get this far, that means there's nothing to do. Display - // the main menu. - // If no command was issued and no menu was selected, display the - // main menu. - startHTML(); - displayMenu(); - endHTML(); - } -} - -/** - * Display the menu for running in a web browser. - * - * @return void - */ -function displayListMenu() -{ -?> -

List Documents Menu

- -
-

Retrieve Google Documents Feed

-

Retrieve the feed for all of your documents.

-

- -

-

-
- -
-

Retrieve Google Word Processing Documents

-

Query the documents list feed for all word processing documents.

-

- -

-

-
- -
-

Retrieve Google Spreadsheets

-

Query the documents list feed for all spreadsheets.

-

- -

-

-
- -

Query the Documents List Feed

- -
-

Search the Documents List Feed

-

Find documents which contain the desired text.

-

- - -

-

-
- - -

Upload a document

- -
-

Select a Document to Upload

-

Upload a file from your computer to Google Documents.

-

- - -

-

-
- -Service Error Encountered

\n"; - echo "
" . htmlspecialchars($e->__toString()) . "
"; - endHTML(true); - } -} diff --git a/demos/Zend/Gdata/Gapps.php b/demos/Zend/Gdata/Gapps.php deleted file mode 100644 index 6b4c92f995..0000000000 --- a/demos/Zend/Gdata/Gapps.php +++ /dev/null @@ -1,1992 +0,0 @@ -= 5.2.11 - * - * You can run this sample both from the command line (CLI) and also - * from a web browser. Run this script without any command line options to - * see usage, eg: - * /usr/bin/env php Gapps.php - * - * More information on the Command Line Interface is available at: - * http://www.php.net/features.commandline - * - * When running this code from a web browser, be sure to fill in your - * Google Apps credentials below and choose a password for authentication - * via the web browser. - * - * Since this is a demo, only minimal error handling and input validation - * are performed. THIS CODE IS FOR DEMONSTRATION PURPOSES ONLY. NOT TO BE - * USED IN A PRODUCTION ENVIRONMENT. - * - * NOTE: You must ensure that Zend Framework is in your PHP include - * path. You can do this via php.ini settings, or by modifying the - * argument to set_include_path in the code below. - */ - -// ************************ BEGIN WWW CONFIGURATION ************************ - -/** - * Google Apps username. This is the username (without domain) used - * to administer your Google Apps account. This value is only - * used when accessing this demo on a web server. - * - * For example, if you login to Google Apps as 'foo@bar.com.inavlid', - * your username is 'foo'. - */ -define('GAPPS_USERNAME', 'username'); - -/** - * Google Apps domain. This is the domain associated with your - * Google Apps account. This value is only used when accessing this demo - * on a web server. - * - * For example, if you login to Google Apps as foo@bar.com.inavlid, - * your domain is 'bar.com.invalid'. - */ -define('GAPPS_DOMAIN', 'example.com.invalid'); - -/** - * Google Apps password. This is the password associated with the above - * username. This value is only used when accessing this demo on a - * web server. - */ -define('GAPPS_PASSWORD', 'your password here'); - -/** - * Login password. This password is used to protect your account from - * unauthorized access when running this demo on a web server. - * - * If this field is blank, all access will be denied. A blank password - * field is not the same as no password (which is disallowed for - * security reasons). - * - * NOTE: While we could technically just ask the user for their Google Apps - * credentials, the ClientLogin API is not intended for direct use by - * web applications. If you are the only user of the application, this - * is fine--- but you should not ask other users to enter their - * credentials via your web application. - */ -define('LOGIN_PASSWORD', ''); - -// ************************* END WWW CONFIGURATION ************************* - -/** - * @see Zend_Loader - */ -require_once 'Zend/Loader.php'; - -/** - * @see Zend_Gdata - */ -Zend_Loader::loadClass('Zend_Gdata'); - -/** - * @see Zend_Gdata_ClientLogin - */ -Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); - -/** - * @see Zend_Gdata_Gapps - */ -Zend_Loader::loadClass('Zend_Gdata_Gapps'); - -/** - * Returns a HTTP client object with the appropriate headers for communicating - * with Google using the ClientLogin credentials supplied. - * - * @param string $user The username, in e-mail address format, to authenticate - * @param string $pass The password for the user specified - * @return Zend_Http_Client - */ -function getClientLoginHttpClient($user, $pass) -{ - $service = Zend_Gdata_Gapps::AUTH_SERVICE_NAME; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - return $client; -} - -/** - * Creates a new user for the current domain. The user will be created - * without admin privileges. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The desired username for the user. - * @param string $givenName The given name for the user. - * @param string $familyName The family name for the user. - * @param string $password The plaintext password for the user. - * @return void - */ -function createUser($gapps, $html, $username, $givenName, $familyName, - $password) -{ - if ($html) {echo "

Create User

\n";} - $gapps->createUser($username, $givenName, $familyName, - $password); - if ($html) {echo "

Done.

\n";} -} - -/** - * Retrieves a user for the current domain by username. Information about - * that user is then output. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The desired username for the user. - * @return void - */ -function retrieveUser($gapps, $html, $username) -{ - if ($html) {echo "

User Information

\n";} - - $user = $gapps->retrieveUser($username); - - if ($html) {echo '

';} - - if ($user !== null) { - echo ' Username: ' . $user->login->username; - if ($html) {echo '
';} - echo "\n"; - - echo ' Given Name: '; - if ($html) { - echo htmlspecialchars($user->name->givenName); - } else { - echo $user->name->givenName; - } - if ($html) {echo '
';} - echo "\n"; - - echo ' Family Name: '; - if ($html) { - echo htmlspecialchars($user->name->familyName); - } else { - echo $user->name->familyName; - } - if ($html) {echo '
';} - echo "\n"; - - echo ' Suspended: ' . ($user->login->suspended ? 'Yes' : 'No'); - if ($html) {echo '
';} - echo "\n"; - - echo ' Admin: ' . ($user->login->admin ? 'Yes' : 'No'); - if ($html) {echo '
';} - echo "\n"; - - echo ' Must Change Password: ' . - ($user->login->changePasswordAtNextLogin ? 'Yes' : 'No'); - if ($html) {echo '
';} - echo "\n"; - - echo ' Has Agreed To Terms: ' . - ($user->login->agreedToTerms ? 'Yes' : 'No'); - - } else { - echo 'Error: Specified user not found.'; - } - if ($html) {echo '

';} - echo "\n"; -} - -/** - * Retrieves the list of users for the current domain and outputs - * that list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @return void - */ -function retrieveAllUsers($gapps, $html) -{ - if ($html) {echo "

Registered Users

\n";} - - $feed = $gapps->retrieveAllUsers(); - - if ($html) {echo "
    \n";} - - foreach ($feed as $user) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $user->login->username . ' ('; - if ($html) { - echo htmlspecialchars($user->name->givenName . ' ' . - $user->name->familyName); - } else { - echo $user->name->givenName . ' ' . $user->name->familyName; - } - echo ')'; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - -/** - * Change the name for an existing user. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated - * @param string $newGivenName The new given name for the user. - * @param string $newFamilyName The new family name for the user. - * @return void - */ -function updateUserName($gapps, $html, $username, $newGivenName, $newFamilyName) -{ - if ($html) {echo "

Update User Name

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->name->givenName = $newGivenName; - $user->name->familyName = $newFamilyName; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Change the password for an existing user. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated - * @param string $newPassword The new password for the user. - * @return void - */ -function updateUserPassword($gapps, $html, $username, $newPassword) -{ - if ($html) {echo "

Update User Password

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->password = $newPassword; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Suspend a given user. The user will not be able to login until restored. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function suspendUser($gapps, $html, $username) -{ - if ($html) {echo "

Suspend User

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->suspended = true; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Restore a given user after being suspended. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function restoreUser($gapps, $html, $username) -{ - if ($html) {echo "

Restore User

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->suspended = false; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Give a user admin rights. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function giveUserAdminRights($gapps, $html, $username) -{ - if ($html) {echo "

Grant Administrative Rights

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->admin = true; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Revoke a user's admin rights. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function revokeUserAdminRights($gapps, $html, $username) -{ - if ($html) {echo "

Revoke Administrative Rights

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->admin = false; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Force a user to change their password at next login. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function setUserMustChangePassword($gapps, $html, $username) -{ - if ($html) {echo "

Force User To Change Password

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->changePasswordAtNextLogin = true; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Undo forcing a user to change their password at next login. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be updated. - * @return void - */ -function clearUserMustChangePassword($gapps, $html, $username) -{ - if ($html) {echo "

Undo Force User To Change Password

\n";} - - $user = $gapps->retrieveUser($username); - - if ($user !== null) { - $user->login->changePasswordAtNextLogin = false; - $user->save(); - } else { - if ($html) {echo '

';} - echo 'Error: Specified user not found.'; - if ($html) {echo '

';} - echo "\n"; - } - - if ($html) {echo "

Done.

\n";} -} - -/** - * Delete the user who owns a given username. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username which should be deleted. - * @return void - */ -function deleteUser($gapps, $html, $username) -{ - if ($html) {echo "

Delete User

\n";} - - $gapps->deleteUser($username); - - if ($html) {echo "

Done.

\n";} -} - -/** - * Create a new nickname. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username to which the nickname should be assigned. - * @param string $nickname The name of the nickname to be created. - * @return void - */ -function createNickname($gapps, $html, $username, $nickname) -{ - if ($html) {echo "

Create Nickname

\n";} - - $gapps->createNickname($username, $nickname); - - if ($html) {echo "

Done.

\n";} -} - -/** - * Retrieve a specified nickname and output its ownership information. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $nickname The name of the nickname to be retrieved. - * @return void - */ -function retrieveNickname($gapps, $html, $nickname) -{ - if ($html) {echo "

Nickname Information

\n";} - - $nickname = $gapps->retrieveNickname($nickname); - - if ($html) {echo '

';} - - if ($nickname !== null) { - echo ' Nickname: ' . $nickname->nickname->name; - if ($html) {echo '
';} - echo "\n"; - - echo ' Owner: ' . $nickname->login->username; - } else { - echo 'Error: Specified nickname not found.'; - } - if ($html) {echo '

';} - echo "\n"; -} - -/** - * Outputs all nicknames owned by a specific username. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $username The username whose nicknames should be displayed. - * @return void - */ -function retrieveNicknames($gapps, $html, $username) -{ - if ($html) {echo "

Registered Nicknames For {$username}

\n";} - - $feed = $gapps->retrieveNicknames($username); - - if ($html) {echo "
    \n";} - - foreach ($feed as $nickname) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $nickname->nickname->name; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - - -/** - * Retrieves the list of nicknames for the current domain and outputs - * that list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @return void - */ -function retrieveAllNicknames($gapps, $html) -{ - if ($html) {echo "

Registered Nicknames

\n";} - - $feed = $gapps->retrieveAllNicknames(); - - if ($html) {echo "
    \n";} - - foreach ($feed as $nickname) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $nickname->nickname->name . ' => ' . $nickname->login->username; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - -/** - * Delete's a specific nickname from the current domain. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $nickname The nickname that should be deleted. - * @return void - */ -function deleteNickname($gapps, $html, $nickname) -{ - if ($html) {echo "

Delete Nickname

\n";} - - $gapps->deleteNickname($nickname); - - if ($html) {echo "

Done.

\n";} - -} - -/** - * Create a new email list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $emailList The name of the email list to be created. - * @return void - */ -function createEmailList($gapps, $html, $emailList) -{ - if ($html) {echo "

Create Email List

\n";} - - $gapps->createEmailList($emailList); - - if ($html) {echo "

Done.

\n";} -} - -/** - * Outputs the list of email lists to which the specified address is - * subscribed. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $recipient The email address of the recipient whose subscriptions should - * be retrieved. Only a username is required if the recipient is a - * member of the current domain. - * @return void - */ -function retrieveEmailLists($gapps, $html, $recipient) -{ - if ($html) {echo "

Email List Subscriptions For {$recipient}

\n";} - - $feed = $gapps->retrieveEmailLists($recipient); - - if ($html) {echo "
    \n";} - - foreach ($feed as $list) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $list->emailList->name; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - -/** - * Outputs the list of all email lists on the current domain. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @return void - */ -function retrieveAllEmailLists($gapps, $html) -{ - if ($html) {echo "

Registered Email Lists

\n";} - - $feed = $gapps->retrieveAllEmailLists(); - - if ($html) {echo "
    \n";} - - foreach ($feed as $list) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $list->emailList->name; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - -/** - * Delete's a specific email list from the current domain. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $emailList The email list that should be deleted. - * @return void - */ -function deleteEmailList($gapps, $html, $emailList) -{ - if ($html) {echo "

Delete Email List

\n";} - - $gapps->deleteEmailList($emailList); - - if ($html) {echo "

Done.

\n";} -} - -/** - * Add a recipient to an existing email list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the - * Google Apps server. - * @param boolean $html True if output should be formatted for display in a - * web browser. - * @param string $recipientAddress The address of the recipient who should be added. - * @param string $emailList The name of the email address the recipient be added to. - * @return void - */ -function addRecipientToEmailList($gapps, $html, $recipientAddress, - $emailList) -{ - if ($html) {echo "

Subscribe Recipient

\n";} - - $gapps->addRecipientToEmailList($recipientAddress, $emailList); - - if ($html) {echo "

Done.

\n";} -} - -/** - * Outputs the list of all recipients for a given email list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the Google - * Apps server. - * @param boolean $html True if output should be formatted for display in a web browser. - * @param string $emailList The email list whose recipients should be output. - * @return void - */ -function retrieveAllRecipients($gapps, $html, $emailList) -{ - if ($html) {echo "

Email List Recipients For {$emailList}

\n";} - - $feed = $gapps->retrieveAllRecipients($emailList); - - if ($html) {echo "
    \n";} - - foreach ($feed as $recipient) { - if ($html) { - echo "
  • "; - } else { - echo " * "; - } - echo $recipient->who->email; - if ($html) {echo '
  • ';} - echo "\n"; - } - if ($html) {echo "
\n";} -} - -/** - * Remove an existing recipient from an email list. - * - * @param Zend_Gdata_Gapps $gapps The service object to use for communicating with the - * Google Apps server. - * @param boolean $html True if output should be formatted for display in a - * web browser. - * @param string $recipientAddress The address of the recipient who should be removed. - * @param string $emailList The email list from which the recipient should be removed. - * @return void - */ -function removeRecipientFromEmailList($gapps, $html, $recipientAddress, - $emailList) -{ - if ($html) {echo "

Unsubscribe Recipient

\n";} - - $gapps->removeRecipientFromEmailList($recipientAddress, $emailList); - - if ($html) {echo "

Done.

\n";} - -} - -// ************************ BEGIN CLI SPECIFIC CODE ************************ - -/** - * Display list of valid commands. - * - * @param string $executable The name of the current script. This is usually available as $argv[0]. - * @return void - */ -function displayHelp($executable) -{ - echo "Usage: php {$executable} [] [] " . - "[ ...]\n\n"; - echo "Possible action values include:\n" . - "createUser\n" . - "retrieveUser\n" . - "retrieveAllUsers\n" . - "updateUserName\n" . - "updateUserPassword\n" . - "suspendUser\n" . - "restoreUser\n" . - "giveUserAdminRights\n" . - "revokeUserAdminRights\n" . - "setUserMustChangePassword\n" . - "clearUserMustChangePassword\n" . - "deleteUser\n" . - "createNickname\n" . - "retrieveNickname\n" . - "retrieveNicknames\n" . - "retrieveAllNicknames\n" . - "deleteNickname\n" . - "createEmailList\n" . - "retrieveEmailLists\n" . - "retrieveAllEmailLists\n" . - "deleteEmailList\n" . - "addRecipientToEmailList\n" . - "retrieveAllRecipients\n" . - "removeRecipientFromEmailList\n"; -} - -/** - * Parse command line arguments and execute appropriate function when - * running from the command line. - * - * If no arguments are provided, usage information will be provided. - * - * @param array $argv The array of command line arguments provided by PHP. - * $argv[0] should be the current executable name or '-' if not available. - * @param integer $argc The size of $argv. - * @return void - */ -function runCLIVersion($argv, $argc) -{ - if (isset($argc) && $argc >= 2) { - # Prepare a server connection - if ($argc >= 5) { - try { - $client = getClientLoginHttpClient($argv[2] . '@' . $argv[3], $argv[4]); - $gapps = new Zend_Gdata_Gapps($client, $argv[3]); - } catch (Zend_Gdata_App_AuthException $e) { - echo "Error: Unable to authenticate. Please check your credentials.\n"; - exit(1); - } - } - - # Dispatch arguments to the desired method - switch ($argv[1]) { - case 'createUser': - if ($argc == 9) { - createUser($gapps, false, $argv[5], $argv[6], $argv[7], $argv[8]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "This creates a new user with the given username.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe John Doe p4ssw0rd\n"; - } - break; - case 'retrieveUser': - if ($argc == 6) { - retrieveUser($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "This retrieves the user with the specified " . - "username and displays information about that user.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'retrieveAllUsers': - if ($argc == 5) { - retrieveAllUsers($gapps, false); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "This lists all users on the current domain.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} \n"; - } - break; - case 'updateUserName': - if ($argc == 8) { - updateUserName($gapps, false, $argv[5], $argv[6], $argv[7]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "Renames an existing user.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe Jane Doe\n"; - } - break; - case 'updateUserPassword': - if ($argc == 7) { - updateUserPassword($gapps, false, $argv[5], $argv[6]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "Changes the password for an existing user.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe password1\n"; - } - break; - case 'suspendUser': - if ($argc == 6) { - suspendUser($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "This suspends the given user.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'restoreUser': - if ($argc == 6) { - restoreUser($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "This restores the given user after being suspended.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'giveUserAdminRights': - if ($argc == 6) { - giveUserAdminRights($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Give a user admin rights for this domain.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'revokeUserAdminRights': - if ($argc == 6) { - revokeUserAdminRights($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Remove a user's admin rights for this domain.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'setUserMustChangePassword': - if ($argc == 6) { - setUserMustChangePassword($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Force a user to change their password at next login.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'clearUserMustChangePassword': - if ($argc == 6) { - clearUserMustChangePassword($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Clear the flag indicating that a user must change " . - "their password at next login.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'deleteUser': - if ($argc == 6) { - deleteUser($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Delete the user who owns a given username.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'createNickname': - if ($argc == 7) { - createNickname($gapps, false, $argv[5], $argv[6]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "Create a new nickname for the specified user.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe johnny\n"; - } - break; - case 'retrieveNickname': - if ($argc == 6) { - retrieveNickname($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Retrieve a nickname and display its ownership " . - "information.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "johnny\n"; - } - break; - case 'retrieveNicknames': - if ($argc == 6) { - retrieveNicknames($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Output all nicknames owned by a specific username.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "jdoe\n"; - } - break; - case 'retrieveAllNicknames': - if ($argc == 5) { - retrieveAllNicknames($gapps, false); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Output all registered nicknames on the system.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "\n"; - } - break; - case 'deleteNickname': - if ($argc == 6) { - deleteNickname($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Delete a specific nickname.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "johnny\n"; - } - break; - case 'createEmailList': - if ($argc == 6) { - createEmailList($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Create a new email list with the specified name.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "friends\n"; - } - break; - case 'retrieveEmailLists': - if ($argc == 6) { - retrieveEmailLists($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Retrieve all email lists to which the specified " . - "address is subscribed.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "johnny@somewhere.com.invalid\n"; - } - break; - case 'retrieveAllEmailLists': - if ($argc == 5) { - retrieveAllEmailLists($gapps, false); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Retrieve a list of all email lists on the current " . - "domain.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "\n"; - } - break; - case 'deleteEmailList': - if ($argc == 6) { - deleteEmailList($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Delete a specified email list.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "friends\n"; - } - break; - case 'addRecipientToEmailList': - if ($argc == 7) { - addRecipientToEmailList($gapps, false, $argv[5], $argv[6]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "Add a recipient to an existing email list.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "johnny@somewhere.com.invalid friends\n"; - } - break; - case 'retrieveAllRecipients': - if ($argc == 6) { - retrieveAllRecipients($gapps, false, $argv[5]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - "\n\n"; - echo "Retrieve all recipients for an existing email list.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "friends\n"; - } - break; - case 'removeRecipientFromEmailList': - if ($argc == 7) { - removeRecipientFromEmailList($gapps, false, $argv[5], $argv[6]); - } else { - echo "Usage: php {$argv[0]} {$argv[1]} " . - " \n\n"; - echo "Remove an existing recipient from an email list.\n"; - echo "EXAMPLE: php {$argv[0]} {$argv[1]} " . - "johnny@somewhere.com.invalid friends\n"; - } - break; - default: - // Invalid action entered - displayHelp($argv[0]); - // End switch block - } - } else { - // action left unspecified - displayHelp($argv[0]); - } -} - -// ************************ BEGIN WWW SPECIFIC CODE ************************ - -/** - * Writes the HTML prologue for this app. - * - * NOTE: We would normally keep the HTML/CSS markup separate from the business - * logic above, but have decided to include it here for simplicity of - * having a single-file sample. - * - * - * @param boolean $displayMenu (optional) If set to true, a navigation - * menu is displayed at the top of the page. Default is true. - * @return void - */ -function startHTML($displayMenu = true) -{ -?> - - - - - - - Google Apps Provisioning API Demo - - - - - - - - - -
-← Back'; - } -?> -
- - - -
-

Almost there...

-

Before using this demo, you must set an application password - to protect your account. You will also need to set your - Google Apps credentials in order to communicate with the Google - Apps servers.

-

To continue, open this file in a text editor and fill - out the information in the configuration section.

-
- -
-

Google Apps Authentication Failed

-

Authentication with the Google Apps servers failed.

-

Please open this file in a text editor and make - sure your credentials are correct.

-
- -
-

Authentication Required

- ' . $errorText . "\n"; - } - ?> -

Please enter your login password to continue.

-

-

-

Notice: This application is for demonstration - purposes only. Not for use in a production environment.

-

-
- -

Main Menu

- -

Welcome to the Google Apps Provisioning API demo page. Please select - from one of the following three options to see a list of commands.

- - - -

Tip: You can also run this demo from the command line if your system - has PHP CLI support enabled.

- -

User Maintenance Menu

- -
-

Create User

-

Create a new user with the given properties.

-

- - -
- -
- -
- - -

- -

-
-
-

Retrieve User

-

Retrieve the information for an existing user.

-

- - -
-

- -

-
-
-

Retrieve All Users

-

Retrieve the list of all users on the current domain.

-

- -

- -

-
-
-

Update Name

-

Update the name for an existing user.

-

- - -
- -
- -
-

- -

-
-
-

Update Password

-

Update the password for an existing user.

-

- - -
- -

-

- -

-
-
-

Suspend/Restore User

-

Mark an existing user as suspended or restore a suspended user. - While suspended, the user will be prohibited from logging into - this domain.

-

- - - -

-
- User may log into - this domain.
- User - may not log into this domain. -
- -

-
-
-

Issue/Revoke Admin Rights

-

Set whether an existing user has administrative rights for the current - domain.

-

- - - -

-
- User - may administer this domain.
- User - may not administer this domain. -
- -

-
-
-

Force User To Change Password

-

Set whether an existing user must change their password at - their next login.

-

- - - -

-
- User is required to - change their password at next login.
- User is - not required to change their password at next - login. -
- -

-
-
-

Delete User

-

Delete an existing user on the current domain.

-

- - -
-

- -

-
- -

Nickname Maintenance Menu

- -
-

Create Nickname

-

Create a nickname for an existing user.

-

- - -
- -
-

- -

-
-
-

Retrieve Nickname

-

Retrieve the information for an existing nickname.

-

- - -
-

- -

-
-
-

Retrieve Nicknames

-

Retrieve the nicknames associated with an existing username.

-

- - -
-

- -

-
-
-

Retrieve All Nicknames

-

Retrieve the nicknames on the current domain.

-

- -

- -

-
-
-

Delete Nickname

-

Delete an existing nickname from the current domain.

-

- - -
-

- -

-
- -

Email List Maintenance Menu

- -
-

Create Email List

-

Create a new email list for the current domain.

-

- - -
-

- -

-
-
-

Retrieve Email Lists

-

Retrieve all email lists to which a given email address is - subscribed.

-

- - -
-

- -

-
-
-

Retrieve All Email Lists

-

Retrieve all email lists on the current domain.

-

- -

- -

-
-
-

Delete Email List

-

Delete an existing email list from the current domain.

-

- - -
-

- -

-
-
-

Add Recipient To Email List

-

Add or remove a recipient from an existing email list. A complete - email address is required for recipients outside the current - domain.

-

- - -
- -
-

- Subscribe - recipient.
- Unsubscribe recipient. -
-

- -

-
-
-

Retrieve All Recipients

-

Retrieve all recipients subscribed to an existing email list.

-

- - -
-

- -

-
- -

Logout

- -

Logout successful.

- - -Invalid mode.
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

EIa!XF^c1FGkK4D&xusToMS}u%6 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

yccVFOlQMa3bov99c}jH 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�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


-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ĊM{4Zk|^$@h=efO!u-1DfS@1u3Q|LnU= z*`~XLu8zA|cX7}?vE5~U(j=y1J~3VZQ|TJ26L-ZmV&1?D!4A_3Tp>6Gs-#TSKdi^T zO9|*jOYZVZ&Bbp!Y~r_5QKyVeQh~i+|E7nP9Us<(qYBMT|E&g2)F5F>W(Y z4Z1d-or(Up%~?n5POb^5!aLc%NYbWYTWS4O*u`bzxv=w!urRLe9l{nZgU$8D!kMg` zaLx|Y>&}STDXyn$A(z&vp;Ml*ap*BN+Qmdl3lp+#DUF520r>Ocse(fM#ZZ1u>)$y>aY_>OFR-&Uc{M z`xYl1(Z(uB7)cN>%=s_#+d9ViUS1t&OVlZC8#doDh_W?!aV_TfEU&~lxtvJXR`Qtx z!|b*J1|EET#MAjF=d6~=YR5V|u6n9DRh#qR``tqLh|<_9d(_4P;ejb+CN-|Ea~M^k zu|=}&YxO3`C$u5qy126CjxWHZN6as6F& zBC3(@Oy{4Vt$f@E%~Dn|wPf=rSB9z}wP>sHYEFdss%pR19F0;y{j^6g-!`TF#!-Dt zf@(9xyQ+Ytfw4D0FxmI@`Zp?0n-fyTZ@#4jP7NpP8(gumb7%l_^AW@Ho}L9pQLAoZ zAaiapcWMq3%0wmV93nY8$UMB|*I@IJ(K@TnUtH1F>dhWMt|hLlA;6lENV~mib1(^2 z9WmO$NGAuCqpLFu*%b@i(TuQ&d2Z8VpUAY|9idsmOU1a_4tHinrFFiFMz9Gp<-4*e8?(PX=Y!?ZP+V`FK<>jPy~2m zB%kd+Ed6P!VY*DUh8Z!pU*YzzK>`N8D-4>HAofAU6<^Pay5>m@R_S&M+wPSX=RRw? z5F%MM=>FEsZc&M*v;nwV`Sbi;&K(Ag(T^RA5XX)>=pc0AK(ZBalP@&ejdNnMC(4y1 zD-%u_^S|GR1zhJljGxiX{4G8M)$l&DGMRZOq4G3?hC|ld<<*r%jIdhd@Zn#|TiS&G z9h5g5>n{Etf9C~k+5Me4cBdfNfgLyNREN1}x)M3eB2JnS00g1{4g&MUEeu=v(q29* z7dq_BE32(MISR0*0bv^u1aSrR$=+EqKPlg#q<@aJSRUwoJrr&eRB6Om0#mqwum|tC z10T*Rd`Pp#z@ZeSCA4Yf<%YcS*SC>zir%64fs#6=xN5vfit%Wwds`VpFpo4C2Pp;h zX=cTLUo5uIRv?P6k8uhhnJH6F(}ySLrH}YMNCoemptPIap~5Ba8cat9~J3 zg8CApgi4Agn2z)hRZ6yVyq^0CWrKZ%XG|2)3;ZsMzk67^_h6n=w?T=Pm{hIw%T{W4 zGwMW!A-fCk2r72D`q>H$nd=Fc5N^F)TcBO%*RkxzmO{T>eB=((g0KaSSJ+?N{aLgp zei{SgvAmSJAmG?n4;5i&q{lTe3Dsi2UF^4uONjI+UR>PEHe^7CfF120w}htsmbjy; z&_^`AW-zeH#3^QLoDlMYKu32s1>3svE8fbqSD|u273u>w%QBa{Jtx6$7%qgURccpt z!Jn5+qT!xF+B>jLE|(RxNy6l|(@`@G$tk;Khn5u!DER;7-Zu@FNba#F^DD*2HI<$>arU2T!V9Z7ibB4l$Pe1;}NbN{_80tj-8z zQStIBR#LmX5}Fy≪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 UPkHJ7if?0w47=*gcR(loKRk_1d;kCd diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.PlatformInstaller.UI.dll b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/Microsoft.Web.PlatformInstaller.UI.dll deleted file mode 100644 index 9951693e9a0a132603bc92eb55f807189e071ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546620 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 =ZnK#i-d|J7N9Sv${Iu#E=#eBnXS7RRPSvY= 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 koPIyPpJnaOiNgin3mOR$9=iS{{=`0lVBY< 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%0D`5Jh0Hk;&w>BoRy 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ʮ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 z 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
nrH-0QcwC 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

|H;qiFd4Cnd9zSUELg|a7)99sJ=hL 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

P zfA#s-?i-HYdVJMp@4oq8oVwpIy5XzKUaUFO>xQbJZ&t3}{PZ7BJ#^gj;LeoK6Ye{E zdiIDTapsn3=l0(7gi*uByfR@y|5ZniMrbu8`N~6|rXLM^(`Z@x>0gfE`?Fk|HYP2NzwJogrbqYu z_Tn6~?V0;d-1o@?dqP*7Ui!*t~OmqZP&8j{!DnVZ;Rz7;~~Cag6(o3HyH$jGKXAL4>2cV@vwfVyKKsDV+Sv7fB1_b2Yz|PGWqu1Gs9&4L^E}tg1o^cyhknXo-Phb= zV7(r6_i-+ae6(-Ldn=YtKho>zL%)1IK6UaVPxamL&`YU@pX*dPar??~6?fdZ^UI#A zmJfKOV8@0Zf0%jmTW9aAI(^@3SAMd{BrW($nW3oyK8s;!FxX+ znh^1Q^QYN!$FAOeOKrbX`H_YTQc};Re|mFpyPk`KcK_1zrlJ+zoA%sx!()p#-97Bm z$Tt@UFD$z`_@pU#BL7`Y<_G&uW#l&SGn#n`@0Eao6@H&efX=$ z0S{hqGT~g(*B=hMGkeVI`FFp6X~W6qrfod?X7<0%{WScUF4ukEuVdxEUua%F=!@v@ zvg>aiX}ayNbrG?17w*~EBgGM&JJ3hWzgje3XCTw(X|aE_c0B9KG%1;BSU)d3f90 zsdxU`|MlgE%4#FFyUv|`_o0f@&!&y|xV~#@@oS-1PMH%msN4H9rzUr_hTgXKnLpY8 E0j-n8+W-In diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/license.rtf b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/license.rtf deleted file mode 100644 index b703f2258f..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/PhpOnAzure.Web/resources/WebPICmdLine/license.rtf +++ /dev/null @@ -1,41 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fprq2\fcharset2 Symbol;}} -{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;} -{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}} -{\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\nowidctlpar\sb120\sa120\b\f0\fs20 MICROSOFT SOFTWARE LICENSE TERMS\par -\pard\brdrb\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 MICROSOFT WEB PLATFORM INSTALLER 3.0\f1\par -\pard\nowidctlpar\sb120\sa120\b0\f0 These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\par -\pard\nowidctlpar\fi-360\li360\sb120\sa120\tx360\f2\'b7\tab\f0 updates,\par -\pard\nowidctlpar\fi-360\li360\sb120\sa120\f2\'b7\tab\f0 supplements,\par -\f2\'b7\tab\f0 Internet-based services, and\par -\f2\'b7\tab\f0 support services\par -\pard\nowidctlpar\sb120\sa120 for this software, unless other terms accompany those items. If so, those terms apply.\par -\b By using the software, you accept these terms. If you do not accept them, do not use the software.\par -\pard\brdrt\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 If you comply with these license terms, you have the rights below.\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\tx360 1.\tab INSTALLATION AND USE RIGHTS. \b0 You may install and use any number of copies of the software on your devices.\f1\par -\pard\s1\fi-357\li357\sb120\sa120\tx360\b\caps\f0 2.\tab\fs19 Third Party Programs\caps0\f1 .\b0\f0\fs20 T\kerning36 his software enables you to obtain software applications from other sources. Those applications are offered and distributed by third parties under their own license terms. Microsoft is not developing, distributing or licensing those applications to you, but instead, as a convenience, enables you to use this software to obtain those applications directly from the application providers. By using the software, you acknowledge and agree that you are obtaining the applications directly from the third party providers and under separate license terms, and that it is your responsibility to locate, understand and comply with those license terms.\fs19 Microsoft grants you no license rights for third-party software or applications that is obtained using this software. \kerning0 \b\f1\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\tx360\f0\fs20 3.\tab INTERNET-BASED SERVICES. \b0 Microsoft provides Internet-based services with the software. It may change or cancel them at any time. \cf1 The software contains product information that is updated by means of a feed online from Microsoft.\cf0\f1\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\b\f0 4.\tab SCOPE OF LICENSE.\b0 The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not\par -\pard\nowidctlpar\fi-363\li720\sb120\sa120\tx720\f2\'b7\tab\f0 work around any technical limitations in the software;\par -\pard\nowidctlpar\fi-363\li720\sb120\sa120\f2\'b7\tab\f0 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;\par -\f2\'b7\tab\f0 make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation;\par -\f2\'b7\tab\f0 publish the software for others to copy;\par -\f2\'b7\tab\f0 rent, lease or lend the software; or\par -\f2\'b7\tab\f0 transfer the software or this agreement to any third party;\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\tx360\b 5.\tab BACKUP COPY.\b0 You may make one backup copy of the software. You may use it only to reinstall the software.\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\b 6.\tab DOCUMENTATION.\b0 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.\par -\b 7.\tab TRANSFER TO ANOTHER DEVICE.\b0 You may uninstall the software and install it on another device for your use. You may not do so to share this license between devices.\par -\b 8.\tab EXPORT RESTRICTIONS.\b0 The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see {\field{\*\fldinst{HYPERLINK "www.microsoft.com/exporting"}}{\fldrslt{\ul\cf2 www.microsoft.com/exporting}}}\f1\fs20 .\ul\par -\ulnone\b\f0 9.\tab SUPPORT SERVICES. \b0 Because this software is \ldblquote as is,\rdblquote we may not provide support services for it.\par -\b 10.\tab ENTIRE AGREEMENT.\b0 This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\par -\pard\nowidctlpar\s1\fi-360\li360\sb120\sa120\tx360\b 11.\tab APPLICABLE LAW.\par -\pard\nowidctlpar\s2\fi-363\li720\sb120\sa120\tx720 a.\tab United States.\b0 If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\par -\pard\nowidctlpar\s2\fi-363\li720\sb120\sa120\b b.\tab Outside the United States.\b0 If you acquired the software in any other country, the laws of that country apply.\par -\pard\nowidctlpar\s1\fi-357\li357\sb120\sa120\tx360\b 12.\tab LEGAL EFFECT.\b0 This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\par -\pard\s1\fi-357\li357\sb120\sa120\tx360\b 13.\tab DISCLAIMER OF WARRANTY. The software is licensed \ldblquote as-is.\rdblquote You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microsoft excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\par -\pard\s1\fi-357\li357\sb120\sa120 14.\tab LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.\par -\pard\nowidctlpar\li357\sb120\sa120\b0 This limitation applies to\par -\pard\nowidctlpar\fi-363\li720\sb120\sa120\tx720\f2\'b7\tab\f0 anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\par -\pard\nowidctlpar\fi-363\li720\sb120\sa120\f2\'b7\tab\f0 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\par -\pard\sb120\sa120 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages\f1 .\fs19\par -} - \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceConfiguration.cscfg b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceConfiguration.cscfg deleted file mode 100644 index 34efdb28a5..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceConfiguration.cscfg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceDefinition.csdef b/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceDefinition.csdef deleted file mode 100644 index e03ebfa19b..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Scaffolders/DefaultScaffolder/resources/ServiceDefinition.csdef +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Service.php b/library/Zend/Service/WindowsAzure/CommandLine/Service.php deleted file mode 100644 index 1654e69f0e..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Service.php +++ /dev/null @@ -1,201 +0,0 @@ -" -cert:"mycert.pem" - */ - public function listCommand($subscriptionId, $certificate, $certificatePassphrase) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->listHostedServices(); - - if (count($result) == 0) { - echo 'No data to display.'; - } - foreach ($result as $object) { - $this->_displayObjectInformation($object, array('ServiceName', 'Url')); - } - } - - /** - * Get hosted service account properties. - * - * @command-name GetProperties - * @command-description Get hosted service account properties. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-example Get hosted service account properties for service "phptest": - * @command-example GetProperties -sid:"" -cert:"mycert.pem" - * @command-example --Name:"phptest" - */ - public function getPropertiesCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getHostedServiceProperties($serviceName); - - $this->_displayObjectInformation($result, array('ServiceName', 'Label', 'AffinityGroup', 'Location')); - } - - /** - * Get hosted service account property. - * - * @command-name GetProperty - * @command-description Get storage account property. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Name Required. The hosted service account name to operate on. - * @command-parameter-for $property Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Property|-prop Required. The property to retrieve for the hosted service account. - * @command-example Get hosted service account property "Url" for service "phptest": - * @command-example GetProperty -sid:"" -cert:"mycert.pem" - * @command-example --Name:"phptest" --Property:Url - */ - public function getPropertyCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $property) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getHostedServiceProperties($serviceName); - - printf("%s\r\n", $result->$property); - } - - /** - * Create hosted service account. - * - * @command-name Create - * @command-description Create hosted service account. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Name Required. The hosted service account name. - * @command-parameter-for $label Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Label Required. A label for the hosted service. - * @command-parameter-for $description Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Description Optional. A description for the hosted service. - * @command-parameter-for $location Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Location Required if AffinityGroup is not specified. The location where the hosted service will be created. - * @command-parameter-for $affinityGroup Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --AffinityGroup Required if Location is not specified. The name of an existing affinity group associated with this subscription. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Create hosted service account in West Europe - * @command-example Create -p:"phpazure" --Name:"phptestsdk2" --Label:"phptestsdk2" --Location:"West Europe" - */ - public function createCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $label, $description, $location, $affinityGroup, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->createHostedService($serviceName, $label, $description, $location, $affinityGroup); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Update hosted service account. - * - * @command-name Update - * @command-description Update hosted service account. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Name Required. The hosted service account name. - * @command-parameter-for $label Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Label Required. A label for the hosted service. - * @command-parameter-for $description Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Description Optional. A description for the hosted service. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Update hosted service - * @command-example Update -p:"phpazure" --Name:"phptestsdk2" --Label:"New label" --Description:"Some description" - */ - public function updateCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $label, $description, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->updateHostedService($serviceName, $label, $description); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } - - /** - * Delete hosted service account. - * - * @command-name Delete - * @command-description Delete hosted service account. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $serviceName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Name Required. The hosted service account name. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Delete hosted service - * @command-example Delete -p:"phpazure" --Name:"phptestsdk2" - */ - public function deleteCommand($subscriptionId, $certificate, $certificatePassphrase, $serviceName, $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->deleteHostedService($serviceName); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } -} - -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/CommandLine/Storage.php b/library/Zend/Service/WindowsAzure/CommandLine/Storage.php deleted file mode 100644 index 05fb5c68d7..0000000000 --- a/library/Zend/Service/WindowsAzure/CommandLine/Storage.php +++ /dev/null @@ -1,198 +0,0 @@ -" -cert:"mycert.pem" - */ - public function listAccountsCommand($subscriptionId, $certificate, $certificatePassphrase) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->listStorageAccounts(); - - if (count($result) == 0) { - echo 'No data to display.'; - } - foreach ($result as $object) { - $this->_displayObjectInformation($object, array('ServiceName', 'Url')); - } - } - - /** - * Get storage account properties. - * - * @command-name GetProperties - * @command-description Get storage account properties. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $accountName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --AccountName Required. The storage account name to operate on. - * @command-example Get storage account properties for account "phptest": - * @command-example GetProperties -sid:"" -cert:"mycert.pem" - * @command-example --AccountName:"phptest" - */ - public function getPropertiesCommand($subscriptionId, $certificate, $certificatePassphrase, $accountName) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getStorageAccountProperties($accountName); - - $this->_displayObjectInformation($result, array('ServiceName', 'Label', 'AffinityGroup', 'Location')); - } - - /** - * Get storage account property. - * - * @command-name GetProperty - * @command-description Get storage account property. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $accountName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --AccountName Required. The storage account name to operate on. - * @command-parameter-for $property Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Property|-prop Required. The property to retrieve for the storage account. - * @command-example Get storage account property "Url" for account "phptest": - * @command-example GetProperty -sid:"" -cert:"mycert.pem" - * @command-example --AccountName:"phptest" --Property:Url - */ - public function getPropertyCommand($subscriptionId, $certificate, $certificatePassphrase, $accountName, $property) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getStorageAccountProperties($accountName); - - printf("%s\r\n", $result->$property); - } - - /** - * Get storage account keys. - * - * @command-name GetKeys - * @command-description Get storage account keys. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $accountName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --AccountName Required. The storage account name to operate on. - * @command-example Get storage account keys for account "phptest": - * @command-example GetKeys -sid:"" -cert:"mycert.pem" - * @command-example --AccountName:"phptest" - */ - public function getKeysCommand($subscriptionId, $certificate, $certificatePassphrase, $accountName) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getStorageAccountKeys($accountName); - - $this->_displayObjectInformation((object)array('Key' => 'primary', 'Value' => $result[0]), array('Key', 'Value')); - $this->_displayObjectInformation((object)array('Key' => 'secondary', 'Value' => $result[1]), array('Key', 'Value')); - } - - /** - * Get storage account key. - * - * @command-name GetKey - * @command-description Get storage account key. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $accountName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --AccountName Required. The storage account name to operate on. - * @command-parameter-for $key Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Key|-k Optional. Specifies the key to regenerate (primary|secondary). If omitted, primary key is used as the default. - * @command-example Get primary storage account key for account "phptest": - * @command-example GetKey -sid:"" -cert:"mycert.pem" - * @command-example --AccountName:"phptest" -Key:primary - */ - public function getKeyCommand($subscriptionId, $certificate, $certificatePassphrase, $accountName, $key = 'primary') - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $result = $client->getStorageAccountKeys($accountName); - - if (strtolower($key) == 'secondary') { - printf("%s\r\n", $result[1]); - } - printf("%s\r\n", $result[0]); - } - - /** - * Regenerate storage account keys. - * - * @command-name RegenerateKeys - * @command-description Regenerate storage account keys. - * @command-parameter-for $subscriptionId Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --SubscriptionId|-sid Required. This is the Windows Azure Subscription Id to operate on. - * @command-parameter-for $certificate Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --Certificate|-cert Required. This is the .pem certificate that user has uploaded to Windows Azure subscription as Management Certificate. - * @command-parameter-for $certificatePassphrase Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Prompt --Passphrase|-p Required. The certificate passphrase. If not specified, a prompt will be displayed. - * @command-parameter-for $accountName Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile|Zend_Service_Console_Command_ParameterSource_Env --AccountName Required. The storage account name to operate on. - * @command-parameter-for $key Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --Key|-k Optional. Specifies the key to regenerate (primary|secondary). If omitted, primary key is used as the default. - * @command-parameter-for $waitForOperation Zend_Service_Console_Command_ParameterSource_Argv|Zend_Service_Console_Command_ParameterSource_ConfigFile --WaitFor|-w Optional. Wait for the operation to complete? - * @command-example Regenerate secondary key for account "phptest": - * @command-example RegenerateKeys -sid:"" -cert:"mycert.pem" - * @command-example --AccountName:"phptest" -Key:secondary - */ - public function regenerateKeysCommand($subscriptionId, $certificate, $certificatePassphrase, $accountName, $key = 'primary', $waitForOperation = false) - { - $client = new Zend_Service_WindowsAzure_Management_Client($subscriptionId, $certificate, $certificatePassphrase); - $client->regenerateStorageAccountKey($accountName, $key); - if ($waitForOperation) { - $client->waitForOperation(); - } - echo $client->getLastRequestId(); - } -} - -Zend_Service_Console_Command::bootstrap($_SERVER['argv']); diff --git a/library/Zend/Service/WindowsAzure/Credentials/CredentialsAbstract.php b/library/Zend/Service/WindowsAzure/Credentials/CredentialsAbstract.php deleted file mode 100644 index 76893c980a..0000000000 --- a/library/Zend/Service/WindowsAzure/Credentials/CredentialsAbstract.php +++ /dev/null @@ -1,235 +0,0 @@ -_accountName = $accountName; - $this->_accountKey = base64_decode($accountKey); - $this->_usePathStyleUri = $usePathStyleUri; - } - - /** - * Set account name for Windows Azure - * - * @param string $value - * @return Zend_Service_WindowsAzure_Credentials_CredentialsAbstract - */ - public function setAccountName($value = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT) - { - $this->_accountName = $value; - return $this; - } - - /** - * Set account key for Windows Azure - * - * @param string $value - * @return Zend_Service_WindowsAzure_Credentials_CredentialsAbstract - */ - public function setAccountkey($value = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY) - { - $this->_accountKey = base64_decode($value); - return $this; - } - - /** - * Set use path-style URI's - * - * @param boolean $value - * @return Zend_Service_WindowsAzure_Credentials_CredentialsAbstract - */ - public function setUsePathStyleUri($value = false) - { - $this->_usePathStyleUri = $value; - return $this; - } - - /** - * Sign request URL with credentials - * - * @param string $requestUrl Request URL - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return string Signed request URL - */ - abstract public function signRequestUrl( - $requestUrl = '', - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ - ); - - /** - * Sign request headers with credentials - * - * @param string $httpVerb HTTP verb the request will use - * @param string $path Path for the request - * @param string $queryString Query string for the request - * @param array $headers x-ms headers to add - * @param boolean $forTableStorage Is the request for table storage? - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @param mixed $rawData Raw post data - * @return array Array of headers - */ - abstract public function signRequestHeaders( - $httpVerb = Zend_Http_Client::GET, - $path = '/', - $queryString = '', - $headers = null, - $forTableStorage = false, - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ, - $rawData = null - ); - - - /** - * Prepare query string for signing - * - * @param string $value Original query string - * @return string Query string for signing - */ - protected function _prepareQueryStringForSigning($value) - { - // Return value - $returnValue = array(); - - // Prepare query string - $queryParts = $this->_makeArrayOfQueryString($value); - foreach ($queryParts as $key => $value) { - $returnValue[] = $key . '=' . $value; - } - - // Return - if (count($returnValue) > 0) { - return '?' . implode('&', $returnValue); - } else { - return ''; - } - } - - /** - * Make array of query string - * - * @param string $value Query string - * @return array Array of key/value pairs - */ - protected function _makeArrayOfQueryString($value) - { - // Returnvalue - $returnValue = array(); - - // Remove front ? - if (strlen($value) > 0 && strpos($value, '?') === 0) { - $value = substr($value, 1); - } - - // Split parts - $queryParts = explode('&', $value); - foreach ($queryParts as $queryPart) { - $queryPart = explode('=', $queryPart, 2); - - if ($queryPart[0] != '') { - $returnValue[ $queryPart[0] ] = isset($queryPart[1]) ? $queryPart[1] : ''; - } - } - - // Sort - ksort($returnValue); - - // Return - return $returnValue; - } - - /** - * Returns an array value if the key is set, otherwide returns $valueIfNotSet - * - * @param array $array - * @param mixed $key - * @param mixed $valueIfNotSet - * @return mixed - */ - protected function _issetOr($array, $key, $valueIfNotSet) - { - return isset($array[$key]) ? $array[$key] : $valueIfNotSet; - } -} diff --git a/library/Zend/Service/WindowsAzure/Credentials/Exception.php b/library/Zend/Service/WindowsAzure/Credentials/Exception.php deleted file mode 100644 index a6c0c28643..0000000000 --- a/library/Zend/Service/WindowsAzure/Credentials/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -_permissionSet = $permissionSet; - } - - /** - * Get permission set - * - * @return array - */ - public function getPermissionSet() - { - return $this->_permissionSet; - } - - /** - * Set permisison set - * - * Warning: fine-grained permissions should be added prior to coarse-grained permissions. - * For example: first add blob permissions, end with container-wide permissions. - * - * Warning: the signed access signature URL must match the account name of the - * Zend_Service_WindowsAzure_Credentials_Zend_Service_WindowsAzure_Credentials_SharedAccessSignature instance - * - * @param array $value Permission set - * @return void - */ - public function setPermissionSet($value = array()) - { - foreach ($value as $url) { - if (strpos($url, $this->_accountName) === false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('The permission set can only contain URLs for the account name specified in the Zend_Service_WindowsAzure_Credentials_SharedAccessSignature instance.'); - } - } - $this->_permissionSet = $value; - } - - /** - * Create signature - * - * @param string $path Path for the request - * @param string $resource Signed resource - container (c) - blob (b) - * @param string $permissions Signed permissions - read (r), write (w), delete (d) and list (l) - * @param string $start The time at which the Shared Access Signature becomes valid. - * @param string $expiry The time at which the Shared Access Signature becomes invalid. - * @param string $identifier Signed identifier - * @return string - */ - public function createSignature( - $path = '/', - $resource = 'b', - $permissions = 'r', - $start = '', - $expiry = '', - $identifier = '' - ) { - // Determine path - if ($this->_usePathStyleUri) { - $path = substr($path, strpos($path, '/')); - } - - // Add trailing slash to $path - if (substr($path, 0, 1) !== '/') { - $path = '/' . $path; - } - - // Build canonicalized resource string - $canonicalizedResource = '/' . $this->_accountName; - /*if ($this->_usePathStyleUri) { - $canonicalizedResource .= '/' . $this->_accountName; - }*/ - $canonicalizedResource .= $path; - - // Create string to sign - $stringToSign = array(); - $stringToSign[] = $permissions; - $stringToSign[] = $start; - $stringToSign[] = $expiry; - $stringToSign[] = $canonicalizedResource; - $stringToSign[] = $identifier; - - $stringToSign = implode("\n", $stringToSign); - $signature = base64_encode(hash_hmac('sha256', $stringToSign, $this->_accountKey, true)); - - return $signature; - } - - /** - * Create signed query string - * - * @param string $path Path for the request - * @param string $queryString Query string for the request - * @param string $resource Signed resource - container (c) - blob (b) - * @param string $permissions Signed permissions - read (r), write (w), delete (d) and list (l) - * @param string $start The time at which the Shared Access Signature becomes valid. - * @param string $expiry The time at which the Shared Access Signature becomes invalid. - * @param string $identifier Signed identifier - * @return string - */ - public function createSignedQueryString( - $path = '/', - $queryString = '', - $resource = 'b', - $permissions = 'r', - $start = '', - $expiry = '', - $identifier = '' - ) { - // Parts - $parts = array(); - if ($start !== '') { - $parts[] = 'st=' . urlencode($start); - } - $parts[] = 'se=' . urlencode($expiry); - $parts[] = 'sr=' . $resource; - $parts[] = 'sp=' . $permissions; - if ($identifier !== '') { - $parts[] = 'si=' . urlencode($identifier); - } - $parts[] = 'sig=' . urlencode($this->createSignature($path, $resource, $permissions, $start, $expiry, $identifier)); - - // Assemble parts and query string - if ($queryString != '') { - $queryString .= '&'; - } - $queryString .= implode('&', $parts); - - return $queryString; - } - - /** - * Permission matches request? - * - * @param string $permissionUrl Permission URL - * @param string $requestUrl Request URL - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return string Signed request URL - */ - public function permissionMatchesRequest( - $permissionUrl = '', - $requestUrl = '', - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ - ) { - // Build requirements - $requiredResourceType = $resourceType; - if ($requiredResourceType == Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB) { - $requiredResourceType .= Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER; - } - - // Parse permission url - $parsedPermissionUrl = parse_url($permissionUrl); - - // Parse permission properties - $permissionParts = explode('&', $parsedPermissionUrl['query']); - - // Parse request url - $parsedRequestUrl = parse_url($requestUrl); - - // Check if permission matches request - $matches = true; - foreach ($permissionParts as $part) { - list($property, $value) = explode('=', $part, 2); - - if ($property == 'sr') { - $matches = $matches && (strpbrk($value, $requiredResourceType) !== false); - } - - if ($property == 'sp') { - $matches = $matches && (strpbrk($value, $requiredPermission) !== false); - } - } - - // Ok, but... does the resource match? - $matches = $matches && (strpos($parsedRequestUrl['path'], $parsedPermissionUrl['path']) !== false); - - // Return - return $matches; - } - - /** - * Sign request URL with credentials - * - * @param string $requestUrl Request URL - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return string Signed request URL - */ - public function signRequestUrl( - $requestUrl = '', - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ - ) { - // Look for a matching permission - foreach ($this->getPermissionSet() as $permittedUrl) { - if ($this->permissionMatchesRequest($permittedUrl, $requestUrl, $resourceType, $requiredPermission)) { - // This matches, append signature data - $parsedPermittedUrl = parse_url($permittedUrl); - - if (strpos($requestUrl, '?') === false) { - $requestUrl .= '?'; - } else { - $requestUrl .= '&'; - } - - $requestUrl .= $parsedPermittedUrl['query']; - - // Return url - return $requestUrl; - } - } - - // Return url, will be unsigned... - return $requestUrl; - } - - /** - * Sign request with credentials - * - * @param string $httpVerb HTTP verb the request will use - * @param string $path Path for the request - * @param string $queryString Query string for the request - * @param array $headers x-ms headers to add - * @param boolean $forTableStorage Is the request for table storage? - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @param mixed $rawData Raw post data - * @return array Array of headers - */ - public function signRequestHeaders( - $httpVerb = Zend_Http_Client::GET, - $path = '/', - $queryString = '', - $headers = null, - $forTableStorage = false, - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ, - $rawData = null - ) { - return $headers; - } -} diff --git a/library/Zend/Service/WindowsAzure/Credentials/SharedKey.php b/library/Zend/Service/WindowsAzure/Credentials/SharedKey.php deleted file mode 100644 index 3ec2875a24..0000000000 --- a/library/Zend/Service/WindowsAzure/Credentials/SharedKey.php +++ /dev/null @@ -1,173 +0,0 @@ -_usePathStyleUri) { - $path = substr($path, strpos($path, '/')); - } - - // Determine query - $queryString = $this->_prepareQueryStringForSigning($queryString); - - // Canonicalized headers - $canonicalizedHeaders = array(); - - // Request date - $requestDate = ''; - if (isset($headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date'])) { - $requestDate = $headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date']; - } else { - $requestDate = gmdate('D, d M Y H:i:s', time()) . ' GMT'; // RFC 1123 - $canonicalizedHeaders[] = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date:' . $requestDate; - } - - // Build canonicalized headers - if (!is_null($headers)) { - foreach ($headers as $header => $value) { - if (is_bool($value)) { - $value = $value === true ? 'True' : 'False'; - } - - $headers[$header] = $value; - if (substr($header, 0, strlen(Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER)) == Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER) { - $canonicalizedHeaders[] = strtolower($header) . ':' . $value; - } - } - } - sort($canonicalizedHeaders); - - // Build canonicalized resource string - $canonicalizedResource = '/' . $this->_accountName; - if ($this->_usePathStyleUri) { - $canonicalizedResource .= '/' . $this->_accountName; - } - $canonicalizedResource .= $path; - if ($queryString !== '') { - $queryStringItems = $this->_makeArrayOfQueryString($queryString); - foreach ($queryStringItems as $key => $value) { - $canonicalizedResource .= "\n" . strtolower($key) . ':' . urldecode($value); - } - } - - // Content-Length header - $contentLength = ''; - if (strtoupper($httpVerb) != Zend_Http_Client::GET - && strtoupper($httpVerb) != Zend_Http_Client::DELETE - && strtoupper($httpVerb) != Zend_Http_Client::HEAD) { - $contentLength = 0; - - if (!is_null($rawData)) { - $contentLength = strlen($rawData); - } - } - - // Create string to sign - $stringToSign = array(); - $stringToSign[] = strtoupper($httpVerb); // VERB - $stringToSign[] = $this->_issetOr($headers, 'Content-Encoding', ''); // Content-Encoding - $stringToSign[] = $this->_issetOr($headers, 'Content-Language', ''); // Content-Language - $stringToSign[] = $contentLength; // Content-Length - $stringToSign[] = $this->_issetOr($headers, 'Content-MD5', ''); // Content-MD5 - $stringToSign[] = $this->_issetOr($headers, 'Content-Type', ''); // Content-Type - $stringToSign[] = ""; // Date - $stringToSign[] = $this->_issetOr($headers, 'If-Modified-Since', ''); // If-Modified-Since - $stringToSign[] = $this->_issetOr($headers, 'If-Match', ''); // If-Match - $stringToSign[] = $this->_issetOr($headers, 'If-None-Match', ''); // If-None-Match - $stringToSign[] = $this->_issetOr($headers, 'If-Unmodified-Since', ''); // If-Unmodified-Since - $stringToSign[] = $this->_issetOr($headers, 'Range', ''); // Range - - if (!$forTableStorage && count($canonicalizedHeaders) > 0) { - $stringToSign[] = implode("\n", $canonicalizedHeaders); // Canonicalized headers - } - - $stringToSign[] = $canonicalizedResource; // Canonicalized resource - $stringToSign = implode("\n", $stringToSign); - $signString = base64_encode(hash_hmac('sha256', $stringToSign, $this->_accountKey, true)); - - // Sign request - $headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date'] = $requestDate; - $headers['Authorization'] = 'SharedKey ' . $this->_accountName . ':' . $signString; - - // Return headers - return $headers; - } -} diff --git a/library/Zend/Service/WindowsAzure/Credentials/SharedKeyLite.php b/library/Zend/Service/WindowsAzure/Credentials/SharedKeyLite.php deleted file mode 100644 index a7d638cc16..0000000000 --- a/library/Zend/Service/WindowsAzure/Credentials/SharedKeyLite.php +++ /dev/null @@ -1,152 +0,0 @@ -_usePathStyleUri) { - $path = substr($path, strpos($path, '/')); - } - - // Determine query - $queryString = $this->_prepareQueryStringForSigning($queryString); - - // Build canonicalized resource string - $canonicalizedResource = '/' . $this->_accountName; - if ($this->_usePathStyleUri) { - $canonicalizedResource .= '/' . $this->_accountName; - } - $canonicalizedResource .= $path; - if ($queryString !== '') { - $canonicalizedResource .= $queryString; - } - - // Request date - $requestDate = ''; - if (isset($headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date'])) { - $requestDate = $headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date']; - } else { - $requestDate = gmdate('D, d M Y H:i:s', time()) . ' GMT'; // RFC 1123 - } - - // Create string to sign - $stringToSign = array(); - $stringToSign[] = $requestDate; // Date - $stringToSign[] = $canonicalizedResource; // Canonicalized resource - $stringToSign = implode("\n", $stringToSign); - $signString = base64_encode(hash_hmac('sha256', $stringToSign, $this->_accountKey, true)); - - // Sign request - $headers[Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PREFIX_STORAGE_HEADER . 'date'] = $requestDate; - $headers['Authorization'] = 'SharedKeyLite ' . $this->_accountName . ':' . $signString; - - // Return headers - return $headers; - } - - /** - * Prepare query string for signing - * - * @param string $value Original query string - * @return string Query string for signing - */ - protected function _prepareQueryStringForSigning($value) - { - // Check for 'comp=' - if (strpos($value, 'comp=') === false) { - // If not found, no query string needed - return ''; - } else { - // If found, make sure it is the only parameter being used - if (strlen($value) > 0 && strpos($value, '?') === 0) { - $value = substr($value, 1); - } - - // Split parts - $queryParts = explode('&', $value); - foreach ($queryParts as $queryPart) { - if (strpos($queryPart, 'comp=') !== false) { - return '?' . $queryPart; - } - } - - // Should never happen... - return ''; - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDataSources.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDataSources.php deleted file mode 100644 index d97633a5b6..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDataSources.php +++ /dev/null @@ -1,81 +0,0 @@ -_data = array( - 'overallquotainmb' => $overallQuotaInMB, - 'logs' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationLogs(), - 'diagnosticinfrastructurelogs' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationDiagnosticInfrastructureLogs(), - 'performancecounters' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationPerformanceCounters(), - 'windowseventlog' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationWindowsEventLog(), - 'directories' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationDirectories() - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDiagnosticInfrastructureLogs.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDiagnosticInfrastructureLogs.php deleted file mode 100644 index ddb65663ac..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDiagnosticInfrastructureLogs.php +++ /dev/null @@ -1,53 +0,0 @@ -_data = array( - 'bufferquotainmb' => $bufferQuotaInMB, - 'scheduledtransferperiodinminutes' => $scheduledTransferPeriodInMinutes, - 'scheduledtransferloglevelfilter' => $scheduledTransferLogLevelFilter - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDirectories.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDirectories.php deleted file mode 100644 index 39534fadc9..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationDirectories.php +++ /dev/null @@ -1,85 +0,0 @@ -_data = array( - 'bufferquotainmb' => $bufferQuotaInMB, - 'scheduledtransferperiodinminutes' => $scheduledTransferPeriodInMinutes, - 'subscriptions' => array() - ); - } - - /** - * Add subscription - * - * @param string $path Path - * @param string $container Container - * @param int $directoryQuotaInMB Directory quota in MB - */ - public function addSubscription($path, $container, $directoryQuotaInMB = 1024) - { - $this->_data['subscriptions'][$path] = new Zend_Service_WindowsAzure_Diagnostics_DirectoryConfigurationSubscription($path, $container, $directoryQuotaInMB); - } - - /** - * Remove subscription - * - * @param string $path Path - */ - public function removeSubscription($path) - { - if (isset($this->_data['subscriptions'][$path])) { - unset($this->_data['subscriptions'][$path]); - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationInstance.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationInstance.php deleted file mode 100644 index b9c163c38d..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationInstance.php +++ /dev/null @@ -1,220 +0,0 @@ -_data = array( - 'datasources' => new Zend_Service_WindowsAzure_Diagnostics_ConfigurationDataSources() - ); - } - - /** - * Load configuration XML - * - * @param string $configurationXml Configuration XML - */ - public function loadXml($configurationXml) - { - // Convert to SimpleXMLElement - $configurationXml = Zend_Xml_Security::scan($configurationXml); - - // Assign general settings - $this->DataSources->OverallQuotaInMB = (int)$configurationXml->DataSources->OverallQuotaInMB; - - // Assign Logs settings - $this->DataSources->Logs->BufferQuotaInMB = (int)$configurationXml->DataSources->Logs->BufferQuotaInMB; - $this->DataSources->Logs->ScheduledTransferPeriodInMinutes = (int)$configurationXml->DataSources->Logs->ScheduledTransferPeriodInMinutes; - $this->DataSources->Logs->ScheduledTransferLogLevelFilter = (string)$configurationXml->DataSources->Logs->ScheduledTransferLogLevelFilter; - - // Assign DiagnosticInfrastructureLogs settings - $this->DataSources->DiagnosticInfrastructureLogs->BufferQuotaInMB = (int)$configurationXml->DataSources->DiagnosticInfrastructureLogs->BufferQuotaInMB; - $this->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferPeriodInMinutes = (int)$configurationXml->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferPeriodInMinutes; - $this->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferLogLevelFilter = (string)$configurationXml->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferLogLevelFilter; - - // Assign PerformanceCounters settings - $this->DataSources->PerformanceCounters->BufferQuotaInMB = (int)$configurationXml->DataSources->PerformanceCounters->BufferQuotaInMB; - $this->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes = (int)$configurationXml->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes; - if ($configurationXml->DataSources->PerformanceCounters->Subscriptions - && $configurationXml->DataSources->PerformanceCounters->Subscriptions->PerformanceCounterConfiguration) { - $subscriptions = $configurationXml->DataSources->PerformanceCounters->Subscriptions; - if (count($subscriptions->PerformanceCounterConfiguration) > 1) { - $subscriptions = $subscriptions->PerformanceCounterConfiguration; - } else { - $subscriptions = array($subscriptions->PerformanceCounterConfiguration); - } - foreach ($subscriptions as $subscription) { - $this->DataSources->PerformanceCounters->addSubscription((string)$subscription->CounterSpecifier, (int)$subscription->SampleRateInSeconds); - } - } - - // Assign WindowsEventLog settings - $this->DataSources->WindowsEventLog->BufferQuotaInMB = (int)$configurationXml->DataSources->WindowsEventLog->BufferQuotaInMB; - $this->DataSources->WindowsEventLog->ScheduledTransferPeriodInMinutes = (int)$configurationXml->DataSources->WindowsEventLog->ScheduledTransferPeriodInMinutes; - $this->DataSources->WindowsEventLog->ScheduledTransferLogLevelFilter = (string)$configurationXml->DataSources->WindowsEventLog->ScheduledTransferLogLevelFilter; - if ($configurationXml->DataSources->WindowsEventLog->Subscriptions - && $configurationXml->DataSources->WindowsEventLog->Subscriptions->string) { - $subscriptions = $configurationXml->DataSources->WindowsEventLog->Subscriptions; - if (count($subscriptions->string) > 1) { - $subscriptions = $subscriptions->string; - } else { - $subscriptions = array($subscriptions->string); - } - foreach ($subscriptions as $subscription) { - $this->DataSources->WindowsEventLog->addSubscription((string)$subscription); - } - } - - // Assign Directories settings - $this->DataSources->Directories->BufferQuotaInMB = (int)$configurationXml->DataSources->Directories->BufferQuotaInMB; - $this->DataSources->Directories->ScheduledTransferPeriodInMinutes = (int)$configurationXml->DataSources->Directories->ScheduledTransferPeriodInMinutes; - - if ($configurationXml->DataSources->Directories->Subscriptions - && $configurationXml->DataSources->Directories->Subscriptions->DirectoryConfiguration) { - $subscriptions = $configurationXml->DataSources->Directories->Subscriptions; - if (count($subscriptions->DirectoryConfiguration) > 1) { - $subscriptions = $subscriptions->DirectoryConfiguration; - } else { - $subscriptions = array($subscriptions->DirectoryConfiguration); - } - foreach ($subscriptions as $subscription) { - $this->DataSources->Directories->addSubscription((string)$subscription->Path, (string)$subscription->Container, (int)$subscription->DirectoryQuotaInMB); - } - } - } - - /** - * Create configuration XML - * - * @return string - */ - public function toXml() - { - // Return value - $returnValue = array(); - - // Build XML - $returnValue[] = ''; - $returnValue[] = ''; - - // Add data sources - $returnValue[] = ' '; - - $returnValue[] = ' ' . $this->DataSources->OverallQuotaInMB . ''; - - $returnValue[] = ' '; - $returnValue[] = ' ' . $this->DataSources->Logs->BufferQuotaInMB . ''; - $returnValue[] = ' ' . $this->DataSources->Logs->ScheduledTransferPeriodInMinutes . ''; - $returnValue[] = ' ' . $this->DataSources->Logs->ScheduledTransferLogLevelFilter . ''; - $returnValue[] = ' '; - - $returnValue[] = ' '; - $returnValue[] = ' ' . $this->DataSources->DiagnosticInfrastructureLogs->BufferQuotaInMB . ''; - $returnValue[] = ' ' . $this->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferPeriodInMinutes . ''; - $returnValue[] = ' ' . $this->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferLogLevelFilter . ''; - $returnValue[] = ' '; - - $returnValue[] = ' '; - $returnValue[] = ' ' . $this->DataSources->PerformanceCounters->BufferQuotaInMB . ''; - $returnValue[] = ' ' . $this->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes . ''; - if (count($this->DataSources->PerformanceCounters->Subscriptions) == 0) { - $returnValue[] = ' '; - } else { - $returnValue[] = ' '; - foreach ($this->DataSources->PerformanceCounters->Subscriptions as $subscription) { - $returnValue[] = ' '; - $returnValue[] = ' ' . $subscription->CounterSpecifier . ''; - $returnValue[] = ' ' . $subscription->SampleRateInSeconds . ''; - $returnValue[] = ' '; - } - $returnValue[] = ' '; - } - $returnValue[] = ' '; - - $returnValue[] = ' '; - $returnValue[] = ' ' . $this->DataSources->WindowsEventLog->BufferQuotaInMB . ''; - $returnValue[] = ' ' . $this->DataSources->WindowsEventLog->ScheduledTransferPeriodInMinutes . ''; - if (count($this->DataSources->WindowsEventLog->Subscriptions) == 0) { - $returnValue[] = ' '; - } else { - $returnValue[] = ' '; - foreach ($this->DataSources->WindowsEventLog->Subscriptions as $subscription) { - $returnValue[] = ' ' . $subscription . ''; - } - $returnValue[] = ' '; - } - $returnValue[] = ' ' . $this->DataSources->WindowsEventLog->ScheduledTransferLogLevelFilter . ''; - $returnValue[] = ' '; - - $returnValue[] = ' '; - $returnValue[] = ' ' . $this->DataSources->Directories->BufferQuotaInMB . ''; - $returnValue[] = ' ' . $this->DataSources->Directories->ScheduledTransferPeriodInMinutes . ''; - if (count($this->DataSources->Directories->Subscriptions) == 0) { - $returnValue[] = ' '; - } else { - $returnValue[] = ' '; - foreach ($this->DataSources->Directories->Subscriptions as $subscription) { - $returnValue[] = ' '; - $returnValue[] = ' ' . $subscription->Path . ''; - $returnValue[] = ' ' . $subscription->Container . ''; - $returnValue[] = ' ' . $subscription->DirectoryQuotaInMB . ''; - $returnValue[] = ' '; - } - $returnValue[] = ' '; - } - $returnValue[] = ' '; - - $returnValue[] = ' '; - $returnValue[] = ' false'; - $returnValue[] = ''; - - // Return - return implode("\r\n", $returnValue); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationLogs.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationLogs.php deleted file mode 100644 index f6ffd6b863..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationLogs.php +++ /dev/null @@ -1,62 +0,0 @@ -_data = array( - 'bufferquotainmb' => $bufferQuotaInMB, - 'scheduledtransferperiodinminutes' => $scheduledTransferPeriodInMinutes, - 'scheduledtransferloglevelfilter' => $scheduledTransferLogLevelFilter - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationObjectBaseAbstract.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationObjectBaseAbstract.php deleted file mode 100644 index 47ef47f408..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationObjectBaseAbstract.php +++ /dev/null @@ -1,66 +0,0 @@ -_data)) { - $this->_data[strtolower($name)] = $value; - return; - } - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception("Unknown property: " . $name); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - if (array_key_exists(strtolower($name), $this->_data)) { - return $this->_data[strtolower($name)]; - } - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception("Unknown property: " . $name); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationPerformanceCounters.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationPerformanceCounters.php deleted file mode 100644 index 28bb951fe6..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationPerformanceCounters.php +++ /dev/null @@ -1,85 +0,0 @@ -_data = array( - 'bufferquotainmb' => $bufferQuotaInMB, - 'scheduledtransferperiodinminutes' => $scheduledTransferPeriodInMinutes, - 'subscriptions' => array() - ); - } - - /** - * Add subscription - * - * @param string $counterSpecifier Counter specifier - * @param int $sampleRateInSeconds Sample rate in seconds - */ - public function addSubscription($counterSpecifier, $sampleRateInSeconds = 1) - { - - $this->_data['subscriptions'][$counterSpecifier] = new Zend_Service_WindowsAzure_Diagnostics_PerformanceCounterSubscription($counterSpecifier, $sampleRateInSeconds); - } - - /** - * Remove subscription - * - * @param string $counterSpecifier Counter specifier - */ - public function removeSubscription($counterSpecifier) - { - if (isset($this->_data['subscriptions'][$counterSpecifier])) { - unset($this->_data['subscriptions'][$counterSpecifier]); - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationWindowsEventLog.php b/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationWindowsEventLog.php deleted file mode 100644 index f8a069496e..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/ConfigurationWindowsEventLog.php +++ /dev/null @@ -1,76 +0,0 @@ -_data = array( - 'bufferquotainmb' => $bufferQuotaInMB, - 'scheduledtransferperiodinminutes' => $scheduledTransferPeriodInMinutes, - 'scheduledtransferloglevelfilter' => $scheduledTransferLogLevelFilter, - 'subscriptions' => array() - ); - } - - /** - * Add subscription - * - * @param string $filter Event log filter - */ - public function addSubscription($filter) - { - $this->_data['subscriptions'][$filter] = $filter; - } - - /** - * Remove subscription - * - * @param string $filter Event log filter - */ - public function removeSubscription($filter) - { - if (isset($this->_data['subscriptions'][$filter])) { - unset($this->_data['subscriptions'][$filter]); - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/DirectoryConfigurationSubscription.php b/library/Zend/Service/WindowsAzure/Diagnostics/DirectoryConfigurationSubscription.php deleted file mode 100644 index 1f62028d79..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/DirectoryConfigurationSubscription.php +++ /dev/null @@ -1,53 +0,0 @@ -_data = array( - 'path' => $path, - 'container' => $container, - 'directoryquotainmb' => $directoryQuotaInMB - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/Exception.php b/library/Zend/Service/WindowsAzure/Diagnostics/Exception.php deleted file mode 100644 index 0ebf6072c1..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -_blobStorageClient = $blobStorageClient; - $this->_controlContainer = $controlContainer; - - $this->_ensureStorageInitialized(); - } - - /** - * Ensure storage has been initialized - */ - protected function _ensureStorageInitialized() - { - if (!$this->_blobStorageClient->containerExists($this->_controlContainer)) { - $this->_blobStorageClient->createContainer($this->_controlContainer); - } - } - - /** - * Get default configuration values - * - * @return Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance - */ - public function getDefaultConfiguration() - { - return new Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance(); - } - - /** - * Checks if a configuration for a specific role instance exists. - * - * @param string $roleInstance Role instance name, can be found in $_SERVER['RdRoleId'] when hosted on Windows Azure. - * @return boolean - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function configurationForRoleInstanceExists($roleInstance = null) - { - if (is_null($roleInstance)) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Role instance should be specified. Try reading $_SERVER[\'RdRoleId\'] for this information if the application is hosted on Windows Azure Fabric or Development Fabric.'); - } - - return $this->_blobStorageClient->blobExists($this->_controlContainer, $roleInstance); - } - - /** - * Checks if a configuration for current role instance exists. Only works on Development Fabric or Windows Azure Fabric. - * - * @return boolean - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function configurationForCurrentRoleInstanceExists() - { - if (!isset($_SERVER['RdRoleId'])) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Server variable \'RdRoleId\' is unknown. Please verify the application is running in Development Fabric or Windows Azure Fabric.'); - } - - return $this->_blobStorageClient->blobExists($this->_controlContainer, $this->_getCurrentRoleInstanceId()); - } - - /** - * Get configuration for current role instance. Only works on Development Fabric or Windows Azure Fabric. - * - * @return Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function getConfigurationForCurrentRoleInstance() - { - if (!isset($_SERVER['RdRoleId'])) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Server variable \'RdRoleId\' is unknown. Please verify the application is running in Development Fabric or Windows Azure Fabric.'); - } - return $this->getConfigurationForRoleInstance($this->_getCurrentRoleInstanceId()); - } - - /** - * Get the current role instance ID. Only works on Development Fabric or Windows Azure Fabric. - * - * @return string - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - protected function _getCurrentRoleInstanceId() - { - if (!isset($_SERVER['RdRoleId'])) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Server variable \'RdRoleId\' is unknown. Please verify the application is running in Development Fabric or Windows Azure Fabric.'); - } - - if (strpos($_SERVER['RdRoleId'], 'deployment(') === false) { - return $_SERVER['RdRoleId']; - } else { - $roleIdParts = explode('.', $_SERVER['RdRoleId']); - return $roleIdParts[0] . '/' . $roleIdParts[2] . '/' . $_SERVER['RdRoleId']; - } - - if (!isset($_SERVER['RoleDeploymentID']) && !isset($_SERVER['RoleInstanceID']) && !isset($_SERVER['RoleName'])) { - throw new Exception('Server variables \'RoleDeploymentID\', \'RoleInstanceID\' and \'RoleName\' are unknown. Please verify the application is running in Development Fabric or Windows Azure Fabric.'); - } - - if (strpos($_SERVER['RdRoleId'], 'deployment(') === false) { - return $_SERVER['RdRoleId']; - } else { - return $_SERVER['RoleDeploymentID'] . '/' . $_SERVER['RoleInstanceID'] . '/' . $_SERVER['RoleName']; - } - } - - /** - * Set configuration for current role instance. Only works on Development Fabric or Windows Azure Fabric. - * - * @param Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance $configuration Configuration to apply - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function setConfigurationForCurrentRoleInstance(Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance $configuration) - { - if (!isset($_SERVER['RdRoleId'])) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Server variable \'RdRoleId\' is unknown. Please verify the application is running in Development Fabric or Windows Azure Fabric.'); - } - - $this->setConfigurationForRoleInstance($this->_getCurrentRoleInstanceId(), $configuration); - } - - /** - * Get configuration for a specific role instance - * - * @param string $roleInstance Role instance name, can be found in $_SERVER['RdRoleId'] when hosted on Windows Azure. - * @return Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function getConfigurationForRoleInstance($roleInstance = null) - { - if (is_null($roleInstance)) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Role instance should be specified. Try reading $_SERVER[\'RdRoleId\'] for this information if the application is hosted on Windows Azure Fabric or Development Fabric.'); - } - - - - if ($this->_blobStorageClient->blobExists($this->_controlContainer, $roleInstance)) { - $configurationInstance = new Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance(); - $configurationInstance->loadXml( $this->_blobStorageClient->getBlobData($this->_controlContainer, $roleInstance) ); - return $configurationInstance; - } - - return new Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance(); - } - - /** - * Set configuration for a specific role instance - * - * @param string $roleInstance Role instance name, can be found in $_SERVER['RdRoleId'] when hosted on Windows Azure. - * @param Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance $configuration Configuration to apply - * @throws Zend_Service_WindowsAzure_Diagnostics_Exception - */ - public function setConfigurationForRoleInstance($roleInstance = null, Zend_Service_WindowsAzure_Diagnostics_ConfigurationInstance $configuration) - { - if (is_null($roleInstance)) { - #require_once 'Zend/Service/WindowsAzure/Diagnostics/Exception.php'; - throw new Zend_Service_WindowsAzure_Diagnostics_Exception('Role instance should be specified. Try reading $_SERVER[\'RdRoleId\'] for this information if the application is hosted on Windows Azure Fabric or Development Fabric.'); - } - - $this->_blobStorageClient->putBlobData($this->_controlContainer, $roleInstance, $configuration->toXml(), array(), null, array('Content-Type' => 'text/xml')); - } -} diff --git a/library/Zend/Service/WindowsAzure/Diagnostics/PerformanceCounterSubscription.php b/library/Zend/Service/WindowsAzure/Diagnostics/PerformanceCounterSubscription.php deleted file mode 100644 index 2905d07733..0000000000 --- a/library/Zend/Service/WindowsAzure/Diagnostics/PerformanceCounterSubscription.php +++ /dev/null @@ -1,54 +0,0 @@ -_data = array( - 'counterspecifier' => $counterSpecifier, - 'samplerateinseconds' => $sampleRateInSeconds - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Exception.php b/library/Zend/Service/WindowsAzure/Exception.php deleted file mode 100644 index e1739311a0..0000000000 --- a/library/Zend/Service/WindowsAzure/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ - $value) { - if ((is_object($value) && !method_exists($value, '__toString')) - || is_array($value) - ) { - $value = gettype($value); - } - $logEntity->{$key} = $value; - } - - return $logEntity; - } -} diff --git a/library/Zend/Service/WindowsAzure/Log/Writer/WindowsAzure.php b/library/Zend/Service/WindowsAzure/Log/Writer/WindowsAzure.php deleted file mode 100644 index 66be08fe28..0000000000 --- a/library/Zend/Service/WindowsAzure/Log/Writer/WindowsAzure.php +++ /dev/null @@ -1,196 +0,0 @@ -_tableStorageConnection = $tableStorageConnection; - $this->_tableName = $tableName; - - // create the logging table if it does not exist. It will add some overhead, so it's optional - if ($createTable) { - $this->_tableStorageConnection->createTableIfNotExists( - $this->_tableName - ); - } - - // keep messages to be logged in an internal buffer and only send them over the wire when - // the script execution ends - if ($bufferMessages) { - $this->_bufferMessages = $bufferMessages; - } - - $this->_formatter = - new Zend_Service_WindowsAzure_Log_Formatter_WindowsAzure(); - } - - /** - * If the log messages have been stored in the internal buffer, just send them - * to table storage. - */ - public function shutdown() - { - parent::shutdown(); - if ($this->_bufferMessages) { - $this->_tableStorageConnection->startBatch(); - foreach ($this->_messageBuffer as $logEntity) { - $this->_tableStorageConnection->insertEntity( - $this->_tableName, $logEntity - ); - } - $this->_tableStorageConnection->commit(); - } - } - - /** - * Create a new instance of Zend_Service_Log_Writer_WindowsAzure - * - * @param array $config - * @return Zend_Service_Log_Writer_WindowsAzure - * @throws Zend_Service_Log_Exception - */ - static public function factory($config) - { - $config = self::_parseConfig($config); - $config = array_merge( - array( - 'connection' => null, - 'tableName' => null, - 'createTable' => true, - ), $config - ); - - return new self( - $config['connection'], - $config['tableName'], - $config['createTable'] - ); - } - - /** - * The only formatter accepted is already loaded in the constructor - * - * @todo enable custom formatters using the WindowsAzure_Storage_DynamicTableEntity class - */ - public function setFormatter( - Zend_Service_Log_Formatter_Interface $formatter - ) - { - #require_once 'Zend/Service/Log/Exception.php'; - throw new Zend_Service_Log_Exception( - get_class($this) . ' does not support formatting'); - } - - /** - * Write a message to the table storage. If buffering is activated, then messages will just be - * added to an internal buffer. - * - * @param array $event - * @return void - * @todo format the event using a formatted, not in this method - */ - protected function _write($event) - { - $logEntity = $this->_formatter->format($event); - - if ($this->_bufferMessages) { - $this->_messageBuffer[] = $logEntity; - } else { - $this->_tableStorageConnection->insertEntity( - $this->_tableName, $logEntity - ); - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/AffinityGroupInstance.php b/library/Zend/Service/WindowsAzure/Management/AffinityGroupInstance.php deleted file mode 100644 index c41175442b..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/AffinityGroupInstance.php +++ /dev/null @@ -1,66 +0,0 @@ -_data = array( - 'name' => $name, - 'label' => base64_decode($label), - 'description' => $description, - 'location' => $location, - 'hostedservices' => $hostedServices, - 'storageservices' => $storageServices - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/CertificateInstance.php b/library/Zend/Service/WindowsAzure/Management/CertificateInstance.php deleted file mode 100644 index 359601ada7..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/CertificateInstance.php +++ /dev/null @@ -1,60 +0,0 @@ -_data = array( - 'certificateurl' => $certificateUrl, - 'thumbprint' => $thumbprint, - 'thumbprintalgorithm' => $thumbprintAlgorithm, - 'data' => base64_decode($data) - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/Client.php b/library/Zend/Service/WindowsAzure/Management/Client.php deleted file mode 100644 index e714cfb5cb..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/Client.php +++ /dev/null @@ -1,2426 +0,0 @@ -_subscriptionId = $subscriptionId; - $this->_certificatePath = $certificatePath; - $this->_certificatePassphrase = $certificatePassphrase; - - $this->_retryPolicy = $retryPolicy; - if (is_null($this->_retryPolicy)) { - $this->_retryPolicy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::noRetry(); - } - - // Setup default Zend_Http_Client channel - $options = array( - 'adapter' => 'Zend_Http_Client_Adapter_Socket', - 'ssltransport' => 'ssl', - 'sslcert' => $this->_certificatePath, - 'sslpassphrase' => $this->_certificatePassphrase, - 'sslusecontext' => true, - ); - if (function_exists('curl_init')) { - // Set cURL options if cURL is used afterwards - $options['curloptions'] = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_TIMEOUT => 120, - ); - } - $this->_httpClientChannel = new Zend_Http_Client(null, $options); - } - - /** - * Set the HTTP client channel to use - * - * @param Zend_Http_Client_Adapter_Interface|string $adapterInstance Adapter instance or adapter class name. - */ - public function setHttpClientChannel($adapterInstance = 'Zend_Http_Client_Adapter_Socket') - { - $this->_httpClientChannel->setAdapter($adapterInstance); - } - - /** - * Retrieve HTTP client channel - * - * @return Zend_Http_Client_Adapter_Interface - */ - public function getHttpClientChannel() - { - return $this->_httpClientChannel; - } - - /** - * Returns the Windows Azure subscription ID - * - * @return string - */ - public function getSubscriptionId() - { - return $this->_subscriptionId; - } - - /** - * Returns the last request ID. - * - * @return string - */ - public function getLastRequestId() - { - return $this->_lastRequestId; - } - - /** - * Get base URL for creating requests - * - * @return string - */ - public function getBaseUrl() - { - return self::URL_MANAGEMENT . '/' . $this->_subscriptionId; - } - - /** - * Perform request using Zend_Http_Client channel - * - * @param string $path Path - * @param string $queryString Query string - * @param string $httpVerb HTTP verb the request will use - * @param array $headers x-ms headers to add - * @param mixed $rawData Optional RAW HTTP data to be sent over the wire - * @return Zend_Http_Response - */ - protected function _performRequest( - $path = '/', - $queryString = '', - $httpVerb = Zend_Http_Client::GET, - $headers = array(), - $rawData = null - ) { - // Clean path - if (strpos($path, '/') !== 0) { - $path = '/' . $path; - } - - // Clean headers - if (is_null($headers)) { - $headers = array(); - } - - // Ensure cUrl will also work correctly: - // - disable Content-Type if required - // - disable Expect: 100 Continue - if (!isset($headers["Content-Type"])) { - $headers["Content-Type"] = ''; - } - //$headers["Expect"] = ''; - - // Add version header - $headers['x-ms-version'] = $this->_apiVersion; - - // URL encoding - $path = self::urlencode($path); - $queryString = self::urlencode($queryString); - - // Generate URL and sign request - $requestUrl = $this->getBaseUrl() . $path . $queryString; - $requestHeaders = $headers; - - // Prepare request - $this->_httpClientChannel->resetParameters(true); - $this->_httpClientChannel->setUri($requestUrl); - $this->_httpClientChannel->setHeaders($requestHeaders); - $this->_httpClientChannel->setRawData($rawData); - - // Execute request - $response = $this->_retryPolicy->execute( - array($this->_httpClientChannel, 'request'), - array($httpVerb) - ); - - // Store request id - $this->_lastRequestId = $response->getHeader('x-ms-request-id'); - - return $response; - } - - /** - * Parse result from Zend_Http_Response - * - * @param Zend_Http_Response $response Response from HTTP call - * @return object - * @throws Zend_Service_WindowsAzure_Exception - */ - protected function _parseResponse(Zend_Http_Response $response = null) - { - if (is_null($response)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Response should not be null.'); - } - - $xml = Zend_Xml_Security::scan($response->getBody()); - - if ($xml !== false) { - // Fetch all namespaces - $namespaces = array_merge($xml->getNamespaces(true), $xml->getDocNamespaces(true)); - - // Register all namespace prefixes - foreach ($namespaces as $prefix => $ns) { - if ($prefix != '') { - $xml->registerXPathNamespace($prefix, $ns); - } - } - } - - return $xml; - } - - /** - * URL encode function - * - * @param string $value Value to encode - * @return string Encoded value - */ - public static function urlencode($value) - { - return str_replace(' ', '%20', $value); - } - - /** - * Builds a query string from an array of elements - * - * @param array Array of elements - * @return string Assembled query string - */ - public static function createQueryStringFromArray($queryString) - { - return count($queryString) > 0 ? '?' . implode('&', $queryString) : ''; - } - - /** - * Get error message from Zend_Http_Response - * - * @param Zend_Http_Response $response Repsonse - * @param string $alternativeError Alternative error message - * @return string - */ - protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') - { - $response = $this->_parseResponse($response); - if ($response && $response->Message) { - return (string)$response->Message; - } else { - return $alternativeError; - } - } - - /** - * The Get Operation Status operation returns the status of the specified operation. - * After calling an asynchronous operation, you can call Get Operation Status to - * determine whether the operation has succeed, failed, or is still in progress. - * - * @param string $requestId The request ID. If omitted, the last request ID will be used. - * @return Zend_Service_WindowsAzure_Management_OperationStatusInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getOperationStatus($requestId = '') - { - if ($requestId == '') { - $requestId = $this->getLastRequestId(); - } - - $response = $this->_performRequest(self::OP_OPERATIONS . '/' . $requestId); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!is_null($result)) { - return new Zend_Service_WindowsAzure_Management_OperationStatusInstance( - (string)$result->ID, - (string)$result->Status, - ($result->Error ? (string)$result->Error->Code : ''), - ($result->Error ? (string)$result->Error->Message : '') - ); - } - return null; - } else { - #require_once 'Zend/Service/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - - - /** - * The List Subscription Operations operation returns a list of create, update, - * and delete operations that were performed on a subscription during the specified timeframe. - * Documentation on the parameters can be found at http://msdn.microsoft.com/en-us/library/gg715318.aspx. - * - * @param string $startTime The start of the timeframe to begin listing subscription operations in UTC format. This parameter and the $endTime parameter indicate the timeframe to retrieve subscription operations. This parameter cannot indicate a start date of more than 90 days in the past. - * @param string $endTime The end of the timeframe to begin listing subscription operations in UTC format. This parameter and the $startTime parameter indicate the timeframe to retrieve subscription operations. - * @param string $objectIdFilter Returns subscription operations only for the specified object type and object ID. - * @param string $operationResultFilter Returns subscription operations only for the specified result status, either Succeeded, Failed, or InProgress. - * @param string $continuationToken Internal usage. - * @return array Array of Zend_Service_WindowsAzure_Management_SubscriptionOperationInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listSubscriptionOperations($startTime, $endTime, $objectIdFilter = null, $operationResultFilter = null, $continuationToken = null) - { - if ($startTime == '' || is_null($startTime)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Start time should be specified.'); - } - if ($endTime == '' || is_null($endTime)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('End time should be specified.'); - } - if ($operationResultFilter != '' && !is_null($operationResultFilter)) { - $operationResultFilter = strtolower($operationResultFilter); - if ($operationResultFilter != 'succeeded' && $operationResultFilter != 'failed' && $operationResultFilter != 'inprogress') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('OperationResultFilter should be succeeded|failed|inprogress.'); - } - } - - $parameters = array(); - $parameters[] = 'StartTime=' . $startTime; - $parameters[] = 'EndTime=' . $endTime; - if ($objectIdFilter != '' && !is_null($objectIdFilter)) { - $parameters[] = 'ObjectIdFilter=' . $objectIdFilter; - } - if ($operationResultFilter != '' && !is_null($operationResultFilter)) { - $parameters[] = 'OperationResultFilter=' . ucfirst($operationResultFilter); - } - if ($continuationToken != '' && !is_null($continuationToken)) { - $parameters[] = 'ContinuationToken=' . $continuationToken; - } - - $response = $this->_performRequest(self::OP_OPERATIONS, '?' . implode('&', $parameters)); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - $namespaces = $result->getDocNamespaces(); - $result->registerXPathNamespace('__empty_ns', $namespaces['']); - - $xmlOperations = $result->xpath('//__empty_ns:SubscriptionOperation'); - - // Create return value - $returnValue = array(); - foreach ($xmlOperations as $xmlOperation) { - // Create operation instance - $operation = new Zend_Service_WindowsAzure_Management_SubscriptionOperationInstance( - $xmlOperation->OperationId, - $xmlOperation->OperationObjectId, - $xmlOperation->OperationName, - array(), - (array)$xmlOperation->OperationCaller, - (array)$xmlOperation->OperationStatus - ); - - // Parse parameters - $xmlOperation->registerXPathNamespace('__empty_ns', $namespaces['']); - $xmlParameters = $xmlOperation->xpath('.//__empty_ns:OperationParameter'); - foreach ($xmlParameters as $xmlParameter) { - $xmlParameterDetails = $xmlParameter->children('http://schemas.datacontract.org/2004/07/Microsoft.Samples.WindowsAzure.ServiceManagement'); - $operation->addOperationParameter((string)$xmlParameterDetails->Name, (string)$xmlParameterDetails->Value); - } - - // Add to result - $returnValue[] = $operation; - } - - // More data? - if (!is_null($result->ContinuationToken) && $result->ContinuationToken != '') { - $returnValue = array_merge($returnValue, $this->listSubscriptionOperations($startTime, $endTime, $objectIdFilter, $operationResultFilter, (string)$result->ContinuationToken)); - } - - // Return - return $returnValue; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Wait for an operation to complete - * - * @param string $requestId The request ID. If omitted, the last request ID will be used. - * @param int $sleepInterval Sleep interval in milliseconds. - * @return Zend_Service_WindowsAzure_Management_OperationStatusInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function waitForOperation($requestId = '', $sleepInterval = 250) - { - if ($requestId == '') { - $requestId = $this->getLastRequestId(); - } - if ($requestId == '' || is_null($requestId)) { - return null; - } - - $status = $this->getOperationStatus($requestId); - while ($status->Status == 'InProgress') { - $status = $this->getOperationStatus($requestId); - usleep($sleepInterval); - } - - return $status; - } - - /** - * Creates a new Zend_Service_WindowsAzure_Storage_Blob instance for the current account - * - * @param string $serviceName the service name to create a storage client for. - * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests - * @return Zend_Service_WindowsAzure_Storage_Blob - */ - public function createBlobClientForService($serviceName, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) - { - if ($serviceName == '' || is_null($serviceName)) { - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $storageKeys = $this->getStorageAccountKeys($serviceName); - - - - return new Zend_Service_WindowsAzure_Storage_Blob( - Zend_Service_WindowsAzure_Storage::URL_CLOUD_BLOB, - $serviceName, - $storageKeys[0], - false, - $retryPolicy - ); - } - - /** - * Creates a new Zend_Service_WindowsAzure_Storage_Table instance for the current account - * - * @param string $serviceName the service name to create a storage client for. - * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests - * @return Zend_Service_WindowsAzure_Storage_Table - */ - public function createTableClientForService($serviceName, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $storageKeys = $this->getStorageAccountKeys($serviceName); - - return new Zend_Service_WindowsAzure_Storage_Table( - Zend_Service_WindowsAzure_Storage::URL_CLOUD_TABLE, - $serviceName, - $storageKeys[0], - false, - $retryPolicy - ); - } - - /** - * Creates a new Zend_Service_WindowsAzure_Storage_Queue instance for the current account - * - * @param string $serviceName the service name to create a storage client for. - * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests - * @return Zend_Service_WindowsAzure_Storage_Queue - */ - public function createQueueClientForService($serviceName, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $storageKeys = $this->getStorageAccountKeys($serviceName); - - #require_once 'Zend/Service/WindowsAzure/Storage/Queue.php'; - - return new Zend_Service_WindowsAzure_Storage_Queue( - Zend_Service_WindowsAzure_Storage::URL_CLOUD_QUEUE, - $serviceName, - $storageKeys[0], - false, - $retryPolicy - ); - } - - /** - * The List Storage Accounts operation lists the storage accounts available under - * the current subscription. - * - * @return array An array of Zend_Service_WindowsAzure_Management_StorageServiceInstance - */ - public function listStorageAccounts() - { - $response = $this->_performRequest(self::OP_STORAGE_ACCOUNTS); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->StorageService) { - return array(); - } - if (count($result->StorageService) > 1) { - $xmlServices = $result->StorageService; - } else { - $xmlServices = array($result->StorageService); - } - - $services = array(); - if (!is_null($xmlServices)) { - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_StorageServiceInstance( - (string)$xmlServices[$i]->Url, - (string)$xmlServices[$i]->ServiceName - ); - } - } - return $services; - } else { - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Storage Account Properties operation returns the system properties for the - * specified storage account. These properties include: the address, description, and - * label of the storage account; and the name of the affinity group to which the service - * belongs, or its geo-location if it is not part of an affinity group. - * - * @param string $serviceName The name of your service. - * @return Zend_Service_WindowsAzure_Management_StorageServiceInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getStorageAccountProperties($serviceName) - { - if ($serviceName == '' || is_null($serviceName)) { - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $response = $this->_performRequest(self::OP_STORAGE_ACCOUNTS . '/' . $serviceName); - - if ($response->isSuccessful()) { - $xmlService = $this->_parseResponse($response); - - if (!is_null($xmlService)) { - #require_once 'Zend/Service/WindowsAzure/Management/StorageServiceInstance.php'; - - return new Zend_Service_WindowsAzure_Management_StorageServiceInstance( - (string)$xmlService->Url, - (string)$xmlService->ServiceName, - (string)$xmlService->StorageServiceProperties->Description, - (string)$xmlService->StorageServiceProperties->AffinityGroup, - (string)$xmlService->StorageServiceProperties->Location, - (string)$xmlService->StorageServiceProperties->Label - ); - } - return null; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Storage Keys operation returns the primary - * and secondary access keys for the specified storage account. - * - * @param string $serviceName The name of your service. - * @return array An array of strings - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getStorageAccountKeys($serviceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $response = $this->_performRequest(self::OP_STORAGE_ACCOUNTS . '/' . $serviceName . '/keys'); - - if ($response->isSuccessful()) { - $xmlService = $this->_parseResponse($response); - - if (!is_null($xmlService)) { - return array( - (string)$xmlService->StorageServiceKeys->Primary, - (string)$xmlService->StorageServiceKeys->Secondary - ); - } - return array(); - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Regenerate Keys operation regenerates the primary - * or secondary access key for the specified storage account. - * - * @param string $serviceName The name of your service. - * @param string $key The key to regenerate (primary or secondary) - * @return array An array of strings - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function regenerateStorageAccountKey($serviceName, $key = 'primary') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $key = strtolower($key); - if ($key != 'primary' && $key != 'secondary') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Key identifier should be primary|secondary.'); - } - - $response = $this->_performRequest( - self::OP_STORAGE_ACCOUNTS . '/' . $serviceName . '/keys', '?action=regenerate', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml'), - ' - - ' . ucfirst($key) . ' - '); - - if ($response->isSuccessful()) { - $xmlService = $this->_parseResponse($response); - - if (!is_null($xmlService)) { - return array( - (string)$xmlService->StorageServiceKeys->Primary, - (string)$xmlService->StorageServiceKeys->Secondary - ); - } - return array(); - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List Hosted Services operation lists the hosted services available - * under the current subscription. - * - * @return array An array of Zend_Service_WindowsAzure_Management_HostedServiceInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listHostedServices() - { - $response = $this->_performRequest(self::OP_HOSTED_SERVICES); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->HostedService) { - return array(); - } - if (count($result->HostedService) > 1) { - $xmlServices = $result->HostedService; - } else { - $xmlServices = array($result->HostedService); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_HostedServiceInstance( - (string)$xmlServices[$i]->Url, - (string)$xmlServices[$i]->ServiceName - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Create Hosted Service operation creates a new hosted service in Windows Azure. - * - * @param string $serviceName A name for the hosted service that is unique to the subscription. - * @param string $label A label for the hosted service. The label may be up to 100 characters in length. - * @param string $description A description for the hosted service. The description may be up to 1024 characters in length. - * @param string $location Required if AffinityGroup is not specified. The location where the hosted service will be created. - * @param string $affinityGroup Required if Location is not specified. The name of an existing affinity group associated with this subscription. - */ - public function createHostedService($serviceName, $label, $description = '', $location = null, $affinityGroup = null) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if (strlen($description) > 1024) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Description is too long. The maximum length is 1024 characters.'); - } - if ( (is_null($location) && is_null($affinityGroup)) || (!is_null($location) && !is_null($affinityGroup)) ) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Please specify a location -or- an affinity group for the service.'); - } - - $locationOrAffinityGroup = is_null($location) - ? '' . $affinityGroup . '' - : '' . $location . ''; - - $response = $this->_performRequest(self::OP_HOSTED_SERVICES, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $serviceName . '' . $description . '' . $locationOrAffinityGroup . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Update Hosted Service operation updates the label and/or the description for a hosted service in Windows Azure. - * - * @param string $serviceName A name for the hosted service that is unique to the subscription. - * @param string $label A label for the hosted service. The label may be up to 100 characters in length. - * @param string $description A description for the hosted service. The description may be up to 1024 characters in length. - */ - public function updateHostedService($serviceName, $label, $description = '') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - - $response = $this->_performRequest(self::OP_HOSTED_SERVICES . '/' . $serviceName, '', - Zend_Http_Client::PUT, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $description . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Delete Hosted Service operation deletes the specified hosted service in Windows Azure. - * - * @param string $serviceName A name for the hosted service that is unique to the subscription. - */ - public function deleteHostedService($serviceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $response = $this->_performRequest(self::OP_HOSTED_SERVICES . '/' . $serviceName, '', Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Hosted Service Properties operation retrieves system properties - * for the specified hosted service. These properties include the service - * name and service type; the name of the affinity group to which the service - * belongs, or its location if it is not part of an affinity group; and - * optionally, information on the service's deployments. - * - * @param string $serviceName The name of your service. - * @return Zend_Service_WindowsAzure_Management_HostedServiceInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getHostedServiceProperties($serviceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $response = $this->_performRequest(self::OP_HOSTED_SERVICES . '/' . $serviceName, '?embed-detail=true'); - - if ($response->isSuccessful()) { - $xmlService = $this->_parseResponse($response); - - if (!is_null($xmlService)) { - - $returnValue = new Zend_Service_WindowsAzure_Management_HostedServiceInstance( - (string)$xmlService->Url, - (string)$xmlService->ServiceName, - (string)$xmlService->HostedServiceProperties->Description, - (string)$xmlService->HostedServiceProperties->AffinityGroup, - (string)$xmlService->HostedServiceProperties->Location, - (string)$xmlService->HostedServiceProperties->Label - ); - - // Deployments - if (count($xmlService->Deployments->Deployment) > 1) { - $xmlServices = $xmlService->Deployments->Deployment; - } else { - $xmlServices = array($xmlService->Deployments->Deployment); - } - - $deployments = array(); - foreach ($xmlServices as $xmlDeployment) { - $deployments[] = $this->_convertXmlElementToDeploymentInstance($xmlDeployment); - } - $returnValue->Deployments = $deployments; - - return $returnValue; - } - return null; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Create Deployment operation uploads a new service package - * and creates a new deployment on staging or production. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $name The name for the deployment. The deployment ID as listed on the Windows Azure management portal must be unique among other deployments for the hosted service. - * @param string $label A URL that refers to the location of the service package in the Blob service. The service package must be located in a storage account beneath the same subscription. - * @param string $packageUrl The service configuration file for the deployment. - * @param string $configuration A label for this deployment, up to 100 characters in length. - * @param boolean $startDeployment Indicates whether to start the deployment immediately after it is created. - * @param boolean $treatWarningsAsErrors Indicates whether to treat package validation warnings as errors. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function createDeployment($serviceName, $deploymentSlot, $name, $label, $packageUrl, $configuration, $startDeployment = false, $treatWarningsAsErrors = false) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($name == '' || is_null($name)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Name should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if ($packageUrl == '' || is_null($packageUrl)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Package URL should be specified.'); - } - if ($configuration == '' || is_null($configuration)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Configuration should be specified.'); - } - - if (@file_exists($configuration)) { - $configuration = utf8_decode(file_get_contents($configuration)); - } - - // Clean up the configuration - $conformingConfiguration = $this->_cleanConfiguration($configuration); - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - $response = $this->_performRequest($operationUrl, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $name . '' . $packageUrl . '' . base64_encode($conformingConfiguration) . '' . ($startDeployment ? 'true' : 'false') . '' . ($treatWarningsAsErrors ? 'true' : 'false') . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Deployment operation returns configuration information, status, - * and system properties for the specified deployment. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @return Zend_Service_WindowsAzure_Management_DeploymentInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getDeploymentBySlot($serviceName, $deploymentSlot) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_getDeployment($operationUrl); - } - - /** - * The Get Deployment operation returns configuration information, status, - * and system properties for the specified deployment. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @return Zend_Service_WindowsAzure_Management_DeploymentInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getDeploymentByDeploymentId($serviceName, $deploymentId) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_getDeployment($operationUrl); - } - - /** - * The Get Deployment operation returns configuration information, status, - * and system properties for the specified deployment. - * - * @param string $operationUrl The operation url - * @return Zend_Service_WindowsAzure_Management_DeploymentInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _getDeployment($operationUrl) - { - $response = $this->_performRequest($operationUrl); - - if ($response->isSuccessful()) { - $xmlService = $this->_parseResponse($response); - - return $this->_convertXmlElementToDeploymentInstance($xmlService); - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Swap Deployment operation initiates a virtual IP swap between - * the staging and production deployment environments for a service. - * If the service is currently running in the staging environment, - * it will be swapped to the production environment. If it is running - * in the production environment, it will be swapped to staging. - * - * @param string $serviceName The service name. - * @param string $productionDeploymentName The name of the production deployment. - * @param string $sourceDeploymentName The name of the source deployment. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function swapDeployment($serviceName, $productionDeploymentName, $sourceDeploymentName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($productionDeploymentName == '' || is_null($productionDeploymentName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Production Deployment ID should be specified.'); - } - if ($sourceDeploymentName == '' || is_null($sourceDeploymentName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Source Deployment ID should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName; - $response = $this->_performRequest($operationUrl, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $productionDeploymentName . '' . $sourceDeploymentName . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Delete Deployment operation deletes the specified deployment. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function deleteDeploymentBySlot($serviceName, $deploymentSlot) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_deleteDeployment($operationUrl); - } - - /** - * The Delete Deployment operation deletes the specified deployment. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function deleteDeploymentByDeploymentId($serviceName, $deploymentId) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_deleteDeployment($operationUrl); - } - - /** - * The Delete Deployment operation deletes the specified deployment. - * - * @param string $operationUrl The operation url - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _deleteDeployment($operationUrl) - { - $response = $this->_performRequest($operationUrl, '', Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Update Deployment Status operation initiates a change in deployment status. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $status The deployment status (running|suspended) - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function updateDeploymentStatusBySlot($serviceName, $deploymentSlot, $status = 'running') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - $status = strtolower($status); - if ($status != 'running' && $status != 'suspended') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Status should be running|suspended.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_updateDeploymentStatus($operationUrl, $status); - } - - /** - * The Update Deployment Status operation initiates a change in deployment status. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param string $status The deployment status (running|suspended) - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function updateDeploymentStatusByDeploymentId($serviceName, $deploymentId, $status = 'running') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - $status = strtolower($status); - if ($status != 'running' && $status != 'suspended') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Status should be running|suspended.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_updateDeploymentStatus($operationUrl, $status); - } - - /** - * The Update Deployment Status operation initiates a change in deployment status. - * - * @param string $operationUrl The operation url - * @param string $status The deployment status (running|suspended) - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _updateDeploymentStatus($operationUrl, $status = 'running') - { - $response = $this->_performRequest($operationUrl . '/', '?comp=status', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . ucfirst($status) . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Converts an XmlElement into a Zend_Service_WindowsAzure_Management_DeploymentInstance - * - * @param object $xmlService The XML Element - * @return Zend_Service_WindowsAzure_Management_DeploymentInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _convertXmlElementToDeploymentInstance($xmlService) - { - if (!is_null($xmlService)) { - - $returnValue = new Zend_Service_WindowsAzure_Management_DeploymentInstance( - (string)$xmlService->Name, - (string)$xmlService->DeploymentSlot, - (string)$xmlService->PrivateID, - (string)$xmlService->Label, - (string)$xmlService->Url, - (string)$xmlService->Configuration, - (string)$xmlService->Status, - (string)$xmlService->UpgradeStatus, - (string)$xmlService->UpgradeType, - (string)$xmlService->CurrentUpgradeDomainState, - (string)$xmlService->CurrentUpgradeDomain, - (string)$xmlService->UpgradeDomainCount - ); - - // Append role instances - if ($xmlService->RoleInstanceList && $xmlService->RoleInstanceList->RoleInstance) { - $xmlRoleInstances = $xmlService->RoleInstanceList->RoleInstance; - if (count($xmlService->RoleInstanceList->RoleInstance) == 1) { - $xmlRoleInstances = array($xmlService->RoleInstanceList->RoleInstance); - } - - $roleInstances = array(); - if (!is_null($xmlRoleInstances)) { - for ($i = 0; $i < count($xmlRoleInstances); $i++) { - $roleInstances[] = array( - 'rolename' => (string)$xmlRoleInstances[$i]->RoleName, - 'instancename' => (string)$xmlRoleInstances[$i]->InstanceName, - 'instancestatus' => (string)$xmlRoleInstances[$i]->InstanceStatus - ); - } - } - - $returnValue->RoleInstanceList = $roleInstances; - } - - // Append roles - if ($xmlService->RoleList && $xmlService->RoleList->Role) { - $xmlRoles = $xmlService->RoleList->Role; - if (count($xmlService->RoleList->Role) == 1) { - $xmlRoles = array($xmlService->RoleList->Role); - } - - $roles = array(); - if (!is_null($xmlRoles)) { - for ($i = 0; $i < count($xmlRoles); $i++) { - $roles[] = array( - 'rolename' => (string)$xmlRoles[$i]->RoleName, - 'osversion' => (!is_null($xmlRoles[$i]->OsVersion) ? (string)$xmlRoles[$i]->OsVersion : (string)$xmlRoles[$i]->OperatingSystemVersion) - ); - } - } - $returnValue->RoleList = $roles; - } - - return $returnValue; - } - return null; - } - - /** - * Updates a deployment's role instance count. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string|array $roleName The role name - * @param string|array $instanceCount The instance count - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function setInstanceCountBySlot($serviceName, $deploymentSlot, $roleName, $instanceCount) { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($roleName == '' || is_null($roleName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role name name should be specified.'); - } - - // Get configuration - $deployment = $this->getDeploymentBySlot($serviceName, $deploymentSlot); - $configuration = $deployment->Configuration; - $configuration = $this->_updateInstanceCountInConfiguration($roleName, $instanceCount, $configuration); - - // Update configuration - $this->configureDeploymentBySlot($serviceName, $deploymentSlot, $configuration); - } - - /** - * Updates a deployment's role instance count. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string|array $roleName The role name - * @param string|array $instanceCount The instance count - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function setInstanceCountByDeploymentId($serviceName, $deploymentId, $roleName, $instanceCount) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - if ($roleName == '' || is_null($roleName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role name name should be specified.'); - } - - // Get configuration - $deployment = $this->getDeploymentByDeploymentId($serviceName, $deploymentId); - $configuration = $deployment->Configuration; - $configuration = $this->_updateInstanceCountInConfiguration($roleName, $instanceCount, $configuration); - - // Update configuration - $this->configureDeploymentByDeploymentId($serviceName, $deploymentId, $configuration); - } - - /** - * Updates instance count in configuration XML. - * - * @param string|array $roleName The role name - * @param string|array $instanceCount The instance count - * @param string $configuration XML configuration represented as a string - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _updateInstanceCountInConfiguration($roleName, $instanceCount, $configuration) { - // Change variables - if (!is_array($roleName)) { - $roleName = array($roleName); - } - if (!is_array($instanceCount)) { - $instanceCount = array($instanceCount); - } - - $configuration = preg_replace('/(<\?xml[^?]+?)utf-16/i', '$1utf-8', $configuration); - //$configuration = '' . substr($configuration, strpos($configuration, '>') + 2); - - $xml = Zend_Xml_Security::scan($configuration); - - // http://www.php.net/manual/en/simplexmlelement.xpath.php#97818 - $namespaces = $xml->getDocNamespaces(); - $xml->registerXPathNamespace('__empty_ns', $namespaces['']); - - for ($i = 0; $i < count($roleName); $i++) { - $elements = $xml->xpath('//__empty_ns:Role[@name="' . $roleName[$i] . '"]/__empty_ns:Instances'); - - if (count($elements) == 1) { - $element = $elements[0]; - $element['count'] = $instanceCount[$i]; - } - } - - $configuration = $xml->asXML(); - //$configuration = preg_replace('/(<\?xml[^?]+?)utf-8/i', '$1utf-16', $configuration); - - return $configuration; - } - - /** - * The Change Deployment Configuration request may be specified as follows. - * Note that you can change a deployment's configuration either by specifying the deployment - * environment (staging or production), or by specifying the deployment's unique name. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $configuration XML configuration represented as a string - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function configureDeploymentBySlot($serviceName, $deploymentSlot, $configuration) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($configuration == '' || is_null($configuration)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Configuration name should be specified.'); - } - - if (@file_exists($configuration)) { - $configuration = utf8_decode(file_get_contents($configuration)); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_configureDeployment($operationUrl, $configuration); - } - - /** - * The Change Deployment Configuration request may be specified as follows. - * Note that you can change a deployment's configuration either by specifying the deployment - * environment (staging or production), or by specifying the deployment's unique name. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param string $configuration XML configuration represented as a string - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function configureDeploymentByDeploymentId($serviceName, $deploymentId, $configuration) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - if ($configuration == '' || is_null($configuration)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Configuration name should be specified.'); - } - - if (@file_exists($configuration)) { - $configuration = utf8_decode(file_get_contents($configuration)); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_configureDeployment($operationUrl, $configuration); - } - - /** - * The Change Deployment Configuration request may be specified as follows. - * Note that you can change a deployment's configuration either by specifying the deployment - * environment (staging or production), or by specifying the deployment's unique name. - * - * @param string $operationUrl The operation url - * @param string $configuration XML configuration represented as a string - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _configureDeployment($operationUrl, $configuration) - { - // Clean up the configuration - $conformingConfiguration = $this->_cleanConfiguration($configuration); - - $response = $this->_performRequest($operationUrl . '/', '?comp=config', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . base64_encode($conformingConfiguration) . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Upgrade Deployment operation initiates an upgrade. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $label A URL that refers to the location of the service package in the Blob service. The service package must be located in a storage account beneath the same subscription. - * @param string $packageUrl The service configuration file for the deployment. - * @param string $configuration A label for this deployment, up to 100 characters in length. - * @param string $mode The type of upgrade to initiate. Possible values are Auto or Manual. - * @param string $roleToUpgrade The name of the specific role to upgrade. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function upgradeDeploymentBySlot($serviceName, $deploymentSlot, $label, $packageUrl, $configuration, $mode = 'auto', $roleToUpgrade = null) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if ($packageUrl == '' || is_null($packageUrl)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Package URL should be specified.'); - } - if ($configuration == '' || is_null($configuration)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Configuration should be specified.'); - } - $mode = strtolower($mode); - if ($mode != 'auto' && $mode != 'manual') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Mode should be auto|manual.'); - } - - if (@file_exists($configuration)) { - $configuration = utf8_decode(file_get_contents($configuration)); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_upgradeDeployment($operationUrl, $label, $packageUrl, $configuration, $mode, $roleToUpgrade); - } - - /** - * The Upgrade Deployment operation initiates an upgrade. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param string $label A URL that refers to the location of the service package in the Blob service. The service package must be located in a storage account beneath the same subscription. - * @param string $packageUrl The service configuration file for the deployment. - * @param string $configuration A label for this deployment, up to 100 characters in length. - * @param string $mode The type of upgrade to initiate. Possible values are Auto or Manual. - * @param string $roleToUpgrade The name of the specific role to upgrade. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function upgradeDeploymentByDeploymentId($serviceName, $deploymentId, $label, $packageUrl, $configuration, $mode = 'auto', $roleToUpgrade = null) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if ($packageUrl == '' || is_null($packageUrl)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Package URL should be specified.'); - } - if ($configuration == '' || is_null($configuration)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Configuration should be specified.'); - } - $mode = strtolower($mode); - if ($mode != 'auto' && $mode != 'manual') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Mode should be auto|manual.'); - } - - if (@file_exists($configuration)) { - $configuration = utf8_decode(file_get_contents($configuration)); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_upgradeDeployment($operationUrl, $label, $packageUrl, $configuration, $mode, $roleToUpgrade); - } - - - /** - * The Upgrade Deployment operation initiates an upgrade. - * - * @param string $operationUrl The operation url - * @param string $label A URL that refers to the location of the service package in the Blob service. The service package must be located in a storage account beneath the same subscription. - * @param string $packageUrl The service configuration file for the deployment. - * @param string $configuration A label for this deployment, up to 100 characters in length. - * @param string $mode The type of upgrade to initiate. Possible values are Auto or Manual. - * @param string $roleToUpgrade The name of the specific role to upgrade. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _upgradeDeployment($operationUrl, $label, $packageUrl, $configuration, $mode, $roleToUpgrade) - { - // Clean up the configuration - $conformingConfiguration = $this->_cleanConfiguration($configuration); - - $response = $this->_performRequest($operationUrl . '/', '?comp=upgrade', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . ucfirst($mode) . '' . $packageUrl . '' . base64_encode($conformingConfiguration) . '' . (!is_null($roleToUpgrade) ? '' . $roleToUpgrade . '' : '') . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Walk Upgrade Domain operation specifies the next upgrade domain to be walked during an in-place upgrade. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param int $upgradeDomain An integer value that identifies the upgrade domain to walk. Upgrade domains are identified with a zero-based index: the first upgrade domain has an ID of 0, the second has an ID of 1, and so on. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function walkUpgradeDomainBySlot($serviceName, $deploymentSlot, $upgradeDomain = 0) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot; - return $this->_walkUpgradeDomain($operationUrl, $upgradeDomain); - } - - /** - * The Walk Upgrade Domain operation specifies the next upgrade domain to be walked during an in-place upgrade. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param int $upgradeDomain An integer value that identifies the upgrade domain to walk. Upgrade domains are identified with a zero-based index: the first upgrade domain has an ID of 0, the second has an ID of 1, and so on. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function walkUpgradeDomainByDeploymentId($serviceName, $deploymentId, $upgradeDomain = 0) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId; - return $this->_walkUpgradeDomain($operationUrl, $upgradeDomain); - } - - - /** - * The Walk Upgrade Domain operation specifies the next upgrade domain to be walked during an in-place upgrade. - * - * @param string $operationUrl The operation url - * @param int $upgradeDomain An integer value that identifies the upgrade domain to walk. Upgrade domains are identified with a zero-based index: the first upgrade domain has an ID of 0, the second has an ID of 1, and so on. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _walkUpgradeDomain($operationUrl, $upgradeDomain = 0) - { - $response = $this->_performRequest($operationUrl . '/', '?comp=walkupgradedomain', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $upgradeDomain . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Reboot Role Instance operation requests a reboot of a role instance - * that is running in a deployment. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $roleInstanceName The role instance name - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function rebootRoleInstanceBySlot($serviceName, $deploymentSlot, $roleInstanceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($roleInstanceName == '' || is_null($roleInstanceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role instance name should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot . '/roleinstances/' . $roleInstanceName; - return $this->_rebootOrReimageRoleInstance($operationUrl, 'reboot'); - } - - /** - * The Reboot Role Instance operation requests a reboot of a role instance - * that is running in a deployment. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param string $roleInstanceName The role instance name - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function rebootRoleInstanceByDeploymentId($serviceName, $deploymentId, $roleInstanceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - if ($roleInstanceName == '' || is_null($roleInstanceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role instance name should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId . '/roleinstances/' . $roleInstanceName; - return $this->_rebootOrReimageRoleInstance($operationUrl, 'reboot'); - } - - /** - * The Reimage Role Instance operation requests a reimage of a role instance - * that is running in a deployment. - * - * @param string $serviceName The service name - * @param string $deploymentSlot The deployment slot (production or staging) - * @param string $roleInstanceName The role instance name - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function reimageRoleInstanceBySlot($serviceName, $deploymentSlot, $roleInstanceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - $deploymentSlot = strtolower($deploymentSlot); - if ($deploymentSlot != 'production' && $deploymentSlot != 'staging') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment slot should be production|staging.'); - } - if ($roleInstanceName == '' || is_null($roleInstanceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role instance name should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deploymentslots/' . $deploymentSlot . '/roleinstances/' . $roleInstanceName; - return $this->_rebootOrReimageRoleInstance($operationUrl, 'reimage'); - } - - /** - * The Reimage Role Instance operation requests a reimage of a role instance - * that is running in a deployment. - * - * @param string $serviceName The service name - * @param string $deploymentId The deployment ID as listed on the Windows Azure management portal - * @param string $roleInstanceName The role instance name - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function reimageRoleInstanceByDeploymentId($serviceName, $deploymentId, $roleInstanceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($deploymentId == '' || is_null($deploymentId)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Deployment ID should be specified.'); - } - if ($roleInstanceName == '' || is_null($roleInstanceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Role instance name should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/deployments/' . $deploymentId . '/roleinstances/' . $roleInstanceName; - return $this->_rebootOrReimageRoleInstance($operationUrl, 'reimage'); - } - - /** - * Reboots or reimages a role instance. - * - * @param string $operationUrl The operation url - * @param string $operation The operation (reboot|reimage) - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - protected function _rebootOrReimageRoleInstance($operationUrl, $operation = 'reboot') - { - $response = $this->_performRequest($operationUrl, '?comp=' . $operation, Zend_Http_Client::POST); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List Certificates operation lists all certificates associated with - * the specified hosted service. - * - * @param string $serviceName The service name - * @return array Array of Zend_Service_WindowsAzure_Management_CertificateInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listCertificates($serviceName) - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/certificates'; - $response = $this->_performRequest($operationUrl); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->Certificate) { - return array(); - } - if (count($result->Certificate) > 1) { - $xmlServices = $result->Certificate; - } else { - $xmlServices = array($result->Certificate); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_CertificateInstance( - (string)$xmlServices[$i]->CertificateUrl, - (string)$xmlServices[$i]->Thumbprint, - (string)$xmlServices[$i]->ThumbprintAlgorithm, - (string)$xmlServices[$i]->Data - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Certificate operation returns the public data for the specified certificate. - * - * @param string $serviceName|$certificateUrl The service name -or- the certificate URL - * @param string $algorithm Algorithm - * @param string $thumbprint Thumbprint - * @return Zend_Service_WindowsAzure_Management_CertificateInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getCertificate($serviceName, $algorithm = '', $thumbprint = '') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name or certificate URL should be specified.'); - } - if (strpos($serviceName, 'https') === false && ($algorithm == '' || is_null($algorithm)) && ($thumbprint == '' || is_null($thumbprint))) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Algorithm and thumbprint should be specified.'); - } - - $operationUrl = str_replace($this->getBaseUrl(), '', $serviceName); - if (strpos($serviceName, 'https') === false) { - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/certificates/' . $algorithm . '-' . strtoupper($thumbprint); - } - - $response = $this->_performRequest($operationUrl); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - return new Zend_Service_WindowsAzure_Management_CertificateInstance( - $this->getBaseUrl() . $operationUrl, - $algorithm, - $thumbprint, - (string)$result->Data - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Add Certificate operation adds a certificate to the subscription. - * - * @param string $serviceName The service name - * @param string $certificateData Certificate data - * @param string $certificatePassword The certificate password - * @param string $certificateFormat The certificate format. Currently, only 'pfx' is supported. - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function addCertificate($serviceName, $certificateData, $certificatePassword, $certificateFormat = 'pfx') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name should be specified.'); - } - if ($certificateData == '' || is_null($certificateData)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Certificate data should be specified.'); - } - if ($certificatePassword == '' || is_null($certificatePassword)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Certificate password should be specified.'); - } - if ($certificateFormat != 'pfx') { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Certificate format should be "pfx".'); - } - - if (@file_exists($certificateData)) { - $certificateData = file_get_contents($certificateData); - } - - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/certificates'; - $response = $this->_performRequest($operationUrl, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . base64_encode($certificateData) . '' . $certificateFormat . '' . $certificatePassword . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Delete Certificate operation deletes a certificate from the subscription's certificate store. - * - * @param string $serviceName|$certificateUrl The service name -or- the certificate URL - * @param string $algorithm Algorithm - * @param string $thumbprint Thumbprint - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function deleteCertificate($serviceName, $algorithm = '', $thumbprint = '') - { - if ($serviceName == '' || is_null($serviceName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Service name or certificate URL should be specified.'); - } - if (strpos($serviceName, 'https') === false && ($algorithm == '' || is_null($algorithm)) && ($thumbprint == '' || is_null($thumbprint))) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Algorithm and thumbprint should be specified.'); - } - - $operationUrl = str_replace($this->getBaseUrl(), '', $serviceName); - if (strpos($serviceName, 'https') === false) { - $operationUrl = self::OP_HOSTED_SERVICES . '/' . $serviceName . '/certificates/' . $algorithm . '-' . strtoupper($thumbprint); - } - - $response = $this->_performRequest($operationUrl, '', Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List Affinity Groups operation lists the affinity groups associated with - * the specified subscription. - * - * @return array Array of Zend_Service_WindowsAzure_Management_AffinityGroupInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listAffinityGroups() - { - $response = $this->_performRequest(self::OP_AFFINITYGROUPS); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->AffinityGroup) { - return array(); - } - if (count($result->AffinityGroup) > 1) { - $xmlServices = $result->AffinityGroup; - } else { - $xmlServices = array($result->AffinityGroup); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_AffinityGroupInstance( - (string)$xmlServices[$i]->Name, - (string)$xmlServices[$i]->Label, - (string)$xmlServices[$i]->Description, - (string)$xmlServices[$i]->Location - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Create Affinity Group operation creates a new affinity group for the specified subscription. - * - * @param string $name A name for the affinity group that is unique to the subscription. - * @param string $label A label for the affinity group. The label may be up to 100 characters in length. - * @param string $description A description for the affinity group. The description may be up to 1024 characters in length. - * @param string $location The location where the affinity group will be created. To list available locations, use the List Locations operation. - */ - public function createAffinityGroup($name, $label, $description = '', $location = '') - { - if ($name == '' || is_null($name)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Affinity group name should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if (strlen($description) > 1024) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Description is too long. The maximum length is 1024 characters.'); - } - if ($location == '' || is_null($location)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Location should be specified.'); - } - - $response = $this->_performRequest(self::OP_AFFINITYGROUPS, '', - Zend_Http_Client::POST, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $name . '' . $description . '' . $location . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Update Affinity Group operation updates the label and/or the description for an affinity group for the specified subscription. - * - * @param string $name The name for the affinity group that should be updated. - * @param string $label A label for the affinity group. The label may be up to 100 characters in length. - * @param string $description A description for the affinity group. The description may be up to 1024 characters in length. - */ - public function updateAffinityGroup($name, $label, $description = '') - { - if ($name == '' || is_null($name)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Affinity group name should be specified.'); - } - if ($label == '' || is_null($label)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label should be specified.'); - } - if (strlen($label) > 100) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Label is too long. The maximum length is 100 characters.'); - } - if (strlen($description) > 1024) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Description is too long. The maximum length is 1024 characters.'); - } - - $response = $this->_performRequest(self::OP_AFFINITYGROUPS . '/' . $name, '', - Zend_Http_Client::PUT, - array('Content-Type' => 'application/xml; charset=utf-8'), - '' . $description . ''); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Delete Affinity Group operation deletes an affinity group in the specified subscription. - * - * @param string $name The name for the affinity group that should be deleted. - */ - public function deleteAffinityGroup($name) - { - if ($name == '' || is_null($name)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Affinity group name should be specified.'); - } - - $response = $this->_performRequest(self::OP_AFFINITYGROUPS . '/' . $name, '', - Zend_Http_Client::DELETE); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The Get Affinity Group Properties operation returns the - * system properties associated with the specified affinity group. - * - * @param string $affinityGroupName The affinity group name. - * @return Zend_Service_WindowsAzure_Management_AffinityGroupInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function getAffinityGroupProperties($affinityGroupName) - { - if ($affinityGroupName == '' || is_null($affinityGroupName)) { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception('Affinity group name should be specified.'); - } - - $response = $this->_performRequest(self::OP_AFFINITYGROUPS . '/' . $affinityGroupName); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - $affinityGroup = new Zend_Service_WindowsAzure_Management_AffinityGroupInstance( - $affinityGroupName, - (string)$result->Label, - (string)$result->Description, - (string)$result->Location - ); - - // Hosted services - if (count($result->HostedServices->HostedService) > 1) { - $xmlService = $result->HostedServices->HostedService; - } else { - $xmlService = array($result->HostedServices->HostedService); - } - - $services = array(); - if (!is_null($xmlService)) { - for ($i = 0; $i < count($xmlService); $i++) { - $services[] = array( - 'url' => (string)$xmlService[$i]->Url, - 'name' => (string)$xmlService[$i]->ServiceName - ); - } - } - $affinityGroup->HostedServices = $services; - - // Storage services - if (count($result->StorageServices->StorageService) > 1) { - $xmlService = $result->StorageServices->StorageService; - } else { - $xmlService = array($result->StorageServices->StorageService); - } - - $services = array(); - if (!is_null($xmlService)) { - for ($i = 0; $i < count($xmlService); $i++) { - $services[] = array( - 'url' => (string)$xmlService[$i]->Url, - 'name' => (string)$xmlService[$i]->ServiceName - ); - } - } - $affinityGroup->StorageServices = $services; - - return $affinityGroup; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List Locations operation lists all of the data center locations - * that are valid for your subscription. - * - * @return array Array of Zend_Service_WindowsAzure_Management_LocationInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listLocations() - { - $response = $this->_performRequest(self::OP_LOCATIONS); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->Location) { - return array(); - } - if (count($result->Location) > 1) { - $xmlServices = $result->Location; - } else { - $xmlServices = array($result->Location); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_LocationInstance( - (string)$xmlServices[$i]->Name - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List Operating Systems operation lists the versions of the guest operating system - * that are currently available in Windows Azure. The 2010-10-28 version of List Operating - * Systems also indicates what family an operating system version belongs to. - * Currently Windows Azure supports two operating system families: the Windows Azure guest - * operating system that is substantially compatible with Windows Server 2008 SP2, - * and the Windows Azure guest operating system that is substantially compatible with - * Windows Server 2008 R2. - * - * @return array Array of Zend_Service_WindowsAzure_Management_OperatingSystemInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listOperatingSystems() - { - $response = $this->_performRequest(self::OP_OPERATINGSYSTEMS); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->OperatingSystem) { - return array(); - } - if (count($result->OperatingSystem) > 1) { - $xmlServices = $result->OperatingSystem; - } else { - $xmlServices = array($result->OperatingSystem); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_OperatingSystemInstance( - (string)$xmlServices[$i]->Version, - (string)$xmlServices[$i]->Label, - ((string)$xmlServices[$i]->IsDefault == 'true'), - ((string)$xmlServices[$i]->IsActive == 'true'), - (string)$xmlServices[$i]->Family, - (string)$xmlServices[$i]->FamilyLabel - ); - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * The List OS Families operation lists the guest operating system families - * available in Windows Azure, and also lists the operating system versions - * available for each family. Currently Windows Azure supports two operating - * system families: the Windows Azure guest operating system that is - * substantially compatible with Windows Server 2008 SP2, and the Windows - * Azure guest operating system that is substantially compatible with - * Windows Server 2008 R2. - * - * @return array Array of Zend_Service_WindowsAzure_Management_OperatingSystemFamilyInstance - * @throws Zend_Service_WindowsAzure_Management_Exception - */ - public function listOperatingSystemFamilies() - { - $response = $this->_performRequest(self::OP_OPERATINGSYSTEMFAMILIES); - - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - - if (!$result->OperatingSystemFamily) { - return array(); - } - if (count($result->OperatingSystemFamily) > 1) { - $xmlServices = $result->OperatingSystemFamily; - } else { - $xmlServices = array($result->OperatingSystemFamily); - } - - $services = array(); - if (!is_null($xmlServices)) { - - for ($i = 0; $i < count($xmlServices); $i++) { - $services[] = new Zend_Service_WindowsAzure_Management_OperatingSystemFamilyInstance( - (string)$xmlServices[$i]->Name, - (string)$xmlServices[$i]->Label - ); - - if (count($xmlServices[$i]->OperatingSystems->OperatingSystem) > 1) { - $xmlOperatingSystems = $xmlServices[$i]->OperatingSystems->OperatingSystem; - } else { - $xmlOperatingSystems = array($xmlServices[$i]->OperatingSystems->OperatingSystem); - } - - $operatingSystems = array(); - if (!is_null($xmlOperatingSystems)) { - #require_once 'Zend/Service/WindowsAzure/Management/OperatingSystemInstance.php'; - for ($i = 0; $i < count($xmlOperatingSystems); $i++) { - $operatingSystems[] = new Zend_Service_WindowsAzure_Management_OperatingSystemInstance( - (string)$xmlOperatingSystems[$i]->Version, - (string)$xmlOperatingSystems[$i]->Label, - ((string)$xmlOperatingSystems[$i]->IsDefault == 'true'), - ((string)$xmlOperatingSystems[$i]->IsActive == 'true'), - (string)$xmlServices[$i]->Name, - (string)$xmlServices[$i]->Label - ); - } - } - $services[ count($services) - 1 ]->OperatingSystems = $operatingSystems; - } - } - return $services; - } else { - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Clean configuration - * - * @param string $configuration Configuration to clean. - * @return string - */ - public function _cleanConfiguration($configuration) { - $configuration = str_replace('?_data = array( - 'name' => $name, - 'deploymentslot' => $deploymentSlot, - 'privateid' => $privateID, - 'label' => base64_decode($label), - 'url' => $url, - 'configuration' => base64_decode($configuration), - 'status' => $status, - 'upgradestatus' => $upgradeStatus, - 'upgradetype' => $upgradeType, - 'currentupgradedomainstate' => $currentUpgradeDomainState, - 'currentupgradedomain' => $currentUpgradeDomain, - 'upgradedomaincount' => $upgradeDomainCount, - 'roleinstancelist' => $roleInstanceList, - 'rolelist' => $roleList - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/Exception.php b/library/Zend/Service/WindowsAzure/Management/Exception.php deleted file mode 100644 index fc389b8424..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/Exception.php +++ /dev/null @@ -1,38 +0,0 @@ -_data = array( - 'url' => $url, - 'servicename' => $serviceName, - 'description' => $description, - 'affinitygroup' => $affinityGroup, - 'location' => $location, - 'label' => base64_decode($label), - 'deployments' => $deployments - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/LocationInstance.php b/library/Zend/Service/WindowsAzure/Management/LocationInstance.php deleted file mode 100644 index e2554fd8be..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/LocationInstance.php +++ /dev/null @@ -1,51 +0,0 @@ -_data = array( - 'name' => $name - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/OperatingSystemFamilyInstance.php b/library/Zend/Service/WindowsAzure/Management/OperatingSystemFamilyInstance.php deleted file mode 100644 index 4f91e3c3c4..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/OperatingSystemFamilyInstance.php +++ /dev/null @@ -1,57 +0,0 @@ -_data = array( - 'name' => $name, - 'label' => base64_decode($label), - 'operatingsystems' => $operatingSystems - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/OperatingSystemInstance.php b/library/Zend/Service/WindowsAzure/Management/OperatingSystemInstance.php deleted file mode 100644 index 41be13ceb1..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/OperatingSystemInstance.php +++ /dev/null @@ -1,66 +0,0 @@ -_data = array( - 'version' => $version, - 'label' => base64_decode($label), - 'isdefault' => $isDefault, - 'isactive' => $isActive, - 'family' => $family, - 'familylabel' => base64_decode($familyLabel) - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/OperationStatusInstance.php b/library/Zend/Service/WindowsAzure/Management/OperationStatusInstance.php deleted file mode 100644 index 76bf45c91d..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/OperationStatusInstance.php +++ /dev/null @@ -1,60 +0,0 @@ -_data = array( - 'id' => $id, - 'status' => $status, - 'errorcode' => $errorCode, - 'errormessage' => $errorMessage - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/ServiceEntityAbstract.php b/library/Zend/Service/WindowsAzure/Management/ServiceEntityAbstract.php deleted file mode 100644 index 985ea069c1..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/ServiceEntityAbstract.php +++ /dev/null @@ -1,67 +0,0 @@ -_data)) { - $this->_data[strtolower($name)] = $value; - return; - } - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception("Unknown property: " . $name); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - if (array_key_exists(strtolower($name), $this->_data)) { - return $this->_data[strtolower($name)]; - } - #require_once 'Zend/Service/WindowsAzure/Management/Exception.php'; - throw new Zend_Service_WindowsAzure_Management_Exception("Unknown property: " . $name); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/StorageServiceInstance.php b/library/Zend/Service/WindowsAzure/Management/StorageServiceInstance.php deleted file mode 100644 index e0f8106f6d..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/StorageServiceInstance.php +++ /dev/null @@ -1,66 +0,0 @@ -_data = array( - 'url' => $url, - 'servicename' => $serviceName, - 'description' => $description, - 'affinitygroup' => $affinityGroup, - 'location' => $location, - 'label' => base64_decode($label) - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Management/SubscriptionOperationInstance.php b/library/Zend/Service/WindowsAzure/Management/SubscriptionOperationInstance.php deleted file mode 100644 index eda0b72b08..0000000000 --- a/library/Zend/Service/WindowsAzure/Management/SubscriptionOperationInstance.php +++ /dev/null @@ -1,77 +0,0 @@ -_data = array( - 'operationid' => $operationId, - 'operationobjectid' => $operationObjectId, - 'operationname' => $operationName, - 'operationparameters' => $operationParameters, - 'operationcaller' => $operationCaller, - 'operationstatus' => $operationStatus - ); - } - - /** - * Add operation parameter - * - * @param string $name Name - * @param string $value Value - */ - public function addOperationParameter($name, $value) - { - $this->_data['operationparameters'][$name] = $value; - } -} diff --git a/library/Zend/Service/WindowsAzure/RetryPolicy/Exception.php b/library/Zend/Service/WindowsAzure/RetryPolicy/Exception.php deleted file mode 100644 index 01d53ada62..0000000000 --- a/library/Zend/Service/WindowsAzure/RetryPolicy/Exception.php +++ /dev/null @@ -1,36 +0,0 @@ -_retryCount = $count; - $this->_retryInterval = $intervalBetweenRetries; - } - - /** - * Execute function under retry policy - * - * @param string|array $function Function to execute - * @param array $parameters Parameters for function call - * @return mixed - */ - public function execute($function, $parameters = array()) - { - $returnValue = null; - - for ($retriesLeft = $this->_retryCount; $retriesLeft >= 0; --$retriesLeft) { - try { - $returnValue = call_user_func_array($function, $parameters); - return $returnValue; - } catch (Exception $ex) { - if ($retriesLeft == 1) { - #require_once 'Zend/Service/WindowsAzure/RetryPolicy/Exception.php'; - throw new Zend_Service_WindowsAzure_RetryPolicy_Exception("Exceeded retry count of " . $this->_retryCount . ". " . $ex->getMessage()); - } - - usleep($this->_retryInterval * 1000); - } - } - } -} diff --git a/library/Zend/Service/WindowsAzure/RetryPolicy/RetryPolicyAbstract.php b/library/Zend/Service/WindowsAzure/RetryPolicy/RetryPolicyAbstract.php deleted file mode 100644 index 8018946c90..0000000000 --- a/library/Zend/Service/WindowsAzure/RetryPolicy/RetryPolicyAbstract.php +++ /dev/null @@ -1,72 +0,0 @@ -_storage = $storage; - $this->_storageType = $storageType; - $this->_sessionContainer = $sessionContainer; - $this->_sessionContainerPartition = $sessionContainerPartition; - } - - /** - * Registers the current session handler as PHP's session handler - * - * @return boolean - */ - public function register() - { - return session_set_save_handler(array($this, 'open'), - array($this, 'close'), - array($this, 'read'), - array($this, 'write'), - array($this, 'destroy'), - array($this, 'gc') - ); - } - - /** - * Open the session store - * - * @return bool - */ - public function open() - { - // Make sure storage container exists - if ($this->_storageType == self::STORAGE_TYPE_TABLE) { - $this->_storage->createTableIfNotExists($this->_sessionContainer); - } else if ($this->_storageType == self::STORAGE_TYPE_BLOB) { - $this->_storage->createContainerIfNotExists($this->_sessionContainer); - } - - // Ok! - return true; - } - - /** - * Close the session store - * - * @return bool - */ - public function close() - { - return true; - } - - /** - * Read a specific session - * - * @param int $id Session Id - * @return string - */ - public function read($id) - { - // Read data - if ($this->_storageType == self::STORAGE_TYPE_TABLE) { - // In table storage - try - { - $sessionRecord = $this->_storage->retrieveEntityById( - $this->_sessionContainer, - $this->_sessionContainerPartition, - $id - ); - return unserialize(base64_decode($sessionRecord->serializedData)); - } - catch (Zend_Service_WindowsAzure_Exception $ex) - { - return ''; - } - } else if ($this->_storageType == self::STORAGE_TYPE_BLOB) { - // In blob storage - try - { - $data = $this->_storage->getBlobData( - $this->_sessionContainer, - $this->_sessionContainerPartition . '/' . $id - ); - return unserialize(base64_decode($data)); - } - catch (Zend_Service_WindowsAzure_Exception $ex) - { - return false; - } - } - } - - /** - * Write a specific session - * - * @param int $id Session Id - * @param string $serializedData Serialized PHP object - * @throws Exception - */ - public function write($id, $serializedData) - { - // Encode data - $serializedData = base64_encode(serialize($serializedData)); - if (strlen($serializedData) >= self::MAX_TS_PROPERTY_SIZE && $this->_storageType == self::STORAGE_TYPE_TABLE) { - throw new Zend_Service_WindowsAzure_Exception('Session data exceeds the maximum allowed size of ' . self::MAX_TS_PROPERTY_SIZE . ' bytes that can be stored using table storage. Consider switching to a blob storage back-end or try reducing session data size.'); - } - - // Store data - if ($this->_storageType == self::STORAGE_TYPE_TABLE) { - // In table storage - $sessionRecord = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($this->_sessionContainerPartition, $id); - $sessionRecord->sessionExpires = time(); - $sessionRecord->serializedData = $serializedData; - - $sessionRecord->setAzurePropertyType('sessionExpires', 'Edm.Int32'); - - try - { - $this->_storage->updateEntity($this->_sessionContainer, $sessionRecord); - } - catch (Zend_Service_WindowsAzure_Exception $unknownRecord) - { - $this->_storage->insertEntity($this->_sessionContainer, $sessionRecord); - } - } else if ($this->_storageType == self::STORAGE_TYPE_BLOB) { - // In blob storage - $this->_storage->putBlobData( - $this->_sessionContainer, - $this->_sessionContainerPartition . '/' . $id, - $serializedData, - array('sessionexpires' => time()) - ); - } - } - - /** - * Destroy a specific session - * - * @param int $id Session Id - * @return boolean - */ - public function destroy($id) - { - // Destroy data - if ($this->_storageType == self::STORAGE_TYPE_TABLE) { - // In table storage - try - { - $sessionRecord = $this->_storage->retrieveEntityById( - $this->_sessionContainer, - $this->_sessionContainerPartition, - $id - ); - $this->_storage->deleteEntity($this->_sessionContainer, $sessionRecord); - - return true; - } - catch (Zend_Service_WindowsAzure_Exception $ex) - { - return false; - } - } else if ($this->_storageType == self::STORAGE_TYPE_BLOB) { - // In blob storage - try - { - $this->_storage->deleteBlob( - $this->_sessionContainer, - $this->_sessionContainerPartition . '/' . $id - ); - - return true; - } - catch (Zend_Service_WindowsAzure_Exception $ex) - { - return false; - } - } - } - - /** - * Garbage collector - * - * @param int $lifeTime Session maximal lifetime - * @see session.gc_divisor 100 - * @see session.gc_maxlifetime 1440 - * @see session.gc_probability 1 - * @usage Execution rate 1/100 (session.gc_probability/session.gc_divisor) - * @return boolean - */ - public function gc($lifeTime) - { - if ($this->_storageType == self::STORAGE_TYPE_TABLE) { - // In table storage - try - { - $result = $this->_storage->retrieveEntities($this->_sessionContainer, 'PartitionKey eq \'' . $this->_sessionContainerPartition . '\' and sessionExpires lt ' . (time() - $lifeTime)); - foreach ($result as $sessionRecord) - { - $this->_storage->deleteEntity($this->_sessionContainer, $sessionRecord); - } - return true; - } - catch (Zend_Service_WindowsAzure_exception $ex) - { - return false; - } - } else if ($this->_storageType == self::STORAGE_TYPE_BLOB) { - // In blob storage - try - { - $result = $this->_storage->listBlobs($this->_sessionContainer, $this->_sessionContainerPartition, '', null, null, 'metadata'); - foreach ($result as $sessionRecord) - { - if ($sessionRecord->Metadata['sessionexpires'] < (time() - $lifeTime)) { - $this->_storage->deleteBlob($this->_sessionContainer, $sessionRecord->Name); - } - } - return true; - } - catch (Zend_Service_WindowsAzure_exception $ex) - { - return false; - } - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage.php b/library/Zend/Service/WindowsAzure/Storage.php deleted file mode 100644 index d486abd8d3..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage.php +++ /dev/null @@ -1,564 +0,0 @@ -_host = $host; - $this->_accountName = $accountName; - $this->_accountKey = $accountKey; - $this->_usePathStyleUri = $usePathStyleUri; - - // Using local storage? - if (!$this->_usePathStyleUri - && ($this->_host == self::URL_DEV_BLOB - || $this->_host == self::URL_DEV_QUEUE - || $this->_host == self::URL_DEV_TABLE) - ) { - // Local storage - $this->_usePathStyleUri = true; - } - - if (is_null($this->_credentials)) { - $this->_credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey( - $this->_accountName, $this->_accountKey, $this->_usePathStyleUri); - } - - $this->_retryPolicy = $retryPolicy; - if (is_null($this->_retryPolicy)) { - $this->_retryPolicy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::noRetry(); - } - - // Setup default Zend_Http_Client channel - $options = array( - 'adapter' => 'Zend_Http_Client_Adapter_Proxy' - ); - if (function_exists('curl_init')) { - // Set cURL options if cURL is used afterwards - $options['curloptions'] = array( - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_TIMEOUT => 120, - ); - } - $this->_httpClientChannel = new Zend_Http_Client(null, $options); - } - - /** - * Set the HTTP client channel to use - * - * @param Zend_Http_Client_Adapter_Interface|string $adapterInstance Adapter instance or adapter class name. - */ - public function setHttpClientChannel($adapterInstance = 'Zend_Http_Client_Adapter_Proxy') - { - $this->_httpClientChannel->setAdapter($adapterInstance); - } - - /** - * Retrieve HTTP client channel - * - * @return Zend_Http_Client_Adapter_Interface - */ - public function getHttpClientChannel() - { - return $this->_httpClientChannel; - } - - /** - * Set retry policy to use when making requests - * - * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests - */ - public function setRetryPolicy(Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) - { - $this->_retryPolicy = $retryPolicy; - if (is_null($this->_retryPolicy)) { - $this->_retryPolicy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::noRetry(); - } - } - - /** - * Set proxy - * - * @param boolean $useProxy Use proxy? - * @param string $proxyUrl Proxy URL - * @param int $proxyPort Proxy port - * @param string $proxyCredentials Proxy credentials - */ - public function setProxy($useProxy = false, $proxyUrl = '', $proxyPort = 80, $proxyCredentials = '') - { - $this->_useProxy = $useProxy; - $this->_proxyUrl = $proxyUrl; - $this->_proxyPort = $proxyPort; - $this->_proxyCredentials = $proxyCredentials; - - if ($this->_useProxy) { - $credentials = explode(':', $this->_proxyCredentials); - - $this->_httpClientChannel->setConfig(array( - 'proxy_host' => $this->_proxyUrl, - 'proxy_port' => $this->_proxyPort, - 'proxy_user' => $credentials[0], - 'proxy_pass' => $credentials[1], - )); - } else { - $this->_httpClientChannel->setConfig(array( - 'proxy_host' => '', - 'proxy_port' => 8080, - 'proxy_user' => '', - 'proxy_pass' => '', - )); - } - } - - /** - * Returns the Windows Azure account name - * - * @return string - */ - public function getAccountName() - { - return $this->_accountName; - } - - /** - * Get base URL for creating requests - * - * @return string - */ - public function getBaseUrl() - { - if ($this->_usePathStyleUri) { - return 'http://' . $this->_host . '/' . $this->_accountName; - } else { - return 'http://' . $this->_accountName . '.' . $this->_host; - } - } - - /** - * Set Zend_Service_WindowsAzure_Credentials_CredentialsAbstract instance - * - * @param Zend_Service_WindowsAzure_Credentials_CredentialsAbstract $credentials Zend_Service_WindowsAzure_Credentials_CredentialsAbstract instance to use for request signing. - */ - public function setCredentials(Zend_Service_WindowsAzure_Credentials_CredentialsAbstract $credentials) - { - $this->_credentials = $credentials; - $this->_credentials->setAccountName($this->_accountName); - $this->_credentials->setAccountkey($this->_accountKey); - $this->_credentials->setUsePathStyleUri($this->_usePathStyleUri); - } - - /** - * Get Zend_Service_WindowsAzure_Credentials_CredentialsAbstract instance - * - * @return Zend_Service_WindowsAzure_Credentials_CredentialsAbstract - */ - public function getCredentials() - { - return $this->_credentials; - } - - /** - * Perform request using Zend_Http_Client channel - * - * @param string $path Path - * @param string $queryString Query string - * @param string $httpVerb HTTP verb the request will use - * @param array $headers x-ms headers to add - * @param boolean $forTableStorage Is the request for table storage? - * @param mixed $rawData Optional RAW HTTP data to be sent over the wire - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return Zend_Http_Response - */ - protected function _performRequest( - $path = '/', - $queryString = '', - $httpVerb = Zend_Http_Client::GET, - $headers = array(), - $forTableStorage = false, - $rawData = null, - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ - ) { - // Clean path - if (strpos($path, '/') !== 0) { - $path = '/' . $path; - } - - // Clean headers - if (is_null($headers)) { - $headers = array(); - } - - // Ensure cUrl will also work correctly: - // - disable Content-Type if required - // - disable Expect: 100 Continue - if (!isset($headers["Content-Type"])) { - $headers["Content-Type"] = ''; - } - $headers["Expect"]= ''; - - // Add version header - $headers['x-ms-version'] = $this->_apiVersion; - - // URL encoding - $path = self::urlencode($path); - $queryString = self::urlencode($queryString); - - // Generate URL and sign request - $requestUrl = $this->_credentials - ->signRequestUrl($this->getBaseUrl() . $path . $queryString, $resourceType, $requiredPermission); - $requestHeaders = $this->_credentials - ->signRequestHeaders($httpVerb, $path, $queryString, $headers, $forTableStorage, $resourceType, $requiredPermission, $rawData); - - // Prepare request - $this->_httpClientChannel->resetParameters(true); - $this->_httpClientChannel->setUri($requestUrl); - $this->_httpClientChannel->setHeaders($requestHeaders); - $this->_httpClientChannel->setRawData($rawData); - - // Execute request - $response = $this->_retryPolicy->execute( - array($this->_httpClientChannel, 'request'), - array($httpVerb) - ); - - return $response; - } - - /** - * Parse result from Zend_Http_Response - * - * @param Zend_Http_Response $response Response from HTTP call - * @return object - * @throws Zend_Service_WindowsAzure_Exception - */ - protected function _parseResponse(Zend_Http_Response $response = null) - { - if (is_null($response)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Response should not be null.'); - } - - $xml = Zend_Xml_Security::scan($response->getBody()); - - if ($xml !== false) { - // Fetch all namespaces - $namespaces = array_merge($xml->getNamespaces(true), $xml->getDocNamespaces(true)); - - // Register all namespace prefixes - foreach ($namespaces as $prefix => $ns) { - if ($prefix != '') { - $xml->registerXPathNamespace($prefix, $ns); - } - } - } - - return $xml; - } - - /** - * Generate metadata headers - * - * @param array $metadata - * @return HTTP headers containing metadata - */ - protected function _generateMetadataHeaders($metadata = array()) - { - // Validate - if (!is_array($metadata)) { - return array(); - } - - // Return headers - $headers = array(); - foreach ($metadata as $key => $value) { - if (strpos($value, "\r") !== false || strpos($value, "\n") !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Metadata cannot contain newline characters.'); - } - - if (!self::isValidMetadataName($key)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Metadata name does not adhere to metadata naming conventions. See http://msdn.microsoft.com/en-us/library/aa664670(VS.71).aspx for more information.'); - } - - $headers["x-ms-meta-" . strtolower($key)] = $value; - } - return $headers; - } - - /** - * Parse metadata headers - * - * @param array $headers HTTP headers containing metadata - * @return array - */ - protected function _parseMetadataHeaders($headers = array()) - { - // Validate - if (!is_array($headers)) { - return array(); - } - - // Return metadata - $metadata = array(); - foreach ($headers as $key => $value) { - if (substr(strtolower($key), 0, 10) == "x-ms-meta-") { - $metadata[str_replace("x-ms-meta-", '', strtolower($key))] = $value; - } - } - return $metadata; - } - - /** - * Parse metadata XML - * - * @param SimpleXMLElement $parentElement Element containing the Metadata element. - * @return array - */ - protected function _parseMetadataElement($element = null) - { - // Metadata present? - if (!is_null($element) && isset($element->Metadata) && !is_null($element->Metadata)) { - return get_object_vars($element->Metadata); - } - - return array(); - } - - /** - * Generate ISO 8601 compliant date string in UTC time zone - * - * @param int $timestamp - * @return string - */ - public function isoDate($timestamp = null) - { - $tz = @date_default_timezone_get(); - @date_default_timezone_set('UTC'); - - if (is_null($timestamp)) { - $timestamp = time(); - } - - $returnValue = str_replace('+00:00', '.0000000Z', @date('c', $timestamp)); - @date_default_timezone_set($tz); - return $returnValue; - } - - /** - * URL encode function - * - * @param string $value Value to encode - * @return string Encoded value - */ - public static function urlencode($value) - { - return str_replace(' ', '%20', $value); - } - - /** - * Is valid metadata name? - * - * @param string $metadataName Metadata name - * @return boolean - */ - public static function isValidMetadataName($metadataName = '') - { - if (preg_match("/^[a-zA-Z0-9_@][a-zA-Z0-9_]*$/", $metadataName) === 0) { - return false; - } - - if ($metadataName == '') { - return false; - } - - return true; - } - - /** - * Builds a query string from an array of elements - * - * @param array Array of elements - * @return string Assembled query string - */ - public static function createQueryStringFromArray($queryString) - { - return count($queryString) > 0 ? '?' . implode('&', $queryString) : ''; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/Batch.php b/library/Zend/Service/WindowsAzure/Storage/Batch.php deleted file mode 100644 index 57ca1f18a9..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/Batch.php +++ /dev/null @@ -1,241 +0,0 @@ -_storageClient = $storageClient; - $this->_baseUrl = $baseUrl; - $this->_beginBatch(); - } - - /** - * Get base URL for creating requests - * - * @return string - */ - public function getBaseUrl() - { - return $this->_baseUrl; - } - - /** - * Starts a new batch operation set - * - * @throws Zend_Service_WindowsAzure_Exception - */ - protected function _beginBatch() - { - $this->_storageClient->setCurrentBatch($this); - } - - /** - * Cleanup current batch - */ - protected function _clean() - { - unset($this->_operations); - $this->_storageClient->setCurrentBatch(null); - $this->_storageClient = null; - unset($this); - } - - /** - * Enlist operation in current batch - * - * @param string $path Path - * @param string $queryString Query string - * @param string $httpVerb HTTP verb the request will use - * @param array $headers x-ms headers to add - * @param boolean $forTableStorage Is the request for table storage? - * @param mixed $rawData Optional RAW HTTP data to be sent over the wire - * @throws Zend_Service_WindowsAzure_Exception - */ - public function enlistOperation($path = '/', $queryString = '', $httpVerb = Zend_Http_Client::GET, $headers = array(), $forTableStorage = false, $rawData = null) - { - // Set _forTableStorage - if ($forTableStorage) { - $this->_forTableStorage = true; - } - - // Set _isSingleSelect - if ($httpVerb == Zend_Http_Client::GET) { - if (count($this->_operations) > 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception("Select operations can only be performed in an empty batch transaction."); - } - $this->_isSingleSelect = true; - } - - // Clean path - if (strpos($path, '/') !== 0) { - $path = '/' . $path; - } - - // Clean headers - if (is_null($headers)) { - $headers = array(); - } - - // URL encoding - $path = Zend_Service_WindowsAzure_Storage::urlencode($path); - $queryString = Zend_Service_WindowsAzure_Storage::urlencode($queryString); - - // Generate URL - $requestUrl = $this->getBaseUrl() . $path . $queryString; - - // Generate $rawData - if (is_null($rawData)) { - $rawData = ''; - } - - // Add headers - if ($httpVerb != Zend_Http_Client::GET) { - $headers['Content-ID'] = count($this->_operations) + 1; - if ($httpVerb != Zend_Http_Client::DELETE) { - $headers['Content-Type'] = 'application/atom+xml;type=entry'; - } - $headers['Content-Length'] = strlen($rawData); - } - - // Generate $operation - $operation = ''; - $operation .= $httpVerb . ' ' . $requestUrl . ' HTTP/1.1' . "\n"; - foreach ($headers as $key => $value) - { - $operation .= $key . ': ' . $value . "\n"; - } - $operation .= "\n"; - - // Add data - $operation .= $rawData; - - // Store operation - $this->_operations[] = $operation; - } - - /** - * Commit current batch - * - * @return Zend_Http_Response - * @throws Zend_Service_WindowsAzure_Exception - */ - public function commit() - { - // Perform batch - $response = $this->_storageClient->performBatch($this->_operations, $this->_forTableStorage, $this->_isSingleSelect); - - // Dispose - $this->_clean(); - - // Parse response - $errors = null; - preg_match_all('/(.*)<\/message>/', $response->getBody(), $errors); - - // Error? - if (count($errors[2]) > 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('An error has occured while committing a batch: ' . $errors[2][0]); - } - - // Return - return $response; - } - - /** - * Rollback current batch - */ - public function rollback() - { - // Dispose - $this->_clean(); - } - - /** - * Get operation count - * - * @return integer - */ - public function getOperationCount() - { - return count($this->_operations); - } - - /** - * Is single select? - * - * @return boolean - */ - public function isSingleSelect() - { - return $this->_isSingleSelect; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/BatchStorageAbstract.php b/library/Zend/Service/WindowsAzure/Storage/BatchStorageAbstract.php deleted file mode 100644 index a849b736db..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/BatchStorageAbstract.php +++ /dev/null @@ -1,174 +0,0 @@ -isInBatch()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Only one batch can be active at a time.'); - } - $this->_currentBatch = $batch; - } - - /** - * Get current batch - * - * @return Zend_Service_WindowsAzure_Storage_Batch - */ - public function getCurrentBatch() - { - return $this->_currentBatch; - } - - /** - * Is there a current batch? - * - * @return boolean - */ - public function isInBatch() - { - return !is_null($this->_currentBatch); - } - - /** - * Starts a new batch operation set - * - * @return Zend_Service_WindowsAzure_Storage_Batch - * @throws Zend_Service_WindowsAzure_Exception - */ - public function startBatch() - { - #require_once 'Zend/Service/WindowsAzure/Storage/Batch.php'; - return new Zend_Service_WindowsAzure_Storage_Batch($this, $this->getBaseUrl()); - } - - /** - * Perform batch using Zend_Http_Client channel, combining all batch operations into one request - * - * @param array $operations Operations in batch - * @param boolean $forTableStorage Is the request for table storage? - * @param boolean $isSingleSelect Is the request a single select statement? - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return Zend_Http_Response - */ - public function performBatch($operations = array(), $forTableStorage = false, $isSingleSelect = false, $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ) - { - // Generate boundaries - $batchBoundary = 'batch_' . md5(time() . microtime()); - $changesetBoundary = 'changeset_' . md5(time() . microtime()); - - // Set headers - $headers = array(); - - // Add version header - $headers['x-ms-version'] = $this->_apiVersion; - - // Add dataservice headers - $headers['DataServiceVersion'] = '1.0;NetFx'; - $headers['MaxDataServiceVersion'] = '1.0;NetFx'; - - // Add content-type header - $headers['Content-Type'] = 'multipart/mixed; boundary=' . $batchBoundary; - - // Set path and query string - $path = '/$batch'; - $queryString = ''; - - // Set verb - $httpVerb = Zend_Http_Client::POST; - - // Generate raw data - $rawData = ''; - - // Single select? - if ($isSingleSelect) { - $operation = $operations[0]; - $rawData .= '--' . $batchBoundary . "\n"; - $rawData .= 'Content-Type: application/http' . "\n"; - $rawData .= 'Content-Transfer-Encoding: binary' . "\n\n"; - $rawData .= $operation; - $rawData .= '--' . $batchBoundary . '--'; - } else { - $rawData .= '--' . $batchBoundary . "\n"; - $rawData .= 'Content-Type: multipart/mixed; boundary=' . $changesetBoundary . "\n\n"; - - // Add operations - foreach ($operations as $operation) - { - $rawData .= '--' . $changesetBoundary . "\n"; - $rawData .= 'Content-Type: application/http' . "\n"; - $rawData .= 'Content-Transfer-Encoding: binary' . "\n\n"; - $rawData .= $operation; - } - $rawData .= '--' . $changesetBoundary . '--' . "\n"; - - $rawData .= '--' . $batchBoundary . '--'; - } - - // Generate URL and sign request - $requestUrl = $this->_credentials->signRequestUrl($this->getBaseUrl() . $path . $queryString, $resourceType, $requiredPermission); - $requestHeaders = $this->_credentials->signRequestHeaders($httpVerb, $path, $queryString, $headers, $forTableStorage, $resourceType, $requiredPermission); - - // Prepare request - $this->_httpClientChannel->resetParameters(true); - $this->_httpClientChannel->setUri($requestUrl); - $this->_httpClientChannel->setHeaders($requestHeaders); - $this->_httpClientChannel->setRawData($rawData); - - // Execute request - $response = $this->_retryPolicy->execute( - array($this->_httpClientChannel, 'request'), - array($httpVerb) - ); - - return $response; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/Blob.php b/library/Zend/Service/WindowsAzure/Storage/Blob.php deleted file mode 100644 index ae867e8619..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/Blob.php +++ /dev/null @@ -1,2142 +0,0 @@ -_apiVersion = '2009-09-19'; - - // SharedAccessSignature credentials - $this->_sharedAccessSignatureCredentials = new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature($accountName, $accountKey, $usePathStyleUri); - } - - /** - * Check if a blob exists - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @return boolean - */ - public function blobExists($containerName = '', $blobName = '', $snapshotId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - - // Get blob instance - try { - $this->getBlobInstance($containerName, $blobName, $snapshotId); - } catch (Zend_Service_WindowsAzure_Exception $e) { - return false; - } - - return true; - } - - /** - * Check if a container exists - * - * @param string $containerName Container name - * @return boolean - */ - public function containerExists($containerName = '') - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // List containers - $containers = $this->listContainers($containerName, 1); - foreach ($containers as $container) { - if ($container->Name == $containerName) { - return true; - } - } - - return false; - } - - /** - * Create container - * - * @param string $containerName Container name - * @param array $metadata Key/value pairs of meta data - * @return object Container properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createContainer($containerName = '', $metadata = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if (!is_array($metadata)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Meta data should be an array of key and value pairs.'); - } - - // Create metadata headers - $headers = array(); - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - - return new Zend_Service_WindowsAzure_Storage_BlobContainer( - $containerName, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Create container if it does not exist - * - * @param string $containerName Container name - * @param array $metadata Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createContainerIfNotExists($containerName = '', $metadata = array()) - { - if (!$this->containerExists($containerName)) { - $this->createContainer($containerName, $metadata); - } - } - - /** - * Get container ACL - * - * @param string $containerName Container name - * @param bool $signedIdentifiers Display only private/blob/container or display signed identifiers? - * @return string Acl, to be compared with Zend_Service_WindowsAzure_Storage_Blob::ACL_* - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getContainerAcl($containerName = '', $signedIdentifiers = false) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container&comp=acl', Zend_Http_Client::GET, array(), false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ); - if ($response->isSuccessful()) { - if ($signedIdentifiers == false) { - // Only private/blob/container - $accessType = $response->getHeader(Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'blob-public-access'); - if (strtolower($accessType) == 'true') { - $accessType = self::ACL_PUBLIC_CONTAINER; - } - return $accessType; - } else { - // Parse result - $result = $this->_parseResponse($response); - if (!$result) { - return array(); - } - - $entries = null; - if ($result->SignedIdentifier) { - if (count($result->SignedIdentifier) > 1) { - $entries = $result->SignedIdentifier; - } else { - $entries = array($result->SignedIdentifier); - } - } - - #require_once 'Zend/Service/WindowsAzure/Storage/SignedIdentifier.php'; - // Return value - $returnValue = array(); - foreach ($entries as $entry) { - $returnValue[] = new Zend_Service_WindowsAzure_Storage_SignedIdentifier( - $entry->Id, - $entry->AccessPolicy ? $entry->AccessPolicy->Start ? $entry->AccessPolicy->Start : '' : '', - $entry->AccessPolicy ? $entry->AccessPolicy->Expiry ? $entry->AccessPolicy->Expiry : '' : '', - $entry->AccessPolicy ? $entry->AccessPolicy->Permission ? $entry->AccessPolicy->Permission : '' : '' - ); - } - - // Return - return $returnValue; - } - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Set container ACL - * - * @param string $containerName Container name - * @param bool $acl Zend_Service_WindowsAzure_Storage_Blob::ACL_* - * @param array $signedIdentifiers Signed identifiers - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setContainerAcl($containerName = '', $acl = self::ACL_PRIVATE, $signedIdentifiers = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Headers - $headers = array(); - - // Acl specified? - if ($acl != self::ACL_PRIVATE && !is_null($acl) && $acl != '') { - $headers[Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'blob-public-access'] = $acl; - } - - // Policies - $policies = null; - if (is_array($signedIdentifiers) && count($signedIdentifiers) > 0) { - $policies = ''; - $policies .= '' . "\r\n"; - $policies .= '' . "\r\n"; - foreach ($signedIdentifiers as $signedIdentifier) { - $policies .= ' ' . "\r\n"; - $policies .= ' ' . $signedIdentifier->Id . '' . "\r\n"; - $policies .= ' ' . "\r\n"; - if ($signedIdentifier->Start != '') - $policies .= ' ' . $signedIdentifier->Start . '' . "\r\n"; - if ($signedIdentifier->Expiry != '') - $policies .= ' ' . $signedIdentifier->Expiry . '' . "\r\n"; - if ($signedIdentifier->Permissions != '') - $policies .= ' ' . $signedIdentifier->Permissions . '' . "\r\n"; - $policies .= ' ' . "\r\n"; - $policies .= ' ' . "\r\n"; - } - $policies .= '' . "\r\n"; - } - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container&comp=acl', Zend_Http_Client::PUT, $headers, false, $policies, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get container - * - * @param string $containerName Container name - * @return Zend_Service_WindowsAzure_Storage_BlobContainer - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getContainer($containerName = '') - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container', Zend_Http_Client::GET, array(), false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ); - if ($response->isSuccessful()) { - // Parse metadata - $metadata = $this->_parseMetadataHeaders($response->getHeaders()); - - // Return container - return new Zend_Service_WindowsAzure_Storage_BlobContainer( - $containerName, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get container metadata - * - * @param string $containerName Container name - * @return array Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getContainerMetadata($containerName = '') - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - return $this->getContainer($containerName)->Metadata; - } - - /** - * Set container metadata - * - * Calling the Set Container Metadata operation overwrites all existing metadata that is associated with the container. It's not possible to modify an individual name/value pair. - * - * @param string $containerName Container name - * @param array $metadata Key/value pairs of meta data - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setContainerMetadata($containerName = '', $metadata = array(), $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if (!is_array($metadata)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Meta data should be an array of key and value pairs.'); - } - if (count($metadata) == 0) { - return; - } - - // Create metadata headers - $headers = array(); - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container&comp=metadata', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Delete container - * - * @param string $containerName Container name - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteContainer($containerName = '', $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Additional headers? - $headers = array(); - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Perform request - $response = $this->_performRequest($containerName, '?restype=container', Zend_Http_Client::DELETE, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * List containers - * - * @param string $prefix Optional. Filters the results to return only containers whose name begins with the specified prefix. - * @param int $maxResults Optional. Specifies the maximum number of containers to return per call to Azure storage. This does NOT affect list size returned by this function. (maximum: 5000) - * @param string $marker Optional string value that identifies the portion of the list to be returned with the next list operation. - * @param string $include Optional. Include this parameter to specify that the container's metadata be returned as part of the response body. (allowed values: '', 'metadata') - * @param int $currentResultCount Current result count (internal use) - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function listContainers($prefix = null, $maxResults = null, $marker = null, $include = null, $currentResultCount = 0) - { - // Build query string - $queryString = array('comp=list'); - if (!is_null($prefix)) { - $queryString[] = 'prefix=' . $prefix; - } - if (!is_null($maxResults)) { - $queryString[] = 'maxresults=' . $maxResults; - } - if (!is_null($marker)) { - $queryString[] = 'marker=' . $marker; - } - if (!is_null($include)) { - $queryString[] = 'include=' . $include; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Perform request - $response = $this->_performRequest('', $queryString, Zend_Http_Client::GET, array(), false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_CONTAINER, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_LIST); - if ($response->isSuccessful()) { - $xmlContainers = $this->_parseResponse($response)->Containers->Container; - $xmlMarker = (string)$this->_parseResponse($response)->NextMarker; - - $containers = array(); - if (!is_null($xmlContainers)) { - for ($i = 0; $i < count($xmlContainers); $i++) { - - $containers[] = new Zend_Service_WindowsAzure_Storage_BlobContainer( - (string)$xmlContainers[$i]->Name, - (string)$xmlContainers[$i]->Etag, - (string)$xmlContainers[$i]->LastModified, - $this->_parseMetadataElement($xmlContainers[$i]) - ); - } - } - $currentResultCount = $currentResultCount + count($containers); - if (!is_null($maxResults) && $currentResultCount < $maxResults) { - if (!is_null($xmlMarker) && $xmlMarker != '') { - $containers = array_merge($containers, $this->listContainers($prefix, $maxResults, $xmlMarker, $include, $currentResultCount)); - } - } - if (!is_null($maxResults) && count($containers) > $maxResults) { - $containers = array_slice($containers, 0, $maxResults); - } - - return $containers; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $localFileName Local file name to be uploaded - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return object Partial blob properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putBlob($containerName = '', $blobName = '', $localFileName = '', $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($localFileName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Local file name is not specified.'); - } - if (!file_exists($localFileName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Local file not found.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Check file size - if (filesize($localFileName) >= self::MAX_BLOB_SIZE) { - return $this->putLargeBlob($containerName, $blobName, $localFileName, $metadata, $leaseId, $additionalHeaders); - } - - // Put the data to Windows Azure Storage - return $this->putBlobData($containerName, $blobName, file_get_contents($localFileName), $metadata, $leaseId, $additionalHeaders); - } - - /** - * Put blob data - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param mixed $data Data to store - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return object Partial blob properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putBlobData($containerName = '', $blobName = '', $data = '', $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Specify blob type - $headers[Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'blob-type'] = self::BLOBTYPE_BLOCK; - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '', Zend_Http_Client::PUT, $headers, false, $data, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - - return new Zend_Service_WindowsAzure_Storage_BlobInstance( - $containerName, - $blobName, - null, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $this->getBaseUrl() . '/' . $containerName . '/' . $blobName, - strlen($data), - '', - '', - '', - false, - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put large blob (> 64 MB) - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $localFileName Local file name to be uploaded - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return object Partial blob properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putLargeBlob($containerName = '', $blobName = '', $localFileName = '', $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($localFileName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Local file name is not specified.'); - } - if (!file_exists($localFileName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Local file not found.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Check file size - if (filesize($localFileName) < self::MAX_BLOB_SIZE) { - return $this->putBlob($containerName, $blobName, $localFileName, $metadata, $leaseId, $additionalHeaders); - } - - // Determine number of parts - $numberOfParts = ceil( filesize($localFileName) / self::MAX_BLOB_TRANSFER_SIZE ); - - // Generate block id's - $blockIdentifiers = array(); - for ($i = 0; $i < $numberOfParts; $i++) { - $blockIdentifiers[] = $this->_generateBlockId($i); - } - - // Open file - $fp = fopen($localFileName, 'r'); - if ($fp === false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Could not open local file.'); - } - - // Upload parts - for ($i = 0; $i < $numberOfParts; $i++) { - // Seek position in file - fseek($fp, $i * self::MAX_BLOB_TRANSFER_SIZE); - - // Read contents - $fileContents = fread($fp, self::MAX_BLOB_TRANSFER_SIZE); - - // Put block - $this->putBlock($containerName, $blobName, $blockIdentifiers[$i], $fileContents, $leaseId); - - // Dispose file contents - $fileContents = null; - unset($fileContents); - } - - // Close file - fclose($fp); - - // Put block list - $this->putBlockList($containerName, $blobName, $blockIdentifiers, $metadata, $leaseId, $additionalHeaders); - - // Return information of the blob - return $this->getBlobInstance($containerName, $blobName, null, $leaseId); - } - - /** - * Put large blob block - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $identifier Block ID - * @param array $contents Contents of the block - * @param string $leaseId Lease identifier - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putBlock($containerName = '', $blobName = '', $identifier = '', $contents = '', $leaseId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($identifier === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Block identifier is not specified.'); - } - if (strlen($contents) > self::MAX_BLOB_TRANSFER_SIZE) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Block size is too big.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Upload - $response = $this->_performRequest($resourceName, '?comp=block&blockid=' . base64_encode($identifier), Zend_Http_Client::PUT, $headers, false, $contents, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put block list - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param array $blockList Array of block identifiers - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putBlockList($containerName = '', $blobName = '', $blockList = array(), $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if (count($blockList) == 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Block list does not contain any elements.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Generate block list - $blocks = ''; - foreach ($blockList as $block) { - $blocks .= ' ' . base64_encode($block) . '' . "\n"; - } - - // Generate block list request - $fileContents = utf8_encode(implode("\n", array( - '', - '', - $blocks, - '' - ))); - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '?comp=blocklist', Zend_Http_Client::PUT, $headers, false, $fileContents, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get block list - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @param integer $type Type of block list to retrieve. 0 = all, 1 = committed, 2 = uncommitted - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlockList($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null, $type = 0) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($type < 0 || $type > 2) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Invalid type of block list to retrieve.'); - } - - // Set $blockListType - $blockListType = 'all'; - if ($type == 1) { - $blockListType = 'committed'; - } - if ($type == 2) { - $blockListType = 'uncommitted'; - } - - // Headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Build query string - $queryString = array('comp=blocklist', 'blocklisttype=' . $blockListType); - if (!is_null($snapshotId)) { - $queryString[] = 'snapshot=' . $snapshotId; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, $queryString, Zend_Http_Client::GET, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ); - if ($response->isSuccessful()) { - // Parse response - $blockList = $this->_parseResponse($response); - - // Create return value - $returnValue = array(); - if ($blockList->CommittedBlocks) { - foreach ($blockList->CommittedBlocks->Block as $block) { - $returnValue['CommittedBlocks'][] = (object)array( - 'Name' => (string)$block->Name, - 'Size' => (string)$block->Size - ); - } - } - if ($blockList->UncommittedBlocks) { - foreach ($blockList->UncommittedBlocks->Block as $block) { - $returnValue['UncommittedBlocks'][] = (object)array( - 'Name' => (string)$block->Name, - 'Size' => (string)$block->Size - ); - } - } - - return $returnValue; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Create page blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param int $size Size of the page blob in bytes - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return object Partial blob properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createPageBlob($containerName = '', $blobName = '', $size = 0, $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if ($size <= 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Page blob size must be specified.'); - } - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Specify blob type & blob length - $headers[Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'blob-type'] = self::BLOBTYPE_PAGE; - $headers[Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'blob-content-length'] = $size; - $headers['Content-Length'] = 0; - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '', Zend_Http_Client::PUT, $headers, false, '', Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - - return new Zend_Service_WindowsAzure_Storage_BlobInstance( - $containerName, - $blobName, - null, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $this->getBaseUrl() . '/' . $containerName . '/' . $blobName, - $size, - '', - '', - '', - false, - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put page in page blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param int $startByteOffset Start byte offset - * @param int $endByteOffset End byte offset - * @param mixed $contents Page contents - * @param string $writeMethod Write method (Zend_Service_WindowsAzure_Storage_Blob::PAGE_WRITE_*) - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putPage($containerName = '', $blobName = '', $startByteOffset = 0, $endByteOffset = 0, $contents = '', $writeMethod = self::PAGE_WRITE_UPDATE, $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if ($startByteOffset % 512 != 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Start byte offset must be a modulus of 512.'); - } - if (($endByteOffset + 1) % 512 != 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('End byte offset must be a modulus of 512 minus 1.'); - } - - // Determine size - $size = strlen($contents); - if ($size >= self::MAX_BLOB_TRANSFER_SIZE) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Page blob size must not be larger than ' + self::MAX_BLOB_TRANSFER_SIZE . ' bytes.'); - } - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Specify range - $headers['Range'] = 'bytes=' . $startByteOffset . '-' . $endByteOffset; - - // Write method - $headers[Zend_Service_WindowsAzure_Storage::PREFIX_STORAGE_HEADER . 'page-write'] = $writeMethod; - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '?comp=page', Zend_Http_Client::PUT, $headers, false, $contents, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put page in page blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param int $startByteOffset Start byte offset - * @param int $endByteOffset End byte offset - * @param string $leaseId Lease identifier - * @return array Array of page ranges - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getPageRegions($containerName = '', $blobName = '', $startByteOffset = 0, $endByteOffset = 0, $leaseId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if ($startByteOffset % 512 != 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Start byte offset must be a modulus of 512.'); - } - if ($endByteOffset > 0 && ($endByteOffset + 1) % 512 != 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('End byte offset must be a modulus of 512 minus 1.'); - } - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Specify range? - if ($endByteOffset > 0) { - $headers['Range'] = 'bytes=' . $startByteOffset . '-' . $endByteOffset; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '?comp=pagelist', Zend_Http_Client::GET, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - $result = $this->_parseResponse($response); - $xmlRanges = null; - if (count($result->PageRange) > 1) { - $xmlRanges = $result->PageRange; - } else { - $xmlRanges = array($result->PageRange); - } - - - $ranges = array(); - - for ($i = 0; $i < count($xmlRanges); $i++) { - $ranges[] = new Zend_Service_WindowsAzure_Storage_PageRegionInstance( - (int)$xmlRanges[$i]->Start, - (int)$xmlRanges[$i]->End - ); - } - - return $ranges; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Copy blob - * - * @param string $sourceContainerName Source container name - * @param string $sourceBlobName Source blob name - * @param string $destinationContainerName Destination container name - * @param string $destinationBlobName Destination blob name - * @param array $metadata Key/value pairs of meta data - * @param string $sourceSnapshotId Source snapshot identifier - * @param string $destinationLeaseId Destination lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd894037.aspx for more information. - * @return object Partial blob properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function copyBlob($sourceContainerName = '', $sourceBlobName = '', $destinationContainerName = '', $destinationBlobName = '', $metadata = array(), $sourceSnapshotId = null, $destinationLeaseId = null, $additionalHeaders = array()) - { - if ($sourceContainerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Source container name is not specified.'); - } - if (!self::isValidContainerName($sourceContainerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Source container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($sourceBlobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Source blob name is not specified.'); - } - if ($destinationContainerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Destination container name is not specified.'); - } - if (!self::isValidContainerName($destinationContainerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Destination container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($destinationBlobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Destination blob name is not specified.'); - } - if ($sourceContainerName === '$root' && strpos($sourceBlobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if ($destinationContainerName === '$root' && strpos($destinationBlobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Create metadata headers - $headers = array(); - if (!is_null($destinationLeaseId)) { - $headers['x-ms-lease-id'] = $destinationLeaseId; - } - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource names - $sourceResourceName = self::createResourceName($sourceContainerName, $sourceBlobName); - if (!is_null($sourceSnapshotId)) { - $sourceResourceName .= '?snapshot=' . $sourceSnapshotId; - } - $destinationResourceName = self::createResourceName($destinationContainerName, $destinationBlobName); - - // Set source blob - $headers["x-ms-copy-source"] = '/' . $this->_accountName . '/' . $sourceResourceName; - - // Perform request - $response = $this->_performRequest($destinationResourceName, '', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - - return new Zend_Service_WindowsAzure_Storage_BlobInstance( - $destinationContainerName, - $destinationBlobName, - null, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $this->getBaseUrl() . '/' . $destinationContainerName . '/' . $destinationBlobName, - 0, - '', - '', - '', - false, - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $localFileName Local file name to store downloaded blob - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlob($containerName = '', $blobName = '', $localFileName = '', $snapshotId = null, $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($localFileName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Local file name is not specified.'); - } - - // Fetch data - file_put_contents($localFileName, $this->getBlobData($containerName, $blobName, $snapshotId, $leaseId, $additionalHeaders)); - } - - /** - * Get blob data - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return mixed Blob contents - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlobData($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - - // Build query string - $queryString = array(); - if (!is_null($snapshotId)) { - $queryString[] = 'snapshot=' . $snapshotId; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Additional headers? - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, $queryString, Zend_Http_Client::GET, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ); - if ($response->isSuccessful()) { - return $response->getBody(); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get blob instance - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return Zend_Service_WindowsAzure_Storage_BlobInstance - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlobInstance($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Build query string - $queryString = array(); - if (!is_null($snapshotId)) { - $queryString[] = 'snapshot=' . $snapshotId; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Additional headers? - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, $queryString, Zend_Http_Client::HEAD, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ); - if ($response->isSuccessful()) { - // Parse metadata - $metadata = $this->_parseMetadataHeaders($response->getHeaders()); - - // Return blob - return new Zend_Service_WindowsAzure_Storage_BlobInstance( - $containerName, - $blobName, - $snapshotId, - $response->getHeader('Etag'), - $response->getHeader('Last-modified'), - $this->getBaseUrl() . '/' . $containerName . '/' . $blobName, - $response->getHeader('Content-Length'), - $response->getHeader('Content-Type'), - $response->getHeader('Content-Encoding'), - $response->getHeader('Content-Language'), - $response->getHeader('Cache-Control'), - $response->getHeader('x-ms-blob-type'), - $response->getHeader('x-ms-lease-status'), - false, - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get blob metadata - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @return array Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlobMetadata($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - return $this->getBlobInstance($containerName, $blobName, $snapshotId, $leaseId)->Metadata; - } - - /** - * Set blob metadata - * - * Calling the Set Blob Metadata operation overwrites all existing metadata that is associated with the blob. It's not possible to modify an individual name/value pair. - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param array $metadata Key/value pairs of meta data - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setBlobMetadata($containerName = '', $blobName = '', $metadata = array(), $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if (count($metadata) == 0) { - return; - } - - // Create metadata headers - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Perform request - $response = $this->_performRequest($containerName . '/' . $blobName, '?comp=metadata', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Set blob properties - * - * All available properties are listed at http://msdn.microsoft.com/en-us/library/ee691966.aspx and should be provided in the $additionalHeaders parameter. - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setBlobProperties($containerName = '', $blobName = '', $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - if (count($additionalHeaders) == 0) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('No additional headers are specified.'); - } - - // Create headers - $headers = array(); - - // Lease set? - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Additional headers? - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Perform request - $response = $this->_performRequest($containerName . '/' . $blobName, '?comp=properties', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get blob properties - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @return Zend_Service_WindowsAzure_Storage_BlobInstance - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getBlobProperties($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - return $this->getBlobInstance($containerName, $blobName, $snapshotId, $leaseId); - } - - /** - * Delete blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $snapshotId Snapshot identifier - * @param string $leaseId Lease identifier - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteBlob($containerName = '', $blobName = '', $snapshotId = null, $leaseId = null, $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Build query string - $queryString = array(); - if (!is_null($snapshotId)) { - $queryString[] = 'snapshot=' . $snapshotId; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Additional headers? - $headers = array(); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, $queryString, Zend_Http_Client::DELETE, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Snapshot blob - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param array $metadata Key/value pairs of meta data - * @param array $additionalHeaders Additional headers. See http://msdn.microsoft.com/en-us/library/dd179371.aspx for more information. - * @return string Date/Time value representing the snapshot identifier. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function snapshotBlob($containerName = '', $blobName = '', $metadata = array(), $additionalHeaders = array()) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Additional headers? - $headers = array(); - foreach ($additionalHeaders as $key => $value) { - $headers[$key] = $value; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '?comp=snapshot', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - if ($response->isSuccessful()) { - return $response->getHeader('x-ms-snapshot'); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Lease blob - See (http://msdn.microsoft.com/en-us/library/ee691972.aspx) - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $leaseAction Lease action (Zend_Service_WindowsAzure_Storage_Blob::LEASE_*) - * @param string $leaseId Lease identifier, required to renew the lease or to release the lease. - * @return Zend_Service_WindowsAzure_Storage_LeaseInstance Lease instance - * @throws Zend_Service_WindowsAzure_Exception - */ - public function leaseBlob($containerName = '', $blobName = '', $leaseAction = self::LEASE_ACQUIRE, $leaseId = null) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - if ($blobName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blob name is not specified.'); - } - if ($containerName === '$root' && strpos($blobName, '/') !== false) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Blobs stored in the root container can not have a name containing a forward slash (/).'); - } - - // Additional headers? - $headers = array(); - $headers['x-ms-lease-action'] = strtolower($leaseAction); - if (!is_null($leaseId)) { - $headers['x-ms-lease-id'] = $leaseId; - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Perform request - $response = $this->_performRequest($resourceName, '?comp=lease', Zend_Http_Client::PUT, $headers, false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_WRITE); - - - - if ($response->isSuccessful()) { - return new Zend_Service_WindowsAzure_Storage_LeaseInstance( - $containerName, - $blobName, - $response->getHeader('x-ms-lease-id'), - $response->getHeader('x-ms-lease-time')); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * List blobs - * - * @param string $containerName Container name - * @param string $prefix Optional. Filters the results to return only blobs whose name begins with the specified prefix. - * @param string $delimiter Optional. Delimiter, i.e. '/', for specifying folder hierarchy - * @param int $maxResults Optional. Specifies the maximum number of blobs to return per call to Azure storage. This does NOT affect list size returned by this function. (maximum: 5000) - * @param string $marker Optional string value that identifies the portion of the list to be returned with the next list operation. - * @param string $include Optional. Specifies that the response should include one or more of the following subsets: '', 'metadata', 'snapshots', 'uncommittedblobs'). Multiple values can be added separated with a comma (,) - * @param int $currentResultCount Current result count (internal use) - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function listBlobs($containerName = '', $prefix = '', $delimiter = '', $maxResults = null, $marker = null, $include = null, $currentResultCount = 0) - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Build query string - $queryString = array('restype=container', 'comp=list'); - if (!is_null($prefix)) { - $queryString[] = 'prefix=' . $prefix; - } - if ($delimiter !== '') { - $queryString[] = 'delimiter=' . $delimiter; - } - if (!is_null($maxResults)) { - $queryString[] = 'maxresults=' . $maxResults; - } - if (!is_null($marker)) { - $queryString[] = 'marker=' . $marker; - } - if (!is_null($include)) { - $queryString[] = 'include=' . $include; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Perform request - $response = $this->_performRequest($containerName, $queryString, Zend_Http_Client::GET, array(), false, null, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_LIST); - if ($response->isSuccessful()) { - // Return value - $blobs = array(); - - // Blobs - $xmlBlobs = $this->_parseResponse($response)->Blobs->Blob; - if (!is_null($xmlBlobs)) { - - for ($i = 0; $i < count($xmlBlobs); $i++) { - $properties = (array)$xmlBlobs[$i]->Properties; - - $blobs[] = new Zend_Service_WindowsAzure_Storage_BlobInstance( - $containerName, - (string)$xmlBlobs[$i]->Name, - (string)$xmlBlobs[$i]->Snapshot, - (string)$properties['Etag'], - (string)$properties['Last-Modified'], - (string)$xmlBlobs[$i]->Url, - (string)$properties['Content-Length'], - (string)$properties['Content-Type'], - (string)$properties['Content-Encoding'], - (string)$properties['Content-Language'], - (string)$properties['Cache-Control'], - (string)$properties['BlobType'], - (string)$properties['LeaseStatus'], - false, - $this->_parseMetadataElement($xmlBlobs[$i]) - ); - } - } - - // Blob prefixes (folders) - $xmlBlobs = $this->_parseResponse($response)->Blobs->BlobPrefix; - - if (!is_null($xmlBlobs)) { - - for ($i = 0; $i < count($xmlBlobs); $i++) { - $blobs[] = new Zend_Service_WindowsAzure_Storage_BlobInstance( - $containerName, - (string)$xmlBlobs[$i]->Name, - null, - '', - '', - '', - 0, - '', - '', - '', - '', - '', - '', - true, - $this->_parseMetadataElement($xmlBlobs[$i]) - ); - } - } - - // More blobs? - $xmlMarker = (string)$this->_parseResponse($response)->NextMarker; - $currentResultCount = $currentResultCount + count($blobs); - if (!is_null($maxResults) && $currentResultCount < $maxResults) { - if (!is_null($xmlMarker) && $xmlMarker != '') { - $blobs = array_merge($blobs, $this->listBlobs($containerName, $prefix, $delimiter, $maxResults, $marker, $include, $currentResultCount)); - } - } - if (!is_null($maxResults) && count($blobs) > $maxResults) { - $blobs = array_slice($blobs, 0, $maxResults); - } - - return $blobs; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Generate shared access URL - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @param string $resource Signed resource - container (c) - blob (b) - * @param string $permissions Signed permissions - read (r), write (w), delete (d) and list (l) - * @param string $start The time at which the Shared Access Signature becomes valid. - * @param string $expiry The time at which the Shared Access Signature becomes invalid. - * @param string $identifier Signed identifier - * @return string - */ - public function generateSharedAccessUrl($containerName = '', $blobName = '', $resource = 'b', $permissions = 'r', $start = '', $expiry = '', $identifier = '') - { - if ($containerName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name is not specified.'); - } - if (!self::isValidContainerName($containerName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Container name does not adhere to container naming conventions. See http://msdn.microsoft.com/en-us/library/dd135715.aspx for more information.'); - } - - // Resource name - $resourceName = self::createResourceName($containerName , $blobName); - - // Generate URL - return $this->getBaseUrl() . '/' . $resourceName . '?' . - $this->_sharedAccessSignatureCredentials->createSignedQueryString( - $resourceName, - '', - $resource, - $permissions, - $start, - $expiry, - $identifier); - } - - /** - * Register this object as stream wrapper client - * - * @param string $name Protocol name - * @return Zend_Service_WindowsAzure_Storage_Blob - */ - public function registerAsClient($name) - { - self::$_wrapperClients[$name] = $this; - return $this; - } - - /** - * Unregister this object as stream wrapper client - * - * @param string $name Protocol name - * @return Zend_Service_WindowsAzure_Storage_Blob - */ - public function unregisterAsClient($name) - { - unset(self::$_wrapperClients[$name]); - return $this; - } - - /** - * Get wrapper client for stream type - * - * @param string $name Protocol name - * @return Zend_Service_WindowsAzure_Storage_Blob - */ - public static function getWrapperClient($name) - { - return self::$_wrapperClients[$name]; - } - - /** - * Register this object as stream wrapper - * - * @param string $name Protocol name - */ - public function registerStreamWrapper($name = 'azure') - { - stream_register_wrapper($name, 'Zend_Service_WindowsAzure_Storage_Blob_Stream'); - $this->registerAsClient($name); - } - - /** - * Unregister this object as stream wrapper - * - * @param string $name Protocol name - * @return Zend_Service_WindowsAzure_Storage_Blob - */ - public function unregisterStreamWrapper($name = 'azure') - { - stream_wrapper_unregister($name); - $this->unregisterAsClient($name); - } - - /** - * Create resource name - * - * @param string $containerName Container name - * @param string $blobName Blob name - * @return string - */ - public static function createResourceName($containerName = '', $blobName = '') - { - // Resource name - $resourceName = $containerName . '/' . $blobName; - if ($containerName === '' || $containerName === '$root') { - $resourceName = $blobName; - } - if ($blobName === '') { - $resourceName = $containerName; - } - - return $resourceName; - } - - /** - * Is valid container name? - * - * @param string $containerName Container name - * @return boolean - */ - public static function isValidContainerName($containerName = '') - { - if ($containerName == '$root') { - return true; - } - - if (preg_match("/^[a-z0-9][a-z0-9-]*$/", $containerName) === 0) { - return false; - } - - if (strpos($containerName, '--') !== false) { - return false; - } - - if (strtolower($containerName) != $containerName) { - return false; - } - - if (strlen($containerName) < 3 || strlen($containerName) > 63) { - return false; - } - - if (substr($containerName, -1) == '-') { - return false; - } - - return true; - } - - /** - * Get error message from Zend_Http_Response - * - * @param Zend_Http_Response $response Repsonse - * @param string $alternativeError Alternative error message - * @return string - */ - protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') - { - $response = $this->_parseResponse($response); - if ($response && $response->Message) { - return (string)$response->Message; - } else { - return $alternativeError; - } - } - - /** - * Generate block id - * - * @param int $part Block number - * @return string Windows Azure Blob Storage block number - */ - protected function _generateBlockId($part = 0) - { - $returnValue = $part; - while (strlen($returnValue) < 64) { - $returnValue = '0' . $returnValue; - } - - return $returnValue; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/Blob/Stream.php b/library/Zend/Service/WindowsAzure/Storage/Blob/Stream.php deleted file mode 100644 index 7083ef08db..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/Blob/Stream.php +++ /dev/null @@ -1,544 +0,0 @@ -_storageClient)) { - $url = explode(':', $path); - if (!$url) { - throw new Zend_Service_WindowsAzure_Exception('Could not parse path "' . $path . '".'); - } - - $this->_storageClient = Zend_Service_WindowsAzure_Storage_Blob::getWrapperClient($url[0]); - if (!$this->_storageClient) { - throw new Zend_Service_WindowsAzure_Exception('No storage client registered for stream type "' . $url[0] . '://".'); - } - } - - return $this->_storageClient; - } - - /** - * Extract container name - * - * @param string $path - * @return string - */ - protected function _getContainerName($path) - { - $url = parse_url($path); - if ($url['host']) { - return $url['host']; - } - - return ''; - } - - /** - * Extract file name - * - * @param string $path - * @return string - */ - protected function _getFileName($path) - { - $url = parse_url($path); - if ($url['host']) { - $fileName = isset($url['path']) ? $url['path'] : $url['host']; - if (strpos($fileName, '/') === 0) { - $fileName = substr($fileName, 1); - } - return $fileName; - } - - return ''; - } - - /** - * Open the stream - * - * @param string $path - * @param string $mode - * @param integer $options - * @param string $opened_path - * @return boolean - */ - public function stream_open($path, $mode, $options, &$opened_path) - { - $this->_fileName = $path; - $this->_temporaryFileName = tempnam(sys_get_temp_dir(), 'azure'); - - // Check the file can be opened - $fh = @fopen($this->_temporaryFileName, $mode); - if ($fh === false) { - return false; - } - fclose($fh); - - // Write mode? - if (strpbrk($mode, 'wax+')) { - $this->_writeMode = true; - } else { - $this->_writeMode = false; - } - - // If read/append, fetch the file - if (!$this->_writeMode || strpbrk($mode, 'ra+')) { - $this->_getStorageClient($this->_fileName)->getBlob( - $this->_getContainerName($this->_fileName), - $this->_getFileName($this->_fileName), - $this->_temporaryFileName - ); - } - - // Open temporary file handle - $this->_temporaryFileHandle = fopen($this->_temporaryFileName, $mode); - - // Ok! - return true; - } - - /** - * Close the stream - * - * @return void - */ - public function stream_close() - { - @fclose($this->_temporaryFileHandle); - - // Upload the file? - if ($this->_writeMode) { - // Make sure the container exists - $containerExists = $this->_getStorageClient($this->_fileName)->containerExists( - $this->_getContainerName($this->_fileName) - ); - if (!$containerExists) { - $this->_getStorageClient($this->_fileName)->createContainer( - $this->_getContainerName($this->_fileName) - ); - } - - // Upload the file - try { - $this->_getStorageClient($this->_fileName)->putBlob( - $this->_getContainerName($this->_fileName), - $this->_getFileName($this->_fileName), - $this->_temporaryFileName - ); - } catch (Zend_Service_WindowsAzure_Exception $ex) { - @unlink($this->_temporaryFileName); - unset($this->_storageClient); - - throw $ex; - } - } - - @unlink($this->_temporaryFileName); - unset($this->_storageClient); - } - - /** - * Read from the stream - * - * @param integer $count - * @return string - */ - public function stream_read($count) - { - if (!$this->_temporaryFileHandle) { - return false; - } - - return fread($this->_temporaryFileHandle, $count); - } - - /** - * Write to the stream - * - * @param string $data - * @return integer - */ - public function stream_write($data) - { - if (!$this->_temporaryFileHandle) { - return 0; - } - - $len = strlen($data); - fwrite($this->_temporaryFileHandle, $data, $len); - return $len; - } - - /** - * End of the stream? - * - * @return boolean - */ - public function stream_eof() - { - if (!$this->_temporaryFileHandle) { - return true; - } - - return feof($this->_temporaryFileHandle); - } - - /** - * What is the current read/write position of the stream? - * - * @return integer - */ - public function stream_tell() - { - return ftell($this->_temporaryFileHandle); - } - - /** - * Update the read/write position of the stream - * - * @param integer $offset - * @param integer $whence - * @return boolean - */ - public function stream_seek($offset, $whence) - { - if (!$this->_temporaryFileHandle) { - return false; - } - - return (fseek($this->_temporaryFileHandle, $offset, $whence) === 0); - } - - /** - * Flush current cached stream data to storage - * - * @return boolean - */ - public function stream_flush() - { - $result = fflush($this->_temporaryFileHandle); - - // Upload the file? - if ($this->_writeMode) { - // Make sure the container exists - $containerExists = $this->_getStorageClient($this->_fileName)->containerExists( - $this->_getContainerName($this->_fileName) - ); - if (!$containerExists) { - $this->_getStorageClient($this->_fileName)->createContainer( - $this->_getContainerName($this->_fileName) - ); - } - - // Upload the file - try { - $this->_getStorageClient($this->_fileName)->putBlob( - $this->_getContainerName($this->_fileName), - $this->_getFileName($this->_fileName), - $this->_temporaryFileName - ); - } catch (Zend_Service_WindowsAzure_Exception $ex) { - @unlink($this->_temporaryFileName); - unset($this->_storageClient); - - throw $ex; - } - } - - return $result; - } - - /** - * Returns data array of stream variables - * - * @return array - */ - public function stream_stat() - { - if (!$this->_temporaryFileHandle) { - return false; - } - - return $this->url_stat($this->_fileName, 0); - } - - /** - * Attempt to delete the item - * - * @param string $path - * @return boolean - */ - public function unlink($path) - { - $this->_getStorageClient($path)->deleteBlob( - $this->_getContainerName($path), - $this->_getFileName($path) - ); - - // Clear the stat cache for this path. - clearstatcache(true, $path); - return true; - } - - /** - * Attempt to rename the item - * - * @param string $path_from - * @param string $path_to - * @return boolean False - */ - public function rename($path_from, $path_to) - { - if ($this->_getContainerName($path_from) != $this->_getContainerName($path_to)) { - throw new Zend_Service_WindowsAzure_Exception('Container name can not be changed.'); - } - - if ($this->_getFileName($path_from) == $this->_getContainerName($path_to)) { - return true; - } - - $this->_getStorageClient($path_from)->copyBlob( - $this->_getContainerName($path_from), - $this->_getFileName($path_from), - $this->_getContainerName($path_to), - $this->_getFileName($path_to) - ); - $this->_getStorageClient($path_from)->deleteBlob( - $this->_getContainerName($path_from), - $this->_getFileName($path_from) - ); - - // Clear the stat cache for the affected paths. - clearstatcache(true, $path_from); - clearstatcache(true, $path_to); - return true; - } - - /** - * Return array of URL variables - * - * @param string $path - * @param integer $flags - * @return array - */ - public function url_stat($path, $flags) - { - $stat = array(); - $stat['dev'] = 0; - $stat['ino'] = 0; - $stat['mode'] = 0; - $stat['nlink'] = 0; - $stat['uid'] = 0; - $stat['gid'] = 0; - $stat['rdev'] = 0; - $stat['size'] = 0; - $stat['atime'] = 0; - $stat['mtime'] = 0; - $stat['ctime'] = 0; - $stat['blksize'] = 0; - $stat['blocks'] = 0; - - $info = null; - try { - $info = $this->_getStorageClient($path)->getBlobInstance( - $this->_getContainerName($path), - $this->_getFileName($path) - ); - $stat['size'] = $info->Size; - - // Set the modification time and last modified to the Last-Modified header. - $lastmodified = strtotime($info->LastModified); - $stat['mtime'] = $lastmodified; - $stat['ctime'] = $lastmodified; - - // Entry is a regular file. - $stat['mode'] = 0100000; - - return array_values($stat) + $stat; - } catch (Zend_Service_WindowsAzure_Exception $ex) { - // Unexisting file... - return false; - } - } - - /** - * Create a new directory - * - * @param string $path - * @param integer $mode - * @param integer $options - * @return boolean - */ - public function mkdir($path, $mode, $options) - { - if ($this->_getContainerName($path) == $this->_getFileName($path)) { - // Create container - try { - $this->_getStorageClient($path)->createContainer( - $this->_getContainerName($path) - ); - return true; - } catch (Zend_Service_WindowsAzure_Exception $ex) { - return false; - } - } else { - throw new Zend_Service_WindowsAzure_Exception('mkdir() with multiple levels is not supported on Windows Azure Blob Storage.'); - } - } - - /** - * Remove a directory - * - * @param string $path - * @param integer $options - * @return boolean - */ - public function rmdir($path, $options) - { - if ($this->_getContainerName($path) == $this->_getFileName($path)) { - // Clear the stat cache so that affected paths are refreshed. - clearstatcache(); - - // Delete container - try { - $this->_getStorageClient($path)->deleteContainer( - $this->_getContainerName($path) - ); - return true; - } catch (Zend_Service_WindowsAzure_Exception $ex) { - return false; - } - } else { - throw new Zend_Service_WindowsAzure_Exception('rmdir() with multiple levels is not supported on Windows Azure Blob Storage.'); - } - } - - /** - * Attempt to open a directory - * - * @param string $path - * @param integer $options - * @return boolean - */ - public function dir_opendir($path, $options) - { - $this->_blobs = $this->_getStorageClient($path)->listBlobs( - $this->_getContainerName($path) - ); - return is_array($this->_blobs); - } - - /** - * Return the next filename in the directory - * - * @return string - */ - public function dir_readdir() - { - $object = current($this->_blobs); - if ($object !== false) { - next($this->_blobs); - return $object->Name; - } - return false; - } - - /** - * Reset the directory pointer - * - * @return boolean True - */ - public function dir_rewinddir() - { - reset($this->_blobs); - return true; - } - - /** - * Close a directory - * - * @return boolean True - */ - public function dir_closedir() - { - $this->_blobs = null; - return true; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/BlobContainer.php b/library/Zend/Service/WindowsAzure/Storage/BlobContainer.php deleted file mode 100644 index 1afd441a03..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/BlobContainer.php +++ /dev/null @@ -1,90 +0,0 @@ -_data = array( - 'name' => $name, - 'etag' => $etag, - 'lastmodified' => $lastModified, - 'metadata' => $metadata - ); - } - - /** - * Magic overload for setting properties - * - * @param string $name Name of the property - * @param string $value Value to set - */ - public function __set($name, $value) { - if (array_key_exists(strtolower($name), $this->_data)) { - $this->_data[strtolower($name)] = $value; - return; - } - - throw new Exception("Unknown property: " . $name); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - if (array_key_exists(strtolower($name), $this->_data)) { - return $this->_data[strtolower($name)]; - } - - throw new Exception("Unknown property: " . $name); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/BlobInstance.php b/library/Zend/Service/WindowsAzure/Storage/BlobInstance.php deleted file mode 100644 index 49d6dd29bf..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/BlobInstance.php +++ /dev/null @@ -1,93 +0,0 @@ -_data = array( - 'container' => $containerName, - 'name' => $name, - 'snapshotid' => $snapshotId, - 'etag' => $etag, - 'lastmodified' => $lastModified, - 'url' => $url, - 'size' => $size, - 'contenttype' => $contentType, - 'contentencoding' => $contentEncoding, - 'contentlanguage' => $contentLanguage, - 'cachecontrol' => $cacheControl, - 'blobtype' => $blobType, - 'leasestatus' => $leaseStatus, - 'isprefix' => $isPrefix, - 'metadata' => $metadata - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/DynamicTableEntity.php b/library/Zend/Service/WindowsAzure/Storage/DynamicTableEntity.php deleted file mode 100644 index fb7faf86fc..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/DynamicTableEntity.php +++ /dev/null @@ -1,219 +0,0 @@ -setAzureProperty($name, $value, null); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - return $this->getAzureProperty($name); - } - - /** - * Set an Azure property - * - * @param string $name Property name - * @param mixed $value Property value - * @param string $type Property type (Edm.xxxx) - * @return Zend_Service_WindowsAzure_Storage_DynamicTableEntity - */ - public function setAzureProperty($name, $value = '', $type = null) - { - if (strtolower($name) == 'partitionkey') { - $this->setPartitionKey($value); - } else if (strtolower($name) == 'rowkey') { - $this->setRowKey($value); - } else if (strtolower($name) == 'etag') { - $this->setEtag($value); - } else { - if (!array_key_exists(strtolower($name), $this->_dynamicProperties)) { - // Determine type? - if (is_null($type)) { - $type = 'Edm.String'; - if (is_int($value)) { - $type = 'Edm.Int32'; - } else if (is_float($value)) { - $type = 'Edm.Double'; - } else if (is_bool($value)) { - $type = 'Edm.Boolean'; - } else if ($value instanceof DateTime || $this->_convertToDateTime($value) !== false) { - if (!$value instanceof DateTime) { - $value = $this->_convertToDateTime($value); - } - $type = 'Edm.DateTime'; - } - } - - // Set dynamic property - $this->_dynamicProperties[strtolower($name)] = (object)array( - 'Name' => $name, - 'Type' => $type, - 'Value' => $value, - ); - } - - // Set type? - if (!is_null($type)) { - $this->_dynamicProperties[strtolower($name)]->Type = $type; - - // Try to convert the type - if ($type == 'Edm.Int32' || $type == 'Edm.Int64') { - $value = intval($value); - } else if ($type == 'Edm.Double') { - $value = floatval($value); - } else if ($type == 'Edm.Boolean') { - if (!is_bool($value)) { - $value = strtolower($value) == 'true'; - } - } else if ($type == 'Edm.DateTime') { - if (!$value instanceof DateTime) { - $value = $this->_convertToDateTime($value); - } - } - } - - // Set value - $this->_dynamicProperties[strtolower($name)]->Value = $value; - } - return $this; - } - - /** - * Set an Azure property type - * - * @param string $name Property name - * @param string $type Property type (Edm.xxxx) - * @return Zend_Service_WindowsAzure_Storage_DynamicTableEntity - */ - public function setAzurePropertyType($name, $type = 'Edm.String') - { - if (!array_key_exists(strtolower($name), $this->_dynamicProperties)) { - $this->setAzureProperty($name, '', $type); - } else { - $this->_dynamicProperties[strtolower($name)]->Type = $type; - } - return $this; - } - - /** - * Get an Azure property - * - * @param string $name Property name - * @param mixed $value Property value - * @param string $type Property type (Edm.xxxx) - * @return Zend_Service_WindowsAzure_Storage_DynamicTableEntity - */ - public function getAzureProperty($name) - { - if (strtolower($name) == 'partitionkey') { - return $this->getPartitionKey(); - } - if (strtolower($name) == 'rowkey') { - return $this->getRowKey(); - } - if (strtolower($name) == 'etag') { - return $this->getEtag(); - } - - if (!array_key_exists(strtolower($name), $this->_dynamicProperties)) { - $this->setAzureProperty($name); - } - - return $this->_dynamicProperties[strtolower($name)]->Value; - } - - /** - * Get an Azure property type - * - * @param string $name Property name - * @return string Property type (Edm.xxxx) - */ - public function getAzurePropertyType($name) - { - if (!array_key_exists(strtolower($name), $this->_dynamicProperties)) { - $this->setAzureProperty($name, '', $type); - } - - return $this->_dynamicProperties[strtolower($name)]->Type; - } - - /** - * Get Azure values - * - * @return array - */ - public function getAzureValues() - { - return array_merge(array_values($this->_dynamicProperties), parent::getAzureValues()); - } - - /** - * Set Azure values - * - * @param array $values - * @param boolean $throwOnError Throw Zend_Service_WindowsAzure_Exception when a property is not specified in $values? - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setAzureValues($values = array(), $throwOnError = false) - { - // Set parent values - parent::setAzureValues($values, false); - - // Set current values - foreach ($values as $key => $value) - { - $this->$key = $value; - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/LeaseInstance.php b/library/Zend/Service/WindowsAzure/Storage/LeaseInstance.php deleted file mode 100644 index 322e66c8db..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/LeaseInstance.php +++ /dev/null @@ -1,60 +0,0 @@ -_data = array( - 'container' => $containerName, - 'name' => $name, - 'leaseid' => $leaseId, - 'leasetime' => $leaseTime - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/PageRegionInstance.php b/library/Zend/Service/WindowsAzure/Storage/PageRegionInstance.php deleted file mode 100644 index 6c4a912a41..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/PageRegionInstance.php +++ /dev/null @@ -1,54 +0,0 @@ -_data = array( - 'start' => $start, - 'end' => $end - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/Queue.php b/library/Zend/Service/WindowsAzure/Storage/Queue.php deleted file mode 100644 index 0540fa8fc7..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/Queue.php +++ /dev/null @@ -1,592 +0,0 @@ -_apiVersion = '2009-09-19'; - } - - /** - * Check if a queue exists - * - * @param string $queueName Queue name - * @return boolean - */ - public function queueExists($queueName = '') - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - // List queues - $queues = $this->listQueues($queueName, 1); - foreach ($queues as $queue) { - if ($queue->Name == $queueName) { - return true; - } - } - - return false; - } - - /** - * Create queue - * - * @param string $queueName Queue name - * @param array $metadata Key/value pairs of meta data - * @return object Queue properties - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createQueue($queueName = '', $metadata = array()) - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - // Create metadata headers - $headers = array(); - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Perform request - $response = $this->_performRequest($queueName, '', Zend_Http_Client::PUT, $headers); - if ($response->isSuccessful()) { - - return new Zend_Service_WindowsAzure_Storage_QueueInstance( - $queueName, - $metadata - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Create queue if it does not exist - * - * @param string $queueName Queue name - * @param array $metadata Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createQueueIfNotExists($queueName = '', $metadata = array()) - { - if (!$this->queueExists($queueName)) { - $this->createQueue($queueName, $metadata); - } - } - - /** - * Get queue - * - * @param string $queueName Queue name - * @return Zend_Service_WindowsAzure_Storage_QueueInstance - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getQueue($queueName = '') - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - // Perform request - $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::GET); - if ($response->isSuccessful()) { - // Parse metadata - $metadata = $this->_parseMetadataHeaders($response->getHeaders()); - - // Return queue - $queue = new Zend_Service_WindowsAzure_Storage_QueueInstance( - $queueName, - $metadata - ); - $queue->ApproximateMessageCount = intval($response->getHeader('x-ms-approximate-message-count')); - return $queue; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Get queue metadata - * - * @param string $queueName Queue name - * @return array Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getQueueMetadata($queueName = '') - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - return $this->getQueue($queueName)->Metadata; - } - - /** - * Set queue metadata - * - * Calling the Set Queue Metadata operation overwrites all existing metadata that is associated with the queue. It's not possible to modify an individual name/value pair. - * - * @param string $queueName Queue name - * @param array $metadata Key/value pairs of meta data - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setQueueMetadata($queueName = '', $metadata = array()) - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - if (count($metadata) == 0) { - return; - } - - // Create metadata headers - $headers = array(); - $headers = array_merge($headers, $this->_generateMetadataHeaders($metadata)); - - // Perform request - $response = $this->_performRequest($queueName, '?comp=metadata', Zend_Http_Client::PUT, $headers); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Delete queue - * - * @param string $queueName Queue name - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteQueue($queueName = '') - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - // Perform request - $response = $this->_performRequest($queueName, '', Zend_Http_Client::DELETE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * List queues - * - * @param string $prefix Optional. Filters the results to return only queues whose name begins with the specified prefix. - * @param int $maxResults Optional. Specifies the maximum number of queues to return per call to Azure storage. This does NOT affect list size returned by this function. (maximum: 5000) - * @param string $marker Optional string value that identifies the portion of the list to be returned with the next list operation. - * @param string $include Optional. Include this parameter to specify that the queue's metadata be returned as part of the response body. (allowed values: '', 'metadata') - * @param int $currentResultCount Current result count (internal use) - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function listQueues($prefix = null, $maxResults = null, $marker = null, $include = null, $currentResultCount = 0) - { - // Build query string - $queryString = array('comp=list'); - if (!is_null($prefix)) { - $queryString[] = 'prefix=' . $prefix; - } - if (!is_null($maxResults)) { - $queryString[] = 'maxresults=' . $maxResults; - } - if (!is_null($marker)) { - $queryString[] = 'marker=' . $marker; - } - if (!is_null($include)) { - $queryString[] = 'include=' . $include; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Perform request - $response = $this->_performRequest('', $queryString, Zend_Http_Client::GET); - if ($response->isSuccessful()) { - $xmlQueues = $this->_parseResponse($response)->Queues->Queue; - $xmlMarker = (string)$this->_parseResponse($response)->NextMarker; - - $queues = array(); - if (!is_null($xmlQueues)) { - - for ($i = 0; $i < count($xmlQueues); $i++) { - $queues[] = new Zend_Service_WindowsAzure_Storage_QueueInstance( - (string)$xmlQueues[$i]->Name, - $this->_parseMetadataElement($xmlQueues[$i]) - ); - } - } - $currentResultCount = $currentResultCount + count($queues); - if (!is_null($maxResults) && $currentResultCount < $maxResults) { - if (!is_null($xmlMarker) && $xmlMarker != '') { - $queues = array_merge($queues, $this->listQueues($prefix, $maxResults, $xmlMarker, $include, $currentResultCount)); - } - } - if (!is_null($maxResults) && count($queues) > $maxResults) { - $queues = array_slice($queues, 0, $maxResults); - } - - return $queues; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Put message into queue - * - * @param string $queueName Queue name - * @param string $message Message - * @param int $ttl Message Time-To-Live (in seconds). Defaults to 7 days if the parameter is omitted. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function putMessage($queueName = '', $message = '', $ttl = null) - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - if (strlen($message) > self::MAX_MESSAGE_SIZE) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Message is too big. Message content should be < 8KB.'); - } - if ($message == '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Message is not specified.'); - } - if (!is_null($ttl) && ($ttl <= 0 || $ttl > self::MAX_MESSAGE_SIZE)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Message TTL is invalid. Maximal TTL is 7 days (' . self::MAX_MESSAGE_SIZE . ' seconds) and should be greater than zero.'); - } - - // Build query string - $queryString = array(); - if (!is_null($ttl)) { - $queryString[] = 'messagettl=' . $ttl; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Build body - $rawData = ''; - $rawData .= ''; - $rawData .= ' ' . base64_encode($message) . ''; - $rawData .= ''; - - // Perform request - $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::POST, array(), false, $rawData); - - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Error putting message into queue.'); - } - } - - /** - * Get queue messages - * - * @param string $queueName Queue name - * @param string $numOfMessages Optional. A nonzero integer value that specifies the number of messages to retrieve from the queue, up to a maximum of 32. By default, a single message is retrieved from the queue with this operation. - * @param int $visibilityTimeout Optional. An integer value that specifies the message's visibility timeout in seconds. The maximum value is 2 hours. The default message visibility timeout is 30 seconds. - * @param string $peek Peek only? - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function getMessages($queueName = '', $numOfMessages = 1, $visibilityTimeout = null, $peek = false) - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - if ($numOfMessages < 1 || $numOfMessages > 32 || intval($numOfMessages) != $numOfMessages) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Invalid number of messages to retrieve.'); - } - if (!is_null($visibilityTimeout) && ($visibilityTimeout <= 0 || $visibilityTimeout > 7200)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Visibility timeout is invalid. Maximum value is 2 hours (7200 seconds) and should be greater than zero.'); - } - - // Build query string - $queryString = array(); - if ($peek) { - $queryString[] = 'peekonly=true'; - } - if ($numOfMessages > 1) { - $queryString[] = 'numofmessages=' . $numOfMessages; - } - if (!$peek && !is_null($visibilityTimeout)) { - $queryString[] = 'visibilitytimeout=' . $visibilityTimeout; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Perform request - $response = $this->_performRequest($queueName . '/messages', $queryString, Zend_Http_Client::GET); - if ($response->isSuccessful()) { - // Parse results - $result = $this->_parseResponse($response); - if (!$result) { - return array(); - } - - $xmlMessages = null; - if (count($result->QueueMessage) > 1) { - $xmlMessages = $result->QueueMessage; - } else { - $xmlMessages = array($result->QueueMessage); - } - - $messages = array(); - for ($i = 0; $i < count($xmlMessages); $i++) { - $messages[] = new Zend_Service_WindowsAzure_Storage_QueueMessage( - (string)$xmlMessages[$i]->MessageId, - (string)$xmlMessages[$i]->InsertionTime, - (string)$xmlMessages[$i]->ExpirationTime, - ($peek ? '' : (string)$xmlMessages[$i]->PopReceipt), - ($peek ? '' : (string)$xmlMessages[$i]->TimeNextVisible), - (string)$xmlMessages[$i]->DequeueCount, - base64_decode((string)$xmlMessages[$i]->MessageText) - ); - } - - return $messages; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Peek queue messages - * - * @param string $queueName Queue name - * @param string $numOfMessages Optional. A nonzero integer value that specifies the number of messages to retrieve from the queue, up to a maximum of 32. By default, a single message is retrieved from the queue with this operation. - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function peekMessages($queueName = '', $numOfMessages = 1) - { - return $this->getMessages($queueName, $numOfMessages, null, true); - } - - /** - * Checks to see if a given queue has messages - * - * @param string $queueName Queue name - * @return boolean - * @throws Zend_Service_WindowsAzure_Exception - */ - public function hasMessages($queueName = '') - { - return count($this->peekMessages($queueName)) > 0; - } - - /** - * Clear queue messages - * - * @param string $queueName Queue name - * @throws Zend_Service_WindowsAzure_Exception - */ - public function clearMessages($queueName = '') - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - - // Perform request - $response = $this->_performRequest($queueName . '/messages', '', Zend_Http_Client::DELETE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Error clearing messages from queue.'); - } - } - - /** - * Delete queue message - * - * @param string $queueName Queue name - * @param Zend_Service_WindowsAzure_Storage_QueueMessage $message Message to delete from queue. A message retrieved using "peekMessages" can NOT be deleted! - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteMessage($queueName = '', Zend_Service_WindowsAzure_Storage_QueueMessage $message) - { - if ($queueName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name is not specified.'); - } - if (!self::isValidQueueName($queueName)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Queue name does not adhere to queue naming conventions. See http://msdn.microsoft.com/en-us/library/dd179349.aspx for more information.'); - } - if ($message->PopReceipt == '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('A message retrieved using "peekMessages" can NOT be deleted! Use "getMessages" instead.'); - } - - // Perform request - $response = $this->_performRequest($queueName . '/messages/' . $message->MessageId, '?popreceipt=' . urlencode($message->PopReceipt), Zend_Http_Client::DELETE); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Is valid queue name? - * - * @param string $queueName Queue name - * @return boolean - */ - public static function isValidQueueName($queueName = '') - { - if (preg_match("/^[a-z0-9][a-z0-9-]*$/", $queueName) === 0) { - return false; - } - - if (strpos($queueName, '--') !== false) { - return false; - } - - if (strtolower($queueName) != $queueName) { - return false; - } - - if (strlen($queueName) < 3 || strlen($queueName) > 63) { - return false; - } - - if (substr($queueName, -1) == '-') { - return false; - } - - return true; - } - - /** - * Get error message from Zend_Http_Response - * - * @param Zend_Http_Response $response Repsonse - * @param string $alternativeError Alternative error message - * @return string - */ - protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') - { - $response = $this->_parseResponse($response); - if ($response && $response->Message) { - return (string)$response->Message; - } else { - return $alternativeError; - } - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/QueueInstance.php b/library/Zend/Service/WindowsAzure/Storage/QueueInstance.php deleted file mode 100644 index 115578fed4..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/QueueInstance.php +++ /dev/null @@ -1,56 +0,0 @@ -_data = array( - 'name' => $name, - 'metadata' => $metadata, - 'approximatemessagecount' => 0 - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/QueueMessage.php b/library/Zend/Service/WindowsAzure/Storage/QueueMessage.php deleted file mode 100644 index 68746ff843..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/QueueMessage.php +++ /dev/null @@ -1,69 +0,0 @@ -_data = array( - 'messageid' => $messageId, - 'insertiontime' => $insertionTime, - 'expirationtime' => $expirationTime, - 'popreceipt' => $popReceipt, - 'timenextvisible' => $timeNextVisible, - 'dequeuecount' => $dequeueCount, - 'messagetext' => $messageText - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/SignedIdentifier.php b/library/Zend/Service/WindowsAzure/Storage/SignedIdentifier.php deleted file mode 100644 index 4e7d39b0eb..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/SignedIdentifier.php +++ /dev/null @@ -1,60 +0,0 @@ -_data = array( - 'id' => $id, - 'start' => $start, - 'expiry' => $expiry, - 'permissions' => $permissions - ); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/StorageEntityAbstract.php b/library/Zend/Service/WindowsAzure/Storage/StorageEntityAbstract.php deleted file mode 100644 index dcd3e4cddf..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/StorageEntityAbstract.php +++ /dev/null @@ -1,67 +0,0 @@ -_data)) { - $this->_data[strtolower($name)] = $value; - return; - } - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception("Unknown property: " . $name); - } - - /** - * Magic overload for getting properties - * - * @param string $name Name of the property - */ - public function __get($name) { - if (array_key_exists(strtolower($name), $this->_data)) { - return $this->_data[strtolower($name)]; - } - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception("Unknown property: " . $name); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/Table.php b/library/Zend/Service/WindowsAzure/Storage/Table.php deleted file mode 100644 index c4f0852ff2..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/Table.php +++ /dev/null @@ -1,931 +0,0 @@ -_throwExceptionOnMissingData = $value; - } - - /** - * Throw Zend_Service_WindowsAzure_Exception when a property is not specified in Windows Azure? - */ - public function getThrowExceptionOnMissingData() - { - return $this->_throwExceptionOnMissingData; - } - - /** - * Creates a new Zend_Service_WindowsAzure_Storage_Table instance - * - * @param string $host Storage host name - * @param string $accountName Account name for Windows Azure - * @param string $accountKey Account key for Windows Azure - * @param boolean $usePathStyleUri Use path-style URI's - * @param Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy Retry policy to use when making requests - */ - public function __construct($host = Zend_Service_WindowsAzure_Storage::URL_DEV_TABLE, $accountName = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT, $accountKey = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY, $usePathStyleUri = false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract $retryPolicy = null) - { - parent::__construct($host, $accountName, $accountKey, $usePathStyleUri, $retryPolicy); - - // Always use SharedKeyLite authentication - $this->_credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite($accountName, $accountKey, $this->_usePathStyleUri); - - // API version - $this->_apiVersion = '2009-09-19'; - } - - /** - * Check if a table exists - * - * @param string $tableName Table name - * @return boolean - */ - public function tableExists($tableName = '') - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - - // List tables - $tables = $this->listTables(); // 2009-09-19 does not support $this->listTables($tableName); all of a sudden... - foreach ($tables as $table) { - if ($table->Name == $tableName) { - return true; - } - } - - return false; - } - - /** - * List tables - * - * @param string $nextTableName Next table name, used for listing tables when total amount of tables is > 1000. - * @return array - * @throws Zend_Service_WindowsAzure_Exception - */ - public function listTables($nextTableName = '') - { - // Build query string - $queryString = array(); - if ($nextTableName != '') { - $queryString[] = 'NextTableName=' . $nextTableName; - } - $queryString = self::createQueryStringFromArray($queryString); - - // Perform request - $response = $this->_performRequest('Tables', $queryString, Zend_Http_Client::GET, null, true); - if ($response->isSuccessful()) { - // Parse result - $result = $this->_parseResponse($response); - - if (!$result || !$result->entry) { - return array(); - } - - $entries = null; - if (count($result->entry) > 1) { - $entries = $result->entry; - } else { - $entries = array($result->entry); - } - - // Create return value - $returnValue = array(); - foreach ($entries as $entry) { - $tableName = $entry->xpath('.//m:properties/d:TableName'); - $tableName = (string)$tableName[0]; - - $returnValue[] = new Zend_Service_WindowsAzure_Storage_TableInstance( - (string)$entry->id, - $tableName, - (string)$entry->link['href'], - (string)$entry->updated - ); - } - - // More tables? - if (!is_null($response->getHeader('x-ms-continuation-NextTableName'))) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - $returnValue = array_merge($returnValue, $this->listTables($response->getHeader('x-ms-continuation-NextTableName'))); - } - - return $returnValue; - } else { - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Create table - * - * @param string $tableName Table name - * @return Zend_Service_WindowsAzure_Storage_TableInstance - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createTable($tableName = '') - { - if ($tableName === '') { - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - - // Generate request body - $requestBody = ' - - - <updated>{tpl:Updated}</updated> - <author> - <name /> - </author> - <id /> - <content type="application/xml"> - <m:properties> - <d:TableName>{tpl:TableName}</d:TableName> - </m:properties> - </content> - </entry>'; - - $requestBody = $this->_fillTemplate($requestBody, array( - 'BaseUrl' => $this->getBaseUrl(), - 'TableName' => htmlspecialchars($tableName), - 'Updated' => $this->isoDate(), - 'AccountName' => $this->_accountName - )); - - // Add header information - $headers = array(); - $headers['Content-Type'] = 'application/atom+xml'; - $headers['DataServiceVersion'] = '1.0;NetFx'; - $headers['MaxDataServiceVersion'] = '1.0;NetFx'; - - // Perform request - $response = $this->_performRequest('Tables', '', Zend_Http_Client::POST, $headers, true, $requestBody); - if ($response->isSuccessful()) { - // Parse response - $entry = $this->_parseResponse($response); - - $tableName = $entry->xpath('.//m:properties/d:TableName'); - $tableName = (string)$tableName[0]; - - - return new Zend_Service_WindowsAzure_Storage_TableInstance( - (string)$entry->id, - $tableName, - (string)$entry->link['href'], - (string)$entry->updated - ); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Create table if it does not exist - * - * @param string $tableName Table name - * @throws Zend_Service_WindowsAzure_Exception - */ - public function createTableIfNotExists($tableName = '') - { - if (!$this->tableExists($tableName)) { - $this->createTable($tableName); - } - } - - /** - * Delete table - * - * @param string $tableName Table name - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteTable($tableName = '') - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - - // Add header information - $headers = array(); - $headers['Content-Type'] = 'application/atom+xml'; - - // Perform request - $response = $this->_performRequest('Tables(\'' . $tableName . '\')', '', Zend_Http_Client::DELETE, $headers, true, null); - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Insert entity into table - * - * @param string $tableName Table name - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity Entity to insert - * @return Zend_Service_WindowsAzure_Storage_TableEntity - * @throws Zend_Service_WindowsAzure_Exception - */ - public function insertEntity($tableName = '', Zend_Service_WindowsAzure_Storage_TableEntity $entity = null) - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - if (is_null($entity)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity is not specified.'); - } - - // Generate request body - $requestBody = '<?xml version="1.0" encoding="utf-8" standalone="yes"?> - <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> - <title /> - <updated>{tpl:Updated}</updated> - <author> - <name /> - </author> - <id /> - <content type="application/xml"> - <m:properties> - {tpl:Properties} - </m:properties> - </content> - </entry>'; - - $requestBody = $this->_fillTemplate($requestBody, array( - 'Updated' => $this->isoDate(), - 'Properties' => $this->_generateAzureRepresentation($entity) - )); - - // Add header information - $headers = array(); - $headers['Content-Type'] = 'application/atom+xml'; - - // Perform request - $response = null; - if ($this->isInBatch()) { - $this->getCurrentBatch()->enlistOperation($tableName, '', Zend_Http_Client::POST, $headers, true, $requestBody); - return null; - } else { - $response = $this->_performRequest($tableName, '', Zend_Http_Client::POST, $headers, true, $requestBody); - } - if ($response->isSuccessful()) { - // Parse result - $result = $this->_parseResponse($response); - - $timestamp = $result->xpath('//m:properties/d:Timestamp'); - $timestamp = $this->_convertToDateTime( (string)$timestamp[0] ); - - $etag = $result->attributes('http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'); - $etag = (string)$etag['etag']; - - // Update properties - $entity->setTimestamp($timestamp); - $entity->setEtag($etag); - - return $entity; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Delete entity from table - * - * @param string $tableName Table name - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity Entity to delete - * @param boolean $verifyEtag Verify etag of the entity (used for concurrency) - * @throws Zend_Service_WindowsAzure_Exception - */ - public function deleteEntity($tableName = '', Zend_Service_WindowsAzure_Storage_TableEntity $entity = null, $verifyEtag = false) - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - if (is_null($entity)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity is not specified.'); - } - - // Add header information - $headers = array(); - if (!$this->isInBatch()) { - // http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/9e255447-4dc7-458a-99d3-bdc04bdc5474/ - $headers['Content-Type'] = 'application/atom+xml'; - } - $headers['Content-Length'] = 0; - if (!$verifyEtag) { - $headers['If-Match'] = '*'; - } else { - $headers['If-Match'] = $entity->getEtag(); - } - - // Perform request - $response = null; - if ($this->isInBatch()) { - $this->getCurrentBatch()->enlistOperation($tableName . '(PartitionKey=\'' . $entity->getPartitionKey() . '\', RowKey=\'' . $entity->getRowKey() . '\')', '', Zend_Http_Client::DELETE, $headers, true, null); - return null; - } else { - $response = $this->_performRequest($tableName . '(PartitionKey=\'' . $entity->getPartitionKey() . '\', RowKey=\'' . $entity->getRowKey() . '\')', '', Zend_Http_Client::DELETE, $headers, true, null); - } - if (!$response->isSuccessful()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Retrieve entity from table, by id - * - * @param string $tableName Table name - * @param string $partitionKey Partition key - * @param string $rowKey Row key - * @param string $entityClass Entity class name* - * @return Zend_Service_WindowsAzure_Storage_TableEntity - * @throws Zend_Service_WindowsAzure_Exception - */ - public function retrieveEntityById($tableName, $partitionKey, $rowKey, $entityClass = 'Zend_Service_WindowsAzure_Storage_DynamicTableEntity') - { - if (is_null($tableName) || $tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - if (is_null($partitionKey) || $partitionKey === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Partition key is not specified.'); - } - if (is_null($rowKey) || $rowKey === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Row key is not specified.'); - } - if (is_null($entityClass) || $entityClass === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity class is not specified.'); - } - - - // Check for combined size of partition key and row key - // http://msdn.microsoft.com/en-us/library/dd179421.aspx - if (strlen($partitionKey . $rowKey) >= 256) { - // Start a batch if possible - if ($this->isInBatch()) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity cannot be retrieved. A transaction is required to retrieve the entity, but another transaction is already active.'); - } - - $this->startBatch(); - } - - // Fetch entities from Azure - $result = $this->retrieveEntities( - $this->select() - ->from($tableName) - ->wherePartitionKey($partitionKey) - ->whereRowKey($rowKey), - '', - $entityClass - ); - - // Return - if (count($result) == 1) { - return $result[0]; - } - - return null; - } - - /** - * Create a new Zend_Service_WindowsAzure_Storage_TableEntityQuery - * - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function select() - { - - return new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - } - - /** - * Retrieve entities from table - * - * @param string $tableName|Zend_Service_WindowsAzure_Storage_TableEntityQuery Table name -or- Zend_Service_WindowsAzure_Storage_TableEntityQuery instance - * @param string $filter Filter condition (not applied when $tableName is a Zend_Service_WindowsAzure_Storage_TableEntityQuery instance) - * @param string $entityClass Entity class name - * @param string $nextPartitionKey Next partition key, used for listing entities when total amount of entities is > 1000. - * @param string $nextRowKey Next row key, used for listing entities when total amount of entities is > 1000. - * @return array Array of Zend_Service_WindowsAzure_Storage_TableEntity - * @throws Zend_Service_WindowsAzure_Exception - */ - public function retrieveEntities($tableName = '', $filter = '', $entityClass = 'Zend_Service_WindowsAzure_Storage_DynamicTableEntity', $nextPartitionKey = null, $nextRowKey = null) - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - if ($entityClass === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity class is not specified.'); - } - - // Convenience... - if (class_exists($filter)) { - $entityClass = $filter; - $filter = ''; - } - - // Query string - $queryString = ''; - - // Determine query - if (is_string($tableName)) { - // Option 1: $tableName is a string - - // Append parentheses - if (strpos($tableName, '()') === false) { - $tableName .= '()'; - } - - // Build query - $query = array(); - - // Filter? - if ($filter !== '') { - $query[] = '$filter=' . Zend_Service_WindowsAzure_Storage_TableEntityQuery::encodeQuery($filter); - } - - // Build queryString - if (count($query) > 0) { - $queryString = '?' . implode('&', $query); - } - } else if (get_class($tableName) == 'Zend_Service_WindowsAzure_Storage_TableEntityQuery') { - // Option 2: $tableName is a Zend_Service_WindowsAzure_Storage_TableEntityQuery instance - - // Build queryString - $queryString = $tableName->assembleQueryString(true); - - // Change $tableName - $tableName = $tableName->assembleFrom(true); - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Invalid argument: $tableName'); - } - - // Add continuation querystring parameters? - if (!is_null($nextPartitionKey) && !is_null($nextRowKey)) { - if ($queryString !== '') { - $queryString .= '&'; - } else { - $queryString .= '?'; - } - - $queryString .= 'NextPartitionKey=' . rawurlencode($nextPartitionKey) . '&NextRowKey=' . rawurlencode($nextRowKey); - } - - // Perform request - $response = null; - if ($this->isInBatch() && $this->getCurrentBatch()->getOperationCount() == 0) { - $this->getCurrentBatch()->enlistOperation($tableName, $queryString, Zend_Http_Client::GET, array(), true, null); - $response = $this->getCurrentBatch()->commit(); - - // Get inner response (multipart) - $innerResponse = $response->getBody(); - $innerResponse = substr($innerResponse, strpos($innerResponse, 'HTTP/1.1 200 OK')); - $innerResponse = substr($innerResponse, 0, strpos($innerResponse, '--batchresponse')); - $response = Zend_Http_Response::fromString($innerResponse); - } else { - $response = $this->_performRequest($tableName, $queryString, Zend_Http_Client::GET, array(), true, null); - } - - if ($response->isSuccessful()) { - // Parse result - $result = $this->_parseResponse($response); - if (!$result) { - return array(); - } - - $entries = null; - if ($result->entry) { - if (count($result->entry) > 1) { - $entries = $result->entry; - } else { - $entries = array($result->entry); - } - } else { - // This one is tricky... If we have properties defined, we have an entity. - $properties = $result->xpath('//m:properties'); - if ($properties) { - $entries = array($result); - } else { - return array(); - } - } - - // Create return value - $returnValue = array(); - foreach ($entries as $entry) { - // Parse properties - $properties = $entry->xpath('.//m:properties'); - $properties = $properties[0]->children('http://schemas.microsoft.com/ado/2007/08/dataservices'); - - // Create entity - $entity = new $entityClass('', ''); - $entity->setAzureValues((array)$properties, $this->_throwExceptionOnMissingData); - - // If we have a Zend_Service_WindowsAzure_Storage_DynamicTableEntity, make sure all property types are set - if ($entity instanceof Zend_Service_WindowsAzure_Storage_DynamicTableEntity) { - foreach ($properties as $key => $value) { - $attributes = $value->attributes('http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'); - $type = (string)$attributes['type']; - if ($type !== '') { - $entity->setAzureProperty($key, (string)$value, $type); - } - } - } - - // Update etag - $etag = $entry->attributes('http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'); - $etag = (string)$etag['etag']; - $entity->setEtag($etag); - - // Add to result - $returnValue[] = $entity; - } - - // More entities? - if (!is_null($response->getHeader('x-ms-continuation-NextPartitionKey')) && !is_null($response->getHeader('x-ms-continuation-NextRowKey'))) { - if (strpos($queryString, '$top') === false) { - $returnValue = array_merge($returnValue, $this->retrieveEntities($tableName, $filter, $entityClass, $response->getHeader('x-ms-continuation-NextPartitionKey'), $response->getHeader('x-ms-continuation-NextRowKey'))); - } - } - - // Return - return $returnValue; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Update entity by replacing it - * - * @param string $tableName Table name - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity Entity to update - * @param boolean $verifyEtag Verify etag of the entity (used for concurrency) - * @throws Zend_Service_WindowsAzure_Exception - */ - public function updateEntity($tableName = '', Zend_Service_WindowsAzure_Storage_TableEntity $entity = null, $verifyEtag = false) - { - return $this->_changeEntity(Zend_Http_Client::PUT, $tableName, $entity, $verifyEtag); - } - - /** - * Update entity by adding or updating properties - * - * @param string $tableName Table name - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity Entity to update - * @param boolean $verifyEtag Verify etag of the entity (used for concurrency) - * @param array $properties Properties to merge. All properties will be used when omitted. - * @throws Zend_Service_WindowsAzure_Exception - */ - public function mergeEntity($tableName = '', Zend_Service_WindowsAzure_Storage_TableEntity $entity = null, $verifyEtag = false, $properties = array()) - { - $mergeEntity = null; - if (is_array($properties) && count($properties) > 0) { - - // Build a new object - $mergeEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey()); - - // Keep only values mentioned in $properties - $azureValues = $entity->getAzureValues(); - foreach ($azureValues as $key => $value) { - if (in_array($value->Name, $properties)) { - $mergeEntity->setAzureProperty($value->Name, $value->Value, $value->Type); - } - } - } else { - $mergeEntity = $entity; - } - - // Ensure entity timestamp matches updated timestamp - $entity->setTimestamp(new DateTime()); - - return $this->_changeEntity(Zend_Http_Client::MERGE, $tableName, $mergeEntity, $verifyEtag); - } - - /** - * Get error message from Zend_Http_Response - * - * @param Zend_Http_Response $response Repsonse - * @param string $alternativeError Alternative error message - * @return string - */ - protected function _getErrorMessage(Zend_Http_Response $response, $alternativeError = 'Unknown error.') - { - $response = $this->_parseResponse($response); - if ($response && $response->message) { - return (string)$response->message; - } else { - return $alternativeError; - } - } - - /** - * Update entity / merge entity - * - * @param string $httpVerb HTTP verb to use (PUT = update, MERGE = merge) - * @param string $tableName Table name - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity Entity to update - * @param boolean $verifyEtag Verify etag of the entity (used for concurrency) - * @throws Zend_Service_WindowsAzure_Exception - */ - protected function _changeEntity($httpVerb = Zend_Http_Client::PUT, $tableName = '', Zend_Service_WindowsAzure_Storage_TableEntity $entity = null, $verifyEtag = false) - { - if ($tableName === '') { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Table name is not specified.'); - } - if (is_null($entity)) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception('Entity is not specified.'); - } - - // Add header information - $headers = array(); - $headers['Content-Type'] = 'application/atom+xml'; - $headers['Content-Length'] = 0; - if (!$verifyEtag) { - $headers['If-Match'] = '*'; - } else { - $headers['If-Match'] = $entity->getEtag(); - } - - // Generate request body - $requestBody = '<?xml version="1.0" encoding="utf-8" standalone="yes"?> - <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> - <title /> - <updated>{tpl:Updated}</updated> - <author> - <name /> - </author> - <id /> - <content type="application/xml"> - <m:properties> - {tpl:Properties} - </m:properties> - </content> - </entry>'; - - // Attempt to get timestamp from entity - $timestamp = $entity->getTimestamp(); - - $requestBody = $this->_fillTemplate($requestBody, array( - 'Updated' => $this->_convertToEdmDateTime($timestamp), - 'Properties' => $this->_generateAzureRepresentation($entity) - )); - - // Add header information - $headers = array(); - $headers['Content-Type'] = 'application/atom+xml'; - if (!$verifyEtag) { - $headers['If-Match'] = '*'; - } else { - $headers['If-Match'] = $entity->getEtag(); - } - - // Perform request - $response = null; - if ($this->isInBatch()) { - $this->getCurrentBatch()->enlistOperation($tableName . '(PartitionKey=\'' . $entity->getPartitionKey() . '\', RowKey=\'' . $entity->getRowKey() . '\')', '', $httpVerb, $headers, true, $requestBody); - return null; - } else { - $response = $this->_performRequest($tableName . '(PartitionKey=\'' . $entity->getPartitionKey() . '\', RowKey=\'' . $entity->getRowKey() . '\')', '', $httpVerb, $headers, true, $requestBody); - } - if ($response->isSuccessful()) { - // Update properties - $entity->setEtag($response->getHeader('Etag')); - $entity->setTimestamp( $this->_convertToDateTime($response->getHeader('Last-modified')) ); - - return $entity; - } else { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception($this->_getErrorMessage($response, 'Resource could not be accessed.')); - } - } - - /** - * Generate RFC 1123 compliant date string - * - * @return string - */ - protected function _rfcDate() - { - return gmdate('D, d M Y H:i:s', time()) . ' GMT'; // RFC 1123 - } - - /** - * Fill text template with variables from key/value array - * - * @param string $templateText Template text - * @param array $variables Array containing key/value pairs - * @return string - */ - protected function _fillTemplate($templateText, $variables = array()) - { - foreach ($variables as $key => $value) { - $templateText = str_replace('{tpl:' . $key . '}', $value, $templateText); - } - return $templateText; - } - - /** - * Generate Azure representation from entity (creates atompub markup from properties) - * - * @param Zend_Service_WindowsAzure_Storage_TableEntity $entity - * @return string - */ - protected function _generateAzureRepresentation(Zend_Service_WindowsAzure_Storage_TableEntity $entity = null) - { - // Generate Azure representation from entity - $azureRepresentation = array(); - $azureValues = $entity->getAzureValues(); - foreach ($azureValues as $azureValue) { - $value = array(); - $value[] = '<d:' . $azureValue->Name; - if ($azureValue->Type != '') { - $value[] = ' m:type="' . $azureValue->Type . '"'; - } - if (is_null($azureValue->Value)) { - $value[] = ' m:null="true"'; - } - $value[] = '>'; - - if (!is_null($azureValue->Value)) { - if (strtolower($azureValue->Type) == 'edm.boolean') { - $value[] = ($azureValue->Value == true ? '1' : '0'); - } else if (strtolower($azureValue->Type) == 'edm.datetime') { - $value[] = $this->_convertToEdmDateTime($azureValue->Value); - } else { - $value[] = htmlspecialchars($azureValue->Value); - } - } - - $value[] = '</d:' . $azureValue->Name . '>'; - $azureRepresentation[] = implode('', $value); - } - - return implode('', $azureRepresentation); - } - - /** - * Perform request using Zend_Http_Client channel - * - * @param string $path Path - * @param string $queryString Query string - * @param string $httpVerb HTTP verb the request will use - * @param array $headers x-ms headers to add - * @param boolean $forTableStorage Is the request for table storage? - * @param mixed $rawData Optional RAW HTTP data to be sent over the wire - * @param string $resourceType Resource type - * @param string $requiredPermission Required permission - * @return Zend_Http_Response - */ - protected function _performRequest( - $path = '/', - $queryString = '', - $httpVerb = Zend_Http_Client::GET, - $headers = array(), - $forTableStorage = false, - $rawData = null, - $resourceType = Zend_Service_WindowsAzure_Storage::RESOURCE_UNKNOWN, - $requiredPermission = Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::PERMISSION_READ - ) { - // Add headers - $headers['DataServiceVersion'] = '1.0;NetFx'; - $headers['MaxDataServiceVersion'] = '1.0;NetFx'; - - // Perform request - return parent::_performRequest( - $path, - $queryString, - $httpVerb, - $headers, - $forTableStorage, - $rawData, - $resourceType, - $requiredPermission - ); - } - - /** - * Converts a string to a DateTime object. Returns false on failure. - * - * @param string $value The string value to parse - * @return DateTime|boolean - */ - protected function _convertToDateTime($value = '') - { - if ($value instanceof DateTime) { - return $value; - } - - try { - if (substr($value, -1) == 'Z') { - $value = substr($value, 0, strlen($value) - 1); - } - return new DateTime($value, new DateTimeZone('UTC')); - } - catch (Exception $ex) { - return false; - } - } - - /** - * Converts a DateTime object into an Edm.DaeTime value in UTC timezone, - * represented as a string. - * - * @param DateTime $value - * @return string - */ - protected function _convertToEdmDateTime(DateTime $value) - { - $cloned = clone $value; - $cloned->setTimezone(new DateTimeZone('UTC')); - return str_replace('+0000', 'Z', $cloned->format(DateTime::ISO8601)); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/TableEntity.php b/library/Zend/Service/WindowsAzure/Storage/TableEntity.php deleted file mode 100644 index 9ac374d1b6..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/TableEntity.php +++ /dev/null @@ -1,354 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_WindowsAzure_Storage_TableEntity -{ - /** - * Partition key - * - * @var string - */ - protected $_partitionKey; - - /** - * Row key - * - * @var string - */ - protected $_rowKey; - - /** - * Timestamp - * - * @var string - */ - protected $_timestamp; - - /** - * Etag - * - * @var string - */ - protected $_etag = ''; - - /** - * Constructor - * - * @param string $partitionKey Partition key - * @param string $rowKey Row key - */ - public function __construct($partitionKey = '', $rowKey = '') - { - $this->_partitionKey = $partitionKey; - $this->_rowKey = $rowKey; - } - - /** - * Get partition key - * - * @azure PartitionKey - * @return string - */ - public function getPartitionKey() - { - return $this->_partitionKey; - } - - /** - * Set partition key - * - * @azure PartitionKey - * @param string $value - */ - public function setPartitionKey($value) - { - $this->_partitionKey = $value; - } - - /** - * Get row key - * - * @azure RowKey - * @return string - */ - public function getRowKey() - { - return $this->_rowKey; - } - - /** - * Set row key - * - * @azure RowKey - * @param string $value - */ - public function setRowKey($value) - { - $this->_rowKey = $value; - } - - /** - * Get timestamp - * - * @azure Timestamp Edm.DateTime - * @return string - */ - public function getTimestamp() - { - if (null === $this->_timestamp) { - $this->setTimestamp(new DateTime()); - } - return $this->_timestamp; - } - - /** - * Set timestamp - * - * @azure Timestamp Edm.DateTime - * @param DateTime $value - */ - public function setTimestamp(DateTime $value) - { - $this->_timestamp = $value; - } - - /** - * Get etag - * - * @return string - */ - public function getEtag() - { - return $this->_etag; - } - - /** - * Set etag - * - * @param string $value - */ - public function setEtag($value = '') - { - $this->_etag = $value; - } - - /** - * Get Azure values - * - * @return array - */ - public function getAzureValues() - { - // Get accessors - $accessors = self::getAzureAccessors(get_class($this)); - - // Loop accessors and retrieve values - $returnValue = array(); - foreach ($accessors as $accessor) { - if ($accessor->EntityType == 'ReflectionProperty') { - $property = $accessor->EntityAccessor; - $returnValue[] = (object)array( - 'Name' => $accessor->AzurePropertyName, - 'Type' => $accessor->AzurePropertyType, - 'Value' => $this->$property, - ); - } else if ($accessor->EntityType == 'ReflectionMethod' && substr(strtolower($accessor->EntityAccessor), 0, 3) == 'get') { - $method = $accessor->EntityAccessor; - $returnValue[] = (object)array( - 'Name' => $accessor->AzurePropertyName, - 'Type' => $accessor->AzurePropertyType, - 'Value' => $this->$method(), - ); - } - } - - // Return - return $returnValue; - } - - /** - * Set Azure values - * - * @param array $values - * @param boolean $throwOnError Throw Zend_Service_WindowsAzure_Exception when a property is not specified in $values? - * @throws Zend_Service_WindowsAzure_Exception - */ - public function setAzureValues($values = array(), $throwOnError = false) - { - // Get accessors - $accessors = self::getAzureAccessors(get_class($this)); - - // Loop accessors and set values - $returnValue = array(); - foreach ($accessors as $accessor) { - if (isset($values[$accessor->AzurePropertyName])) { - // Cast to correct type - if ($accessor->AzurePropertyType != '') { - switch (strtolower($accessor->AzurePropertyType)) { - case 'edm.int32': - case 'edm.int64': - $values[$accessor->AzurePropertyName] = intval($values[$accessor->AzurePropertyName]); break; - case 'edm.boolean': - if ($values[$accessor->AzurePropertyName] == 'true' || $values[$accessor->AzurePropertyName] == '1') - $values[$accessor->AzurePropertyName] = true; - else - $values[$accessor->AzurePropertyName] = false; - break; - case 'edm.double': - $values[$accessor->AzurePropertyName] = floatval($values[$accessor->AzurePropertyName]); break; - case 'edm.datetime': - $values[$accessor->AzurePropertyName] = $this->_convertToDateTime($values[$accessor->AzurePropertyName]); break; - } - } - - // Assign value - if ($accessor->EntityType == 'ReflectionProperty') { - $property = $accessor->EntityAccessor; - $this->$property = $values[$accessor->AzurePropertyName]; - } else if ($accessor->EntityType == 'ReflectionMethod' && substr(strtolower($accessor->EntityAccessor), 0, 3) == 'set') { - $method = $accessor->EntityAccessor; - $this->$method($values[$accessor->AzurePropertyName]); - } - } else if ($throwOnError) { - #require_once 'Zend/Service/WindowsAzure/Exception.php'; - throw new Zend_Service_WindowsAzure_Exception("Property '" . $accessor->AzurePropertyName . "' was not found in \$values array"); - } - } - - // Return - return $returnValue; - } - - /** - * Get Azure accessors from class - * - * @param string $className Class to get accessors for - * @return array - */ - public static function getAzureAccessors($className = '') - { - // List of accessors - $azureAccessors = array(); - - // Get all types - $type = new ReflectionClass($className); - - // Loop all properties - $properties = $type->getProperties(); - foreach ($properties as $property) { - $accessor = self::getAzureAccessor($property); - if (!is_null($accessor)) { - $azureAccessors[] = $accessor; - } - } - - // Loop all methods - $methods = $type->getMethods(); - foreach ($methods as $method) { - $accessor = self::getAzureAccessor($method); - if (!is_null($accessor)) { - $azureAccessors[] = $accessor; - } - } - - // Return - return $azureAccessors; - } - - /** - * Get Azure accessor from reflection member - * - * @param ReflectionProperty|ReflectionMethod $member - * @return object - */ - public static function getAzureAccessor($member) - { - // Get comment - $docComment = $member->getDocComment(); - - // Check for Azure comment - if (strpos($docComment, '@azure') === false) - { - return null; - } - - // Search for @azure contents - $azureComment = ''; - $commentLines = explode("\n", $docComment); - foreach ($commentLines as $commentLine) { - if (strpos($commentLine, '@azure') !== false) { - $azureComment = trim(substr($commentLine, strpos($commentLine, '@azure') + 6)); - while (strpos($azureComment, ' ') !== false) { - $azureComment = str_replace(' ', ' ', $azureComment); - } - break; - } - } - - // Fetch @azure properties - $azureProperties = explode(' ', $azureComment); - return (object)array( - 'EntityAccessor' => $member->getName(), - 'EntityType' => get_class($member), - 'AzurePropertyName' => $azureProperties[0], - 'AzurePropertyType' => isset($azureProperties[1]) ? $azureProperties[1] : '' - ); - } - - /** - * Converts a string to a DateTime object. Returns false on failure. - * - * @param string $value The string value to parse - * @return DateTime|boolean - */ - protected function _convertToDateTime($value = '') - { - if ($value === '') { - return false; - } - - if ($value instanceof DateTime) { - return $value; - } - - if (@strtotime($value) !== false) { - try { - if (substr($value, -1) == 'Z') { - $value = substr($value, 0, strlen($value) - 1); - } - return new DateTime($value, new DateTimeZone('UTC')); - } - catch (Exception $ex) { - return false; - } - } - - return false; - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php b/library/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php deleted file mode 100644 index f7904d2ef2..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php +++ /dev/null @@ -1,351 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_WindowsAzure_Storage_TableEntityQuery -{ - /** - * From - * - * @var string - */ - protected $_from = ''; - - /** - * Where - * - * @var array - */ - protected $_where = array(); - - /** - * Order by - * - * @var array - */ - protected $_orderBy = array(); - - /** - * Top - * - * @var int - */ - protected $_top = null; - - /** - * Partition key - * - * @var string - */ - protected $_partitionKey = null; - - /** - * Row key - * - * @var string - */ - protected $_rowKey = null; - - /** - * Select clause - * - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function select() - { - return $this; - } - - /** - * From clause - * - * @param string $name Table name to select entities from - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function from($name) - { - $this->_from = $name; - return $this; - } - - /** - * Specify partition key - * - * @param string $value Partition key to query for - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function wherePartitionKey($value = null) - { - $this->_partitionKey = $value; - return $this; - } - - /** - * Specify row key - * - * @param string $value Row key to query for - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function whereRowKey($value = null) - { - $this->_rowKey = $value; - return $this; - } - - /** - * Add where clause - * - * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. - * @param string|array $value Value(s) to insert in question mark (?) parameters. - * @param string $cond Condition for the clause (and/or/not) - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function where($condition, $value = null, $cond = '') - { - $condition = $this->_replaceOperators($condition); - - if (!is_null($value)) { - $condition = $this->_quoteInto($condition, $value); - } - - if (count($this->_where) == 0) { - $cond = ''; - } else if ($cond !== '') { - $cond = ' ' . strtolower(trim($cond)) . ' '; - } - - $this->_where[] = $cond . $condition; - return $this; - } - - /** - * Add where clause with AND condition - * - * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. - * @param string|array $value Value(s) to insert in question mark (?) parameters. - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function andWhere($condition, $value = null) - { - return $this->where($condition, $value, 'and'); - } - - /** - * Add where clause with OR condition - * - * @param string $condition Condition, can contain question mark(s) (?) for parameter insertion. - * @param string|array $value Value(s) to insert in question mark (?) parameters. - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function orWhere($condition, $value = null) - { - return $this->where($condition, $value, 'or'); - } - - /** - * OrderBy clause - * - * @param string $column Column to sort by - * @param string $direction Direction to sort (asc/desc) - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function orderBy($column, $direction = 'asc') - { - $this->_orderBy[] = $column . ' ' . $direction; - return $this; - } - - /** - * Top clause - * - * @param int $top Top to fetch - * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery - */ - public function top($top = null) - { - $this->_top = (int)$top; - return $this; - } - - /** - * Assembles the query string - * - * @param boolean $urlEncode Apply URL encoding to the query string - * @return string - */ - public function assembleQueryString($urlEncode = false) - { - $query = array(); - if (count($this->_where) != 0) { - $filter = implode('', $this->_where); - $query[] = '$filter=' . ($urlEncode ? self::encodeQuery($filter) : $filter); - } - - if (count($this->_orderBy) != 0) { - $orderBy = implode(',', $this->_orderBy); - $query[] = '$orderby=' . ($urlEncode ? self::encodeQuery($orderBy) : $orderBy); - } - - if (!is_null($this->_top)) { - $query[] = '$top=' . $this->_top; - } - - if (count($query) != 0) { - return '?' . implode('&', $query); - } - - return ''; - } - - /** - * Assemble from - * - * @param boolean $includeParentheses Include parentheses? () - * @return string - */ - public function assembleFrom($includeParentheses = true) - { - $identifier = ''; - if ($includeParentheses) { - $identifier .= '('; - - if (!is_null($this->_partitionKey)) { - $identifier .= 'PartitionKey=\'' . self::encodeQuery($this->_partitionKey) . '\''; - } - - if (!is_null($this->_partitionKey) && !is_null($this->_rowKey)) { - $identifier .= ', '; - } - - if (!is_null($this->_rowKey)) { - $identifier .= 'RowKey=\'' . self::encodeQuery($this->_rowKey) . '\''; - } - - $identifier .= ')'; - } - return $this->_from . $identifier; - } - - /** - * Assemble full query - * - * @return string - */ - public function assembleQuery() - { - $assembledQuery = $this->assembleFrom(); - - $queryString = $this->assembleQueryString(); - if ($queryString !== '') { - $assembledQuery .= $queryString; - } - - return $assembledQuery; - } - - /** - * Quotes a variable into a condition - * - * @param string $text Condition, can contain question mark(s) (?) for parameter insertion. - * @param string|array $value Value(s) to insert in question mark (?) parameters. - * @return string - */ - protected function _quoteInto($text, $value = null) - { - if (!is_array($value)) { - $text = str_replace('?', '\'' . addslashes($value) . '\'', $text); - } else { - $i = 0; - while(strpos($text, '?') !== false) { - if (is_numeric($value[$i])) { - $text = substr_replace($text, $value[$i++], strpos($text, '?'), 1); - } else { - $text = substr_replace($text, '\'' . addslashes($value[$i++]) . '\'', strpos($text, '?'), 1); - } - } - } - return $text; - } - - /** - * Replace operators - * - * @param string $text - * @return string - */ - protected function _replaceOperators($text) - { - $text = str_replace('==', 'eq', $text); - $text = str_replace('>', 'gt', $text); - $text = str_replace('<', 'lt', $text); - $text = str_replace('>=', 'ge', $text); - $text = str_replace('<=', 'le', $text); - $text = str_replace('!=', 'ne', $text); - - $text = str_replace('&&', 'and', $text); - $text = str_replace('||', 'or', $text); - $text = str_replace('!', 'not', $text); - - return $text; - } - - /** - * urlencode a query - * - * @param string $query Query to encode - * @return string Encoded query - */ - public static function encodeQuery($query) - { - $query = str_replace('/', '%2F', $query); - $query = str_replace('?', '%3F', $query); - $query = str_replace(':', '%3A', $query); - $query = str_replace('@', '%40', $query); - $query = str_replace('&', '%26', $query); - $query = str_replace('=', '%3D', $query); - $query = str_replace('+', '%2B', $query); - $query = str_replace(',', '%2C', $query); - $query = str_replace('$', '%24', $query); - $query = str_replace('{', '%7B', $query); - $query = str_replace('}', '%7D', $query); - - $query = str_replace(' ', '%20', $query); - - return $query; - } - - /** - * __toString overload - * - * @return string - */ - public function __toString() - { - return $this->assembleQuery(); - } -} diff --git a/library/Zend/Service/WindowsAzure/Storage/TableInstance.php b/library/Zend/Service/WindowsAzure/Storage/TableInstance.php deleted file mode 100644 index 2799449b46..0000000000 --- a/library/Zend/Service/WindowsAzure/Storage/TableInstance.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @see Zend_Service_WindowsAzure_Storage_StorageEntityAbstract - */ -#require_once 'Zend/Service/WindowsAzure/Storage/StorageEntityAbstract.php'; - -/** - * @category Zend - * @package Zend_Service_WindowsAzure - * @subpackage Storage - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * - * @property string $Id Id - * @property string $Name Name - * @property string $Href Href - * @property string $Updated Updated - */ -class Zend_Service_WindowsAzure_Storage_TableInstance - extends Zend_Service_WindowsAzure_Storage_StorageEntityAbstract -{ - /** - * Constructor - * - * @param string $id Id - * @param string $name Name - * @param string $href Href - * @param string $updated Updated - */ - public function __construct($id, $name, $href, $updated) - { - $this->_data = array( - 'id' => $id, - 'name' => $name, - 'href' => $href, - 'updated' => $updated - ); - } -} diff --git a/library/Zend/Service/Yahoo.php b/library/Zend/Service/Yahoo.php deleted file mode 100644 index 0c63259821..0000000000 --- a/library/Zend/Service/Yahoo.php +++ /dev/null @@ -1,951 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** @see Zend_Xml_Security */ -#require_once 'Zend/Xml/Security.php'; - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo -{ - /** - * Yahoo Developer Application ID - * - * @var string - */ - public $appId; - - /** - * Reference to the REST client - * - * @var Zend_Rest_Client - */ - protected $_rest; - - - /** - * Sets the application ID and instantiates the REST client - * - * @param string $appId specified the developer's appid - * @return void - */ - public function __construct($appId) - { - $this->appId = (string) $appId; - /** - * @see Zend_Rest_Client - */ - #require_once 'Zend/Rest/Client.php'; - $this->_rest = new Zend_Rest_Client('http://search.yahooapis.com'); - } - - - /** - * Retrieve Inlink Data from siteexplorer.yahoo.com. A basic query - * consists simply of a URL. Additional options that can be - * specified consist of: - * 'results' => int How many results to return, max is 100 - * 'start' => int The start offset for search results - * 'entire_site' => bool Data for the whole site or a single page - * 'omit_inlinks' => (none|domain|subdomain) Filter inlinks from these sources - * - * @param string $query the query being run - * @param array $options any optional parameters - * @return Zend_Service_Yahoo_ResultSet The return set - * @throws Zend_Service_Exception - */ - public function inlinkDataSearch($query, array $options = array()) - { - static $defaultOptions = array('results' => '50', - 'start' => 1); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - $this->_validateInlinkDataSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/SiteExplorerService/V1/inlinkData', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Yahoo_InlinkDataResultSet - */ - #require_once 'Zend/Service/Yahoo/InlinkDataResultSet.php'; - return new Zend_Service_Yahoo_InlinkDataResultSet($dom); - } - - - /** - * Perform a search of images. The most basic query consists simply - * of a plain text search, but you can also specify the type of - * image, the format, color, etc. - * - * The specific options are: - * 'type' => (all|any|phrase) How to parse the query terms - * 'results' => int How many results to return, max is 50 - * 'start' => int The start offset for search results - * 'format' => (any|bmp|gif|jpeg|png) The type of images to search for - * 'coloration' => (any|color|bw) The coloration of images to search for - * 'adult_ok' => bool Flag to allow 'adult' images. - * - * @param string $query the query to be run - * @param array $options an optional array of query options - * @return Zend_Service_Yahoo_ImageResultSet the search results - * @throws Zend_Service_Exception - */ - public function imageSearch($query, array $options = array()) - { - static $defaultOptions = array('type' => 'all', - 'results' => 10, - 'start' => 1, - 'format' => 'any', - 'coloration' => 'any'); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - - $this->_validateImageSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/ImageSearchService/V1/imageSearch', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_YahooImageResultSet - */ - #require_once 'Zend/Service/Yahoo/ImageResultSet.php'; - return new Zend_Service_Yahoo_ImageResultSet($dom); - } - - - /** - * Perform a search on local.yahoo.com. The basic search - * consists of a query and some fragment of location information; - * for example zipcode, latitude/longitude, or street address. - * - * Query options include: - * 'results' => int How many results to return, max is 50 - * 'start' => int The start offset for search results - * 'sort' => (relevance|title|distance|rating) How to order your results - * - * 'radius' => float The radius (in miles) in which to search - * - * 'longitude' => float The longitude of the location to search around - * 'latitude' => float The latitude of the location to search around - * - * 'zip' => string The zipcode to search around - * - * 'street' => string The street address to search around - * 'city' => string The city for address search - * 'state' => string The state for address search - * 'location' => string An adhoc location string to search around - * - * @param string $query The query string you want to run - * @param array $options The search options, including location - * @return Zend_Service_Yahoo_LocalResultSet The results - * @throws Zend_Service_Exception - */ - public function localSearch($query, array $options = array()) - { - static $defaultOptions = array('results' => 10, - 'start' => 1, - 'sort' => 'distance', - 'radius' => 5); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - - $this->_validateLocalSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://local.yahooapis.com'); - $response = $this->_rest->restGet('/LocalSearchService/V1/localSearch', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Yahoo_LocalResultSet - */ - #require_once 'Zend/Service/Yahoo/LocalResultSet.php'; - return new Zend_Service_Yahoo_LocalResultSet($dom); - } - - - /** - * Execute a search on news.yahoo.com. This method minimally takes a - * text query to search on. - * - * Query options coonsist of: - * - * 'results' => int How many results to return, max is 50 - * 'start' => int The start offset for search results - * 'sort' => (rank|date) How to order your results - * 'language' => lang The target document language to match - * 'type' => (all|any|phrase) How the query should be parsed - * 'site' => string A site to which your search should be restricted - * - * @param string $query The query to run - * @param array $options The array of optional parameters - * @return Zend_Service_Yahoo_NewsResultSet The query return set - * @throws Zend_Service_Exception - */ - public function newsSearch($query, array $options = array()) - { - static $defaultOptions = array('type' => 'all', - 'start' => 1, - 'sort' => 'rank'); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - - $this->_validateNewsSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/NewsSearchService/V1/newsSearch', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Yahoo_NewsResultSet - */ - #require_once 'Zend/Service/Yahoo/NewsResultSet.php'; - return new Zend_Service_Yahoo_NewsResultSet($dom); - } - - - /** - * Retrieve Page Data from siteexplorer.yahoo.com. A basic query - * consists simply of a URL. Additional options that can be - * specified consist of: - * 'results' => int How many results to return, max is 100 - * 'start' => int The start offset for search results - * 'domain_only' => bool Data for just the given domain or all sub-domains also - * - * @param string $query the query being run - * @param array $options any optional parameters - * @return Zend_Service_Yahoo_ResultSet The return set - * @throws Zend_Service_Exception - */ - public function pageDataSearch($query, array $options = array()) - { - static $defaultOptions = array('results' => '50', - 'start' => 1); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - $this->_validatePageDataSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/SiteExplorerService/V1/pageData', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Yahoo_PageDataResultSet - */ - #require_once 'Zend/Service/Yahoo/PageDataResultSet.php'; - return new Zend_Service_Yahoo_PageDataResultSet($dom); - } - - - /** - * Perform a search of videos. The most basic query consists simply - * of a plain text search, but you can also specify the format of - * video. - * - * The specific options are: - * 'type' => (all|any|phrase) How to parse the query terms - * 'results' => int How many results to return, max is 50 - * 'start' => int The start offset for search results - * 'format' => (any|avi|flash|mpeg|msmedia|quicktime|realmedia) The type of videos to search for - * 'adult_ok' => bool Flag to allow 'adult' videos. - * - * @param string $query the query to be run - * @param array $options an optional array of query options - * @return Zend_Service_Yahoo_VideoResultSet the search results - * @throws Zend_Service_Exception - */ - public function videoSearch($query, array $options = array()) - { - static $defaultOptions = array('type' => 'all', - 'results' => 10, - 'start' => 1, - 'format' => 'any'); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - - $this->_validateVideoSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/VideoSearchService/V1/videoSearch', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_YahooVideoResultSet - */ - #require_once 'Zend/Service/Yahoo/VideoResultSet.php'; - return new Zend_Service_Yahoo_VideoResultSet($dom); - } - - - /** - * Perform a web content search on search.yahoo.com. A basic query - * consists simply of a text query. Additional options that can be - * specified consist of: - * 'results' => int How many results to return, max is 50 - * 'start' => int The start offset for search results - * 'language' => lang The target document language to match - * 'type' => (all|any|phrase) How the query should be parsed - * 'site' => string A site to which your search should be restricted - * 'format' => (any|html|msword|pdf|ppt|rss|txt|xls) - * 'adult_ok' => bool permit 'adult' content in the search results - * 'similar_ok' => bool permit similar results in the result set - * 'country' => string The country code for the content searched - * 'license' => (any|cc_any|cc_commercial|cc_modifiable) The license of content being searched - * 'region' => The regional search engine on which the service performs the search. default us. - * - * @param string $query the query being run - * @param array $options any optional parameters - * @return Zend_Service_Yahoo_WebResultSet The return set - * @throws Zend_Service_Exception - */ - public function webSearch($query, array $options = array()) - { - static $defaultOptions = array('type' => 'all', - 'start' => 1, - 'results' => 10, - 'format' => 'any'); - - $options = $this->_prepareOptions($query, $options, $defaultOptions); - $this->_validateWebSearch($options); - - $this->_rest->getHttpClient()->resetParameters(); - $this->_rest->setUri('http://search.yahooapis.com'); - $response = $this->_rest->restGet('/WebSearchService/V1/webSearch', $options); - - if ($response->isError()) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . - $response->getStatus()); - } - - $dom = new DOMDocument(); - $dom = Zend_Xml_Security::scan($response->getBody(), $dom); - self::_checkErrors($dom); - - /** - * @see Zend_Service_Yahoo_WebResultSet - */ - #require_once 'Zend/Service/Yahoo/WebResultSet.php'; - return new Zend_Service_Yahoo_WebResultSet($dom); - } - - - /** - * Returns a reference to the REST client - * - * @return Zend_Rest_Client - */ - public function getRestClient() - { - return $this->_rest; - } - - - /** - * Validate Inlink Data Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateInlinkDataSearch(array $options) - { - $validOptions = array('appid', 'query', 'results', 'start', 'entire_site', 'omit_inlinks'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 100, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['omit_inlinks'])) { - $this->_validateInArray('omit_inlinks', $options['omit_inlinks'], array('none', 'domain', 'subdomain')); - } - } - - - /** - * Validate Image Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateImageSearch(array $options) - { - $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'coloration', 'adult_ok'); - - $this->_compareOptions($options, $validOptions); - - if (isset($options['type'])) { - switch($options['type']) { - case 'all': - case 'any': - case 'phrase': - break; - default: - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'type': '{$options['type']}'"); - } - } - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 50, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['format'])) { - switch ($options['format']) { - case 'any': - case 'bmp': - case 'gif': - case 'jpeg': - case 'png': - break; - default: - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'format': {$options['format']}"); - } - } - - if (isset($options['coloration'])) { - switch ($options['coloration']) { - case 'any': - case 'color': - case 'bw': - break; - default: - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'coloration': " - . "{$options['coloration']}"); - } - } - } - - - /** - * Validate Local Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateLocalSearch(array $options) - { - $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'radius', 'street', - 'city', 'state', 'zip', 'location', 'latitude', 'longitude'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 20, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(20)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['longitude']) && !$between->setMin(-90)->setMax(90)->isValid($options['longitude'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'longitude': {$options['longitude']}"); - } - - if (isset($options['latitude']) && !$between->setMin(-180)->setMax(180)->isValid($options['latitude'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'latitude': {$options['latitude']}"); - } - - if (isset($options['zip']) && !preg_match('/(^\d{5}$)|(^\d{5}-\d{4}$)/', $options['zip'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'zip': {$options['zip']}"); - } - - $hasLocation = false; - $locationFields = array('street', 'city', 'state', 'zip', 'location'); - foreach ($locationFields as $field) { - if (isset($options[$field]) && $options[$field] != '') { - $hasLocation = true; - break; - } - } - - if (!$hasLocation && (!isset($options['latitude']) || !isset($options['longitude']))) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Location data are required but missing'); - } - - if (!in_array($options['sort'], array('relevance', 'title', 'distance', 'rating'))) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'sort': {$options['sort']}"); - } - } - - - /** - * Validate News Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateNewsSearch(array $options) - { - $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'language', 'type', 'site'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 50, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['language'])) { - $this->_validateLanguage($options['language']); - } - - $this->_validateInArray('sort', $options['sort'], array('rank', 'date')); - $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); - } - - - /** - * Validate Page Data Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validatePageDataSearch(array $options) - { - $validOptions = array('appid', 'query', 'results', 'start', 'domain_only'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 100, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - } - - - /** - * Validate Video Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateVideoSearch(array $options) - { - $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'adult_ok'); - - $this->_compareOptions($options, $validOptions); - - if (isset($options['type'])) { - $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); - } - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 50, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['format'])) { - $this->_validateInArray('format', $options['format'], array('any', 'avi', 'flash', 'mpeg', 'msmedia', 'quicktime', 'realmedia')); - } - } - - - /** - * Validate Web Search Options - * - * @param array $options - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateWebSearch(array $options) - { - $validOptions = array('appid', 'query', 'results', 'start', 'language', 'type', 'format', 'adult_ok', - 'similar_ok', 'country', 'site', 'subscription', 'license', 'region'); - - $this->_compareOptions($options, $validOptions); - - /** - * @see Zend_Validate_Between - */ - #require_once 'Zend/Validate/Between.php'; - $between = new Zend_Validate_Between(1, 100, true); - - if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); - } - - if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); - } - - if (isset($options['language'])) { - $this->_validateLanguage($options['language']); - } - - $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); - $this->_validateInArray('format', $options['format'], array('any', 'html', 'msword', 'pdf', 'ppt', 'rss', - 'txt', 'xls')); - if (isset($options['license'])) { - $this->_validateInArray('license', $options['license'], array('any', 'cc_any', 'cc_commercial', - 'cc_modifiable')); - } - - if (isset($options['region'])){ - $this->_validateInArray('region', $options['region'], array('ar', 'au', 'at', 'br', 'ca', 'ct', 'dk', 'fi', - 'fr', 'de', 'in', 'id', 'it', 'my', 'mx', - 'nl', 'no', 'ph', 'ru', 'sg', 'es', 'se', - 'ch', 'th', 'uk', 'us')); - } - } - - - /** - * Prepare options for sending to Yahoo! - * - * @param string $query Search Query - * @param array $options User specified options - * @param array $defaultOptions Required/Default options - * @return array - */ - protected function _prepareOptions($query, array $options, array $defaultOptions = array()) - { - $options['appid'] = $this->appId; - $options['query'] = (string) $query; - - return array_merge($defaultOptions, $options); - } - - - /** - * Throws an exception if the chosen language is not supported - * - * @param string $lang Language code - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateLanguage($lang) - { - $languages = array('ar', 'bg', 'ca', 'szh', 'tzh', 'hr', 'cs', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'el', - 'he', 'hu', 'is', 'id', 'it', 'ja', 'ko', 'lv', 'lt', 'no', 'fa', 'pl', 'pt', 'ro', 'ru', 'sk', 'sr', 'sl', - 'es', 'sv', 'th', 'tr' - ); - if (!in_array($lang, $languages)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("The selected language '$lang' is not supported"); - } - } - - - /** - * Utility function to check for a difference between two arrays. - * - * @param array $options User specified options - * @param array $validOptions Valid options - * @return void - * @throws Zend_Service_Exception if difference is found (e.g., unsupported query option) - */ - protected function _compareOptions(array $options, array $validOptions) - { - $difference = array_diff(array_keys($options), $validOptions); - if ($difference) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('The following parameters are invalid: ' . join(', ', $difference)); - } - } - - - /** - * Check that a named value is in the given array - * - * @param string $name Name associated with the value - * @param mixed $value Value - * @param array $array Array in which to check for the value - * @return void - * @throws Zend_Service_Exception - */ - protected function _validateInArray($name, $value, array $array) - { - if (!in_array($value, $array)) { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception("Invalid value for option '$name': $value"); - } - } - - - /** - * Check if response is an error - * - * @param DOMDocument $dom DOM Object representing the result XML - * @return void - * @throws Zend_Service_Exception Thrown when the result from Yahoo! is an error - */ - protected static function _checkErrors(DOMDocument $dom) - { - $xpath = new DOMXPath($dom); - $xpath->registerNamespace('yapi', 'urn:yahoo:api'); - - if ($xpath->query('//yapi:Error')->length >= 1) { - $message = $xpath->query('//yapi:Error/yapi:Message/text()')->item(0)->data; - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception($message); - } - } -} diff --git a/library/Zend/Service/Yahoo/Image.php b/library/Zend/Service/Yahoo/Image.php deleted file mode 100644 index defdddec45..0000000000 --- a/library/Zend/Service/Yahoo/Image.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_Image -{ - /** - * Image URL - * - * @var string - */ - public $Url; - - /** - * Image height in pixels - * - * @var int - */ - public $Height; - - /** - * Image width in pixels - * - * @var int - */ - public $Width; - - - /** - * Initializes the image - * - * @param DOMNode $dom - * @param string $namespace - * @return void - */ - public function __construct(DOMNode $dom, $namespace) - { - $xpath = new DOMXPath($dom->ownerDocument); - $xpath->registerNamespace('yh', $namespace); - $this->Url = Zend_Uri::factory($xpath->query('./yh:Url/text()', $dom)->item(0)->data); - $this->Height = (int) $xpath->query('./yh:Height/text()', $dom)->item(0)->data; - $this->Width = (int) $xpath->query('./yh:Width/text()', $dom)->item(0)->data; - } -} diff --git a/library/Zend/Service/Yahoo/ImageResult.php b/library/Zend/Service/Yahoo/ImageResult.php deleted file mode 100644 index 4e1b9558de..0000000000 --- a/library/Zend/Service/Yahoo/ImageResult.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_ImageResult extends Zend_Service_Yahoo_Result -{ - /** - * Summary info for the image - * - * @var string - */ - public $Summary; - - /** - * The URL of the webpage hosting the image - * - * @var string - */ - public $RefererUrl; - - /** - * The size of the files in bytes - * - * @var string - */ - public $FileSize; - - /** - * The type of file (bmp, gif, jpeg, etc.) - * - * @var string - */ - public $FileFormat; - - /** - * The height of the image in pixels - * - * @var string - */ - public $Height; - - /** - * The width of the image in pixels - * - * @var string - */ - public $Width; - - /** - * The thubmnail image for the article, if it exists - * - * @var Zend_Service_Yahoo_Image - */ - public $Thumbnail; - - /** - * Image result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srchmi'; - - - /** - * Initializes the image result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Thumbnail'); - - parent::__construct($result); - - $this->_setThumbnail(); - } -} diff --git a/library/Zend/Service/Yahoo/ImageResultSet.php b/library/Zend/Service/Yahoo/ImageResultSet.php deleted file mode 100644 index 1d6fcad13c..0000000000 --- a/library/Zend/Service/Yahoo/ImageResultSet.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_ImageResult - */ -#require_once 'Zend/Service/Yahoo/ImageResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_ImageResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * Image result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srchmi'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_ImageResult - */ - public function current() - { - return new Zend_Service_Yahoo_ImageResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/InlinkDataResult.php b/library/Zend/Service/Yahoo/InlinkDataResult.php deleted file mode 100644 index e12243cb6e..0000000000 --- a/library/Zend/Service/Yahoo/InlinkDataResult.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_InlinkDataResult extends Zend_Service_Yahoo_Result -{ - /** - * Web result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Initializes the web result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array(); - parent::__construct($result); - } -} diff --git a/library/Zend/Service/Yahoo/InlinkDataResultSet.php b/library/Zend/Service/Yahoo/InlinkDataResultSet.php deleted file mode 100644 index cc3836eae2..0000000000 --- a/library/Zend/Service/Yahoo/InlinkDataResultSet.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_WebResult - */ -#require_once 'Zend/Service/Yahoo/InlinkDataResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_InlinkDataResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * Web result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_InlinkDataResult - */ - public function current() - { - return new Zend_Service_Yahoo_InlinkDataResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/LocalResult.php b/library/Zend/Service/Yahoo/LocalResult.php deleted file mode 100644 index 3e865baf9e..0000000000 --- a/library/Zend/Service/Yahoo/LocalResult.php +++ /dev/null @@ -1,124 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_LocalResult extends Zend_Service_Yahoo_Result -{ - /** - * Street address of the result - * - * @var string - */ - public $Address; - - /** - * City in which the result resides - * - * @var string - */ - public $City; - - /** - * State in which the result resides - * - * @var string - */ - public $State; - - /** - * Phone number for the result - * - * @var string - */ - public $Phone; - - /** - * User-submitted rating for the result - * - * @var string - */ - public $Rating; - - /** - * The distance to the result from your specified location - * - * @var string - */ - public $Distance; - - /** - * A URL of a map for the result - * - * @var string - */ - public $MapUrl; - - /** - * The URL for the business website, if known - * - * @var string - */ - public $BusinessUrl; - - /** - * The URL for linking to the business website, if known - * - * @var string - */ - public $BusinessClickUrl; - - /** - * Local result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:lcl'; - - - /** - * Initializes the local result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array('Address','City', 'City', 'State', 'Phone', 'Rating', 'Distance', 'MapUrl', - 'BusinessUrl', 'BusinessClickUrl'); - - parent::__construct($result); - } -} diff --git a/library/Zend/Service/Yahoo/LocalResultSet.php b/library/Zend/Service/Yahoo/LocalResultSet.php deleted file mode 100644 index d64b53972b..0000000000 --- a/library/Zend/Service/Yahoo/LocalResultSet.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_LocalResult - */ -#require_once 'Zend/Service/Yahoo/LocalResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_LocalResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * The URL of a webpage containing a map graphic with all returned results plotted on it. - * - * @var string - */ - public $resultSetMapURL; - - /** - * Local result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:lcl'; - - - /** - * Initializes the local result set - * - * @param DOMDocument $dom - * @return void - */ - public function __construct(DOMDocument $dom) - { - parent::__construct($dom); - - $this->resultSetMapURL = $this->_xpath->query('//yh:ResultSetMapUrl/text()')->item(0)->data; - } - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_LocalResult - */ - public function current() - { - return new Zend_Service_Yahoo_LocalResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/NewsResult.php b/library/Zend/Service/Yahoo/NewsResult.php deleted file mode 100644 index 83d25caccb..0000000000 --- a/library/Zend/Service/Yahoo/NewsResult.php +++ /dev/null @@ -1,112 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_NewsResult extends Zend_Service_Yahoo_Result -{ - /** - * Sumamry text associated with the result article - * - * @var string - */ - public $Summary; - - /** - * The company who distributed the article - * - * @var string - */ - public $NewsSource; - - /** - * The URL for the company who distributed the article - * - * @var string - */ - public $NewsSourceUrl; - - /** - * The language the article is in - * - * @var string - */ - public $Language; - - /** - * The date the article was published (in unix timestamp format) - * - * @var string - */ - public $PublishDate; - - /** - * The date the article was modified (in unix timestamp format) - * - * @var string - */ - public $ModificationDate; - - /** - * The thubmnail image for the article, if it exists - * - * @var Zend_Service_Yahoo_Image - */ - public $Thumbnail; - - /** - * News result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:yn'; - - - /** - * Initializes the news result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array('Summary', 'NewsSource', 'NewsSourceUrl', 'Language', 'PublishDate', - 'ModificationDate', 'Thumbnail'); - - parent::__construct($result); - - $this->_setThumbnail(); - } -} diff --git a/library/Zend/Service/Yahoo/NewsResultSet.php b/library/Zend/Service/Yahoo/NewsResultSet.php deleted file mode 100644 index 7fd347cf30..0000000000 --- a/library/Zend/Service/Yahoo/NewsResultSet.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_NewsResult - */ -#require_once 'Zend/Service/Yahoo/NewsResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_NewsResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * News result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:yn'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_NewsResult - */ - public function current() - { - return new Zend_Service_Yahoo_NewsResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/PageDataResult.php b/library/Zend/Service/Yahoo/PageDataResult.php deleted file mode 100644 index 2dc767a58a..0000000000 --- a/library/Zend/Service/Yahoo/PageDataResult.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_PageDataResult extends Zend_Service_Yahoo_Result -{ - /** - * Web result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Initializes the web result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array(); - parent::__construct($result); - } -} diff --git a/library/Zend/Service/Yahoo/PageDataResultSet.php b/library/Zend/Service/Yahoo/PageDataResultSet.php deleted file mode 100644 index 582f396659..0000000000 --- a/library/Zend/Service/Yahoo/PageDataResultSet.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_WebResult - */ -#require_once 'Zend/Service/Yahoo/PageDataResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_PageDataResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * Web result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_WebResult - */ - public function current() - { - return new Zend_Service_Yahoo_PageDataResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/Result.php b/library/Zend/Service/Yahoo/Result.php deleted file mode 100644 index 6fba287df7..0000000000 --- a/library/Zend/Service/Yahoo/Result.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_Result -{ - /** - * The title of the search entry - * - * @var string - */ - public $Title; - - /** - * The URL of the found object - * - * @var string - */ - public $Url; - - /** - * The URL for linking to the found object - * - * @var string - */ - public $ClickUrl; - - /** - * Result fields - * - * @var array - */ - protected $_fields; - - /** - * REST response fragment for the result - * - * @var DOMElement - */ - protected $_result; - - /** - * Object for XPath queries - * - * @var DOMXPath - */ - protected $_xpath; - - - /** - * Initializes the result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - // default fields for all search results: - $fields = array('Title', 'Url', 'ClickUrl'); - - // merge w/ child's fields - $this->_fields = array_merge($this->_fields, $fields); - - $this->_xpath = new DOMXPath($result->ownerDocument); - $this->_xpath->registerNamespace('yh', $this->_namespace); - - // add search results to appropriate fields - - foreach ($this->_fields as $f) { - $query = "./yh:$f/text()"; - $node = $this->_xpath->query($query, $result); - if ($node->length == 1) { - $this->{$f} = $node->item(0)->data; - } - } - - $this->_result = $result; - } - - - /** - * Sets the Thumbnail property - * - * @return void - */ - protected function _setThumbnail() - { - $node = $this->_xpath->query('./yh:Thumbnail', $this->_result); - if ($node->length == 1) { - /** - * @see Zend_Service_Yahoo_Image - */ - #require_once 'Zend/Service/Yahoo/Image.php'; - $this->Thumbnail = new Zend_Service_Yahoo_Image($node->item(0), $this->_namespace); - } else { - $this->Thumbnail = null; - } - } -} diff --git a/library/Zend/Service/Yahoo/ResultSet.php b/library/Zend/Service/Yahoo/ResultSet.php deleted file mode 100644 index b81f0a28cb..0000000000 --- a/library/Zend/Service/Yahoo/ResultSet.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_ResultSet implements SeekableIterator -{ - /** - * Total number of results available - * - * @var int - */ - public $totalResultsAvailable; - - /** - * The number of results in this result set - * - * @var int - */ - public $totalResultsReturned; - - /** - * The offset in the total result set of this search set - * - * @var int - */ - public $firstResultPosition; - - /** - * A DOMNodeList of results - * - * @var DOMNodeList - */ - protected $_results; - - /** - * Yahoo Web Service Return Document - * - * @var DOMDocument - */ - protected $_dom; - - /** - * Xpath Object for $this->_dom - * - * @var DOMXPath - */ - protected $_xpath; - - /** - * Current Index for SeekableIterator - * - * @var int - */ - protected $_currentIndex = 0; - - - /** - * Parse the search response and retrieve the results for iteration - * - * @param DOMDocument $dom the REST fragment for this object - * @return void - */ - public function __construct(DOMDocument $dom) - { - $this->totalResultsAvailable = (int) $dom->documentElement->getAttribute('totalResultsAvailable'); - $this->totalResultsReturned = (int) $dom->documentElement->getAttribute('totalResultsReturned'); - $this->firstResultPosition = (int) $dom->documentElement->getAttribute('firstResultPosition'); - - $this->_dom = $dom; - $this->_xpath = new DOMXPath($dom); - - $this->_xpath->registerNamespace('yh', $this->_namespace); - - $this->_results = $this->_xpath->query('//yh:Result'); - } - - - /** - * Total Number of results returned - * - * @return int Total number of results returned - */ - public function totalResults() - { - return $this->totalResultsReturned; - } - - - /** - * Implement SeekableIterator::current() - * - * Must be implemented by child classes - * - * @throws Zend_Service_Exception - * @return Zend_Service_Yahoo_Result - */ - public function current() - { - /** - * @see Zend_Service_Exception - */ - #require_once 'Zend/Service/Exception.php'; - throw new Zend_Service_Exception('Zend_Service_Yahoo_ResultSet::current() must be implemented by child ' - . 'classes'); - } - - - /** - * Implement SeekableIterator::key() - * - * @return int - */ - public function key() - { - return $this->_currentIndex; - } - - - /** - * Implement SeekableIterator::next() - * - * @return void - */ - public function next() - { - $this->_currentIndex += 1; - } - - - /** - * Implement SeekableIterator::rewind() - * - * @return void - */ - public function rewind() - { - $this->_currentIndex = 0; - } - - - /** - * Implement SeekableIterator::seek() - * - * @param int $index - * @return void - * @throws OutOfBoundsException - */ - public function seek($index) - { - $indexInt = (int) $index; - if ($indexInt >= 0 && $indexInt < $this->_results->length) { - $this->_currentIndex = $indexInt; - } else { - throw new OutOfBoundsException("Illegal index '$index'"); - } - } - - - /** - * Implement SeekableIterator::valid() - * - * @return boolean - */ - public function valid() - { - return $this->_currentIndex < $this->_results->length; - } -} diff --git a/library/Zend/Service/Yahoo/VideoResult.php b/library/Zend/Service/Yahoo/VideoResult.php deleted file mode 100644 index 1f177fcbdf..0000000000 --- a/library/Zend/Service/Yahoo/VideoResult.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_VideoResult extends Zend_Service_Yahoo_Result -{ - /** - * Summary info for the video - * - * @var string - */ - public $Summary; - - /** - * The URL of the webpage hosting the video - * - * @var string - */ - public $RefererUrl; - - /** - * The size of the files in bytes - * - * @var string - */ - public $FileSize; - - /** - * The type of file (bmp, gif, jpeg, etc.) - * - * @var string - */ - public $FileFormat; - - /** - * The height of the video in pixels - * - * @var string - */ - public $Height; - - /** - * The width of the video in pixels - * - * @var string - */ - public $Width; - - /** - * The duration of the video in seconds - * - * @var string - */ - public $Duration; - - /** - * The number of audio channels in the video - * - * @var string - */ - public $Channels; - - /** - * Whether the video is streamed or not - * - * @var boolean - */ - public $Streaming; - - /** - * The thubmnail video for the article, if it exists - * - * @var Zend_Service_Yahoo_Video - */ - public $Thumbnail; - - /** - * Video result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srchmv'; - - - /** - * Initializes the video result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Duration', 'Channels', 'Streaming', 'Thumbnail'); - - parent::__construct($result); - - $this->_setThumbnail(); - } -} diff --git a/library/Zend/Service/Yahoo/VideoResultSet.php b/library/Zend/Service/Yahoo/VideoResultSet.php deleted file mode 100644 index a5dece73f3..0000000000 --- a/library/Zend/Service/Yahoo/VideoResultSet.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_VideoResult - */ -#require_once 'Zend/Service/Yahoo/VideoResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_VideoResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * Video result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srchmv'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_VideoResult - */ - public function current() - { - return new Zend_Service_Yahoo_VideoResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/library/Zend/Service/Yahoo/WebResult.php b/library/Zend/Service/Yahoo/WebResult.php deleted file mode 100644 index d0f3affc9c..0000000000 --- a/library/Zend/Service/Yahoo/WebResult.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_Result - */ -#require_once 'Zend/Service/Yahoo/Result.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_WebResult extends Zend_Service_Yahoo_Result -{ - /** - * A summary of the result - * - * @var string - */ - public $Summary; - - /** - * The file type of the result (text, html, pdf, etc.) - * - * @var string - */ - public $MimeType; - - /** - * The modification time of the result (as a unix timestamp) - * - * @var string - */ - public $ModificationDate; - - /** - * The URL for the Yahoo cache of this page, if it exists - * - * @var string - */ - public $CacheUrl; - - /** - * The size of the cache entry - * - * @var int - */ - public $CacheSize; - - /** - * Web result namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Initializes the web result - * - * @param DOMElement $result - * @return void - */ - public function __construct(DOMElement $result) - { - $this->_fields = array('Summary', 'MimeType', 'ModificationDate'); - parent::__construct($result); - - $this->_xpath = new DOMXPath($result->ownerDocument); - $this->_xpath->registerNamespace('yh', $this->_namespace); - - // check if the cache section exists - $cacheUrl = $this->_xpath->query('./yh:Cache/yh:Url/text()', $result)->item(0); - if ($cacheUrl instanceof DOMNode) - { - $this->CacheUrl = $cacheUrl->data; - } - $cacheSize = $this->_xpath->query('./yh:Cache/yh:Size/text()', $result)->item(0); - if ($cacheSize instanceof DOMNode) - { - $this->CacheSize = (int) $cacheSize->data; - } - } -} diff --git a/library/Zend/Service/Yahoo/WebResultSet.php b/library/Zend/Service/Yahoo/WebResultSet.php deleted file mode 100644 index a9b7fb13ab..0000000000 --- a/library/Zend/Service/Yahoo/WebResultSet.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Yahoo_ResultSet - */ -#require_once 'Zend/Service/Yahoo/ResultSet.php'; - - -/** - * @see Zend_Service_Yahoo_WebResult - */ -#require_once 'Zend/Service/Yahoo/WebResult.php'; - - -/** - * @category Zend - * @package Zend_Service - * @subpackage Yahoo - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Yahoo_WebResultSet extends Zend_Service_Yahoo_ResultSet -{ - /** - * Web result set namespace - * - * @var string - */ - protected $_namespace = 'urn:yahoo:srch'; - - - /** - * Overrides Zend_Service_Yahoo_ResultSet::current() - * - * @return Zend_Service_Yahoo_WebResult - */ - public function current() - { - return new Zend_Service_Yahoo_WebResult($this->_results->item($this->_currentIndex)); - } -} diff --git a/tests/Zend/Service/AkismetTest.php b/tests/Zend/Service/AkismetTest.php deleted file mode 100644 index ac176457d6..0000000000 --- a/tests/Zend/Service/AkismetTest.php +++ /dev/null @@ -1,234 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Akismet - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @see Zend_Service_Akismet - */ -require_once 'Zend/Service/Akismet.php'; - -/** - * @see Zend_Http_Client_Adapter_Test - */ -require_once 'Zend/Http/Client/Adapter/Test.php'; - -/** - * @category Zend - * @package Zend_Service_Akismet - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Akismet - */ -class Zend_Service_AkismetTest extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->akismet = new Zend_Service_Akismet('somebogusapikey', 'http://framework.zend.com/wiki/'); - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Akismet::setHttpClient($client); - - $this->comment = array( - 'user_ip' => '71.161.221.76', - 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1)', - 'comment_type' => 'comment', - 'comment_content' => 'spam check' - ); - } - - public function testBlogUrl() - { - $this->assertEquals('http://framework.zend.com/wiki/', $this->akismet->getBlogUrl()); - $this->akismet->setBlogUrl('http://framework.zend.com/'); - $this->assertEquals('http://framework.zend.com/', $this->akismet->getBlogUrl()); - } - - public function testApiKey() - { - $this->assertEquals('somebogusapikey', $this->akismet->getApiKey()); - $this->akismet->setApiKey('invalidapikey'); - $this->assertEquals('invalidapikey', $this->akismet->getApiKey()); - } - - public function testCharset() - { - $this->assertEquals('UTF-8', $this->akismet->getCharset()); - $this->akismet->setCharset('ISO-8859-1'); - $this->assertEquals('ISO-8859-1', $this->akismet->getCharset()); - } - - public function testPort() - { - $this->assertEquals(80, $this->akismet->getPort()); - $this->akismet->setPort(8080); - $this->assertEquals(8080, $this->akismet->getPort()); - } - - public function testUserAgent() - { - $this->akismet->setUserAgent('MyUserAgent/1.0 | Akismet/1.11'); - $this->assertEquals('MyUserAgent/1.0 | Akismet/1.11', $this->akismet->getUserAgent()); - } - - public function testUserAgentDefaultMatchesFrameworkVersion() - { - $this->assertContains('Zend Framework/' . Zend_Version::VERSION, $this->akismet->getUserAgent()); - } - - public function testVerifyKey() - { - $response = "HTTP/1.0 200 OK\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "Content-length: 5\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:41:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "valid"; - $this->adapter->setResponse($response); - $this->assertTrue($this->akismet->verifyKey()); - - $response = "HTTP/1.0 200 OK\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "Content-length: 7\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:41:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "invalid"; - $this->adapter->setResponse($response); - $this->assertFalse($this->akismet->verifyKey()); - } - - public function testIsSpamThrowsExceptionOnInvalidKey() - { - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "X-akismet-server: 72.21.44.242\r\n" - . "Content-length: 7\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:50:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "invalid"; - $this->adapter->setResponse($response); - try { - $this->akismet->isSpam($this->comment); - $this->fail('Response of "invalid" should trigger exception'); - } catch (Exception $e) { - // success - } - } - - public function testIsSpam() - { - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "X-akismet-server: 72.21.44.242\r\n" - . "Content-length: 4\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:50:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "true"; - $this->adapter->setResponse($response); - $this->assertTrue($this->akismet->isSpam($this->comment)); - - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "X-akismet-server: 72.21.44.242\r\n" - . "Content-length: 5\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:50:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "false"; - $this->adapter->setResponse($response); - $this->assertFalse($this->akismet->isSpam($this->comment)); - } - - public function testSubmitSpamThrowsExceptionOnInvalidKey() - { - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/plain; charset=utf-8\r\n" - . "X-akismet-server: 72.21.44.242\r\n" - . "Content-length: 7\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 14:50:24 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "invalid"; - $this->adapter->setResponse($response); - try { - $this->akismet->submitSpam($this->comment); - $this->fail('Response of "invalid" should trigger exception'); - } catch (Exception $e) { - // success - } - } - - public function testSubmitSpam() - { - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/html\r\n" - . "Content-length: 41\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 15:01:47 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "Thanks for making the web a better place."; - $this->adapter->setResponse($response); - try { - $this->akismet->submitSpam($this->comment); - } catch (Exception $e) { - $this->fail('Valid key should not throw exceptions'); - } - } - - public function testSubmitHam() - { - $response = "HTTP/1.0 200 OK\r\n" - . "X-powered-by: PHP/4.4.2\r\n" - . "Content-type: text/html\r\n" - . "Content-length: 41\r\n" - . "Server: LiteSpeed\r\n" - . "Date: Tue, 06 Feb 2007 15:01:47 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "Thanks for making the web a better place."; - $this->adapter->setResponse($response); - try { - $this->akismet->submitHam($this->comment); - } catch (Exception $e) { - $this->fail('Valid key should not throw exceptions'); - } - } -} diff --git a/tests/Zend/Service/AllTests.php b/tests/Zend/Service/AllTests.php deleted file mode 100644 index d887a830c6..0000000000 --- a/tests/Zend/Service/AllTests.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_AllTests::main'); -} - -require_once 'Zend/Service/AkismetTest.php'; -require_once 'Zend/Service/Amazon/AllTests.php'; -require_once 'Zend/Service/Audioscrobbler/AllTests.php'; -require_once 'Zend/Service/Delicious/AllTests.php'; -require_once 'Zend/Service/Ebay/AllTests.php'; -require_once 'Zend/Service/Flickr/AllTests.php'; -require_once 'Zend/Service/LiveDocx/AllTests.php'; -require_once 'Zend/Service/ReCaptcha/AllTests.php'; -require_once 'Zend/Service/ShortUrl/AllTests.php'; -require_once 'Zend/Service/SlideShareTest.php'; -require_once 'Zend/Service/StrikeIron/AllTests.php'; -require_once 'Zend/Service/Twitter/AllTests.php'; -require_once 'Zend/Service/WindowsAzure/AllTests.php'; -require_once 'Zend/Service/Yahoo/AllTests.php'; - -/** - * @category Zend - * @package Zend_Service - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - */ -class Zend_Service_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service'); - - $suite->addTestSuite('Zend_Service_AkismetTest'); - $suite->addTest(Zend_Service_Amazon_AllTests::suite()); - $suite->addTest(Zend_Service_Audioscrobbler_AllTests::suite()); - $suite->addTest(Zend_Service_Delicious_AllTests::suite()); - $suite->addTest(Zend_Service_Ebay_AllTests::suite()); - $suite->addTest(Zend_Service_Flickr_AllTests::suite()); - $suite->addTest(Zend_Service_LiveDocx_AllTests::suite()); - $suite->addTest(Zend_Service_ReCaptcha_AllTests::suite()); - $suite->addTest(Zend_Service_ShortUrl_AllTests::suite()); - $suite->addTestSuite('Zend_Service_SlideShareTest'); - $suite->addTest(Zend_Service_StrikeIron_AllTests::suite()); - $suite->addTest(Zend_Service_Twitter_AllTests::suite()); - $suite->addTest(Zend_Service_WindowsAzure_AllTests::suite()); - $suite->addTest(Zend_Service_Yahoo_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_AllTests::main') { - Zend_Service_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/AbstractTest.php b/tests/Zend/Service/Amazon/AbstractTest.php deleted file mode 100644 index 8551b17a8d..0000000000 --- a/tests/Zend/Service/Amazon/AbstractTest.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Abstract.php'; - -/** - * @todo: Rename class to Zend_Service_Amazon_AbstractTest - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - */ -class AmamzonAbstract extends PHPUnit_Framework_TestCase -{ - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - parent::tearDown(); - } - - public function testNoKeysThrowException() - { - try { - $class = new TestAmamzonAbstract(); - $this->fail('Exception should be thrown when no keys are passed in.'); - } catch(Zend_Service_Amazon_Exception $zsae) {} - } - - public function testConstructorWithKeysDoesNotThrowException() - { - try { - $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey'); - } catch(Zend_Service_Amazon_Exception $zsae) { - $this->fail('Exception should be thrown when no keys are passed in.'); - } - } - - public function testSetStaticKeys() - { - TestAmamzonAbstract::setKeys('TestAccessKey', 'TestSecretKey'); - $class = new TestAmamzonAbstract(); - - $this->assertEquals('TestAccessKey', $class->returnAccessKey()); - $this->assertEquals('TestSecretKey', $class->returnSecretKey()); - } - - public function testPassKeysIntoConstructor() - { - $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey'); - - $this->assertEquals('TestAccessKey', $class->returnAccessKey()); - $this->assertEquals('TestSecretKey', $class->returnSecretKey()); - } - - public function testPassedInKeysOverrideStaticSetKeys() - { - TestAmamzonAbstract::setKeys('TestStaticAccessKey', 'TestStaticSecretKey'); - $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey'); - - $this->assertEquals('TestAccessKey', $class->returnAccessKey()); - $this->assertEquals('TestSecretKey', $class->returnSecretKey()); - } -} - -class TestAmamzonAbstract extends Zend_Service_Amazon_Abstract -{ - public function returnAccessKey() - { - return $this->_accessKey; - } - - public function returnSecretKey() - { - return $this->_secretKey; - } - -} - diff --git a/tests/Zend/Service/Amazon/AllTests.php b/tests/Zend/Service/Amazon/AllTests.php deleted file mode 100644 index fff74dca72..0000000000 --- a/tests/Zend/Service/Amazon/AllTests.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_AllTests::main'); -} - -require_once 'Zend/Service/Amazon/OfflineTest.php'; -require_once 'Zend/Service/Amazon/OnlineTest.php'; -require_once 'Zend/Service/Amazon/Ec2/AllTests.php'; -require_once 'Zend/Service/Amazon/S3/AllTests.php'; -require_once 'Zend/Service/Amazon/SimpleDb/AllTests.php'; -require_once 'Zend/Service/Amazon/Sqs/AllTests.php'; -require_once 'Zend/Service/Amazon/Authentication/AllTests.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - */ -class Zend_Service_Amazon_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service_Amazon'); - - $suite->addTestSuite('Zend_Service_Amazon_OfflineTest'); - if (defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') && - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') && - defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID')) { - $suite->addTestSuite('Zend_Service_Amazon_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Amazon_OnlineTest_Skip'); - } - - $suite->addTest(Zend_Service_Amazon_Authentication_AllTests::suite()); - $suite->addTest(Zend_Service_Amazon_Ec2_AllTests::suite()); - $suite->addTest(Zend_Service_Amazon_S3_AllTests::suite()); - $suite->addTest(Zend_Service_Amazon_SimpleDb_AllTests::suite()); - $suite->addTest(Zend_Service_Amazon_Sqs_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_AllTests::main') { - Zend_Service_Amazon_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/Authentication/AllTests.php b/tests/Zend/Service/Amazon/Authentication/AllTests.php deleted file mode 100644 index bb47b6f047..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/AllTests.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AllTests.php 11973 2008-10-15 16:00:56Z matthew $ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_Authentication_AllTests::main'); -} - -/** - * @see Zend_Service_Amazon_SimpleDb_OfflineTest - */ -require_once 'Zend/Service/Amazon/SimpleDb/OfflineTest.php'; - -/** - * @see Zend_Service_Amazon_SimpleDb_OnlineTest - */ -require_once 'Zend/Service/Amazon/SimpleDb/OnlineTest.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_Authentication_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service - Amazon - Authentication'); - - if (defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEY') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ) { - $suite->addTestSuite('Zend_Service_Amazon_Authentication_S3Test'); - $suite->addTestSuite('Zend_Service_Amazon_Authentication_V1Test'); - $suite->addTestSuite('Zend_Service_Amazon_Authentication_V2Test'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_Authentication_AllTests::main') { - Zend_Service_Amazon_Authentication_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/Authentication/S3Test.php b/tests/Zend/Service/Amazon/Authentication/S3Test.php deleted file mode 100644 index 302b52ef2e..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/S3Test.php +++ /dev/null @@ -1,180 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AllTests.php 11973 2008-10-15 16:00:56Z matthew $ - */ - -require_once 'Zend/Service/Amazon/Authentication/S3.php'; - -/** - * S3 authentication test case - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_Authentication_S3Test extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Authentication_S3 - */ - private $Zend_Service_Amazon_Authentication_S3; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - // TODO Auto-generated Zend_Service_Amazon_Authentication_S3Test::setUp() - - - $this->Zend_Service_Amazon_Authentication_S3 = new Zend_Service_Amazon_Authentication_S3('0PN5J17HBGZHT7JJ3X82', 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o', '2006-03-01'); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - // TODO Auto-generated Zend_Service_Amazon_Authentication_S3Test::tearDown() - - - $this->Zend_Service_Amazon_Authentication_S3 = null; - - parent::tearDown(); - } - - - public function testGetGeneratesCorrectSignature() - { - $headers = array(); - $headers['Date'] = "Tue, 27 Mar 2007 19:36:42 +0000"; - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('GET', 'http://s3.amazonaws.com/johnsmith/photos/puppy.jpg', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:soqB4L9flQ6AHG4d5FVnKj26D2s=', $headers['Authorization']); - $this->assertEquals($ret, "GET - - -Tue, 27 Mar 2007 19:36:42 +0000 -//johnsmith/photos/puppy.jpg"); - } - - public function testPutGeneratesCorrectSignature() - { - $headers = array(); - $headers['Date'] = "Tue, 27 Mar 2007 21:15:45 +0000"; - $headers['Content-Type'] = "image/jpeg"; - $headers['Content-Length'] = 94328; - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('PUT', 'http://s3.amazonaws.com/johnsmith/photos/puppy.jpg', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:88cf7BdpjrBlCsIiWWLn8wLpWzI=', $headers['Authorization']); - $this->assertEquals($ret, "PUT - -image/jpeg -Tue, 27 Mar 2007 21:15:45 +0000 -//johnsmith/photos/puppy.jpg"); - } - - public function testListGeneratesCorrectSignature() - { - $headers = array(); - $headers['Date'] = "Tue, 27 Mar 2007 19:42:41 +0000"; - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('GET', 'http://s3.amazonaws.com/johnsmith/?prefix=photos&max-keys=50&marker=puppy', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:pm3Adv2BIFCCJiUSikcLcGYFtiA=', $headers['Authorization']); - $this->assertEquals($ret, "GET - - -Tue, 27 Mar 2007 19:42:41 +0000 -//johnsmith/"); - } - - public function testFetchGeneratesCorrectSignature() - { - $headers = array(); - $headers['Date'] = "Tue, 27 Mar 2007 19:44:46 +0000"; - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('GET', 'http://s3.amazonaws.com/johnsmith/?acl', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:TCNlZPuxY41veihZbxjnjw8P93w=', $headers['Authorization']); - $this->assertEquals($ret, "GET - - -Tue, 27 Mar 2007 19:44:46 +0000 -//johnsmith/?acl"); - } - - public function testDeleteGeneratesCorrectSignature() - { - - $headers = array(); - $headers['x-amz-date'] = "Tue, 27 Mar 2007 21:20:26 +0000"; - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('DELETE', 'http://s3.amazonaws.com/johnsmith/photos/puppy.jpg', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:O9AsSXUIowhjTiJC5escAqjsAyk=', $headers['Authorization']); - $this->assertEquals($ret, "DELETE - - - -x-amz-date:Tue, 27 Mar 2007 21:20:26 +0000 -//johnsmith/photos/puppy.jpg"); - } - - public function testUploadGeneratesCorrectSignature() - { - $headers = array(); - $headers['Date'] = "Tue, 27 Mar 2007 21:06:08 +0000"; - $headers['x-amz-acl'] = "public-read"; - $headers['content-type'] = "application/x-download"; - $headers['Content-MD5'] = "4gJE4saaMU4BqNR0kLY+lw=="; - $headers['X-Amz-Meta-ReviewedBy'][] = "joe@johnsmith.net"; - $headers['X-Amz-Meta-ReviewedBy'][] = "jane@johnsmith.net"; - $headers['X-Amz-Meta-FileChecksum'] = "0x02661779"; - $headers['X-Amz-Meta-ChecksumAlgorithm'] = "crc32"; - $headers['Content-Disposition'] = "attachment; filename=database.dat"; - $headers['Content-Encoding'] = "gzip"; - $headers['Content-Length'] = "5913339"; - - - $ret = $this->Zend_Service_Amazon_Authentication_S3->generateSignature('PUT', 'http://s3.amazonaws.com/static.johnsmith.net/db-backup.dat.gz', $headers); - - $this->assertEquals('AWS 0PN5J17HBGZHT7JJ3X82:IQh2zwCpX2xqRgP2rbIkXL/GVbA=', $headers['Authorization']); - $this->assertEquals($ret, "PUT -4gJE4saaMU4BqNR0kLY+lw== -application/x-download -Tue, 27 Mar 2007 21:06:08 +0000 -x-amz-acl:public-read -x-amz-meta-checksumalgorithm:crc32 -x-amz-meta-filechecksum:0x02661779 -x-amz-meta-reviewedby:joe@johnsmith.net,jane@johnsmith.net -//static.johnsmith.net/db-backup.dat.gz"); - } - -} - diff --git a/tests/Zend/Service/Amazon/Authentication/V1Test.php b/tests/Zend/Service/Amazon/Authentication/V1Test.php deleted file mode 100644 index 573753cdd0..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/V1Test.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AllTests.php 11973 2008-10-15 16:00:56Z matthew $ - */ - -require_once 'Zend/Service/Amazon/Authentication/V1.php'; - -/** - * Amazon V1 authentication test case - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_Authentication_V1Test extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Authentication_V2 - */ - private $Zend_Service_Amazon_Authentication_V2; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Authentication_V1 = new Zend_Service_Amazon_Authentication_V1('0PN5J17HBGZHT7JJ3X82', 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o', '2007-12-01'); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - $this->Zend_Service_Amazon_Authentication_V1 = null; - - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Authentication_V2::generateSignature() - */ - public function testGenerateDevPaySignature() - { - $url = "https://ls.amazonaws.com/"; - $params = array(); - $params['Action'] = "ActivateHostedProduct"; - $params['Timestamp'] = "2009-11-11T13:52:38Z"; - - $ret = $this->Zend_Service_Amazon_Authentication_V1->generateSignature($url, $params); - - $this->assertEquals('31Q2YlgABM5X3GkYQpGErcL10Xc=', $params['Signature']); - $this->assertEquals("ActionActivateHostedProductAWSAccessKeyId0PN5J17HBGZHT7JJ3X82SignatureVersion1Timestamp2009-11-11T13:52:38ZVersion2007-12-01", $ret); - } - -} - diff --git a/tests/Zend/Service/Amazon/Authentication/V2Test.php b/tests/Zend/Service/Amazon/Authentication/V2Test.php deleted file mode 100644 index f8388864e6..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/V2Test.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AllTests.php 11973 2008-10-15 16:00:56Z matthew $ - */ - -require_once 'Zend/Service/Amazon/Authentication/V2.php'; - -/** - * Amazon V2 authentication test case - * - * @category Zend - * @package Zend_Service_Amazon_Authentication - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_Authentication_V2Test extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Authentication_V2 - */ - private $Zend_Service_Amazon_Authentication_V2; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Authentication_V2 = new Zend_Service_Amazon_Authentication_V2('0PN5J17HBGZHT7JJ3X82', 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o', '2009-07-15'); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - $this->Zend_Service_Amazon_Authentication_V2 = null; - - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Authentication_V2::generateSignature() - */ - public function testGenerateEc2PostSignature() - { - $url = "https://ec2.amazonaws.com/"; - $params = array(); - $params['Action'] = "DescribeImages"; - $params['ImageId.1'] = "ami-2bb65342"; - $params['Timestamp'] = "2009-11-11T13:52:38Z"; - - $ret = $this->Zend_Service_Amazon_Authentication_V2->generateSignature($url, $params); - - $this->assertEquals('8B2cxwK/dfezT49KEzD+wjo1ZbJCddyFOLA0RNZobbc=', $params['Signature']); - $this->assertEquals(file_get_contents(dirname(__FILE__) . '/_files/ec2_v2_return.txt'), $ret); - } - - public function testGenerateSqsGetSignature() - { - $url = "https://queue.amazonaws.com/770098461991/queue2"; - $params = array(); - $params['Action'] = "SetQueueAttributes"; - $params['Attribute.Name'] = "VisibilityTimeout"; - $params['Attribute.Value'] = "90"; - $params['Timestamp'] = "2009-11-11T13:52:38Z"; - - $this->Zend_Service_Amazon_Authentication_V2->setHttpMethod('GET'); - $ret = $this->Zend_Service_Amazon_Authentication_V2->generateSignature($url, $params); - - $this->assertEquals('YSw7HXDqokM/A6DhLz8kG+sd+oD5eMjqx3a02A0+GkE=', $params['Signature']); - $this->assertEquals(file_get_contents(dirname(__FILE__) . '/_files/sqs_v2_get_return.txt'), $ret); - } - -} - diff --git a/tests/Zend/Service/Amazon/Authentication/_files/ec2_v2_return.txt b/tests/Zend/Service/Amazon/Authentication/_files/ec2_v2_return.txt deleted file mode 100644 index af3af2a474..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/_files/ec2_v2_return.txt +++ /dev/null @@ -1,4 +0,0 @@ -POST -ec2.amazonaws.com -/ -AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Action=DescribeImages&ImageId.1=ami-2bb65342&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-11T13%3A52%3A38Z&Version=2009-07-15 \ No newline at end of file diff --git a/tests/Zend/Service/Amazon/Authentication/_files/sqs_v2_get_return.txt b/tests/Zend/Service/Amazon/Authentication/_files/sqs_v2_get_return.txt deleted file mode 100644 index 2aa8f78d00..0000000000 --- a/tests/Zend/Service/Amazon/Authentication/_files/sqs_v2_get_return.txt +++ /dev/null @@ -1,4 +0,0 @@ -GET -queue.amazonaws.com -/770098461991/queue2 -AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Action=SetQueueAttributes&Attribute.Name=VisibilityTimeout&Attribute.Value=90&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-11T13%3A52%3A38Z&Version=2009-07-15 \ No newline at end of file diff --git a/tests/Zend/Service/Amazon/Ec2/AbstractTest.php b/tests/Zend/Service/Amazon/Ec2/AbstractTest.php deleted file mode 100644 index d8f539fc85..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/AbstractTest.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AbstractTest.php 17667 2009-08-18 21:40:09Z mikaelkael $ - */ - -require_once 'Zend/Service/Amazon/Ec2/Abstract.php'; - -/** - * @todo: Rename class to Zend_Service_Amazon_AbstractTest - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_AbstractTest extends PHPUnit_Framework_TestCase -{ - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - parent::tearDown(); - } - - public function testNoKeysThrowException() - { - try { - $class = new TestAmamzonEc2Abstract(); - $this->fail('Exception should be thrown when no keys are passed in.'); - } catch(Zend_Service_Amazon_Exception $zsae) {} - } - - public function testSetRegion() - { - TestAmamzonEc2Abstract::setRegion('eu-west-1'); - - $class = new TestAmamzonEc2Abstract('TestAccessKey', 'TestSecretKey'); - $this->assertEquals('eu-west-1', $class->returnRegion()); - } - - public function testSetInvalidRegionThrowsException() - { - try { - TestAmamzonEc2Abstract::setRegion('eu-west-1a'); - $this->fail('Invalid Region Set with no Exception Thrown'); - } catch (Zend_Service_Amazon_Exception $zsae) { - // do nothing - } - } - - public function testSignParamsWithSpaceEncodesWithPercentInsteadOfPlus() - { - $class = new TestAmamzonEc2Abstract('TestAccessKey', 'TestSecretKey'); - $ret = $class->testSign(array('Action' => 'Space Test')); - - // this is the encode signuature with urlencode - It's Invalid! - $invalidSignature = 'EeHAfo7cMcLyvH4SW4fEpjo51xJJ4ES1gdjRPxZTlto='; - - $this->assertNotEquals($ret, $invalidSignature); - } -} - -class TestAmamzonEc2Abstract extends Zend_Service_Amazon_Ec2_Abstract -{ - - public function returnRegion() - { - return $this->_region; - } - - public function testSign($params) - { - return $this->signParameters($params); - } -} - diff --git a/tests/Zend/Service/Amazon/Ec2/AllTests.php b/tests/Zend/Service/Amazon/Ec2/AllTests.php deleted file mode 100644 index cfd83b7c92..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/AllTests.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_Ec2_AllTests::main'); -} - -require_once 'Zend/Service/Amazon/Ec2/AvailabilityzonesTest.php'; -require_once 'Zend/Service/Amazon/Ec2/EbsTest.php'; -require_once 'Zend/Service/Amazon/Ec2/Ec2Test.php'; -require_once 'Zend/Service/Amazon/Ec2/ElasticipTest.php'; -require_once 'Zend/Service/Amazon/Ec2/ImageTest.php'; -require_once 'Zend/Service/Amazon/Ec2/InstanceTest.php'; -require_once 'Zend/Service/Amazon/Ec2/KeypairTest.php'; -require_once 'Zend/Service/Amazon/Ec2/RegionTest.php'; -require_once 'Zend/Service/Amazon/Ec2/SecuritygroupsTest.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Constructs the test suite handler. - */ - public function __construct() - { - } - - /** - * Creates the suite. - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service_Amazon_Ec2'); - - $suite->addTestSuite('Zend_Service_Amazon_Ec2_AvailabilityzonesTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_EbsTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_Ec2Test'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_ElasticipTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_ImageTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_InstanceTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_KeypairTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_RegionTest'); - $suite->addTestSuite('Zend_Service_Amazon_Ec2_SecuritygroupsTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_Ec2_AllTests::main') { - Zend_Service_Amazon_Ec2_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/Ec2/AvailabilityzonesTest.php b/tests/Zend/Service/Amazon/Ec2/AvailabilityzonesTest.php deleted file mode 100644 index f1773c1ecd..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/AvailabilityzonesTest.php +++ /dev/null @@ -1,143 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Availabilityzones.php'; - -/** - * Zend_Service_Amazon_Ec2_Availabilityzones test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_AvailabilityzonesTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Availabilityzones - */ - private $Zend_Service_Amazon_Ec2_Availabilityzones; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Availabilityzones = new Zend_Service_Amazon_Ec2_Availabilityzones('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Availabilityzones::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Availabilityzones = null; - - parent::tearDown(); - } - - public function testDescribeSingleAvailabilityZone() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeAvailabilityZonesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <availabilityZoneInfo>\r\n" - . " <item>\r\n" - . " <zoneName>us-east-1a</zoneName>\r\n" - . " <zoneState>available</zoneState>\r\n" - . " </item>\r\n" - . " </availabilityZoneInfo>\r\n" - . "</DescribeAvailabilityZonesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Availabilityzones->describe('us-east-1a'); - $this->assertTrue(is_array($response)); - $this->assertEquals('us-east-1a', $response[0]['zoneName']); - $this->assertEquals('available', $response[0]['zoneState']); - } - - public function testDescribeMultipleAvailabilityZones() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeAvailabilityZonesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <availabilityZoneInfo>\r\n" - . " <item>\r\n" - . " <zoneName>us-east-1a</zoneName>\r\n" - . " <zoneState>available</zoneState>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <zoneName>us-east-1b</zoneName>\r\n" - . " <zoneState>available</zoneState>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <zoneName>us-east-1c</zoneName>\r\n" - . " <zoneState>available</zoneState>\r\n" - . " </item>\r\n" - . " </availabilityZoneInfo>\r\n" - . "</DescribeAvailabilityZonesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Availabilityzones->describe(); - - $this->assertTrue(is_array($response)); - - $arrExpected = array('us-east-1a', 'us-east-1b', 'us-east-1c'); - foreach ($response as $k => $node) { - $this->assertEquals($arrExpected[$k], $node['zoneName']); - } - } -} - diff --git a/tests/Zend/Service/Amazon/Ec2/CloudWatchTest.php b/tests/Zend/Service/Amazon/Ec2/CloudWatchTest.php deleted file mode 100644 index 85a9c34f0a..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/CloudWatchTest.php +++ /dev/null @@ -1,318 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Ec2/CloudWatch.php'; -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; - -/** - * Zend_Service_Amazon_Ec2_CloudWatch test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_CloudWatchTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_CloudWatch - */ - private $Zend_Service_Amazon_Ec2_CloudWatch; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - $this->Zend_Service_Amazon_Ec2_CloudWatch = new Zend_Service_Amazon_Ec2_CloudWatch('access_key', 'secret_access_key'); - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_CloudWatch::setHttpClient($client); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - $this->Zend_Service_Amazon_Ec2_CloudWatch = null; - - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Ec2_CloudWatch->getMetricStatistics() - */ - public function testGetMetricStatistics() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<GetMetricStatisticsResponse xmlns=\"http://monitoring.amazonaws.com/doc/2009-05-15/\">\r\n" - ." <GetMetricStatisticsResult>\r\n" - ." <Datapoints>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-06-16T23:57:00Z</Timestamp>\r\n" - ." <Unit>Bytes</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>14838.0</Average>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-06-17T00:16:00Z</Timestamp>\r\n" - ." <Unit>Bytes</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>18251.0</Average>\r\n" - ." </member>\r\n" - ." </Datapoints>\r\n" - ." <Label>NetworkIn</Label>" - ." </GetMetricStatisticsResult>\r\n" - ."</GetMetricStatisticsResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_CloudWatch->getMetricStatistics(array('MeasureName' => 'NetworkIn', 'Statistics' => array('Average'))); - - $arrReturn = array( - 'label' => 'NetworkIn', - 'datapoints' => array( - array( - 'Timestamp' => '2009-06-16T23:57:00Z', - 'Unit' => 'Bytes', - 'Samples' => '1.0', - 'Average' => '14838.0', - ), - array( - 'Timestamp' => '2009-06-17T00:16:00Z', - 'Unit' => 'Bytes', - 'Samples' => '1.0', - 'Average' => '18251.0', - ) - ) - ); - - $this->assertSame($arrReturn, $return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_CloudWatch->listMetrics() - */ - public function testListMetrics() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<ListMetricsResponse xmlns=\"http://monitoring.amazonaws.com/doc/2009-05-15/\">\r\n" - ." <ListMetricsResult>\r\n" - ." <Metrics>\r\n" - ." <member>\r\n" - ." <Dimensions>\r\n" - ." <member>\r\n" - ." <Name>InstanceId</Name>\r\n" - ." <Value>i-bec576d7</Value>\r\n" - ." </member>\r\n" - ." </Dimensions>\r\n" - ." <MeasureName>NetworkIn</MeasureName>\r\n" - ." <Namespace>AWS/EC2</Namespace>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Dimensions>\r\n" - ." <member>\r\n" - ." <Name>InstanceId</Name>\r\n" - ." <Value>i-bec576d7</Value>\r\n" - ." </member>\r\n" - ." </Dimensions>\r\n" - ." <MeasureName>CPUUtilization</MeasureName>\r\n" - ." <Namespace>AWS/EC2</Namespace>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Dimensions/>\r\n" - ." <MeasureName>NetworkIn</MeasureName>\r\n" - ." <Namespace>AWS/EC2</Namespace>\r\n" - ." </member>\r\n" - ." </Metrics>\r\n" - ." </ListMetricsResult>\r\n" - ."</ListMetricsResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_CloudWatch->listMetrics(); - - $arrReturn = array( - array( - 'MeasureName' => 'NetworkIn', - 'Namespace' => 'AWS/EC2', - 'Deminsions' => array( - 'name' => 'InstanceId', - 'value' => 'i-bec576d7' - ) - ), - array( - 'MeasureName' => 'CPUUtilization', - 'Namespace' => 'AWS/EC2', - 'Deminsions' => array( - 'name' => 'InstanceId', - 'value' => 'i-bec576d7' - ) - ), - array( - 'MeasureName' => 'NetworkIn', - 'Namespace' => 'AWS/EC2', - 'Deminsions' => array() - ) - ); - - $this->assertSame($arrReturn, $return); - } - - public function testZF8149() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<GetMetricStatisticsResponse xmlns=\"http://monitoring.amazonaws.com/doc/2009-05-15/\">\r\n" - ." <GetMetricStatisticsResult>\r\n" - ." <Datapoints>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-11-19T21:52:00Z</Timestamp>\r\n" - ." <Unit>Percent</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>0.09</Average>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-11-19T21:55:00Z</Timestamp>\r\n" - ." <Unit>Percent</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>0.18</Average>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-11-19T21:54:00Z</Timestamp>\r\n" - ." <Unit>Percent</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>0.09</Average>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-11-19T21:51:00Z</Timestamp>\r\n" - ." <Unit>Percent</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>0.18</Average>\r\n" - ." </member>\r\n" - ." <member>\r\n" - ." <Timestamp>2009-11-19T21:53:00Z</Timestamp>\r\n" - ." <Unit>Percent</Unit>\r\n" - ." <Samples>1.0</Samples>\r\n" - ." <Average>0.09</Average>\r\n" - ." </member>\r\n" - ." </Datapoints>\r\n" - ." <Label>CPUUtilization</Label>\r\n" - ." </GetMetricStatisticsResult>\r\n" - ." <ResponseMetadata>\r\n" - ." <RequestId>6fb864fd-d557-11de-ac37-475775222f21</RequestId>\r\n" - ." </ResponseMetadata>\r\n" - ."</GetMetricStatisticsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_CloudWatch->getMetricStatistics( - array( - 'MeasureName' => 'CPUUtilization', - 'Statistics' => array('Average'), - 'Dimensions'=> array('InstanceId'=>'i-93ba31fa'), - 'StartTime'=> '2009-11-19T21:51:57+00:00', - 'EndTime'=> '2009-11-19T21:56:57+00:00' - ) - ); - - $arrReturn = array ( - 'label' => 'CPUUtilization', - 'datapoints' => - array ( - 0 => - array ( - 'Timestamp' => '2009-11-19T21:52:00Z', - 'Unit' => 'Percent', - 'Samples' => '1.0', - 'Average' => '0.09', - ), - 1 => - array ( - 'Timestamp' => '2009-11-19T21:55:00Z', - 'Unit' => 'Percent', - 'Samples' => '1.0', - 'Average' => '0.18', - ), - 2 => - array ( - 'Timestamp' => '2009-11-19T21:54:00Z', - 'Unit' => 'Percent', - 'Samples' => '1.0', - 'Average' => '0.09', - ), - 3 => - array ( - 'Timestamp' => '2009-11-19T21:51:00Z', - 'Unit' => 'Percent', - 'Samples' => '1.0', - 'Average' => '0.18', - ), - 4 => - array ( - 'Timestamp' => '2009-11-19T21:53:00Z', - 'Unit' => 'Percent', - 'Samples' => '1.0', - 'Average' => '0.09', - ), - ), - ); - - $this->assertSame($arrReturn, $return); - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/EbsTest.php b/tests/Zend/Service/Amazon/Ec2/EbsTest.php deleted file mode 100644 index ddd6a0d415..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/EbsTest.php +++ /dev/null @@ -1,580 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Ebs.php'; - -/** - * Zend_Service_Amazon_Ec2_Ebs test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_EbsTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Ebs - */ - private $Zend_Service_Amazon_Ec2_Ebs; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - $this->Zend_Service_Amazon_Ec2_Ebs = new Zend_Service_Amazon_Ec2_Ebs('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Ebs::setHttpClient($client); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - $this->Zend_Service_Amazon_Ec2_Ebs = null; - - parent::tearDown(); - } - - public function testAttachVolume() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<AttachVolumeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <instanceId>i-6058a509</instanceId>\r\n" - . " <device>/dev/sdh</device>\r\n" - . " <status>attaching</status>\r\n" - . " <attachTime>2008-05-07T11:51:50.000Z</attachTime>\r\n" - . "</AttachVolumeResponse >"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->attachVolume('vol-4d826724', 'i-6058a509', '/dev/sdh'); - - $arrAttach = array( - 'volumeId' => 'vol-4d826724', - 'instanceId' => 'i-6058a509', - 'device' => '/dev/sdh', - 'status' => 'attaching', - 'attachTime' => '2008-05-07T11:51:50.000Z' - ); - - $this->assertSame($arrAttach, $return); - } - - public function testCreateSnapshot() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<CreateSnapshotResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <snapshotId>snap-78a54011</snapshotId>\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <status>pending</status>\r\n" - . " <startTime>2008-05-07T11:51:50.000Z</startTime>\r\n" - . " <progress></progress>\r\n" - . "</CreateSnapshotResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->createSnapshot('vol-4d826724'); - - $arrCreateSnapShot = array( - 'snapshotId' => 'snap-78a54011', - 'volumeId' => 'vol-4d826724', - 'status' => 'pending', - 'startTime' => '2008-05-07T11:51:50.000Z', - 'progress' => '' - ); - - $this->assertSame($arrCreateSnapShot, $return); - - } - - public function testCreateNewVolume() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<CreateVolumeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <size>400</size>\r\n" - . " <status>creating</status>\r\n" - . " <createTime>2008-05-07T11:51:50.000Z</createTime>\r\n" - . " <availabilityZone>us-east-1a</availabilityZone>\r\n" - . " <snapshotId></snapshotId>\r\n" - . "</CreateVolumeResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->createNewVolume(400, 'us-east-1a'); - - $arrCreateNewVolume = array( - 'volumeId' => 'vol-4d826724', - 'size' => '400', - 'status' => 'creating', - 'createTime' => '2008-05-07T11:51:50.000Z', - 'availabilityZone' => 'us-east-1a' - ); - - $this->assertSame($arrCreateNewVolume, $return); - - } - - public function testCreateVolumeFromSnapshot() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<CreateVolumeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <size>400</size>\r\n" - . " <status>creating</status>\r\n" - . " <createTime>2008-05-07T11:51:50.000Z</createTime>\r\n" - . " <availabilityZone>us-east-1a</availabilityZone>\r\n" - . " <snapshotId>snap-78a54011</snapshotId>\r\n" - . "</CreateVolumeResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->createVolumeFromSnapshot('snap-78a54011', 'us-east-1a'); - - $arrCreateNewVolume = array( - 'volumeId' => 'vol-4d826724', - 'size' => '400', - 'status' => 'creating', - 'createTime' => '2008-05-07T11:51:50.000Z', - 'availabilityZone' => 'us-east-1a', - 'snapshotId' => 'snap-78a54011' - ); - - $this->assertSame($arrCreateNewVolume, $return); - - } - - public function testDeleteSnapshot() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DeleteSnapshotResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DeleteSnapshotResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->deleteSnapshot('snap-78a54011'); - - $this->assertTrue($return); - - } - - public function testDeleteVolume() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DeleteVolumeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DeleteVolumeResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->deleteVolume('vol-4d826724'); - - $this->assertTrue($return); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Ebs->describeSnapshot() - */ - public function testDescribeSingleSnapshot() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeSnapshotsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <snapshotSet>\r\n" - . " <item>\r\n" - . " <snapshotId>snap-78a54011</snapshotId>\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <status>pending</status>\r\n" - . " <startTime>2008-05-07T12:51:50.000Z</startTime>\r\n" - . " <progress>80%</progress>\r\n" - . " </item>\r\n" - . " </snapshotSet>\r\n" - . "</DescribeSnapshotsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->describeSnapshot('snap-78a54011'); - - $arrSnapshot = array(array( - 'snapshotId' => 'snap-78a54011', - 'volumeId' => 'vol-4d826724', - 'status' => 'pending', - 'startTime' => '2008-05-07T12:51:50.000Z', - 'progress' => '80%' - )); - - $this->assertSame($arrSnapshot, $return); - - - } - - public function testDescribeMultipleSnapshots() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeSnapshotsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <snapshotSet>\r\n" - . " <item>\r\n" - . " <snapshotId>snap-78a54011</snapshotId>\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <status>pending</status>\r\n" - . " <startTime>2008-05-07T12:51:50.000Z</startTime>\r\n" - . " <progress>80%</progress>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <snapshotId>snap-78a54012</snapshotId>\r\n" - . " <volumeId>vol-4d826725</volumeId>\r\n" - . " <status>pending</status>\r\n" - . " <startTime>2008-08-07T12:51:50.000Z</startTime>\r\n" - . " <progress>65%</progress>\r\n" - . " </item>\r\n" - . " </snapshotSet>\r\n" - . "</DescribeSnapshotsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->describeSnapshot(array('snap-78a54011', 'snap-78a54012')); - - $arrSnapshots = array( - array( - 'snapshotId' => 'snap-78a54011', - 'volumeId' => 'vol-4d826724', - 'status' => 'pending', - 'startTime' => '2008-05-07T12:51:50.000Z', - 'progress' => '80%', - ), - array( - 'snapshotId' => 'snap-78a54012', - 'volumeId' => 'vol-4d826725', - 'status' => 'pending', - 'startTime' => '2008-08-07T12:51:50.000Z', - 'progress' => '65%', - ) - ); - - $this->assertSame($arrSnapshots, $return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Ebs->describeVolume() - */ - public function testDescribeSingleVolume() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeVolumesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . "<volumeSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <size>800</size>\r\n" - . " <status>in-use</status>\r\n" - . " <createTime>2008-05-07T11:51:50.000Z</createTime>\r\n" - . " <attachmentSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <instanceId>i-6058a509</instanceId>\r\n" - . " <device>/dev/sdh</device>\r\n" - . " <snapshotId>snap-12345678</snapshotId>\r\n" - . " <availabilityZone>us-east-1a</availabilityZone>\r\n" - . " <status>attached</status>\r\n" - . " <attachTime>2008-05-07T12:51:50.000Z</attachTime>\r\n" - . " </item>\r\n" - . " </attachmentSet>\r\n" - . " </item>\r\n" - . "</volumeSet>\r\n" - . "</DescribeVolumesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->describeVolume('vol-4282672b'); - - $arrVolumes = array( - array( - 'volumeId' => 'vol-4282672b', - 'size' => '800', - 'status' => 'in-use', - 'createTime' => '2008-05-07T11:51:50.000Z', - 'attachmentSet' => array( - 'volumeId' => 'vol-4282672b', - 'instanceId' => 'i-6058a509', - 'device' => '/dev/sdh', - 'status' => 'attached', - 'attachTime' => '2008-05-07T12:51:50.000Z', - ) - ) - ); - - $this->assertSame($arrVolumes, $return); - - } - - public function testDescribeMultipleVolume() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeVolumesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . "<volumeSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <size>800</size>\r\n" - . " <status>in-use</status>\r\n" - . " <createTime>2008-05-07T11:51:50.000Z</createTime>\r\n" - . " <attachmentSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <instanceId>i-6058a509</instanceId>\r\n" - . " <device>/dev/sdh</device>\r\n" - . " <snapshotId>snap-12345678</snapshotId>\r\n" - . " <availabilityZone>us-east-1a</availabilityZone>\r\n" - . " <status>attached</status>\r\n" - . " <attachTime>2008-05-07T12:51:50.000Z</attachTime>\r\n" - . " </item>\r\n" - . " </attachmentSet>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <volumeId>vol-42826775</volumeId>\r\n" - . " <size>40</size>\r\n" - . " <status>available</status>\r\n" - . " <createTime>2008-08-07T11:51:50.000Z</createTime>\r\n" - . " </item>\r\n" - . "</volumeSet>\r\n" - . "</DescribeVolumesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->describeVolume(array('vol-4282672b', 'vol-42826775')); - - $arrVolumes = array( - array( - 'volumeId' => 'vol-4282672b', - 'size' => '800', - 'status' => 'in-use', - 'createTime' => '2008-05-07T11:51:50.000Z', - 'attachmentSet' => array( - 'volumeId' => 'vol-4282672b', - 'instanceId' => 'i-6058a509', - 'device' => '/dev/sdh', - 'status' => 'attached', - 'attachTime' => '2008-05-07T12:51:50.000Z', - ) - ), - array( - 'volumeId' => 'vol-42826775', - 'size' => '40', - 'status' => 'available', - 'createTime' => '2008-08-07T11:51:50.000Z' - ) - ); - - $this->assertSame($arrVolumes, $return); - } - - public function testDescribeAttachedVolumes() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeVolumesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . "<volumeSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <size>800</size>\r\n" - . " <status>in-use</status>\r\n" - . " <createTime>2008-05-07T11:51:50.000Z</createTime>\r\n" - . " <attachmentSet>\r\n" - . " <item>\r\n" - . " <volumeId>vol-4282672b</volumeId>\r\n" - . " <instanceId>i-6058a509</instanceId>\r\n" - . " <device>/dev/sdh</device>\r\n" - . " <snapshotId>snap-12345678</snapshotId>\r\n" - . " <availabilityZone>us-east-1a</availabilityZone>\r\n" - . " <status>attached</status>\r\n" - . " <attachTime>2008-05-07T12:51:50.000Z</attachTime>\r\n" - . " </item>\r\n" - . " </attachmentSet>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <volumeId>vol-42826775</volumeId>\r\n" - . " <size>40</size>\r\n" - . " <status>available</status>\r\n" - . " <createTime>2008-08-07T11:51:50.000Z</createTime>\r\n" - . " </item>\r\n" - . "</volumeSet>\r\n" - . "</DescribeVolumesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->describeAttachedVolumes('i-6058a509'); - - $arrVolumes = array( - array( - 'volumeId' => 'vol-4282672b', - 'size' => '800', - 'status' => 'in-use', - 'createTime' => '2008-05-07T11:51:50.000Z', - 'attachmentSet' => array( - 'volumeId' => 'vol-4282672b', - 'instanceId' => 'i-6058a509', - 'device' => '/dev/sdh', - 'status' => 'attached', - 'attachTime' => '2008-05-07T12:51:50.000Z', - ) - ) - ); - - $this->assertSame($arrVolumes, $return); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Ebs->detachVolume() - */ - public function testDetachVolume() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DetachVolumeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <volumeId>vol-4d826724</volumeId>\r\n" - . " <instanceId>i-6058a509</instanceId>\r\n" - . " <device>/dev/sdh</device>\r\n" - . " <status>detaching</status>\r\n" - . " <attachTime>2008-05-08T11:51:50.000Z</attachTime>\r\n" - . "</DetachVolumeResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Ebs->detachVolume('vol-4d826724'); - - $arrVolume = array( - 'volumeId' => 'vol-4d826724', - 'instanceId' => 'i-6058a509', - 'device' => '/dev/sdh', - 'status' => 'detaching', - 'attachTime' => '2008-05-08T11:51:50.000Z' - ); - - $this->assertSame($arrVolume, $return); - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/Ec2Test.php b/tests/Zend/Service/Amazon/Ec2/Ec2Test.php deleted file mode 100644 index 27250d10e6..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/Ec2Test.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Ec2.php'; - -/** - * Zend_Service_Amazon_Ec2 test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_Ec2Test extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2 - */ - private $Zend_Service_Amazon_Ec2; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - parent::tearDown(); - } - - public function testFactoryReturnsKeyPairObject() - { - $object = Zend_Service_Amazon_Ec2::factory('keypair', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Keypair); - } - - public function testFactoryReturnsElasticIpObject() - { - $object = Zend_Service_Amazon_Ec2::factory('elasticip', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Elasticip); - } - - - public function testFactoryReturnsEbsObject() - { - $object = Zend_Service_Amazon_Ec2::factory('ebs', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Ebs); - } - - public function testFactoryReturnImageObject() - { - $object = Zend_Service_Amazon_Ec2::factory('image', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Image); - } - - public function testFactoryReturnsInstanceObject() - { - $object = Zend_Service_Amazon_Ec2::factory('instance', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Instance); - } - - public function testFactoryReturnsSecurityGroupsObject() - { - $object = Zend_Service_Amazon_Ec2::factory('security', 'access_key', 'secret_access_key'); - $this->assertTrue($object instanceof Zend_Service_Amazon_Ec2_Securitygroups); - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/ElasticipTest.php b/tests/Zend/Service/Amazon/Ec2/ElasticipTest.php deleted file mode 100644 index 1ad64cda10..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/ElasticipTest.php +++ /dev/null @@ -1,247 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Elasticip.php'; - -/** - * Zend_Service_Amazon_Ec2_Elasticip test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_ElasticipTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Elasticip - */ - private $Zend_Service_Amazon_Ec2_Elasticip; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Elasticip = new Zend_Service_Amazon_Ec2_Elasticip('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Elasticip::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Elasticip = null; - - parent::tearDown(); - } - - public function testAllocateNewElasticIp() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<AllocateAddressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <publicIp>67.202.55.255</publicIp>\r\n" - . "</AllocateAddressResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $ipAddress = $this->Zend_Service_Amazon_Ec2_Elasticip->allocate(); - $this->assertEquals('67.202.55.255', $ipAddress); - } - - public function testAssociateElasticIpWithInstanceReturnsTrue() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<AssociateAddressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</AssociateAddressResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Elasticip->associate('67.202.55.255', 'i-ag8ga0a'); - - $this->assertTrue($return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Elasticip->describe() - */ - public function testDescribeSingleElasticIp() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeAddressesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <addressSet>\r\n" - . " <item>\r\n" - . " <publicIp>67.202.55.255</publicIp>\r\n" - . " <instanceId>i-ag8ga0a</instanceId>\r\n" - . " </item>\r\n" - . " </addressSet>\r\n" - . "</DescribeAddressesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Elasticip->describe('67.202.55.255'); - - $arrIp = array( - 'publicIp' => '67.202.55.255', - 'instanceId' => 'i-ag8ga0a' - ); - - $this->assertSame($arrIp, $response[0]); - } - - public function testDescribeMultipleElasticIp() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeAddressesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <addressSet>\r\n" - . " <item>\r\n" - . " <publicIp>67.202.55.255</publicIp>\r\n" - . " <instanceId>i-ag8ga0a</instanceId>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <publicIp>67.202.55.200</publicIp>\r\n" - . " <instanceId>i-aauoi9g</instanceId>\r\n" - . " </item>\r\n" - . " </addressSet>\r\n" - . "</DescribeAddressesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Elasticip->describe(array('67.202.55.255', '67.202.55.200')); - - $arrIps = array( - array( - 'publicIp' => '67.202.55.255', - 'instanceId' => 'i-ag8ga0a' - ), - array( - 'publicIp' => '67.202.55.200', - 'instanceId' => 'i-aauoi9g' - ) - ); - - foreach($response as $k => $r) { - $this->assertSame($arrIps[$k], $r); - } - } - - /** - * Tests Zend_Service_Amazon_Ec2_Elasticip->disassocate() - */ - public function testDisassocateElasticIpFromInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DisassociateAddressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DisassociateAddressResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Elasticip->disassocate('67.202.55.255'); - - $this->assertTrue($return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Elasticip->release() - */ - public function testReleaseElasticIp() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ReleaseAddressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</ReleaseAddressResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Elasticip->release('67.202.55.255'); - - $this->assertTrue($return); - - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/ImageTest.php b/tests/Zend/Service/Amazon/Ec2/ImageTest.php deleted file mode 100644 index f1725bc680..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/ImageTest.php +++ /dev/null @@ -1,620 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Image.php'; - - -/** - * Zend_Service_Amazon_Ec2_Image test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_ImageTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Image - */ - private $Zend_Service_Amazon_Ec2_Image; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Image = new Zend_Service_Amazon_Ec2_Image('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Image::setHttpClient($client); - } - - protected function tearDown() - { - $this->Zend_Service_Amazon_Ec2_Image = null; - - parent::tearDown(); - } - - public function testDeregister() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DeregisterImageResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DeregisterImageResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->deregister('ami-61a54008'); - - $this->assertTrue($return); - - } - - public function testDescribeSingleImageMultipleImagesByIds() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd6</imageId>\r\n" - . " <imageLocation>ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>true</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe(array('ami-be3adfd7', 'ami-be3adfd6')); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ), - array( - 'imageId' => 'ami-be3adfd6', - 'imageLocation' => 'ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'true', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeSingleImageById() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe('ami-be3adfd7'); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeSingleImageMultipleImagesByOwnerId() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>2060296256884</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd6</imageId>\r\n" - . " <imageLocation>ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>true</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe(null, array('2060296256884', '206029621532')); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '2060296256884', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ), - array( - 'imageId' => 'ami-be3adfd6', - 'imageLocation' => 'ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'true', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeSingleImageByOwnerId() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe(null, '206029621532'); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeSingleImageMultipleImagesByExecutableBy() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>2060296256884</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd6</imageId>\r\n" - . " <imageLocation>ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>true</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe(null, null, array('46361432890', '432432265322')); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '2060296256884', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ), - array( - 'imageId' => 'ami-be3adfd6', - 'imageLocation' => 'ec2-public-images/ubuntu-8.10-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'true', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeSingleImageByExecutableBy() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImagesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imagesSet>\r\n" - . " <item>\r\n" - . " <imageId>ami-be3adfd7</imageId>\r\n" - . " <imageLocation>ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml</imageLocation>\r\n" - . " <imageState>available</imageState>\r\n" - . " <imageOwnerId>206029621532</imageOwnerId>\r\n" - . " <isPublic>false</isPublic>\r\n" - . " <architecture>i386</architecture>\r\n" - . " <imageType>machine</imageType>\r\n" - . " <kernelId>aki-4438dd2d</kernelId>\r\n" - . " <ramdiskId>ari-4538dd2c</ramdiskId>\r\n" - . " </item>\r\n" - . " </imagesSet>\r\n" - . "</DescribeImagesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describe(null, null, '46361432890'); - - $arrImage = array( - array( - 'imageId' => 'ami-be3adfd7', - 'imageLocation' => 'ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml', - 'imageState' => 'available', - 'imageOwnerId' => '206029621532', - 'isPublic' => 'false', - 'architecture' => 'i386', - 'imageType' => 'machine', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'platform' => '', - ) - ); - - $this->assertSame($arrImage, $return); - } - - public function testDescribeAttributeLaunchPermission() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imageId>ami-61a54008</imageId>\r\n" - . " <launchPermission>\r\n" - . " <item>\r\n" - . " <userId>495219933132</userId>\r\n" - . " </item>\r\n" - . " </launchPermission>\r\n" - . "</DescribeImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describeAttribute('ami-61a54008', 'launchPermission'); - - $this->assertEquals('ami-61a54008', $return['imageId']); - $this->assertEquals('495219933132', $return['launchPermission'][0]); - } - - public function testDescribeAttributeProductCodes() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imageId>ami-61a54008</imageId>\r\n" - . " <productCodes>\r\n" - . " <item>\r\n" - . " <productCode>774F4FF8</productCode>\r\n" - . " </item>\r\n" - . " </productCodes>\r\n" - . "</DescribeImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->describeAttribute('ami-61a54008', 'productCodes'); - - $this->assertEquals('ami-61a54008', $return['imageId']); - $this->assertEquals('774F4FF8', $return['productCodes'][0]); - } - - public function testModifyAttributeSingleLaunchPermission() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ModifyImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</ModifyImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->modifyAttribute('ami-61a54008', 'launchPermission', 'add', '495219933132', 'all'); - $this->assertTrue($return); - } - - public function testModifyAttributeMultipleLaunchPermission() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ModifyImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</ModifyImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->modifyAttribute('ami-61a54008', 'launchPermission', 'add', array('495219933132', '495219933133'), array('all', 'all')); - $this->assertTrue($return); - } - - public function testModifyAttributeThrowsExceptionOnInvalidAttribute() - { - try { - $return = $this->Zend_Service_Amazon_Ec2_Image->modifyAttribute('ami-61a54008', 'invalidPermission', 'add', '495219933132', 'all'); - $this->fail('An exception should be throw if you are modifying an invalid attirubte'); - } catch (Zend_Service_Amazon_Ec2_Exception $zsaee) {} - } - - public function testModifyAttributeProuctCodes() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ModifyImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</ModifyImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->modifyAttribute('ami-61a54008', 'productCodes', null, null, null, '774F4FF8'); - - $this->assertTrue($return); - - } - - public function testRegister() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<RegisterImageResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <imageId>ami-61a54008</imageId>\r\n" - . "</RegisterImageResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->register('mybucket-myimage.manifest.xml'); - - $this->assertEquals('ami-61a54008', $return); - - } - - public function testResetAttribute() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ResetImageAttributeResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</ResetImageAttributeResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Image->resetAttribute('ami-61a54008', 'launchPermission'); - - $this->assertTrue($return); - - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/InstanceReservedTest.php b/tests/Zend/Service/Amazon/Ec2/InstanceReservedTest.php deleted file mode 100644 index 6763c70607..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/InstanceReservedTest.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Ec2/Instance/Reserved.php'; -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; - -/** - * Zend_Service_Amazon_Ec2_Instance_Reserved test case. - - * @todo Should this class be named Zend_Service_Amazon_Ec2_Instance_ReservedTest? - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class InstanceReservedTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Instance_Reserved - */ - private $Zend_Service_Amazon_Ec2_Instance_Reserved; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - $this->Zend_Service_Amazon_Ec2_Instance_Reserved = new Zend_Service_Amazon_Ec2_Instance_Reserved('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Instance_Reserved::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - $this->Zend_Service_Amazon_Ec2_Instance_Reserved = null; - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Reserved->describeInstances() - */ - public function testDescribeInstances() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<DescribeReservedInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <reservedInstancesSet>\r\n" - ." <item>\r\n" - ." <reservedInstancesId>4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8</reservedInstancesId>\r\n" - ." <instanceType>m1.small</instanceType>\r\n" - ." <availabilityZone>us-east-1a</availabilityZone>\r\n" - ." <duration>12</duration>\r\n" - ." <usagePrice>0.00</usagePrice>\r\n" - ." <fixedPrice>0.00</fixedPrice>\r\n" - ." <instanceCount>19</instanceCount>\r\n" - ." <productDescription>m1.small offering in us-east-1a</productDescription>\r\n" - ." <state>Active</state>\r\n" - ." </item>\r\n" - ." </reservedInstancesSet>\r\n" - ."</DescribeReservedInstancesResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Reserved->describeInstances('4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8'); - - $arrReturn = array( - array( - "reservedInstancesId" => "4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8", - "instanceType" => "m1.small", - "availabilityZone" => "us-east-1a", - "duration" => "12", - "fixedPrice" => "0.00", - "usagePrice" => "0.00", - "productDescription" => "m1.small offering in us-east-1a", - "instanceCount" => "19", - "state" => "Active" - ) - ); - - $this->assertSame($arrReturn, $return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Reserved->describeOfferings() - */ - public function testDescribeOfferings() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<DescribeReservedInstancesOfferingsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <reservedInstancesOfferingsSet>\r\n" - ." <item>\r\n" - ." <reservedInstancesOfferingId>4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8</reservedInstancesOfferingId>\r\n" - ." <instanceType>m1.small</instanceType>\r\n" - ." <availabilityZone>us-east-1a</availabilityZone>\r\n" - ." <duration>12</duration>\r\n" - ." <usagePrice>0.00</usagePrice>\r\n" - ." <fixedPrice>0.00</fixedPrice>\r\n" - ." <productDescription>m1.small offering in us-east-1a</productDescription>\r\n" - ." </item>\r\n" - ." </reservedInstancesOfferingsSet>\r\n" - ."</DescribeReservedInstancesOfferingsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Reserved->describeOfferings(); - - $arrReturn = array( - array( - "reservedInstancesOfferingId" => "4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8", - "instanceType" => "m1.small", - "availabilityZone" => "us-east-1a", - "duration" => "12", - "fixedPrice" => "0.00", - "usagePrice" => "0.00", - "productDescription" => "m1.small offering in us-east-1a", - ) - ); - - $this->assertSame($arrReturn, $return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Reserved->purchaseOffering() - */ - public function testPurchaseOffering() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<PurchaseReservedInstancesOfferingResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <reservedInstancesId>4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8</reservedInstancesId>\r\n" - ."</PurchaseReservedInstancesOfferingResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Reserved->purchaseOffering('4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8'); - - $this->assertSame('4b2293b4-5813-4cc8-9ce3-1957fc1dcfc8', $return); - - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/InstanceTest.php b/tests/Zend/Service/Amazon/Ec2/InstanceTest.php deleted file mode 100644 index 1d03bc6515..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/InstanceTest.php +++ /dev/null @@ -1,727 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Instance.php'; - - -/** - * Zend_Service_Amazon_Ec2_Instance test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_InstanceTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Instance - */ - private $Zend_Service_Amazon_Ec2_Instance; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Instance = new Zend_Service_Amazon_Ec2_Instance('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Instance::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Instance = null; - - parent::tearDown(); - } - - public function testConstants() - { - $this->assertEquals('m1.small', Zend_Service_Amazon_Ec2_Instance::SMALL); - $this->assertEquals('m1.large', Zend_Service_Amazon_Ec2_Instance::LARGE); - $this->assertEquals('m1.xlarge', Zend_Service_Amazon_Ec2_Instance::XLARGE); - $this->assertEquals('c1.medium', Zend_Service_Amazon_Ec2_Instance::HCPU_MEDIUM); - $this->assertEquals('c1.xlarge', Zend_Service_Amazon_Ec2_Instance::HCPU_XLARGE); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance->confirmProduct() - */ - public function testConfirmProductReturnsOwnerId() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ConfirmProductInstanceResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <result>true</result>\r\n" - . " <ownerId>254933287430</ownerId>\r\n" - . "</ConfirmProductInstanceResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->confirmProduct('254933287430', 'i-1bda7172'); - - $this->assertEquals('254933287430', $return['ownerId']); - } - - public function testConfirmProductReturnsFalse() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<ConfirmProductInstanceResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <result>false</result>\r\n" - . "</ConfirmProductInstanceResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->confirmProduct('254933287430', 'i-1bda7172'); - - $this->assertFalse($return); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance->describe() - */ - public function testDescribeSingleInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <reservationSet>\r\n" - . " <item>\r\n" - . " <reservationId>r-44a5402d</reservationId>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupSet>\r\n" - . " <item>\r\n" - . " <groupId>default</groupId>\r\n" - . " </item>\r\n" - . " </groupSet>\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <imageId>ami-6ea54007</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>running</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName>10-251-50-75.ec2.internal</privateDnsName>\r\n" - . " <dnsName>ec2-72-44-33-4.compute-1.amazonaws.com</dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <productCodesSet>\r\n" - . " <item><productCode>774F4FF8</productCode></item>\r\n" - . " </productCodesSet>\r\n" - . " <instanceType>m1.small</instanceType>\r\n" - . " <launchTime>2007-08-07T11:54:42.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " <kernelId>aki-ba3adfd3</kernelId>\r\n" - . " <ramdiskId>ari-badbad00</ramdiskId>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . " </item>\r\n" - . " </reservationSet>\r\n" - . "</DescribeInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->describe('i-28a64341'); - - $this->assertEquals('r-44a5402d', $return['instances'][0]['reservationId']); - $this->assertEquals('default', $return['instances'][0]['groupSet'][0]); - $this->assertEquals('i-28a64341', $return['instances'][0]['instanceId']); - $this->assertEquals('ami-6ea54007', $return['instances'][0]['imageId']); - $this->assertEquals('m1.small', $return['instances'][0]['instanceType']); - $this->assertEquals('us-east-1b', $return['instances'][0]['availabilityZone']); - } - - public function testDescribeIgnoreTerminatedInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <reservationSet>\r\n" - . " <item>\r\n" - . " <reservationId>r-44a5402d</reservationId>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupSet>\r\n" - . " <item>\r\n" - . " <groupId>default</groupId>\r\n" - . " </item>\r\n" - . " </groupSet>\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <imageId>ami-6ea54007</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>48</code>\r\n" - . " <name>terminated</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName>10-251-50-75.ec2.internal</privateDnsName>\r\n" - . " <dnsName>ec2-72-44-33-4.compute-1.amazonaws.com</dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <productCodesSet>\r\n" - . " <item><productCode>774F4FF8</productCode></item>\r\n" - . " </productCodesSet>\r\n" - . " <instanceType>m1.small</instanceType>\r\n" - . " <launchTime>2007-08-07T11:54:42.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " <kernelId>aki-ba3adfd3</kernelId>\r\n" - . " <ramdiskId>ari-badbad00</ramdiskId>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . " </item>\r\n" - . " </reservationSet>\r\n" - . "</DescribeInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse, true); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->describe('i-28a64341', true); - - $this->assertEquals(0, count($return['instances'])); - } - - public function testDescribeByImageId() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <reservationSet>\r\n" - . " <item>\r\n" - . " <reservationId>r-44a5402d</reservationId>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupSet>\r\n" - . " <item>\r\n" - . " <groupId>default</groupId>\r\n" - . " </item>\r\n" - . " </groupSet>\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <imageId>ami-6ea54007</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>running</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName>10-251-50-75.ec2.internal</privateDnsName>\r\n" - . " <dnsName>ec2-72-44-33-4.compute-1.amazonaws.com</dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <productCodesSet>\r\n" - . " <item><productCode>774F4FF8</productCode></item>\r\n" - . " </productCodesSet>\r\n" - . " <instanceType>m1.small</instanceType>\r\n" - . " <launchTime>2007-08-07T11:54:42.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " <kernelId>aki-ba3adfd3</kernelId>\r\n" - . " <ramdiskId>ari-badbad00</ramdiskId>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . " </item>\r\n" - . " </reservationSet>\r\n" - . "</DescribeInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->describeByImageId('ami-6ea54007'); - - $this->assertEquals('i-28a64341', $return[0]['instanceId']); - $this->assertEquals('ami-6ea54007', $return[0]['imageId']); - $this->assertEquals('m1.small', $return[0]['instanceType']); - $this->assertEquals('us-east-1b', $return[0]['availabilityZone']); - } - - public function testRunThrowsExceptionWhenNoImageIdPassedIn() - { - $arrStart = array( - 'maxStart' => 3, - 'keyName' => 'example-key-name', - 'securityGroup' => 'default', - 'userData' => 'instance_id=www3', - 'placement' => 'us-east-1b', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'blockDeviceVirtualName' => 'vertdevice', - 'blockDeviceName' => '/dev/sdv' - ); - - try { - $return = $this->Zend_Service_Amazon_Ec2_Instance->run($arrStart); - $this->fail('Exception should be thrown when no image id is passed into the run commmand'); - } catch (Zend_Service_Amazon_Ec2_Exception $zsaee) { - $this->assertEquals('No Image Id Provided', $zsaee->getMessage()); - } - } - - public function testRunOneSecurityGroup() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<RunInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <reservationId>r-47a5402e</reservationId>\r\n" - . " <ownerId>495219933132</ownerId>\r\n" - . " <groupSet>\r\n" - . " <item>\r\n" - . " <groupId>default</groupId>\r\n" - . " </item>\r\n" - . " </groupSet>\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-2ba64342</instanceId>\r\n" - . " <imageId>ami-60a54009</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>pending</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName></privateDnsName>\r\n" - . " <dnsName></dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <amiLaunchIndex>0</amiLaunchIndex>\r\n" - . " <InstanceType>m1.small</InstanceType>\r\n" - . " <launchTime>2007-08-07T11:51:50.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <instanceId>i-2bc64242</instanceId>\r\n" - . " <imageId>ami-60a54009</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>pending</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName></privateDnsName>\r\n" - . " <dnsName></dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <amiLaunchIndex>1</amiLaunchIndex>\r\n" - . " <InstanceType>m1.small</InstanceType>\r\n" - . " <launchTime>2007-08-07T11:51:50.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <instanceId>i-2be64332</instanceId>\r\n" - . " <imageId>ami-60a54009</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>pending</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName></privateDnsName>\r\n" - . " <dnsName></dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <amiLaunchIndex>2</amiLaunchIndex>\r\n" - . " <InstanceType>m1.small</InstanceType>\r\n" - . " <launchTime>2007-08-07T11:51:50.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . "</RunInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - - $arrStart = array( - 'imageId' => 'ami-60a54009', - 'maxStart' => 3, - 'keyName' => 'example-key-name', - 'securityGroup' => 'default', - 'userData' => 'instance_id=www3', - 'placement' => 'us-east-1b', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'blockDeviceVirtualName' => 'vertdevice', - 'blockDeviceName' => '/dev/sdv' - ); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->run($arrStart); - - $this->assertEquals(3, count($return['instances'])); - $this->assertEquals('495219933132', $return['ownerId']); - - $arrInstanceIds = array('i-2ba64342', 'i-2bc64242', 'i-2be64332'); - - foreach($return['instances'] as $k => $r) { - $this->assertEquals($arrInstanceIds[$k], $r['instanceId']); - $this->assertEquals($k, $r['amiLaunchIndex']); - } - - } - - public function testRunMultipleSecurityGroups() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\nn" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<RunInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <reservationId>r-47a5402e</reservationId>\r\n" - . " <ownerId>495219933132</ownerId>\r\n" - . " <groupSet>\r\n" - . " <item>\r\n" - . " <groupId>default</groupId>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <groupId>web</groupId>\r\n" - . " </item>\r\n" - . " </groupSet>\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-2ba64342</instanceId>\r\n" - . " <imageId>ami-60a54009</imageId>\r\n" - . " <instanceState>\r\n" - . " <code>0</code>\r\n" - . " <name>pending</name>\r\n" - . " </instanceState>\r\n" - . " <privateDnsName></privateDnsName>\r\n" - . " <dnsName></dnsName>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <amiLaunchIndex>0</amiLaunchIndex>\r\n" - . " <InstanceType>m1.small</InstanceType>\r\n" - . " <launchTime>2007-08-07T11:51:50.000Z</launchTime>\r\n" - . " <placement>\r\n" - . " <availabilityZone>us-east-1b</availabilityZone>\r\n" - . " </placement>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . "</RunInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $arrStart = array( - 'imageId' => 'ami-60a54009', - 'keyName' => 'example-key-name', - 'securityGroup' => array('default','web'), - 'userData' => 'instance_id=www3', - 'placement' => 'us-east-1b', - 'kernelId' => 'aki-4438dd2d', - 'ramdiskId' => 'ari-4538dd2c', - 'blockDeviceVirtualName' => 'vertdevice', - 'blockDeviceName' => '/dev/sdv' - ); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->run($arrStart); - - $arrGroups = array('default', 'web'); - - $this->assertSame($arrGroups, $return['groupSet']); - } - - public function testTerminateSingleInstances() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<TerminateInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <shutdownState>\r\n" - . " <code>32</code>\r\n" - . " <name>shutting-down</name>\r\n" - . " </shutdownState>\r\n" - . " <previousState>\r\n" - . " <code>16</code>\r\n" - . " <name>running</name>\r\n" - . " </previousState>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . "</TerminateInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->terminate('i-28a64341'); - - $this->assertEquals(1, count($return)); - - foreach($return as $r) { - $this->assertEquals('i-28a64341', $r['instanceId']); - } - } - - public function testTerminateMultipleInstances() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<TerminateInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <instancesSet>\r\n" - . " <item>\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <shutdownState>\r\n" - . " <code>32</code>\r\n" - . " <name>shutting-down</name>\r\n" - . " </shutdownState>\r\n" - . " <previousState>\r\n" - . " <code>16</code>\r\n" - . " <name>running</name>\r\n" - . " </previousState>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <instanceId>i-21a64348</instanceId>\r\n" - . " <shutdownState>\r\n" - . " <code>32</code>\r\n" - . " <name>shutting-down</name>\r\n" - . " </shutdownState>\r\n" - . " <previousState>\r\n" - . " <code>16</code>\r\n" - . " <name>running</name>\r\n" - . " </previousState>\r\n" - . " </item>\r\n" - . " </instancesSet>\r\n" - . "</TerminateInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $arrInstanceIds = array('i-28a64341', 'i-21a64348'); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->terminate($arrInstanceIds); - - $this->assertEquals(2, count($return)); - - foreach($return as $k=>$r) { - $this->assertEquals($arrInstanceIds[$k], $r['instanceId']); - } - } - - public function testRebootMultipleInstances() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<RebootInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</RebootInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $arrInstanceIds = array('i-28a64341', 'i-21a64348'); - $return = $this->Zend_Service_Amazon_Ec2_Instance->reboot($arrInstanceIds); - - $this->assertTrue($return); - } - - public function testRebootSingleInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<RebootInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</RebootInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->reboot('i-28a64341'); - - $this->assertTrue($return); - } - - public function testGetConsoleOutput() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<GetConsoleOutputResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <instanceId>i-28a64341</instanceId>\r\n" - . " <timestamp>2007-01-03 15:00:00</timestamp>\r\n" - . " <output>TGludXggdmVyc2lvbiAyLjYuMTYteGVuVSAoYnVpbGRlckBwYXRjaGJhdC5hbWF6b25zYSkgKGdj\r\n" -. "YyB2ZXJzaW9uIDQuMC4xIDIwMDUwNzI3IChSZWQgSGF0IDQuMC4xLTUpKSAjMSBTTVAgVGh1IE9j\r\n" -. "dCAyNiAwODo0MToyNiBTQVNUIDIwMDYKQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgpY\r\n" -. "ZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDZhNDAwMDAwICh1c2FibGUpCjk4ME1CIEhJ\r\n" -. "R0hNRU0gYXZhaWxhYmxlLgo3MjdNQiBMT1dNRU0gYXZhaWxhYmxlLgpOWCAoRXhlY3V0ZSBEaXNh\r\n" -. "YmxlKSBwcm90ZWN0aW9uOiBhY3RpdmUKSVJRIGxvY2t1cCBkZXRlY3Rpb24gZGlzYWJsZWQKQnVp\r\n" -. "bHQgMSB6b25lbGlzdHMKS2VybmVsIGNvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTEgcm8gNApF\r\n" -. "bmFibGluZyBmYXN0IEZQVSBzYXZlIGFuZCByZXN0b3JlLi4uIGRvbmUuCg==</output>\r\n" - . "</GetConsoleOutputResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->consoleOutput('i-28a64341'); - - $arrOutput = array( - 'instanceId' => 'i-28a64341', - 'timestamp' => '2007-01-03 15:00:00', - 'output' => "Linux version 2.6.16-xenU (builder@patchbat.amazonsa) (gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)) #1 SMP Thu Oct 26 08:41:26 SAST 2006\n" -. "BIOS-provided physical RAM map:\n" -. "Xen: 0000000000000000 - 000000006a400000 (usable)\n" -. "980MB HIGHMEM available.\n" -. "727MB LOWMEM available.\n" -. "NX (Execute Disable) protection: active\n" -. "IRQ lockup detection disabled\n" -. "Built 1 zonelists\n" -. "Kernel command line: root=/dev/sda1 ro 4\n" -. "Enabling fast FPU save and restore... done.\n"); - - $this->assertSame($arrOutput, $return); - } - - public function testMonitorInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<MonitorInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <instancesSet>" - . " <item>" - . " <instanceId>i-43a4412a</instanceId>" - . " <monitoring>" - . " <state>monitoring</state>" - . " </monitoring>" - . " </item>" - . " </instancesSet>" - . "</MonitorInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->monitor('i-43a4412a'); - - $arrReturn = array(array('instanceid' => 'i-43a4412a', 'monitorstate' => 'monitoring')); - $this->assertSame($arrReturn, $return); - } - - public function testUnmonitorInstance() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<UnmonitorInstancesResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <instancesSet>" - . " <item>" - . " <instanceId>i-43a4412a</instanceId>" - . " <monitoring>" - . " <state>pending</state>" - . " </monitoring>" - . " </item>" - . " </instancesSet>" - . "</UnmonitorInstancesResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance->unmonitor('i-43a4412a'); - - $arrReturn = array(array('instanceid' => 'i-43a4412a', 'monitorstate' => 'pending')); - $this->assertSame($arrReturn, $return); - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/InstanceWindowsTest.php b/tests/Zend/Service/Amazon/Ec2/InstanceWindowsTest.php deleted file mode 100644 index edcad968ec..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/InstanceWindowsTest.php +++ /dev/null @@ -1,247 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Ec2/Instance/Windows.php'; -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; - -/** - * Zend_Service_Amazon_Ec2_Instance_Windows test case. - * - * @todo: Should this class be named Zend_Service_Amazon_Ec2_Instance_WindowsTest? - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class InstanceWindowsTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Instance_Windows - */ - private $Zend_Service_Amazon_Ec2_Instance_Windows; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - $this->Zend_Service_Amazon_Ec2_Instance_Windows = new Zend_Service_Amazon_Ec2_Instance_Windows('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Instance_Windows::setHttpClient($client); - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - $this->Zend_Service_Amazon_Ec2_Instance_Windows = null; - - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Windows->bundle() - */ - public function testBundle() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<BundleInstanceResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <requestId>bun-c1a540a8</requestId>\r\n" - ." <bundleInstanceTask>\r\n" - ." <instanceId>i-12345678</instanceId>\r\n" - ." <bundleId>bun-cla322b9</bundleId>\r\n" - ." <state>bundling</state>\r\n" - ." <startTime>2008-10-07T11:41:50.000Z</startTime>\r\n" - ." <updateTime>2008-10-07T11:51:50.000Z</updateTime>\r\n" - ." <progress>20%</progress>\r\n" - ." <storage>\r\n" - ." <S3>\r\n" - ." <bucket>my-bucket</bucket>\r\n" - ." <prefix>my-new-image</prefix>\r\n" - ." </S3>\r\n" - ." </storage>\r\n" - ." </bundleInstanceTask>\r\n" - ."</BundleInstanceResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Windows->bundle('i-12345678', 'my-bucket', 'my-new-image'); - - print_r($return); - - $arrReturn = array( - "instanceId" => "i-12345678", - "bundleId" => "bun-cla322b9", - "state" => "bundling", - "startTime" => "2008-10-07T11:41:50.000Z", - "updateTime" => "2008-10-07T11:51:50.000Z", - "progress" => "20%", - "storage" => array( - "s3" => array - ( - "bucket" => "my-bucket", - "prefix" => "my-new-image" - ) - ) - ); - - $this->assertSame($arrReturn, $return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Windows->cancelBundle() - */ - public function testCancelBundle() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<CancelBundleTaskResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <bundleInstanceTask>\r\n" - ." <instanceId>i-12345678</instanceId>\r\n" - ." <bundleId>bun-cla322b9</bundleId>\r\n" - ." <state>canceling</state>\r\n" - ." <startTime>2008-10-07T11:41:50.000Z</startTime>\r\n" - ." <updateTime>2008-10-07T11:51:50.000Z</updateTime>\r\n" - ." <progress>20%</progress>\r\n" - ." <storage>\r\n" - ." <S3>\r\n" - ." <bucket>my-bucket</bucket>\r\n" - ." <prefix>my-new-image</prefix>\r\n" - ." </S3>\r\n" - ." </storage>\r\n" - ." </bundleInstanceTask>\r\n" - ."</CancelBundleTaskResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Windows->cancelBundle('bun-cla322b9'); - - $arrReturn = array( "instanceId" => "i-12345678", - "bundleId" => "bun-cla322b9", - "state" => "canceling", - "startTime" => "2008-10-07T11:41:50.000Z", - "updateTime" => "2008-10-07T11:51:50.000Z", - "progress" => "20%", - "storage" => array( - "s3" => array - ( - "bucket" => "my-bucket", - "prefix" => "my-new-image" - ) - ) - ); - - $this->assertSame($arrReturn, $return); - - - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Instance_Windows->describeBundle() - */ - public function testDescribeBundle() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - ."<DescribeBundleTasksResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - ." <bundleInstanceTasksSet>\r\n" - ." <item>\r\n" - ." <instanceId>i-12345678</instanceId>\r\n" - ." <bundleId>bun-cla322b9</bundleId>\r\n" - ." <state>bundling</state>\r\n" - ." <startTime>2008-10-07T11:41:50.000Z</startTime>\r\n" - ." <updateTime>2008-10-07T11:51:50.000Z</updateTime>\r\n" - ." <progress>20%</progress>\r\n" - ." <storage>\r\n" - ." <S3>\r\n" - ." <bucket>my-bucket</bucket>\r\n" - ." <prefix>my-new-image</prefix>\r\n" - ." </S3>\r\n" - ." </storage>\r\n" - ." </item>\r\n" - ." </bundleInstanceTasksSet>\r\n" - ."</DescribeBundleTasksResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Instance_Windows->describeBundle('bun-cla322b9'); - - $arrReturn = array( - array( - "instanceId" => "i-12345678", - "bundleId" => "bun-cla322b9", - "state" => "bundling", - "startTime" => "2008-10-07T11:41:50.000Z", - "updateTime" => "2008-10-07T11:51:50.000Z", - "progress" => "20%", - "storage" => array( - "s3" => array - ( - "bucket" => "my-bucket", - "prefix" => "my-new-image" - ) - ) - ) - ); - - $this->assertSame($arrReturn, $return); - - } - -} - diff --git a/tests/Zend/Service/Amazon/Ec2/KeypairTest.php b/tests/Zend/Service/Amazon/Ec2/KeypairTest.php deleted file mode 100644 index 0b84ec5a09..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/KeypairTest.php +++ /dev/null @@ -1,262 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Keypair.php'; - -/** - * Zend_Service_Amazon_Ec2_Keypair test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_KeypairTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Keypair - */ - private $Zend_Service_Amazon_Ec2_Keypair; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Keypair = new Zend_Service_Amazon_Ec2_Keypair('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Keypair::setHttpClient($client); - - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Keypair = null; - - parent::tearDown(); - } - - public function testCreateKeyPairNoNameThrowsException() - { - try { - $this->Zend_Service_Amazon_Ec2_Keypair->create(''); - $this->fail('An exception should be thrown if an empty keyname is passed in.'); - } catch (Zend_Service_Amazon_Ec2_Exception $zsaee) { - } - } - - /** - * Tests Zend_Service_Amazon_Ec2_Keypair->create() - */ - public function testCreateKeyPair() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<CreateKeyPairResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>\r\n" - . " <keyMaterial>-----BEGIN RSA PRIVATE KEY-----\r\n" -. "MIIEoQIBAAKCAQBuLFg5ujHrtm1jnutSuoO8Xe56LlT+HM8v/xkaa39EstM3/aFxTHgElQiJLChp\r\n" -. "HungXQ29VTc8rc1bW0lkdi23OH5eqkMHGhvEwqa0HWASUMll4o3o/IX+0f2UcPoKCOVUR+jx71Sg\r\n" -. "5AU52EQfanIn3ZQ8lFW7Edp5a3q4DhjGlUKToHVbicL5E+g45zfB95wIyywWZfeW/UUF3LpGZyq/\r\n" -. "ebIUlq1qTbHkLbCC2r7RTn8vpQWp47BGVYGtGSBMpTRP5hnbzzuqj3itkiLHjU39S2sJCJ0TrJx5\r\n" -. "i8BygR4s3mHKBj8l+ePQxG1kGbF6R4yg6sECmXn17MRQVXODNHZbAgMBAAECggEAY1tsiUsIwDl5\r\n" -. "91CXirkYGuVfLyLflXenxfI50mDFms/mumTqloHO7tr0oriHDR5K7wMcY/YY5YkcXNo7mvUVD1pM\r\n" -. "ZNUJs7rw9gZRTrf7LylaJ58kOcyajw8TsC4e4LPbFaHwS1d6K8rXh64o6WgW4SrsB6ICmr1kGQI7\r\n" -. "3wcfgt5ecIu4TZf0OE9IHjn+2eRlsrjBdeORi7KiUNC/pAG23I6MdDOFEQRcCSigCj+4/mciFUSA\r\n" -. "SWS4dMbrpb9FNSIcf9dcLxVM7/6KxgJNfZc9XWzUw77Jg8x92Zd0fVhHOux5IZC+UvSKWB4dyfcI\r\n" -. "tE8C3p9bbU9VGyY5vLCAiIb4qQKBgQDLiO24GXrIkswF32YtBBMuVgLGCwU9h9HlO9mKAc2m8Cm1\r\n" -. "jUE5IpzRjTedc9I2qiIMUTwtgnw42auSCzbUeYMURPtDqyQ7p6AjMujp9EPemcSVOK9vXYL0Ptco\r\n" -. "xW9MC0dtV6iPkCN7gOqiZXPRKaFbWADp16p8UAIvS/a5XXk5jwKBgQCKkpHi2EISh1uRkhxljyWC\r\n" -. "iDCiK6JBRsMvpLbc0v5dKwP5alo1fmdR5PJaV2qvZSj5CYNpMAy1/EDNTY5OSIJU+0KFmQbyhsbm\r\n" -. "rdLNLDL4+TcnT7c62/aH01ohYaf/VCbRhtLlBfqGoQc7+sAc8vmKkesnF7CqCEKDyF/dhrxYdQKB\r\n" -. "gC0iZzzNAapayz1+JcVTwwEid6j9JqNXbBc+Z2YwMi+T0Fv/P/hwkX/ypeOXnIUcw0Ih/YtGBVAC\r\n" -. "DQbsz7LcY1HqXiHKYNWNvXgwwO+oiChjxvEkSdsTTIfnK4VSCvU9BxDbQHjdiNDJbL6oar92UN7V\r\n" -. "rBYvChJZF7LvUH4YmVpHAoGAbZ2X7XvoeEO+uZ58/BGKOIGHByHBDiXtzMhdJr15HTYjxK7OgTZm\r\n" -. "gK+8zp4L9IbvLGDMJO8vft32XPEWuvI8twCzFH+CsWLQADZMZKSsBasOZ/h1FwhdMgCMcY+Qlzd4\r\n" -. "JZKjTSu3i7vhvx6RzdSedXEMNTZWN4qlIx3kR5aHcukCgYA9T+Zrvm1F0seQPbLknn7EqhXIjBaT\r\n" -. "P8TTvW/6bdPi23ExzxZn7KOdrfclYRph1LHMpAONv/x2xALIf91UB+v5ohy1oDoasL0gij1houRe\r\n" -. "2ERKKdwz0ZL9SWq6VTdhr/5G994CK72fy5WhyERbDjUIdHaK3M849JJuf8cSrvSb4g==\r\n" -. "-----END RSA PRIVATE KEY-----</keyMaterial>\r\n" - . "</CreateKeyPairResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Keypair->create('example-key-name'); - - $this->assertTrue(is_array($response)); - - $this->assertEquals('example-key-name', $response['keyName']); - $this->assertEquals('1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f', $response['keyFingerprint']); - } - - public function testDescribeSingleKeyPair() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<DescribeKeyPairsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <keySet>\r\n" - . " <item>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>\r\n" - . " </item>\r\n" - . " </keySet>\r\n" - . "</DescribeKeyPairsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Keypair->describe('example-key-name'); - $this->assertEquals('example-key-name', $response[0]['keyName']); - } - - public function testDescribeMultipleKeyPair() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<DescribeKeyPairsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <keySet>\r\n" - . " <item>\r\n" - . " <keyName>example-key-name</keyName>\r\n" - . " <keyFingerprint>1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f</keyFingerprint>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <keyName>zend-test-key</keyName>\r\n" - . " <keyFingerprint>25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f:1f:51:ae:28:bf:89:e9:d8:1f</keyFingerprint>\r\n" - . " </item>\r\n" - . " </keySet>\r\n" - . "</DescribeKeyPairsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Keypair->describe(array('example-key-name', 'zend-test-key')); - - $arrKeys = array( - array( - 'keyName' => 'example-key-name', - 'keyFingerprint'=> '1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f' - ), - array( - 'keyName' => 'zend-test-key', - 'keyFingerprint'=> '25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f:1f:51:ae:28:bf:89:e9:d8:1f' - ) - ); - - foreach($response as $k => $r) { - $this->assertSame($arrKeys[$k], $r); - } - } - - public function testDeleteKeyPairNoNameThrowsException() - { - try { - $this->Zend_Service_Amazon_Ec2_Keypair->delete(''); - $this->fail('An exception should be thrown if an empty keyname is passed in.'); - } catch (Zend_Service_Amazon_Ec2_Exception $zsaee) { - } - } - - public function testDeleteFailsOnNonValidKey() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<DeleteKeyPair xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>false</return>\r\n" - . "</DeleteKeyPair>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Keypair->delete('myfakekeyname'); - $this->assertTrue(is_bool($response)); - $this->assertFalse($response); - } - - public function testDeleteDoesNotFailOnValidKey() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<DeleteKeyPair xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DeleteKeyPair>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Keypair->delete('example-key-name'); - $this->assertTrue(is_bool($response)); - $this->assertTrue($response); - } -} - diff --git a/tests/Zend/Service/Amazon/Ec2/RegionTest.php b/tests/Zend/Service/Amazon/Ec2/RegionTest.php deleted file mode 100644 index 75a945e4f8..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/RegionTest.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Region.php'; - -/** - * Zend_Service_Amazon_Ec2_Region test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_RegionTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Availabilityzones - */ - private $Zend_Service_Amazon_Ec2_Region; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Region = new Zend_Service_Amazon_Ec2_Region('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Region::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Availabilityzones = null; - - parent::tearDown(); - } - - public function testDescribeSingleRegion() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeRegionsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <regionInfo>\r\n" - . " <item>\r\n" - . " <regionName>us-east-1</regionName>\r\n" - . " <regionUrl>us-east-1.ec2.amazonaws.com</regionUrl>\r\n" - . " </item>\r\n" - . " </regionInfo>\r\n" - . "</DescribeRegionsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Region->describe('us-east-1'); - - $arrRegion = array( - array( - 'regionName' => 'us-east-1', - 'regionUrl' => 'us-east-1.ec2.amazonaws.com' - ) - ); - - $this->assertSame($arrRegion, $response); - } - - public function testDescribeMultipleRegions() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeRegionsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <regionInfo>\r\n" - . " <item>\r\n" - . " <regionName>us-east-1</regionName>\r\n" - . " <regionUrl>us-east-1.ec2.amazonaws.com</regionUrl>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <regionName>us-west-1</regionName>\r\n" - . " <regionUrl>us-west-1.ec2.amazonaws.com</regionUrl>\r\n" - . " </item>\r\n" - . " </regionInfo>\r\n" - . "</DescribeRegionsResponse>"; - $this->adapter->setResponse($rawHttpResponse); - - $response = $this->Zend_Service_Amazon_Ec2_Region->describe(array('us-east-1','us-west-1')); - - $arrRegion = array( - array( - 'regionName' => 'us-east-1', - 'regionUrl' => 'us-east-1.ec2.amazonaws.com' - ), - array( - 'regionName' => 'us-west-1', - 'regionUrl' => 'us-west-1.ec2.amazonaws.com' - ) - ); - - $this->assertSame($arrRegion, $response); - } -} - diff --git a/tests/Zend/Service/Amazon/Ec2/SecuritygroupsTest.php b/tests/Zend/Service/Amazon/Ec2/SecuritygroupsTest.php deleted file mode 100644 index fb62ca4589..0000000000 --- a/tests/Zend/Service/Amazon/Ec2/SecuritygroupsTest.php +++ /dev/null @@ -1,480 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Http/Client.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; -require_once 'Zend/Service/Amazon/Ec2/Securitygroups.php'; - -/** - * Zend_Service_Amazon_Ec2_Securitygroups test case. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Ec2 - */ -class Zend_Service_Amazon_Ec2_SecuritygroupsTest extends PHPUnit_Framework_TestCase -{ - - /** - * @var Zend_Service_Amazon_Ec2_Securitygroups - */ - private $Zend_Service_Amazon_Ec2_Securitygroups; - - /** - * Prepares the environment before running a test. - */ - protected function setUp() - { - parent::setUp(); - - $this->Zend_Service_Amazon_Ec2_Securitygroups = new Zend_Service_Amazon_Ec2_Securitygroups('access_key', 'secret_access_key'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - $this->adapter = $adapter; - Zend_Service_Amazon_Ec2_Securitygroups::setHttpClient($client); - - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - unset($this->adapter); - - $this->Zend_Service_Amazon_Ec2_Securitygroups = null; - - parent::tearDown(); - } - - /** - * Tests Zend_Service_Amazon_Ec2_Securitygroups->authorize() - */ - public function testAuthorizeSinglePort() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<AuthorizeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</AuthorizeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->authorizeIp('MyGroup', 'tcp', '80', '80', '0.0.0.0/0'); - $this->assertTrue($return); - - } - - public function testAuthorizeRangeOfPorts() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<AuthorizeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</AuthorizeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->authorizeIp('MyGroup', 'tcp', '6000', '7000', '0.0.0.0/0'); - $this->assertTrue($return); - - } - - public function testAuthorizeSecurityGroupName() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<AuthorizeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</AuthorizeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->authorizeGroup('MyGroup', 'groupname', '15333848'); - $this->assertTrue($return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Securitygroups->create() - */ - public function testCreate() - { - - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<CreateSecurityGroupResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</CreateSecurityGroupResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->create('MyGroup', 'My Security Grup'); - - $this->assertTrue($return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Securitygroups->delete() - */ - public function testDelete() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<DeleteSecurityGroupResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</DeleteSecurityGroupResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->delete('MyGroup'); - - $this->assertTrue($return); - - } - - /** - * Tests Zend_Service_Amazon_Ec2_Securitygroups->describe() - */ - public function testDescribeMultipleSecruityGroups() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeSecurityGroupsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <securityGroupInfo>\r\n" - . " <item>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupName>WebServers</groupName>\r\n" - . " <groupDescription>Web</groupDescription>\r\n" - . " <ipPermissions>\r\n" - . " <item>\r\n" - . " <ipProtocol>tcp</ipProtocol>\r\n" - . " <fromPort>80</fromPort>\r\n" - . " <toPort>80</toPort>\r\n" - . " <groups/>\r\n" - . " <ipRanges>\r\n" - . " <item>\r\n" - . " <cidrIp>0.0.0.0/0</cidrIp>\r\n" - . " </item>\r\n" - . " </ipRanges>\r\n" - . " </item>\r\n" - . " </ipPermissions>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupName>RangedPortsBySource</groupName>\r\n" - . " <groupDescription>A</groupDescription>\r\n" - . " <ipPermissions>\r\n" - . " <item>\r\n" - . " <ipProtocol>tcp</ipProtocol>\r\n" - . " <fromPort>6000</fromPort>\r\n" - . " <toPort>7000</toPort>\r\n" - . " <groups/>\r\n" - . " <ipRanges>\r\n" - . " <item>\r\n" - . " <cidrIp>0.0.0.0/0</cidrIp>\r\n" - . " </item>\r\n" - . " </ipRanges>\r\n" - . " </item>\r\n" - . " </ipPermissions>\r\n" - . " </item>\r\n" - . " </securityGroupInfo>\r\n" - . "</DescribeSecurityGroupsResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->describe(array('WebServers','RangedPortsBySource')); - - $this->assertEquals(2, count($return)); - - $arrGroups = array( - array( - 'ownerId' => 'UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM', - 'groupName' => 'WebServers', - 'groupDescription' => 'Web', - 'ipPermissions' => array(0 => array( - 'ipProtocol' => 'tcp', - 'fromPort' => '80', - 'toPort' => '80', - 'ipRanges' => '0.0.0.0/0' - )) - ), - array( - 'ownerId' => 'UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM', - 'groupName' => 'RangedPortsBySource', - 'groupDescription' => 'A', - 'ipPermissions' => array(0 => array( - 'ipProtocol' => 'tcp', - 'fromPort' => '6000', - 'toPort' => '7000', - 'ipRanges' => '0.0.0.0/0' - )) - ) - ); - foreach($return as $k => $r) { - $this->assertSame($arrGroups[$k], $r); - } - } - - public function testDescribeSingleSecruityGroup() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeSecurityGroupsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <securityGroupInfo>\r\n" - . " <item>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupName>WebServers</groupName>\r\n" - . " <groupDescription>Web</groupDescription>\r\n" - . " <ipPermissions>\r\n" - . " <item>\r\n" - . " <ipProtocol>tcp</ipProtocol>\r\n" - . " <fromPort>80</fromPort>\r\n" - . " <toPort>80</toPort>\r\n" - . " <groups/>\r\n" - . " <ipRanges>\r\n" - . " <item>\r\n" - . " <cidrIp>0.0.0.0/0</cidrIp>\r\n" - . " </item>\r\n" - . " </ipRanges>\r\n" - . " </item>\r\n" - . " </ipPermissions>\r\n" - . " </item>\r\n" - . " </securityGroupInfo>\r\n" - . "</DescribeSecurityGroupsResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->describe('WebServers'); - - $this->assertEquals(1, count($return)); - - $arrGroups = array( - array( - 'ownerId' => 'UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM', - 'groupName' => 'WebServers', - 'groupDescription' => 'Web', - 'ipPermissions' => array(0 => array( - 'ipProtocol' => 'tcp', - 'fromPort' => '80', - 'toPort' => '80', - 'ipRanges' => '0.0.0.0/0' - )) - ) - ); - foreach($return as $k => $r) { - $this->assertSame($arrGroups[$k], $r); - } - } - - public function testDescribeSingleSecruityGroupWithMultipleIpsSamePort() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<DescribeSecurityGroupsResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <securityGroupInfo>\r\n" - . " <item>\r\n" - . " <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>\r\n" - . " <groupName>WebServers</groupName>\r\n" - . " <groupDescription>Web</groupDescription>\r\n" - . " <ipPermissions>\r\n" - . " <item>\r\n" - . " <ipProtocol>tcp</ipProtocol>\r\n" - . " <fromPort>80</fromPort>\r\n" - . " <toPort>80</toPort>\r\n" - . " <groups/>\r\n" - . " <ipRanges>\r\n" - . " <item>\r\n" - . " <cidrIp>0.0.0.0/0</cidrIp>\r\n" - . " </item>\r\n" - . " <item>\r\n" - . " <cidrIp>1.1.1.1/0</cidrIp>\r\n" - . " </item>\r\n" - . " </ipRanges>\r\n" - . " </item>\r\n" - . " </ipPermissions>\r\n" - . " </item>\r\n" - . " </securityGroupInfo>\r\n" - . "</DescribeSecurityGroupsResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->describe('WebServers'); - - $this->assertEquals(1, count($return)); - - $arrGroups = array( - array( - 'ownerId' => 'UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM', - 'groupName' => 'WebServers', - 'groupDescription' => 'Web', - 'ipPermissions' => array(0 => array( - 'ipProtocol' => 'tcp', - 'fromPort' => '80', - 'toPort' => '80', - 'ipRanges' => array( - '0.0.0.0/0', - '1.1.1.1/0' - ) - )) - ) - ); - foreach($return as $k => $r) { - $this->assertSame($arrGroups[$k], $r); - } - } - - /** - * Tests Zend_Service_Amazon_Ec2_Securitygroups->revoke() - */ - public function testRevokeSinglePort() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<RevokeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</RevokeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->revokeIp('MyGroup', 'tcp', '80', '80', '0.0.0.0/0'); - $this->assertTrue($return); - - } - - public function testRevokePortRange() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<RevokeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</RevokeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->revokeIp('MyGroup', 'tcp', '6000', '7000', '0.0.0.0/0'); - $this->assertTrue($return); - - } - - - public function testRevokeSecurityGroupName() - { - $rawHttpResponse = "HTTP/1.1 200 OK\r\n" - . "Date: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Server: hi\r\n" - . "Last-modified: Fri, 24 Oct 2008 17:24:52 GMT\r\n" - . "Status: 200 OK\r\n" - . "Content-type: application/xml; charset=utf-8\r\n" - . "Expires: Tue, 31 Mar 1981 05:00:00 GMT\r\n" - . "Connection: close\r\n" - . "\r\n" - . "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" - . "<RevokeSecurityGroupIngressResponse xmlns=\"http://ec2.amazonaws.com/doc/2009-04-04/\">\r\n" - . " <return>true</return>\r\n" - . "</RevokeSecurityGroupIngressResponse>\r\n"; - $this->adapter->setResponse($rawHttpResponse); - - $return = $this->Zend_Service_Amazon_Ec2_Securitygroups->revokeGroup('MyGroup', 'groupname', '15333848'); - $this->assertTrue($return); - - } - -} - - diff --git a/tests/Zend/Service/Amazon/OfflineTest.php b/tests/Zend/Service/Amazon/OfflineTest.php deleted file mode 100644 index 528818385c..0000000000 --- a/tests/Zend/Service/Amazon/OfflineTest.php +++ /dev/null @@ -1,372 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @see Zend_Service_Amazon - */ -require_once 'Zend/Service/Amazon.php'; - -/** - * @see Zend_Service_Amazon_ResultSet - */ -require_once 'Zend/Service/Amazon/ResultSet.php'; - -/** - * @see Zend_Service_Amazon_ResultSet - */ -require_once 'Zend/Service/Amazon/SimilarProduct.php'; - -/** - * @see Zend_Http_Client_Adapter_Socket - */ -require_once 'Zend/Http/Client/Adapter/Socket.php'; - -/** - * @see Zend_Http_Client_Adapter_Test - */ -require_once 'Zend/Http/Client/Adapter/Test.php'; - - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - */ -class Zend_Service_Amazon_OfflineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon - */ - protected $_amazon; - - /** - * HTTP client adapter for testing - * - * @var Zend_Http_Client_Adapter_Test - */ - protected $_httpClientAdapterTest; - - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - $this->_amazon = new Zend_Service_Amazon(constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID')); - - $this->_httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - } - - /** - * Ensures that __construct() throws an exception when given an invalid country code - * - * @return void - */ - public function testConstructExceptionCountryCodeInvalid() - { - try { - $amazon = new Zend_Service_Amazon(constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID'), 'oops'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('Unknown country code', $e->getMessage()); - } - } - - /** - * @group ZF-2056 - */ - public function testMozardSearchFromFile() - { - $xml = file_get_contents(dirname(__FILE__)."/_files/mozart_result.xml"); - $dom = new DOMDocument(); - $dom->loadXML($xml); - - $mozartTracks = array( - 'B00005A8JZ' => '29', - 'B0000058HV' => '25', - 'B000BLI3K2' => '500', - 'B00004X0QF' => '9', - 'B000004194' => '19', - 'B00000I9M0' => '9', - 'B000004166' => '20', - 'B00002DEH1' => '58', - 'B0000041EV' => '12', - 'B00004SA87' => '42', - ); - - $result = new Zend_Service_Amazon_ResultSet($dom); - - foreach($result AS $item) { - $trackCount = $mozartTracks[$item->ASIN]; - $this->assertEquals($trackCount, count($item->Tracks)); - } - } - - /** - * @group ZF-2749 - */ - public function testSimilarProductConstructorMissingAttributeDoesNotThrowNotice() - { - $dom = new DOMDocument(); - $asin = $dom->createElement("ASIN", "TEST"); - $product = $dom->createElement("product"); - $product->appendChild($asin); - - $similarproduct = new Zend_Service_Amazon_SimilarProduct($product); - } - - /** - * @group ZF-7251 - */ - public function testFullOffersFromFile() - { - $xml = file_get_contents(dirname(__FILE__)."/_files/offers_with_names.xml"); - $dom = new DOMDocument(); - $dom->loadXML($xml); - - $dataExpected = array( - '0439774098' => array( - 'offers' => array( - 'A79CLRHOQ3NF4' => array( - 'name' => 'PLEXSUPPLY', - 'price' => '5153' - ), - 'A2K9NS8DSVOE2W' => array( - 'name' => 'nangsuer', - 'price' => '5153' - ), - 'A31EVTLIC13ORD' => array( - 'name' => 'Wizard of Math', - 'price' => '7599' - ), - 'A3SKJE188CW5XG' => array( - 'name' => 'ReStockIt', - 'price' => '5299' - ), - 'A1729W3053T57N' => array( - 'name' => 'The Price Pros', - 'price' => '5487' - ), - 'A29PHU0KPCGV8S' => array( - 'name' => 'TheFactoryDepot', - 'price' => '5821' - ), - 'AIHRRFGW11GJ8' => array( - 'name' => 'Design Tec Office Products', - 'price' => '5987' - ), - 'A27OK403WRHSGI' => array( - 'name' => 'Kaplan Early Learning Company', - 'price' => '7595' - ), - 'A25DVOZOPBFMAN' => array( - 'name' => 'Deerso', - 'price' => '7599' - ), - 'A6IFKC796Y64H' => array( - 'name' => 'The Education Station Inc', - 'price' => '7599' - ), - ), - ), - 'B00000194U' => array( - 'offers' => array( - 'A3UOG6723G7MG0' => array( - 'name' => 'Efunctional', - 'price' => '480' - ), - 'A3SNNXCKUIW1O2' => array( - 'name' => 'Universal Mania', - 'price' => '531' - ), - 'A18ACDNYOEMMOL' => array( - 'name' => 'ApexSuppliers', - 'price' => '589' - ), - 'A2NYACAJP9I1IY' => array( - 'name' => 'GizmosForLife', - 'price' => '608' - ), - 'A1729W3053T57N' => array( - 'name' => 'The Price Pros', - 'price' => '628' - ), - 'A29PHU0KPCGV8S' => array( - 'name' => 'TheFactoryDepot', - 'price' => '638' - ), - 'A3Q3IAIX1CLBMZ' => array( - 'name' => 'ElectroGalaxy', - 'price' => '697' - ), - 'A1PC5XI7QQLW5G' => array( - 'name' => 'Long Trading Company', - 'price' => '860' - ), - 'A2R0FX412W1BDT' => array( - 'name' => 'Beach Audio', - 'price' => '896' - ), - 'AKJJGJ0JKT8F1' => array( - 'name' => 'Buy.com', - 'price' => '899' - ), - ), - ), - ); - - $result = new Zend_Service_Amazon_ResultSet($dom); - - foreach($result AS $item) { - $data = $dataExpected[$item->ASIN]; - foreach($item->Offers->Offers as $offer) { - $this->assertEquals($data['offers'][$offer->MerchantId]['name'], $offer->MerchantName); - $this->assertEquals($data['offers'][$offer->MerchantId]['price'], $offer->Price); - } - } - } - - public function dataSignatureEncryption() - { - return array( - array( - 'http://webservices.amazon.com', - array( - 'Service' => 'AWSECommerceService', - 'AWSAccessKeyId' => '00000000000000000000', - 'Operation' => 'ItemLookup', - 'ItemId' => '0679722769', - 'ResponseGroup' => 'ItemAttributes,Offers,Images,Reviews', - 'Version' => '2009-01-06', - 'Timestamp' => '2009-01-01T12:00:00Z', - ), - "GET\n". - "webservices.amazon.com\n". - "/onca/xml\n". - "AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I". - "temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview". - "s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&". - "Version=2009-01-06", - 'Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D' - ), - array( - 'http://ecs.amazonaws.co.uk', - array( - 'Service' => 'AWSECommerceService', - 'AWSAccessKeyId' => '00000000000000000000', - 'Operation' => 'ItemSearch', - 'Actor' => 'Johnny Depp', - 'ResponseGroup' => 'ItemAttributes,Offers,Images,Reviews,Variations', - 'Version' => '2009-01-01', - 'SearchIndex' => 'DVD', - 'Sort' => 'salesrank', - 'AssociateTag' => 'mytag-20', - 'Timestamp' => '2009-01-01T12:00:00Z', - ), - "GET\n". - "ecs.amazonaws.co.uk\n". - "/onca/xml\n". - "AWSAccessKeyId=00000000000000000000&Actor=Johnny%20Depp&Associate". - "Tag=mytag-20&Operation=ItemSearch&ResponseGroup=ItemAttributes%2C". - "Offers%2CImages%2CReviews%2CVariations&SearchIndex=DVD&Service=AW". - "SECommerceService&Sort=salesrank&Timestamp=2009-01-01T12%3A00%3A0". - "0Z&Version=2009-01-01", - 'TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D', - ), - ); - } - - /** - * Checking if signature Encryption due on August 15th for Amazon Webservice API is working correctly. - * - * @dataProvider dataSignatureEncryption - * @group ZF-7033 - */ - public function testSignatureEncryption($baseUri, $params, $expectedStringToSign, $expectedSignature) - { - $this->assertEquals( - $expectedStringToSign, - Zend_Service_Amazon::buildRawSignature($baseUri, $params) - ); - - $this->assertEquals( - $expectedSignature, - rawurlencode(Zend_Service_Amazon::computeSignature( - $baseUri, '1234567890', $params - )) - ); - } - - /** - * Testing if Amazon service component can handle return values where the - * item-list is not empty - * - * @group ZF-9547 - */ - public function testAmazonComponentHandlesValidBookResults() - { - $xml = file_get_contents(dirname(__FILE__)."/_files/amazon-response-valid.xml"); - $dom = new DOMDocument(); - $dom->loadXML($xml); - - $result = new Zend_Service_Amazon_ResultSet($dom); - - $currentItem = null; - try { - $currentItem = $result->current(); - } catch (Zend_Service_Amazon_Exception $e) { - $this->fail('Unexpected exception was triggered'); - } - $this->assertTrue($currentItem instanceof Zend_Service_Amazon_Item); - $this->assertEquals('0754512673', $currentItem->ASIN); - } - - /** - * Testing if Amazon service component can handle return values where the - * item-list is empty (no results found) - * - * @group ZF-9547 - */ - public function testAmazonComponentHandlesEmptyBookResults() - { - $xml = file_get_contents(dirname(__FILE__)."/_files/amazon-response-invalid.xml"); - $dom = new DOMDocument(); - $dom->loadXML($xml); - - $result = new Zend_Service_Amazon_ResultSet($dom); - - try { - $result->current(); - $this->fail('Expected exception was not triggered'); - } catch (Zend_Service_Amazon_Exception $e) { - return; - } - } -} diff --git a/tests/Zend/Service/Amazon/OnlineTest.php b/tests/Zend/Service/Amazon/OnlineTest.php deleted file mode 100644 index 9ba1e61c01..0000000000 --- a/tests/Zend/Service/Amazon/OnlineTest.php +++ /dev/null @@ -1,352 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @see Zend_Service_Amazon - */ -require_once 'Zend/Service/Amazon.php'; - -/** - * @see Zend_Service_Amazon_Query - */ -require_once 'Zend/Service/Amazon/Query.php'; - -/** - * @see Zend_Http_Client_Adapter_Socket - */ -require_once 'Zend/Http/Client/Adapter/Socket.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - */ -class Zend_Service_Amazon_OnlineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon - */ - protected $_amazon; - - /** - * Reference to Amazon query API object - * - * @var Zend_Service_Amazon_Query - */ - protected $_query; - - /** - * Socket based HTTP client adapter - * - * @var Zend_Http_Client_Adapter_Socket - */ - protected $_httpClientAdapterSocket; - - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - if(!defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID') || !defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY')) { - $this->markTestSkipped('Constants AccessKeyId and SecretKey have to be set.'); - } - - $this->_amazon = new Zend_Service_Amazon( - TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID, - 'US', - TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY - ); - - $this->_query = new Zend_Service_Amazon_Query( - TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID, - 'US', - TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY - ); - - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_amazon->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - - // terms of use compliance: no more than one query per second - sleep(1); - } - - /** - * Ensures that itemSearch() works as expected when searching for PHP books - * @group ItemSearchPhp - * @return void - */ - public function testItemSearchBooksPhp() - { - $resultSet = $this->_amazon->itemSearch(array( - 'SearchIndex' => 'Books', - 'Keywords' => 'php', - 'ResponseGroup' => 'Small,ItemAttributes,Images,SalesRank,Reviews,EditorialReview,Similarities,' - . 'ListmaniaLists' - )); - - $this->assertTrue(10 < $resultSet->totalResults()); - $this->assertTrue(1 < $resultSet->totalPages()); - $this->assertEquals(0, $resultSet->key()); - - try { - $resultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->seek(9); - - try { - $resultSet->seek(10); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - - $this->assertTrue(simplexml_load_string($item->asXml()) instanceof SimpleXMLElement); - } - - /** - * Ensures that itemSearch() works as expected when searching for music with keyword of Mozart - * - * @return void - */ - public function testItemSearchMusicMozart() - { - $resultSet = $this->_amazon->itemSearch(array( - 'SearchIndex' => 'Music', - 'Keywords' => 'Mozart', - 'ResponseGroup' => 'Small,Tracks,Offers' - )); - - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - } - - /** - * Ensures that itemSearch() works as expected when searching for digital cameras - * - * @return void - */ - public function testItemSearchElectronicsDigitalCamera() - { - $resultSet = $this->_amazon->itemSearch(array( - 'SearchIndex' => 'Electronics', - 'Keywords' => 'digital camera', - 'ResponseGroup' => 'Accessories' - )); - - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - } - - /** - * Ensures that itemSearch() works as expected when sorting - * - * @return void - */ - public function testItemSearchBooksPHPSort() - { - $resultSet = $this->_amazon->itemSearch(array( - 'SearchIndex' => 'Books', - 'Keywords' => 'php', - 'Sort' => '-titlerank' - )); - - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - } - - /** - * Ensures that itemSearch() throws an exception when provided an invalid city - * - * @return void - */ - public function testItemSearchExceptionCityInvalid() - { - try { - $this->_amazon->itemSearch(array( - 'SearchIndex' => 'Restaurants', - 'Keywords' => 'seafood', - 'City' => 'Des Moines' - )); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - } - } - - /** - * Ensures that itemLookup() works as expected - * - * @return void - */ - public function testItemLookup() - { - $item = $this->_amazon->itemLookup('B0015T963C'); - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - - /** - * Ensures that itemLookup() throws an exception when provided an invalid ASIN - * - * @return void - */ - public function testItemLookupExceptionAsinInvalid() - { - try { - $this->_amazon->itemLookup('oops'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('not a valid value for ItemId', $e->getMessage()); - } - } - - /** - * Ensures that itemLookup() works as expected when provided multiple ASINs - * - * @return void - */ - public function testItemLookupMultiple() - { - $resultSet = $this->_amazon->itemLookup('0596006810,1590593804'); - - $count = 0; - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - $count++; - } - - $this->assertEquals(2, $count); - } - - /** - * Ensures that itemLookup() throws an exception when given a SearchIndex - * - * @return void - */ - public function testItemLookupExceptionSearchIndex() - { - try { - $this->_amazon->itemLookup('oops', array('SearchIndex' => 'Books')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('restricted parameter combination', $e->getMessage()); - } - } - - /** - * Ensures that the query API works as expected when searching for PHP books - * - * @return void - */ - public function testQueryBooksPhp() - { - $resultSet = $this->_query->category('Books')->Keywords('php')->search(); - - foreach ($resultSet as $item) { - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } - } - - /** - * Ensures that the query API throws an exception when a category is not first provided - * - * @return void - */ - public function testQueryExceptionCategoryMissing() - { - try { - $this->_query->Keywords('php'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('set a category', $e->getMessage()); - } - } - - /** - * Ensures that the query API throws an exception when the category is invalid - * - * @return void - */ - public function testQueryExceptionCategoryInvalid() - { - try { - $this->_query->category('oops')->search(); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('SearchIndex is invalid', $e->getMessage()); - } - } - - /** - * Ensures that the query API works as expected when searching by ASIN - * - * @return void - */ - public function testQueryAsin() - { - $item = $this->_query->asin('B0015T963C')->search(); - $this->assertTrue($item instanceof Zend_Service_Amazon_Item); - } -} - - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - */ -class Zend_Service_Amazon_OnlineTest_Skip extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Service_Amazon online tests not enabled with an access key ID in ' - . 'TestConfiguration.php'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/S3/AllTests.php b/tests/Zend/Service/Amazon/S3/AllTests.php deleted file mode 100755 index 81efd87b42..0000000000 --- a/tests/Zend/Service/Amazon/S3/AllTests.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_S3_AllTests::main'); -} - -require_once 'Zend/Service/Amazon/S3/OfflineTest.php'; -require_once 'Zend/Service/Amazon/S3/OnlineTest.php'; -require_once 'Zend/Service/Amazon/S3/StreamTest.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service_Amazon_S3'); - - $suite->addTestSuite('Zend_Service_Amazon_S3_OfflineTest'); - if (defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') && - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') && - defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID') && - defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY')) { - $suite->addTestSuite('Zend_Service_Amazon_S3_OnlineTest'); - $suite->addTestSuite('Zend_Service_Amazon_S3_StreamTest'); - } else { - $suite->addTestSuite('Zend_Service_Amazon_S3_StreamTest_Skip'); - $suite->addTestSuite('Zend_Service_Amazon_S3_OnlineTest_Skip'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_S3_AllTests::main') { - Zend_Service_Amazon_S3_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/S3/OfflineTest.php b/tests/Zend/Service/Amazon/S3/OfflineTest.php deleted file mode 100755 index c7ce9a27f5..0000000000 --- a/tests/Zend/Service/Amazon/S3/OfflineTest.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - - -/** - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_OfflineTest extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('No offline tests for Zend_Service_Amazon_S3'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/S3/OnlineTest.php b/tests/Zend/Service/Amazon/S3/OnlineTest.php deleted file mode 100755 index 39a8b4a278..0000000000 --- a/tests/Zend/Service/Amazon/S3/OnlineTest.php +++ /dev/null @@ -1,545 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @see Zend_Service_Amazon - */ -require_once 'Zend/Service/Amazon/S3.php'; - -/** - * @see Zend_Http_Client_Adapter_Socket - */ -require_once 'Zend/Http/Client/Adapter/Socket.php'; - - -/** - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_OnlineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon_S3 - */ - protected $_amazon; - - /** - * Socket based HTTP client adapter - * - * @var Zend_Http_Client_Adapter_Socket - */ - protected $_httpClientAdapterSocket; - - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - $this->_amazon = new Zend_Service_Amazon_S3(constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID'), - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ); - $this->_nosuchbucket = "nonexistingbucketnamewhichnobodyshoulduse"; - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_bucket = constant('TESTS_ZEND_SERVICE_AMAZON_S3_BUCKET'); - $this->_bucketEu = $this->_bucket.'-eu'; - - $this->_amazon->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - - // terms of use compliance: no more than one query per second - sleep(1); - } - - /** - * Test creating bucket - * - * @return void - */ - public function testCreateBucket() - { - $this->_amazon->createBucket($this->_bucket); - $this->assertTrue($this->_amazon->isBucketAvailable($this->_bucket)); - $list = $this->_amazon->getBuckets(); - $this->assertContains($this->_bucket, $list); - } - - /** - * Test creating object - * - * @return void - */ - public function testCreateObject() - { - $this->_amazon->createBucket($this->_bucket); - $this->_amazon->putObject($this->_bucket."/zftest", "testdata"); - $this->assertEquals("testdata", $this->_amazon->getObject($this->_bucket."/zftest")); - } - - /** - * Get object using streaming and temp files - * - */ - public function testGetObjectStream() - { - $this->_amazon->createBucket($this->_bucket); - $this->_amazon->putObject($this->_bucket."/zftest", "testdata"); - $response = $this->_amazon->getObjectStream($this->_bucket."/zftest"); - - $this->assertTrue($response instanceof Zend_Http_Response_Stream, 'The test did not return stream response'); - $this->assertTrue(is_resource($response->getStream()), 'Request does not contain stream!'); - - $stream_name = $response->getStreamName(); - - $stream_read = stream_get_contents($response->getStream()); - $file_read = file_get_contents($stream_name); - - $this->assertEquals("testdata", $stream_read, 'Downloaded stream does not seem to match!'); - $this->assertEquals("testdata", $file_read, 'Downloaded file does not seem to match!'); - } - - /** - * Get object using streaming and specific files - * - */ - public function testGetObjectStreamNamed() - { - $this->_amazon->createBucket($this->_bucket); - $this->_amazon->putObject($this->_bucket."/zftest", "testdata"); - $outfile = tempnam(sys_get_temp_dir(), "output"); - - $response = $this->_amazon->getObjectStream($this->_bucket."/zftest", $outfile); - - $this->assertTrue($response instanceof Zend_Http_Response_Stream, 'The test did not return stream response'); - $this->assertTrue(is_resource($response->getStream()), 'Request does not contain stream!'); - - $this->assertEquals($outfile, $response->getStreamName()); - - $stream_read = stream_get_contents($response->getStream()); - $file_read = file_get_contents($outfile); - - $this->assertEquals("testdata", $stream_read, 'Downloaded stream does not seem to match!'); - $this->assertEquals("testdata", $file_read, 'Downloaded file does not seem to match!'); - } - /** - * Test getting info - * - * @return void - */ - public function testGetInfo() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $info = $this->_amazon->getInfo($this->_bucket."/zftest"); - $this->assertEquals('"'.md5($data).'"', $info["etag"]); - $this->assertEquals(strlen($data), $info["size"]); - - $this->_amazon->putObject($this->_bucket."/zftest.jpg", $data, null); - $info = $this->_amazon->getInfo($this->_bucket."/zftest.jpg"); - $this->assertEquals( 'image/jpeg', $info["type"]); - } - - public function testNoBucket() - { - $this->assertFalse($this->_amazon->putObject($this->_nosuchbucket."/zftest", "testdata")); - $this->assertFalse($this->_amazon->getObject($this->_nosuchbucket."/zftest")); - $this->assertFalse($this->_amazon->getObjectsByBucket($this->_nosuchbucket)); - } - - public function testNoObject() - { - $this->_amazon->createBucket($this->_bucket); - $this->assertFalse($this->_amazon->getObject($this->_bucket."/zftest-no-such-object/in/there")); - $this->assertFalse($this->_amazon->getInfo($this->_bucket."/zftest-no-such-object/in/there")); - } - - public function testOverwriteObject() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $info = $this->_amazon->getInfo($this->_bucket."/zftest"); - $this->assertEquals('"'.md5($data).'"', $info["etag"]); - $this->assertEquals(strlen($data), $info["size"]); - - $data = "testdata with some other data"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $info = $this->_amazon->getInfo($this->_bucket."/zftest"); - $this->assertEquals('"'.md5($data).'"', $info["etag"]); - $this->assertEquals(strlen($data), $info["size"]); - } - - public function testRemoveObject() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $this->_amazon->removeObject($this->_bucket."/zftest", $data); - $this->assertFalse($this->_amazon->getObject($this->_bucket."/zftest")); - $this->assertFalse($this->_amazon->getInfo($this->_bucket."/zftest")); - } - - public function testRemoveBucket() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $this->_amazon->cleanBucket($this->_bucket); - $this->_amazon->removeBucket($this->_bucket); - - $this->assertFalse($this->_amazon->isBucketAvailable($this->_bucket)); - $this->assertFalse($this->_amazon->isObjectAvailable($this->_bucket."/zftest")); - $this->assertFalse((boolean)$this->_amazon->getObjectsByBucket($this->_bucket)); - $list = $this->_amazon->getBuckets(); - $this->assertNotContains($this->_bucket, $list); - } - - protected function _fileTest($filename, $object, $type, $exp_type, $stream = false) - { - if($stream) { - $this->_amazon->putFile($filename, $object, array(Zend_Service_Amazon_S3::S3_CONTENT_TYPE_HEADER => $type)); - } else { - $this->_amazon->putFileStream($filename, $object, array(Zend_Service_Amazon_S3::S3_CONTENT_TYPE_HEADER => $type)); - } - - $data = file_get_contents($filename); - $this->assertTrue($this->_amazon->isObjectAvailable($object)); - - $info = $this->_amazon->getInfo($object); - $this->assertEquals('"'.md5_file($filename).'"', $info["etag"]); - $this->assertEquals(filesize($filename), $info["size"]); - $this->assertEquals($exp_type, $info["type"]); - - $fdata = $this->_amazon->getObject($object); - $this->assertEquals($data, $fdata); - } - - public function testPutFile() - { - $filedir = dirname(__FILE__)."/_files/"; - $this->_amazon->createBucket($this->_bucket); - - $this->_fileTest($filedir."testdata", $this->_bucket."/zftestfile", null, 'binary/octet-stream'); - $this->_fileTest($filedir."testdata", $this->_bucket."/zftestfile2", 'text/plain', 'text/plain'); - $this->_fileTest($filedir."testdata.html", $this->_bucket."/zftestfile3", null, 'text/html'); - $this->_fileTest($filedir."testdata.html", $this->_bucket."/zftestfile3.html", 'text/plain', 'text/plain'); - } - - public function testPutFileStream() - { - $filedir = dirname(__FILE__)."/_files/"; - $this->_amazon->createBucket($this->_bucket); - - $this->_fileTest($filedir."testdata", $this->_bucket."/zftestfile", null, 'binary/octet-stream', true); - $this->_fileTest($filedir."testdata", $this->_bucket."/zftestfile2", 'text/plain', 'text/plain', true); - $this->_fileTest($filedir."testdata.html", $this->_bucket."/zftestfile3", null, 'text/html', true); - $this->_fileTest($filedir."testdata.html", $this->_bucket."/zftestfile3.html", 'text/plain', 'text/plain', true); - } - - public function testPutNoFile() - { - $filedir = dirname(__FILE__)."/_files/"; - - try { - $this->_amazon->putFile($filedir."nosuchfile", $this->_bucket."/zftestfile"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("Cannot read", $e->getMessage()); - $this->assertContains("nosuchfile", $e->getMessage()); - } - $this->assertFalse($this->_amazon->isObjectAvailable($this->_bucket."/zftestfile")); - } - - /** - * @depends testCreateBucket - * @depends testCreateObject - */ - public function testCopyObject() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $info1 = $this->_amazon->getInfo($this->_bucket."/zftest"); - - $this->_amazon->copyObject($this->_bucket."/zftest", $this->_bucket."/zftest2"); - $this->assertTrue($this->_amazon->isObjectAvailable($this->_bucket."/zftest")); - $this->assertTrue($this->_amazon->isObjectAvailable($this->_bucket."/zftest2")); - $info2 = $this->_amazon->getInfo($this->_bucket."/zftest2"); - - $this->assertEquals($info1['etag'], $info2['etag']); - } - - /** - * @depends testCopyObject - * @depends testRemoveObject - */ - public function testMoveObject() - { - $this->_amazon->createBucket($this->_bucket); - $data = "testdata"; - - $this->_amazon->putObject($this->_bucket."/zftest", $data); - $info1 = $this->_amazon->getInfo($this->_bucket."/zftest"); - - $this->_amazon->moveObject($this->_bucket."/zftest", $this->_bucket."/zftest2"); - $this->assertFalse($this->_amazon->isObjectAvailable($this->_bucket."/zftest")); - $this->assertTrue($this->_amazon->isObjectAvailable($this->_bucket."/zftest2")); - $info2 = $this->_amazon->getInfo($this->_bucket."/zftest2"); - - $this->assertEquals($info1['etag'], $info2['etag']); - } - - public function testObjectEncoding() - { - $this->_amazon->createBucket($this->_bucket); - - $this->_amazon->putObject($this->_bucket."/this is a 100% test", "testdata"); - $this->assertEquals("testdata", $this->_amazon->getObject($this->_bucket."/this is a 100% test")); - - $this->_amazon->putObject($this->_bucket."/Ñто тоже теÑÑ‚!", "testdata123"); - $this->assertEquals("testdata123", $this->_amazon->getObject($this->_bucket."/Ñто тоже теÑÑ‚!")); - } - - public function testBadNames() - { - try { - $this->_amazon->createBucket("This is a Very Bad Name"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("contains invalid characters", $e->getMessage()); - } - try { - $this->_amazon->isBucketAvailable("This is a Very Bad Name"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Uri_Exception $e) { - $this->assertContains("not a valid HTTP host", $e->getMessage()); - } - try { - $this->_amazon->putObject("This is a Very Bad Name/And It Gets Worse", "testdata"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("contains invalid characters", $e->getMessage()); - } - try { - $this->_amazon->getObject("This is a Very Bad Name/And It Gets Worse"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("contains invalid characters", $e->getMessage()); - } - try { - $this->_amazon->getInfo("This is a Very Bad Name/And It Gets Worse"); - $this->fail("Expected exception not thrown"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("contains invalid characters", $e->getMessage()); - } - } - - public function testAcl() - { - $this->_amazon->createBucket($this->_bucket); - $filedir = dirname(__FILE__)."/_files/"; - - $this->_amazon->putFile($filedir."testdata.html", $this->_bucket."/zftestfile.html"); - $this->_amazon->putFile($filedir."testdata.html", $this->_bucket."/zftestfile2.html", - array(Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ)); - - $url = 'http://' . Zend_Service_Amazon_S3::S3_ENDPOINT."/".$this->_bucket."/zftestfile.html"; - $data = @file_get_contents($url); - $this->assertFalse($data); - - $url = 'http://' . Zend_Service_Amazon_S3::S3_ENDPOINT."/".$this->_bucket."/zftestfile2.html"; - $data = @file_get_contents($url); - $this->assertEquals(file_get_contents($filedir."testdata.html"), $data); - } - - /** - * Test creating bucket with location - * ZF-6728 - * - */ - public function testCreateBucketEU() - { - $this->_amazon->createBucket($this->_bucketEu, 'EU'); - $this->assertTrue($this->_amazon->isBucketAvailable($this->_bucketEu)); - $list = $this->_amazon->getBuckets(); - $this->assertContains($this->_bucketEu, $list); - $this->_amazon->cleanBucket($this->_bucketEu); - $this->_amazon->removeBucket($this->_bucketEu); - } - /** - * Test bucket name with /'s and encoding - * - * ZF-6855 - * - */ - public function testObjectPath() - { - $this->_amazon->createBucket($this->_bucket); - $filedir = dirname(__FILE__)."/_files/"; - $this->_amazon->putFile($filedir."testdata.html", $this->_bucket."/subdir/dir with spaces/zftestfile.html", - array(Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ)); - $url = 'http://' . Zend_Service_Amazon_S3::S3_ENDPOINT."/".$this->_bucket."/subdir/dir%20with%20spaces/zftestfile.html"; - $data = @file_get_contents($url); - $this->assertEquals(file_get_contents($filedir."testdata.html"), $data); - } - - /** - * Test that isObjectAvailable() works if object name contains spaces - * - * @depends testCreateBucket - * @depends testObjectPath - * - * ZF-10017 - */ - public function testIsObjectAvailableWithSpacesInKey() - { - $this->_amazon->createBucket($this->_bucket); - $filedir = dirname(__FILE__)."/_files/"; - $key = $this->_bucket.'/subdir/another dir with spaces/zftestfile.html'; - $this->_amazon->putFile($filedir."testdata.html", $key); - $this->assertTrue($this->_amazon->isObjectAvailable($key)); - } - - /** - * Test creating object with https - * - * ZF-7029 - */ - public function testCreateObjectSSL() - { - $this->_amazon->setEndpoint('https://s3.amazonaws.com'); - $this->assertEquals('https://s3.amazonaws.com', $this->_amazon->getEndpoint()->getUri()); - $this->_amazon->createBucket($this->_bucket); - $this->_amazon->putObject($this->_bucket."/zftest", "testdata"); - $this->assertEquals("testdata", $this->_amazon->getObject($this->_bucket."/zftest")); - } - - /** - * Test creating bucket with IP - * - * ZF-6686 - */ - public function testBucketIPMask() - { - try { - $this->_amazon->createBucket("127.0.0.1"); - $this->fail("Failed to throw expected exception"); - } catch(Zend_Service_Amazon_S3_Exception $e) { - $this->assertContains("cannot be an IP address", $e->getMessage()); - } - $this->_amazon->createBucket("123-456-789-123"); - $this->assertTrue($this->_amazon->isBucketAvailable("123-456-789-123")); - $this->_amazon->removeBucket("123-456-789-123"); - } - - /** - * @see ZF-7773 - */ - public function testGetObjectsByBucketParams() - { - $this->_amazon->createBucket("testgetobjectparams1"); - $this->_amazon->putObject("testgetobjectparams1/zftest1", "testdata"); - $this->_amazon->putObject("testgetobjectparams1/zftest2", "testdata"); - - $list = $this->_amazon->getObjectsByBucket("testgetobjectparams1", array('max-keys' => 1)); - $this->assertEquals(1, count($list)); - - $this->_amazon->removeObject("testgetobjectparams1/zftest1", "testdata"); - $this->_amazon->removeObject("testgetobjectparams1/zftest2", "testdata"); - $this->_amazon->removeBucket("testgetobjectparams1"); - } - /** - * @see ZF-10219 - */ - public function testVersionBucket() - { - $this->_amazon->createBucket($this->_bucket); - $response= $this->_amazon->_makeRequest('GET', $this->_bucket.'/?versions', array('versions'=>'')); - $this->assertNotNull($response,'The response for the ?versions is empty'); - $xml = new SimpleXMLElement($response->getBody()); - $this->assertEquals((string) $xml->Name,$this->_bucket,'The bucket name in XML response is not valid'); - } - /** - * @see ZF-11401 - */ - public function testCommonPrefixes() - { - $this->_amazon->createBucket($this->_bucket); - $this->_amazon->putObject($this->_bucket.'/test-folder/test1','test'); - $this->_amazon->putObject($this->_bucket.'/test-folder/test2-folder/',''); - $params= array( - 'prefix' => 'test-folder/', - 'delimiter' => '/' - ); - $response= $this->_amazon->getObjectsAndPrefixesByBucket($this->_bucket,$params); - $this->assertEquals($response['objects'][0],'test-folder/test1'); - $this->assertEquals($response['prefixes'][0],'test-folder/test2-folder/'); - } - public function tearDown() - { - unset($this->_amazon->debug); - $this->_amazon->cleanBucket($this->_bucket); - $this->_amazon->removeBucket($this->_bucket); - sleep(1); - } -} - - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_OnlineTest_Skip extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Service_Amazon_S3 online tests not enabled with an access key ID in ' - . 'TestConfiguration.php'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/S3/StreamTest.php b/tests/Zend/Service/Amazon/S3/StreamTest.php deleted file mode 100755 index e5f2b5d396..0000000000 --- a/tests/Zend/Service/Amazon/S3/StreamTest.php +++ /dev/null @@ -1,277 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -/** - * @see Zend_Service_Amazon - */ -require_once 'Zend/Service/Amazon/S3.php'; - -/** - * @see Zend_Http_Client_Adapter_Socket - */ -require_once 'Zend/Http/Client/Adapter/Socket.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_StreamTest extends PHPUnit_Framework_TestCase -{ - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - $this->_amazon = new Zend_Service_Amazon_S3(constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID'), - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ); - $this->_nosuchbucket = "nonexistingbucketnamewhichnobodyshoulduse"; - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_bucket = constant('TESTS_ZEND_SERVICE_AMAZON_S3_BUCKET'); - $this->_bucketName = "s3://".$this->_bucket; - $this->_fileName = $this->_bucketName."/sample_file.txt"; - - $this->_amazon->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - $this->_amazon->registerStreamWrapper(); - $this->_amazon->cleanBucket($this->_bucket); - $this->_amazon->removeBucket($this->_bucket); - // terms of use compliance: no more than one query per second - sleep(1); - } - - /** - * Tear down each test - * - * @return void - */ - public function tearDown() - { - $this->_amazon->unregisterStreamWrapper(); - $buckets = $this->_amazon->getBuckets(); - foreach($buckets as $bucket) { - if(substr($bucket, 0, strlen($this->_bucket)) != $this->_bucket) { - continue; - } - $this->_amazon->cleanBucket($bucket); - $this->_amazon->removeBucket($bucket); - } - } - - /** - * Test creating and removing buckets - * - * @return void - */ - public function testBuckets() - { - // Create the bucket - $result = mkdir($this->_bucketName); - $this->assertTrue($result); - // Remove the bucket - $result = rmdir($this->_bucketName); - $this->assertTrue($result); - } - - /** - * Test writing to an object - * - * @return void - */ - public function testWriteObject() - { - // Create the bucket - $result = mkdir($this->_bucketName); - $this->assertTrue($result); - - // Generate sample data - $data = str_repeat('x', 10000); - - // Write to an object - $size = file_put_contents($this->_fileName, $data); - $this->assertEquals(strlen($data), $size); - - // Write to an object - $f = fopen($this->_fileName, 'w'); - for ($i = 0; $i < 100; $i++) { - fwrite($f, 'x'); - } - fclose($f); - - unset($data); - - // Check object size - $size = filesize($this->_fileName); - $this->assertEquals(100, $size); - - // Remove the object - $result = unlink($this->_fileName); - $this->assertTrue($result); - } - - /** - * Test reading from an object - * - * @group ZF-10035 - * @return void - */ - public function testReadObject() - { - // Create the bucket - $result = mkdir($this->_bucketName); - $this->assertTrue($result); - - // Generate sample data - $data = str_repeat('x', 10000); - - // Write to an object - $size = file_put_contents($this->_fileName, $data); - $this->assertEquals(strlen($data), $size); - - // Read from an object - $new_data = file_get_contents($this->_fileName); - - $this->assertEquals($data, $new_data); - - // Read from an oject - $new_data = ''; - - $f = fopen($this->_fileName, 'r'); - fseek($f, 1000); - while (!feof($f)) { - $chunk = fread($f, 1000); - $new_data .= $chunk; - $this->assertEquals(strlen($chunk), 1000); - } - fclose($f); - - $this->assertEquals(substr($data, 1000), $new_data); - - unset($data); - unset($new_data); - - // Remove the object - $result = unlink($this->_fileName); - $this->assertTrue($result); - } - - /** - * Test getting the list of available buckets - * - * @return void - */ - public function testGetBucketList() - { - $buckets = array($this->_bucket.'zf-test1', $this->_bucket.'zf-test2', $this->_bucket.'zf-test3'); - - // Create the buckets - foreach ($buckets as $bucket) { - $result = mkdir('s3://'.$bucket); - $this->assertTrue($result); - } - - $online_buckets = array(); - - // Retrieve list of buckets on S3 - $e = opendir('s3://'); - while (($f = readdir($e)) !== false) { - $online_buckets[] = $f; - } - closedir($e); - - // Check that each bucket is in our original list - foreach ($buckets as $bucket) { - $this->assertContains($bucket, $online_buckets); - } - - // Remove the buckets - foreach ($buckets as $bucket) { - $result = rmdir('s3://'.$bucket); - $this->assertTrue($result); - } - } - - /** - * Test object stat - * - * @return void - */ - public function testObjectStat() - { - // Create the bucket - $result = mkdir($this->_bucketName); - $this->assertTrue($result); - - $this->assertTrue(is_dir($this->_bucketName)); - - $data = str_repeat('x', 10000); - $len = strlen($data); - - // Write to an object - $size = file_put_contents($this->_fileName, $data); - $this->assertEquals($len, $size); - - $this->assertFalse(is_dir($this->_fileName)); - - // Stat an object - $info = stat($this->_fileName); - $this->assertEquals($len, $info['size']); - - unset($data); - - // Remove the object - $result = unlink($this->_fileName); - $this->assertTrue($result); - } -} - -/** - * @category Zend - * @package Zend_Service_Amazon_S3 - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_S3 - */ -class Zend_Service_Amazon_S3_StreamTest_Skip extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Service_Amazon_S3 online tests not enabled with an access key ID and ' - . ' secret key ID in TestConfiguration.php'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/S3/_files/testdata b/tests/Zend/Service/Amazon/S3/_files/testdata deleted file mode 100755 index b95931a5dc..0000000000 --- a/tests/Zend/Service/Amazon/S3/_files/testdata +++ /dev/null @@ -1 +0,0 @@ -test 12345 \ No newline at end of file diff --git a/tests/Zend/Service/Amazon/S3/_files/testdata.html b/tests/Zend/Service/Amazon/S3/_files/testdata.html deleted file mode 100755 index 5313b54cb0..0000000000 --- a/tests/Zend/Service/Amazon/S3/_files/testdata.html +++ /dev/null @@ -1,3 +0,0 @@ -<h1>test!</h1> - -test! diff --git a/tests/Zend/Service/Amazon/SimpleDb/AllTests.php b/tests/Zend/Service/Amazon/SimpleDb/AllTests.php deleted file mode 100644 index 265bfbea36..0000000000 --- a/tests/Zend/Service/Amazon/SimpleDb/AllTests.php +++ /dev/null @@ -1,88 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_SimpleDb_AllTests::main'); -} - -/** - * @see Zend_Service_Amazon_SimpleDb_OfflineTest - */ -require_once 'Zend/Service/Amazon/SimpleDb/OfflineTest.php'; - -/** - * @see Zend_Service_Amazon_SimpleDb_OnlineTest - */ -require_once 'Zend/Service/Amazon/SimpleDb/OnlineTest.php'; - -/** - * @see Zend_Service_Amazon_SimpleDb_PageTest - */ -require_once 'Zend/Service/Amazon/SimpleDb/PageTest.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_SimpleDb_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service - Amazon - SimpleDB'); - - if (defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ) { - $suite->addTestSuite('Zend_Service_Amazon_SimpleDb_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Amazon_SimpleDb_OfflineTest'); - } - - $suite->addTestSuite('Zend_Service_Amazon_SimpleDb_PageTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_SimpleDb_AllTests::main') { - Zend_Service_Amazon_SimpleDb_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/SimpleDb/OfflineTest.php b/tests/Zend/Service/Amazon/SimpleDb/OfflineTest.php deleted file mode 100644 index df58a17195..0000000000 --- a/tests/Zend/Service/Amazon/SimpleDb/OfflineTest.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OfflineTest.php 8064 2008-02-16 10:58:39Z thomas $ - */ - -/** - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_SimpleDb_OfflineTest extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('No offline tests for Zend_Service_Amazon_SimpleDb'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/SimpleDb/OnlineTest.php b/tests/Zend/Service/Amazon/SimpleDb/OnlineTest.php deleted file mode 100644 index 61a9cb3bb9..0000000000 --- a/tests/Zend/Service/Amazon/SimpleDb/OnlineTest.php +++ /dev/null @@ -1,512 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OnlineTest.php 11973 2008-10-15 16:00:56Z matthew $ - */ - -/** - * @see Zend_Service_Amazon_SimpleDb - */ -require_once 'Zend/Service/Amazon/SimpleDb.php'; - -/** - * @see Zend_Service_Amazon_SimpleDb_Attribute - */ -require_once 'Zend/Service/Amazon/SimpleDb/Attribute.php'; - -/** - * @see Zend_Service_Amazon_SimpleDb_Page - */ -require_once 'Zend/Service/Amazon/SimpleDb/Page.php'; - -/** - * @see Zend_Http_Client_Adapter_Socket - */ -require_once 'Zend/Http/Client/Adapter/Socket.php'; - -/** - * @see Zend_Config_Ini - */ -require_once 'Zend/Config/Ini.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_SimpleDb_OnlineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon_SimpleDb - */ - protected $_amazon; - - /** - * Socket based HTTP client adapter - * - * @var Zend_Http_Client_Adapter_Socket - */ - protected $_httpClientAdapterSocket; - - protected $_testDomainNamePrefix; - - protected $_testItemNamePrefix; - - protected $_testAttributeNamePrefix; - - // Because Amazon uses an eventual consistency model, this test period may - // help avoid *but not guarantee* false negatives - protected $_testWaitPeriod = 2; - - /** - * Maximum attempts performed in request() - * - * @var int - */ - protected $_testWaitRetries = 3; - - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - $this->_amazon = new Zend_Service_Amazon_SimpleDb( - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID'), - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ); - - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_amazon->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - - $this->_testDomainNamePrefix = 'TestsZendServiceAmazonSimpleDbDomain'; - - $this->_testItemNamePrefix = 'TestsZendServiceAmazonSimpleDbItem'; - - $this->_testAttributeNamePrefix = 'TestsZendServiceAmazonSimpleDbAttribute'; - - $this->_wait(); - } - - /** - * Wrapper around remote calls to retry, apply wait, etc. - * - * @param string $method SimpleDB method name - * @param array $args Method argument list - * @return void - */ - public function request($method, $args = array()) - { - $response = null; - for ($try = 1; $try <= $this->_testWaitRetries; $try++) { - try { - $this->_wait(); - $response = call_user_func_array(array($this->_amazon, $method), $args); - break; - } catch (Zend_Service_Amazon_SimpleDb_Exception $e) { - // Only retry after throtte-related error - if (false === strpos($e->getMessage(), 'currently unavailable')) { - throw $e; - } - } - } - return $response; - } - - public function testGetAttributes() { - $domainName = $this->_testDomainNamePrefix . '_testGetAttributes'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $itemName = $this->_testItemNamePrefix . '_testGetAttributes'; - $attributeName1 = $this->_testAttributeNamePrefix . '_testGetAttributes1'; - $attributeName2 = $this->_testAttributeNamePrefix . '_testGetAttributes2'; - $attributeValue1 = 'value1'; - $attributeValue2 = 'value2'; - $attributes = array( - $attributeName1 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName1, $attributeValue1), - $attributeName2 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName2, $attributeValue2) - ); - - // Now that everything's set up, test it - $this->request('putAttributes', array($domainName, $itemName, $attributes)); - - // One attribute - $results = $this->request('getAttributes', array($domainName, $itemName, $attributeName1)); - $this->assertEquals(1, count($results)); - $attribute = current($results); - $this->assertEquals($attributeName1, $attribute->getName()); - $this->assertEquals($attributeValue1, current($attribute->getValues())); - - // Multiple attributes - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(2, count($results)); - $this->assertTrue(array_key_exists($attributeName1, $results)); - $this->assertTrue(array_key_exists($attributeName2, $results)); - $this->assertEquals($attributeValue1, current($results[$attributeName1]->getValues())); - $this->assertEquals($attributeValue2, current($results[$attributeName2]->getValues())); - - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testPutAttributes() { - $domainName = $this->_testDomainNamePrefix . '_testPutAttributes'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $itemName = $this->_testItemNamePrefix . '_testPutAttributes'; - $attributeName1 = $this->_testAttributeNamePrefix . '_testPutAttributes1'; - $attributeName2 = $this->_testAttributeNamePrefix . '_testPutAttributes2'; - $attributeValue1 = 'value1'; - $attributeValue2 = 'value2'; - $attributes = array( - $attributeName1 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName1, $attributeValue1), - $attributeName2 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName2, $attributeValue2) - ); - - // Now that everything's set up, test it - $this->request('putAttributes', array($domainName, $itemName, $attributes)); - - // Multiple attributes - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(2, count($results)); - $this->assertTrue(array_key_exists($attributeName1, $results)); - $this->assertTrue(array_key_exists($attributeName2, $results)); - $this->assertEquals($attributes[$attributeName1], $results[$attributeName1]); - $this->assertEquals($attributes[$attributeName2], $results[$attributeName2]); - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testBatchPutAttributes() { - $domainName = $this->_testDomainNamePrefix . '_testBatchPutAttributes'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $itemName1 = $this->_testItemNamePrefix . '_testBatchPutAttributes1'; - $itemName2 = $this->_testItemNamePrefix . '_testBatchPutAttributes2'; - $attributeName1 = $this->_testAttributeNamePrefix . '_testBatchPutAttributes1'; - $attributeName2 = $this->_testAttributeNamePrefix . '_testBatchPutAttributes2'; - $attributeName3 = $this->_testAttributeNamePrefix . '_testBatchPutAttributes3'; - $attributeName4 = $this->_testAttributeNamePrefix . '_testBatchPutAttributes4'; - $attributeValue1 = 'value1'; - $attributeValue2 = 'value2'; - $attributeValue3 = 'value3'; - $attributeValue4 = 'value4'; - $attributeValue5 = 'value5'; - $items = array( - $itemName1 => array( - $attributeName1 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName1, $attributeName1, $attributeValue1), - $attributeName2 =>new Zend_Service_Amazon_SimpleDb_Attribute($itemName1, $attributeName2, $attributeValue2)), - $itemName2 => array( - $attributeName3 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName2, $attributeName3, $attributeValue3), - $attributeName4 => new Zend_Service_Amazon_SimpleDb_Attribute($itemName2, $attributeName4, array($attributeValue4, $attributeValue5))) - ); - - - $replace = array( - $itemName1 => array( - $attributeName1 => false, - $attributeName2 => false - ), - $itemName2 => array( - $attributeName3 => false, - $attributeName4 => false - ) - ); - - $this->assertEquals(array(), $this->request('getAttributes', array($domainName, $itemName1))); - $this->request('batchPutAttributes', array($items, $domainName, $replace)); - - $result = $this->request('getAttributes', array($domainName, $itemName1, $attributeName1)); - - $this->assertTrue(array_key_exists($attributeName1, $result)); - $this->assertEquals($attributeName1, $result[$attributeName1]->getName()); - $this->assertEquals($attributeValue1, current($result[$attributeName1]->getValues())); - $result = $this->request('getAttributes', array($domainName, $itemName2, $attributeName4)); - $this->assertTrue(array_key_exists($attributeName4, $result)); - $this->assertEquals(2, count($result[$attributeName4]->getValues())); - $result = $this->request('getAttributes', array($domainName, $itemName2)); - $this->assertEquals(2, count($result)); - $this->assertTrue(array_key_exists($attributeName3, $result)); - $this->assertEquals($attributeName3, $result[$attributeName3]->getName()); - $this->assertEquals(1, count($result[$attributeName3])); - $this->assertEquals($attributeValue3, current($result[$attributeName3]->getValues())); - $this->assertTrue(array_key_exists($attributeName4, $result)); - $this->assertEquals($attributeName4, $result[$attributeName4]->getName()); - $this->assertEquals(2, count($result[$attributeName4]->getValues())); - $this->assertEquals(array($attributeValue4, $attributeValue5), $result[$attributeName4]->getValues()); - - // Test replace - $newAttributeValue1 = 'newValue1'; - $newAttributeValue4 = 'newValue4'; - $items[$itemName1][$attributeName1]->setValues(array($newAttributeValue1)); - $items[$itemName2][$attributeName4]->setValues(array($newAttributeValue4)); - - $this->request('batchPutAttributes', array($items, $domainName, $replace)); - - $result = $this->request('getAttributes', array($domainName, $itemName1, $attributeName1)); - $this->assertEquals(array($newAttributeValue1, $attributeValue1), $result[$attributeName1]->getValues()); - - $result = $this->request('getAttributes', array($domainName, $itemName2, $attributeName4)); - $this->assertEquals(array($newAttributeValue4, $attributeValue4, $attributeValue5), $result[$attributeName4]->getValues()); - - $replace[$itemName1][$attributeName1] = true; - $replace[$itemName2][$attributeName4] = true; - - $this->request('batchPutAttributes', array($items, $domainName, $replace)); - - $result = $this->request('getAttributes', array($domainName, $itemName1, $attributeName1)); - $this->assertEquals($items[$itemName1][$attributeName1], $result[$attributeName1]); - - $result = $this->request('getAttributes', array($domainName, $itemName2, $attributeName4)); - $this->assertEquals($items[$itemName2][$attributeName4], $result[$attributeName4]); - $this->assertEquals($items[$itemName1], $this->request('getAttributes', array($domainName, $itemName1))); - - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testDeleteAttributes() { - $domainName = $this->_testDomainNamePrefix . '_testDeleteAttributes'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $itemName = $this->_testItemNamePrefix . '_testDeleteAttributes'; - $attributeName1 = $this->_testAttributeNamePrefix . '_testDeleteAttributes1'; - $attributeName2 = $this->_testAttributeNamePrefix . '_testDeleteAttributes2'; - $attributeName3 = $this->_testAttributeNamePrefix . '_testDeleteAttributes3'; - $attributeName4 = $this->_testAttributeNamePrefix . '_testDeleteAttributes4'; - $attributeValue1 = 'value1'; - $attributeValue2 = 'value2'; - $attributeValue3 = 'value3'; - $attributeValue4 = 'value4'; - $attributes = array( - new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName1, $attributeValue1), - new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName2, $attributeValue2), - new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName3, $attributeValue3), - new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $attributeName4, $attributeValue4) - ); - - // Now that everything's set up, test it - $this->request('putAttributes', array($domainName, $itemName, $attributes)); - - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(4, count($results)); - $this->assertTrue(array_key_exists($attributeName1, $results)); - $this->assertTrue(array_key_exists($attributeName2, $results)); - $this->assertTrue(array_key_exists($attributeName3, $results)); - $this->assertTrue(array_key_exists($attributeName4, $results)); - $this->assertEquals($attributeValue1, current($results[$attributeName1]->getValues())); - $this->assertEquals($attributeValue2, current($results[$attributeName2]->getValues())); - $this->assertEquals($attributeValue3, current($results[$attributeName3]->getValues())); - $this->assertEquals($attributeValue4, current($results[$attributeName4]->getValues())); - - $this->request('deleteAttributes', array($domainName, $itemName, array($attributes[0]))); - - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(3, count($results)); - $this->assertTrue(array_key_exists($attributeName2, $results)); - $this->assertTrue(array_key_exists($attributeName3, $results)); - $this->assertTrue(array_key_exists($attributeName4, $results)); - $this->assertEquals($attributeValue2, current($results[$attributeName2]->getValues())); - $this->assertEquals($attributeValue3, current($results[$attributeName3]->getValues())); - $this->assertEquals($attributeValue4, current($results[$attributeName4]->getValues())); - - $this->request('deleteAttributes', array($domainName, $itemName, array($attributes[1], $attributes[2]))); - - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(1, count($results)); - $this->assertTrue(array_key_exists($attributeName4, $results)); - $this->assertEquals($attributeValue4, current($results[$attributeName4]->getValues())); - - - $this->request('deleteAttributes', array($domainName, $itemName, array($attributes[3]))); - - $results = $this->request('getAttributes', array($domainName, $itemName)); - $this->assertEquals(0, count($results)); - - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testListDomains() { - $domainName = null; - try { - // Create some domains - for($i = 1; $i <= 3; $i++) { - $domainName = $this->_testDomainNamePrefix . '_testListDomains' . $i; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - } - - $page = $this->request('listDomains', array(3)); - $this->assertEquals(3, count($page->getData())); - // Amazon returns an empty page as the last page :/ - $isLast = $page->isLast(); - if (!$isLast) { - // The old isLast() assertTrue failed in full suite runs. Token often - // decodes to 'TestsZendServiceAmazonSimpleDbDomain_testPutAttributes' - // which no longer exists. Instead of a plain assertTrue, which seemed - // to pass only in single-case runs, we'll make sure the token's - // presence is worth a negative. - $token = $page->getToken(); - if ($token) { - $tokenDomainName = base64_decode($token); - if (false !== strpos($tokenDomainName, $this->_testDomainNamePrefix)) { - try { - $this->request('domainMetadata', array($tokenDomainName)); - $this->fail('listDomains call with 3 domain maximum did not return last page'); - } catch (Exception $e) { - $this->assertContains('The specified domain does not exist', $e->getMessage()); - } - } - } - } - $this->assertEquals(1, count($this->request('listDomains', array(1, $page->getToken())))); - - $page = $this->request('listDomains', array(4)); - $this->assertEquals(3, count($page->getData())); - $this->assertTrue($page->isLast()); - - $page = $this->request('listDomains', array(2)); - $this->assertEquals(2, count($page->getData())); - $this->assertFalse($page->isLast()); - - $nextPage = $this->request('listDomains', array(100, $page->getToken())); - $this->assertEquals(1, count($nextPage->getData())); - // Amazon returns an empty page as the last page :/ - $this->assertTrue($nextPage->isLast()); - - // Delete the domains - for($i = 1; $i <= 3; $i++) { - $domainName = $this->_testDomainNamePrefix . '_testListDomains' . $i; - $this->request('deleteDomain', array($domainName)); - } - } catch(Exception $e) { - // Delete the domains - for($i = 1; $i <= 3; $i++) { - $domainName = $this->_testDomainNamePrefix . '_testListDomains' . $i; - $this->request('deleteDomain', array($domainName)); - } - throw $e; - } - } - - public function testDomainMetadata() { - $domainName = $this->_testDomainNamePrefix . '_testDomainMetadata'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $metadata = $this->request('domainMetadata', array($domainName)); - $this->assertTrue(is_array($metadata)); - $this->assertGreaterThan(0, count($metadata)); - $this->assertTrue(array_key_exists('ItemCount', $metadata)); - $this->assertEquals(0, (int)$metadata['ItemCount']); - $this->assertTrue(array_key_exists('ItemNamesSizeBytes', $metadata)); - $this->assertEquals(0, (int)$metadata['ItemNamesSizeBytes']); - $this->assertTrue(array_key_exists('AttributeNameCount', $metadata)); - $this->assertEquals(0, (int)$metadata['AttributeNameCount']); - $this->assertTrue(array_key_exists('AttributeValueCount', $metadata)); - $this->assertEquals(0, (int)$metadata['AttributeValueCount']); - $this->assertTrue(array_key_exists('AttributeNamesSizeBytes', $metadata)); - $this->assertEquals(0, (int)$metadata['AttributeNamesSizeBytes']); - $this->assertTrue(array_key_exists('AttributeValuesSizeBytes', $metadata)); - $this->assertEquals(0, (int)$metadata['AttributeValuesSizeBytes']); - $this->assertTrue(array_key_exists('Timestamp', $metadata)); - - // Delete the domain - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testCreateDomain() { - $domainName = $this->_testDomainNamePrefix . '_testCreateDomain'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $domainListPage = $this->request('listDomains'); - $this->assertContains($domainName, $domainListPage->getData()); - // Delete the domain - $this->request('deleteDomain', array($domainName)); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - public function testDeleteDomain() { - $domainName = $this->_testDomainNamePrefix . '_testDeleteDomain'; - $this->request('deleteDomain', array($domainName)); - $this->request('createDomain', array($domainName)); - try { - $domainListPage = $this->request('listDomains'); - $this->assertContains($domainName, $domainListPage->getData()); - $this->assertNull($domainListPage->getToken()); - // Delete the domain - $this->request('deleteDomain', array($domainName)); - $domainListPage = $this->request('listDomains'); - $this->assertNotContains($domainName, $domainListPage->getData()); - } catch(Exception $e) { - $this->request('deleteDomain', array($domainName)); - throw $e; - } - } - - private function _wait() { - sleep($this->_testWaitPeriod); - } - - /** - * Tear down the test case - * - * @return void - */ - public function tearDown() - { - - // $this->request('deleteDomain', array($this->_testDomainNamePrefix)); - // Delete domains - - unset($this->_amazon); - } -} diff --git a/tests/Zend/Service/Amazon/SimpleDb/PageTest.php b/tests/Zend/Service/Amazon/SimpleDb/PageTest.php deleted file mode 100644 index 5abce83879..0000000000 --- a/tests/Zend/Service/Amazon/SimpleDb/PageTest.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php - -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OfflineTest.php 8064 2008-02-16 10:58:39Z thomas $ - */ - -require_once 'Zend/Service/Amazon/SimpleDb/Page.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon_SimpleDb - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_Amazon_SimpleDb_PageTest extends PHPUnit_Framework_TestCase -{ - /** - * @var Zend_Service_Amazon_SimpleDb_Page - */ - protected $page; - - public function setUp() - { - $this->page = new Zend_Service_Amazon_SimpleDb_Page('foobar'); - } - - public function testSetAndGetDataPerMethods() - { - $this->page->setData('data'); - $this->assertEquals('data', $this->page->getData()); - } - - public function testSetDataPerConstructor() - { - $page = new Zend_Service_Amazon_SimpleDb_Page('data'); - $this->assertEquals('data', $page->getData()); - } - - public function testSetAndGetTokenPerMethods() - { - $this->page->setToken('token'); - $this->assertEquals('token', $this->page->getToken()); - } - - public function testSetTokenPerConstructor() - { - $page = new Zend_Service_Amazon_SimpleDb_Page('data', 'token'); - $this->assertEquals('token', $page->getToken()); - } - - public function testSetTokenShouldAcceptsNullValue() - { - $this->page->setToken('token'); - $this->page->setToken(null); - $this->assertNull($this->page->getToken()); - } - - public function testSetTokenDoesNotAcceptsEmptyStrings() - { - $this->page->setToken('token'); - $this->page->setToken(''); - $this->assertNull($this->page->getToken()); - } - - public function testIsLastShouldReturnTrueWhenNoTokenIsSet() - { - $this->assertTrue($this->page->isLast()); - } - - public function testIsLastShouldReturnFalseWhenTokenIsSet() - { - $this->page->setToken('token'); - $this->assertFalse($this->page->isLast()); - } - - public function testIsLastShouldReturnTrueWhenTokenIsRemoved() - { - $this->page->setToken(''); - $this->assertTrue($this->page->isLast()); - } - - public function testToStringMethod() - { - $this->page->setData('data'); - $this->page->setToken('token'); - $this->assertEquals( - "Page with token: token\n and data: data", - $this->page->__toString() - ); - } -} \ No newline at end of file diff --git a/tests/Zend/Service/Amazon/Sqs/AllTests.php b/tests/Zend/Service/Amazon/Sqs/AllTests.php deleted file mode 100644 index d60178391d..0000000000 --- a/tests/Zend/Service/Amazon/Sqs/AllTests.php +++ /dev/null @@ -1,79 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -if (!defined('PHPUnit_MAIN_METHOD')) { - define('PHPUnit_MAIN_METHOD', 'Zend_Service_Amazon_Sqs_AllTests::main'); -} - -require_once 'Zend/Service/Amazon/Sqs/OfflineTest.php'; -require_once 'Zend/Service/Amazon/Sqs/OnlineTest.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Sqs - */ -class Zend_Service_Amazon_Sqs_AllTests -{ - /** - * Runs this test suite - * - * @return void - */ - public static function main() - { - PHPUnit_TextUI_TestRunner::run(self::suite()); - } - - /** - * Creates and returns this test suite - * - * @return PHPUnit_Framework_TestSuite - */ - public static function suite() - { - $suite = new PHPUnit_Framework_TestSuite('Zend Framework - Zend_Service_Amazon_Sqs'); - - $suite->addTestSuite('Zend_Service_Amazon_Sqs_OfflineTest'); - - if (defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ENABLED') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID') - && defined('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ) { - $suite->addTestSuite('Zend_Service_Amazon_Sqs_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Amazon_Sqs_OnlineTest_Skip'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Amazon_Sqs_AllTests::main') { - Zend_Service_Amazon_Sqs_AllTests::main(); -} diff --git a/tests/Zend/Service/Amazon/Sqs/OfflineTest.php b/tests/Zend/Service/Amazon/Sqs/OfflineTest.php deleted file mode 100644 index e4af9523bb..0000000000 --- a/tests/Zend/Service/Amazon/Sqs/OfflineTest.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Sqs.php'; -require_once 'Zend/Service/Amazon/Sqs/Exception.php'; -require_once 'Zend/Http/Client/Adapter/Test.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Sqs - */ -class Zend_Service_Amazon_Sqs_OfflineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon_Sqs - */ - protected $_amazon; - - /** - * Test based HTTP client adapter - * - * @var Zend_Http_Client_Adapter_Test - */ - protected $_httpClientAdapterTest; - - public function setUp() - { - //$this->markTestSkipped('No offline tests for Zend_Service_Amazon_Sqs'); - - $this->_amazon= new Zend_Service_Amazon_Sqs('test','test'); - - $this->_httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - - $this->_amazon->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - } - - public function testSetRegion() - { - $this->_amazon->setEndpoint('eu-west-1'); - $endPoints= $this->_amazon->getEndpoints(); - $this->assertEquals($this->_amazon->getEndpoint(),$endPoints['eu-west-1']); - } - - public function testSetNewRegion() - { - $this->_amazon->setEndpoint('foo'); - $this->assertEquals($this->_amazon->getEndpoint(),'sqs.foo.amazonaws.com'); - } - - public function testSetEmptyRegion() - { - $this->setExpectedException( - 'Zend_Service_Amazon_Sqs_Exception', - 'Empty region specified.' - ); - $this->_amazon->setEndpoint(''); - } - - public function testGetRegions() - { - $endPoints= array('us-east-1' => 'sqs.us-east-1.amazonaws.com', - 'us-west-1' => 'sqs.us-west-1.amazonaws.com', - 'eu-west-1' => 'sqs.eu-west-1.amazonaws.com', - 'ap-southeast-1' => 'sqs.ap-southeast-1.amazonaws.com', - 'ap-northeast-1' => 'sqs.ap-northeast-1.amazonaws.com'); - $this->assertEquals($this->_amazon->getEndpoints(),$endPoints); - } -} diff --git a/tests/Zend/Service/Amazon/Sqs/OnlineTest.php b/tests/Zend/Service/Amazon/Sqs/OnlineTest.php deleted file mode 100644 index 49fc509ea6..0000000000 --- a/tests/Zend/Service/Amazon/Sqs/OnlineTest.php +++ /dev/null @@ -1,132 +0,0 @@ -<?php -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id$ - */ - -require_once 'Zend/Service/Amazon/Sqs.php'; -require_once 'Zend/Http/Client/Adapter/Socket.php'; - -/** - * @category Zend - * @package Zend_Service_Amazon - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Amazon - * @group Zend_Service_Amazon_Sqs - */ -class Zend_Service_Amazon_Sqs_OnlineTest extends PHPUnit_Framework_TestCase -{ - /** - * Reference to Amazon service consumer object - * - * @var Zend_Service_Amazon_Sqs - */ - protected $_amazon; - - /** - * Socket based HTTP client adapter - * - * @var Zend_Http_Client_Adapter_Socket - */ - protected $_httpClientAdapterSocket; - - /** - * Sets up this test case - * - * @return void - */ - public function setUp() - { - $this->_amazon = new Zend_Service_Amazon_Sqs( - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID'), - constant('TESTS_ZEND_SERVICE_AMAZON_ONLINE_SECRETKEY') - ); - - $this->_queue_name = constant('TESTS_ZEND_SERVICE_AMAZON_SQS_QUEUE'); - - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_amazon->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - } - - /** - * Test SQS methods - * - * @return void - */ - public function testSqs() - { - try { - $queue_url = $this->_amazon->create($this->_queue_name, 45); - $timeout = $this->_amazon->getAttribute($queue_url, 'VisibilityTimeout'); - $this->assertEquals(45, $timeout, 'VisibilityTimeout attribute is not 45'); - - $test_msg = 'this is a test'; - $this->_amazon->send($queue_url, $test_msg); - - $messages = $this->_amazon->receive($queue_url); - - foreach ($messages as $message) { - $this->assertEquals($test_msg, $message['body']); - } - - foreach ($messages as $message) { - $result = $this->_amazon->deleteMessage($queue_url, $message['handle']); - $this->assertTrue($result, 'Message was not deleted'); - } - - $count = $this->_amazon->count($queue_url); - $this->assertEquals(0, $count); - - $this->_amazon->delete($queue_url); - } catch (Exception $e) { - $this->fail($e->getMessage()); - } - } - - /** - * Tear down the test case - * - * @return void - */ - public function tearDown() - { - unset($this->_amazon); - } -} - - -class Zend_Service_Amazon_Sqs_OnlineTest_Skip extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped( - 'Zend_Service_Amazon_Sqs online tests not enabled with an access key ID in ' - . 'TestConfiguration.php' - ); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Amazon/_files/amazon-response-invalid.xml b/tests/Zend/Service/Amazon/_files/amazon-response-invalid.xml deleted file mode 100644 index ba5fc42099..0000000000 --- a/tests/Zend/Service/Amazon/_files/amazon-response-invalid.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" ?><ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><HTTPHeaders><Header Name="UserAgent" Value="Zend_Http_Client"></Header></HTTPHeaders><RequestId>ae1b57b9-ac1c-4408-87f2-942e72630361</RequestId><Arguments><Argument Name="Operation" Value="ItemSearch"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument Name="Power" Value="isbn:0750640162"></Argument><Argument Name="AWSAccessKeyId" Value="API_KEY"></Argument><Argument Name="Timestamp" Value="2010-03-26T19:26:31Z"></Argument><Argument Name="Signature" Value="A0ThHMQTqYixyc6aDFO6bdbRUEXc77E/k8nEKgfqY70="></Argument><Argument Name="ResponseGroup" Value="Large,ItemAttributes,Images,EditorialReview,Request"></Argument><Argument Name="SearchIndex" Value="Books"></Argument><Argument Name="Version" Value="2011-08-01"></Argument></Arguments><RequestProcessingTime>0.0410670000000000</RequestProcessingTime></OperationRequest><Items><Request><IsValid>True</IsValid><ItemSearchRequest><Condition>New</Condition><DeliveryMethod>Ship</DeliveryMethod><MerchantId>Amazon</MerchantId><Power>isbn:0750640162</Power><ResponseGroup>Large</ResponseGroup><ResponseGroup>ItemAttributes</ResponseGroup><ResponseGroup>Images</ResponseGroup><ResponseGroup>EditorialReview</ResponseGroup><ResponseGroup>Request</ResponseGroup><SearchIndex>Books</SearchIndex></ItemSearchRequest></Request><TotalResults>1</TotalResults><TotalPages>1</TotalPages></Items></ItemSearchResponse> diff --git a/tests/Zend/Service/Amazon/_files/amazon-response-valid.xml b/tests/Zend/Service/Amazon/_files/amazon-response-valid.xml deleted file mode 100644 index de20226bda..0000000000 --- a/tests/Zend/Service/Amazon/_files/amazon-response-valid.xml +++ /dev/null @@ -1 +0,0 @@ -<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><HTTPHeaders><Header Name="UserAgent" Value="Zend_Http_Client"></Header></HTTPHeaders><RequestId>7c895353-04a0-4805-aaa2-ddda6ee78ae4</RequestId><Arguments><Argument Name="Operation" Value="ItemSearch"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument Name="Power" Value="isbn:0754512673"></Argument><Argument Name="AWSAccessKeyId" Value="API_KEY"></Argument><Argument Name="Timestamp" Value="2010-03-26T19:28:18Z"></Argument><Argument Name="Signature" Value="H7xta+UgHRFquAEpDoOLQir7PDBOlqw0oHjzeFd1kOs="></Argument><Argument Name="ResponseGroup" Value="Large,ItemAttributes,Images,EditorialReview,Request"></Argument><Argument Name="SearchIndex" Value="Books"></Argument><Argument Name="Version" Value="2011-08-01"></Argument></Arguments><RequestProcessingTime>0.0550310000000000</RequestProcessingTime></OperationRequest><Items><Request><IsValid>True</IsValid><ItemSearchRequest><Condition>New</Condition><DeliveryMethod>Ship</DeliveryMethod><MerchantId>Amazon</MerchantId><Power>isbn:0754512673</Power><ResponseGroup>Large</ResponseGroup><ResponseGroup>ItemAttributes</ResponseGroup><ResponseGroup>Images</ResponseGroup><ResponseGroup>EditorialReview</ResponseGroup><ResponseGroup>Request</ResponseGroup><SearchIndex>Books</SearchIndex></ItemSearchRequest></Request><TotalResults>1</TotalResults><TotalPages>1</TotalPages><Item><ASIN>0754512673</ASIN><DetailPageURL>http://www.amazon.co.uk/Tolleys-Office-Health-Safety-Handbook/dp/0754512673%3FSubscriptionId%3D1K801728Y3PCE30ZMG02%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0754512673</DetailPageURL><SalesRank>2408080</SalesRank><SmallImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL._SL75_.jpg</URL><Height Units="pixels">75</Height><Width Units="pixels">49</Width></SmallImage><MediumImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL._SL160_.jpg</URL><Height Units="pixels">160</Height><Width Units="pixels">104</Width></MediumImage><LargeImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL.jpg</URL><Height Units="pixels">475</Height><Width Units="pixels">309</Width></LargeImage><ImageSets><ImageSet Category="primary"><SwatchImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL._SL30_.jpg</URL><Height Units="pixels">30</Height><Width Units="pixels">20</Width></SwatchImage><SmallImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL._SL75_.jpg</URL><Height Units="pixels">75</Height><Width Units="pixels">49</Width></SmallImage><MediumImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL._SL160_.jpg</URL><Height Units="pixels">160</Height><Width Units="pixels">104</Width></MediumImage><LargeImage><URL>http://ecx.images-amazon.com/images/I/41965ZC4WKL.jpg</URL><Height Units="pixels">475</Height><Width Units="pixels">309</Width></LargeImage></ImageSet></ImageSets><ItemAttributes><Author>Sue Cox</Author><Author>Bill Janes</Author><Author>Deborah Walker</Author><Author>David Wenham</Author><Binding>Paperback</Binding><DeweyDecimalNumber>344.410465</DeweyDecimalNumber><EAN>9780754512677</EAN><Edition>3rd Revised edition</Edition><ISBN>0754512673</ISBN><Label>Butterworths Tolley Ltd.</Label><Languages><Language><Name>English</Name><Type>Original Language</Type></Language><Language><Name>English</Name><Type>Unknown</Type></Language></Languages><ListPrice><Amount>7800</Amount><CurrencyCode>GBP</CurrencyCode><FormattedPrice>£78.00</FormattedPrice></ListPrice><Manufacturer>Butterworths Tolley Ltd.</Manufacturer><NumberOfPages>526</NumberOfPages><ProductGroup>Book</ProductGroup><PublicationDate>2002-12-01</PublicationDate><Publisher>Butterworths Tolley Ltd.</Publisher><Studio>Butterworths Tolley Ltd.</Studio><Title>Tolley's Office Health and Safety Handbook3495GBP£34.95020000268170Labour268153Economics68Business, Finance & Law1025612Subjects266239Books275963Industrial275948Commercial, Financial, Industrial & Taxation275946English275945Law68Business, Finance & Law1025612Subjects266239Books124681031General AAS275948Commercial, Financial, Industrial & Taxation275946English275945Law68Business, Finance & Law1025612Subjects266239Books276018Employment & Labour276016Social275946English275945Law68Business, Finance & Law1025612Subjects266239Books124691031General AAS276016Social275946English275945Law68Business, Finance & Law1025612Subjects266239Books124680031General AAS275946English275945Law68Business, Finance & Law1025612Subjects266239Books124679031General AAS275945Law68Business, Finance & Law1025612Subjects266239Books268241Health & Safety659890Reference & Education68Business, Finance & Law1025612Subjects266239Books124720031General AAS659890Reference & Education68Business, Finance & Law1025612Subjects266239Books124671031General AAS68Business, Finance & Law1025612Subjects266239Books922322Health & Safety922314Production, Manufacturing & Operational278115Engineering & Technology57Science & Nature1025612Subjects266239Books125282031General AAS922314Production, Manufacturing & Operational278115Engineering & Technology57Science & Nature1025612Subjects266239Books125259031General AAS278115Engineering & Technology57Science & Nature1025612Subjects266239Books125228031General AAS57Science & Nature1025612Subjects266239Books276509Social Welfare & Services276519Charities & Voluntary Services276511Child Welfare276512Community Care276520Counselling276510Elderly Care276513Family Welfare276515Housing276516Welfare & Benefit Systems125462031General AAS276482Social Issues276411Social Sciences60Society, Politics & Philosophy1025612Subjects266239Books400530011English400529011Language (feature_browse-bin)365481011Refinements266239Books492564011Paperback492562011Format (binding_browse-bin)365481011Refinements266239Books182018031Regular Size182016031Font Size (format_browse-bin)365481011Refinements266239Books diff --git a/tests/Zend/Service/Amazon/_files/mozart_result.xml b/tests/Zend/Service/Amazon/_files/mozart_result.xml deleted file mode 100644 index 3071a0732b..0000000000 --- a/tests/Zend/Service/Amazon/_files/mozart_result.xml +++ /dev/null @@ -1,1504 +0,0 @@ - - - - -

- - - - - - - - - - - 0.1464630000000000 - - - - True - - New - Ship - Mozart - Amazon - Small - Tracks - Offers - Request - Music - - - 20917 - 2092 - - B00005A8JZ - http://www.amazon.com/Essential-Mozart-His-Greatest-Masterpieces/dp/B00005A8JZ%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00005A8JZ - - Fritz Dolezal - Franklin Cohen - Peter Schmidl - Wolfgang Amadeus Mozart - Christoph von Dohnányi - Christopher Hogwood - David Hill - Georg Solti - George Guest - Gyorgy Fischer - Herbert von Karajan - Jack Brymer - Myung-Whun Chung - Neville Marriner - Peter Maag - Stephen Cleobury - Uri Segal - Willi Boskovsky - Academy of Ancient Music - Academy of St. Martin-in-the-Fields - Decca - Music - Essential Mozart: 32 Of His Greatest Masterpieces - - - - 742 - USD - $7.42 - - - 796 - USD - $7.96 - - 30 - 8 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - miWNU7zpV2gjBgUxK0ySvB7%2FKRv7Rjl9dQAV%2FnwzkVW%2BLYVYm9V2NcorkZEz5pey6eT9O1JS6ijZ4%2BkTLrHZ5w%3D%3D - - 1099 - USD - $10.99 - - Usually ships in 24 hours - 1 - - - - - - Allegro - Andante - Voi che sapete - Largetto - Laudate Dominum - Andantino - Overture - Trio: Soava sia il vento - Andante con moto - Rondo - Serenade: Deh, vieni alla finestra - No. 1 Non più andrai - No. 3 Sleigh Ride - Adagio - Presto - - - Molto allegro - Queen of the Night aria, Der Hölle Rache - Adagio - Là ci darem la mano - Adagio - Der Vogelfänger bin ich ja - Dove sono - Adagio - Lacrimosa - Rondo alla turca - Champagne aria: Fin ch'han dal vino - Minuet & Trio - Alleluja - Finale: Molto allegro - - - - - B0000058HV - http://www.amazon.com/25-Mozart-Favorites/dp/B0000058HV%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0000058HV - - John Sant'Ambrogio - George Silfies - Jost Michaels - Wolfgang Amadeus Mozart - Alfred Scholz - Ferdinand Grossmann - Franz Bauer-Theussl - Gunter Kehr - H. Reichert - Helmuth Rilling - Henry Adolph - Jörg Faerber - Leopold Hager - Peter Maag - Philip Gibson - Roland Bader - Stanislaw Skrowaczewski - New York Philomusica Winds - Philharmonia Hungarica - Stuttgart Bach Collegium - Vox (Classical) - Music - 25 Mozart Favorites - - - - 172 - USD - $1.72 - - - 96 - USD - $0.96 - - 29 - 13 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - C6bDMocDw5QcPLgm7AooGHkjBCa6joJIj9z10snNdzQuJa%2FvOa1lJeOjDfprvj9T7Rtqke5KjzDC6HNuDFUf1A%3D%3D - - 299 - USD - $2.99 - - Usually ships in 24 hours - 1 - - - - - - Overture - II. Andante - I. Allegro Con Brio - II. Andantino - I. Allegro - Overture - I. Molto Allegro - III. Finale: Presto - III. Andante - I. Allegro - II. Andante ma non troppo - II. Larghetto - II. Adagio - I. Allegro maestoso - II. Adagio - IV. Finale: Allegro - III. Allegro - II. Andante - I. Allegro maestoso - I. Allegro vivace assai - II. Andante cantabile - II. Adagio - IV. Presto - Confutatis Maledictis - Alleluia - - - - - B000BLI3K2 - http://www.amazon.com/Mozart-Complete-Works-170-Box/dp/B000BLI3K2%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB000BLI3K2 - - Wolfgang Amadeus Mozart - Bruce Abel - Christian Tchelebiev - Christof Fischesser - Ezio Maria Tisi - Gottfried Hornik - Hermann-Christian Polster - Klaus Mertens - Manfred Bittner - Peter Schneyder - Brilliant Classics - Music - Mozart Edition: Complete Works (170 CD Box Set) - - - - 10824 - USD - $108.24 - - - 10497 - USD - $104.97 - - 20 - 9 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - pBHmKisDdqGh1zcoHasxardfvdwt4mCm4NgPdqjmyDJ0vUUJnm0Nbe%2B90H8%2F6JSkw2fRouM%2FDKLqRto7JTWaICGw65404CJm - - 14399 - USD - $143.99 - - Usually ships in 24 hours - 1 - - - - - - Molto allegro - Andante - Presto - Allegro - Andante - Presto - Allegro assai - Andante - Presto - Allegro - Andante - Molto allegro - Allegro - Andante - Menuetto & trio - Allegro - Molto allegro - Andante - Menuetto & trio - Molto allegro - - - Allegro - Andante - Menuetto & trio - Molto allegro - Allegro - Andante - Menuetto & trio - Molto allegro - Allegro-andante - Allegro - Allegro - Andante - Menuetto & trio - Allegro - Allegro - Andante - Menuetto & trio - Molto allegro - - - Allegro moderato - Andante - Menuetto & trio - Molto allegro - Allegro - Andante - Menuetto & trio - Presto - Allegro maestoso - Andante grazioso - Allegro - Allegro - Andante - Allegro - - - Allegro - Andante - Menuetto & trio - Allegro - Allegro - Andante - Menuetto & trio - Allegro - Allegro assai - Andantino grazioso - Presto assai - Allegro spiritoso - Andantino grazioso - Presto assai - - - Allegro - Andantino grazioso - Presto - Allegro spiritoso - Andante - Menuetto & trio - Presto - Molto allegro - Andantino con moto - Menuetto & trio - Presto - - - Allegro assai - Andante grazioso - Presto - Allegro - Andantino grazioso - Menuetto - Molto allegro - Allegro - Andante - Menuetto - Allegro - Allegro con brio - Andante - Menuetto - Allegro - - - Allegro spiritoso - Andantino grazioso - Allegro - Molto presto - Andante - Allegro - Symphony in D major: Allegro molto - Symphony in D major: Andantino grazioso - Symphony in D major: Allegro - Allegro moderato - Andante - Menuetto - Allegro con spirito - Allegro spiritoso - Andante - Primo tempo - - - Allegro assai - Andante moderato - Menuetto - Allegro assai - Allegro vivace - Andante di molto più tosto allegretto - Allegro vivace - Allegro con spirito - Andante - Menuetto. Presto - - - Allegro assai - Andante - Allegro - Adagio - allegro con spirito - Andante - Menuetto - Presto - Molto allegro - Andante - Menuetto - Allegro assai - - - Adagio - allegro - Andante - Presto - Adagio - allegro - Andante con moto - Menuetto - Allegro - - - Molto allegro - Andante - Menuetto - Allegro assai - Allegro vivace - Andante cantabile - Menuetto - Molto allegro - - - Allegro - Andante - Tempo di Menuetto - Allegro - Allegretto (tema con 4 variazioni) - Allegro - Allegretto - Allegro di molto - Andante di molto - Minuetto - Allegro - Allegretto - Allegro - Rondeau, allegretto - - - Allegro - Larghetto - Allegretto - Allegro maestoso - Andante - Presto - Allegro - Andante - Allegro - - - Allegro - Adagio - Allegro assai - Allegro - Larghetto - Tempo di menuetto - Allegro - Andante - Allegro - - - Allegro - Andante - Allegro vivace assai - Allegro - Andante - Allegro - Allegro maestoso - Andante - Allegretto - - - Allegro - Andantino - Rondeau, presto - Allegro spiritoso - Andante staccato - Molto allegro - Allegro - Andante - Rondeau, allegretto - - - Allegro - Andante - Allegretto, presto - Allegro - Andante ma un poco adagio - Allegro - Allegro aperto - Andante un poco adagio - Roneau, allegro - - - Allegro assai - Andante - Rondo, allegro di molto - Allegro aperto - Andante - Tempo di menuetto - Allegro - Allegretto - Allegro assai - - - Allegro - Romanze - Allegro assai - Allegro - Andante - Allegro - - - Allegro vivace - Andante un poco sostenuto - Allegro vivace - Allegro - Larghetto - Allegretto - - - Allegro vivace - Andantino - Allegro ma non troppo - Allegro - Andante - Molto allegro - Allegro - Larghetto - Rondo, allegro - - - Allegro - Andante - Rondo, allegro - Allegro - Adagio - Rondo, tempo di minuetto - - - Allegro - Adagio - Rondo, allegro - Allegro - Andantino - Rondeau, allegro - - - Allegro maestoso - Adagio non troppo - Tempo di menuetto - Allegro aperto - Andante ma non troppo - Allegro - - - Allegro aperto - Andante ma non troppo - Allegro - Allegro - Andante ma adagio - Rondeau, tempo di menuetto - Allegro - Adagio - Andantino con variazioni - - - Allegro - Andante - Rondo, allegro - Allegro - Romance, larghetto - Allegro - Allegro - Rondo, allegro - Allegro - Rondeau, allegro - Allegro - Andante - Allegro - - - Allegro moderato - Adagio - Presto - Allegro moderato - Andante - Rondeau, allegro - Allegro - Adagio - Rondeau - - - Allegro moderato - Andante cantabile - Rondeau - Allegro aperto - Adagio - Rondeau - - - Allegro maestoso - Andante - Presto - Allegro spiritoso - Andantino grazioso - Tempo di menuetto - - - Allegro - Andante - Presto - Andante - Allegro di molto - Allegro assai - Allegro - Andante - Presto - Allegro - Andante - Menuetto - Adagio - Menuetto - Rondo Allegro - - - Andante - Allegretto grazioso - Menuetto - Allegro - Menuetto - Adagio cantabile - Presto - Allegro - Romance. Andante - Menuetto - Rondo. Allegro - - - Marche - Allegro - Andante - Menuett - Adagio - Menuett - Finale: Allegro assai - Marcia - Allegro moderato - Andante - Menuett - Andante - Menuett - Allegro - Molto allegro - Menuetto - Andantino - Menuetto (tema con variazioni) - Rondeau, allegro assai - Marcia alla francese - - - Largo - Menuetto - Menuetto - Adagio - Finale Presto - Allegro - Andante - Menuetto - Allegro - Allegro - Adagio - Menuetto - Allegretto - Menuetto - Adagio - Allegro assai - - - Allegro - Andante - Menuetto - Allegro - Menuetto - Andante - Menuetto - Allegro - Allegro assai - Andante moderato - Allegro - Menuetto & Trio - Andante - Menuetto & Trio - Andantino grazioso & Allegro - - - Allegro - Andante grazioso - Menuetto - Adagio - Menuetto - Andante-allegro assai - Allegro - Thema mit Variationen-andante grazioso - Menuetto - Adagio - Menuetto - Andante-allegro molto - - - Marcia-maestoso - Menuetto - Rondeau - Adagio maestoso-allegro con spirito - Menuetto-allegretto - Concertante-andante grazioso - Rondeau-allegro ma non troppo - Andantino - Menuetto - Finale-presto - No. 1. molto allegro - No. 2. andante - No. 4. allegro finale - No. 5. Pastorella - No. 6-7. Allegro-allegretto - No. 8. allegro - No. 9. molto adagio - No. 10. allegro - No. 11-12. largo-molto allegro - No. 13-14. andante-allegro - No. 15. Menuett - No. 16-17. adagio-presto - No. 18. Fuga - - - Allegro maestoso-allegro molto - Andante - Menuetto - Rondo-allegro - Menuetto galante - Andante - Menuetto - Adagio-allegro assai - - - Allegro assai - Andante - Allegro - Menuetto - Andante grazioso - Menuetto - Adagio-allegro assai - Andante maestoso-allegro assai - Andante - Menuetto - Allegro - Menuetto - Andante - Menuetto - Prestissimo - - - D major, KV. 335 No. 1 - D major, KV. 335 No. 2 - - - Allegro - Menuetto - Adagio - Menuetto - Rondo - Allegro - Menuetto - Larghetto - Menuetto - Rondo - Allegro - Menuetto - Adagio - Menuetto - Rondo - - - Allegro - Larghetto - Menuetto - Adagio - Allegretto - Adagio - Menuetto - Adagio - Romance - Polonaise - Divertimento No. 6: Rondo, larghetto - Divertimento No. 6: Voi che sapete (from Le Nozze di Figaro) - Divertimento No. 6: Non piu andrai (from Le Nozze di Figaro) - Divertimento No. 6: La ci darem la mano (from Don Giovanni) - Divertimento No. 6: Vedrai, carino (from Don Giovanni) - - - Allegro maestoso - Menuetto - Adagio - Menuetto-Trio - Allegro - Allegro - Andante - Menuetto-Trio - Allegro - - - Allegro - Menuetto - Andante grazioso - Adagio - Allegro - Allegro assai - Menuetto - Andante - Adagio - Allegro - Allegro moderato - Menuetto - Romance - Menuetto - Rondo - Allegro - Menuetto - Adagio - Menuetto - Finale - - - Allegro spiritoso - Andante - Menuetto - Contredanse en rondeau - Allegro - Andante grazioso - Menuetto - Allegro - Andante - Menuetto - - - - - B00004X0QF - http://www.amazon.com/Mozart-Effect-Music-Babies-Nighty/dp/B00004X0QF%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00004X0QF - - Jozsef Balogh - Wolfgang Amadeus Mozart - Harald Nerat - Nicholas Ward - Capella Istropolitana - Danubius String Quartet - Netherlands Wind Ensemble - Northern Chamber Orchestra - Jeno Jando - Children's Group - Music - The Mozart Effect: Music For Babies: Nighty Night - - - - 370 - USD - $3.70 - - - 497 - USD - $4.97 - - 33 - 12 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - DxNxKZYiXIpX68jteXiPko0PVz3HQ5onOdUdJ6OU90UrLR%2BiOC92Twtp5HoXbrPDfjEBfB5heedESCotjypo3g%3D%3D - - 698 - USD - $6.98 - - Usually ships in 24 hours - 1 - - - - - - Den! Vienialla Finestra - 1. Andante Gransioso - 3. Adagio - 2. Andante - 2. Adagio - 2. Andante - 2. Adagio - 4. Adagio - 2. Larghetto - - - - - B000004194 - http://www.amazon.com/Mozart-Great-Piano-Concertos-Vol/dp/B000004194%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB000004194 - - Wolfgang Amadeus Mozart - Neville Marriner - Academy of St. Martin-in-the-Fields - Alfred Brendel - Philips - Music - Mozart: The Great Piano Concertos, Vol. 1 - - - - 1048 - USD - $10.48 - - - 1049 - USD - $10.49 - - 39 - 12 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - FzDU%2F69oBEZxc6vUvcH96DEH29QpOw84n3192FI91oOkC%2B6cbK8%2B5tX5T6TXhZDYZwr%2B76%2BiI4ZCbrcICKG0Xw%3D%3D - - 1399 - USD - $13.99 - - Usually ships in 24 hours - 1 - - - - - - Piano Concerto No. 19 In F, KV 459: Allegro Vivace - Piano Concerto No. 19 In F, KV 459: Allegretto - Piano Concerto No. 19 In F, KV 459: Allegro Assai - Piano Concerto No. 20 In D Minor, KV 466: Allegro - Piano Concerto No. 20 In D Minor, KV 466: Romance - Piano Concerto No. 20 In D Minor, KV 466: Allegro Assai - Rondo In D, KV 382: Allegretto Grazioso - Rondo In D, KV 382: Adagio - Rondo In D, KV 382: Allegro - Piano Concerto No. 23 In A , KV 488: Allegro - - - Piano Concerto No. 23 In A, KV 488: Adagio - Piano Concerto No. 23 In A, KV 488: Allegro assai - Piano Concerto #21 In C, KV 467: Allegro - Piano Concerto #21 In C, KV 467: Andante - Piano Concerto #21 In C, KV 467: Allegro Vivace Assai - Piano Concerto No. 24 in C Minor, KV 491: Allegro - Piano Concerto No. 24 in C Minor, KV 491: Larghetto - Piano Concerto No. 24 in C Minor, KV 491: Allegretto - Rondo In A, KV 386 - - - - - B00000I9M0 - http://www.amazon.com/Mozart-for-Relaxation/dp/B00000I9M0%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00000I9M0 - - Richard Stoltzman - Wolfgang Amadeus Mozart - Alexander Schneider [violin] - Colin Davis - Eduardo Mata - Erich Leinsdorf - James Galway - James Galway - Libor Hlavacek - Julius Levine - Guarneri Quartet - Tokyo String Quartet - Chamber Orchestra of Europe - English Chamber Orchestra - London Symphony Orchestra - New Philharmonia Orchestra - Prague Chamber Orchestra - Winds of the Bavarian Radio Symphony Orchestra - Alicia de Larrocha - Leontyne Price - RCA - Music - Mozart for Relaxation - - - - 657 - USD - $6.57 - - - 525 - USD - $5.25 - - 29 - 16 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - 8lrLac8DkxCvQyNAPudBZVKyLFG8MUvEvgCzbtk9X2myKLKNu7eWLebIAAFQ9vMkXATf3YwWDKR6eyvJTFsHLw%3D%3D - - 999 - USD - $9.99 - - Usually ships in 24 hours - 1 - - - - - - II: Andantino - II: Romanze, Andante - II: Andante cantabile - II: Adagio - Adagio - III: Adagio - Act I, Scene 2: Soave sia il vento - II: Larghetto - II: Andante - - - - - B000004166 - http://www.amazon.com/Mozart-Violin-Concertos/dp/B000004166%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB000004166 - - Wolfgang Amadeus Mozart - Raymond Leppard - Sir Colin Davis - London Symphony Orchestra - New Philharmonia Orchestra - Arrigo Pelliccia - Arthur Grumiaux - Philips - Music - Mozart: Violin Concertos - - - - 1058 - USD - $10.58 - - - 799 - USD - $7.99 - - 34 - 14 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - c%2BThiNmo%2FSef%2BGxOJei3EHV9uJ8B99JaXNamZf55JwkBepI6sRlslryh32vrKpzCAWEHnDIlQ4HCwUN49r%2Bj%2BA%3D%3D - - 1399 - USD - $13.99 - - Usually ships in 24 hours - 1 - - - - - - No. 1 In B Flat, K. 207: Allegro Moderato - No. 1 In B Flat, K. 207: Adagio - No. 1 In B Flat, K. 207: Presto - No. 3 In G, K. 216: Allegro - No. 3 In G, K. 216: Adagio - No. 3 In G, K. 216: Rondeau (Allegro) - No. 4 In D, K. 218: Allegro - No. 4 In D, K. 218: Andante Cantabile - No. 4 In D, K. 218: Rondeau - Adagio In E For Violin And Orchestra, K. 261 - Rondo In C For Violin And Orchestra, K. 373 - - - Concerto No. 2 In D, K. 211: Allegro - Concerto No. 2 In D, K. 211: Andante - Concerto No. 2 In D, K. 211: Rondeau (Allegro) - Concerto No. 5 In A, K. 219: Allegro Aperto - Concerto No. 5 In A, K. 219: Adagio - Concerto No. 5 In A, K. 219: Rondeau (Tempo Di Menuetto) - Sinfonia Concertante In E Flat, K. 364 For Violin, Viola And Orchestra: Allegro Maestoso - Sinfonia Concertante In E Flat, K. 364 For Violin, Viola And Orchestra: Andante - Sinfonia Concertante In E Flat, K. 364 For Violin, Viola And Orchestra: Presto - - - - - B00002DEH1 - http://www.amazon.com/Mozart-Piano-Sonatas/dp/B00002DEH1%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00002DEH1 - - Wolfgang Amadeus Mozart - Christoph Eschenbach - Deutsche Grammophon - Music - Mozart: Piano Sonatas - - - - 2660 - USD - $26.60 - - - 2692 - USD - $26.92 - - 23 - 7 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - MGxz%2FlTy0KPjmQX3kpSoL3bmPjN3mxxYqqEk0SKVAJznTbwO%2BQjjy49TTJxRrwK3ZpW1kTC5n%2BbmQtVmNsOyhg%3D%3D - - 3599 - USD - $35.99 - - Usually ships in 24 hours - 1 - - - - - - 1. Allegro - 2. Menuet I & II - 1. Allegro - 2. Menuet I & II - Allegro - Andante - Allegro - Allegro assai - Adagio - Presto - Allegro - Andante amoroso - Rondeau, Allegro - Adagio - Menuetto I & II - Allegro - - - Allegro - Andante - Presto - Allegro - Rondeau en Polonaise, Andante - Thema und 12 Variationen - Allegro con spirito - Andante un poco Adagio - Rondeau, Allegretto grazioso - Allegro con spirito - Andante con espressione - Rondeau, Allegro - - - Allegro maestoso - Andante cantabile con espressione - Presto - Allegro moderato - Andante cantabile - Allegretto - Theme, Andante grazioso - Menuetto & Trio - Alla Turca, Allegretto - - - Allegro - Adagio - Allegro assai - Allegro - Andante cantabile - Allegretto grazioso - Allegro - Adagio - Molto allegro - - - Allegro - Andante - Rondo. Allegretto (K. 494) - Allegro - Andante - Rondo, Allegretto - Allegro - Adagio - Allegretto - Allegro - Adagio - Allegretto - - - - - B0000041EV - http://www.amazon.com/Mozart-Mothers-Be-Tender-Lullabies/dp/B0000041EV%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB0000041EV - - Eva Czako - Wolfgang Amadeus Mozart - Alexander Gibson - Neville Marriner - Academy of St. Martin-in-the-Fields - Academy of St. Martin-in-the-Fields - Academy of St. Martin-in-the-Fields Chamber Ensemble - Grumiaux Trio - Quartetto Italiano - New Philharmonia Orchestra - Georges Janzer - Max Lesueur - Arpad Gerecz - Arthur Grumiaux - Philips - Music - Mozart for Mothers-To-Be: Tender Lullabies for Mother and Child - - - - 349 - USD - $3.49 - - - 300 - USD - $3.00 - - 36 - 21 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - xd0JIWdBe6d3hhzubUAq6GY64ZyX6uP4L0ckSYUj4XXwLaSYHiVarWkkGzGvpt1wF5hcXl%2FWRaVyV0bPRHYy3Q%3D%3D - - 699 - USD - $6.99 - - Usually ships in 24 hours - 1 - - - - - - [Unspecified] Divertimento in B-flat: Adagio - Adagio - [Unspecified] Divertimento G minor: (Andante) - Adagio - Adagio - Romance (Andante) - Andante - Adagio - Prelude - Adagio - Andante cantabile - Adagio - - - - - B00004SA87 - http://www.amazon.com/Mozart-The-Violin-Sonatas/dp/B00004SA87%3FSubscriptionId%3D0CM6AXEW4QM6RZCH28R2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00004SA87 - - Wolfgang Amadeus Mozart - Daniel Barenboim - Itzhak Perlman - Deutsche Grammophon - Music - Mozart: The Violin Sonatas - - - - 1898 - USD - $18.98 - - - 1899 - USD - $18.99 - - 31 - 8 - 0 - 0 - - - 1 - 1 - - - ATVPDKIKX0DER - http://www.amazon.com/gp/help/seller/home.html?seller=ATVPDKIKX0DER - - - New - new - - - VhgCmNPkXUUBD67bVqUThLmsIvSsG%2BQ3WrgOPfbik5aVnv6Bmgkn35RnfJZCYN9ZkKMHyxkPS0XipJiy15OULg%3D%3D - - 2799 - USD - $27.99 - - Usually ships in 24 hours - 1 - - - - - - 1. Allegro con spirito - 2. Allegro - 1. Allegro - 2. Rondo. Andante grazioso - 1. Adagio - Molto allegro - 2. Tempo di Menuetto - 1. Allegro di molto - 2. Thema. Andante grazioso - Variazioni 1-6 - 1. Allegro vivace - 2. Andante sostenuto - 3. Rondeau. Allegro - - - 1. Allegro - 2. Tempo di Menuetto - 1. Allegro con spirito - 2. Andantino cantabile - 3. Allegretto - 1. Allegro moderato - 2. Andantino sostenuto e cantabile - 3. Rondeau. Allegro - 1. Adagio - Allegro - 2. Thema. Andantino cantabile - Var. 1-5 - Thema. Allegretto - - - 1. Allegro - 2. Andante - 3. Rondeau. Allegretto grazioso - 1. Allegro - 2. Thema. Andante - Variationen 1-6 - 3. Tempo di Menuetto - 1. Allegro - 2. Andante con moto - 3. Rondeau. Allegro - 1. Largo - Allegro - 2. Andante - 3. Allegretto - - - 1. Molto Allegro - 2. Adagio - 3. Thema. Allegretto - Var. 1-5 - Var. 6. Allegro - 1. Molto Allegro - 2. Andante - 3. Presto - 1. Andantino cantabile - 2. Allegro - 3. Thema. Andante - Var. 1-6 - - - - - diff --git a/tests/Zend/Service/Amazon/_files/offers_with_names.xml b/tests/Zend/Service/Amazon/_files/offers_with_names.xml deleted file mode 100644 index 4b53cd6ec2..0000000000 --- a/tests/Zend/Service/Amazon/_files/offers_with_names.xml +++ /dev/null @@ -1,602 +0,0 @@ - - - - -
- - xxxxxxx-xxxx-424d-8ab9-14f856ee2bf1 - - - - - - - - - - - - - - 0.4718690000000000 - - - - True - - New - Ship - ASIN - All - 1 - 0439774098 - B00000194U - OfferFull - ItemAttributes - Request - 1 - - - - 0439774098 - http://www.amazon.com/Folk-Fairy-Tale-Easy-Readers/dp/0439774098%3FSubscriptionId%3D140PM2JXHSP8PD7D7ZR2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0439774098 - - a retelling by Violet Findley - Paperback - Scholastic - Lynne Cravath - Pens & Desk Supplies - 9780439774093 - Features 16 page storybook - Easy to read text - INcludes teaching guide - 0439774098 - - 0 - 0 - 300 - 0 - - - no_warning_applicable - - 7599 - USD - $75.99 - - Scholastic - 0439773911 - 16 - - 410 - 1230 - 580 - 1190 - - Toy - 2006 - Scholastic - Scholastic - Folk and Fairy Tale Easy Readers - 078073773916 - - - - 5153 - USD - $51.53 - - 10 - 0 - 0 - 0 - - - 10 - 1 - - - A79CLRHOQ3NF4 - PLEXSUPPLY - http://www.amazon.com/gp/help/seller/home.html?seller=A79CLRHOQ3NF4 - - - New - new - - - arHE03690z1svVt8ru8psnwEb2xopClIw1rIclronh9EogSv2LbpkpVFK1qpCfo7BVsOm3EaBZ4NtRYIsbbeuHhEhX336%2BOrPTWph5JYg7Fy1dTIP4KZwNCxw7bzoic0CAOtuAjrh%2BA%3D - Y11M0201723M6610687 - - 5153 - USD - $51.53 - - Usually ships in 1-2 business days - 0 - - - - - A2K9NS8DSVOE2W - nangsuer - http://www.amazon.com/gp/help/seller/home.html?seller=A2K9NS8DSVOE2W - - - New - new - All orders ship from Florida each day. We value your satisfaction and our feedback! Thanks 22A - - - 5hsbYfTB98fWdej8OTlzhiipbB15%2FT3DewxrtC8bB0AH%2BLYidGjodOtQlq%2BK35C9JIhLtPHxB65X95lKA5zwNl9bsiQrIFMAGCHMkK1lIYilDOgmDk7U0TcMp%2BcBrKTH%2BJpPUg3aTuz9DLaa9tcPgA%3D%3D - Y11M5390024M2549072 - - 5153 - USD - $51.53 - - Usually ships in 1-2 business days - 0 - - - - - A31EVTLIC13ORD - Wizard of Math - http://www.amazon.com/gp/help/seller/home.html?seller=A31EVTLIC13ORD - - - New - new - - - K71ef%2FDkwirgYxs9klaNY7%2FXINJ6d%2BsJDQw1V0K%2FCZirOl9lyGAMQKOat6yWPrDhPnHwjBcLBD6UZEWCOJ45Ut%2BS4dtNR2u2z%2FQHDlqPdoWcuenlkIb%2FGswW4Ksi6uf0AYrp7LmJRTA%3D - Y11M2582888M3406164 - - 7599 - USD - $75.99 - - - 5299 - USD - $52.99 - - Usually ships in 1-2 business days - 0 - - - - - A3SKJE188CW5XG - ReStockIt - http://www.amazon.com/gp/help/seller/home.html?seller=A3SKJE188CW5XG - - - New - new - - - 2Z69gtUkoYkitzHfbC3yZeHf2htOelt8J%2F97d%2FLZ626nDSUSMljr2vYtVGRvuq3QzdIjaqhTtXAO8RZS0HtLjhzoNXN8fCI8Qr7Nao8WeMdGtvYXhFCExkGx3WdQqboFDKelsyE84FM%3D - Y11M0113967M1327691 - - 5299 - USD - $52.99 - - Usually ships in 1-2 business days - 0 - - - - - A1729W3053T57N - The Price Pros - http://www.amazon.com/gp/help/seller/home.html?seller=A1729W3053T57N - - - New - new - - - Cq1toSGDUKPcdcS0gbDexyIg9vyHBBJovh1Zxr2%2FccJve3b9CSMCJmrdPqxq%2BYmg2Dpa1wKNtx3hSh6ouF57%2F6QaqP3bCrv8Lw84c2yOio3T43P%2Br%2BA56QxId%2BhcHgujU7paxUxlu2s%3D - Y12M0938195M5982264 - - 5487 - USD - $54.87 - - Usually ships in 1-2 business days - 0 - - - - - A29PHU0KPCGV8S - TheFactoryDepot - http://www.amazon.com/gp/help/seller/home.html?seller=A29PHU0KPCGV8S - - - New - new - - - rzFcf7pfWh9c%2B%2FhjfPlKyTVHm7JwFSH3ySSNpFxegoSlit8N%2BdUg6Z1nXu4oytpBZ%2BXBruFjRHG%2FqCMnzHUigvb1vaX915R%2BYoJ%2FTXa38xv7qJuQnrfvNXh8NwtSzIh2ldjhtfEVOJs%3D - Y14M0996254M0742534 - - 5821 - USD - $58.21 - - Usually ships in 1-2 business days - 0 - - - - - AIHRRFGW11GJ8 - Design Tec Office Products - http://www.amazon.com/gp/help/seller/home.html?seller=AIHRRFGW11GJ8 - - - New - new - - - Rg1nRJ0ksv7M8HhQ2eo6y1Sw7wdrI8JXUSvIboZA0aNrrXYkWUQoZoAvIwc01mPHRpP6s%2Fwj%2FqucA38T96tmeQDXjj2KZRLotVRGwxA%2F3oLaDjEbJZgpHpQCrQUFefIIGXOLZfztRL90f4bRFmBPZQ%3D%3D - Y14M1008209M3912403 - - 5987 - USD - $59.87 - - Usually ships in 1-2 business days - 0 - - - - - A27OK403WRHSGI - Kaplan Early Learning Company - http://www.amazon.com/gp/help/seller/home.html?seller=A27OK403WRHSGI - - - New - new - - - 8bjKifJMTTrNPYjb02hlOOP04ypVJ1tn7SE5Ky5nXJ8qjhPP7pUTIzfCM8jdvXiXHbNLOdPQF7Ioz8jelIEn5SE%2BEHn946W9PFjiLYFirY7LYYN8RJqKHYMqQWIBF9b%2Fs4p121K8JSl08KDEsptgKw%3D%3D - Y12M6611852M7296124 - - 7595 - USD - $75.95 - - Usually ships in 1-2 business days - 0 - - - - - A25DVOZOPBFMAN - Deerso - http://www.amazon.com/gp/help/seller/home.html?seller=A25DVOZOPBFMAN - - - New - new - - - Du47ofi%2BLI5weIbCKeSIM0BFnTAkQVQOzVXTt%2B7FsIPR7uF485oDlVG%2FFOJe6fYyuCwUjd69uh50L9eYkdJI0dtlBP2CpVlwyOVZbiwFPMrROXIlmLNAnSsMsxMk8bC5ENAUG1HhC0RHrxVs%2FhDhCA%3D%3D - Y14M1102156M0656871 - - 7599 - USD - $75.99 - - Usually ships in 1-2 business days - 0 - - - - - A6IFKC796Y64H - The Education Station Inc - http://www.amazon.com/gp/help/seller/home.html?seller=A6IFKC796Y64H - - - New - new - - - g41as4NDMJDKdfbbCAmQaTw7tir9aU6gLzoQ0PAo2nJTaVFQfb378nO9wSLcsW71KYBKYMiCaQw5eTkkwlNa74N18Kh5DHeCjc8KWVTIfaQzUDrhC56sag4nh30WiJQTHv4sn3%2Bme5SA4ht%2Bqp%2B%2F%2BA%3D%3D - Y13M0614645M8460461 - - 7599 - USD - $75.99 - - Usually ships in 1-2 business days - 0 - - - - - - B00000194U - http://www.amazon.com/PowerLab-52010-Allsop-Organizer-Hold/dp/B00000194U%3FSubscriptionId%3D140PM2JXHSP8PD7D7ZR2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00000194U - - Electronics - PowerLab - 0035286520102 - Sold Individually - 0 - 0 - - 650 - 525 - 118 - 1200 - - - Warranty does not cover misuse of product. - - 2500 - USD - $25.00 - - PowerLab - 52010 - 52010 - 1 - - 137 - - CE - PowerLab - 1995-06-13 - PowerLab - Allsop CD Organizer Hold - 035286520102 - Limited lifetime warranty - - - - 480 - USD - $4.80 - - 28 - 0 - 0 - 0 - - - 28 - 3 - - - A3UOG6723G7MG0 - Efunctional - http://www.amazon.com/gp/help/seller/home.html?seller=A3UOG6723G7MG0 - - - New - new - - - yJxQddhCOuzQnnN7dYjXhFI3no%2FrwD6pFJ%2BDIqAIlr4S5KECnY8mw%2F72BsArhDC0LO6DYmwVCI73UExtkGmKmdI9JeEpYSJJABFJ0%2F1ZvMZbPHNtAu0PrRmRakBsvpp8%2B6BtL%2B%2BP658pC8jd%2FZKpYQ%3D%3D - Y11M6929242M2865346 - - 480 - USD - $4.80 - - Usually ships in 1-2 business days - 0 - - - - - A3SNNXCKUIW1O2 - Universal Mania - http://www.amazon.com/gp/help/seller/home.html?seller=A3SNNXCKUIW1O2 - - - New - new - Brand New with Manufacturer's Warranty. 30 Day Money Back Guarantee. Customer Satisfaction Guaranteed. - - - fMh64bCc0BZTTkGS%2BVnWdLNPWvBj4qdiJozj7assbn1UAHS%2F0ndOMxCkCpMUnOpKjR%2FKdIgfD52jAA8LAm0hYsz3BNsvgsdLovvWD1XpmlQ5%2BHTyhwJHVKRmqaXV7LBHByL0MnlW9%2BY%3D - Y13M0066978M2394682 - - 531 - USD - $5.31 - - Usually ships in 2-3 business days - 0 - - - - - A18ACDNYOEMMOL - ApexSuppliers - http://www.amazon.com/gp/help/seller/home.html?seller=A18ACDNYOEMMOL - - - New - new - - - gq5FQD1qNEsSXtUFCix2xNQ1cIn18eA7O4M6rp72rVuCU5JQ4wVjfEk02OKw%2F8%2BcjJ%2FQN%2BXGoGOIsL%2FJuI0wtGE4NP5OVoaZolyVovgH3WEBCcdkzkycA9kdhsSwTjdtMGUv733daUg%3D - Y13M2494869M4706198 - - 589 - USD - $5.89 - - Usually ships in 1-2 business days - 0 - - - - - A2NYACAJP9I1IY - GizmosForLife - http://www.amazon.com/gp/help/seller/home.html?seller=A2NYACAJP9I1IY - - - New - new - Brand New in Original Retail Packing. Ships same or next day. Customer Satisfaction Guaranteed. You will receive a tracking no after item is shipped. - - - D9VIH0u1HD%2FYqiyYAdzpBPdm9GKX4chka0pRkMz%2F9oNXQY4CRLSZakmuA1egjHJriR16wHexUo0YS7IfZyTHgBXzwXGIDnTZVkO3%2F8c2JvB1K8uDV4xz855XUIyLaKCEF97Aq9RMFtpT%2BBO5B8nawA%3D%3D - Y11M0263400M1689368 - - 608 - USD - $6.08 - - Usually ships in 3-4 business days - 0 - - - - - A1729W3053T57N - The Price Pros - http://www.amazon.com/gp/help/seller/home.html?seller=A1729W3053T57N - - - New - new - - - Jpj9K4lZIJP2aZywsub5C8FR3lrJ%2FL0NS8USedAkvqBeKJ7ruApUlZviA0ZtgzlC%2BXLxwdU3nY3b8M9PY40JHNSSRnnk7dtHPgwQLrMm5yu49szSQZMe6xscKRfzUr5CRYqXY5ERNlY%3D - Y12M0051210M8397966 - - 628 - USD - $6.28 - - Usually ships in 1-2 business days - 0 - - - - - A29PHU0KPCGV8S - TheFactoryDepot - http://www.amazon.com/gp/help/seller/home.html?seller=A29PHU0KPCGV8S - - - New - new - - - cjriZfMobVIWbKkJ3bqoPql1e9y6%2F%2FYX%2BpHbmHsj5D%2BSS0b0vs2DCYJ6TcsmJZetQVG0zFhgghXw86kFYxk08tW02DpWASFZjklbwYjPIz%2BSmiGS4RyRGmRzOY6iyY90gZ4OM5lgWbo%3D - Y14M0781666M9419447 - - 638 - USD - $6.38 - - Usually ships in 1-2 business days - 0 - - - - - A3Q3IAIX1CLBMZ - ElectroGalaxy - http://www.amazon.com/gp/help/seller/home.html?seller=A3Q3IAIX1CLBMZ - - - New - new - - - 8b6epAKiwTalSkBp%2F63GmP9M%2F7B8dN9%2FIGO1ZEdBtLyPIjBVSr3zim66RqUW6t09tCy%2FEUSohjuL3N1Wzl%2F9aFL76Eopw0JHSz3vMwQ95NuMnRVjD0eSAS4cIHMfOAXSU08HfK9ItU3j1Qxm%2FEU8tw%3D%3D - Y12M3335001M2898300 - - 697 - USD - $6.97 - - Usually ships in 1-2 business days - 0 - - - - - A1PC5XI7QQLW5G - Long Trading Company - http://www.amazon.com/gp/help/seller/home.html?seller=A1PC5XI7QQLW5G - - - New - new - - - grcrSmvDVBzlTchqfhGNla0B8skYVnOqy9R9jsZi1s42G4%2BFWJUqELDGc5G1Xy8OLbgOvbKIOtwvOhymyNMe5%2BQbnFRJ47mUlIJQO5ZPbRxcQ7G2biJrSUF9OPtjd2wwRhrBaEl4cUbMq6gs6W4BZw%3D%3D - Y13M5953686M3162954 - - 860 - USD - $8.60 - - Usually ships in 1-2 business days - 0 - - - - - A2R0FX412W1BDT - Beach Audio - http://www.amazon.com/gp/help/seller/home.html?seller=A2R0FX412W1BDT - - - New - new - - - hGF9%2FDJ4fGEdRWXowkeuQKia70ARUEBtSHNVSrZHjg2Ceq4FT1cxD8VwDvtLGDqIpzn4ko%2BX6Z%2FAxoEWRpg1B0w9RiBlSiZttrVSdGZezZ5Lom%2BB7nzTe5o%2FqikC1ore98NN4cY91Ps%3D - Y11M1694666M7415801 - - 896 - USD - $8.96 - - Usually ships in 1-2 business days - 0 - - - - - AKJJGJ0JKT8F1 - Buy.com - http://www.amazon.com/gp/help/seller/home.html?seller=AKJJGJ0JKT8F1 - - - New - new - - - gAJB9Nd5wYWhz6Ct2bIhEKIJh96%2FPqdPxj0xopTp5NBG5Q0QGVYJ9Ko3WiVYPfGB1B%2B1MC70LQ4wTmjjh8aW%2BoXmzHjj2%2FeL8F8SkFRsMk%2B%2BR6O2OZ0psQ%2BoW%2BdMfkwJYD5frv4FcC0%3D - Y19M5468826M4135026 - - 899 - USD - $8.99 - - Usually ships in 1-2 business days - 0 - - - - - - diff --git a/tests/Zend/Service/Audioscrobbler/AlbumDataTest.php b/tests/Zend/Service/Audioscrobbler/AlbumDataTest.php deleted file mode 100644 index be5d7c484d..0000000000 --- a/tests/Zend/Service/Audioscrobbler/AlbumDataTest.php +++ /dev/null @@ -1,125 +0,0 @@ - - - 85683 - http://www.last.fm/music/Metallica/Metallica - 1 Jan 1994, 00:00 - - http://static.last.fm/coverart/50x50/1411800.jpg - http://static.last.fm/coverart/130x130/1411800.jpg - http://static.last.fm/coverart/300x300/1411800.jpg - - 3750d9e2-59f5-471d-8916-463433069bd1 - - - 26 - http://www.last.fm/music/Metallica/_/Enter+Sandman+%28LP+Version%29 - - - 22 - http://www.last.fm/music/Metallica/_/Sad+But+True+%28LP+Version%29 - - - 2 - http://www.last.fm/music/Metallica/_/Holier+Than+Thou+%28LP+Version%29 - - - 10 - http://www.last.fm/music/Metallica/_/The+Unforgiven+%28LP+Version%29 - - - 4 - http://www.last.fm/music/Metallica/_/Wherever+I+May+Roam+%28LP+Version%29 - - - 3 - http://www.last.fm/music/Metallica/_/Don%27t+Tread+On+Me+%28LP+Version%29 - - - 3 - http://www.last.fm/music/Metallica/_/Through+The+Never+%28LP+Version%29 - - - 26 - http://www.last.fm/music/Metallica/_/Nothing+Else+Matters+%28LP+Version%29 - - - 3 - http://www.last.fm/music/Metallica/_/Of+Wolf+And+Man+%28LP+Version%29 - - - 2 - http://www.last.fm/music/Metallica/_/The+God+That+Failed+%28LP+Version%29 - - - 3 - http://www.last.fm/music/Metallica/_/My+Friend+Of+Misery+%28LP+Version%29 - - - 3 - http://www.last.fm/music/Metallica/_/The+Struggle+Within+%28LP+Version%29 - - - -'; - - $this->setAudioscrobblerResponse($albumInfoResponse); - - try { - $as = $this->getAudioscrobblerService(); - $as->set('album', 'Metallica'); - $as->set('artist', 'Metallica'); - $response = $as->albumGetInfo(); - $track = $response->tracks->track[0]; - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$response['title'], 'Metallica'); - $this->assertEquals((string)$track->url, 'http://www.last.fm/music/Metallica/_/Enter+Sandman+%28LP+Version%29'); - $this->assertEquals(count($response->tracks->track), 12); - } catch (Exception $e ) { - $this->fail("Exception: [" . $e->getMessage() . "] thrown by test"); - } - } -} diff --git a/tests/Zend/Service/Audioscrobbler/AllTests.php b/tests/Zend/Service/Audioscrobbler/AllTests.php deleted file mode 100644 index 0e1681226a..0000000000 --- a/tests/Zend/Service/Audioscrobbler/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTestSuite('Zend_Service_Audioscrobbler_AudioscrobblerTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_ProfileTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_ArtistTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_AlbumDataTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_TrackDataTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_TagDataTest'); - $suite->addTestSuite('Zend_Service_Audioscrobbler_GroupTest'); - - return $suite; - } -} - diff --git a/tests/Zend/Service/Audioscrobbler/ArtistTest.php b/tests/Zend/Service/Audioscrobbler/ArtistTest.php deleted file mode 100644 index 5f243a94db..0000000000 --- a/tests/Zend/Service/Audioscrobbler/ArtistTest.php +++ /dev/null @@ -1,215 +0,0 @@ -header . - ' - - - Iron Maiden - ca891d65-d9b0-4258-89f7-e6ba29d83767 - 100 - http://www.last.fm/music/Iron+Maiden - http://static.last.fm/proposedimages/thumbnail/6/1000107/459375.jpg - http://static.last.fm/proposedimages/sidebar/6/1000107/459375.jpg - 1 - - - System of a Down - cc0b7089-c08d-4c10-b6b0-873582c17fd6 - 96 - http://www.last.fm/music/System+of+a+Down - http://static.last.fm/proposedimages/thumbnail/6/4468/52383.jpg - http://static.last.fm/proposedimages/sidebar/6/4468/52383.jpg - 1 - - '; - $this->setAudioscrobblerResponse($getRelatedArtistsResponse); - - $as = $this->getAudioscrobblerService(); - $as->set('artist', 'Metallica'); - $response = $as->artistGetRelatedArtists(); - $artist = $response->artist[0]; - - $this->assertEquals(count($response->artist), 2); - $this->assertEquals((string)$artist->name, 'Iron Maiden'); - $this->assertEquals((string)$response['artist'], 'Metallica'); - } - - public function testGetFans() - { - $getFansResponse = $this->header . - ' - - - http://www.last.fm/user/Liquid_Fire/ - http://static.last.fm/avatar/d8d9af8246e537078a57d5dc826cb34a.gif - 617010250 - - - http://www.last.fm/user/CeciltheDark/ - http://static.last.fm/avatar/30f0417393b696ac2ea06213bc5777d9.png - 382812500 - - - '; - $this->setAudioscrobblerResponse($getFansResponse); - - $as = $this->getAudioscrobblerService(); - $as->set('artist', 'Metallica'); - $response = $as->artistGetTopFans(); - $user = $response->user[0]; - - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$user->url, 'http://www.last.fm/user/Liquid_Fire/'); - } - - public function testTopTracks() - { - $getTopTracksResponse = $this->header . - ' - - - Nothing Else Matters - - 7481 - http://www.last.fm/music/Metallica/_/Nothing+Else+Matters - - - Enter Sandman - - 7139 - http://www.last.fm/music/Metallica/_/Enter+Sandman - - '; - $this->setAudioscrobblerResponse($getTopTracksResponse); - - $as = $this->getAudioscrobblerService(); - $as->set('artist', 'Metallica'); - $response = $as->artistGetTopTracks(); - $track = $response->track[0]; - - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$track->name, 'Nothing Else Matters'); - $this->assertEquals((int)$track->reach, 7481); - } - - public function testTopAlbums() - { - $getTopAlbumsResponse = $this->header . - ' - - - Master of Puppets - fed37cfc-2a6d-4569-9ac0-501a7c7598eb - 28940 - http://www.last.fm/music/Metallica/Master+of+Puppets - 7 Oct 1986, 00:00 - - http://static.last.fm/coverart/50x50/1411810.jpg - http://static.last.fm/coverart/130x130/1411810.jpg - http://static.last.fm/coverart/300x300/1411810.jpg - - - - Reload - b05cf8e3-67ad-4d40-9dc1-3a697e3a1bf8 - 27226 - http://www.last.fm/music/Metallica/Reload - 18 Nov 1997, 00:00 - - http://images.amazon.com/images/P/B000002HRE.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B000002HRE.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B000002HRE.01._SCMZZZZZZZ_.jpg - - - - '; - $this->setAudioscrobblerResponse($getTopAlbumsResponse); - - $as = $this->getAudioscrobblerService(); - $as->set('artist', 'Metallica'); - $response = $as->artistGetTopAlbums(); - $album = $response->album[0]; - - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$album->name, 'Master of Puppets'); - $this->assertEquals((string)$album->coverart->small, 'http://static.last.fm/coverart/50x50/1411810.jpg'); - } - - public function testTopTags() - { - $test_response = $this->header . - ' - - - metal - 100 - http://www.last.fm/tag/metal - - - heavy metal - 24 - http://www.last.fm/tag/heavy%20metal - - - thrash metal - 18 - http://www.last.fm/tag/thrash%20metal - - - '; - - $this->setAudioscrobblerResponse($test_response); - - $as = $this->getAudioscrobblerService(); - $as->set('artist', 'Metallica'); - $response = $as->artistGetTopTags(); - $tag = $response->tag[0]; - - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$tag->name, 'metal'); - $this->assertEquals((int)$tag->count, 100); - } -} diff --git a/tests/Zend/Service/Audioscrobbler/AudioscrobblerTest.php b/tests/Zend/Service/Audioscrobbler/AudioscrobblerTest.php deleted file mode 100644 index 982ae9bdd4..0000000000 --- a/tests/Zend/Service/Audioscrobbler/AudioscrobblerTest.php +++ /dev/null @@ -1,112 +0,0 @@ -setAudioscrobblerResponse(self::readTestResponse('errorNoUserExists')); - $as = $this->getAudioscrobblerService(); - $as->set('user', 'foobarfoo'); - - try { - $response = $as->userGetProfileInformation(); - $this->fail('Expected Zend_Http_Client_Exception not thrown'); - } catch(Zend_Http_Client_Exception $e) { - $this->assertContains("No user exists with this name", $e->getMessage()); - } - } - - public function testRequestThrowsHttpClientExceptionWithoutSuccessfulResponse() - { - $this->setAudioscrobblerResponse(self::readTestResponse('errorResponseStatusError')); - $as = $this->getAudioscrobblerService(); - $as->set('user', 'foobarfoo'); - - try { - $response = $as->userGetProfileInformation(); - $this->fail('Expected Zend_Http_Client_Exception not thrown'); - } catch(Zend_Http_Client_Exception $e) { - $this->assertContains("404", $e->getMessage()); - } - } - - /** - * @group ZF-4509 - */ - public function testSetViaCallIntercept() - { - $as = new Zend_Service_Audioscrobbler(); - $as->setUser("foobar"); - $as->setAlbum("Baz"); - $this->assertEquals("foobar", $as->get("user")); - $this->assertEquals("Baz", $as->get("album")); - } - - /** - * @group ZF-6251 - */ - public function testUnknownMethodViaCallInterceptThrowsException() - { - $this->setExpectedException("Zend_Service_Exception"); - - $as = new Zend_Service_Audioscrobbler(); - $as->someInvalidMethod(); - } - - /** - * @group ZF-6251 - */ - public function testCallInterceptMethodsRequireExactlyOneParameterAndThrowExceptionOtherwise() - { - $this->setExpectedException("Zend_Service_Exception"); - - $as = new Zend_Service_Audioscrobbler(); - $as->setUser(); - } - - public static function readTestResponse($file) - { - $message = file_get_contents(sprintf('%s/_files/%s', dirname(__FILE__), $file)); - // Line endings are sometimes an issue inside the canned responses; the - // following is a negative lookbehind assertion, and replaces any \n - // not preceded by \r with the sequence \r\n, ensuring that the message - // is well-formed. - return preg_replace("#(?_httpTestAdapter = new Zend_Http_Client_Adapter_Test(); - $this->_httpClient = new Zend_Http_Client(); - $this->_httpClient->setConfig(array('adapter' => $this->_httpTestAdapter)); - $this->_asService = new Zend_Service_Audioscrobbler(); - $this->_asService->setHttpClient($this->_httpClient); - } - - /** - * @param string $responseMessage - */ - protected function setAudioscrobblerResponse($responseMessage) - { - $this->_httpTestAdapter->setResponse($responseMessage); - } - - /** - * @return Zend_Service_Audioscrobbler - */ - protected function getAudioscrobblerService() - { - return $this->_asService; - } -} diff --git a/tests/Zend/Service/Audioscrobbler/GroupTest.php b/tests/Zend/Service/Audioscrobbler/GroupTest.php deleted file mode 100644 index e664b63cf3..0000000000 --- a/tests/Zend/Service/Audioscrobbler/GroupTest.php +++ /dev/null @@ -1,296 +0,0 @@ -header . -' - - - - - - - - - - - - - - - - - - - - - - - - - -'; - $this->setAudioscrobblerResponse($testing_response); - - $as = $this->getAudioscrobblerService(); - $as->set('group', urlencode('Jazz Club')); - $response = $as->groupGetWeeklyChartList(); - $chart = $response->chart[0]; - - $this->assertEquals((int)$chart['from'], 1159099200); - $this->assertEquals((string)$response['group'], 'Jazz Club'); - } - - public function testWeeklyArtistChartList() - { - $testing_response = $this->header . -' - - - Miles Davis - 561d854a-6a28-4aa7-8c99-323e6ce46c2a - 1 - 194 - http://www.last.fm/music/Miles+Davis - - - The Beatles - b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d - 2 - 156 - http://www.last.fm/music/The+Beatles - - - Pink Floyd - 83d91898-7763-47d7-b03b-b92132375c47 - 3 - 132 - http://www.last.fm/music/Pink+Floyd - - - John Coltrane - b625448e-bf4a-41c3-a421-72ad46cdb831 - 4 - 124 - http://www.last.fm/music/John+Coltrane - - - Radiohead - a74b1b7f-71a5-4011-9441-d0b5e4122711 - 4 - 124 - http://www.last.fm/music/Radiohead - - - Herbie Hancock - 27613b78-1b9d-4ec3-9db5-fa0743465fdd - 6 - 106 - http://www.last.fm/music/Herbie+Hancock - - - Led Zeppelin - 678d88b2-87b0-403b-b63d-5da7465aecc3 - 7 - 104 - http://www.last.fm/music/Led+Zeppelin - - - David Bowie - 5441c29d-3602-4898-b1a1-b77fa23b8e50 - 8 - 102 - http://www.last.fm/music/David+Bowie - - - AIR - cb67438a-7f50-4f2b-a6f1-2bb2729fd538 - 9 - 96 - http://www.last.fm/music/AIR - - - Red Hot Chili Peppers - 8bfac288-ccc5-448d-9573-c33ea2aa5c30 - 9 - 96 - http://www.last.fm/music/Red+Hot+Chili+Peppers - - -'; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - - $as->set('group', urlencode('Jazz Club')); - $response = $as->groupGetWeeklyArtistChartList(); - $this->assertNotNull(count($response)); - $artist = $response->artist[1]; - - $this->assertEquals((string)$artist->name, 'The Beatles'); - $this->assertEquals((string)$artist->url, 'http://www.last.fm/music/The+Beatles'); - $this->assertEquals((string)$response['group'], 'Jazz Club'); - } - - public function testWeeklyAlbumChartList() - { - $testing_response = $this->header . -' - - - Miles Davis - Kind of Blue - bee5e0cd-1767-4a8e-9578-6455e87ba60b - 1 - 56 - http://www.last.fm/music/Miles+Davis/Kind+of+Blue - - - Radiohead - OK Computer - fba5f8fe-c6c8-4511-8562-c9febf482674 - 2 - 42 - http://www.last.fm/music/Radiohead/OK+Computer - - - Portishead - Dummy - 87888070-1b25-4830-aebc-dee490058b74 - 3 - 37 - http://www.last.fm/music/Portishead/Dummy - - - The Arcade Fire - Funeral - - 3 - 37 - http://www.last.fm/music/The+Arcade+Fire/Funeral - - - Coldplay - A Rush of Blood to the Head - b83b32dd-aa1a-4f18-a5af-00e418041617 - 5 - 34 - http://www.last.fm/music/Coldplay/A+Rush+of+Blood+to+the+Head - - - The Beatles - Abbey Road - 03503af3-a0e0-4f7e-8a0d-a1cd4d7225c5 - 6 - 32 - http://www.last.fm/music/The+Beatles/Abbey+Road - - - The Beatles - Rubber Soul - 34b8cb33-5f91-4e0c-b4ec-3fb2d3f2f926 - 6 - 32 - http://www.last.fm/music/The+Beatles/Rubber+Soul - - - Massive Attack - Mezzanine - 0d33ef7a-1f5d-4365-b807-b412271b99c3 - 8 - 31 - http://www.last.fm/music/Massive+Attack/Mezzanine - - - Coldplay - Parachutes - 8fb50f96-279e-4d44-92aa-d49ea56f5c08 - 8 - 31 - http://www.last.fm/music/Coldplay/Parachutes - - - Gnarls Barkley - St. Elsewhere - - 8 - 31 - http://www.last.fm/music/Gnarls+Barkley/St.+Elsewhere - - -'; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - - $as->set('group', urlencode('Jazz Club')); - $response = $as->groupGetWeeklyAlbumChartList(); - $this->assertNotNull(count($response)); - $album = $response->album[0]; - - $this->assertEquals((string)$album->artist, 'Miles Davis'); - $this->assertEquals((string)$album->name, 'Kind of Blue'); - $this->assertEquals((string)$album->chartposition, 1); - $this->assertEquals((string)$response['group'], 'Jazz Club'); - } - - public function testPreviousWeeklyChartList() -{ - $testing_response = $this->header . -' - - -'; - $this->setAudioscrobblerResponse($testing_response); - - $as = $this->getAudioscrobblerService(); - $as->set('group', urlencode('Jazz Club')); - $from = 1114965332; - $to = 1115570132; - $response = $as->groupGetWeeklyChartList($from, $to); - - $this->assertNotNull(count($response)); - $this->assertEquals((string)$response['group'], 'Jazz Club'); - $this->assertEquals((int)$response['from'], $from); - $this->assertEquals((int)$response['to'], $to); - } - -} diff --git a/tests/Zend/Service/Audioscrobbler/ProfileTest.php b/tests/Zend/Service/Audioscrobbler/ProfileTest.php deleted file mode 100644 index 9603a91ec5..0000000000 --- a/tests/Zend/Service/Audioscrobbler/ProfileTest.php +++ /dev/null @@ -1,635 +0,0 @@ -assertNotNull($response); - } - - public function testGetProfileInfo() - { - $test_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - http://www.last.fm/user/RJ/ - - Richard Jones - 1b374543545e01bc8d555a6a57c637f61f999fdf - Nov 20, 2002 - 24 - m - United Kingdom - 45043 - http://static.last.fm/avatar/0f4bda3a8e49e714c26ef610e2893454.jpg - '; - $this->setAudioscrobblerResponse($test_response); - - $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetProfileInformation(); - $this->assertNotNull($response); - } - - public function testGetBadProfileInfo() - { - $this->markTestSkipped('Invalid test, communicating with the outside world!'); - - $as = new Zend_Service_Audioscrobbler(); - $as->set('user', 'kljadsfjllkj'); - - try { - $response = $as->userGetProfileInformation(); - $this->assertNull($response); - - } catch (Exception $e) { - return; - } - - $this->fail('Exception was not thrown when submitting bad user info'); - } - - public function testUserGetTopArtists( ) - { - $test_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - Dream Theater - 28503ab7-8bf2-4666-a7bd-2644bfc7cb1d - 854 - 1 - http://www.last.fm/music/Dream+Theater - http://static.last.fm/proposedimages/thumbnail/6/4209/432600.jpg - http://static.last.fm/proposedimages/sidebar/6/4209/432600.jpg - - '; - - $this->setAudioscrobblerResponse($test_response); $as = $this->getAudioscrobblerService(); - - $as->set('user', 'RJ'); - $response = $as->userGetTopArtists(); - $artist = $response->artist[0]; - - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((string)$artist->name, 'Dream Theater'); - $this->assertNotNull($artist->rank, 1); - } - - public function testUserGetTopAlbums( ) - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - Hot Chip - The Warning - - 227 - 1 - http://www.last.fm/music/Hot+Chip/The+Warning - - http://images.amazon.com/images/P/B000FBFSVU.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B000FBFSVU.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B000FBFSVU.01._SCMZZZZZZZ_.jpg - - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'Frith'); - $response = $as->userGetTopAlbums(); - $album = $response->album[0]; - $this->assertEquals((string)$response['user'], 'Frith'); - $this->assertNotNull($album); - $this->assertEquals((string)$album->name, 'The Warning'); - } - - public function testUserGetTopTracks( ) - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - Steppenwolf - The Pusher - - 31 - 1 - http://www.last.fm/music/Steppenwolf/_/The+Pusher - - - Portishead - Cowboys - - 28 - 2 - http://www.last.fm/music/Portishead/_/Cowboys - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetTopTracks(); - $track = $response->track[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertNotNull($track); - $this->assertEquals((string)$track->artist, 'Steppenwolf'); - $this->assertEquals((int)$track->playcount, 31); - } - - public function testUserGetTopTags( ) - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - rock - 9 - http://www.last.fm/tag/rock - - - metal - 8 - http://www.last.fm/tag/metal - - - mellow - 5 - http://www.last.fm/tag/mellow - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetTopTags(); - $tag = $response->tag[1]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertNotNull($tag); - $this->assertEquals((string)$tag->name, 'metal'); - $this->assertEquals((int)$tag->count, 8); - } - - public function testUserGetTopTagsForArtist() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - metal - 1 - http://www.last.fm/tag/metal - - - 80s - 1 - http://www.last.fm/tag/80s - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $as->set('artist', 'Metallica'); - $response = $as->userGetTopTagsForArtist(); - $tag = $response->tag[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertNotNull($tag); - } - - /** - * Ensures that userGetTopTagsForArtist() throws an exception when based on bad parameters - * - * @return void - */ - public function testBadUserGetTopTagsForArtist() - { - $testingResponse = "HTTP/1.1 200 OK\r\n" - . "Content-type: text/xml\r\n" - . "\r\n" - . "ERROR: Missing 'subject' parameter in querystring"; - $this->setAudioscrobblerResponse($testingResponse); - $as = $this->getAudioscrobblerService(); - - try { - $response = $as->userGetTopTagsForArtist(); - $this->fail('userGetTopTagsForArtist() did not throw exception based on bad parameters'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('SimpleXML', $e->getMessage()); - } - } - - public function testUserGetTopTagsForAlbum() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $as->set('artist', 'Metallica'); - $as->set('album', 'Ride The Lightning'); - $response = $as->userGetTopTagsForAlbum(); - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((string)strtolower($response['artist']), strtolower('Metallica')); - $this->assertEquals((string)strtolower($response['album']), strtolower('Ride The Lightning')); - } - - public function testUserGetTopTagsForTrack() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $as->set('artist', 'Metallica'); - $as->set('track', 'Nothing Else Matters'); - $response = $as->userGetTopTagsForTrack(); - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$response['track'], 'Nothing Else Matters'); - } - - public function testUserGetFriends() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - http://www.last.fm/user/julians/ - http://static.last.fm/avatar/9ca899b8f20b7173d47983cc0533be8c.gif - - - - - - http://www.last.fm/user/Korean_Cowboy/ - http://static.last.fm/avatar/091614ec2288764362c94f047d207336.jpg - - - - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetFriends(); - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->user), 2); - } - - public function testUserGetNeighbours() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - http://www.last.fm/user/count-bassy/ - http://static.last.fm/avatar/3da65e2f347f64c033c9eced171e7a21.gif - 100 - - - http://www.last.fm/user/arcymarcy/ - http://static.last.fm/avatar/eed7d6afea225f85cfcd6ee61eac19aa.jpg - 93.12 - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetNeighbours(); - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->user), 2); - $user = $response->user[1]; - $this->assertEquals((string)$user['username'], 'arcymarcy'); - } - - public function testUserRecentTracks() - { - $testing_response = "HTTP/1.1 200 OK\r\n" . - "Content-type: text/xml\r\n" . - "\r\n" . - ' - - - Tok Tok Tok - Always An Excuse - - http://www.last.fm/music/Tok+Tok+Tok/_/Always+An+Excuse - 6 Mar 2007, 17:45 - - - Tok Tok Tok - What Has Roots - - http://www.last.fm/music/Tok+Tok+Tok/_/What+Has+Roots - 6 Mar 2007, 17:39 - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetRecentTracks(); - $track = $response->track[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->track), 2); - $this->assertEquals((string)$track->name, 'Always An Excuse'); - } - - public function testUserRecentBannedTracks() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - Herbie Hancock - Rockit - - http://www.last.fm/music/Herbie+Hancock/_/Rockit - 10 Feb 2007, 16:55 - - - Plaid - Plaid Rmx - - http://www.last.fm/music/Plaid/_/Plaid+Rmx - 17 Oct 2006, 23:53 - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetRecentBannedTracks(); - $track = $response->track[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->track), 2); - $this->assertEquals((string)$track->artist, 'Herbie Hancock'); - $this->assertEquals((string)$track->name, 'Rockit'); - } - - public function testUserRecentLovedTracks() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - Spyro Gyra - Morning Dance - - http://www.last.fm/music/Spyro+Gyra/_/Morning+Dance - 8 Nov 2006, 17:15 - - - Bad Religion - I Love My Computer - - http://www.last.fm/music/Bad+Religion/_/I+Love+My+Computer - 31 Oct 2006, 15:53 - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetRecentLovedTracks(); - $track = $response->track[1]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertNotNull((string)$track->name, 'Morning Dance'); - $this->assertNotNull((string)$track->date, '31 Oct 2006, 15:53'); - $this->assertNotNull($response->track); - } - - public function testUserGetWeeklyChartList() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - - - - - - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetWeeklyChartList(); - $chart = $response->chart[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->chart), 7); - $this->assertEquals((string)$chart['from'], '1108296002'); - $this->assertEquals((string)$chart['to'], '1108900802'); - } - - public function testUserGetRecentWeeklyArtistChart() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - Miles Davis - 561d854a-6a28-4aa7-8c99-323e6ce46c2a - 1 - 30 - http://www.last.fm/music/Miles+Davis - - - Guano Apes - 66da25f9-1534-4dd1-b88c-718bc24e1ccd - 2 - 28 - http://www.last.fm/music/Guano+Apes - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetWeeklyArtistChart(); - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertNotNull($response->weeklyartistchart); - $this->assertNotNull($response->artist); - } - - public function testUserGetWeeklyAlbumChart() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - Skid Row - Slave To The Grid - - 1 - 12 - http://www.last.fm/music/Skid+Row/Slave+To+The+Grid - - - Guano Apes - Walking on a Thin Line - 769a46de-52e2-4322-9db0-cbd6b789e3f8 - 1 - 12 - http://www.last.fm/music/Guano+Apes/Walking+on+a+Thin+Line - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $response = $as->userGetWeeklyAlbumChart(); - $album = $response->album[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals(count($response->album), 2); - $this->assertEquals((string)$album->artist, 'Skid Row'); - $this->assertEquals((string)$album->name, 'Slave To The Grid'); - } - - public function testUserGetPreviousWeeklyArtistChart() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - Nine Inch Nails - b7ffd2af-418f-4be2-bdd1-22f8b48613da - 1 - 23 - http://www.last.fm/music/Nine+Inch+Nails - - - The Doors - 9efff43b-3b29-4082-824e-bc82f646f93d - 2 - 3 - http://www.last.fm/music/The+Doors - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $from = 1114965332; - $to = 1115570132; - $response = $as->userGetWeeklyArtistChart($from, $to); - $artist = $response->artist[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((int)$response['from'], $from); - $this->assertEquals((int)$response['to'], $to); - $this->assertEquals((string)$artist->name, 'Nine Inch Nails'); - $this->assertEquals(count($response->artist), 2); - } - - public function testUserGetPreviousWeeklyAlbumChart() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - The Doors - The Doors Box Set - - 1 - 2 - http://www.last.fm/music/The+Doors/The+Doors+Box+Set - - - Nirvana - Nirvana - d8f9547d-5e46-45f0-b694-0d9af9e2de63 - 1 - 2 - http://www.last.fm/music/Nirvana/Nirvana - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $from = 1114965332; - $to = 1115570132; - $response = $as->userGetWeeklyAlbumChart($from, $to); - $album = $response->album[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((int)$response['from'], 1114965332); - $this->assertEquals((int)$response['to'], 1115570132); - $this->assertEquals(count($response->album), 2); - } - - public function testUserGetPreviousWeeklyTrackChart() - { - $testing_response = "HTTP/1.1 200 OK\r\nContent-type: text/xml\r\n\r\n" . - ' - - - The Kleptones - Question - - 1 - 3 - http://www.last.fm/music/The+Kleptones/_/Question - - - Nine Inch Nails - All the Love in the World - - 2 - 2 - http://www.last.fm/music/Nine+Inch+Nails/_/All+the+Love+in+the+World - - '; - $this->setAudioscrobblerResponse($testing_response); $as = $this->getAudioscrobblerService(); - $as->set('user', 'RJ'); - $from = 1114965332; - $to = 1115570132; - $response = $as->userGetWeeklyTrackChart($from, $to); - $track = $response->track[0]; - $this->assertEquals((string)$response['user'], 'RJ'); - $this->assertEquals((int)$response['from'], $from); - $this->assertEquals((int)$response['to'], $to); - $this->assertEquals((string)$track->artist, 'The Kleptones'); - $this->assertEquals(count($response->track), 2); - } -} diff --git a/tests/Zend/Service/Audioscrobbler/TagDataTest.php b/tests/Zend/Service/Audioscrobbler/TagDataTest.php deleted file mode 100644 index c3a844bee2..0000000000 --- a/tests/Zend/Service/Audioscrobbler/TagDataTest.php +++ /dev/null @@ -1,167 +0,0 @@ -markTestSkipped('Invalid test, communicating with real-world service.'); - - try { - $as = new Zend_Service_Audioscrobbler(); - $response = $as->tagGetTopTags(); - $this->assertNotNull(count($response->tag)); - } catch (Exception $e ) { - $this->fail("Exception: [" . $e->getMessage() . "] thrown by test"); - } - } - - public function testGetTopArtists() - { - $testing_response = $this->header . -' - - - 8bfac288-ccc5-448d-9573-c33ea2aa5c30 - http://www.last.fm/music/Red+Hot+Chili+Peppers - http://static.last.fm/proposedimages/thumbnail/6/1274/447958.jpg - http://static.last.fm/proposedimages/sidebar/6/1274/447958.jpg - - - 67f66c07-6e61-4026-ade5-7e782fad3a5d - http://www.last.fm/music/Foo+Fighters - http://static.last.fm/proposedimages/thumbnail/6/1000062/458.jpg - http://static.last.fm/proposedimages/sidebar/6/1000062/458.jpg - - - a74b1b7f-71a5-4011-9441-d0b5e4122711 - http://www.last.fm/music/Radiohead - http://static.last.fm/proposedimages/thumbnail/6/979/453678.jpg - http://static.last.fm/proposedimages/sidebar/6/979/453678.jpg - - -'; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - - $as->set('tag', 'Rock'); - $response = $as->tagGetTopArtists(); - $this->assertNotNull($response->artist); - $this->assertEquals((string)$response['tag'], strtolower($as->get('tag'))); - } - - public function testGetTopAlbums() - { - $testing_response = $this->header . -' - - - - f4a31f0a-51dd-4fa7-986d-3095c40c5ed9 - http://www.last.fm/music/Evanescence - - http://www.last.fm/music/Evanescence/Fallen - - http://images.amazon.com/images/P/B00008US8R.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B00008US8R.01._SCMZZZZZZZ_.jpg - http://images.amazon.com/images/P/B00008US8R.01._SCMZZZZZZZ_.jpg - - - - - 11ae9fbb-f3d7-4a47-936f-4c0a04d3b3b5 - http://www.last.fm/music/The+White+Stripes - - http://www.last.fm/music/The+White+Stripes/Elephant - - http://images-eu.amazon.com/images/P/B00007KN36.02.THUMBZZZ.jpg - http://images-eu.amazon.com/images/P/B00007KN36.02.MZZZZZZZ.jpg - http://images-eu.amazon.com/images/P/B00007KN36.02.LZZZZZZZ.jpg - - - -'; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - $as->set('tag', 'Rock'); - $response = $as->tagGetTopAlbums(); - $this->assertNotNull(count($response->album)); - $this->assertEquals((string)$response['tag'], strtolower($as->get('tag'))); - } - - public function testGetTopTracks() - { - $testing_response = $this->header . -' - - - - 8bfac288-ccc5-448d-9573-c33ea2aa5c30 - http://www.last.fm/music/Red+Hot+Chili+Peppers - - http://www.last.fm/music/Red+Hot+Chili+Peppers/_/Dani+California - - - - 39ab1aed-75e0-4140-bd47-540276886b60 - http://www.last.fm/music/Oasis - - http://www.last.fm/music/Oasis/_/Wonderwall - - - - - http://www.last.fm/music/Green+Day - - http://www.last.fm/music/Green+Day/_/Boulevard+of+Broken+Dreams - - -'; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - $as->set('tag', 'Rock'); - $response = $as->tagGetTopTracks(); - $artist = $response->track[0]; - $this->assertNotNull(count($response->track)); - $this->assertNotNull((string)$artist->name); - $this->assertEquals((string)$response['tag'], strtolower($as->get('tag'))); - } - -} diff --git a/tests/Zend/Service/Audioscrobbler/TrackDataTest.php b/tests/Zend/Service/Audioscrobbler/TrackDataTest.php deleted file mode 100644 index 738a4b5e3d..0000000000 --- a/tests/Zend/Service/Audioscrobbler/TrackDataTest.php +++ /dev/null @@ -1,108 +0,0 @@ -header . - ' - - - http://www.last.fm/user/suhis/ - http://static.last.fm/depth/catalogue/noimage/nouser_140px.jpg - 2816666 - - - http://www.last.fm/user/M4lu5/ - http://static.last.fm/avatar/ea9c0ddf6b6cc236dfc4297e376e9901.jpg - 2380500 - - - http://www.last.fm/user/Ceniza666/ - http://static.last.fm/depth/catalogue/noimage/nouser_140px.jpg - 1352000 - - - '; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - - $as->set('artist', 'Metallica'); - $as->set('track', 'Enter Sandman'); - $response = $as->trackGetTopFans(); - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$response['track'], 'Enter Sandman'); - $this->assertNotNull(count($response->user)); - } - - public function testGetTopTags() - { - $testing_response = $this->header . - ' - - - metal - 100 - http://www.last.fm/tag/metal - - - heavy metal - 55 - http://www.last.fm/tag/heavy%20metal - - - rock - 21 - http://www.last.fm/tag/rock - - - '; - $this->setAudioscrobblerResponse($testing_response); - $as = $this->getAudioscrobblerService(); - - $as->set('artist', 'Metallica'); - $as->set('track', 'Enter Sandman'); - $response = $as->trackGetTopTags(); - $this->assertNotNull(count($response->tag)); - $this->assertEquals((string)$response['artist'], 'Metallica'); - $this->assertEquals((string)$response['track'], 'Enter Sandman'); - } -} diff --git a/tests/Zend/Service/Audioscrobbler/_files/errorNoUserExists b/tests/Zend/Service/Audioscrobbler/_files/errorNoUserExists deleted file mode 100644 index 73ed1b795d..0000000000 --- a/tests/Zend/Service/Audioscrobbler/_files/errorNoUserExists +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 404 Not Found -Date: Sun, 13 Jan 2008 23:53:03 GMT -Server: Apache/1.3.33 (Unix) PHP/4.4.3 -X-Proxy-Fix-Up: headers fixed up -X-Powered-By: PHP/4.4.3 -Vary: Accept-Encoding -Content-Type: text/html; charset=utf-8 -X-Cache: MISS from cache7.int.last.fm -X-Cache-Lookup: MISS from cache7.int.last.fm:8081 -Via: 1.0 cache7.int.last.fm:8081 (squid/2.HEAD-20071216) -Connection: close - -No user exists with this name. diff --git a/tests/Zend/Service/Audioscrobbler/_files/errorResponseStatusError b/tests/Zend/Service/Audioscrobbler/_files/errorResponseStatusError deleted file mode 100644 index a8769b1d49..0000000000 --- a/tests/Zend/Service/Audioscrobbler/_files/errorResponseStatusError +++ /dev/null @@ -1,18 +0,0 @@ -HTTP/1.1 404 Not Found -Date: Mon, 14 Jan 2008 00:06:52 GMT -Server: Apache/1.3.33 (Unix) PHP/4.4.3 -Content-Type: text/html; charset=iso-8859-1 -X-Cache: MISS from cache5.int.last.fm -X-Cache-Lookup: MISS from cache5.int.last.fm:8081 -Via: 1.0 cache5.int.last.fm:8081 (squid/2.6.STABLE17) -Connection: close - - - -404 Not Found - -

Not Found

-The requested URL /1.0/group/ was not found on this server.

-


-
Apache/1.3.33 Server at ws.audioscrobbler.com Port 80
- diff --git a/tests/Zend/Service/Delicious/AllTests.php b/tests/Zend/Service/Delicious/AllTests.php deleted file mode 100644 index 5ec188d8c8..0000000000 --- a/tests/Zend/Service/Delicious/AllTests.php +++ /dev/null @@ -1,87 +0,0 @@ -addTestSuite('Zend_Service_Delicious_PublicDataTest'); - $suite->addTestSuite('Zend_Service_Delicious_PrivateDataTest'); - } else { - $suite->addTestSuite('Zend_Service_Delicious_SkipTests'); - } - - $suite->addTestSuite('Zend_Service_Delicious_SimplePostTest'); - - $suite->addTestSuite('Zend_Service_Delicious_PostTest'); - - return $suite; - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Delicious_AllTests::main') { - Zend_Service_Delicious_AllTests::main(); -} diff --git a/tests/Zend/Service/Delicious/PostTest.php b/tests/Zend/Service/Delicious/PostTest.php deleted file mode 100644 index bcfe3bee6e..0000000000 --- a/tests/Zend/Service/Delicious/PostTest.php +++ /dev/null @@ -1,227 +0,0 @@ -_delicious = new Zend_Service_Delicious(self::UNAME, self::PASS); - - $values = array( - 'title' => 'anything', - 'url' => 'anything' - ); - $this->_post = new Zend_Service_Delicious_Post($this->_delicious, $values); - } - - /** - * Ensures that the constructor throws an exception when the title is missing from the values - * - * @return void - */ - public function testConstructExceptionValuesTitleMissing() - { - try { - $post = new Zend_Service_Delicious_Post($this->_delicious, array('url' => 'anything')); - $this->fail('Expected Zend_Service_Delicious_Exception not thrown'); - } catch (Zend_Service_Delicious_Exception $e) { - $this->assertContains("'url' and 'title'", $e->getMessage()); - } - } - - /** - * Ensures that the constructor throws an exception when the URL is missing from the values - * - * @return void - */ - public function testConstructExceptionValuesUrlMissing() - { - try { - $post = new Zend_Service_Delicious_Post($this->_delicious, array('title' => 'anything')); - $this->fail('Expected Zend_Service_Delicious_Exception not thrown'); - } catch (Zend_Service_Delicious_Exception $e) { - $this->assertContains("'url' and 'title'", $e->getMessage()); - } - } - - /** - * Ensures that the constructor throws an exception when the date value is not an instance of Zend_Date - * - * @return void - */ - public function testConstructExceptionValuesDateInvalid() - { - $values = array( - 'title' => 'anything', - 'url' => 'anything', - 'date' => 'invalid' - ); - try { - $post = new Zend_Service_Delicious_Post($this->_delicious, $values); - $this->fail('Expected Zend_Service_Delicious_Exception not thrown'); - } catch (Zend_Service_Delicious_Exception $e) { - $this->assertContains('instance of Zend_Date', $e->getMessage()); - } - } - - /** - * Ensures that setTitle() provides a fluent interface - * - * @return void - */ - public function testSetTitleFluent() - { - $this->assertSame($this->_post, $this->_post->setTitle('something')); - } - - /** - * Ensures that setNotes() provides a fluent interface - * - * @return void - */ - public function testSetNotesFluent() - { - $this->assertSame($this->_post, $this->_post->setNotes('something')); - } - - /** - * Ensures that setTags() provides a fluent interface - * - * @return void - */ - public function testSetTagsFluent() - { - $this->assertSame($this->_post, $this->_post->setTags(array('something'))); - } - - /** - * Ensures that addTag() provides a fluent interface - * - * @return void - */ - public function testAddTagFluent() - { - $this->assertSame($this->_post, $this->_post->addTag('another')); - } - - /** - * Ensures that removeTag() provides a fluent interface - * - * @return void - */ - public function testRemoveTagFluent() - { - $this->assertSame($this->_post, $this->_post->removeTag('missing')); - } - - /** - * Ensures that getDate() provides expected behavior - * - * @return void - */ - public function testGetDate() - { - $this->assertNull($this->_post->getDate()); - } - - /** - * Ensures that getOthers() provides expected behavior - * - * @return void - */ - public function testGetOthers() - { - $this->assertNull($this->_post->getOthers()); - } - - /** - * Ensures that getHash() provides expected behavior - * - * @return void - */ - public function testGetHash() - { - $this->assertNull($this->_post->getHash()); - } - - /** - * Ensures that getShared() provides expected behavior - * - * @return void - */ - public function testGetShared() - { - $this->assertTrue($this->_post->getShared()); - } - - /** - * Ensures that setShared() provides a fluent interface - * - * @return void - */ - public function testSetSharedFluent() - { - $this->assertSame($this->_post, $this->_post->setShared(true)); - } -} diff --git a/tests/Zend/Service/Delicious/PrivateDataTest.php b/tests/Zend/Service/Delicious/PrivateDataTest.php deleted file mode 100644 index 65d2667e28..0000000000 --- a/tests/Zend/Service/Delicious/PrivateDataTest.php +++ /dev/null @@ -1,246 +0,0 @@ -setConfig(array( - 'useragent' => 'Zend_Service_Delicious - Unit tests/0.1', - 'keepalive' => true - )); - Zend_Rest_Client::setHttpClient($httpClient); - - $this->_delicious = new Zend_Service_Delicious(self::TEST_UNAME, self::TEST_PASS); - } - - /** - * - * @return void - */ - public function testLastUpdate() - { - $this->assertTrue($this->_delicious->getLastUpdate() instanceof Zend_Date); - } - - /** - * - * @return void - */ - public function testTagsAndBundles() - { - // get tags - $tags = $this->_delicious->getTags(); - $this->assertTrue(is_array($tags)); - $tags = array_keys($tags); - - if (count($tags) < 1) { - $this->fail('Test account corrupted - no tags'); - } - - $oldTagName = $tags[0]; - $newTagName = uniqid('tag'); - - // rename tag - $this->_delicious->renameTag($oldTagName, $newTagName); - - sleep(15); - - // get renamed tags - $tags = $this->_delicious->getTags(); - - $this->assertArrayHasKey($newTagName, $tags); - $this->assertArrayNotHasKey($oldTagName, $tags); - - $tags = array_keys($tags); - - // add new bundle - $newBundleName = uniqid('bundle'); - $this->_delicious->addBundle($newBundleName, $tags); - - sleep(15); - - // check if bundle was added - $bundles = $this->_delicious->getBundles(); - $this->assertTrue(is_array($bundles)); - $this->assertArrayHasKey($newBundleName, $bundles); - $this->assertEquals($tags, $bundles[$newBundleName]); - - // delete bundle - $this->_delicious->deleteBundle($newBundleName); - - sleep(15); - - // check if bundle was deleted - $bundles = $this->_delicious->getBundles(); - $this->assertArrayNotHasKey($newBundleName, $bundles); - } - - /** - * - * @return void - */ - public function _testAddDeletePost() - { - $newPost = $this->_delicious->createNewPost(self::$TEST_POST_TITLE, self::$TEST_POST_URL) - ->setNotes(self::$TEST_POST_NOTES) - ->setTags(self::$TEST_POST_TAGS) - ->setShared(self::$TEST_POST_SHARED); - - // check if post was created correctly - $this->assertEquals(self::$TEST_POST_TITLE, $newPost->getTitle()); - $this->assertEquals(self::$TEST_POST_URL, $newPost->getUrl()); - $this->assertEquals(self::$TEST_POST_NOTES, $newPost->getNotes()); - $this->assertEquals(self::$TEST_POST_TAGS, $newPost->getTags()); - $this->assertEquals(self::$TEST_POST_SHARED, $newPost->getShared()); - - // test tag adding to tag - $newTagName = uniqid('tag'); - $newPost->addTag($newTagName); - $this->assertContains($newTagName, $newPost->getTags()); - - // test tag removeing - $newPost->removeTag($newTagName); - $this->assertNotContains($newTagName, $newPost->getTags()); - - // send post to del.icio.us - $newPost->save(); - - sleep(15); - - // get the post back - $returnedPosts = $this->_delicious->getPosts(null, null, self::$TEST_POST_URL); - - $this->assertEquals(1, count($returnedPosts)); - - $savedPost = $returnedPosts[0]; - - // check if post was saved correctly - $this->assertEquals(self::$TEST_POST_TITLE, $savedPost->getTitle()); - $this->assertEquals(self::$TEST_POST_URL, $savedPost->getUrl()); - $this->assertEquals(self::$TEST_POST_NOTES, $savedPost->getNotes()); - $this->assertEquals(self::$TEST_POST_TAGS, $savedPost->getTags()); - $this->assertEquals(self::$TEST_POST_SHARED, $savedPost->getShared()); - $this->assertTrue($savedPost->getDate() instanceof Zend_Date); - $this->assertTrue(is_string($savedPost->getHash())); - $this->assertTrue(is_int($savedPost->getOthers())); - - // delete post - $savedPost->delete(); - - sleep(15); - - // check if post was realy deleted - $returnedPosts = $this->_delicious->getPosts(null, null, self::$TEST_POST_URL); - $this->assertEquals(0, count($returnedPosts)); - } - - /** - * Ensures that getAllPosts() provides expected behavior - * - * @return void - */ - public function testGetAllPosts() - { - $posts = $this->_delicious->getAllPosts('zfSite'); - $this->assertTrue($posts instanceof Zend_Service_Delicious_PostList); - - foreach ($posts as $post) { - $this->assertContains('zfSite', $post->getTags()); - } - } - - /** - * Ensures that getRecentPosts() provides expected behavior - * - * @return void - */ - public function testGetRecentPosts() - { - $posts = $this->_delicious->getRecentPosts('zfSite', 10); - $this->assertTrue($posts instanceof Zend_Service_Delicious_PostList); - $this->assertTrue(count($posts) <= 10); - - foreach ($posts as $post) { - $this->assertContains('zfSite', $post->getTags()); - } - } - - /** - * Ensures that getPosts() provides expected behavior - * - * @return void - */ - public function testGetPosts() - { - $posts = $this->_delicious->getPosts('zfSite', new Zend_Date(), 'help'); - $this->assertTrue($posts instanceof Zend_Service_Delicious_PostList); - $this->assertTrue(count($posts) <= 10); - - foreach ($posts as $post) { - $this->assertContains('zfSite', $post->getTags()); - } - } - - /** - * - * @return void - */ - public function testDates() - { - $this->assertTrue(is_array($this->_delicious->getDates())); - } -} diff --git a/tests/Zend/Service/Delicious/PublicDataTest.php b/tests/Zend/Service/Delicious/PublicDataTest.php deleted file mode 100644 index 78324f8c22..0000000000 --- a/tests/Zend/Service/Delicious/PublicDataTest.php +++ /dev/null @@ -1,162 +0,0 @@ -setConfig(array( - 'useragent' => 'Zend_Service_Delicious - Unit tests/0.1', - 'keepalive' => true - )); - Zend_Rest_Client::setHttpClient($httpClient); - - $this->_delicious = new Zend_Service_Delicious(); - } - - /** - * Try to get tags of some user - * - * @return void - */ - public function testGetTags() - { - $tags = $this->_delicious->getUserTags(self::TEST_UNAME); - - $this->assertTrue(is_array($tags)); - } - - /** - * @return void - */ - public function testGetTagsWithCount() - { - $tags = $this->_delicious->getUserTags(self::TEST_UNAME, null, 20); - - $this->assertTrue(is_array($tags)); - $this->assertTrue(count($tags) <= 20); - } - - /** - * @return void - */ - public function testGetTagsWithAtLeast() - { - $tags = $this->_delicious->getUserTags(self::TEST_UNAME, 5); - - $this->assertTrue(is_array($tags)); - foreach ($tags as $count) { - $this->assertTrue($count >= 5); - } - } - - /** - * @return void - */ - public function testGetNetwork() - { - $network = $this->_delicious->getUserNetwork(self::TEST_UNAME); - - $this->assertTrue(is_array($network)); - } - - /** - * @return void - */ - public function testGetFans() - { - $fans = $this->_delicious->getUserFans(self::TEST_UNAME); - - $this->assertTrue(is_array($fans)); - } - - /** - * @return void - */ - public function testGetUserPosts() - { - $posts = $this->_delicious->getUserPosts(self::TEST_UNAME, 10); - - $this->assertTrue($posts instanceof Zend_Service_Delicious_PostList); - - // check if all objects in returned Zend_Service_Delicious_PostList - // are instances of Zend_Service_Delicious_SimplePost - foreach ($posts as $post) { - $this->assertTrue($post instanceof Zend_Service_Delicious_SimplePost); - } - - // test filtering of Zend_Service_Delicious_PostList by tag name - $filterPostList = $posts->withTag('zfSite'); - - foreach ($filterPostList as $post) { - $this->assertTrue(is_array($post->getTags())); - $this->assertContains('zfSite', $post->getTags()); - } - } - - /** - * Try to get details of some URL - * - * @return void - */ - public function testGetUrlDetails() { - $details = $this->_delicious->getUrlDetails(self::TEST_URL); - - $this->assertTrue(is_array($details)); - $this->assertArrayHasKey('hash', $details); - $this->assertArrayHasKey('top_tags', $details); - $this->assertArrayHasKey('url', $details); - $this->assertArrayHasKey('total_posts', $details); - - $this->assertEquals(self::TEST_URL, $details['url']); - $this->assertTrue(is_array($details['top_tags'])); - } -} diff --git a/tests/Zend/Service/Delicious/SimplePostTest.php b/tests/Zend/Service/Delicious/SimplePostTest.php deleted file mode 100644 index 8c7b72d3e7..0000000000 --- a/tests/Zend/Service/Delicious/SimplePostTest.php +++ /dev/null @@ -1,153 +0,0 @@ - 'anything'); - try { - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->fail('Expected Zend_Service_Delicious_Exception not thrown'); - } catch (Zend_Service_Delicious_Exception $e) { - $this->assertContains('Title and URL', $e->getMessage()); - } - } - - /** - * Ensures that the constructor throws an exception when the URL is missing - * - * @return void - */ - public function testConstructExceptionUrlMissing() - { - $post = array('d' => 'anything'); - try { - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->fail('Expected Zend_Service_Delicious_Exception not thrown'); - } catch (Zend_Service_Delicious_Exception $e) { - $this->assertContains('Title and URL', $e->getMessage()); - } - } - - /** - * Ensures that getUrl() behaves as expected - * - * @return void - */ - public function testGetUrl() - { - $url = 'something'; - $post = array( - 'd' => 'anything', - 'u' => $url - ); - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->assertEquals( - $url, - $result = $simplePost->getUrl(), - "Expected getUrl() to return '$url'; got '$result' instead" - ); - } - - /** - * Ensures that getTitle() behaves as expected - * - * @return void - */ - public function testGetTitle() - { - $title = 'something'; - $post = array( - 'd' => $title, - 'u' => 'anything' - ); - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->assertEquals( - $title, - $result = $simplePost->getTitle(), - "Expected getTitle() to return '$title'; got '$result' instead" - ); - } - - /** - * Ensures that getNotes() behaves as expected - * - * @return void - */ - public function testGetNotes() - { - $notes = 'something'; - $post = array( - 'd' => 'anything', - 'u' => 'anything', - 'n' => $notes - ); - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->assertEquals( - $notes, - $result = $simplePost->getNotes(), - "Expected getNotes() to return '$notes'; got '$result' instead" - ); - } - - /** - * Ensures that getTags() behaves as expected - * - * @return void - */ - public function testGetTags() - { - $tags = 'something'; - $post = array( - 'd' => 'anything', - 'u' => 'anything', - 't' => $tags - ); - $simplePost = new Zend_Service_Delicious_SimplePost($post); - $this->assertEquals( - $tags, - $result = $simplePost->getTags(), - "Expected getTags() to return '$tags'; got '$result' instead" - ); - } -} diff --git a/tests/Zend/Service/Delicious/SkipTests.php b/tests/Zend/Service/Delicious/SkipTests.php deleted file mode 100644 index e713a8d54b..0000000000 --- a/tests/Zend/Service/Delicious/SkipTests.php +++ /dev/null @@ -1,43 +0,0 @@ -markTestSkipped('Zend_Service_Delicious tests not enabled in TestConfiguration.php'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Ebay/AbstractTest.php b/tests/Zend/Service/Ebay/AbstractTest.php deleted file mode 100644 index 9868886ad1..0000000000 --- a/tests/Zend/Service/Ebay/AbstractTest.php +++ /dev/null @@ -1,200 +0,0 @@ -_concrete = new Zend_Service_Ebay_AbstractConcrete(array()); - } - - public function testConstructor() - { - $array = array('foo' => 'bar', - 'some' => 'value'); - $config = new Zend_Config($array); - - $concreteArray = new Zend_Service_Ebay_AbstractConcrete($array); - $concreteConfig = new Zend_Service_Ebay_AbstractConcrete($config); - - foreach (array_keys($array) as $option) { - $this->assertEquals($concreteArray->getOption($option), $concreteConfig->getOption($option)); - } - } - - public function testSetOptions() - { - $array = array('foo' => 'bar', - 'some' => 'value'); - $config = new Zend_Config($array); - $concreteArray = new Zend_Service_Ebay_AbstractConcrete(); - $concreteArray->setOption($array); - $concreteConfig = new Zend_Service_Ebay_AbstractConcrete(); - $concreteConfig->setOption($config); - foreach (array_keys($array) as $option) { - $this->assertEquals($concreteArray->getOption($option), $concreteConfig->getOption($option)); - } - - $this->assertNull($concreteArray->getOption('bar')); - $this->assertNull($concreteConfig->getOption('bar')); - } - - public function testOptionsToArrayInvalid() - { - $this->setExpectedException('Zend_Service_Ebay_Exception'); - Zend_Service_Ebay_Abstract::optionsToArray('invalid'); - } - - public function testGetOption() - { - $expected = array( - 'foo' => 1, - 'bar' => 2 - ); - - $this->_concrete->setOption('foo', 1) - ->setOption(array('bar' => 2)); - - $this->assertEquals(1, $this->_concrete->getOption('foo')); - $this->assertEquals(2, $this->_concrete->getOption('bar')); - $this->assertEquals($expected, $this->_concrete->getOption()); - - $this->_concrete->setOption( - array('foo' => 3, - 'bar' => 4 - ) - ); - $this->assertEquals(3, $this->_concrete->getOption('foo')); - $this->assertEquals(4, $this->_concrete->getOption('bar')); - } - - public function testHasOption() - { - $this->_concrete->setOption('foo', 1); - $this->assertTrue($this->_concrete->hasOption('foo')); - $this->assertFalse($this->_concrete->hasOption('bar')); - } - - public function testToEbayValue() - { - $this->assertSame('1', Zend_Service_Ebay_AbstractConcrete::toEbayValue(true)); - $this->assertSame('0', Zend_Service_Ebay_AbstractConcrete::toEbayValue(false)); - - require_once 'Zend/Date.php'; - $date = new Zend_Date(); - $this->assertSame($date->getIso(), Zend_Service_Ebay_AbstractConcrete::toEbayValue($date)); - - $date = new DateTime(); - $this->assertSame($date->format(DateTime::ISO8601), Zend_Service_Ebay_AbstractConcrete::toEbayValue($date)); - - $this->assertSame('10', Zend_Service_Ebay_AbstractConcrete::toEbayValue(10)); - } - - public function testToPhpValue() - { - $this->assertSame('10', Zend_Service_Ebay_Abstract::toPhpValue(10, 'integer')); - $this->assertSame('foo', Zend_Service_Ebay_Abstract::toPhpValue('foo', 'string')); - $this->assertSame(10.5, Zend_Service_Ebay_Abstract::toPhpValue(10.5, 'float')); - $this->assertTrue(true, Zend_Service_Ebay_Abstract::toPhpValue('true', 'boolean')); - } - - public function testToPhpValueInvalidType() - { - $this->setExpectedException('Zend_Service_Ebay_Exception'); - Zend_Service_Ebay_Abstract::toPhpValue('value', 'invalid-type'); - } - - public function testOptionsToNameValueSyntax() - { - $options = array( - 'paginationInput' => array( - 'entriesPerPage' => 5, - 'pageNumber' => 2 - ), - 'itemFilter' => array( - array( - 'name' => 'MaxPrice', - 'value' => 25, - 'paramName' => 'Currency', - 'paramValue' => 'USD' - ), - array( - 'name' => 'FreeShippingOnly', - 'value' => true - ), - array( - 'name' => 'ListingType', - 'value' => array( - 'AuctionWithBIN', - 'FixedPrice', - 'StoreInventory' - ) - ) - ), - 'productId' => array( - '' => 123, - 'type' => 'UPC' - ) - ); - - $expected = array( - 'paginationInput.entriesPerPage' => '5', - 'paginationInput.pageNumber' => '2', - 'itemFilter(0).name' => 'MaxPrice', - 'itemFilter(0).value' => '25', - 'itemFilter(0).paramName' => 'Currency', - 'itemFilter(0).paramValue' => 'USD', - 'itemFilter(1).name' => 'FreeShippingOnly', - 'itemFilter(1).value' => '1', - 'itemFilter(2).name' => 'ListingType', - 'itemFilter(2).value(0)' => 'AuctionWithBIN', - 'itemFilter(2).value(1)' => 'FixedPrice', - 'itemFilter(2).value(2)' => 'StoreInventory', - 'productId' => '123', - 'productId.@type' => 'UPC' - ); - - $this->assertEquals($expected, $this->_concrete->optionsToNameValueSyntax($options)); - } -} diff --git a/tests/Zend/Service/Ebay/AllTests.php b/tests/Zend/Service/Ebay/AllTests.php deleted file mode 100644 index d96a4edacb..0000000000 --- a/tests/Zend/Service/Ebay/AllTests.php +++ /dev/null @@ -1,61 +0,0 @@ -addTestSuite('Zend_Service_Ebay_AbstractTest'); - $suite->addTest(Zend_Service_Ebay_Finding_AllTests::suite()); - return $suite; - } -} -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Ebay_AllTests::main') { - Zend_Service_AllTests::main(); -} diff --git a/tests/Zend/Service/Ebay/Finding/AllTests.php b/tests/Zend/Service/Ebay/Finding/AllTests.php deleted file mode 100644 index c7c983bdd9..0000000000 --- a/tests/Zend/Service/Ebay/Finding/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTestSuite('Zend_Service_Ebay_OfflineTest'); - if (defined('TESTS_ZEND_SERVICE_EBAY_ONLINE_ENABLED') && - constant('TESTS_ZEND_SERVICE_EBAY_ONLINE_ENABLED') !== false) { - $suite->addTestSuite('Zend_Service_Ebay_Finding_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Ebay_Finding_OnlineSkipTest'); - } - return $suite; - } -} -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Ebay_Finding_AllTests::main') { - Zend_Service_AllTests::main(); -} diff --git a/tests/Zend/Service/Ebay/Finding/OfflineTest.php b/tests/Zend/Service/Ebay/Finding/OfflineTest.php deleted file mode 100644 index af8212007e..0000000000 --- a/tests/Zend/Service/Ebay/Finding/OfflineTest.php +++ /dev/null @@ -1,365 +0,0 @@ -_finding = new Zend_Service_Ebay_Finding('foo'); - } - - public function testClient() - { - $this->assertTrue($this->_finding->getClient() instanceof Zend_Rest_Client); - - require_once dirname(__FILE__) . '/_files/ClientCustom.php'; - $this->assertTrue($this->_finding->setClient(new ClientCustom()) instanceof Zend_Service_Ebay_Finding); - $this->assertTrue($this->_finding->getClient() instanceof ClientCustom); - - $this->setExpectedException('Zend_Service_Ebay_Finding_Exception'); - $this->_finding->setClient(new stdClass()); - } - - public function testConstructor() - { - $this->assertEquals('EBAY-US', $this->_finding->getOption(Zend_Service_Ebay_Finding::OPTION_GLOBAL_ID)); - $this->assertEquals('foo', $this->_finding->getOption(Zend_Service_Ebay_Finding::OPTION_APP_ID)); - - $options = array( - Zend_Service_Ebay_Finding::OPTION_APP_ID => 'app-id', - Zend_Service_Ebay_Finding::OPTION_GLOBAL_ID => 'EBAY-GB', - 'foo' => 'bar' - ); - $finding = new Zend_Service_Ebay_Finding($options); - $this->assertEquals('EBAY-GB', $finding->getOption(Zend_Service_Ebay_Finding::OPTION_GLOBAL_ID)); - $this->assertEquals('app-id', $finding->getOption(Zend_Service_Ebay_Finding::OPTION_APP_ID)); - $this->assertEquals('bar', $finding->getOption('foo')); - - $this->setExpectedException('Zend_Service_Ebay_Finding_Exception'); - $finding = new Zend_Service_Ebay_Finding(array('foo' => 'bar')); - } - - public function testResponseAbstract() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/get-search-keywords-recomendation.xml'); - - // no error xml - $response = $this->_createResponseKeywords($xml); - $this->assertNotNull($response->ack); - $this->assertNotNull($response->timestamp); - $this->assertNotNull($response->version); - } - - public function testErrorMessage() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/error.xml'); - - // xml with error inside - $response = $this->_createResponseKeywords($xml); - $this->assertNotNull($response->ack); - $this->assertNotNull($response->timestamp); - $this->assertNotNull($response->version); - $this->assertTrue($response->errorMessage instanceof Zend_Service_Ebay_Finding_Error_Message); - - // Zend_Service_Ebay_Finding_Error_Message - $object = $response->errorMessage; - $this->assertTrue($object->error instanceof Zend_Service_Ebay_Finding_Error_Data_Set); - - // Zend_Service_Ebay_Finding_Error_Data - $object = $object->error->current(); - $this->assertNotNull($object->category); - $this->assertNotNull($object->domain); - $this->assertNotNull($object->errorId); - $this->assertNotNull($object->message); - $this->assertTrue(is_array($object->parameter)); - $this->assertTrue(is_array($object->attributes('parameter', 'name'))); - $this->assertNotNull($object->severity); - $this->assertNotNull($object->subdomain); - - // missing attributes in XML - //$this->assertNotNull($object->exceptionId); - } - - public function testResponseKeywords() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/get-search-keywords-recomendation.xml'); - - $response = $this->_createResponseKeywords($xml); - $this->assertNotNull($response->keywords); - } - - public function testResponseItems() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $this->assertTrue($response->paginationOutput instanceof Zend_Service_Ebay_Finding_PaginationOutput); - $this->assertTrue($response->searchResult instanceof Zend_Service_Ebay_Finding_Search_Result); - $this->assertNotNull($response->attributes('searchResult', 'count')); - } - - public function testPaginationOutput() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $object = $response->paginationOutput; - $this->assertNotNull($object->entriesPerPage); - $this->assertNotNull($object->pageNumber); - $this->assertNotNull($object->totalEntries); - $this->assertNotNull($object->totalPages); - } - - public function testSearchResult() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $object = $response->searchResult; - $this->assertTrue($object->item instanceof Zend_Service_Ebay_Finding_Search_Item_Set); - } - - public function testSearchItem() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - // general attributes - $response->searchResult->item->seek(0); - $object = $response->searchResult->item->current(); - $this->assertTrue($object instanceof Zend_Service_Ebay_Finding_Search_Item); - $this->assertNotNull($object->autoPay); - $this->assertNotNull($object->country); - $this->assertTrue(is_array($object->galleryPlusPictureURL)); - $this->assertNotNull($object->galleryPlusPictureURL[0]); - $this->assertNotNull($object->galleryURL); - $this->assertNotNull($object->globalId); - $this->assertNotNull($object->itemId); - $this->assertTrue($object->listingInfo instanceof Zend_Service_Ebay_Finding_ListingInfo); - $this->assertNotNull($object->location); - $this->assertTrue(is_array($object->paymentMethod)); - $this->assertNotNull($object->paymentMethod[0]); - $this->assertNotNull($object->postalCode); - $this->assertTrue($object->primaryCategory instanceof Zend_Service_Ebay_Finding_Category); - $this->assertTrue($object->sellerInfo instanceof Zend_Service_Ebay_Finding_SellerInfo); - $this->assertTrue($object->sellingStatus instanceof Zend_Service_Ebay_Finding_SellingStatus); - $this->assertTrue($object->shippingInfo instanceof Zend_Service_Ebay_Finding_ShippingInfo); - $this->assertTrue($object->storeInfo instanceof Zend_Service_Ebay_Finding_Storefront); - $this->assertNotNull($object->title); - $this->assertNotNull($object->viewItemURL); - - // product id - $response->searchResult->item->seek(3); - $object = $response->searchResult->item->current(); - $this->assertNotNull($object->productId); - $this->assertNotNull($object->attributes('productId', 'type')); - - // sub category - $response->searchResult->item->seek(2); - $object = $response->searchResult->item->current(); - $this->assertTrue($object->secondaryCategory instanceof Zend_Service_Ebay_Finding_Category); - - // missing attributes in XML - //$this->assertNotNull($object->charityId); - //$this->assertNotNull($object->distance); - //$this->assertNotNull($object->attributes('distance', 'unit')); - } - - public function testListingInfo() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(4); - $object = $response->searchResult->item->current()->listingInfo; - $this->assertNotNull($object->bestOfferEnabled); - $this->assertNotNull($object->buyItNowAvailable); - $this->assertNotNull($object->buyItNowPrice); - $this->assertNotNull($object->attributes('buyItNowPrice', 'currencyId')); - $this->assertNotNull($object->convertedBuyItNowPrice); - $this->assertNotNull($object->attributes('convertedBuyItNowPrice', 'currencyId')); - $this->assertNotNull($object->endTime); - $this->assertNotNull($object->gift); - $this->assertNotNull($object->listingType); - $this->assertNotNull($object->startTime); - } - - public function testCategory() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(0); - $object = $response->searchResult->item->current()->primaryCategory; - $this->assertNotNull($object->categoryId); - $this->assertNotNull($object->categoryName); - } - - public function testSellerInfo() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(0); - $object = $response->searchResult->item->current()->sellerInfo; - $this->assertNotNull($object->feedbackRatingStar); - $this->assertNotNull($object->feedbackScore); - $this->assertNotNull($object->positiveFeedbackPercent); - $this->assertNotNull($object->sellerUserName); - $this->assertNotNull($object->topRatedSeller); - } - - public function testSellingStatus() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(1); - $object = $response->searchResult->item->current()->sellingStatus; - $this->assertNotNull($object->bidCount); - $this->assertNotNull($object->convertedCurrentPrice); - $this->assertNotNull($object->attributes('convertedCurrentPrice', 'currencyId')); - $this->assertNotNull($object->currentPrice); - $this->assertNotNull($object->attributes('currentPrice', 'currencyId')); - $this->assertNotNull($object->sellingState); - $this->assertNotNull($object->timeLeft); - } - - public function testShippingInfo() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(0); - $object = $response->searchResult->item->current()->shippingInfo; - $this->assertNotNull($object->shippingServiceCost); - $this->assertNotNull($object->attributes('shippingServiceCost', 'currencyId')); - $this->assertNotNull($object->shippingType); - $this->assertTrue(is_array($object->shipToLocations)); - $this->assertNotNull($object->shipToLocations[0]); - } - - public function testStorefront() - { - $xml = file_get_contents(dirname(__FILE__) . '/_files/find-items-advanced.xml'); - $response = $this->_createResponseItems($xml); - - $response->searchResult->item->seek(0); - $object = $response->searchResult->item->current()->storeInfo; - $this->assertNotNull($object->storeName); - $this->assertNotNull($object->storeURL); - } - - public function testResponseHistogramAspect() - { - // test histogram aspect - $xml = file_get_contents(dirname(__FILE__) . '/_files/histogram-aspect.xml'); - $response = $this->_createResponseHistograms($xml); - - $this->assertNotNull($response->aspectHistogramContainer); - $this->assertTrue($response->aspectHistogramContainer instanceof Zend_Service_Ebay_Finding_Aspect_Histogram_Container); - $this->assertNull($response->categoryHistogramContainer); - - // Zend_Service_Ebay_Finding_Aspect_Set - $object = $response->aspectHistogramContainer; - $this->assertTrue($object->aspect instanceof Zend_Service_Ebay_Finding_Aspect_Set); - - // Zend_Service_Ebay_Finding_Aspect - $object = $object->aspect->current(); - $this->assertTrue($object->valueHistogram instanceof Zend_Service_Ebay_Finding_Aspect_Histogram_Value_Set); - $this->assertTrue(is_array($object->attributes('valueHistogram', 'valueName'))); - - // Zend_Service_Ebay_Finding_Aspect_Histogram_Value - $object = $object->valueHistogram->current(); - $this->assertNotNull($object->count); - } - - public function testResponseHistogramCategory() - { - // test histogram aspect - $xml = file_get_contents(dirname(__FILE__) . '/_files/histogram-category.xml'); - $response = $this->_createResponseHistograms($xml); - - $this->assertNotNull($response->categoryHistogramContainer); - $this->assertTrue($response->categoryHistogramContainer instanceof Zend_Service_Ebay_Finding_Category_Histogram_Container); - $this->assertNull($response->aspectHistogramContainer); - - // Zend_Service_Ebay_Finding_Category_Histogram_Container - $object = $response->categoryHistogramContainer; - $this->assertTrue($object->categoryHistogram instanceof Zend_Service_Ebay_Finding_Category_Histogram_Set); - - // Zend_Service_Ebay_Finding_Category_Histogram - $object = $object->categoryHistogram->current(); - $this->assertTrue($object instanceof Zend_Service_Ebay_Finding_Category_Histogram); - $this->assertTrue($object->childCategoryHistogram instanceof Zend_Service_Ebay_Finding_Category_Histogram_Set); - $this->assertNotNull($object->count); - } - - protected function _readXML($xml) - { - $dom = new DOMDocument(); - $dom->loadXML($xml); - return $dom; - } - - protected function _createResponseItems($xml) - { - return new Zend_Service_Ebay_Finding_Response_Items($this->_readXML($xml)->firstChild); - } - - protected function _createResponseHistograms($xml) - { - return new Zend_Service_Ebay_Finding_Response_Histograms($this->_readXML($xml)->firstChild); - } - - protected function _createResponseKeywords($xml) - { - return new Zend_Service_Ebay_Finding_Response_Keywords($this->_readXML($xml)->firstChild); - } -} diff --git a/tests/Zend/Service/Ebay/Finding/OnlineTest.php b/tests/Zend/Service/Ebay/Finding/OnlineTest.php deleted file mode 100644 index bd7a2f16c5..0000000000 --- a/tests/Zend/Service/Ebay/Finding/OnlineTest.php +++ /dev/null @@ -1,193 +0,0 @@ -_finding = new Zend_Service_Ebay_Finding(constant('TESTS_ZEND_SERVICE_EBAY_ONLINE_APPID')); - $this->_httpClientOriginal = Zend_Rest_Client::getHttpClient(); - Zend_Rest_Client::setHttpClient(new Zend_Http_Client()); - } - - public function tearDown() - { - Zend_Rest_Client::setHttpClient($this->_httpClientOriginal); - } - - public function testInvalidAppId() - { - $this->_finding->setOption(Zend_Service_Ebay_Abstract::OPTION_APP_ID, 'foo'); - $appId = $this->_finding->getOption(Zend_Service_Ebay_Abstract::OPTION_APP_ID); - $this->assertEquals('foo', $appId); - try { - $response = $this->_finding->findItemsByKeywords('harry+potter'); - $this->fail('No exception found'); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Service_Ebay_Finding_Exception); - $this->assertContains('eBay error', $e->getMessage()); - } - } - - public function testResponseTypeFinds() - { - $services = array('findItemsAdvanced' => array('tolkien'), - 'findItemsByCategory' => array('10181'), - 'findItemsByKeywords' => array('harry+potter'), - 'findItemsByProduct' => array('53039031'), - 'findItemsInEbayStores' => array("Laura_Chen's_Small_Store")); - - $item = null; - $category = null; - $store = null; - foreach ($services as $service => $params) { - $response = call_user_func_array(array($this->_finding, $service), $params); - $this->assertTrue($response instanceof Zend_Service_Ebay_Finding_Response_Items); - if (!$item && $response->attributes('searchResult', 'count') > 0) { - $item = $response->searchResult->item->current(); - } - if (!$category && $response->attributes('searchResult', 'count') > 0) { - foreach ($response->searchResult->item as $node) { - if ($node->primaryCategory) { - $category = $node->primaryCategory; - } - } - } - if (!$store && $response->attributes('searchResult', 'count') > 0) { - foreach ($response->searchResult->item as $node) { - if ($node->storeInfo) { - $store = $node->storeInfo; - } - } - } - } - - $response2 = $item->findItemsByProduct($this->_finding); - $this->assertTrue($response2 instanceof Zend_Service_Ebay_Finding_Response_Items); - - $response3 = $category->findItems($this->_finding, array()); - $this->assertTrue($response3 instanceof Zend_Service_Ebay_Finding_Response_Items); - - $response4 = $store->findItems($this->_finding, array()); - $this->assertTrue($response4 instanceof Zend_Service_Ebay_Finding_Response_Items); - } - - public function testResponseTypeGets() - { - $response = $this->_finding->getSearchKeywordsRecommendation('hary'); - $this->assertTrue($response instanceof Zend_Service_Ebay_Finding_Response_Keywords); - - $response2 = $response->findItems($this->_finding, array()); - $this->assertTrue($response2 instanceof Zend_Service_Ebay_Finding_Response_Items); - - $response3 = $this->_finding->getHistograms('11233'); - $this->assertTrue($response3 instanceof Zend_Service_Ebay_Finding_Response_Histograms); - } - - public function testItemsPagination() - { - // page 1 - // make sure this search will generate more than one page as result - $page1 = $this->_finding->findItemsByKeywords('laptop'); - $this->assertEquals(1, $page1->paginationOutput->pageNumber); - - // out of range, page #0 - try { - $page1->page($this->_finding, 0); - $this->fail('No exception found for page #0'); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Service_Ebay_Finding_Exception); - $this->assertContains('Page number ', $e->getMessage()); - } - - // out of range, one page after last one - try { - $number = $page1->paginationOutput->totalPages + 1; - $page1->page($this->_finding, $number); - $this->fail("No exception found for page out of range #$number"); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Service_Ebay_Finding_Exception); - $this->assertContains('Page number ', $e->getMessage()); - } - - // page next - $page2 = $page1->pageNext($this->_finding); - $this->assertEquals(2, $page2->paginationOutput->pageNumber); - - // previous - $previous = $page2->pagePrevious($this->_finding); - $this->assertEquals(1, $previous->paginationOutput->pageNumber); - $this->assertNull($page1->pagePrevious($this->_finding)); - - // first - $first = $page2->pageFirst($this->_finding); - $this->assertEquals(1, $first->paginationOutput->pageNumber); - - // last - $last = $page2->pageLast($this->_finding); - $this->assertNotEquals(1, $last->paginationOutput->pageNumber); - - // page #2 - $some = $page1->page($this->_finding, 2); - $this->assertEquals(2, $some->paginationOutput->pageNumber); - } -} - -/** - * @category Zend - * @package Zend_Service_Ebay - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Ebay - */ -class Zend_Service_Ebay_Finding_OnlineSkipTest extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Service_Ebay online tests not enabled with an APPID in TestConfiguration.php'); - } - - public function testNothing() - { - } -} diff --git a/tests/Zend/Service/Ebay/Finding/_files/ClientCustom.php b/tests/Zend/Service/Ebay/Finding/_files/ClientCustom.php deleted file mode 100644 index 0c9597bfbe..0000000000 --- a/tests/Zend/Service/Ebay/Finding/_files/ClientCustom.php +++ /dev/null @@ -1,3 +0,0 @@ -Warning59MarketplaceWarningRequestNo recommendation was identified for the submitted keywords.Search1.5.02010-08-08T13:53:40.888Z \ No newline at end of file diff --git a/tests/Zend/Service/Ebay/Finding/_files/find-items-advanced.xml b/tests/Zend/Service/Ebay/Finding/_files/find-items-advanced.xml deleted file mode 100644 index 5ba967863b..0000000000 --- a/tests/Zend/Service/Ebay/Finding/_files/find-items-advanced.xml +++ /dev/null @@ -1 +0,0 @@ -Success1.5.02010-08-07T19:57:39.069Z160459522080SUMMER SALE: HARRY POTTER PRISONER FILM CARDZ CARD SETEBAY-US219Otherhttp://thumbs1.ebaystatic.com/pict/1604595220808080_1.jpghttp://cgi.ebay.com/SUMMER-SALE-HARRY-POTTER-PRISONER-FILM-CARDZ-CARD-SET-/160459522080?pt=LH_DefaultDomain_0PayPalfalse18360Stroudsburg,PA,USAUSmhoponhophttp://stores.ebay.com/mhoponhopmhoponhop80814100.0PurpleShootingtrue4.7FlatWorldwide6.06.0ActiveP14DT6H22M28Sfalsefalse2010-07-23T02:15:06.000Z2010-08-22T02:20:06.000ZFixedPricefalsehttp://galleryplus.ebayimg.com/ws/web/160459522080_1_0_1.jpg380255632254December Boys (DVD}-DANIEL RADCLIFFE(of Harry Potter}EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/3802556322548080_1.jpghttp://cgi.ebay.com/December-Boys-DVD-DANIEL-RADCLIFFE-of-Harry-Potter-/380255632254?pt=US_DVD_HD_DVD_Blu_ray63254525PayPalfalse95401Santa Rosa,CA,USAUSdisctrip3423100.0Redfalse3.0FlatUS2.642.640ActiveP0DT0H0M41Sfalsefalse2010-07-31T19:58:19.000Z2010-08-07T19:58:19.000ZAuctionfalse3000Like New230504848541Harry Potter & The Philosopher's Stone Paperback 1st EdEBAY-GB171220Children’s Fiction29798Harry Potterhttp://thumbs2.ebaystatic.com/pict/2305048485418080_1.jpghttp://cgi.ebay.com/Harry-Potter-Philosophers-Stone-Paperback-1st-Ed-/230504848541?pt=UK_Collectables_SciFi_fantasyCollectables_EHMOCCPayPalPersonalCheckfalseNN47PWUnited KingdomGBebidder123gerrard816100.0PurplefalseNotSpecifiedAUAmericasEuropeAsia4.997.971ActiveP0DT0H1M22Sfalsefalse2010-07-28T19:59:00.000Z2010-08-07T19:59:00.000ZAuctionfalse3000Used280542496395Harry Potter and the Goblet of Fire PlayStation 2 EBAY-US139973Gameshttp://thumbs4.ebaystatic.com/pict/2805424963958080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Goblet-Fire-PlayStation-2-/280542496395?pt=Video_Games_Games47834573PayPalfalse97405Eugene,OR,USAUSdrinkinwind107100.0Turquoisefalse2.99FlatUS2.992.990ActiveP0DT0H1M40Sfalsefalse2010-07-31T19:59:18.000Z2010-08-07T19:59:18.000ZAuctionfalse3000Like New350378478904Harry Potter and the Sorcerer's Stone (VHS, 2002, In...EBAY-US309VHShttp://thumbs1.ebaystatic.com/pict/3503784789048080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Sorcerers-Stone-VHS-2002-In-/350378478904?pt=VHS3411414PayPalfalse85643Willcox,AZ,USAUSEverything Under the Sun and Morehttp://stores.ebay.com/Everything-Under-the-Sun-and-Moremissgrape0_31760100.0Redfalse2.99FlatDomesticCalculatedInternationalWorldwide0.990.990ActiveP0DT0H2M5Sfalsetrue3.03.02010-07-31T19:59:43.000Z2010-08-07T19:59:43.000ZAuctionWithBINfalse3000Like New370417424727Harry Potter and the Order of the Phoenix (Two-Disc SpeEBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs4.ebaystatic.com/pict/3704174247278080_3.jpghttp://cgi.ebay.com/Harry-Potter-and-Order-Phoenix-Two-Disc-Spe-/370417424727?pt=US_DVD_HD_DVD_Blu_ray62940250PayPaltrue03051Hudson,NH,USAUSpieceofmindbookshttp://stores.ebay.com/pieceofmindbookspieceofmindbooks30728399.5RedShootingtrue0.0FreeUS4.654.65ActiveP29DT7H22M19Sfalsefalse2010-08-07T03:19:57.000Z2010-09-06T03:19:57.000ZFixedPricefalse3000Like New290459703376LEGO 100 Pc Lot &1 MINIFIG Star Wars Pirate Castle Set EBAY-US19002Parts & Pieceshttp://thumbs1.ebaystatic.com/pict/2904597033768080_1.jpghttp://cgi.ebay.com/LEGO-100-Pc-Lot-1-MINIFIG-Star-Wars-Pirate-Castle-Set-/290459703376?pt=LH_DefaultDomain_0PayPalfalse17754Montoursville,PA,USAUSderek2676201099.7Redtrue3.99FlatUS0.990.991ActiveP0DT0H2M54Sfalsefalse2010-07-31T20:00:32.000Z2010-08-07T20:00:32.000ZAuctionfalse3000Used250613764652HARRY POTTER and the SORCERER'S STONE 6 CASSETTES NEWEBAY-US29798Harry Potterhttp://thumbs1.ebaystatic.com/pict/2506137646528080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-and-SORCERERS-STONE-6-CASSETTES-NEW-/250613764652?pt=LH_DefaultDomain_0PayPalfalse19027Elkins Park,PA,USAUSMr.Larry Storehttp://stores.ebay.com/Mr-Larry-Storemr.larry8351100.0GreentrueCalculatedUS14.9914.99ActiveP2DT3H51M56Sfalsefalse2010-04-11T23:44:34.000Z2010-08-09T23:49:34.000ZStoreInventoryfalsehttp://galleryplus.ebayimg.com/ws/web/250613764652_1_0_1.jpgNew280542497002Harry Potter and the Order of the Phoenix by J. K. R...EBAY-US377Fiction & Literaturehttp://thumbs3.ebaystatic.com/pict/2805424970028080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Order-Phoenix-J-K-R-/280542497002?pt=US_Fiction_Books2327833PayPalfalse30103Adairsville,GA,USAUSlongmore8220139100.0Yellowfalse3.99FlatUS0.990.990ActiveP0DT0H3M23Sfalsefalse2010-07-31T20:01:01.000Z2010-08-07T20:01:01.000ZAuctionfalse5000Good250675548162SONY PSP GO SYSTEM+44 GAMES+MOVIES☼GTA☼GOD OF WAR☼RAREEBAY-US139971Systemshttp://thumbs3.ebaystatic.com/pict/2506755481628080_1.jpghttp://cgi.ebay.com/SONY-PSP-GO-SYSTEM-44-GAMES-MOVIES-GTA-GOD-WAR-RARE-/250675548162?pt=Video_Games78481516PayPaltrue10060New York,NY,USAUSnoahs_arc055398.2Bluefalse0.0FreeUSCAGBAUDE224.0224.017ActiveP0DT0H3M39Sfalsefalse2010-07-31T20:01:17.000Z2010-08-07T20:01:17.000ZAuctionfalse3000Used360286225308Harry Potter Sorcerer's Stone Widevision Card LOT of 40EBAY-US73570Harry Potterhttp://thumbs1.ebaystatic.com/pict/3602862253088080_1.jpghttp://cgi.ebay.com/Harry-Potter-Sorcerers-Stone-Widevision-Card-LOT-40-/360286225308?pt=LH_DefaultDomain_0PayPalfalse11530Garden City,NY,USAUSATSCollectableshttp://stores.ebay.com/ATSCollectablesfranker3213424100.0YellowShootingfalseCalculatedWorldwide0.990.990ActiveP0DT0H5M32Sfalsefalse2010-07-31T20:03:10.000Z2010-08-07T20:03:10.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/360286225308_1_0_1.jpg1000New280542498000Harry Potter and the Chamber of Secrets by J. K. Row...EBAY-US279Children & Young Adultshttp://thumbs1.ebaystatic.com/pict/2805424980008080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Chamber-Secrets-J-K-Row-/280542498000?pt=US_Childrens_Books228742PayPalfalse30103Adairsville,GA,USAUSlongmore8220139100.0Yellowfalse3.99FlatUS0.990.990ActiveP0DT0H6M7Sfalsefalse2010-07-31T20:03:45.000Z2010-08-07T20:03:45.000ZAuctionfalse6000Acceptable290459704504Harry Potter and the Half-Blood Prince Blu-ray - MINT!EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs1.ebaystatic.com/pict/2904597045048080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Half-Blood-Prince-Blu-ray-MINT-/290459704504?pt=US_DVD_HD_DVD_Blu_ray78461267PayPalfalse19606Reading,PA,USAUSbluraybuff2958100.0Redfalse2.99FlatWorldwide6.56.54ActiveP0DT0H6M17Sfalsefalse2010-07-31T20:03:55.000Z2010-08-07T20:03:55.000ZAuctionfalse3000Like New390194995316TOM FELTON HARRY POTTER 8X10 PHOTO 1121EBAY-US60329Colorhttp://thumbs1.ebaystatic.com/pict/3901949953168080_1.jpghttp://cgi.ebay.com/TOM-FELTON-HARRY-POTTER-8X10-PHOTO-1121-/390194995316?pt=LH_DefaultDomain_0PayPalfalseUSAUSMovie Stars Pixshttp://stores.ebay.com/Movie-Stars-Pixsmoviestarspixs7650100.0Greentrue3.99FlatWorldwide7.57.5ActiveP2DT17H40M10Sfalsefalse2010-05-12T13:32:48.000Z2010-08-10T13:37:48.000ZStoreInventoryfalse220646489736The Music of John Williams: 40 Years of Film Music b...EBAY-US4 Disc Set307CDshttp://thumbs1.ebaystatic.com/pict/2206464897368080_1.jpghttp://cgi.ebay.com/Music-John-Williams-40-Years-Film-Music-b-/220646489736?pt=Music_CDs3517876PayPalfalse95237Lockeford,CA,USAUSrowdy185278100.0Turquoisefalse3.0FlatUS1.51.53ActiveP0DT0H7M28Sfalsefalse2010-07-31T20:05:06.000Z2010-08-07T20:05:06.000ZAuctionfalse3000Like New1504744683772009 SDCC Comic Con Harry Potter Costume Prop Card SetEBAY-USComic Con 4 card set #119/25073570Harry Potterhttp://thumbs2.ebaystatic.com/pict/1504744683778080_1.jpghttp://cgi.ebay.com/2009-SDCC-Comic-Con-Harry-Potter-Costume-Prop-Card-Set-/150474468377?pt=LH_DefaultDomain_0PayPalfalse95831Sacramento,CA,USAUSmuggle-4-life825100.0Purpletrue10.0FlatUS36.036.03ActiveP0DT0H8M9Sfalsefalse2010-07-31T20:05:47.000Z2010-08-07T20:05:47.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/150474468377_1_0_1.jpg280542498858Harry Potter and the Prisoner of Azkaban by J. K. Ro...EBAY-US377Fiction & Literaturehttp://thumbs3.ebaystatic.com/pict/2805424988588080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Prisoner-Azkaban-J-K-Ro-/280542498858?pt=US_Fiction_Books745955PayPalfalse30103Adairsville,GA,USAUSlongmore8220139100.0Yellowfalse3.99FlatUS0.990.991ActiveP0DT0H8M37Sfalsefalse2010-07-31T20:06:15.000Z2010-08-07T20:06:15.000ZAuctionfalse4000Very Good250675550601SONY PSP GO SYSTEM+44 GAMES+MOVIES☼GTA☼GOD OF WAR☼MINT☼EBAY-US139971Systemshttp://thumbs2.ebaystatic.com/pict/2506755506018080_1.jpghttp://cgi.ebay.com/SONY-PSP-GO-SYSTEM-44-GAMES-MOVIES-GTA-GOD-WAR-MINT-/250675550601?pt=Video_Games78481516PayPaltrue10060New York,NY,USAUSnoahs_arc055398.2Bluefalse0.0FreeUSCAGBAUDE223.5223.524ActiveP0DT0H8M48Sfalsefalse2010-07-31T20:06:26.000Z2010-08-07T20:06:26.000ZAuctionfalse1000New28054439464210pcs Harry Potter Children Watch,H5-10EBAY-US31387Wristwatcheshttp://thumbs3.ebaystatic.com/pict/2805443946428080_1.jpghttp://cgi.ebay.com/10pcs-Harry-Potter-Children-Watch-H5-10-/280544394642?pt=WristwatchesPayPalfalse518000ChinaCNyinlin20112010228799.4Redfalse13.79FlatWorldwide0.010.010ActiveP0DT0H9M7Sfalsefalse2010-08-04T20:06:45.000Z2010-08-07T20:06:45.000ZAuctionfalse1500New without tags190425346817Harry Potter Dumbledore With Phoenix Sf Music BoxEBAY-US13826San Francisco Music Boxhttp://thumbs2.ebaystatic.com/pict/1904253468178080_1.jpghttp://cgi.ebay.com/Harry-Potter-Dumbledore-Phoenix-Sf-Music-Box-/190425346817?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalse29585Pawleys Island,SC,USAUSSweetheart Collectibleshttp://stores.ebay.com/Sweetheart-Collectiblesshatzee7010299.9PurpleShootingtrue12.0FlatWorldwide59.9959.99ActiveP21DT23H26M11Sfalsefalse2010-07-30T19:18:49.000Z2010-08-29T19:23:49.000ZFixedPricefalsehttp://galleryplus.ebayimg.com/ws/web/190425346817_1_0_1.jpg1000New260645919391New Design Harry Potter Boys Girls Wrist Watch Gift WCCEBAY-US31387Wristwatcheshttp://thumbs4.ebaystatic.com/pict/2606459193918080_1.jpghttp://cgi.ebay.com/New-Design-Harry-Potter-Boys-Girls-Wrist-Watch-Gift-WCC-/260645919391?pt=WristwatchesPayPalfalse518101Hong KongHKchenlistore8097.6Bluefalse4.99FlatWorldwide0.010.010ActiveP0DT0H9M34Sfalsefalse2010-08-04T20:07:12.000Z2010-08-07T20:07:12.000ZAuctionfalse1500New without tags220646491428HARRY POTTER and THE GOBLET of FIRE ~ HARDCOVER BOOKEBAY-US377Fiction & Literaturehttp://thumbs1.ebaystatic.com/pict/2206464914288080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-and-GOBLET-FIRE-HARDCOVER-BOOK-/220646491428?pt=US_Fiction_Books1824903PayPalfalse53086Slinger,WI,USAUSsurvivor1098115399.3Redfalse4.0FlatUS5.55.58ActiveP0DT0H9M59Sfalsefalse2010-07-31T20:07:37.000Z2010-08-07T20:07:37.000ZAuctionfalse3000Like New190425715672Twilight (Blu-ray Disc, 2009)EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs1.ebaystatic.com/pict/1904257156728080_1.jpghttp://cgi.ebay.com/Twilight-Blu-ray-Disc-2009-/190425715672?pt=US_DVD_HD_DVD_Blu_ray71923946PayPalfalse95757Elk Grove,CA,USAUSfingonthevaliant211100.0Turquoisefalse3.0FlatUS13.513.57ActiveP0DT0H10M14Sfalsefalse2010-07-31T20:07:52.000Z2010-08-07T20:07:52.000ZAuctionfalse3000Like New2606459199692PC Design Harry Potter Boys Girls Wrist Watch Gift WCAEBAY-US31387Wristwatcheshttp://thumbs2.ebaystatic.com/pict/2606459199698080_1.jpghttp://cgi.ebay.com/2PC-Design-Harry-Potter-Boys-Girls-Wrist-Watch-Gift-WCA-/260645919969?pt=WristwatchesPayPalfalse518101Hong KongHKchenlistore8097.6Bluefalse9.99FlatWorldwide0.010.010ActiveP0DT0H10M49Sfalsefalse2010-08-04T20:08:27.000Z2010-08-07T20:08:27.000ZAuctionfalse1500New without tags380253697765Crookshanks, Harry Potter by Robert TonnerEBAY-US11698Otherhttp://thumbs2.ebaystatic.com/pict/3802536977658080_1.jpghttp://cgi.ebay.com/Crookshanks-Harry-Potter-Robert-Tonner-/380253697765?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalse06903Stamford,CT,USAUSDolls and Gifts from Dianehttp://stores.ebay.com/Dolls-and-Gifts-from-Dianeddrake555541rn1292100.0RedtrueCalculatedWorldwide30.030.0ActiveP16DT4H57M9Sfalsefalse2010-07-25T00:49:47.000Z2010-08-24T00:54:47.000ZStoreInventoryfalse1000New250676638357Harry Potter TCG chamber of secrets booster packsEBAY-USTotal of 33 MINT cards - 10 in each pack !22727Harry Potterhttp://thumbs2.ebaystatic.com/pict/2506766383578080_1.jpghttp://cgi.ebay.com/Harry-Potter-TCG-chamber-secrets-booster-packs-/250676638357?pt=LH_DefaultDomain_0PayPalfalse08054Mount Laurel,NJ,USAUSTimelesstoysllchttp://stores.ebay.com/Timelesstoysllctimelesstoysllc348199.8Redtrue5.0FlatDomesticCalculatedInternationalWorldwide0.990.990ActiveP0DT0H10M53Sfalsefalse2010-08-02T20:08:31.000Z2010-08-07T20:08:31.000ZAuctionfalse1000New370409719964Harry Potter Goblet of Fire Birthday Party Invitations EBAY-US26393Invitationshttp://thumbs1.ebaystatic.com/pict/3704097199648080_1.jpghttp://cgi.ebay.com/Harry-Potter-Goblet-Fire-Birthday-Party-Invitations-/370409719964?pt=LH_DefaultDomain_0CashOnPickupPayPalfalse75604Longview,TX,USAUSLittle Bit of Sunshine Texashttp://stores.ebay.com/Little-Bit-of-Sunshine-Texasmomcty378399.3Redfalse3.0FlatWorldwide2.892.89ActiveP9DT22H13M33Sfalsefalse2010-07-18T18:06:11.000Z2010-08-17T18:11:11.000ZStoreInventoryfalse1000New280542500077Harry Potter and the Sorcerer's Stone by J. K. Rowli...EBAY-US377Fiction & Literaturehttp://thumbs2.ebaystatic.com/pict/2805425000778080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Sorcerers-Stone-J-K-Rowli-/280542500077?pt=US_Fiction_Books913179PayPalfalse30103Adairsville,GA,USAUSlongmore8220139100.0Yellowfalse3.99FlatUS0.990.990ActiveP0DT0H11M13Sfalsefalse2010-07-31T20:08:51.000Z2010-08-07T20:08:51.000ZAuctionfalse4000Very Good120602921530JK Rowling Harry Potter Deathly Hallows SIGNED DeluxeEBAY-GB29223Antiquarian & Collectablehttp://thumbs3.ebaystatic.com/pict/1206029215308080_1.jpghttp://cgi.ebay.com/JK-Rowling-Harry-Potter-Deathly-Hallows-SIGNED-Deluxe-/120602921530?pt=Antiquarian_Books_UKMOCCPayPalPersonalCheckfalseUnited KingdomGB8940cheryl13499.0Turquoisefalse41.09FlatAUAmericasEuropeAsia103.01164.5531ActiveP0DT0H12M42Sfalsefalse2010-07-31T20:10:20.000Z2010-08-07T20:10:20.000ZAuctionfalse290460323136Harry Potter TCG booster packsEBAY-US22727Harry Potterhttp://thumbs1.ebaystatic.com/pict/2904603231368080_1.jpghttp://cgi.ebay.com/Harry-Potter-TCG-booster-packs-/290460323136?pt=LH_DefaultDomain_0PayPalfalse08054Mount Laurel,NJ,USAUSTimelesstoysllchttp://stores.ebay.com/Timelesstoysllctimelesstoysllc348199.8Redtrue5.0FlatDomesticCalculatedInternationalWorldwide0.990.990ActiveP0DT0H12M52Sfalsefalse2010-08-02T20:10:30.000Z2010-08-07T20:10:30.000ZAuctionfalse1000New220646494441HARRY POTTER and THE PRISONER of AZKABAN ~ HARDCOVER EBAY-US377Fiction & Literaturehttp://thumbs2.ebaystatic.com/pict/2206464944418080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-and-PRISONER-AZKABAN-HARDCOVER-/220646494441?pt=US_Fiction_Books745955PayPalfalse53086Slinger,WI,USAUSsurvivor1098115399.3Redfalse3.0FlatUS2.752.755ActiveP0DT0H16M11Sfalsefalse2010-07-31T20:13:49.000Z2010-08-07T20:13:49.000ZAuctionfalse4000Very Good360286228821Harry Potter Sorcerer's Stone Widevision Card LOT of 40EBAY-US73570Harry Potterhttp://thumbs2.ebaystatic.com/pict/3602862288218080_1.jpghttp://cgi.ebay.com/Harry-Potter-Sorcerers-Stone-Widevision-Card-LOT-40-/360286228821?pt=LH_DefaultDomain_0PayPalfalse11530Garden City,NY,USAUSATSCollectableshttp://stores.ebay.com/ATSCollectablesfranker3213424100.0YellowShootingfalseCalculatedWorldwide0.990.990ActiveP0DT0H18M7Sfalsefalse2010-07-31T20:15:45.000Z2010-08-07T20:15:45.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/360286228821_1_0_1.jpg1000New380253160655WOW!!! CHARMED "PAIGE", ROSE McGOWAN T-SHIRT!!! COOL!!!EBAY-US60409Colorhttp://thumbs4.ebaystatic.com/pict/3802531606558080_1.jpghttp://cgi.ebay.com/WOW-CHARMED-PAIGE-ROSE-McGOWAN-T-SHIRT-COOL-/380253160655?pt=LH_DefaultDomain_0PayPalfalse33708Saint Petersburg,FL,USAUSWOLFSONG PASSIONShttp://stores.ebay.com/WOLFSONG-PASSIONSmoonwolfcreations2030100.0RedtrueCalculatedWorldwide19.9919.99ActiveP14DT1H57M9Sfalsefalse2010-07-22T21:49:47.000Z2010-08-21T21:54:47.000ZStoreInventoryfalse360286228865Harry Potter Sorcerer's Stone Widevision Card LOT of 40EBAY-US73570Harry Potterhttp://thumbs2.ebaystatic.com/pict/3602862288658080_1.jpghttp://cgi.ebay.com/Harry-Potter-Sorcerers-Stone-Widevision-Card-LOT-40-/360286228865?pt=LH_DefaultDomain_0PayPalfalse11530Garden City,NY,USAUSATSCollectableshttp://stores.ebay.com/ATSCollectablesfranker3213424100.0YellowShootingfalseCalculatedWorldwide0.990.990ActiveP0DT0H18M12Sfalsefalse2010-07-31T20:15:50.000Z2010-08-07T20:15:50.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/360286228865_1_0_1.jpg1000New360286228914Harry Potter Sorcerer's Stone Widevision Card LOT of 81EBAY-US73570Harry Potterhttp://thumbs3.ebaystatic.com/pict/3602862289148080_1.jpghttp://cgi.ebay.com/Harry-Potter-Sorcerers-Stone-Widevision-Card-LOT-81-/360286228914?pt=LH_DefaultDomain_0PayPalfalse11530Garden City,NY,USAUSATSCollectableshttp://stores.ebay.com/ATSCollectablesfranker3213424100.0YellowShootingfalseCalculatedWorldwide0.990.990ActiveP0DT0H18M17Sfalsefalse2010-07-31T20:15:55.000Z2010-08-07T20:15:55.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/360286228914_1_0_1.jpg1000New190425718270Coloring books for children all ages over 4000 pages CDEBAY-US46753Up to 5 Itemshttp://thumbs3.ebaystatic.com/pict/1904257182708080_1.jpghttp://cgi.ebay.com/Coloring-books-children-all-ages-over-4000-pages-CD-/190425718270?pt=LH_DefaultDomain_0PayPalfalseLatviaLVdimsm1100.0Nonefalse6.0FlatWorldwide0.990.990ActiveP0DT0H20M10Sfalsefalse2010-08-01T02:17:50.000Z2010-08-07T20:17:48.000ZAuctionfalse1000New370415013911LEGO 4754 HARRY POTTER HAGRID'S HUT NEW FACTORY SEALED EBAY-ENCA19011Otherhttp://thumbs4.ebaystatic.com/pict/3704150139118080_1.jpghttp://cgi.ebay.com/LEGO-4754-HARRY-POTTER-HAGRIDS-HUT-NEW-FACTORY-SEALED-/370415013911?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide91.091.017ActiveP0DT0H20M12Sfalsefalse2010-07-31T20:17:50.000Z2010-08-07T20:17:50.000ZAuctionfalse1000New150476107854Harry Potter and The Sorcerers Stone Ultimate EditionEBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/1504761078548080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Sorcerers-Stone-Ultimate-Edition-/150476107854?pt=US_DVD_HD_DVD_Blu_ray78421686PayPalfalse10970Pomona,NY,USAUSbankwithbarry1016100.0Redtrue2.99FlatUSCA21.4921.4913ActiveP0DT0H21M37Sfalsefalse2010-08-04T20:19:15.000Z2010-08-07T20:19:15.000ZAuctionfalse1000Brand New380256497934WOW! CHARMED 8X10 PHOTO "THE BARE WITCH PROJECT" ! #672EBAY-US60409Colorhttp://thumbs3.ebaystatic.com/pict/3802564979348080_1.jpghttp://cgi.ebay.com/WOW-CHARMED-8X10-PHOTO-THE-BARE-WITCH-PROJECT-672-/380256497934?pt=LH_DefaultDomain_0PayPalfalse33708Saint Petersburg,FL,USAUSWOLFSONG PASSIONShttp://stores.ebay.com/WOLFSONG-PASSIONSmoonwolfcreations2030100.0RedtrueCalculatedWorldwide4.994.99ActiveP26DT4H20M57Sfalsefalse2010-08-04T00:13:35.000Z2010-09-03T00:18:35.000ZStoreInventoryfalse270615818272Harry Potter and the Prisoner of Azkaban [Original M...EBAY-USIncludes Harry Potter & the Goblet of Fire soundtrack!!307CDshttp://thumbs1.ebaystatic.com/pict/2706158182728080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Prisoner-Azkaban-Original-M-/270615818272?pt=Music_CDs30499353PayPalfalse60586Plainfield,IL,USAUSfoowahudunny815129100.0Turquoisefalse3.0FlatUS3.53.56ActiveP0DT0H21M54Sfalsefalse2010-07-31T20:19:32.000Z2010-08-07T20:19:32.000ZAuctionfalse4000Very Good200503473988HARRY POTTER / JUSTIN BIEBER RUSSIAN CENTERFOLD POSTEREBAY-US29798Harry Potterhttp://thumbs1.ebaystatic.com/pict/2005034739888080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-JUSTIN-BIEBER-RUSSIAN-CENTERFOLD-POSTER-/200503473988?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalseEstoniaEEpostcartman1377100.0Redfalse4.0FlatWorldwide0.990.990ActiveP0DT0H21M57Sfalsefalse2010-07-31T20:19:35.000Z2010-08-07T20:19:35.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/200503473988_1_0_1.jpg1000New370415014779LEGO 4755 HARRY POTTER KNIGHT BUS NEW FACTORY SEALED EBAY-ENCA19011Otherhttp://thumbs4.ebaystatic.com/pict/3704150147798080_1.jpghttp://cgi.ebay.com/LEGO-4755-HARRY-POTTER-KNIGHT-BUS-NEW-FACTORY-SEALED-/370415014779?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide76.076.019ActiveP0DT0H23M10Sfalsefalse2010-07-31T20:20:48.000Z2010-08-07T20:20:48.000ZAuctionfalse1000New370415014893FRANCE SC 3305A HARRY POTTER BOOKLET CARNET MNHEBAY-US3488France & Colonieshttp://thumbs2.ebaystatic.com/pict/3704150148938080_1.jpghttp://cgi.ebay.com/FRANCE-SC-3305A-HARRY-POTTER-BOOKLET-CARNET-MNH-/370415014893?pt=LH_DefaultDomain_0PayPalfalse32245Jacksonville,FL,USAUSknfsr4546100.0Redtrue2.25FlatWorldwide11.511.50ActiveP0DT0H23M35Sfalsefalse2010-07-31T20:21:13.000Z2010-08-07T20:21:13.000ZAuctionfalseNew370416974944Harry Potter Robe Gryffindor Hermoine Wizard HogwartsEBAY-US80914Girlshttp://thumbs1.ebaystatic.com/pict/3704169749448080_1.jpghttp://cgi.ebay.com/Harry-Potter-Robe-Gryffindor-Hermoine-Wizard-Hogwarts-/370416974944?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalse91789Walnut,CA,USAUSFenvy Costumeshttp://stores.ebay.com/Fenvy-Costumesfenvyboutiques967499.8Greentrue5.95FlatWorldwide20.9520.95ActiveP28DT0H27M58Sfalsefalse2010-08-05T20:25:36.000Z2010-09-04T20:25:36.000ZFixedPricefalse1000New with tags390207391809Harry Potter GRYFFINDOR Embroidered Chest Logo PATCHEBAY-US29798Harry Potterhttp://thumbs2.ebaystatic.com/pict/3902073918098080_1.jpghttp://cgi.ebay.com/Harry-Potter-GRYFFINDOR-Embroidered-Chest-Logo-PATCH-/390207391809?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalse10980Stony Point,NY,USAUSCOLLECTABLESCENTRALhttp://stores.ebay.com/COLLECTABLESCENTRALmainstreet2471884599.7YellowShootingtrue2.0FlatWorldwide6.996.99ActiveP1DT23H32M48Sfalsefalse2010-06-10T19:25:26.000Z2010-08-09T19:30:26.000ZStoreInventoryfalsehttp://galleryplus.ebayimg.com/ws/web/390207391809_1_0_1.jpg1000New330456792123FRANCE SC 3303 HARRY POTTER MNH EBAY-US3488France & Colonieshttp://thumbs4.ebaystatic.com/pict/3304567921238080_1.jpghttp://cgi.ebay.com/FRANCE-SC-3303-HARRY-POTTER-MNH-/330456792123?pt=LH_DefaultDomain_0PayPalfalse32245Jacksonville,FL,USAUSknfsr4546100.0Redtrue1.0FlatWorldwide2.252.250ActiveP0DT0H23M38Sfalsefalse2010-07-31T20:21:16.000Z2010-08-07T20:21:16.000ZAuctionfalseNew180541600450HARRY POTTER DS GAMEEBAY-US139973Gameshttp://thumbs3.ebaystatic.com/pict/1805416004508080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-DS-GAME-/180541600450?pt=Video_Games_GamesPayPalfalse30833Wrens,GA,USAUSthomasblues265100.0Turquoisefalse0.0FreeUS3.593.596ActiveP0DT0H25M45Sfalsefalse2010-08-02T20:23:23.000Z2010-08-07T20:23:23.000ZAuctionfalse4000Very Good3304558854025 book Harry Potter Russian set Собрание Гарри ПоттераEBAY-US279Children & Young Adultshttp://thumbs3.ebaystatic.com/pict/3304558854028080_1.jpghttp://cgi.ebay.com/5-book-Harry-Potter-Russian-set-/330455885402?pt=US_Childrens_BooksPayPalfalse99336Kennewick,WA,USAUSfatherfuzz501100.0Purplefalse4.0FlatDomesticCalculatedInternationalWorldwide50.050.00ActiveP0DT0H25M49Sfalsetrue75.075.02010-07-28T20:23:27.000Z2010-08-07T20:23:27.000ZAuctionWithBINfalse3000Like New290459709767Harry Potter: and The Goblet of Fire BLU-RAY NEW!!EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs4.ebaystatic.com/pict/2904597097678080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Goblet-Fire-BLU-RAY-NEW-/290459709767?pt=US_DVD_HD_DVD_Blu_ray63132577PayPalfalse25571West Hamlin,WV,USAUSamandadawn198360100.0Bluefalse3.0FlatUS13.013.00ActiveP0DT0H26M55Sfalsetrue17.017.02010-07-31T20:24:33.000Z2010-08-07T20:24:33.000ZAuctionWithBINfalse1000Brand New290460327462Harry Potter Trading card game 3 Booster packs NEWEBAY-US22727Harry Potterhttp://thumbs3.ebaystatic.com/pict/2904603274628080_1.jpghttp://cgi.ebay.com/Harry-Potter-Trading-card-game-3-Booster-packs-NEW-/290460327462?pt=LH_DefaultDomain_0PayPalfalse08054Mount Laurel,NJ,USAUSTimelesstoysllchttp://stores.ebay.com/Timelesstoysllctimelesstoysllc348199.8Redtrue3.0FlatDomesticCalculatedInternationalWorldwide0.990.990ActiveP0DT0H27M12Sfalsefalse2010-08-02T20:24:50.000Z2010-08-07T20:24:50.000ZAuctionfalse1000New250676647767Harry Potter chamber of secrets 3 booster packs newEBAY-US22727Harry Potterhttp://thumbs4.ebaystatic.com/pict/2506766477678080_1.jpghttp://cgi.ebay.com/Harry-Potter-chamber-secrets-3-booster-packs-new-/250676647767?pt=LH_DefaultDomain_0PayPalfalse08054Mount Laurel,NJ,USAUSTimelesstoysllchttp://stores.ebay.com/Timelesstoysllctimelesstoysllc348199.8Redtrue3.0FlatDomesticCalculatedInternationalWorldwide0.990.990ActiveP0DT0H27M15Sfalsefalse2010-08-02T20:24:53.000Z2010-08-07T20:24:53.000ZAuctionfalse1000New250613561328HARRY POTTER and the HALF-BLOOD PRINCE 12 CASSETTES NEWEBAY-US29798Harry Potterhttp://thumbs1.ebaystatic.com/pict/2506135613288080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-and-HALF-BLOOD-PRINCE-12-CASSETTES-NEW-/250613561328?pt=LH_DefaultDomain_0PayPalfalse19027Elkins Park,PA,USAUSMr.Larry Storehttp://stores.ebay.com/Mr-Larry-Storemr.larry8351100.0GreentrueCalculatedUS19.9919.99ActiveP1DT21H45M15Sfalsefalse2010-04-11T17:37:53.000Z2010-08-09T17:42:53.000ZStoreInventoryfalsehttp://galleryplus.ebayimg.com/ws/web/250613561328_1_0_1.jpgNew370415016781LEGO 4706 HARRY POTTER FORBIDDEN CORRIDOR NEW SEALEDEBAY-ENCA19011Otherhttp://thumbs2.ebaystatic.com/pict/3704150167818080_1.jpghttp://cgi.ebay.com/LEGO-4706-HARRY-POTTER-FORBIDDEN-CORRIDOR-NEW-SEALED-/370415016781?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide88.7788.7719ActiveP0DT0H27M28Sfalsefalse2010-07-31T20:25:06.000Z2010-08-07T20:25:06.000ZAuctionfalse1000New270615820617Harry Potter and the Chamber of Secrets Poster BookEBAY-US279Children & Young Adultshttp://thumbs2.ebaystatic.com/pict/2706158206178080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Chamber-Secrets-Poster-Book-/270615820617?pt=US_Childrens_Books2324738PayPalfalse29054Gilbert,SC,USAUSlrmillerjr117100.0Yellowfalse4.0FlatUS0.990.990ActiveP0DT0H27M56Sfalsefalse2010-07-31T20:25:34.000Z2010-08-07T20:25:34.000ZAuctionfalse3000Like New270615821403HARRY POTTER -LOT OF SIX - Books 1 Thru 6!!!!!!!!!!!!!!EBAY-US525416-10 Itemshttp://thumbs4.ebaystatic.com/pict/2706158214038080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-LOT-SIX-Books-1-Thru-6-/270615821403?pt=LH_DefaultDomain_0PayPalfalse19036Glenolden,PA,USAUSemblemsbyfran48100.0Yellowfalse6.0FlatUS9.999.990ActiveP0DT0H29M37Sfalsefalse2010-07-31T20:27:15.000Z2010-08-07T20:27:15.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/270615821403_1_0_1.jpg3000Used250675559905NEW SONY PSP GO SYSTEM+70 GAMES+MOVIES☼LOOK INSIDE☼MINTEBAY-US139971Systemshttp://thumbs2.ebaystatic.com/pict/2506755599058080_1.jpghttp://cgi.ebay.com/NEW-SONY-PSP-GO-SYSTEM-70-GAMES-MOVIES-LOOK-INSIDE-MINT-/250675559905?pt=Video_Games78481516PayPaltrue10060New York,NY,USAUSnoahs_arc055398.2Bluefalse0.0FreeUSCAGBAUDE260.0260.040ActiveP0DT0H29M59Sfalsefalse2010-07-31T20:27:37.000Z2010-08-07T20:27:37.000ZAuctionfalse1000New120605626157Brand New Blue Nintendo DSi NDSi Console with 40 GamesEBAY-US139971Systemshttp://thumbs2.ebaystatic.com/pict/1206056261578080_1.jpghttp://cgi.ebay.com/Brand-New-Blue-Nintendo-DSi-NDSi-Console-40-Games-/120605626157?pt=Video_GamesPayPalfalseChinaCNshenzhengqing11169599.3Purpletrue15.0FlatWorldwide205.5205.55ActiveP0DT0H30M39Sfalsefalse2010-08-06T20:28:17.000Z2010-08-07T20:28:17.000ZAuctionfalse1000New300453316894Twilight (DVD, 2009, Limited Retail Exclusive)EBAY-USFactory Sealed Brand New! Free Shipping!617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/3004533168948080_2.jpghttp://cgi.ebay.com/Twilight-DVD-2009-Limited-Retail-Exclusive-/300453316894?pt=US_DVD_HD_DVD_Blu_ray72375445PayPalfalseUSAUSjaybirdsc135100.0Yellowfalse0.0FreeUS9.999.99ActiveP28DT7H2M8Sfalsefalse2010-08-06T02:59:47.000Z2010-09-05T02:59:47.000ZFixedPricefalse1000Brand New230508359737Black&Blue Nintendo DS Lite Console NDSL NDS + 40 GamesEBAY-US139971Systemshttp://thumbs2.ebaystatic.com/pict/2305083597378080_1.jpghttp://cgi.ebay.com/Black-Blue-Nintendo-DS-Lite-Console-NDSL-NDS-40-Games-/230508359737?pt=Video_GamesPayPalfalseChinaCNxuejun200010413100.0Turquoisefalse15.0FlatWorldwide110.0110.01ActiveP0DT0H30M38Sfalsefalse2010-08-06T20:28:17.000Z2010-08-07T20:28:17.000ZAuctionfalse1000New370415018502LEGO 4714 HARRY POTTER GRIGOTTS BANK NEW FACTORY SEALEDEBAY-ENCA19011Otherhttp://thumbs3.ebaystatic.com/pict/3704150185028080_1.jpghttp://cgi.ebay.com/LEGO-4714-HARRY-POTTER-GRIGOTTS-BANK-NEW-FACTORY-SEALED-/370415018502?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide58.7758.7713ActiveP0DT0H31M26Sfalsefalse2010-07-31T20:29:05.000Z2010-08-07T20:29:05.000ZAuctionfalse1000New270616177335NIB Lightning Bolt Antenna Ball Topper - Harry PotterEBAY-US29798Harry Potterhttp://thumbs4.ebaystatic.com/pict/2706161773358080_1.jpghttp://cgi.ebay.com/NIB-Lightning-Bolt-Antenna-Ball-Topper-Harry-Potter-/270616177335?pt=LH_DefaultDomain_0PayPalfalse95832Sacramento,CA,USAUSJinxi's Magic Cupboardhttp://stores.ebay.com/Jinxis-Magic-Cupboardhogwartspaladin569100.0Purplefalse2.25FlatUS4.254.250ActiveP0DT0H32M30Sfalsefalse2010-08-02T20:30:09.000Z2010-08-07T20:30:09.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/270616177335_1_0_1.jpg1000New250675561048Family Flicks CD VA Busted Duff Boyzone GhostbustersEBAY-GB307CDshttp://thumbs1.ebaystatic.com/pict/2506755610488080_1.jpghttp://cgi.ebay.com/Family-Flicks-CD-VA-Busted-Duff-Boyzone-Ghostbusters-/250675561048?pt=UK_CDsDVDs_CDs_CDs_GL43869546PayPalPersonalCheckfalseB975JRUnited KingdomGBdm_redditch1260100.0Redfalse2.4FlatAmericasEuropeAsia2.03.190ActiveP0DT0H32M40Sfalsefalse2010-07-31T20:30:19.000Z2010-08-07T20:30:19.000ZAuctionfalseUsed380230443014Daniel Radcliffe Harry Potter Photo #N20EBAY-US197Otherhttp://thumbs3.ebaystatic.com/pict/3802304430148080_1.jpghttp://cgi.ebay.com/Daniel-Radcliffe-Harry-Potter-Photo-N20-/380230443014?pt=LH_DefaultDomain_0PayPalfalse97367Lincoln City,OR,USAUSFabulous Hollywood Memorieshttp://stores.ebay.com/Fabulous-Hollywood-Memorieshairybeury4548999.9TurquoiseShootingtrue3.5FlatWorldwide5.995.99ActiveP24DT9H50M6Sfalsefalse2010-05-04T05:42:45.000Z2010-09-01T05:47:45.000ZStoreInventoryfalse390218409849HARRY POTTER HEROES AND VILLAINS SET WITH CLEAR SET EBAY-US219Otherhttp://thumbs2.ebaystatic.com/pict/3902184098498080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-HEROES-AND-VILLAINS-SET-CLEAR-SET-/390218409849?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalseUSAUSNon-Sport Cards and Collectibleshttp://stores.ebay.com/Non-Sport-Cards-and-Collectiblesnon-sportman4522199.5TurquoiseShootingfalse4.25FlatWorldwide14.9514.95ActiveP5DT4H55M50Sfalsefalse2010-07-14T00:48:29.000Z2010-08-13T00:53:29.000ZFixedPricefalsehttp://galleryplus.ebayimg.com/ws/web/390218409849_1_0_1.jpg170521447398Twilight (Blu-ray Disc, 2009)EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/1705214473988080_1.jpghttp://cgi.ebay.com/Twilight-Blu-ray-Disc-2009-/170521447398?pt=US_DVD_HD_DVD_Blu_ray71923946PayPalfalse79936El Paso,TX,USAUSmgcscreen2925100.0Redtrue2.25FlatUSCA17.017.016ActiveP0DT0H33M56Sfalsefalse2010-07-31T20:31:35.000Z2010-08-07T20:31:35.000ZAuctionfalse3000Like New180541604068POKEMON GOLD SILVER GAMEBOY ADVANCE LOT + MORE DSEBAY-US31583Gameshttp://thumbs1.ebaystatic.com/pict/1805416040688080_1.jpghttp://cgi.ebay.com/POKEMON-GOLD-SILVER-GAMEBOY-ADVANCE-LOT-MORE-DS-/180541604068?pt=LH_DefaultDomain_0PayPalfalse50311Des Moines,IA,USAUSroces503117100.0Nonefalse9.0FlatUS103.51103.512ActiveP0DT0H35M1Sfalsefalse2010-08-02T20:32:40.000Z2010-08-07T20:32:40.000ZAuctionfalse3000Used220649913935Lot of 10Paperback, HarryPotter and the Sorcerers stoneEBAY-US279Children & Young Adultshttp://thumbs4.ebaystatic.com/pict/2206499139358080_1.jpghttp://cgi.ebay.com/Lot-10Paperback-HarryPotter-and-Sorcerers-stone-/220649913935?pt=US_Childrens_BooksPayPalfalse29560Lake City,SC,USAUSjames-wendys-wonder-emporium29100.0Yellowfalse4.0FlatUS15.015.00ActiveP0DT0H35M1Sfalsefalse2010-08-06T20:32:40.000Z2010-08-07T20:32:40.000ZAuctionfalse3000Like New170522270036Harry Potter and the Order of the Phoenix (DVD, 2007...EBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs1.ebaystatic.com/pict/1705222700368080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Order-Phoenix-DVD-2007-/170522270036?pt=US_DVD_HD_DVD_Blu_ray62940319PayPaltrue95616Davis,CA,USAUSgroove0183100.0BluefalseCalculatedUS0.010.010ActiveP0DT0H35M24Sfalsetrue6.06.02010-08-02T20:33:03.000Z2010-08-07T20:33:03.000ZAuctionWithBINfalse3000Like New370416546067HARRY POTTER PRISONER OF AZKABAN PS2 PLAYSTATION 2 GAMEEBAY-US139973Gameshttp://thumbs4.ebaystatic.com/pict/3704165460678080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-PRISONER-AZKABAN-PS2-PLAYSTATION-2-GAME-/370416546067?pt=Video_Games_Games30581103PayPalfalseUSAUSLukie Gameshttp://stores.ebay.com/Lukie-Gameslukiegames10209399.5RedShootingtrue3.95FlatAUAmericasEuropeAsia3.253.253ActiveP0DT0H35M33Sfalsefalse2010-08-04T20:33:12.000Z2010-08-07T20:33:12.000ZAuctionfalse4000Very Good290461727289Harry Potter and the Half-Blood Prince (DVD, 2009, WS)EBAY-UScheck out my other dvds. $1.50 ship each additional 617DVD, HD DVD & Blu-rayhttp://thumbs2.ebaystatic.com/pict/2904617272898080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Half-Blood-Prince-DVD-2009-WS-/290461727289?pt=US_DVD_HD_DVD_Blu_ray78413115PayPalfalse36117Montgomery,AL,USAUSbigbenentertainmenthttp://stores.ebay.com/bigbenentertainmentbigbenentertainment239799.8Redtrue3.0FlatUS6.996.99ActiveP29DT7H20M10Sfalsefalse2010-08-07T03:12:49.000Z2010-09-06T03:17:49.000ZStoreInventoryfalse4000Very Good370415020751LEGO 4728 HARRY POTTER ESCAPE FROM PRIVET DRIVE NEWEBAY-ENCA19011Otherhttp://thumbs4.ebaystatic.com/pict/3704150207518080_1.jpghttp://cgi.ebay.com/LEGO-4728-HARRY-POTTER-ESCAPE-PRIVET-DRIVE-NEW-/370415020751?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide78.9978.9915ActiveP0DT0H36M9Sfalsefalse2010-07-31T20:33:48.000Z2010-08-07T20:33:48.000ZAuctionfalse1000New200503478501Harry Potter and the Order of the Phoenix by J. K. R...EBAY-USGreat Gift!!!279Children & Young Adultshttp://thumbs2.ebaystatic.com/pict/2005034785018080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Order-Phoenix-J-K-R-/200503478501?pt=US_Childrens_Books2327833PayPalfalse60004Arlington Heights,IL,USAUSbeckyaanderson6ru9275100.0Turquoisefalse3.75FlatUS0.990.990ActiveP0DT0H37M22Sfalsefalse2010-07-31T20:35:01.000Z2010-08-07T20:35:01.000ZAuctionfalse3000Like New160465335131New Design Harry Potter Watch For Girls Boy's Gift WCCEBAY-US31387Wristwatcheshttp://thumbs4.ebaystatic.com/pict/1604653351318080_1.jpghttp://cgi.ebay.com/New-Design-Harry-Potter-Watch-Girls-Boys-Gift-WCC-/160465335131?pt=WristwatchesPayPalfalseChinaCNchinadiscountstorehttp://stores.ebay.com/chinadiscountstorechinadiscountstore607298.9Greenfalse4.99FlatWorldwide0.010.010ActiveP0DT0H38M44Sfalsefalse2010-08-06T20:36:23.000Z2010-08-07T20:36:23.000ZAuctionfalse1000New with tags110570047540Brand New Pink Nintendo NDS Lite Console with 40 GamesEBAY-US139971Systemshttp://thumbs1.ebaystatic.com/pict/1105700475408080_1.jpghttp://cgi.ebay.com/Brand-New-Pink-Nintendo-NDS-Lite-Console-40-Games-/110570047540?pt=Video_GamesPayPalfalseHong KongHKzhanghui5181997299.5Purpletrue15.0FlatWorldwide110.0110.00ActiveP0DT0H40M22Sfalsefalse2010-08-06T20:38:01.000Z2010-08-07T20:38:01.000ZAuctionfalse1000New140434582108Harry Potter and the Chamber of Secrets paperback - JKREBAY-US377Fiction & Literaturehttp://thumbs1.ebaystatic.com/pict/1404345821088080_1.jpghttp://cgi.ebay.com/Harry-Potter-and-Chamber-Secrets-paperback-JKR-/140434582108?pt=US_Fiction_Books1650081PayPalfalse57745Hill City,SD,USAUSjump2500520100.0Purplefalse3.0FlatUS0.990.991ActiveP0DT0H40M36Sfalsefalse2010-07-31T20:38:15.000Z2010-08-07T20:38:15.000ZAuctionfalse6000Acceptable290459713581Confederate Railroad by Confederate Railroad (CD, Ap...EBAY-USA great CD See you at Lake Winnie in Chattanooga soon!307CDshttp://thumbs2.ebaystatic.com/pict/2904597135818080_1.jpghttp://cgi.ebay.com/Confederate-Railroad-Confederate-Railroad-CD-Ap-/290459713581?pt=Music_CDs65864453PayPalfalse77379Spring,TX,USAUSbrentbackjudge215897.9Redfalse2.5FlatUS1.991.991ActiveP0DT0H42M23Sfalsefalse2010-07-31T20:40:02.000Z2010-08-07T20:40:02.000ZAuctionfalse5000Good310235980749SUMMER SALE: HARRY POTTER: SORCERER'S STONE Card SetEBAY-US219Otherhttp://thumbs2.ebaystatic.com/pict/3102359807498080_1.jpghttp://cgi.ebay.com/SUMMER-SALE-HARRY-POTTER-SORCERERS-STONE-Card-Set-/310235980749?pt=LH_DefaultDomain_0PayPalfalse18360Stroudsburg,PA,USAUSmhoponhophttp://stores.ebay.com/mhoponhopmhoponhop80814100.0PurpleShootingtrue4.7FlatWorldwide4.04.0ActiveP14DT6H22M40Sfalsefalse2010-07-23T02:15:19.000Z2010-08-22T02:20:19.000ZFixedPricefalsehttp://galleryplus.ebayimg.com/ws/web/310235980749_1_0_1.jpg110567475315Nintendo Gamecube Sphinx And The Cursed Mummy EBAY-US139973Gameshttp://thumbs4.ebaystatic.com/pict/1105674753158080_1.jpghttp://cgi.ebay.com/Nintendo-Gamecube-Sphinx-And-Cursed-Mummy-/110567475315?pt=Video_Games_Games10835PayPalfalse21658Queenstown,MD,USAUScancolejohnant163100.0Turquoisefalse4.0FlatUS0.990.990ActiveP0DT0H45M55Sfalsefalse2010-07-31T20:43:34.000Z2010-08-07T20:43:34.000ZAuctionfalse4000Very Good290460333336Harry Potter Nimbus 2000 Vibrating Broom Stick EBAY-US29798Harry Potterhttp://thumbs1.ebaystatic.com/pict/2904603333368080_1.jpghttp://cgi.ebay.com/Harry-Potter-Nimbus-2000-Vibrating-Broom-Stick-/290460333336?pt=LH_DefaultDomain_0PayPalfalse01013Chicopee,MA,USAUSsjmac91363100.0TurquoisefalseCalculatedWorldwide15.4915.497ActiveP0DT0H47M47Sfalsefalse2010-08-02T20:45:26.000Z2010-08-07T20:45:26.000ZAuctionfalsehttp://galleryplus.ebayimg.com/ws/web/290460333336_1_0_1.jpg3000Used260645937245New Design Harry Potter Boys Girls Wrist Watch Gift WCBEBAY-US31387Wristwatcheshttp://thumbs2.ebaystatic.com/pict/2606459372458080_1.jpghttp://cgi.ebay.com/New-Design-Harry-Potter-Boys-Girls-Wrist-Watch-Gift-WCB-/260645937245?pt=WristwatchesPayPalfalse518101Hong KongHKchenlistore8097.6Bluefalse4.99FlatWorldwide0.010.010ActiveP0DT0H48M7Sfalsefalse2010-08-04T20:45:46.000Z2010-08-07T20:45:46.000ZAuctionfalse1500New without tags370415024765LEGO 4733 HARRY POTTER THE DUELING CLUB NEW SEALEDEBAY-ENCA19011Otherhttp://thumbs2.ebaystatic.com/pict/3704150247658080_1.jpghttp://cgi.ebay.com/LEGO-4733-HARRY-POTTER-DUELING-CLUB-NEW-SEALED-/370415024765?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide41.041.09ActiveP0DT0H49M34Sfalsefalse2010-07-31T20:47:13.000Z2010-08-07T20:47:13.000ZAuctionfalse1000New380250886244b049 Lego Harry Potter Minifigs Uncle Vernon DursleyEBAY-US19001Figureshttp://thumbs1.ebaystatic.com/pict/3802508862448080_1.jpghttp://cgi.ebay.com/b049-Lego-Harry-Potter-Minifigs-Uncle-Vernon-Dursley-/380250886244?pt=LH_DefaultDomain_0PayPalfalseUSAUSBlue Spruce Toyshttp://stores.ebay.com/Blue-Spruce-Toysblue-spruce-toy15532100.0YellowShootingtrue1.95FlatUS5.955.95ActiveP5DT10H41M1Sfalsefalse2010-07-14T06:33:40.000Z2010-08-13T06:38:40.000ZFixedPricefalse1000New250616328812Kyrgyzstan 2002 - Harry Potter - MNH Souvenir sheet #01EBAY-US4754Famous Peoplehttp://thumbs1.ebaystatic.com/pict/2506163288128080_1.jpghttp://cgi.ebay.com/Kyrgyzstan-2002-Harry-Potter-MNH-Souvenir-sheet-01-/250616328812?pt=LH_DefaultDomain_0PayPalfalseLithuaniaLTkmz2009_2009http://stores.ebay.com/kmz2009-2009kmz2009_2009139999.9Redfalse2.0FlatWorldwide3.03.0ActiveP6DT15H4M19Struefalse2010-04-16T10:56:58.000Z2010-08-14T11:01:58.000ZStoreInventoryfalseNew230508360374Brand New Pink Nintendo DS Lite NDSL Console + 40 GamesEBAY-US139971Systemshttp://thumbs3.ebaystatic.com/pict/2305083603748080_1.jpghttp://cgi.ebay.com/Brand-New-Pink-Nintendo-DS-Lite-NDSL-Console-40-Games-/230508360374?pt=Video_Games61446654PayPalfalseChinaCNxuejun200010413100.0Turquoisefalse15.0FlatWorldwide110.0110.01ActiveP0DT0H50M38Sfalsefalse2010-08-06T20:48:17.000Z2010-08-07T20:48:17.000ZAuctionfalse1000New110570007495Brand New White Nintendo DSi NDSi Console with 40 GamesEBAY-US139971Systemshttp://thumbs4.ebaystatic.com/pict/1105700074958080_1.jpghttp://cgi.ebay.com/Brand-New-White-Nintendo-DSi-NDSi-Console-40-Games-/110570007495?pt=Video_Games78143198PayPalfalseChinaCNshenzhengqing11169599.3Purpletrue15.0FlatWorldwide199.0199.01ActiveP0DT0H50M56Sfalsefalse2010-08-06T20:48:35.000Z2010-08-07T20:48:35.000ZAuctionfalse1000New370415025594LEGO 4727 HARRY POTTER ARAGOG IN THE DARK FOREST NEWEBAY-ENCA19011Otherhttp://thumbs3.ebaystatic.com/pict/3704150255948080_1.jpghttp://cgi.ebay.com/LEGO-4727-HARRY-POTTER-ARAGOG-DARK-FOREST-NEW-/370415025594?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide30.030.09ActiveP0DT0H52M34Sfalsefalse2010-07-31T20:50:13.000Z2010-08-07T20:50:13.000ZAuctionfalse1000New300453522002Twilight 2-Disc DVD Set Edition Kristen Stewart NEWEBAY-USBrand New - Factory Sealed - Ships Fast - Free Upgrade617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/3004535220028080_1.jpghttp://cgi.ebay.com/Twilight-2-Disc-DVD-Set-Edition-Kristen-Stewart-NEW-/300453522002?pt=US_DVD_HD_DVD_Blu_ray71847386PayPalfalse31632Hahira,GA,USAUSjellybeandealshttp://stores.ebay.com/jellybeandealsjellybeandeals1040100.0Redtrue0.0CalculatedUSCAAUEurope10.010.010ActiveP0DT0H54M16Sfalsefalse2010-08-06T20:51:55.000Z2010-08-07T20:51:55.000ZAuctionfalse1000Brand New110567478110Nw HARRY POTTER MOViE ADVENTURES HOGWARTS 3-D ELEC GAMEEBAY-US2531Fantasy Board Gameshttp://thumbs3.ebaystatic.com/pict/1105674781108080_1.jpghttp://cgi.ebay.com/Nw-HARRY-POTTER-MOViE-ADVENTURES-HOGWARTS-3-D-ELEC-GAME-/110567478110?pt=LH_DefaultDomain_0PayPalfalse87042Peralta,NM,USAUStoys2di4831100.0Purpletrue14.95FlatUSCA24.7724.771ActiveP0DT0H55M41Sfalsefalse2010-07-31T20:53:20.000Z2010-08-07T20:53:20.000ZAuctionfalse1000New350365166767HARRY POTTER Party Supplies Beverage Napkins EBAY-US26387Tableware & Servewarehttp://thumbs4.ebaystatic.com/pict/3503651667678080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-Party-Supplies-Beverage-Napkins-/350365166767?pt=LH_DefaultDomain_0PayPalfalse53005Brookfield,WI,USAUSBartz Party Storehttp://stores.ebay.com/Bartz-Party-Storebartz_party_store536899.8Greentrue2.5FlatDomesticCalculatedInternationalWorldwide1.441.44ActiveP1DT20H49M4Sfalsefalse2010-06-10T16:41:43.000Z2010-08-09T16:46:43.000ZStoreInventoryfalseNew250675571728NEW SONY PSP GO SYSTEM+70 DISNEY GAMES+MOVIES☼TOY STORYEBAY-US139971Systemshttp://thumbs1.ebaystatic.com/pict/2506755717288080_1.jpghttp://cgi.ebay.com/NEW-SONY-PSP-GO-SYSTEM-70-DISNEY-GAMES-MOVIES-TOY-STORY-/250675571728?pt=Video_Games78481516PayPaltrue10060New York,NY,USAUSnoahs_arc055398.2Bluefalse0.0FreeUSCAGBAUDE291.0291.042ActiveP0DT0H55M42Sfalsefalse2010-07-31T20:53:21.000Z2010-08-07T20:53:21.000ZAuctionfalse1000New370415027425LEGO 4720 HARRY POTTER KNOCKTURN ALLEY NEW FACTORY SEALEBAY-ENCA19011Otherhttp://thumbs2.ebaystatic.com/pict/3704150274258080_1.jpghttp://cgi.ebay.com/LEGO-4720-HARRY-POTTER-KNOCKTURN-ALLEY-NEW-FACTORY-SEAL-/370415027425?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide33.0133.017ActiveP0DT0H56M33Sfalsefalse2010-07-31T20:54:12.000Z2010-08-07T20:54:12.000ZAuctionfalse1000New300453523856Harry Potter & the Half-Blood Prince DVD 2-Disc Ed NEW!EBAY-USSealed in Holographic SLIPCOVER FREE upgrade to 1st CL617DVD, HD DVD & Blu-rayhttp://thumbs1.ebaystatic.com/pict/3004535238568080_1.jpghttp://cgi.ebay.com/Harry-Potter-Half-Blood-Prince-DVD-2-Disc-Ed-NEW-/300453523856?pt=US_DVD_HD_DVD_Blu_ray78384624PayPalfalse31632Hahira,GA,USAUSjellybeandealshttp://stores.ebay.com/jellybeandealsjellybeandeals1040100.0Redtrue0.0CalculatedUSCAAUEurope13.513.57ActiveP0DT0H59M27Sfalsefalse2010-08-06T20:57:06.000Z2010-08-07T20:57:06.000ZAuctionfalse1000Brand New370415028517LEGO 4752 HARRY POTTER PROFESSOR LUPIN'S CLASSROOM NEWEBAY-ENCA19011Otherhttp://thumbs2.ebaystatic.com/pict/3704150285178080_1.jpghttp://cgi.ebay.com/LEGO-4752-HARRY-POTTER-PROFESSOR-LUPINS-CLASSROOM-NEW-/370415028517?pt=LH_DefaultDomain_2PayPalfalseT6L6S3CanadaCAFROM MY WORLD TO YOURS COLLECTIBLEShttp://stores.ebay.com/FROM-MY-WORLD-TO-YOURS-COLLECTIBLEScaptainhomer2969100.0Redfalse13.12FlatWorldwide27.7727.777ActiveP0DT1H0M20Sfalsefalse2010-07-31T20:57:59.000Z2010-08-07T20:57:59.000ZAuctionfalse1000New180540637442The Tales of Beedle The Bard by J. K. Rowling (2008,...EBAY-US279Children & Young Adultshttp://thumbs3.ebaystatic.com/pict/1805406374428080_1.jpghttp://cgi.ebay.com/Tales-Beedle-Bard-J-K-Rowling-2008-/180540637442?pt=US_Childrens_Books70322885PayPalfalse11377Woodside,NY,USAUShchlebowski45100.0Yellowfalse4.0FlatUS0.990.990ActiveP0DT1H0M33Sfalsefalse2010-07-31T20:58:12.000Z2010-08-07T20:58:12.000ZAuctionfalse1000Brand New170513250289HARRY POTTER WIZARD CHOCOLATE CANDY MOLD MOLDSEBAY-US13926Moldshttp://thumbs2.ebaystatic.com/pict/1705132502898080_1.jpghttp://cgi.ebay.com/HARRY-POTTER-WIZARD-CHOCOLATE-CANDY-MOLD-MOLDS-/170513250289?pt=LH_DefaultDomain_0PayPalVisaMCAmExDiscoverfalse16313Clarendon,PA,USAUSCake-and-Candy Comhttp://stores.ebay.com/Cake-and-Candy-Comgremlinstr2163399.8YellowShootingtrue3.0FlatWorldwide2.252.25ActiveP5DT2H48M36Sfalsefalse2010-07-13T22:46:15.000Z2010-08-12T22:46:15.000ZFixedPricefalsehttp://galleryplus.ebayimg.com/ws/web/170513250289_1_0_1.jpgNew120605663221Black&Blue Nintendo DS Lite Console NDS NDSL + 40 GamesEBAY-US139971Systemshttp://thumbs2.ebaystatic.com/pict/1206056632218080_1.jpghttp://cgi.ebay.com/Black-Blue-Nintendo-DS-Lite-Console-NDS-NDSL-40-Games-/120605663221?pt=Video_GamesPayPalfalseHong KongHKzhanghui5181997299.5Purpletrue15.0FlatWorldwide110.0110.02ActiveP0DT1H1M18Sfalsefalse2010-08-06T20:58:57.000Z2010-08-07T20:58:57.000ZAuctionfalse1000New130417885862300 LEGOS FROM STAR WARS BATMAN & OTHERS BULK LOT NEWEBAY-US19002Parts & Pieceshttp://thumbs3.ebaystatic.com/pict/1304178858628080_1.jpghttp://cgi.ebay.com/300-LEGOS-STAR-WARS-BATMAN-OTHERS-BULK-LOT-NEW-/130417885862?pt=LH_DefaultDomain_0PayPalfalse32405Panama City,FL,USAUSTOWER TRADING COhttp://stores.ebay.com/TOWER-TRADING-COtoyman850138199.9Redtrue5.5FlatDomesticCalculatedInternationalGBAUAmericas15.9915.990ActiveP0DT1H2M40Sfalsefalse2010-08-06T21:00:19.000Z2010-08-07T21:00:19.000ZAuctionfalse1000New270617738417Wholesaleï¼10PCS Harry Potter Children Cartoon Watch CIAEBAY-US64520Mixed Lotshttp://thumbs2.ebaystatic.com/pict/2706177384178080_1.jpghttp://cgi.ebay.com/Wholesale-10PCS-Harry-Potter-Children-Cartoon-Watch-CIA-/270617738417?pt=LH_DefaultDomain_0PayPalfalseHong KongHKlintastore208799.0Redfalse14.69FlatWorldwide0.010.010ActiveP0DT1H3M22Sfalsefalse2010-08-04T21:01:01.000Z2010-08-07T21:01:01.000ZAuctionfalse1000New250675574574SONY PSP GO SYSTEM+70 DISNEY GAMES+MOVIES☼TOY STORYEBAY-US139971Systemshttp://thumbs3.ebaystatic.com/pict/2506755745748080_1.jpghttp://cgi.ebay.com/SONY-PSP-GO-SYSTEM-70-DISNEY-GAMES-MOVIES-TOY-STORY-/250675574574?pt=Video_Games78481516PayPaltrue10060New York,NY,USAUSnoahs_arc055398.2Bluefalse0.0FreeUSCAGBAUDE197.5197.530ActiveP0DT1H3M26Sfalsefalse2010-07-31T21:01:05.000Z2010-08-07T21:01:05.000ZAuctionfalse3000Used2606459445741 CENT DVD: 'Driving Lessons' Rupert Grint WIDE FUNEBAY-US617DVD, HD DVD & Blu-rayhttp://thumbs3.ebaystatic.com/pict/2606459445748080_1.jpghttp://cgi.ebay.com/1-CENT-DVD-Driving-Lessons-Rupert-Grint-WIDE-FUN-/260645944574?pt=US_DVD_HD_DVD_Blu_ray59835761PayPalfalse85251Scottsdale,AZ,USAUSthemoviemancometh26299.2Turquoisefalse3.0FlatUS0.010.011ActiveP0DT1H3M57Sfalsefalse2010-08-04T21:02:37.000Z2010-08-07T21:01:36.000ZAuctionfalse5000Good110054954866http://shop.ebay.com/i.html?LH_TitleDesc=1&_nkw=harry+potter&_ddo=1&_ipg=100&_os=A&_pgn=11Collectibles15063868Trading Cards591210860Fantasy, Mythical & Magic440863Comics303513777Decorative Collectibles35913658Animation Art & Characters363152Science Fiction & Horror11534Advertising103137Disneyana77124Paper9239507Pinbacks, Bobbles, Lunchboxes60267Books10706279Children & Young Adults3345377Fiction & Literature2781378Nonfiction200629223Antiquarian & Collectible603280Magazine Back Issues90329792Audiobooks47329399Wholesale & Bulk Lots114268Other2042228Textbooks, Education17945110Accessories86220Toys & Hobbies666618991Building Toys18992624TV, Movie & Character Toys15832536Trading Card Games1415246Action Figures926233Games362479Model RR, Trains67222Diecast & Toy Vehicles7011731Educational472613Puzzles5219169Pretend Play, Preschool3211232DVDs & Movies4898617DVD, HD DVD & Blu-ray3784309VHS46031606Wholesale Lots152132975UMD963821Film41508VHS Non-US (PAL)441676Other Formats2381Laserdisc245100Entertainment Memorabilia4411196Movie Memorabilia33031424Television Memorabilia72457Autographs-Original3112312Other84104412Autographs-Reprints5445101Video Game Memorabilia362329Music Memorabilia232362Theater Memorabilia2211450Clothing, Shoes & Accessories3656163147Costumes & Reenactment Attire17821059Men's Clothing48615724Women's Clothing372155184Unisex Clothing, Shoes & Accs501171146Children's Clothing & Shoes3183082Baby & Toddler Clothing444250Men's Accessories49169291Women's Handbags & Bags763889Women's Shoes114251Women's Accessories291249Video Games3566139973Games2961139971Systems379139969Accessories8648749Wholesale Lots80156595Guides & Manuals2911988Vintage Games2938583Merchandise22187Other20156597Time Cards111233Music1626307CDs14931600Cassettes98306Records2431608Wholesale Lots8618Other Formats3281Jewelry & Watches87714324Watches49110968Fashion Jewelry15440131Wholesale Lots6684605Children's Jewelry110110633Handcrafted, Artisan Jewelry25166298Fine Jewelry1298863Other948579Vintage & Antique Jewelry610290Men's Jewelry310321Jewelry Boxes & Organizers211700Home & Garden802159888Inside the Home44616086Holidays, Cards & Party Supply288159912Yard, Garden & Outdoor Living2611827Wedding Supplies17159907Home Improvement1714339Crafts365160737Sewing & Fabric15311788Scrapbooking & Paper Crafts11331723Beads & Jewelry Making39160706Needlecrafts & Yarn263122Stamping & Embossing9116652Kids' Crafts471183Handcrafted & Finished Pieces811783Art Supplies3160667Home Arts & Crafts128102Multi-Purpose Craft Supplies2260Stamps4684752Topical & Specialty220261United States1364742Europe233499UK (Great Britain)22352Worldwide1147174Asia17162071Africa143468Australia965174Commonwealth/ British Colonial73478Canada7550Art270158658Art from Dealers & Resellers21560435Direct from the Artist45619Musical Instruments34720833Sheet Music & Song Books321100228Instruction Books, CDs & Video1610181Woodwind615197Pro Audio Equipment516212Brass2237Dolls & Bears180238Dolls1291202Dollhouse Miniatures34386Bears142440Paper Dolls264482Sports Mem, Cards & Fan Shop293212Cards18024409Fan Apparel & Souvenirs8550116Game Used Memorabilia951Autographs-Original860591Manufacturer Authenticated650123Vintage Sports Memorabilia499Everything Else16820925Genealogy7588433Other3016706Education & Learning2619266Metaphysical2420924eBay User Tools2102480Information Products61466Weird Stuff416709Memberships1102545Religious Products & Supplies158058Computers & Networking16918793Software11831530Computer Accessories253516Technology Books & Resources811189Vintage Computing4159260Wholesale Lots23667Computer Components2165Drives & Storage2111422Apple Laptops & Notebooks211176Networking & Communications211195Printer Parts, Supplies & Accs2293Electronics6673839iPod & MP3 Players3332852DVD & Home Theater1014948Gadgets9163866Other6170087Stage Lighting & Effects356169iPod & MP3 Accessories314961A/V Accessories & Cables215052Portable Audio & Video126395Health & Beauty5831414Vision Care4733914Tattoos & Body Art431786Makeup267659Natural & Homeopathic Remedies211778Medical, Mobility & Disability111854Hair Care & Salon111863Skin Care1870Pottery & Glass5218875Pottery & China5050693Glass115032Cell Phones & PDAs3720336Cell Phone & PDA Accessories3445065Wholesale Lots311116Coins & Paper Money48256Coins: World383452Exonumia33377Coins: Canada23411Paper Money: World1316Specialty Services4220943Printing & Personalization3747104Web & Computer Services250343Custom Clothing & Jewelry250349eBay Auction Services16000eBay Motors286028Parts & Accessories2812576Business & Industrial2725298Office2311759Businesses & Websites for Sale311874Restaurant & Catering120081Antiques2820086Decorative Arts92195Books & Manuscripts54707Architectural & Garden220082Asian Antiques42218Linens & Textiles (Pre-1930)437958Maps, Atlases & Globes212Other137903Antiquities1100927Periods & Styles13252Travel261310Other1216123Lodging11164803Maps3382Sporting Goods17159043Outdoor Sports11159049Team Sports21513Golf2310Other115273Exercise & Fitness12984Baby1420416Nursery Bedding9117388Keepsakes & Baby Announcements51305Tickets1116071Experiences61306Other416122Event Tickets1625Cameras & Photo53326Vintage Movie & Photography315230Film Cameras229951Photo Albums, Display, Storage11281Pet Supplies420742Dog Supplies431411Gift Certificates1 \ No newline at end of file diff --git a/tests/Zend/Service/Ebay/Finding/_files/get-search-keywords-recomendation.xml b/tests/Zend/Service/Ebay/Finding/_files/get-search-keywords-recomendation.xml deleted file mode 100644 index 5419a577db..0000000000 --- a/tests/Zend/Service/Ebay/Finding/_files/get-search-keywords-recomendation.xml +++ /dev/null @@ -1 +0,0 @@ -Success1.5.02010-08-04T14:44:28.460Zharry \ No newline at end of file diff --git a/tests/Zend/Service/Ebay/Finding/_files/histogram-aspect.xml b/tests/Zend/Service/Ebay/Finding/_files/histogram-aspect.xml deleted file mode 100644 index 3246cab918..0000000000 --- a/tests/Zend/Service/Ebay/Finding/_files/histogram-aspect.xml +++ /dev/null @@ -1 +0,0 @@ -Success1.5.02010-08-08T14:50:12.849ZDesktop_PCsDesktop PCs305017013470315881372787668558547236203181142142102100796461565047393230282419161413121212999988776653333332221111111111111111111149633907149341997569461171024473041016311250453013883325724355485333188752961119831236371602121622542302039118472139495903139746721712236360383953993040063401382511181716518231622714129612301593026646217955469218792196623329249282501926295267092932831713101419474144083150537578310210771955651952774065461416635125366235102494123064256922931674101279334954512080327204185701823113183179756930725925920469821589 diff --git a/tests/Zend/Service/Ebay/Finding/_files/histogram-category.xml b/tests/Zend/Service/Ebay/Finding/_files/histogram-category.xml deleted file mode 100644 index 2c3e04aa21..0000000000 --- a/tests/Zend/Service/Ebay/Finding/_files/histogram-category.xml +++ /dev/null @@ -1 +0,0 @@ -Success1.5.02010-08-08T14:49:15.430Z18793Software16517480327Games & Entertainment36379158911System Utilities & Maintenance272763783Education & Reference260013768Business & Productivity1701741870Children's Software1422841859Graphics & Multimedia11073182Other73553792Apple Software54443805Antivirus & Security496111226Operating Systems4555 diff --git a/tests/Zend/Service/Ebay/_files/Concrete.php b/tests/Zend/Service/Ebay/_files/Concrete.php deleted file mode 100644 index 0d0150d063..0000000000 --- a/tests/Zend/Service/Ebay/_files/Concrete.php +++ /dev/null @@ -1,39 +0,0 @@ -_optionsToNameValueSyntax($options); - } -} diff --git a/tests/Zend/Service/Flickr/AllTests.php b/tests/Zend/Service/Flickr/AllTests.php deleted file mode 100644 index 23947da56e..0000000000 --- a/tests/Zend/Service/Flickr/AllTests.php +++ /dev/null @@ -1,74 +0,0 @@ -addTestSuite('Zend_Service_Flickr_OfflineTest'); - if (defined('TESTS_ZEND_SERVICE_FLICKR_ONLINE_ENABLED') && - constant('TESTS_ZEND_SERVICE_FLICKR_ONLINE_ENABLED')) { - $suite->addTestSuite('Zend_Service_Flickr_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Flickr_OnlineTest_Skip'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Flickr_AllTests::main') { - Zend_Service_Flickr_AllTests::main(); -} diff --git a/tests/Zend/Service/Flickr/OfflineTest.php b/tests/Zend/Service/Flickr/OfflineTest.php deleted file mode 100644 index 5a2d3ee30c..0000000000 --- a/tests/Zend/Service/Flickr/OfflineTest.php +++ /dev/null @@ -1,568 +0,0 @@ -_flickr = new Zend_Service_Flickr(constant('TESTS_ZEND_SERVICE_FLICKR_ONLINE_APIKEY')); - $this->_flickrProxy = new Zend_Service_Flickr_OfflineTest_FlickrProtectedMethodProxy( - constant('TESTS_ZEND_SERVICE_FLICKR_ONLINE_APIKEY') - ); - $this->_filesPath = dirname(__FILE__) . '/_files'; - - /** - * @see Zend_Http_Client_Adapter_Socket - */ - require_once 'Zend/Http/Client/Adapter/Socket.php'; - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - /** - * @see Zend_Http_Client_Adapter_Test - */ - require_once 'Zend/Http/Client/Adapter/Test.php'; - $this->_httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - } - - /** - * Basic testing to ensure that tagSearch() works as expected - * - * @return void - */ - public function testTagSearchBasic() - { - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - $options = array( - 'per_page' => 10, - 'page' => 1, - 'tag_mode' => 'or', - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server' - ); - - $resultSet = $this->_flickr->tagSearch('php', $options); - - $this->assertEquals(4285, $resultSet->totalResultsAvailable); - $this->assertEquals(10, $resultSet->totalResults()); - $this->assertEquals(10, $resultSet->totalResultsReturned); - $this->assertEquals(1, $resultSet->firstResultPosition); - - $this->assertEquals(0, $resultSet->key()); - - try { - $resultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->seek(9); - - try { - $resultSet->seek(10); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->rewind(); - - $resultSetIds = array( - '428222530', - '427883929', - '427884403', - '427887192', - '427883923', - '427884394', - '427883930', - '427884398', - '427883924', - '427884401' - ); - - $this->assertTrue($resultSet->valid()); - - foreach ($resultSetIds as $resultSetId) { - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__ . "-result_$resultSetId")); - $result = $resultSet->current(); - $this->assertTrue($result instanceof Zend_Service_Flickr_Result); - $resultSet->next(); - } - - $this->assertFalse($resultSet->valid()); - } - - /** - * Ensures that userSearch() throws an exception when an invalid username is given - * - * @return void - */ - public function testUserSearchExceptionUsernameInvalid() - { - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - try { - $this->_flickr->userSearch('2e38a9d9425d7e2c9d0788455e9ccc61'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('User not found', $e->getMessage()); - } - } - - /** - * Ensures that userSearch() throws an exception when an invalid e-mail address is given - * - * @return void - */ - public function testUserSearchExceptionEmailInvalid() - { - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - try { - $this->_flickr->userSearch('2e38a9d9425d7e2c9d0788455e9ccc61@example.com'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('User not found', $e->getMessage()); - } - } - - /** - * Ensures that getIdByUsername() throws an exception given an empty argument - * - * @return void - */ - public function testGetIdByUsernameExceptionUsernameEmpty() - { - try { - $this->_flickr->getIdByUsername('0'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('supply a username', $e->getMessage()); - } - } - - /** - * Ensures that getIdByEmail() throws an exception given an empty argument - * - * @return void - */ - public function testGetIdByEmailExceptionEmailEmpty() - { - try { - $this->_flickr->getIdByEmail('0'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('supply an e-mail address', $e->getMessage()); - } - } - - /** - * Ensures that getImageDetails() throws an exception given an empty argument - * - * @return void - */ - public function testGetImageDetailsExceptionIdEmpty() - { - try { - $this->_flickr->getImageDetails('0'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('supply a photo ID', $e->getMessage()); - } - } - - /** - * Ensures that _validateUserSearch() throws an exception when the per_page option is invalid - * - * @return void - */ - public function testValidateUserSearchExceptionPerPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateUserSearch(array('per_page' => -1)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"per_page" option', $e->getMessage()); - } - } - - /** - * Ensures that _validateUserSearch() throws an exception when the page option is invalid - * - * @return void - */ - public function testValidateUserSearchExceptionPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateUserSearch(array('per_page' => 10, 'page' => 1.23)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"page" option', $e->getMessage()); - } - } - - /** - * Ensures that _validateTagSearch() throws an exception when the per_page option is invalid - * - * @return void - */ - public function testValidateTagSearchExceptionPerPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateTagSearch(array('per_page' => -1)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"per_page" option', $e->getMessage()); - } - } - - /** - * Ensures that _validateTagSearch() throws an exception when the page option is invalid - * - * @return void - */ - public function testValidateTagSearchExceptionPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateTagSearch(array('per_page' => 10, 'page' => 1.23)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"page" option', $e->getMessage()); - } - } - - /** - * Ensures that _compareOptions() throws an exception when an option is invalid - * - * @return void - */ - public function testCompareOptionsExceptionOptionInvalid() - { - try { - $this->_flickrProxy->proxyCompareOptions(array('unexpected' => null), array()); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('parameters are invalid', $e->getMessage()); - } - } - - /** - * Ensures that tagSearch() throws an exception when an option is invalid - * - * @return void - */ - public function testTagSearchExceptionOptionInvalid() - { - try { - $this->_flickr->tagSearch('irrelevant', array('unexpected' => null)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('parameters are invalid', $e->getMessage()); - } - } - - /** - * Basic testing to ensure that groupPoolGetPhotos() works as expected - * - * @return void - */ - public function testGroupPoolGetPhotosBasic() - { - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - $options = array( - 'per_page' => 10, - 'page' => 1, - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server' - ); - - $resultSet = $this->_flickr->groupPoolGetPhotos('20083316@N00', $options); - - $this->assertEquals(4285, $resultSet->totalResultsAvailable); - $this->assertEquals(10, $resultSet->totalResults()); - $this->assertEquals(10, $resultSet->totalResultsReturned); - $this->assertEquals(1, $resultSet->firstResultPosition); - - $this->assertEquals(0, $resultSet->key()); - - try { - $resultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->seek(9); - - try { - $resultSet->seek(10); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->rewind(); - - $resultSetIds = array( - '428222530', - '427883929', - '427884403', - '427887192', - '427883923', - '427884394', - '427883930', - '427884398', - '427883924', - '427884401' - ); - - $this->assertTrue($resultSet->valid()); - - foreach ($resultSetIds as $resultSetId) { - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__ . "-result_$resultSetId")); - $result = $resultSet->current(); - $this->assertTrue($result instanceof Zend_Service_Flickr_Result); - $resultSet->next(); - } - - $this->assertFalse($resultSet->valid()); - } - - /** - * Ensures that groupPoolGetPhotos() throws an exception when an option is invalid - * - * @return void - */ - public function testGroupPoolGetPhotosExceptionOptionInvalid() - { - try { - $this->_flickr->groupPoolGetPhotos('irrelevant', array('unexpected' => null)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('parameters are invalid', $e->getMessage()); - } - } - - /** - * Ensures that _validateGroupPoolGetPhotos() throws an exception when the per_page option is invalid - * - * @return void - */ - public function testValidateGroupPoolGetPhotosExceptionPerPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateGroupPoolGetPhotos(array('per_page' => -1)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"per_page" option', $e->getMessage()); - } - } - - /** - * Ensures that _validateGroupPoolGetPhotos() throws an exception when the page option is invalid - * - * @return void - */ - public function testValidateGroupPoolGetPhotosExceptionPageInvalid() - { - try { - $this->_flickrProxy->proxyValidateGroupPoolGetPhotos(array('per_page' => 10, 'page' => 1.23)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('"page" option', $e->getMessage()); - } - } - - /** - * Ensures that groupPoolGetPhotos() throws an exception when an invalid group_id is given - * - * @return void - */ - public function testGroupPoolGetPhotosExceptionGroupIdInvalid() - { - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - try { - $this->_flickr->groupPoolGetPhotos('2e38a9d9425d7e2c9d0788455e9ccc61'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('Group not found', $e->getMessage()); - } - } - - /** - * Ensures that groupPoolGetPhotos() throws an exception when an invalid group_id is given - * - * @return void - */ - public function testGroupPoolGetPhotosExceptionGroupIdEmpty() - { - try { - $this->_flickr->groupPoolGetPhotos('0'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('supply a group id', $e->getMessage()); - } - } - - /** - * Ensures that groupPoolGetPhotos() throws an exception when an array is given for group_id - * - * @return void - */ - public function testGroupPoolGetPhotosExceptionGroupIdArray() - { - try { - $this->_flickr->groupPoolGetPhotos(array()); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('supply a group id', $e->getMessage()); - } - } - - /** - * Utility method that saves an HTTP response to a file - * - * @param string $name - * @return void - */ - protected function _saveResponse($name) - { - file_put_contents("$this->_filesPath/$name.response", - $this->_flickr->getRestClient()->getHttpClient()->getLastResponse()->asString()); - } - - /** - * Utility method for returning a string HTTP response, which is loaded from a file - * - * @param string $name - * @return string - */ - protected function _loadResponse($name) - { - $message = file_get_contents(sprintf('%s/%s.response', $this->_filesPath, $name)); - // Line endings are sometimes an issue inside the canned responses; the - // following is a negative lookbehind assertion, and replaces any \n - // not preceded by \r with the sequence \r\n, ensuring that the message - // is well-formed. - return preg_replace("#(?_validateUserSearch($options); - } - - public function proxyValidateTagSearch(array $options) - { - $this->_validateTagSearch($options); - } - - public function proxyValidateGroupPoolGetPhotos(array $options) - { - $this->_validateGroupPoolGetPhotos($options); - } - - public function proxyCompareOptions(array $options, array $validOptions) - { - $this->_compareOptions($options, $validOptions); - } -} diff --git a/tests/Zend/Service/Flickr/OnlineTest.php b/tests/Zend/Service/Flickr/OnlineTest.php deleted file mode 100644 index beb21fd07a..0000000000 --- a/tests/Zend/Service/Flickr/OnlineTest.php +++ /dev/null @@ -1,232 +0,0 @@ -_flickr = new Zend_Service_Flickr(constant('TESTS_ZEND_SERVICE_FLICKR_ONLINE_APIKEY')); - - /** - * @see Zend_Http_Client_Adapter_Socket - */ - require_once 'Zend/Http/Client/Adapter/Socket.php'; - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_flickr->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - } - - /** - * Basic testing to ensure that groupPoolGetPhotos works as expected - * - * @return void - */ - public function testGroupPoolGetPhotosBasic() - { - $options = array('per_page' => 10, - 'page' => 1, - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server'); - - $resultSet = $this->_flickr->groupPoolGetPhotos('20083316@N00', $options); - - $this->assertGreaterThan(20000, $resultSet->totalResultsAvailable); - $this->assertEquals(10, $resultSet->totalResults()); - $this->assertEquals(10, $resultSet->totalResultsReturned); - $this->assertEquals(1, $resultSet->firstResultPosition); - - $this->assertEquals(0, $resultSet->key()); - - try { - $resultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->seek(9); - - try { - $resultSet->seek(10); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->rewind(); - - $count = 0; - foreach ($resultSet as $result) { - $this->assertTrue($result instanceof Zend_Service_Flickr_Result); - $count++; - } - - $this->assertEquals(10, $count); - } - - /** - * Basic testing to ensure that userSearch() works as expected - * - * @return void - */ - public function testUserSearchBasic() - { - $options = array('per_page' => 10, - 'page' => 1, - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server'); - - $resultSet = $this->_flickr->userSearch('darby.felton@yahoo.com', $options); - - $this->assertEquals(16, $resultSet->totalResultsAvailable); - $this->assertEquals(10, $resultSet->totalResults()); - $this->assertEquals(10, $resultSet->totalResultsReturned); - $this->assertEquals(1, $resultSet->firstResultPosition); - - $this->assertEquals(0, $resultSet->key()); - - try { - $resultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->seek(9); - - try { - $resultSet->seek(10); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - $resultSet->rewind(); - - $count = 0; - foreach ($resultSet as $result) { - $this->assertTrue($result instanceof Zend_Service_Flickr_Result); - $count++; - } - - $this->assertEquals(10, $count); - } - - /** - * Basic testing to ensure that getIdByUsername() works as expected - * - * @return void - */ - public function testGetIdByUsernameBasic() - { - $userId = $this->_flickr->getIdByUsername('darby.felton'); - $this->assertEquals('7414329@N07', $userId); - } - - /** - * Ensures that tagSearch() works as expected with the sort option - * - * @return void - */ - public function testTagSearchOptionSort() - { - $options = array( - 'per_page' => 10, - 'page' => 1, - 'tag_mode' => 'or', - 'sort' => 'date-taken-asc', - 'extras' => 'license, date_upload, date_taken, owner_name, icon_server' - ); - - $resultSet = $this->_flickr->tagSearch('php', $options); - - $this->assertTrue(10 < $resultSet->totalResultsAvailable); - $this->assertEquals(10, $resultSet->totalResults()); - $this->assertEquals(10, $resultSet->totalResultsReturned); - $this->assertEquals(1, $resultSet->firstResultPosition); - - foreach ($resultSet as $result) { - $this->assertTrue($result instanceof Zend_Service_Flickr_Result); - if (isset($dateTakenPrevious)) { - $this->assertTrue(strcmp($result->datetaken, $dateTakenPrevious) > 0); - } - $dateTakenPrevious = $result->datetaken; - } - } - - /** - * @see ZF-6397 - */ - function testTotalForEmptyResultSet() - { - $this->assertEquals(0, $this->_flickr->tagSearch('zendflickrtesttagnoresults')->totalResults()); - } -} - -/** - * @category Zend - * @package Zend_Service_Flickr - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Flickr - */ -class Zend_Service_Flickr_OnlineTest_Skip extends PHPUnit_Framework_TestCase -{ - public function testNothing() - { - $this->markTestSkipped('Zend_Service_Flickr online tests not enabled in TestConfiguration.php'); - } -} diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883923.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883923.response deleted file mode 100644 index 14179fc5c5..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883923.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 828 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883924.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883924.response deleted file mode 100644 index fc7c240ae0..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883924.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883929.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883929.response deleted file mode 100644 index e7abc41d96..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883929.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:46 GMT -Server: Apache/2.0.52 -Content-length: 829 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883930.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883930.response deleted file mode 100644 index 0c6facd9a8..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427883930.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884394.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884394.response deleted file mode 100644 index c9db414814..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884394.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 641 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884398.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884398.response deleted file mode 100644 index ed426ded98..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884398.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884401.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884401.response deleted file mode 100644 index 25e075d772..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884401.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:49 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884403.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884403.response deleted file mode 100644 index 5edaa17051..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427884403.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:46 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427887192.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427887192.response deleted file mode 100644 index 8d3f6230b1..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_427887192.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_428222530.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_428222530.response deleted file mode 100644 index 5a1c379d39..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic-result_428222530.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:45 GMT -Server: Apache/2.0.52 -Content-length: 1020 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic.response deleted file mode 100644 index 30af253a0e..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosBasic.response +++ /dev/null @@ -1,22 +0,0 @@ -HTTP/1.1 200 OK -Date: Wed, 21 Mar 2007 20:00:46 GMT -Server: Apache/2.0.52 -Content-length: 3023 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosExceptionGroupIdInvalid.response b/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosExceptionGroupIdInvalid.response deleted file mode 100644 index 9a11cb62c8..0000000000 --- a/tests/Zend/Service/Flickr/_files/testGroupPoolGetPhotosExceptionGroupIdInvalid.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 29 Mar 2007 23:28:10 GMT -Server: Apache/2.0.52 -Content-length: 105 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883923.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883923.response deleted file mode 100644 index 14179fc5c5..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883923.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 828 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883924.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883924.response deleted file mode 100644 index fc7c240ae0..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883924.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883929.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883929.response deleted file mode 100644 index e7abc41d96..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883929.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:46 GMT -Server: Apache/2.0.52 -Content-length: 829 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883930.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883930.response deleted file mode 100644 index 0c6facd9a8..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427883930.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884394.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884394.response deleted file mode 100644 index c9db414814..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884394.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 641 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884398.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884398.response deleted file mode 100644 index ed426ded98..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884398.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:48 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884401.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884401.response deleted file mode 100644 index 25e075d772..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884401.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:49 GMT -Server: Apache/2.0.52 -Content-length: 1012 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884403.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884403.response deleted file mode 100644 index 5edaa17051..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427884403.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:46 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427887192.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427887192.response deleted file mode 100644 index 8d3f6230b1..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_427887192.response +++ /dev/null @@ -1,15 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:47 GMT -Server: Apache/2.0.52 -Content-length: 639 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_428222530.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_428222530.response deleted file mode 100644 index 5a1c379d39..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic-result_428222530.response +++ /dev/null @@ -1,17 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 22 Mar 2007 19:09:45 GMT -Server: Apache/2.0.52 -Content-length: 1020 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testTagSearchBasic.response b/tests/Zend/Service/Flickr/_files/testTagSearchBasic.response deleted file mode 100644 index 30af253a0e..0000000000 --- a/tests/Zend/Service/Flickr/_files/testTagSearchBasic.response +++ /dev/null @@ -1,22 +0,0 @@ -HTTP/1.1 200 OK -Date: Wed, 21 Mar 2007 20:00:46 GMT -Server: Apache/2.0.52 -Content-length: 3023 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testUserSearchExceptionEmailInvalid.response b/tests/Zend/Service/Flickr/_files/testUserSearchExceptionEmailInvalid.response deleted file mode 100644 index 29fb4e7d6e..0000000000 --- a/tests/Zend/Service/Flickr/_files/testUserSearchExceptionEmailInvalid.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 29 Mar 2007 23:28:10 GMT -Server: Apache/2.0.52 -Content-length: 104 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - diff --git a/tests/Zend/Service/Flickr/_files/testUserSearchExceptionUsernameInvalid.response b/tests/Zend/Service/Flickr/_files/testUserSearchExceptionUsernameInvalid.response deleted file mode 100644 index 29fb4e7d6e..0000000000 --- a/tests/Zend/Service/Flickr/_files/testUserSearchExceptionUsernameInvalid.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 200 OK -Date: Thu, 29 Mar 2007 23:28:10 GMT -Server: Apache/2.0.52 -Content-length: 104 -Connection: close -Content-type: text/xml; charset=utf-8 - - - - - diff --git a/tests/Zend/Service/LiveDocx/AllTests.php b/tests/Zend/Service/LiveDocx/AllTests.php deleted file mode 100644 index 3eeccdd441..0000000000 --- a/tests/Zend/Service/LiveDocx/AllTests.php +++ /dev/null @@ -1,62 +0,0 @@ -addTestSuite('Zend_Service_LiveDocx_LiveDocxTest'); - $suite->addTestSuite('Zend_Service_LiveDocx_MailMergeTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_LiveDocx_AllTests::main') { - Zend_Service_LiveDocx_AllTests::main(); -} diff --git a/tests/Zend/Service/LiveDocx/LiveDocxTest.php b/tests/Zend/Service/LiveDocx/LiveDocxTest.php deleted file mode 100644 index bf5bd1e404..0000000000 --- a/tests/Zend/Service/LiveDocx/LiveDocxTest.php +++ /dev/null @@ -1,97 +0,0 @@ -markTestSkipped('LiveDocx tests disabled'); - return; - } - - $this->phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $this->phpLiveDocx->setUsername(TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - - foreach ($this->phpLiveDocx->listTemplates() as $template) { - $this->phpLiveDocx->deleteTemplate($template['filename']); - } - } - - public function tearDown () - { - if (isset($this->phpLiveDocx)) { - foreach ($this->phpLiveDocx->listTemplates() as $template) { - $this->phpLiveDocx->deleteTemplate($template['filename']); - } - unset($this->phpLiveDocx); - } - } - - public function testGetFormat () - { - $this->assertEquals('', $this->phpLiveDocx->getFormat('document')); - $this->assertEquals('doc', $this->phpLiveDocx->getFormat('document.doc')); - $this->assertEquals('doc', $this->phpLiveDocx->getFormat('document-123.doc')); - $this->assertEquals('doc', $this->phpLiveDocx->getFormat('document123.doc')); - $this->assertEquals('doc', $this->phpLiveDocx->getFormat('document.123.doc')); - } - - public function testGetVersion () - { - $expectedResults = '2.0'; - $this->assertEquals($expectedResults, $this->phpLiveDocx->getVersion()); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_LiveDocx_LiveDocxTest::main') { - Zend_Service_LiveDocx_LiveDocxTest::main(); -} diff --git a/tests/Zend/Service/LiveDocx/MailMerge/image-01.png b/tests/Zend/Service/LiveDocx/MailMerge/image-01.png deleted file mode 100755 index 50f44d2dbd055ba75193c1bbbf75de990396ac5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfEiP7eRgGI>!jFJLk|nMYCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5(HleBwYwa-J@ZArXh)9yDYG@(wNd>YvLIzW~StfgilGbqtK|o-h7`c%H6) JF6*2UngB;lD^vgg diff --git a/tests/Zend/Service/LiveDocx/MailMerge/image-02.png b/tests/Zend/Service/LiveDocx/MailMerge/image-02.png deleted file mode 100755 index 51df1173d8d6909c752c8a17a2866cde584ea72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 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 A`Tzg` diff --git a/tests/Zend/Service/LiveDocx/MailMerge/phpunit-template.docx b/tests/Zend/Service/LiveDocx/MailMerge/phpunit-template.docx deleted file mode 100755 index 5854b708bfe384040498e9ce26b6d38ad0e13120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47773 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'LiveDocx tests disabled'); - return; - } - - $this->phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $this->phpLiveDocx->setUsername(TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME) - ->setPassword(TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - - foreach($this->phpLiveDocx->listTemplates() as $template) { - $this->phpLiveDocx->deleteTemplate($template['filename']); - } - - $this->path = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MailMerge'); - } - - public function tearDown() - { - if (isset($this->phpLiveDocx)) { - foreach($this->phpLiveDocx->listTemplates() as $template) { - $this->phpLiveDocx->deleteTemplate($template['filename']); - } - - unset($this->phpLiveDocx); - } - } - - // ------------------------------------------------------------------------- - - public function testLoginUsernamePassword() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $phpLiveDocx->setUsername(TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME); - $phpLiveDocx->setPassword(TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - $this->assertTrue($phpLiveDocx->logIn()); - } - - public function testLoginUsernamePasswordSoapClient() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $phpLiveDocx->setUsername(TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME); - $phpLiveDocx->setPassword(TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD); - $phpLiveDocx->setSoapClient(new Zend_Soap_Client(self::ENDPOINT)); - $this->assertTrue($phpLiveDocx->logIn()); - } - - /** - * @expectedException Zend_Service_LiveDocx_Exception - */ - public function testLoginUsernamePasswordException() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $phpLiveDocx->setUsername('phpunitInvalidUsername'); - $phpLiveDocx->setPassword('phpunitInvalidPassword'); - $phpLiveDocx->logIn(); - } - - /** - * @expectedException Zend_Service_LiveDocx_Exception - */ - public function testLoginUsernamePasswordSoapClientException() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge(); - $phpLiveDocx->setUsername('phpunitInvalidUsername'); - $phpLiveDocx->setPassword('phpunitInvalidPassword'); - $phpLiveDocx->setSoapClient(new Zend_Soap_Client(self::ENDPOINT)); - $phpLiveDocx->logIn(); - } - - public function testConstructorOptionsUsernamePassword() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge( - array ( - 'username' => TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME, - 'password' => TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD - ) - ); - $this->assertTrue($phpLiveDocx->logIn()); - } - - public function testConstructorOptionsUsernamePasswordSoapClient() - { - $phpLiveDocx = new Zend_Service_LiveDocx_MailMerge( - array ( - 'username' => TESTS_ZEND_SERVICE_LIVEDOCX_USERNAME, - 'password' => TESTS_ZEND_SERVICE_LIVEDOCX_PASSWORD, - 'soapClient' => new Zend_Soap_Client(self::ENDPOINT) - ) - ); - $this->assertTrue($phpLiveDocx->logIn()); - } - - // ------------------------------------------------------------------------- - - public function testSetLocalTemplate() - { - $this->assertTrue(is_a($this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1), 'Zend_Service_LiveDocx_MailMerge')); - $this->setExpectedException('Zend_Service_LiveDocx_Exception'); - @$this->phpLiveDocx->setLocalTemplate('phpunit-nonexistent.doc'); - } - - public function testSetRemoteTemplate() - { - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_1), 'Zend_Service_LiveDocx_MailMerge')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - } - - public function testSetFieldValues() - { - $testValues = array('software' => 'phpunit'); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->setFieldValues($testValues), 'Zend_Service_LiveDocx_MailMerge')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->setFieldValues($testValues), 'Zend_Service_LiveDocx_MailMerge')); - } - - public function testSetFieldValue() - { - $testKey = 'software'; - $testValue = 'phpunit'; - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->setFieldValue($testKey, $testValue), 'Zend_Service_LiveDocx_MailMerge')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->setFieldValue($testKey, $testValue), 'Zend_Service_LiveDocx_MailMerge')); - } - - public function testAssign() - { - $testKey = 'software'; - $testValue = 'phpunit'; - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->assign($testKey, $testValue), 'Zend_Service_LiveDocx_MailMerge')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->assertTrue(is_a($this->phpLiveDocx->assign($testKey, $testValue), 'Zend_Service_LiveDocx_MailMerge')); - } - - public function testSetBlockFieldValues() - { - $testKey = 'connection'; - $testValues = array(array('connection_number' => 'unittest', 'connection_duration' => 'unittest', 'fee' => 'unittest'), - array('connection_number' => 'unittest', 'connection_duration' => 'unittest', 'fee' => 'unittest'), - array('connection_number' => 'unittest', 'connection_duration' => 'unittest', 'fee' => 'unittest'), - array('connection_number' => 'unittest', 'connection_duration' => 'unittest', 'fee' => 'unittest') ); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertTrue(is_a($this->phpLiveDocx->setBlockFieldValues($testKey, $testValues), 'Zend_Service_LiveDocx_MailMerge')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertTrue(is_a($this->phpLiveDocx->setBlockFieldValues($testKey, $testValues), 'Zend_Service_LiveDocx_MailMerge')); - } - - // ------------------------------------------------------------------------- - - public function testCreateDocument() - { - $testValues = array( - 'software' => 'phpunit', - 'licensee' => 'phpunit', - 'company' => 'phpunit', - 'date' => 'phpunit', - 'time' => 'phpunit', - 'city' => 'phpunit', - 'country' => 'phpunit', - ); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->assertNull($this->phpLiveDocx->createDocument()); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->assertNull($this->phpLiveDocx->createDocument()); - } - - public function testRetrieveDocument() - { - $testValues = array( - 'software' => 'phpunit', - 'licensee' => 'phpunit', - 'company' => 'phpunit', - 'date' => 'phpunit', - 'time' => 'phpunit', - 'city' => 'phpunit', - 'country' => 'phpunit', - ); - - // PDF and DOCs are always slightly different: - // - PDF because of the timestamp in meta data - // - DOC because of ??? - - $expectedResults = array( - 'docx' => 'f21728491855c27a9e64a47266c2a720', - 'rtf' => 'fb75deabf481b0264927cb4a5c9db765', - 'txd' => 'd1f645405ded0718edff6ae6f50a496e', - 'txt' => 'ec2f680646540edd79cd22773fa7e183', - 'html' => 'e3a28523794b0071501c09f791f8c795', - ); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($expectedResults as $format => $hash) { - $document = $this->phpLiveDocx->retrieveDocument($format); - $this->assertEquals($hash, md5($document)); - } - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($expectedResults as $format => $hash) { - $document = $this->phpLiveDocx->retrieveDocument($format); - $this->assertEquals($hash, md5($document)); - } - } - - public function testRetrieveDocumentAppended() - { - $testValues = array( - array( - 'software' => 'phpunit - document 1', - 'licensee' => 'phpunit - document 1', - 'company' => 'phpunit - document 1', - 'date' => 'phpunit - document 1', - 'time' => 'phpunit - document 1', - 'city' => 'phpunit - document 1', - 'country' => 'phpunit - document 1', - ), - array( - 'software' => 'phpunit - document 2', - 'licensee' => 'phpunit - document 2', - 'company' => 'phpunit - document 2', - 'date' => 'phpunit - document 2', - 'time' => 'phpunit - document 2', - 'city' => 'phpunit - document 2', - 'country' => 'phpunit - document 2', - ), - ); - - // PDF and DOCs are always slightly different: - // - PDF because of the timestamp in meta data - // - DOC because of ??? - $expectedResults = array( - 'docx' => '2757b4d10c8c031d8f501231be39fcfe', - 'rtf' => '2997e531011d826f315291fca1351988', - 'txd' => '8377a5a62f2e034974fc299c322d137f', - 'txt' => 'a7d23668f81b314e15d653ab657316f9', - 'html' => '57365a2ff02347a7863626317505e037', - ); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($expectedResults as $format => $hash) { - $document = $this->phpLiveDocx->retrieveDocument($format); - $this->assertEquals($hash, md5($document)); - } - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($expectedResults as $format => $hash) { - $document = $this->phpLiveDocx->retrieveDocument($format); - $this->assertEquals($hash, md5($document)); - } - } - - // ------------------------------------------------------------------------- - - public function testGetTemplateFormats() - { - $expectedResults = array('doc' , 'docx' , 'rtf' , 'txd'); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getTemplateFormats()); - } - - public function testGetDocumentFormats() - { - $expectedResults = array('doc' , 'docx' , 'html' , 'pdf' , 'rtf' , 'txd' , 'txt'); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getDocumentFormats()); - } - - public function testGetImageImportFormats() - { - $expectedResults = array('bmp' , 'gif' , 'jpg' , 'png' , 'tiff', 'wmf'); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getImageImportFormats()); - } - - public function testGetImageExportFormats() - { - $expectedResults = array('bmp' , 'gif' , 'jpg' , 'png' , 'tiff'); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getImageExportFormats()); - } - - // ------------------------------------------------------------------------- - - public function testGetBitmaps() - { - $testValues = array( - 'software' => 'phpunit', - 'licensee' => 'phpunit', - 'company' => 'phpunit', - 'date' => 'phpunit', - 'time' => 'phpunit', - 'city' => 'phpunit', - 'country' => 'phpunit', - ); - - $expectedResults = array( - 'bmp' => 'a1934f2153172f021847af7ece9049ce', - 'gif' => 'd7281d7b6352ff897917e25d6b92746f', - 'jpg' => 'e0b20ea2c9a6252886f689f227109085', - 'png' => 'c449f0c2726f869e9a42156e366f1bf9', - 'tiff' => '20a96a94762a531e9879db0aa6bd673f', - ); - - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($this->phpLiveDocx->getImageExportFormats() as $format) { - $bitmaps = $this->phpLiveDocx->getBitmaps(1, 1, 20, $format); - $this->assertEquals($expectedResults[$format], md5(serialize($bitmaps))); - } - } - - public function testGetAllBitmaps() - { - $testValues = array( - 'software' => 'phpunit', - 'licensee' => 'phpunit', - 'company' => 'phpunit', - 'date' => 'phpunit', - 'time' => 'phpunit', - 'city' => 'phpunit', - 'country' => 'phpunit', - ); - - $expectedResults = array( - 'bmp' => 'e8a884ee61c394deec8520fb397d1cf1', - 'gif' => '2255fee47b4af8438b109efc3cb0d304', - 'jpg' => 'e1acfc3001fc62567de2a489eccdb552', - 'png' => '15eac34d08e602cde042862b467fa865', - 'tiff' => '98bad79380a80c9cc43dfffc5158d0f9', - ); - - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->assign($testValues); - $this->phpLiveDocx->createDocument(); - foreach($this->phpLiveDocx->getImageExportFormats() as $format) { - $bitmaps = $this->phpLiveDocx->getAllBitmaps(20, $format); - $this->assertEquals($expectedResults[$format], md5(serialize($bitmaps))); - } - } - - public function testGetFontNames() - { - $fonts = $this->phpLiveDocx->getFontNames(); - if (is_array($fonts) && count($fonts) > 5) { - foreach (array('Courier New' , 'Verdana' , 'Arial' , 'Times New Roman') as $font) { - if (in_array($font, $fonts)) { - $this->assertTrue(true); - } else { - $this->assertTrue(false); - } - } - } else { - $this->assertTrue(false); - } - } - - public function testGetFieldNames() - { - $expectedResults = array('phone', 'date', 'name', 'customer_number', 'invoice_number', 'account_number', 'service_phone', 'service_fax', 'month', 'monthly_fee', 'total_net', 'tax', 'tax_value', 'total'); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getFieldNames()); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getFieldNames()); - } - - public function testGetBlockFieldNames() - { - $expectedResults = array('connection_number', 'connection_duration', 'fee'); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getBlockFieldNames('connection')); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getBlockFieldNames('connection')); - } - - public function testGetBlockNames() - { - $expectedResults = array('connection'); - - // Remote Template - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->phpLiveDocx->setRemoteTemplate(self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getBlockNames()); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - - // Local Template - $this->phpLiveDocx->setLocalTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, $this->phpLiveDocx->getBlockNames()); - } - - // ------------------------------------------------------------------------- - - public function testUploadTemplate() - { - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - $this->assertNull($this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2)); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - } - - public function testDownloadTemplate() - { - $expectedResults = '2f076af778ca5f8afc9661cfb9deb7c6'; - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $template = $this->phpLiveDocx->downloadTemplate(self::TEST_TEMPLATE_2); - $this->assertEquals($expectedResults, md5($template)); - } - - public function testDeleteTemplate() - { - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - $templateDeleted = true; - foreach($this->phpLiveDocx->listTemplates() as $template) { - if($template['filename'] == self::TEST_TEMPLATE_2) { - $templateDeleted = false; - } - } - $this->assertTrue($templateDeleted); - } - - public function testListTemplates() - { - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_1); - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - - // Where templates uploaded and are being listed? - $testTemplate1Exists = false; - $testTemplate2Exists = false; - - $templates = $this->phpLiveDocx->listTemplates(); - foreach($templates as $template) { - if(self::TEST_TEMPLATE_1 === $template['filename']) { - $testTemplate1Exists = true; - } elseif(self::TEST_TEMPLATE_2 === $template['filename']) { - $testTemplate2Exists = true; - } - } - $this->assertTrue($testTemplate1Exists && $testTemplate2Exists); - - // Is all info about templates available? - $expectedResults = array('filename', 'fileSize', 'createTime', 'modifyTime'); - foreach($templates as $template) { - $this->assertEquals($expectedResults, array_keys($template)); - } - - // Is all info about templates correct? - foreach($templates as $template) { - $this->assertTrue(strlen($template['filename']) > 0); - $this->assertTrue($template['fileSize'] > 1); - $this->assertTrue($template['createTime'] > mktime(0, 0, 0, 1, 1, 1980)); - $this->assertTrue($template['modifyTime'] > mktime(0, 0, 0, 1, 1, 1980)); - } - - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_1); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - } - - public function testTemplateExists() - { - $this->phpLiveDocx->uploadTemplate($this->path . DIRECTORY_SEPARATOR . self::TEST_TEMPLATE_2); - $this->assertTrue($this->phpLiveDocx->templateExists(self::TEST_TEMPLATE_2)); - $this->phpLiveDocx->deleteTemplate(self::TEST_TEMPLATE_2); - } - - // ------------------------------------------------------------------------- - - public function testUploadImage() - { - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_2); - $this->assertNull($this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_2)); - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_2); - } - - public function testDownloadImage() - { - $expectedResults = 'f8b663e465acd570414395d5c33541ab'; - $this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_2); - $image = $this->phpLiveDocx->downloadImage(self::TEST_IMAGE_2); - $this->assertEquals($expectedResults, md5($image)); - } - - public function testDeleteImage() - { - $this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_2); - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_2); - $imageDeleted = true; - foreach($this->phpLiveDocx->listImages() as $image) { - if($image['filename'] == self::TEST_IMAGE_2) { - $imageDeleted = false; - } - } - $this->assertTrue($imageDeleted); - } - - public function testListImages() - { - $this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_1); - $this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_2); - - // Where images uploaded and are being listed? - $testImage1Exists = false; - $testImage2Exists = false; - - $images = $this->phpLiveDocx->listImages(); - foreach($images as $image) { - if(self::TEST_IMAGE_1 === $image['filename']) { - $testImage1Exists = true; - } elseif(self::TEST_IMAGE_2 === $image['filename']) { - $testImage2Exists = true; - } - } - $this->assertTrue($testImage1Exists && $testImage2Exists); - - // Is all info about images available? - $expectedResults = array('filename', 'fileSize', 'createTime', 'modifyTime'); - foreach($images as $image) { - $this->assertEquals($expectedResults, array_keys($image)); - } - - // Is all info about images correct? - foreach($images as $image) { - $this->assertTrue(strlen($image['filename']) > 0); - $this->assertTrue($image['fileSize'] > 1); - $this->assertTrue($image['createTime'] > mktime(0, 0, 0, 1, 1, 1980)); - $this->assertTrue($image['modifyTime'] > mktime(0, 0, 0, 1, 1, 1980)); - } - - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_1); - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_2); - } - - public function testImageExists() - { - $this->phpLiveDocx->uploadImage($this->path . DIRECTORY_SEPARATOR . self::TEST_IMAGE_2); - $this->assertTrue($this->phpLiveDocx->imageExists(self::TEST_IMAGE_2)); - $this->phpLiveDocx->deleteImage(self::TEST_IMAGE_2); - } - - // ------------------------------------------------------------------------- - - public function testAssocArrayToArrayOfArrayOfString() - { - $testValues = array( - 'a' => '1', - 'b' => '2', - 'c' => '3', - ); - - $expectedResults = array( - array('a', 'b', 'c'), - array('1', '2', '3'), - ); - - $actualResults = Zend_Service_LiveDocx_MailMerge::assocArrayToArrayOfArrayOfString($testValues); - $this->assertEquals($expectedResults, $actualResults); - } - - public function testMultiAssocArrayToArrayOfArrayOfString() - { - $testValues = array( - array( - 'a' => '1', - 'b' => '2', - 'c' => '3', - ), - array( - 'a' => '4', - 'b' => '5', - 'c' => '6', - ), - array( - 'a' => '7', - 'b' => '8', - 'c' => '9', - ), - ); - - $expectedResults = array( - array('a', 'b', 'c'), - array('1', '2', '3'), - array('4', '5', '6'), - array('7', '8', '9'), - ); - $actualResults = Zend_Service_LiveDocx_MailMerge::multiAssocArrayToArrayOfArrayOfString($testValues); - $this->assertEquals($expectedResults, $actualResults); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_LiveDocx_MailMergeTest::main') { - Zend_Service_LiveDocx_MailMergeTest::main(); -} diff --git a/tests/Zend/Service/Rackspace/AllTests.php b/tests/Zend/Service/Rackspace/AllTests.php deleted file mode 100644 index dd287761f6..0000000000 --- a/tests/Zend/Service/Rackspace/AllTests.php +++ /dev/null @@ -1,62 +0,0 @@ -addTest(Zend_Service_Rackspace_Files_AllTests::suite()); - $suite->addTest(Zend_Service_Rackspace_Servers_AllTests::suite()); - - $suite->addTestSuite('Zend_Service_Rackspace_OfflineTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Rackspace_AllTests::main') { - Zend_Service_Rackspace_AllTests::main(); -} diff --git a/tests/Zend/Service/Rackspace/Files/AllTests.php b/tests/Zend/Service/Rackspace/Files/AllTests.php deleted file mode 100644 index c5534eb429..0000000000 --- a/tests/Zend/Service/Rackspace/Files/AllTests.php +++ /dev/null @@ -1,57 +0,0 @@ -addTestSuite('Zend_Service_Rackspace_Files_OfflineTest'); - $suite->addTestSuite('Zend_Service_Rackspace_Files_OnlineTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Rackspace_Files_AllTests::main') { - Zend_Service_Rackspace_Files_AllTests::main(); -} diff --git a/tests/Zend/Service/Rackspace/Files/OfflineTest.php b/tests/Zend/Service/Rackspace/Files/OfflineTest.php deleted file mode 100644 index fbc008a524..0000000000 --- a/tests/Zend/Service/Rackspace/Files/OfflineTest.php +++ /dev/null @@ -1,377 +0,0 @@ -rackspace = new Zend_Service_Rackspace_Files('foo', 'bar'); - - $this->container = new Zend_Service_Rackspace_Files_Container( - $this->rackspace, - array( - 'name' => TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME - ) - ); - - $this->httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - - $this->rackspace->getHttpClient()->setAdapter( - $this->httpClientAdapterTest - ); - - // authentication (from a file) - $this->httpClientAdapterTest->setResponse( - self::loadResponse('../../_files/testAuthenticate') - ); - $this->assertTrue( - $this->rackspace->authenticate(), 'Authentication failed' - ); - - $this->metadata = array( - 'foo' => 'bar', - 'foo2' => 'bar2' - ); - - $this->metadata2 = array( - 'hello' => 'world' - ); - - // load the HTTP response (from a file) - $this->httpClientAdapterTest->setResponse( - $this->loadResponse($this->getName()) - ); - } - - /** - * Utility method for returning a string HTTP response, which is loaded from a file - * - * @param string $name - * - * @return string - */ - protected function loadResponse($name) - { - return file_get_contents(__DIR__ . '/_files/' . $name . '.response'); - } - - public function testCreateContainer() - { - $container = - $this->rackspace->createContainer('zf-unit-test', $this->metadata); - $this->assertTrue($container !== false); - $this->assertEquals($container->getName(), 'zf-unit-test'); - } - - public function testGetCountContainers() - { - $num = $this->rackspace->getCountContainers(); - $this->assertTrue($num > 0); - } - - public function testGetContainer() - { - $container = $this->rackspace->getContainer('zf-unit-test'); - $this->assertTrue($container !== false); - $this->assertEquals($container->getName(), 'zf-unit-test'); - } - - public function testGetContainers() - { - $containers = $this->rackspace->getContainers(); - $this->assertTrue($containers !== false); - $found = false; - foreach ($containers as $container) { - if ($container->getName() == 'zf-unit-test') { - $found = true; - break; - } - } - $this->assertTrue($found); - } - - public function testGetMetadataContainer() - { - $data = $this->rackspace->getMetadataContainer('zf-unit-test'); - $this->assertTrue($data !== false); - $this->assertEquals($data['name'], 'zf-unit-test'); - $this->assertEquals($data['metadata'], $this->metadata); - } - - public function testGetInfoAccount() - { - $data = $this->rackspace->getInfoAccount(); - $this->assertTrue($data !== false); - $this->assertTrue($data['tot_containers'] > 0); - } - - public function testStoreObject() - { - $content = 'This is a test!'; - $result = $this->rackspace->storeObject( - 'zf-unit-test', - 'zf-object-test', - $content, - $this->metadata - ); - $this->assertTrue($result); - } - - public function testGetObject() - { - $object = $this->rackspace->getObject( - 'zf-unit-test', - 'zf-object-test' - ); - $this->assertTrue($object !== false); - $this->assertEquals($object->getName(), 'zf-object-test'); - $this->assertEquals($object->getSize(), 15); - $this->assertEquals($object->getMetadata(), $this->metadata); - } - - public function testCopyObject() - { - $result = $this->rackspace->copyObject( - 'zf-unit-test', - 'zf-object-test', - 'zf-unit-test', - 'zf-object-test' . '-copy' - ); - $this->assertTrue($result); - $this->assertNotContains('application/x-www-form-urlencoded', $this->rackspace->getHttpClient()->getLastRequest()); - } - - public function testGetObjects() - { - $objects = $this->rackspace->getObjects('zf-unit-test'); - $this->assertTrue($objects !== false); - - $this->assertEquals($objects[0]->getName(), 'zf-object-test'); - $this->assertEquals($objects[1]->getName(), 'zf-object-test' . '-copy'); - } - - /** - * @group GH-68 - */ - public function testGetObjectsPseudoDirs() - { - $objects = $this->rackspace->getObjects( - 'zf-unit-test', - array( - 'delimiter' => '/', - 'prefix' => 'dir/', - ) - ); - $this->assertTrue($objects !== false); - - $this->assertEquals($objects[0]->getName(), 'dir/subdir1/'); - $this->assertEquals($objects[1]->getName(), 'dir/subdir2/'); - } - - public function testGetSizeContainers() - { - $size = $this->rackspace->getSizeContainers(); - $this->assertTrue($size !== false); - $this->assertTrue(is_numeric($size)); - } - - public function testGetCountObjects() - { - $count = $this->rackspace->getCountObjects(); - $this->assertTrue($count !== false); - $this->assertTrue(is_numeric($count)); - } - - public function testSetMetadataObject() - { - $result = $this->rackspace->setMetadataObject( - 'zf-unit-test', - 'zf-object-test', - $this->metadata2 - ); - $this->assertTrue($result); - } - - public function testGetMetadataObject() - { - $data = $this->rackspace->getMetadataObject( - 'zf-unit-test', - 'zf-object-test' - ); - $this->assertTrue($data !== false); - $this->assertEquals($data['metadata'], $this->metadata2); - } - - public function testEnableCdnContainer() - { - $data = $this->rackspace->enableCdnContainer('zf-unit-test'); - $this->assertTrue($data !== false); - $this->assertTrue(is_array($data)); - $this->assertTrue(!empty($data['cdn_uri'])); - $this->assertTrue(!empty($data['cdn_uri_ssl'])); - } - - public function testGetCdnContainers() - { - $containers = $this->rackspace->getCdnContainers(); - $this->assertTrue($containers !== false); - $found = false; - foreach ($containers as $container) { - if ($container->getName() == 'zf-unit-test') { - $found = true; - break; - } - } - $this->assertTrue($found); - } - - public function testUpdateCdnContainer() - { - $data = - $this->rackspace->updateCdnContainer('zf-unit-test', null, false); - $this->assertTrue($data !== false); - } - - public function testDeleteObject() - { - $this->assertTrue( - $this->rackspace->deleteObject( - 'zf-unit-test', - 'zf-object-test' - ) - ); - } - - public function testDeleteObject2() - { - $this->assertTrue( - $this->rackspace->deleteObject( - 'zf-unit-test', - 'zf-object-test' . '-copy' - ) - ); - } - - public function testDeleteContainer() - { - $this->assertTrue($this->rackspace->deleteContainer('zf-unit-test')); - } - - /** - * @group ZF-12542 - */ - public function testGetInfoCdnContainer() - { - $info = $this->rackspace->getInfoCdnContainer( - TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME - ); - $this->assertTrue($info !== false); - $this->assertTrue(is_array($info)); - $this->assertTrue(!empty($info['ttl'])); - $this->assertTrue(!empty($info['cdn_uri'])); - $this->assertTrue(!empty($info['cdn_uri_ssl'])); - $this->assertTrue($info['cdn_enabled']); - $this->assertTrue($info['log_retention']); - } - - /** - * @group ZF-12542 - */ - public function testGetCdnTtl() - { - $ttl = $this->container->getCdnTtl(); - $this->assertTrue($ttl !== false); - } - - /** - * @group ZF-12542 - */ - public function testGetCdnUri() - { - $uri = $this->container->getCdnUri(); - $this->assertTrue($uri !== false); - } - - /** - * @group ZF-12542 - */ - public function testGetCdnUriSsl() - { - $uri = $this->container->getCdnUriSsl(); - $this->assertTrue($uri !== false); - } -} diff --git a/tests/Zend/Service/Rackspace/Files/OnlineTest.php b/tests/Zend/Service/Rackspace/Files/OnlineTest.php deleted file mode 100644 index fedb9b68de..0000000000 --- a/tests/Zend/Service/Rackspace/Files/OnlineTest.php +++ /dev/null @@ -1,264 +0,0 @@ -markTestSkipped('Zend_Service_Rackspace_Files_OnlineTest tests are not enabled'); - } - if(!defined('TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_USER') || !defined('TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_KEY')) { - $this->markTestSkipped('Constants User and Key have to be set.'); - } - - $this->rackspace = new Zend_Service_Rackspace_Files(TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_USER, - TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_KEY); - - $this->httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->rackspace->getHttpClient() - ->setAdapter(self::$httpClientAdapterSocket); - - $this->metadata = array ( - 'foo' => 'bar', - 'foo2' => 'bar2' - ); - - $this->metadata2 = array ( - 'hello' => 'world' - ); - - // terms of use compliance: safe delay between each test - sleep(2); - } - - public function testCreateContainer() - { - $container= $this->rackspace->createContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME,$this->metadata); - $this->assertTrue($container!==false); - $this->assertEquals($container->getName(),TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - } - - public function testGetCountContainers() - { - $num= $this->rackspace->getCountContainers(); - $this->assertTrue($num>0); - } - - public function testGetContainer() - { - $container= $this->rackspace->getContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - $this->assertTrue($container!==false); - $this->assertEquals($container->getName(),TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - } - - public function testGetContainers() - { - $containers= $this->rackspace->getContainers(); - $this->assertTrue($containers!==false); - $found=false; - foreach ($containers as $container) { - if ($container->getName()==TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME) { - $found=true; - break; - } - } - $this->assertTrue($found); - } - - public function testGetMetadataContainer() - { - $data= $this->rackspace->getMetadataContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - $this->assertTrue($data!==false); - $this->assertEquals($data['name'],TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - $this->assertEquals($data['metadata'],$this->metadata); - - } - - public function testGetInfoAccount() - { - $data= $this->rackspace->getInfoAccount(); - $this->assertTrue($data!==false); - $this->assertTrue($data['tot_containers']>0); - } - - public function testStoreObject() - { - $content= 'This is a test!'; - $result= $this->rackspace->storeObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME, - $content, - $this->metadata); - $this->assertTrue($result); - } - - public function testGetObject() - { - $object= $this->rackspace->getObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME); - $this->assertTrue($object!==false); - $this->assertEquals($object->getName(),TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME); - } - - public function testCopyObject() - { - $result= $this->rackspace->copyObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME.'-copy'); - $this->assertTrue($result); - } - - public function testGetObjects() - { - $objects= $this->rackspace->getObjects(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - $this->assertTrue($objects!==false); - - $this->assertEquals($objects[0]->getName(),TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME); - $this->assertEquals($objects[1]->getName(),TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME.'-copy'); - } - - public function testGetSizeContainers() - { - $size= $this->rackspace->getSizeContainers(); - $this->assertTrue($size!==false); - $this->assertTrue(is_numeric($size)); - } - - public function testGetCountObjects() - { - $count= $this->rackspace->getCountObjects(); - $this->assertTrue($count!==false); - $this->assertTrue(is_numeric($count)); - } - - public function testSetMetadataObject() - { - $result= $this->rackspace->setMetadataObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME, - $this->metadata2); - $this->assertTrue($result); - } - - public function testGetMetadataObject() - { - $data= $this->rackspace->getMetadataObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME); - $this->assertTrue($data!==false); - $this->assertEquals($data['metadata'],$this->metadata2); - } - - public function testEnableCdnContainer() - { - $data= $this->rackspace->enableCdnContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME); - $this->assertTrue($data!==false); - $this->assertTrue(is_array($data)); - $this->assertTrue(!empty($data['cdn_uri'])); - $this->assertTrue(!empty($data['cdn_uri_ssl'])); - } - - public function testGetCdnContainers() - { - $containers= $this->rackspace->getCdnContainers(); - $this->assertTrue($containers!==false); - $found= false; - foreach ($containers as $container) { - if ($container->getName()==TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME) { - $found= true; - break; - } - } - $this->assertTrue($found); - } - - public function testUpdateCdnContainer() - { - $data= $this->rackspace->updateCdnContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME,null,false); - $this->assertTrue($data!==false); - } - - - public function testDeleteObject() - { - $this->assertTrue($this->rackspace->deleteObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME)); - } - - public function testDeleteObject2() - { - $this->assertTrue($this->rackspace->deleteObject(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME, - TESTS_ZEND_SERVICE_RACKSPACE_OBJECT_NAME.'-copy')); - } - - public function testDeleteContainer() - { - $this->assertTrue($this->rackspace->deleteContainer(TESTS_ZEND_SERVICE_RACKSPACE_CONTAINER_NAME)); - } - -} diff --git a/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.request b/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.request deleted file mode 100644 index 41eadeaf49..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.request +++ /dev/null @@ -1,10 +0,0 @@ -PUT /v1/test/zf-unit-test/zf-object-test-copy?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Copy-From: /zf-unit-test/zf-object-test -Content-length: 0 -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.response b/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.response deleted file mode 100644 index 2ae4f4587d..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testCopyObject.response +++ /dev/null @@ -1,18 +0,0 @@ -HTTP/1.1 201 Created -X-Copied-From-Last-Modified: Fri, 23 Sep 2011 10:31:33 GMT -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:37 GMT -Etag: 702edca0b2181c15d457eacac39de39b -X-Trans-Id: txd96aa5fe584e4217bfe85216e62727c3 -Connection: close -X-Copied-From: zf-unit-test/zf-object-test -Last-Modified: Fri, 23 Sep 2011 10:31:37 GMT -X-Object-Meta-Foo: bar -Content-Length: 18 -X-Object-Meta-Foo2: bar2 - -201 Created - - - - \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.request deleted file mode 100644 index e4e7ed386b..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.request +++ /dev/null @@ -1,10 +0,0 @@ -PUT /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Container-Meta-foo: bar -X-Container-Meta-foo2: bar2 -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.response deleted file mode 100644 index c40fb9c3b0..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testCreateContainer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 201 Created -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:17 GMT -X-Trans-Id: txf183928a548d4a769b0b39e84b4e83a9 -Connection: close -Content-Length: 18 - -201 Created - - - - \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.request deleted file mode 100644 index a7b74aa639..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.response deleted file mode 100644 index 74164fced6..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteContainer.response +++ /dev/null @@ -1,7 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:58 GMT -X-Trans-Id: tx7393313497b849f7b492a7fa42d8d6df -Connection: close -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.request b/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.request deleted file mode 100644 index aae492643e..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1/test/zf-unit-test/zf-object-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.response b/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.response deleted file mode 100644 index 188235bad7..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject.response +++ /dev/null @@ -1,7 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:54 GMT -X-Trans-Id: tx503537124a194a3a8fa905955f62986e -Connection: close -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.request b/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.request deleted file mode 100644 index c585768869..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1/test/zf-unit-test/zf-object-test-copy?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.response b/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.response deleted file mode 100644 index 89be633900..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testDeleteObject2.response +++ /dev/null @@ -1,7 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:56 GMT -X-Trans-Id: tx711cfcc7a0ec41409a9ca80d6bf368dd -Connection: close -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.request deleted file mode 100644 index b6c6f531b6..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.request +++ /dev/null @@ -1,9 +0,0 @@ -PUT /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: cdn2.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-TTL: 900 -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.response deleted file mode 100644 index 059f1f82f7..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testEnableCdnContainer.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 202 Accepted -Date: Fri, 23 Sep 2011 10:31:49 GMT -Server: Apache -X-CDN-URI: http://c754396.r96.cf2.rackcdn.com -X-CDN-SSL-URI: https://c754396.ssl.cf2.rackcdn.com -X-CDN-STREAMING-URI: http://c754396.r96.stream.cf2.rackcdn.com -Content-Length: 0 -Connection: close -Content-Type: text/plain; charset=UTF-8 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.request b/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.request deleted file mode 100644 index 3bf1462d64..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1/test?enabled_only=1&format=json HTTP/1.1 -Host: cdn2.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.response deleted file mode 100644 index dc7c6afaeb..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnContainers.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 200 OK -Date: Fri, 23 Sep 2011 10:31:50 GMT -Server: Apache -Connection: close -Transfer-Encoding: chunked -Content-Type: application/json - -1f0 -[{"cdn_streaming_uri": "http://c555003.r3.stream.cf2.rackcdn.com", "cdn_uri": "http://c555003.r3.cf2.rackcdn.com", "cdn_ssl_uri": "https://c555003.ssl.cf2.rackcdn.com", "cdn_enabled": true, "ttl": 86400, "log_retention": true, "name": "test"}, {"cdn_streaming_uri": "http://c754396.r96.stream.cf2.rackcdn.com", "cdn_uri": "http://c754396.r96.cf2.rackcdn.com", "cdn_ssl_uri": "https://c754396.ssl.cf2.rackcdn.com", "cdn_enabled": false, "ttl": 900, "log_retention": false, "name": "zf-unit-test"}] -0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnTtl.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCdnTtl.response deleted file mode 100644 index 687ed262be..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnTtl.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -X-Log-Retention: False -Date: Fri, 15 Mar 2013 12:40:32 GMT -X-Cdn-Uri: http://c754396.r96.cf2.rackcdn.com -X-Cdn-Ssl-Uri: https://c754396.r96.cf2.rackcdn.com -X-Cdn-Enabled: True -X-Cdn-Ios-Uri: http://c754396.r96.cf2.rackcdn.com -X-Trans-Id: tx6f66c89e78fd4a31b7507bf259c5a79c -Connection: close -X-Ttl: 259200 -X-Cdn-Streaming-Uri: http://c754396.r96.cf2.rackcdn.com -Content-Length: 0 \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUri.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUri.response deleted file mode 100644 index 687ed262be..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUri.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -X-Log-Retention: False -Date: Fri, 15 Mar 2013 12:40:32 GMT -X-Cdn-Uri: http://c754396.r96.cf2.rackcdn.com -X-Cdn-Ssl-Uri: https://c754396.r96.cf2.rackcdn.com -X-Cdn-Enabled: True -X-Cdn-Ios-Uri: http://c754396.r96.cf2.rackcdn.com -X-Trans-Id: tx6f66c89e78fd4a31b7507bf259c5a79c -Connection: close -X-Ttl: 259200 -X-Cdn-Streaming-Uri: http://c754396.r96.cf2.rackcdn.com -Content-Length: 0 \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUriSSl.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUriSSl.response deleted file mode 100644 index 687ed262be..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCdnUriSSl.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -X-Log-Retention: False -Date: Fri, 15 Mar 2013 12:40:32 GMT -X-Cdn-Uri: http://c754396.r96.cf2.rackcdn.com -X-Cdn-Ssl-Uri: https://c754396.r96.cf2.rackcdn.com -X-Cdn-Enabled: True -X-Cdn-Ios-Uri: http://c754396.r96.cf2.rackcdn.com -X-Trans-Id: tx6f66c89e78fd4a31b7507bf259c5a79c -Connection: close -X-Ttl: 259200 -X-Cdn-Streaming-Uri: http://c754396.r96.cf2.rackcdn.com -Content-Length: 0 \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.request deleted file mode 100644 index c97201a691..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.response deleted file mode 100644 index 9d26c08e36..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetContainer.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:21 GMT -X-Container-Meta-Foo: bar -X-Container-Meta-Foo2: bar2 -X-Container-Bytes-Used: 0 -X-Container-Object-Count: 0 -Accept-Ranges: bytes -X-Trans-Id: tx7e0f8074f11540cc90ef594f60faa6c5 -Connection: close -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.request b/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.request deleted file mode 100644 index 06bedd3e6e..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1/test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.response b/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.response deleted file mode 100644 index 0f88414ad6..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetContainers.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/json; charset=utf-8 -Date: Fri, 23 Sep 2011 10:31:22 GMT -X-Account-Container-Count: 1 -Accept-Ranges: bytes -X-Trans-Id: tx81b3a5f7d64946df8e58b46dded3b3a2 -Connection: close -X-Account-Object-Count: 0 -X-Account-Bytes-Used: 0 -Content-Length: 45 - -[{"name":"zf-unit-test","count":0,"bytes":0}] \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.request b/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.request deleted file mode 100644 index 009cd6ac02..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.response deleted file mode 100644 index 5c64d7a4cd..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCountContainers.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:19 GMT -X-Account-Container-Count: 1 -Accept-Ranges: bytes -X-Trans-Id: tx705290d7f73f4aaa821eba6b71251e43 -Connection: close -X-Account-Object-Count: 0 -X-Account-Bytes-Used: 0 -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.request b/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.request deleted file mode 100644 index 009cd6ac02..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.response b/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.response deleted file mode 100644 index 248e57a9b2..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetCountObjects.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:43 GMT -X-Account-Container-Count: 1 -Accept-Ranges: bytes -X-Trans-Id: tx183c441329c24cad935a5e1c856d8992 -Connection: close -X-Account-Object-Count: 0 -X-Account-Bytes-Used: 0 -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.request b/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.request deleted file mode 100644 index 009cd6ac02..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.response b/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.response deleted file mode 100644 index 9585a90422..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoAccount.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:26 GMT -X-Account-Container-Count: 1 -Accept-Ranges: bytes -X-Trans-Id: tx1482c048607b495da5472ce2c8ea0d7f -Connection: close -X-Account-Object-Count: 0 -X-Account-Bytes-Used: 0 -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoCdnContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testGetInfoCdnContainer.response deleted file mode 100644 index e1e7543acb..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetInfoCdnContainer.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 204 No Content -Content-Type: text/html; charset=UTF-8 -X-Log-Retention: True -Date: Fri, 15 Mar 2013 12:40:32 GMT -X-Cdn-Uri: http://c754396.r96.cf2.rackcdn.com -X-Cdn-Ssl-Uri: https://c754396.r96.cf2.rackcdn.com -X-Cdn-Enabled: True -X-Cdn-Ios-Uri: http://c754396.r96.cf2.rackcdn.com -X-Trans-Id: tx6f66c89e78fd4a31b7507bf259c5a79c -Connection: close -X-Ttl: 259200 -X-Cdn-Streaming-Uri: http://c754396.r96.cf2.rackcdn.com -Content-Length: 0 \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.request deleted file mode 100644 index c97201a691..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.response deleted file mode 100644 index ec7f8eebcc..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataContainer.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:24 GMT -X-Container-Meta-Foo: bar -X-Container-Meta-Foo2: bar2 -X-Container-Bytes-Used: 0 -X-Container-Object-Count: 0 -Accept-Ranges: bytes -X-Trans-Id: tx33698bd0f7774a6184882ae37c3d9a36 -Connection: close -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.request b/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.request deleted file mode 100644 index c08e0b54cc..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test/zf-unit-test/zf-object-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.response b/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.response deleted file mode 100644 index ec6ec5968c..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetMetadataObject.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/x-www-form-urlencoded -Date: Fri, 23 Sep 2011 10:31:47 GMT -Accept-Ranges: bytes -Etag: 702edca0b2181c15d457eacac39de39b -X-Trans-Id: tx2f237ee9337d4ad1b2919ac2cea27f02 -Connection: close -Last-Modified: Fri, 23 Sep 2011 10:31:45 GMT -X-Object-Meta-Hello: world -Content-Length: 15 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetObject.request b/tests/Zend/Service/Rackspace/Files/_files/testGetObject.request deleted file mode 100644 index 8e7b7344dc..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetObject.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1/test/zf-unit-test/zf-object-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetObject.response b/tests/Zend/Service/Rackspace/Files/_files/testGetObject.response deleted file mode 100644 index a3cf5d2aaa..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetObject.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/json -Date: Fri, 23 Sep 2011 10:31:35 GMT -Accept-Ranges: bytes -Etag: 702edca0b2181c15d457eacac39de39b -X-Trans-Id: txf1550b683c804e49a65927b876b50d89 -Connection: close -Last-Modified: Fri, 23 Sep 2011 10:31:33 GMT -X-Object-Meta-Foo: bar -X-Object-Meta-Foo2: bar2 -Content-Length: 15 - -This is a test! \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.request b/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.request deleted file mode 100644 index f90f83bba3..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.response b/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.response deleted file mode 100644 index 6635078dda..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetObjects.response +++ /dev/null @@ -1,13 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/json; charset=utf-8 -Date: Fri, 23 Sep 2011 10:31:39 GMT -X-Container-Meta-Foo: bar -X-Container-Meta-Foo2: bar2 -X-Container-Bytes-Used: 30 -X-Container-Object-Count: 2 -Accept-Ranges: bytes -X-Trans-Id: tx990e3e7b061547e893430be682ad1e14 -Connection: close -Content-Length: 341 - -[{"name":"zf-object-test","hash":"702edca0b2181c15d457eacac39de39b","bytes":15,"content_type":"application/json", "last_modified":"2011-09-23T10:31:33.748950"},{"name":"zf-object-test-copy","hash":"702edca0b2181c15d457eacac39de39b","bytes":15,"content_type":"application/x-www-form-urlencoded", "last_modified":"2011-09-23T10:31:37.545410"}] \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetObjectsPseudoDirs.response b/tests/Zend/Service/Rackspace/Files/_files/testGetObjectsPseudoDirs.response deleted file mode 100644 index 8867cc9b8e..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetObjectsPseudoDirs.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 200 OK -X-Timestamp: 1340815553.90579 -Content-Type: application/json; charset=utf-8 -Date: Mon, 25 Mar 2013 16:00:03 GMT -X-Container-Bytes-Used: 22 -X-Container-Object-Count: 2 -Accept-Ranges: bytes -X-Trans-Id: tx1f63df08fcc646a5874388de8f197b72 -Connection: close -Content-Length: 56 - -[{"subdir": "dir/subdir1/"}, {"subdir": "dir/subdir2/"}] \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.request b/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.request deleted file mode 100644 index 009cd6ac02..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.request +++ /dev/null @@ -1,7 +0,0 @@ -HEAD /v1/test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.response b/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.response deleted file mode 100644 index ba01b3cf0f..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testGetSizeContainers.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 204 No Content -Date: Fri, 23 Sep 2011 10:31:41 GMT -X-Account-Container-Count: 1 -Accept-Ranges: bytes -X-Trans-Id: txcafe1fcb5bdd4d9e97248c98f3447412 -Connection: close -X-Account-Object-Count: 0 -X-Account-Bytes-Used: 0 -Content-Length: 0 - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.request b/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.request deleted file mode 100644 index 621ff919ed..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.request +++ /dev/null @@ -1,9 +0,0 @@ -POST /v1/test/zf-unit-test/zf-object-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Object-Meta-hello: world -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.response b/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.response deleted file mode 100644 index e4437b58a2..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testSetMetadataObject.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Content-Type: text/plain; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:45 GMT -X-Trans-Id: tx769b8c0b7ddc4b82a80ff503a4e2eff9 -Connection: close -Content-Length: 58 - -202 Accepted - -The request is accepted for processing. - - \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.request b/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.request deleted file mode 100644 index b9a52f9707..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.request +++ /dev/null @@ -1,14 +0,0 @@ -PUT /v1/test/zf-unit-test/zf-object-test?format=json HTTP/1.1 -Host: storage101.ord1.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 15 -X-Object-Meta-foo: bar -X-Object-Meta-foo2: bar2 -Etag: 702edca0b2181c15d457eacac39de39b -Content-length: 15 -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - -This is a test! \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.response b/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.response deleted file mode 100644 index 2f68f37e2f..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testStoreObject.response +++ /dev/null @@ -1,14 +0,0 @@ -HTTP/1.1 201 Created -Content-Type: text/html; charset=UTF-8 -Date: Fri, 23 Sep 2011 10:31:33 GMT -Etag: 702edca0b2181c15d457eacac39de39b -X-Trans-Id: txbb6064c15cc14cc187602e6053086c40 -Connection: close -Last-Modified: Fri, 23 Sep 2011 10:31:33 GMT -Content-Length: 18 - -201 Created - - - - \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.request b/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.request deleted file mode 100644 index 80c672434b..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.request +++ /dev/null @@ -1,9 +0,0 @@ -POST /v1/test/zf-unit-test?format=json HTTP/1.1 -Host: cdn2.clouddrive.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-CDN-Enabled: false -X-Auth-Token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af - diff --git a/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.response b/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.response deleted file mode 100644 index 44eec80db2..0000000000 --- a/tests/Zend/Service/Rackspace/Files/_files/testUpdateCdnContainer.response +++ /dev/null @@ -1,10 +0,0 @@ -HTTP/1.1 202 Accepted -Date: Fri, 23 Sep 2011 10:31:52 GMT -Server: Apache -X-CDN-URI: http://c754396.r96.cf2.rackcdn.com -X-CDN-SSL-URI: https://c754396.ssl.cf2.rackcdn.com -X-CDN-STREAMING-URI: http://c754396.r96.stream.cf2.rackcdn.com -Content-Length: 0 -Connection: close -Content-Type: text/plain; charset=UTF-8 - diff --git a/tests/Zend/Service/Rackspace/OfflineTest.php b/tests/Zend/Service/Rackspace/OfflineTest.php deleted file mode 100644 index 84fc20684f..0000000000 --- a/tests/Zend/Service/Rackspace/OfflineTest.php +++ /dev/null @@ -1,187 +0,0 @@ -_files = new Zend_Service_Rackspace_Files('foo','bar'); - $this->_filesPath = dirname(__FILE__) . '/_files'; - $this->_httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - } - /** - * Utility method for returning a string HTTP response, which is loaded from a file - * - * @param string $name - * @return string - */ - protected function _loadResponse($name) - { - return file_get_contents("$this->_filesPath/$name.response"); - } - /** - * Ensures that __construct() throws an exception when given an empty key attribute - * - * @return void - */ - public function testConstructExceptionMissingUserAttribute() - { - $this->setExpectedException( - 'Zend_Service_Rackspace_Exception', - 'The user cannot be empty' - ); - $file= new Zend_Service_Rackspace_Files(null,'bar'); - } - /** - * Ensures that __construct() throws an exception when given an empty secret attribute - * - * @return void - */ - public function testConstructExceptionMissingKeyAttribute() - { - $this->setExpectedException( - 'Zend_Service_Rackspace_Exception', - 'The key cannot be empty' - ); - $file= new Zend_Service_Rackspace_Files('foo',null); - } - /** - * Test the default authentication URL - * - * @return void - */ - public function testDefaultAuthUrl() - { - $this->assertEquals($this->_files->getAuthUrl(),Zend_Service_Rackspace_Files::US_AUTH_URL,'The default Authentication URL is changed'); - } - /** - * Test the set of the key - * - * @return void - */ - public function testSetKey() - { - $key= '1234567890'; - $this->_files->setKey($key); - $this->assertEquals($this->_files->getKey(),$key); - } - /** - * Test the set of the user - * - * @return void - */ - public function testSetUser() - { - $user= 'test'; - $this->_files->setUser($user); - $this->assertEquals($this->_files->getUser(),$user); - } - /** - * Test the set of an invalid authentication URL - * - * @return void - */ - public function testSetInvalidAuthUrl() - { - $this->setExpectedException( - 'Zend_Service_Rackspace_Exception', - 'The authentication URL is not valid' - ); - $this->_files->setAuthUrl('http://test'); - } - /** - * Check the authentication and the results (token, storage_url, cdn_url) - * - * @return void - */ - public function testAuthenticate() - { - $this->_files->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - $this->assertTrue($this->_files->authenticate(),'Authentication failed'); - $this->assertTrue($this->_files->isSuccessful(),'Authentication call failed'); - $this->assertEquals($this->_files->getToken(),'0f0223cd-f157-4d04-bb2d-ccda1a5643af','The token is not valid'); - $this->assertEquals($this->_files->getStorageUrl(),'https://storage101.ord1.clouddrive.com/v1/test','The storage URL is not valid'); - $this->assertEquals($this->_files->getCdnUrl(),'https://cdn2.clouddrive.com/v1/test','The CDN URL is not valid'); - } - /** - * Test the authentication error (401 Unauthorized - Bad username or password) - * - * @return void - */ - public function testAuthenticateError() - { - $this->_files->getHttpClient() - ->setAdapter($this->_httpClientAdapterTest); - - $this->_httpClientAdapterTest->setResponse($this->_loadResponse(__FUNCTION__)); - - $this->assertFalse($this->_files->authenticate()); - $this->assertFalse($this->_files->isSuccessful()); - $this->assertEquals($this->_files->getErrorCode(),'401'); - $this->assertEquals($this->_files->getErrorMsg(),'Bad username or password'); - - } -} diff --git a/tests/Zend/Service/Rackspace/Servers/AllTests.php b/tests/Zend/Service/Rackspace/Servers/AllTests.php deleted file mode 100644 index dc3b91feb1..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/AllTests.php +++ /dev/null @@ -1,57 +0,0 @@ -addTestSuite('Zend_Service_Rackspace_Servers_OfflineTest'); - $suite->addTestSuite('Zend_Service_Rackspace_Servers_OnlineTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Rackspace_Servers_AllTests::main') { - Zend_Service_Rackspace_Servers_AllTests::main(); -} diff --git a/tests/Zend/Service/Rackspace/Servers/OfflineTest.php b/tests/Zend/Service/Rackspace/Servers/OfflineTest.php deleted file mode 100644 index 9a82d475bb..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/OfflineTest.php +++ /dev/null @@ -1,384 +0,0 @@ -rackspace= new Zend_Service_Rackspace_Servers('foo','bar'); - - $this->httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - - $this->rackspace->getHttpClient() - ->setAdapter($this->httpClientAdapterTest); - - // authentication (from a file) - $this->httpClientAdapterTest->setResponse(self::loadResponse('../../_files/testAuthenticate')); - $this->assertTrue($this->rackspace->authenticate(),'Authentication failed'); - - // load the HTTP response (from a file) - $this->httpClientAdapterTest->setResponse($this->loadResponse($this->getName())); - - } - /** - * Utility method for returning a string HTTP response, which is loaded from a file - * - * @param string $name - * @return string - */ - protected function loadResponse($name) - { - return @file_get_contents(__DIR__ . '/_files/' . $name . '.response'); - } - - /** - * Test constants - */ - public function testConstants() - { - $this->assertEquals(10240, Zend_Service_Rackspace_Servers::LIMIT_FILE_SIZE); - $this->assertEquals(5, Zend_Service_Rackspace_Servers::LIMIT_NUM_FILE); - $this->assertEquals('json', Zend_Service_Rackspace_Servers::API_FORMAT); - } - /** - * Test create server - */ - public function testCreateServer() - { - $data = array ( - 'name' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME, - 'imageId' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGEID, - 'flavorId' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_FLAVORID - ); - $server= $this->rackspace->createServer($data); - - $this->assertTrue($server!==false); - self::$serverId= $server->getId(); - $this->assertEquals(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME,$server->getName()); - $this->assertEquals(self::$serverId,20247478); - } - /** - * Test Get Server - */ - public function testGetServer() - { - $server= $this->rackspace->getServer(self::$serverId); - $this->assertTrue($server!==false); - $this->assertEquals(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME,$server->getName()); - } - /** - * Test list servers - */ - public function testListServers() - { - $servers= $this->rackspace->listServers(); - $this->assertTrue($servers!==false); - } - /** - * Test change server name - */ - public function testChangeServerName() - { - $this->assertTrue($this->rackspace->changeServerName(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME.'_renamed')); - } - /** - * Test rechange server name - */ - public function testRechangeServerName() - { - $this->assertTrue($this->rackspace->changeServerName(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME)); - } - /** - * Test change admin password - */ - public function testChangeServerPassword() - { - self::$adminPass= md5(time().rand()); - $this->assertTrue($this->rackspace->changeServerPassword(self::$serverId,self::$adminPass)); - } - /** - * Test get server IP - */ - public function testGetServerIp() - { - $addresses= $this->rackspace->getServerIp(self::$serverId); - $this->assertTrue(!empty($addresses['public']) && is_array($addresses['public'])); - $this->assertTrue(!empty($addresses['private']) && is_array($addresses['private'])); - } - /** - * Test get server public IP - */ - public function testGetServerPublicIp() - { - $public= $this->rackspace->getServerPublicIp(self::$serverId); - $this->assertTrue(!empty($public) && is_array($public)); - } - /** - * Test get server private IP - */ - public function testGetServerPrivateIp() - { - $private= $this->rackspace->getServerPrivateIp(self::$serverId); - $this->assertTrue(!empty($private) && is_array($private)); - } - /** - * Test reboot the server - */ - public function testSoftRebootServer() - { - $this->assertTrue($this->rackspace->rebootServer(self::$serverId)); - } - /** - * Test hard reboot the server - */ - public function testHardRebootServer() - { - $this->assertTrue($this->rackspace->rebootServer(self::$serverId,true)); - } - /** - * Test rebuild the server image - */ - public function testRebuildServer() - { - $this->assertTrue($this->rackspace->rebuildServer(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NEW_IMAGEID)); - } - /** - * Test resize server - */ - public function testResizeServer() - { - $this->markTestSkipped('Resize server skipped'); - } - /** - * Test confirm resize server - */ - public function testConfirmResizeServer() - { - $this->markTestSkipped('Confirm resize server skipped'); - } - /** - * Test revert resize server - */ - public function testRevertResizeServer() - { - $this->markTestSkipped('Revert resize server skipped'); - } - /** - * Test list flavors - */ - public function testListFlavors() - { - self::$flavors= $this->rackspace->listFlavors(true); - $this->assertTrue(is_array(self::$flavors) && !empty(self::$flavors)); - $this->assertTrue(isset(self::$flavors[0]['id'])); - } - /** - * Test get flavor - */ - public function testGetFlavor() - { - $flavor= $this->rackspace->getFlavor(self::$flavors[0]['id']); - $this->assertTrue(is_array($flavor) && !empty($flavor)); - $this->assertEquals($flavor['id'],self::$flavors[0]['id']); - } - /** - * Test list images - */ - public function testListImages() - { - self::$images= $this->rackspace->listImages(true); - $this->assertTrue(count(self::$images)>0); - $image= self::$images[0]; - $imageId= $image->getId(); - $this->assertTrue(!empty($imageId)); - } - /** - * Test get image - */ - public function testGetImage() - { - $image= self::$images[0]; - $getImage= $this->rackspace->getImage($image->getId()); - $this->assertEquals($getImage->getId(),$image->getId()); - } - /** - * Test get image info - */ - public function testGetImageInfo() - { - $image= $this->rackspace->getImage(self::$images[0]->getId())->toArray(); - $this->assertTrue(is_array($image) && !empty($image)); - $this->assertEquals($image['id'],self::$images[0]->getId()); - } - /** - * Test create image - */ - public function testCreateImage() - { - $image= $this->rackspace->createImage(self::$serverId, TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGE_NAME); - if ($image!==false) { - self::$imageId= $image->getId(); - } - $this->assertTrue($image!==false); - $this->assertEquals($image->getName(),TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGE_NAME); - } - /** - * Test delete image - */ - public function testDeleteImage() - { - if (isset(self::$imageId)) { - $this->assertTrue($this->rackspace->deleteImage(self::$imageId)); - } else { - $this->markTestSkipped('Delete image skipped because the new image has not been created'); - } - } - /** - * Test get backup schedule - */ - public function testGetBackupSchedule() - { - $this->markTestSkipped('Get backup schedule skipped'); - } - /** - * Test change backup schedule - */ - public function testChangeBackupSchedule() - { - $this->markTestSkipped('Change backup schedule skipped'); - } - /** - * Test disable backup schedule - */ - public function testDisableBackupSchedule() - { - $this->markTestSkipped('Disable backup schedule skipped'); - } - /** - * Test create shared Ip group - */ - public function testCreateSharedIpGroup() - { - self::$sharedIpGroup= $this->rackspace->createSharedIpGroup(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_SHARED_IP_GROUP_NAME, self::$serverId); - $this->assertTrue(self::$sharedIpGroup!==false); - $this->assertEquals(self::$sharedIpGroup->getName(),TESTS_ZEND_SERVICE_RACKSPACE_SERVER_SHARED_IP_GROUP_NAME); - } - /** - * Test list shared ip groups - */ - public function testListSharedIpGroups() - { - $groups= $this->rackspace->listSharedIpGroups(true); - $this->assertTrue($groups!==false); - } - /** - * Test get shared IP group - */ - public function testGetSharedIpGroup() - { - $groupId= self::$sharedIpGroup->getId(); - $group= $this->rackspace->getSharedIpGroup($groupId); - $this->assertTrue($group!==false); - $this->assertEquals($group->getId(), $groupId); - } - /** - * Test delete shared ip group - */ - public function testDeleteSharedIpGroup() - { - $this->assertTrue($this->rackspace->deleteSharedIpGroup(self::$sharedIpGroup->getId())); - } - /** - * Test delete server - */ - public function testDeleteServer() - { - $this->assertTrue($this->rackspace->deleteServer(self::$serverId)); - } -} diff --git a/tests/Zend/Service/Rackspace/Servers/OnlineTest.php b/tests/Zend/Service/Rackspace/Servers/OnlineTest.php deleted file mode 100644 index 427777c638..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/OnlineTest.php +++ /dev/null @@ -1,409 +0,0 @@ -markTestSkipped('Zend_Service_Rackspace_Servers_OnlineTest tests are not enabled'); - } - - if(!defined('TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_USER') || !defined('TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_KEY')) { - $this->markTestSkipped('Constants User and Key have to be set.'); - } - - $this->rackspace = new Zend_Service_Rackspace_Servers(TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_USER, - TESTS_ZEND_SERVICE_RACKSPACE_ONLINE_KEY); - - $this->httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->rackspace->getHttpClient() - ->setAdapter($this->httpClientAdapterSocket); - - // terms of use compliance: safe delay between each test - sleep(2); - } - - /** - * Wait n seconds for status change - * - * @param string $status - * @param integer $timeout - * @return boolean - */ - protected function waitForStatus($status,$timeout=TESTS_ZEND_SERVICE_RACKSPACE_TIMEOUT) - { - $info['status']= null; - $i=0; - while ((strtoupper($info['status'])!==strtoupper($status)) && ($i<$timeout)) { - $info= $this->rackspace->getServer(self::$serverId)->toArray(); - $i+=5; - sleep(5); - } - return ($i<$timeout); - } - /** - * Test constants - */ - public function testConstants() - { - $this->assertEquals(10240, Zend_Service_Rackspace_Servers::LIMIT_FILE_SIZE); - $this->assertEquals(5, Zend_Service_Rackspace_Servers::LIMIT_NUM_FILE); - $this->assertEquals('json', Zend_Service_Rackspace_Servers::API_FORMAT); - } - /** - * Test authentication - */ - public function testAuthentication() - { - $this->filename= __METHOD__; - $this->assertTrue($this->rackspace->authenticate()); - } - /** - * Test create server - */ - public function testCreateServer() - { - $data = array ( - 'name' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME, - 'imageId' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGEID, - 'flavorId' => TESTS_ZEND_SERVICE_RACKSPACE_SERVER_FLAVORID - ); - $server= $this->rackspace->createServer($data); - $this->assertTrue($server!==false); - self::$serverId= $server->getId(); - self::$adminPass= $server->getAdminPass(); - $this->assertEquals(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME,$server->getName()); - $this->assertTrue($this->waitForStatus('active')); - } - /** - * Test Get Server - */ - public function testGetServer() - { - $server= $this->rackspace->getServer(self::$serverId); - $this->assertTrue($server!==false); - $this->assertEquals(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME,$server->getName()); - } - /** - * Test list servers - */ - public function testListServers() - { - $servers= $this->rackspace->listServers(); - $this->assertTrue($servers!==false); - } - /** - * Test change server name - */ - public function testChangeServerName() - { - $this->assertTrue($this->rackspace->changeServerName(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME.'_renamed')); - } - /** - * Test rechange server name - */ - public function testRechangeServerName() - { - $this->assertTrue($this->rackspace->changeServerName(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NAME)); - } - /** - * Test change admin password - */ - public function testChangeServerPassword() - { - self::$adminPass= md5(time().rand()); - $this->assertTrue($this->rackspace->changeServerPassword(self::$serverId,self::$adminPass)); - } - /** - * Test get server IP - */ - public function testGetServerIp() - { - $addresses= $this->rackspace->getServerIp(self::$serverId); - $this->assertTrue(!empty($addresses['public']) && is_array($addresses['public'])); - $this->assertTrue(!empty($addresses['private']) && is_array($addresses['private'])); - } - /** - * Test get server public IP - */ - public function testGetServerPublicIp() - { - $public= $this->rackspace->getServerPublicIp(self::$serverId); - $this->assertTrue(!empty($public) && is_array($public)); - } - /** - * Test get server private IP - */ - public function testGetServerPrivateIp() - { - $private= $this->rackspace->getServerPrivateIp(self::$serverId); - $this->assertTrue(!empty($private) && is_array($private)); - } - /** - * Test reboot the server - */ - public function testSoftRebootServer() - { - $this->assertTrue($this->rackspace->rebootServer(self::$serverId)); - $this->assertTrue($this->waitForStatus('active')); - } - /** - * Test hard reboot the server - */ - public function testHardRebootServer() - { - $this->assertTrue($this->rackspace->rebootServer(self::$serverId,true)); - $this->assertTrue($this->waitForStatus('active')); - } - /** - * Test rebuild the server image - */ - public function testRebuildServer() - { - $this->assertTrue($this->rackspace->rebuildServer(self::$serverId,TESTS_ZEND_SERVICE_RACKSPACE_SERVER_NEW_IMAGEID)); - } - /** - * Test resize server - */ - public function testResizeServer() - { - $this->markTestSkipped('Resize server skipped'); - } - /** - * Test confirm resize server - */ - public function testConfirmResizeServer() - { - $this->markTestSkipped('Confirm resize server skipped'); - } - /** - * Test revert resize server - */ - public function testRevertResizeServer() - { - $this->markTestSkipped('Revert resize server skipped'); - } - /** - * Test list flavors - */ - public function testListFlavors() - { - self::$flavors= $this->rackspace->listFlavors(true); - $this->assertTrue(is_array(self::$flavors) && !empty(self::$flavors)); - $this->assertTrue(isset(self::$flavors[0]['id'])); - } - /** - * Test get flavor - */ - public function testGetFlavor() - { - $flavor= $this->rackspace->getFlavor(self::$flavors[0]['id']); - $this->assertTrue(is_array($flavor) && !empty($flavor)); - $this->assertEquals($flavor['id'],self::$flavors[0]['id']); - } - /** - * Test list images - */ - public function testListImages() - { - self::$images= $this->rackspace->listImages(true); - $this->assertTrue(count(self::$images)>0); - $image= self::$images[0]; - $imageId= $image->getId(); - $this->assertTrue(!empty($imageId)); - } - /** - * Test get image - */ - public function testGetImage() - { - $image= self::$images[0]; - $getImage= $this->rackspace->getImage($image->getId()); - $this->assertEquals($getImage->getId(),$image->getId()); - } - /** - * Test get image info - */ - public function testGetImageInfo() - { - $image= $this->rackspace->getImage(self::$images[0]->getId())->toArray(); - $this->assertTrue(is_array($image) && !empty($image)); - $this->assertEquals($image['id'],self::$images[0]->getId()); - } - /** - * Test create image - */ - public function testCreateImage() - { - $image= $this->rackspace->createImage(self::$serverId, TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGE_NAME); - if ($image!==false) { - self::$imageId= $image->getId(); - } - $this->assertTrue($image!==false); - $this->assertEquals($image->getName(),TESTS_ZEND_SERVICE_RACKSPACE_SERVER_IMAGE_NAME); - } - /** - * Test delete image - */ - public function testDeleteImage() - { - if (isset(self::$imageId)) { - $this->assertTrue($this->rackspace->deleteImage(self::$imageId)); - } else { - $this->markTestSkipped('Delete image skipped because the new image has not been created'); - } - } - /** - * Test get backup schedule - */ - public function testGetBackupSchedule() - { - $this->markTestSkipped('Get backup schedule skipped'); - } - /** - * Test change backup schedule - */ - public function testChangeBackupSchedule() - { - $this->markTestSkipped('Change backup schedule skipped'); - } - /** - * Test disable backup schedule - */ - public function testDisableBackupSchedule() - { - $this->markTestSkipped('Disable backup schedule skipped'); - } - /** - * Test create shared Ip group - */ - public function testCreateSharedIpGroup() - { - self::$sharedIpGroup= $this->rackspace->createSharedIpGroup(TESTS_ZEND_SERVICE_RACKSPACE_SERVER_SHARED_IP_GROUP_NAME, self::$serverId); - $this->assertTrue(self::$sharedIpGroup!==false); - $this->assertEquals(self::$sharedIpGroup->getName(),TESTS_ZEND_SERVICE_RACKSPACE_SERVER_SHARED_IP_GROUP_NAME); - } - /** - * Test list shared ip groups - */ - public function testListSharedIpGroups() - { - $groups= $this->rackspace->listSharedIpGroups(true); - $this->assertTrue($groups!==false); - } - /** - * Test get shared IP group - */ - public function testGetSharedIpGroup() - { - $groupId= self::$sharedIpGroup->getId(); - $group= $this->rackspace->getSharedIpGroup($groupId); - $this->assertTrue($group!==false); - $this->assertEquals($group->getId(), $groupId); - } - /** - * Test delete shared ip group - */ - public function testDeleteSharedIpGroup() - { - $this->assertTrue($this->rackspace->deleteSharedIpGroup(self::$sharedIpGroup->getId())); - } - /** - * Test delete server - */ - public function testDeleteServer() - { - $this->assertTrue($this->rackspace->deleteServer(self::$serverId)); - } -} diff --git a/tests/Zend/Service/Rackspace/Servers/_files/test.txt b/tests/Zend/Service/Rackspace/Servers/_files/test.txt deleted file mode 100644 index df2ccdebe9..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/test.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test! \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.request b/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.request deleted file mode 100644 index 41068ebb87..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.request +++ /dev/null @@ -1,8 +0,0 @@ -GET /v1.0?format=json HTTP/1.1 -Host: auth.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-User: ezimuel -X-Auth-Key: c322b5c41f6047c83dd51e6980562912 - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.response b/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.response deleted file mode 100644 index 7ce1cfaf28..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testAuthentication.response +++ /dev/null @@ -1,14 +0,0 @@ -HTTP/1.1 204 No Content -Date: Mon, 26 Sep 2011 08:35:03 GMT -Server: Apache/2.2.3 (Mosso Engineering) -vary: X-Auth-Token,X-Auth-Key,X-Storage-User,X-Storage-Pass -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c -X-Server-Management-Url: https://servers.api.rackspacecloud.com/v1.0/583923 -X-Storage-Url: https://storage101.ord1.clouddrive.com/v1/MossoCloudFS_2abf18d2-f3f8-45fd-940e-a7b38a195041 -X-Storage-Token: ed355855-8bfa-4716-b613-c04b606cdd8c -X-CDN-Management-Url: https://cdn2.clouddrive.com/v1/MossoCloudFS_2abf18d2-f3f8-45fd-940e-a7b38a195041 -Cache-Control: s-maxage=86399 -Content-Length: 0 -Connection: close -Content-Type: text/xml - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.request b/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.request deleted file mode 100644 index 7035325c09..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/images/14253092?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.response b/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.response deleted file mode 100644 index d231b90eec..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeBackupSchedule.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:55 GMT -X-Varnish: 1908653404 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.request b/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.request deleted file mode 100644 index dc272c24c4..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.request +++ /dev/null @@ -1,10 +0,0 @@ -PUT /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 42 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"server":{"name":"zf-unit-test_renamed"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.response b/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.response deleted file mode 100644 index f598870574..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerName.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:36:12 GMT -X-Varnish: 1908642493 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.request b/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.request deleted file mode 100644 index 53bf04243b..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.request +++ /dev/null @@ -1,10 +0,0 @@ -PUT /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 59 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"server":{"adminPass":"1c21b99dbab33a0aa952c4e821c0c499"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.response b/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.response deleted file mode 100644 index 091a658399..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testChangeServerPassword.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:36:23 GMT -X-Varnish: 1908643901 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.request deleted file mode 100644 index 50f21f3335..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/servers/20247478/action?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 26 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"rebuild":{"imageId":49}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.response deleted file mode 100644 index 1b277cd7d3..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testConfirmResizeServer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Type: text/xml -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:15 GMT -X-Varnish: 1908649367 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.request b/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.request deleted file mode 100644 index bc2457d8ef..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/images?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 56 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"image":{"serverId":20247478,"name":"ZFunitTestImage"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.response b/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.response deleted file mode 100644 index 93406234aa..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateImage.response +++ /dev/null @@ -1,14 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Cache-Control: no-cache -Content-Type: application/json -Content-Length: 131 -Date: Mon, 26 Sep 2011 08:37:44 GMT -X-Varnish: 1908652628 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"image":{"id":14253092,"status":"QUEUED","updated":"2011-09-26T03:37:43-05:00","name":"ZFunitTestImage","serverId":20247478}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.response deleted file mode 100644 index 6720b1900d..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateServer.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:35:35 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:35:53 GMT -X-Varnish: 1908639632 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.request b/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.request deleted file mode 100644 index 21612927ff..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/shared_ip_groups?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 56 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"sharedIpGroup":{"name":"ZFgroupIP","server":20247478}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.response b/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.response deleted file mode 100644 index 850fdea247..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testCreateSharedIpGroup.response +++ /dev/null @@ -1,14 +0,0 @@ -HTTP/1.1 201 Created -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Cache-Control: no-cache -Content-Type: application/json -Content-Length: 67 -Date: Mon, 26 Sep 2011 08:38:06 GMT -X-Varnish: 1908655137 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"sharedIpGroup":{"id":12288,"name":"ZFgroupIP"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.request b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.request deleted file mode 100644 index 7035325c09..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/images/14253092?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.response b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.response deleted file mode 100644 index d231b90eec..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteImage.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:55 GMT -X-Varnish: 1908653404 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.request deleted file mode 100644 index c9361522de..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.response deleted file mode 100644 index d34fd4434a..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteServer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Type: text/xml -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:38:23 GMT -X-Varnish: 1908656714 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.request b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.request deleted file mode 100644 index da1e1c7d9d..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/shared_ip_groups/12288?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.response b/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.response deleted file mode 100644 index ac04ef3c92..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDeleteSharedIpGroup.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:38:18 GMT -X-Varnish: 1908656340 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.request b/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.request deleted file mode 100644 index 7035325c09..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/images/14253092?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.response b/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.response deleted file mode 100644 index d231b90eec..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testDisableBackupSchedule.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:55 GMT -X-Varnish: 1908653404 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.request deleted file mode 100644 index 7035325c09..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.request +++ /dev/null @@ -1,8 +0,0 @@ -DELETE /v1.0/583923/images/14253092?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/x-www-form-urlencoded -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.response deleted file mode 100644 index d231b90eec..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetBackupSchedule.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:55 GMT -X-Varnish: 1908653404 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.request deleted file mode 100644 index f600268fff..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/flavors/1?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.response deleted file mode 100644 index 3bdbb9d463..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetFlavor.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Wed, 19 Sep 2007 18:24:59 GMT -X-PURGE-KEY: /flavors -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 76 -Date: Mon, 26 Sep 2011 08:37:28 GMT -X-Varnish: 1908650939 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"flavor":{"id":1,"ram":256,"disk":10,"name":"256 server"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.request deleted file mode 100644 index bb3d512000..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/images/19?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.response deleted file mode 100644 index 076493c758..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetImage.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Tue, 15 Dec 2009 21:43:39 GMT -X-PURGE-KEY: /583923/images/19 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 126 -Date: Mon, 26 Sep 2011 08:37:35 GMT -X-Varnish: 1908651977 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"image":{"id":19,"status":"ACTIVE","created":"2009-12-15T06:36:24-06:00","updated":"2009-12-15T15:43:39-06:00","name":"Gentoo 10.1"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.request deleted file mode 100644 index bb3d512000..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/images/19?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.response deleted file mode 100644 index fb181def28..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetImageInfo.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 203 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Tue, 15 Dec 2009 21:43:39 GMT -X-PURGE-KEY: /583923/images/19 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 126 -Date: Mon, 26 Sep 2011 08:37:39 GMT -X-Varnish: 1908652222 1908651977 -Age: 3 -Via: 1.1 varnish -Connection: close - -{"image":{"id":19,"status":"ACTIVE","created":"2009-12-15T06:36:24-06:00","updated":"2009-12-15T15:43:39-06:00","name":"Gentoo 10.1"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.response deleted file mode 100644 index db48bc6c73..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServer.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:35:35 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:36:02 GMT -X-Varnish: 1908641838 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.response deleted file mode 100644 index 3aed4d4a0f..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerIp.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:36:17 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 208 -Date: Mon, 26 Sep 2011 08:36:29 GMT -X-Varnish: 1908644209 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"PASSWORD","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.response deleted file mode 100644 index 3f4916dcfd..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPrivateIp.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:36:17 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:36:38 GMT -X-Varnish: 1908645328 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.response deleted file mode 100644 index 28d4f003e1..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetServerPublicIp.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:36:17 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:36:34 GMT -X-Varnish: 1908644796 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.request b/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.request deleted file mode 100644 index 716888ce62..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/shared_ip_groups/12288?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.response b/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.response deleted file mode 100644 index 151c4e3ec5..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testGetSharedIpGroup.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:38:06 GMT -X-PURGE-KEY: /583923/shared_ip_groups/12288 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 88 -Date: Mon, 26 Sep 2011 08:38:13 GMT -X-Varnish: 1908655994 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"sharedIpGroup":{"id":12288,"servers":[20247478],"name":"ZFgroupIP"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.response deleted file mode 100644 index d6841f0e7a..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testHardRebootServer.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:36:17 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:37:04 GMT -X-Varnish: 1908648305 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.request b/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.request deleted file mode 100644 index 2a68f0a822..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/flavors/detail?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.response b/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.response deleted file mode 100644 index 7109d9f16b..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListFlavors.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Fri, 01 Apr 2011 00:02:01 GMT -X-PURGE-KEY: /flavors -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 163 -Date: Mon, 26 Sep 2011 08:37:24 GMT -X-Varnish: 1908650596 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"flavors":[{"id":1,"ram":256,"disk":10,"name":"256 server"},{"id":2,"ram":512,"disk":20,"name":"512 server"},{"id":3,"ram":1024,"disk":40,"name":"1GB server"},{"id":4,"ram":2048,"disk":80,"name":"2GB server"},{"id":5,"ram":4096,"disk":160,"name":"4GB server"},{"id":6,"ram":8192,"disk":320,"name":"8GB server"},{"id":7,"ram":15872,"disk":620,"name":"15.5GB server"}]} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListImages.request b/tests/Zend/Service/Rackspace/Servers/_files/testListImages.request deleted file mode 100644 index 05b9a1a9f0..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListImages.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/images/detail?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListImages.response b/tests/Zend/Service/Rackspace/Servers/_files/testListImages.response deleted file mode 100644 index e2cc691c27..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListImages.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Wed, 21 Sep 2011 19:28:14 GMT -X-PURGE-KEY: /583923/images -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 791 -Date: Mon, 26 Sep 2011 08:37:32 GMT -X-Varnish: 1908651545 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"images":[{"id":19,"status":"ACTIVE","updated":"2009-12-15T15:43:39-06:00","name":"Gentoo 10.1"},{"id":71,"status":"ACTIVE","updated":"2011-09-08T13:24:20-05:00","name":"Fedora 14"},{"id":57,"status":"ACTIVE","updated":"2010-09-17T07:16:25-05:00","name":"Windows Server 2008 SP2 x64 - MSSQL2K8R2"},{"id":10,"status":"ACTIVE","updated":"2009-08-26T14:59:54-05:00","name":"Ubuntu 8.04.2 LTS (hardy)"},{"id":78,"status":"ACTIVE","updated":"2011-07-21T08:03:54-05:00","name":"Fedora 15"},{"id":24,"status":"ACTIVE","updated":"2010-01-26T12:07:04-06:00","name":"Windows Server 2008 SP2 x64"},{"id":56,"status":"ACTIVE","updated":"2010-09-17T07:12:56-05:00","name":"Windows Server 2008 SP2 x86 - MSSQL2K8R2"},{"id":58,"status":"ACTIVE","updated":"2010-09-17T07:19:20-05:00","name":"Windows Server 2008 R2 x64 - MSSQL2K8R2"},{"id":76,"status":"ACTIVE","updated":"2011-09-21T11:40:08-05:00","name":"Ubuntu 11.04 (Natty)"},{"id":29,"status":"ACTIVE","updated":"2010-01-26T12:07:32-06:00","name":"Windows Server 2003 R2 SP2 x86"},{"id":28,"status":"ACTIVE","updated":"2010-01-26T12:07:17-06:00","name":"Windows Server 2008 R2 x64"},{"id":62,"status":"ACTIVE","updated":"2011-03-16T11:37:05-05:00","name":"Red Hat Enterprise Linux 5.5"},{"id":4,"status":"ACTIVE","updated":"2009-08-26T14:59:52-05:00","name":"Debian 5.0 (lenny)"},{"id":51,"status":"ACTIVE","updated":"2011-09-08T13:20:47-05:00","name":"CentOS 5.5"},{"id":23,"status":"ACTIVE","updated":"2010-01-26T12:05:53-06:00","name":"Windows Server 2003 R2 SP2 x64"},{"id":49,"status":"ACTIVE","updated":"2011-09-20T12:37:54-05:00","name":"Ubuntu 10.04 LTS (lucid)"},{"id":31,"status":"ACTIVE","updated":"2010-01-26T12:07:44-06:00","name":"Windows Server 2008 SP2 x86"},{"id":77,"status":"ACTIVE","updated":"2011-08-09T14:24:56-05:00","name":"Centos 5.6"},{"id":14362,"status":"ACTIVE","updated":"2009-11-06T05:09:40-06:00","name":"Ubuntu 9.10 (karmic)"},{"id":187811,"status":"ACTIVE","updated":"2009-12-16T01:02:17-06:00","name":"CentOS 5.4"},{"id":75,"status":"ACTIVE","updated":"2011-09-12T13:13:39-05:00","name":"Debian 6.0 (Squeeze)"},{"id":14,"status":"ACTIVE","updated":"2009-12-15T15:37:22-06:00","name":"Red Hat Enterprise Linux 5.4"},{"id":53,"status":"ACTIVE","updated":"2010-06-27T20:13:08-05:00","name":"Fedora 13"},{"id":40,"status":"ACTIVE","updated":"2010-10-28T11:40:20-05:00","name":"Oracle EL Server Release 5 Update 4"},{"id":55,"status":"ACTIVE","updated":"2011-09-21T14:28:14-05:00","name":"Arch 2010.05"},{"id":69,"status":"ACTIVE","updated":"2011-06-23T18:35:25-05:00","name":"Ubuntu 10.10 (maverick)"},{"id":41,"status":"ACTIVE","updated":"2010-09-20T09:08:35-05:00","name":"Oracle EL JeOS Release 5 Update 3"},{"progress":100,"id":11800445,"status":"ACTIVE","created":"2011-07-01T03:24:49-05:00","updated":"2011-07-01T03:29:40-05:00","name":"ZF Unit Test image"},{"progress":100,"id":11798044,"status":"ACTIVE","created":"2011-07-01T02:48:17-05:00","updated":"2011-07-01T03:29:37-05:00","name":"Test image"}]} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListServers.request b/tests/Zend/Service/Rackspace/Servers/_files/testListServers.request deleted file mode 100644 index 7e82a7f7ae..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListServers.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListServers.response b/tests/Zend/Service/Rackspace/Servers/_files/testListServers.response deleted file mode 100644 index 3b98fb4809..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListServers.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:35:35 GMT -X-PURGE-KEY: /583923/servers -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 71 -Date: Mon, 26 Sep 2011 08:36:06 GMT -X-Varnish: 1908642213 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"servers":[{"id":20247478,"name":"zf-unit-test"}]} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.request b/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.request deleted file mode 100644 index c21fb94510..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/shared_ip_groups/detail?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.response b/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.response deleted file mode 100644 index 92b3d7ae07..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testListSharedIpGroups.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:38:06 GMT -X-PURGE-KEY: /583923/shared_ip_groups -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 119 -Date: Mon, 26 Sep 2011 08:38:10 GMT -X-Varnish: 1908655607 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"sharedIpGroups":[{"id":12145,"name":"test_group"},{"id":12179,"name":"ZF group IPs"},{"id":12288,"servers":[20247478],"name":"ZFgroupIP"}]} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.request deleted file mode 100644 index 50f21f3335..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/servers/20247478/action?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 26 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"rebuild":{"imageId":49}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.response deleted file mode 100644 index 1b277cd7d3..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRebuildServer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Type: text/xml -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:15 GMT -X-Varnish: 1908649367 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.request b/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.request deleted file mode 100644 index 8676bc3203..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.request +++ /dev/null @@ -1,10 +0,0 @@ -PUT /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 34 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"server":{"name":"zf-unit-test"}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.response b/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.response deleted file mode 100644 index a329e9ecfe..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRechangeServerName.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:36:18 GMT -X-Varnish: 1908643029 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.request deleted file mode 100644 index 50f21f3335..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/servers/20247478/action?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 26 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"rebuild":{"imageId":49}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.response deleted file mode 100644 index 1b277cd7d3..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testResizeServer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Type: text/xml -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:15 GMT -X-Varnish: 1908649367 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.request deleted file mode 100644 index 50f21f3335..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.request +++ /dev/null @@ -1,10 +0,0 @@ -POST /v1.0/583923/servers/20247478/action?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -Content-Type: application/json -Content-Length: 26 -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - -{"rebuild":{"imageId":49}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.response deleted file mode 100644 index 1b277cd7d3..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testRevertResizeServer.response +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 202 Accepted -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Cache-Control: no-cache -Content-Type: text/xml -Content-Length: 0 -Date: Mon, 26 Sep 2011 08:37:15 GMT -X-Varnish: 1908649367 -Age: 0 -Via: 1.1 varnish -Connection: close - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.request b/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.request deleted file mode 100644 index 304a0b0361..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.request +++ /dev/null @@ -1,7 +0,0 @@ -GET /v1.0/583923/servers/20247478?format=json HTTP/1.1 -Host: servers.api.rackspacecloud.com -Connection: close -Accept-encoding: gzip, deflate -User-Agent: Zend\Http\Client -X-Auth-Token: ed355855-8bfa-4716-b613-c04b606cdd8c - diff --git a/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.response b/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.response deleted file mode 100644 index 5eb9487174..0000000000 --- a/tests/Zend/Service/Rackspace/Servers/_files/testSoftRebootServer.response +++ /dev/null @@ -1,16 +0,0 @@ -HTTP/1.1 200 OK -Server: Apache-Coyote/1.1 -vary: Accept, Accept-Encoding, X-Auth-Token -Vary: Accept-Encoding -Last-Modified: Mon, 26 Sep 2011 08:36:17 GMT -X-PURGE-KEY: /583923/servers/20247478 -Cache-Control: s-maxage=1800 -Content-Type: application/json -Content-Length: 204 -Date: Mon, 26 Sep 2011 08:36:45 GMT -X-Varnish: 1908646200 -Age: 0 -Via: 1.1 varnish -Connection: close - -{"server":{"progress":100,"id":20247478,"imageId":49,"flavorId":1,"status":"ACTIVE","name":"zf-unit-test","hostId":"ad9f86d14056f403153b2ee347c7ddf5","addresses":{"public":["50.57.86.26"],"private":["10.182.40.105"]},"metadata":{}}} \ No newline at end of file diff --git a/tests/Zend/Service/Rackspace/_files/testAuthenticate.response b/tests/Zend/Service/Rackspace/_files/testAuthenticate.response deleted file mode 100644 index d37b54a360..0000000000 --- a/tests/Zend/Service/Rackspace/_files/testAuthenticate.response +++ /dev/null @@ -1,11 +0,0 @@ -HTTP/1.1 204 No Content -Date: Wed, 11 May 2011 08:04:48 GMT -Server: Apache/2.2.3 (Mosso Engineering) -X-storage-url: https://storage101.ord1.clouddrive.com/v1/test -X-storage-token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af -X-cdn-management-url: https://cdn2.clouddrive.com/v1/test -X-auth-token: 0f0223cd-f157-4d04-bb2d-ccda1a5643af -X-server-management-url: https://servers.api.rackspacecloud.com/v1.0/583924 -Content-length: 0 -Connection: close -Content-type: application/octet-stream diff --git a/tests/Zend/Service/Rackspace/_files/testAuthenticateError.response b/tests/Zend/Service/Rackspace/_files/testAuthenticateError.response deleted file mode 100644 index c9e77e7a02..0000000000 --- a/tests/Zend/Service/Rackspace/_files/testAuthenticateError.response +++ /dev/null @@ -1,8 +0,0 @@ -HTTP/1.1 401 Unauthorized -Date: Wed, 11 May 2011 08:42:20 GMT -Server: Apache/2.2.3 (Mosso Engineering) -Content-length: 24 -Connection: close -Content-type: application/octet-stream - -Bad username or password \ No newline at end of file diff --git a/tests/Zend/Service/ReCaptcha/AllTests.php b/tests/Zend/Service/ReCaptcha/AllTests.php deleted file mode 100644 index f629202af9..0000000000 --- a/tests/Zend/Service/ReCaptcha/AllTests.php +++ /dev/null @@ -1,84 +0,0 @@ -addTestSuite('Zend_Service_ReCaptcha_ReCaptchaTest'); - $suite->addTestSuite('Zend_Service_ReCaptcha_ResponseTest'); - } - - if (defined('TESTS_ZEND_SERVICE_RECAPTCHA_ENABLED') && - constant('TESTS_ZEND_SERVICE_RECAPTCHA_ENABLED') && - defined('TESTS_ZEND_SERVICE_RECAPTCHA_MAILHIDE_PUBLIC_KEY') && - defined('TESTS_ZEND_SERVICE_RECAPTCHA_MAILHIDE_PRIVATE_KEY')) { - - $suite->addTestSuite('Zend_Service_ReCaptcha_MailHideTest'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_ReCaptcha_AllTests::main') { - Zend_Service_ReCaptcha_AllTests::main(); -} diff --git a/tests/Zend/Service/ReCaptcha/MailHideTest.php b/tests/Zend/Service/ReCaptcha/MailHideTest.php deleted file mode 100644 index 69930dbef1..0000000000 --- a/tests/Zend/Service/ReCaptcha/MailHideTest.php +++ /dev/null @@ -1,142 +0,0 @@ -_mailHide = new Zend_Service_ReCaptcha_MailHide(); - } - - public function testSetGetPrivateKey() { - $this->_mailHide->setPrivateKey($this->_privateKey); - $this->assertSame($this->_privateKey, $this->_mailHide->getPrivateKey()); - } - - public function testSetGetEmail() { - $mail = 'mail@example.com'; - - $this->_mailHide->setEmail($mail); - $this->assertSame($mail, $this->_mailHide->getEmail()); - $this->assertSame('example.com', $this->_mailHide->getEmailDomainPart()); - } - - public function testEmailLocalPart() { - $this->_mailHide->setEmail('abcd@example.com'); - $this->assertSame('a', $this->_mailHide->getEmailLocalPart()); - - $this->_mailHide->setEmail('abcdef@example.com'); - $this->assertSame('abc', $this->_mailHide->getEmailLocalPart()); - - $this->_mailHide->setEmail('abcdefg@example.com'); - $this->assertSame('abcd', $this->_mailHide->getEmailLocalPart()); - } - - public function testConstructor() { - $mail = 'mail@example.com'; - - $options = array( - 'theme' => 'black', - 'lang' => 'no', - ); - - $config = new Zend_Config($options); - - $mailHide = new Zend_Service_ReCaptcha_MailHide($this->_publicKey, $this->_privateKey, $mail, $config); - $_options = $mailHide->getOptions(); - - $this->assertSame($this->_publicKey, $mailHide->getPublicKey()); - $this->assertSame($this->_privateKey, $mailHide->getPrivateKey()); - $this->assertSame($mail, $mailHide->getEmail()); - $this->assertSame($options['theme'], $_options['theme']); - $this->assertSame($options['lang'], $_options['lang']); - } - - public function testGetHtml() { - $mail = 'mail@example.com'; - - $this->_mailHide->setEmail($mail); - $this->_mailHide->setPublicKey($this->_publicKey); - $this->_mailHide->setPrivateKey($this->_privateKey); - - $html = $this->_mailHide->getHtml(); - - $this->assertRegExp('#^m
\.\.\.@example\.com$#', $html); - } - - public function testGetHtmlWithNoEmail() { - $this->setExpectedException('Zend_Service_ReCaptcha_MailHide_Exception'); - - $html = $this->_mailHide->getHtml(); - } - - public function testGetHtmlWithMissingPublicKey() { - $this->setExpectedException('Zend_Service_ReCaptcha_MailHide_Exception'); - - $mail = 'mail@example.com'; - - $this->_mailHide->setEmail($mail); - $this->_mailHide->setPrivateKey($this->_privateKey); - - $html = $this->_mailHide->getHtml(); - } - - public function testGetHtmlWithMissingPrivateKey() { - $this->setExpectedException('Zend_Service_ReCaptcha_MailHide_Exception'); - - $mail = 'mail@example.com'; - - $this->_mailHide->setEmail($mail); - $this->_mailHide->setPublicKey($this->_publicKey); - - $html = $this->_mailHide->getHtml(); - } - - public function testGetHtmlWithParamter() { - $mail = 'mail@example.com'; - - $this->_mailHide->setPublicKey($this->_publicKey); - $this->_mailHide->setPrivateKey($this->_privateKey); - - $html = $this->_mailHide->getHtml($mail); - - $this->assertRegExp('#m\.\.\.@example\.com$#', $html); - } -} diff --git a/tests/Zend/Service/ReCaptcha/ReCaptchaTest.php b/tests/Zend/Service/ReCaptcha/ReCaptchaTest.php deleted file mode 100644 index de98bb2e83..0000000000 --- a/tests/Zend/Service/ReCaptcha/ReCaptchaTest.php +++ /dev/null @@ -1,281 +0,0 @@ -_reCaptcha = new Zend_Service_ReCaptcha(); - } - - public function testSetAndGet() { - /* Set and get IP address */ - $ip = '127.0.0.1'; - $this->_reCaptcha->setIp($ip); - $this->assertSame($ip, $this->_reCaptcha->getIp()); - - /* Set and get public key */ - $this->_reCaptcha->setPublicKey($this->_publicKey); - $this->assertSame($this->_publicKey, $this->_reCaptcha->getPublicKey()); - - /* Set and get private key */ - $this->_reCaptcha->setPrivateKey($this->_privateKey); - $this->assertSame($this->_privateKey, $this->_reCaptcha->getPrivateKey()); - } - - public function testSingleParam() { - $key = 'ssl'; - $value = true; - - $this->_reCaptcha->setParam($key, $value); - $this->assertSame($value, $this->_reCaptcha->getParam($key)); - } - - public function tetsGetNonExistingParam() { - $this->assertNull($this->_reCaptcha->getParam('foobar')); - } - - public function testMultipleParams() { - $params = array( - 'ssl' => true, - 'error' => 'errorMsg', - 'xhtml' => true, - ); - - $this->_reCaptcha->setParams($params); - $_params = $this->_reCaptcha->getParams(); - - $this->assertSame($params['ssl'], $_params['ssl']); - $this->assertSame($params['error'], $_params['error']); - $this->assertSame($params['xhtml'], $_params['xhtml']); - } - - public function testSingleOption() { - $key = 'theme'; - $value = 'black'; - - $this->_reCaptcha->setOption($key, $value); - $this->assertSame($value, $this->_reCaptcha->getOption($key)); - } - - public function tetsGetNonExistingOption() { - $this->assertNull($this->_reCaptcha->getOption('foobar')); - } - - public function testMultipleOptions() { - $options = array( - 'theme' => 'black', - 'lang' => 'no', - ); - - $this->_reCaptcha->setOptions($options); - $_options = $this->_reCaptcha->getOptions(); - - $this->assertSame($options['theme'], $_options['theme']); - $this->assertSame($options['lang'], $_options['lang']); - } - - public function testSetMultipleParamsFromZendConfig() { - $params = array( - 'ssl' => true, - 'error' => 'errorMsg', - 'xhtml' => true, - ); - - $config = new Zend_Config($params); - - $this->_reCaptcha->setParams($config); - $_params = $this->_reCaptcha->getParams(); - - $this->assertSame($params['ssl'], $_params['ssl']); - $this->assertSame($params['error'], $_params['error']); - $this->assertSame($params['xhtml'], $_params['xhtml']); - } - - public function testSetInvalidParams() { - $this->setExpectedException('Zend_Service_ReCaptcha_Exception'); - $var = 'string'; - $this->_reCaptcha->setParams($var); - } - - public function testSetMultipleOptionsFromZendConfig() { - $options = array( - 'theme' => 'black', - 'lang' => 'no', - ); - - $config = new Zend_Config($options); - - $this->_reCaptcha->setOptions($config); - $_options = $this->_reCaptcha->getOptions(); - - $this->assertSame($options['theme'], $_options['theme']); - $this->assertSame($options['lang'], $_options['lang']); - } - - public function testSetInvalidOptions() { - $this->setExpectedException('Zend_Service_ReCaptcha_Exception'); - $var = 'string'; - $this->_reCaptcha->setOptions($var); - } - - public function testConstructor() { - $params = array( - 'ssl' => true, - 'error' => 'errorMsg', - 'xhtml' => true, - ); - - $options = array( - 'theme' => 'black', - 'lang' => 'no', - ); - - $ip = '127.0.0.1'; - - $reCaptcha = new Zend_Service_ReCaptcha($this->_publicKey, $this->_privateKey, $params, $options, $ip); - - $_params = $reCaptcha->getParams(); - $_options = $reCaptcha->getOptions(); - - $this->assertSame($this->_publicKey, $reCaptcha->getPublicKey()); - $this->assertSame($this->_privateKey, $reCaptcha->getPrivateKey()); - $this->assertSame($params['ssl'], $_params['ssl']); - $this->assertSame($params['error'], $_params['error']); - $this->assertSame($params['xhtml'], $_params['xhtml']); - $this->assertSame($options['theme'], $_options['theme']); - $this->assertSame($options['lang'], $_options['lang']); - $this->assertSame($ip, $reCaptcha->getIp()); - } - - public function testConstructorWithNoIp() { - // Fake the _SERVER value - $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; - - $reCaptcha = new Zend_Service_ReCaptcha(null, null, null, null, null); - - $this->assertSame($_SERVER['REMOTE_ADDR'], $reCaptcha->getIp()); - - unset($_SERVER['REMOTE_ADDR']); - } - - public function testGetHtmlWithNoPublicKey() { - $this->setExpectedException('Zend_Service_ReCaptcha_Exception'); - - $html = $this->_reCaptcha->getHtml(); - } - - public function testVerify() { - $this->_reCaptcha->setPublicKey($this->_publicKey); - $this->_reCaptcha->setPrivateKey($this->_privateKey); - $this->_reCaptcha->setIp('127.0.0.1'); - - $adapter = new Zend_Http_Client_Adapter_Test(); - $client = new Zend_Http_Client(null, array( - 'adapter' => $adapter - )); - - Zend_Service_ReCaptcha::setHttpClient($client); - - // Set a header that will be reset in the recaptcha class before sending the request - $client->setHeaders('host', 'example.com'); - $resp = $this->_reCaptcha->verify('challengeField', 'responseField'); - $this->assertNotSame('example.com', $client->getHeader('host')); - - // See if we have a valid object and that the status is false - $this->assertTrue($resp instanceof Zend_Service_ReCaptcha_Response); - $this->assertFalse($resp->getStatus()); - } - - public function testGetHtml() { - $this->_reCaptcha->setPublicKey($this->_publicKey); - $errorMsg = 'errorMsg'; - $this->_reCaptcha->setParam('ssl', true); - $this->_reCaptcha->setParam('xhtml', true); - $this->_reCaptcha->setParam('error', $errorMsg); - - $html = $this->_reCaptcha->getHtml(); - - // See if the options for the captcha exist in the string - $this->assertNotSame(false, strstr($html, 'var RecaptchaOptions = {"theme":"red","lang":"en"};')); - - // See if the js/iframe src is correct - $this->assertNotSame(false, strstr($html, 'src="' . Zend_Service_ReCaptcha::API_SECURE_SERVER . '/challenge?k=' . $this->_publicKey . '&error=' . $errorMsg . '"')); - } - - /** @group ZF-10991 */ - public function testHtmlGenerationWillUseSuppliedNameForNoScriptElements() - { - $this->_reCaptcha->setPublicKey($this->_publicKey); - $html = $this->_reCaptcha->getHtml('contact'); - $this->assertContains('contact[recaptcha_challenge_field]', $html); - $this->assertContains('contact[recaptcha_response_field]', $html); - } - - public function testVerifyWithMissingPrivateKey() { - $this->setExpectedException('Zend_Service_ReCaptcha_Exception'); - - $this->_reCaptcha->verify('challenge', 'response'); - } - - public function testVerifyWithMissingIp() { - $this->setExpectedException('Zend_Service_ReCaptcha_Exception'); - - $this->_reCaptcha->setPrivateKey($this->_privateKey); - $this->_reCaptcha->verify('challenge', 'response'); - } - - public function testVerifyWithMissingChallengeField() { - $this->_reCaptcha->setPrivateKey($this->_privateKey); - $this->_reCaptcha->setIp('127.0.0.1'); - $response = $this->_reCaptcha->verify('', 'response'); - $this->assertFalse($response->getStatus()); - } - - public function testVerifyWithMissingResponseField() { - $this->_reCaptcha->setPrivateKey($this->_privateKey); - $this->_reCaptcha->setIp('127.0.0.1'); - $response = $this->_reCaptcha->verify('challenge', ''); - $this->assertFalse($response->getStatus()); - } -} diff --git a/tests/Zend/Service/ReCaptcha/ResponseTest.php b/tests/Zend/Service/ReCaptcha/ResponseTest.php deleted file mode 100644 index cac51c3795..0000000000 --- a/tests/Zend/Service/ReCaptcha/ResponseTest.php +++ /dev/null @@ -1,124 +0,0 @@ -_response = new Zend_Service_ReCaptcha_Response(); - } - - public function testSetAndGet() { - /* Set and get status */ - $status = 'true'; - $this->_response->setStatus($status); - $this->assertSame(true, $this->_response->getStatus()); - - $status = 'false'; - $this->_response->setStatus($status); - $this->assertSame(false, $this->_response->getStatus()); - - /* Set and get the error code */ - $errorCode = 'foobar'; - $this->_response->setErrorCode($errorCode); - $this->assertSame($errorCode, $this->_response->getErrorCode()); - } - - public function testIsValid() { - $this->_response->setStatus('true'); - $this->assertSame(true, $this->_response->isValid()); - } - - public function testIsInvalid() { - $this->_response->setStatus('false'); - $this->assertSame(false, $this->_response->isValid()); - } - - public function testSetFromHttpResponseWhenResponseContentIsMissing() { - $responseBody = 'true'; - $httpResponse = new Zend_Http_Response(200, array('Content-Type' => 'text/html'), $responseBody); - - $this->_response->setFromHttpResponse($httpResponse); - - $this->assertTrue($this->_response->getStatus()); - $this->assertSame('', $this->_response->getErrorCode()); - } - - public function testSetFromHttpResponse() { - $status = 'false'; - $errorCode = 'foobar'; - $responseBody = $status . "\n" . $errorCode; - $httpResponse = new Zend_Http_Response(200, array('Content-Type' => 'text/html'), $responseBody); - - $this->_response->setFromHttpResponse($httpResponse); - - $this->assertSame(false, $this->_response->getStatus()); - $this->assertSame($errorCode, $this->_response->getErrorCode()); - } - - public function testSetFromHttpResponseWhenResponseHasSeveralLinesOfContent() { - $status = 'false'; - $errorCode = 'foobar'; - $responseBody = $status . "\n" . $errorCode . "\nSome data\nEven more data"; - $httpResponse = new Zend_Http_Response(200, array('Content-Type' => 'text/html'), $responseBody); - - $this->_response->setFromHttpResponse($httpResponse); - - $this->assertSame(false, $this->_response->getStatus()); - $this->assertSame($errorCode, $this->_response->getErrorCode()); - } - - public function testConstructor() { - $status = 'true'; - $errorCode = 'ok'; - - $response = new Zend_Service_ReCaptcha_Response($status, $errorCode); - - $this->assertSame(true, $response->getStatus()); - $this->assertSame($errorCode, $response->getErrorCode()); - } - - public function testConstructorWithHttpResponse() { - $status = 'false'; - $errorCode = 'foobar'; - $responseBody = $status . "\n" . $errorCode; - $httpResponse = new Zend_Http_Response(200, array('Content-Type' => 'text/html'), $responseBody); - - $response = new Zend_Service_ReCaptcha_Response(null, null, $httpResponse); - - $this->assertSame(false, $response->getStatus()); - $this->assertSame($errorCode, $response->getErrorCode()); - } -} diff --git a/tests/Zend/Service/ShortUrl/AllTests.php b/tests/Zend/Service/ShortUrl/AllTests.php deleted file mode 100644 index 71190116d3..0000000000 --- a/tests/Zend/Service/ShortUrl/AllTests.php +++ /dev/null @@ -1,83 +0,0 @@ -addTestSuite('Zend_Service_ShortUrl_IsGdTest'); - $suite->addTestSuite('Zend_Service_ShortUrl_JdemCzTest'); - $suite->addTestSuite('Zend_Service_ShortUrl_MetamarkNetTest'); - $suite->addTestSuite('Zend_Service_ShortUrl_TinyUrlComTest'); - $suite->addTestSuite('Zend_Service_ShortUrl_BitLyTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_ShortUrl_AllTests::main') { - Zend_Service_ShortUrl_AllTests::main(); -} diff --git a/tests/Zend/Service/ShortUrl/BitLyTest.php b/tests/Zend/Service/ShortUrl/BitLyTest.php deleted file mode 100644 index 247672b886..0000000000 --- a/tests/Zend/Service/ShortUrl/BitLyTest.php +++ /dev/null @@ -1,116 +0,0 @@ -markTestSkipped('Testing Zend_Service_ShortUrl_BitLyTest only works when TESTS_ZEND_SERVICE_SHORTURL_BITLY_ENABLED is set.'); - } - - Zend_Service_Abstract::setHttpClient(new Zend_Http_Client()); - } - - public function testShortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - - $s = new Zend_Service_ShortUrl_BitLy('test'); - $s->shorten(''); - } - - public function testShortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - - $s = new Zend_Service_ShortUrl_BitLy('test'); - $s->shorten('wrongAdress.cccc'); - } - - public function testExceptionOnBadApiResponse() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - - $clientResponse = $this->getMock('Zend_Http_Response', array(), array(), '', false); - $clientResponse->expects($this->once())->method('getStatus')->will($this->returnValue(500)); - - $client = $this->getMock('Zend_Http_Client', array(), array(), '', false); - $client->expects($this->once())->method('request')->will($this->returnValue($clientResponse)); - - $s = new Zend_Service_ShortUrl_BitLy('test'); - $s->setHttpClient($client); - $s->shorten('http://framework.zend.com'); - } - - public function testAuthenticationWithAccessToken() - { - $accessToken = 'test'; - - $clientResponse = $this->getMock('Zend_Http_Response', array(), array(), '', false); - $clientResponse->expects($this->once())->method('getStatus')->will($this->returnValue(200)); - $clientResponse->expects($this->once())->method('getBody')->will($this->returnValue('http://bit.ly/ZFramework')); - - $client = $this->getMock('Zend_Http_Client', array(), array(), '', false); - $client->expects($this->any())->method('setParameterGet')->with($this->anything(),$this->anything()); - $client->expects($this->at(0))->method('setParameterGet')->with('access_token',$accessToken); - $client->expects($this->once())->method('request')->will($this->returnValue($clientResponse)); - - $s = new Zend_Service_ShortUrl_BitLy($accessToken); - $s->setHttpClient($client); - $s->shorten('http://framework.zend.com'); - } - - public function testAuthenticationWithUserCredentials() - { - $login = 'test'; - $apiKey = 'api'; - - $clientResponse = $this->getMock('Zend_Http_Response', array(), array(), '', false); - $clientResponse->expects($this->once())->method('getStatus')->will($this->returnValue(200)); - $clientResponse->expects($this->once())->method('getBody')->will($this->returnValue('http://bit.ly/ZFramework')); - - $client = $this->getMock('Zend_Http_Client', array(), array(), '', false); - $client->expects($this->any())->method('setParameterGet')->with($this->anything(),$this->anything()); - $client->expects($this->at(0))->method('setParameterGet')->with('login',$login); - $client->expects($this->at(1))->method('setParameterGet')->with('apiKey',$apiKey); - $client->expects($this->once())->method('request')->will($this->returnValue($clientResponse)); - - $s = new Zend_Service_ShortUrl_BitLy($login, $apiKey); - $s->setHttpClient($client); - $s->shorten('http://framework.zend.com'); - } -} diff --git a/tests/Zend/Service/ShortUrl/IsGdTest.php b/tests/Zend/Service/ShortUrl/IsGdTest.php deleted file mode 100644 index c19e375ed4..0000000000 --- a/tests/Zend/Service/ShortUrl/IsGdTest.php +++ /dev/null @@ -1,113 +0,0 @@ -markTestSkipped('Testing Zend_Service_ShortUrl_IsGdTest only works when TESTS_ZEND_SERVICE_SHORTURL_ISGD_ENABLED is set.'); - } - - Zend_Service_Abstract::setHttpClient(new Zend_Http_Client()); - - $this->_s = new Zend_Service_ShortUrl_IsGd(); - $this->_s->getHttpClient()->resetParameters(true); - } - - public function testShortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten(''); - } - - public function testShortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten('wrongAdress.cccc'); - } - - public function testShorten() - { - $urls = array( - 'http://framework.zend.com/', - 'http://framework.zend.com/manual/en/', - ); - - foreach ($urls as $url) { - $shortenedUrl = $this->_s->shorten($url); - - $this->assertNotEquals($url, $shortenedUrl); - $this->assertEquals($url, $this->_s->unshorten($shortenedUrl)); - } - } - - public function testUnshorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://is.gd/g3ASn', - 'http://framework.zend.com/manual/en/' => 'http://is.gd/g3AVm' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($url, $this->_s->unshorten($shortenedUrl)); - } - } - - public function testUnshortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten(''); - } - - public function testUnshortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('wrongAdress.cccc'); - } - - public function testUnshortenWrongUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('http://www.zend.com'); - } -} diff --git a/tests/Zend/Service/ShortUrl/JdemCzTest.php b/tests/Zend/Service/ShortUrl/JdemCzTest.php deleted file mode 100644 index 611323a577..0000000000 --- a/tests/Zend/Service/ShortUrl/JdemCzTest.php +++ /dev/null @@ -1,109 +0,0 @@ -markTestSkipped('Testing Zend_Service_ShortUrl_JdemCzTest only works when TESTS_ZEND_SERVICE_SHORTURL_JDEMCZ_ENABLED is set.'); - } - - Zend_Service_Abstract::setHttpClient(new Zend_Http_Client()); - - $this->_s = new Zend_Service_ShortUrl_JdemCz(); - } - - public function testShortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten(''); - } - - public function testShortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten('wrongAdress.cccc'); - } - - public function testShorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://jdem.cz/ab2l1', - 'http://framework.zend.com/manual/en/' => 'http://jdem.cz/ab3z7' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($shortenedUrl, $this->_s->shorten($url)); - } - } - - public function testUnshorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://jdem.cz/ab2l1', - 'http://framework.zend.com/manual/en/' => 'http://jdem.cz/ab3z7' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($url, $this->_s->unshorten($shortenedUrl)); - } - } - - public function testUnshortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten(''); - } - - public function testUnshortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('wrongAdress.cccc'); - } - - public function testUnshortenWrongUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('http://www.zend.com'); - } -} diff --git a/tests/Zend/Service/ShortUrl/MetamarkNetTest.php b/tests/Zend/Service/ShortUrl/MetamarkNetTest.php deleted file mode 100644 index c434ba1d92..0000000000 --- a/tests/Zend/Service/ShortUrl/MetamarkNetTest.php +++ /dev/null @@ -1,110 +0,0 @@ -markTestSkipped('Testing Zend_Service_ShortUrl_MetamarkNetTest only works when TESTS_ZEND_SERVICE_SHORTURL_METAMARKNET_ENABLED is set.'); - } - - Zend_Service_Abstract::setHttpClient(new Zend_Http_Client()); - - $this->_s = new Zend_Service_ShortUrl_MetamarkNet(); - } - - public function testShortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten(''); - } - - public function testShortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten('wrongAdress.cccc'); - } - - public function testShorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://xrl.us/bh4ptf', - 'http://framework.zend.com/manual/en/' => 'http://xrl.us/bh4pth' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($shortenedUrl, $this->_s->shorten($url)); - } - } - - public function testUnshorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://xrl.us/bh4ptf', - 'http://framework.zend.com/manual/en/' => 'http://xrl.us/bh4pth' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($url, $this->_s->unshorten($shortenedUrl)); - } - } - - public function testUnshortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten(''); - } - - public function testUnshortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('wrongAdress.cccc'); - } - - public function testUnshortenWrongUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('http://www.zend.com'); - } -} diff --git a/tests/Zend/Service/ShortUrl/TinyUrlComTest.php b/tests/Zend/Service/ShortUrl/TinyUrlComTest.php deleted file mode 100644 index 25263f4402..0000000000 --- a/tests/Zend/Service/ShortUrl/TinyUrlComTest.php +++ /dev/null @@ -1,109 +0,0 @@ -markTestSkipped('Testing Zend_Service_ShortUrl_TinyUrlComTest only works when TESTS_ZEND_SERVICE_SHORTURL_TINYURL_ENABLED is set.'); - } - - Zend_Service_Abstract::setHttpClient(new Zend_Http_Client()); - - $this->_s = new Zend_Service_ShortUrl_TinyUrlCom(); - } - - public function testShortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten(''); - } - - public function testShortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->shorten('wrongAdress.cccc'); - } - - public function testShorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://tinyurl.com/rxtuq', - 'http://framework.zend.com/manual/en/' => 'http://tinyurl.com/ynvdzf' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($shortenedUrl, $this->_s->shorten($url)); - } - } - - public function testUnshorten() - { - $urls = array( - 'http://framework.zend.com/' => 'http://tinyurl.com/rxtuq', - 'http://framework.zend.com/manual/en/' => 'http://tinyurl.com/ynvdzf' - ); - - foreach ($urls as $url => $shortenedUrl) { - $this->assertEquals($url, $this->_s->unshorten($shortenedUrl)); - } - } - - public function testUnshortenEmptyUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten(''); - } - - public function testUnshortenIncorrectUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('wrongAdress.cccc'); - } - - public function testUnshortenWrongUrlException() - { - $this->setExpectedException('Zend_Service_ShortUrl_Exception'); - $this->_s->unshorten('http://zend.com'); - } -} diff --git a/tests/Zend/Service/SlideShare/_files/demo.ppt b/tests/Zend/Service/SlideShare/_files/demo.ppt deleted file mode 100644 index f7692a1de7833e327a6d6bbab830e63531b3c317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267264 zcmeFZcQjmI6hA6@7d;5kdk>?x=)JcLqLY{*QG+0QCwdtrL_+3k&!YpKgPmReDcJCf>bh!nrmE`Cl(jWAObqok^)#$)tqcu=Ost$xHvU6 zxwsgXntET)NX&@~Pbf%;exH+`Tv${HE6h(!PRPhlOHHjVE(VfwYVszlD(Sfr{%JQWTzap%XZ zu<-~s#H(eRKZn0WAMQZI4Eq{6+jKtz>XTM2@r#+` zK%8*r(`s7(w)n)$`LP$$ixKEz{bilQ!mUsRhqID5;&3Tb`{gd+Q z<=Ves(bKy89%u3i$z8im-Y`*9EhXCctV13+57s)Lms_~+!A{jbzPw&Bw{-)Z`LV#_ z;N+#8^JRwA#gp+`T2#cFq7!bhBZ)&>8iBi=N!P@OrD`+0rEOTGWLCYPpXQWv51rY} zRcTzqOAYW6Xz`05>fv>Nmg~2LyF@$EPB;>qJ(Y6^KDg=q&1LD>K%3LAw(J%7gXcSP zB3k7zA?D=p(HDQDi)C(9p5y!F@PS}&%n~CEvOT%AMD*auIYXU-{=_qnzr#;|M7?ep zWOK`xF$SmMF864=V(F8Tc74KgBo9>`d8dPER`|A^gIWqW?<1k8ZLgY@g6-}h2xnkW3QPliF4NM{G|aQE&dp( z2p07kI*4^)U5iyDuFq<4xdpw5`R%mN2sAMQV!wKedb@8XnyMb0j|m*GM9A%a?g!e8 z%#%_wSYAoXAGGyRp?_9>aR#?lv>!Ei7dQp zY|5Nja|0)k#Nx(u=x+X@8*WiK;XApoUQB@!+VP#$pQ+d)jI}AS7STOUF8nfrHl`PS zh@Y$98=$aEz8zK}7f{F)*4i$wa?qYl8e6>e_ zGbEpM*aDwZBN)J$S2!US4?QeM%s)5>yfTuT0Y8(SM=Kct=SE2~zaTHl;f+4~?f!YS zDb{bAD!xzo<_Oggf&I(kYkD0g08Yb^&5-}IS-nJBC(U)C!Ue|dhfI2D3Q>8ZY5X`A zXo#V#e|Ji_RyIH$3bK z%*++u9hhS06|bKLYR0m%W1EmGo~yWd-HzuSw!a-lX~tYtvYdeaIg(!fKK?|+Y1VeY zh`a5zBj4*vBq%Mr-V^fOV(5`Ej>G0Maa)}Z;XbWob^+AxY&mqtth3PTT=+OSgE@Sm zn)AV>3pPf1XR75>=l1wWP>`TM{|i>W3+jiH{eqJ^%hz6uISZ~2}y7#MC=2# zevjiRJyiql$jh;8;*?}a@AI({Vu&})g0ja%E!nZIInrU@E5kZiTGh8Ey`h>)vpX3o zZt4Se9oWSgRR8=Dc%e>Ksvz#;=7y`VSmt-!l-OV3`e8 zNAu;ncjQA;5EvYEt=UFU)n$iLktzN<*bw8@}IS_n`+_P&3Wtq#_gLw)t`wb&s%nPFJ9ZjjNBYIGsqCnMn8)RwF zFsYV}cla5%+f^^}@MzX;^!WhWGt$yFOp!Et-YH|r;teSuEs@(*8?ueUd1+gU+XcEH zjm{bH_o!C{+u;YHAS-3}nw}YzpesI-0_YK{g7^q_ljSo3Y(u6{%3U08Xad+6${Q%a z=sLh`S0OJ1&^PA=n3`F%gxl3~6uFHw+O9!Cj_Gf}CM0;k-=SU_mcLhj-~-&$_}Khw zEk3T{oA8HE{tM!{wpK|+d6wV*+;@M)B^hvp5gX!zfehNxC4XOhppATBxe2DQCxWlW){HuF9gVU(uzCn1|%qb0M&l~qdbVdGcmu*{pZ7pvs0vV z)CY)edemce30y&)0?ZHiX&bfg*c>&_lV{eLnC}Hp5!B(4U$~ISN+&5y?~?bMm*kPu zB+9?nKU8F%3^s-?qToQA385Wt2j6{krqi%Tf=6;?Pa6Bk?Pq^&ljY!aL(2i%)=z-)>ty0N z^#L;%9U|Rv!X&f2@kiqRpOdQU_8|5N-a%%sMVnm6Jj}#PR%;d@6!vwy{Gd23GV3PV zJOoAtoO$L19$ty_o9@nZEN$d0Y<#As{Skt19mAK`rUQ>8Z7L9I7kV$GW|_clm2IB@ zLie$Y7pQB}ptaI`onHfy4I=~B$>J`%GJJsA$VjEDb0j@ejJ>HYoRqx+qQi4TQ+McJ!7*2l#0#Kd*U4cr7XGA80I-s(O&@{hR* z_@DVGB|&h0Ha#!sQEFl380l-E!vTErRwRd|%E5!ELZ2*ln2<1@Se5vZzD398ShtQX59%+0pMhpM!q}{02J2RCoT6M44?Ud*|lFk*s^RY7! zDE&UshdL{OHnmJfz1whpl`WF@wMm-ck943F(sjx0nXMoW<%GX7#B^544OFbeaB3{- zh9&{5@8k);9j?Xo|>7u zI=2O$!G!-?*U665Ld)#2wI`6=wya9UUBs01uYt{3HR z>ZO~ycHS)OSi?5{m01PxArj7+Tgocd(ZngZ6Z4T3Cy~Zjzdu6TzVtO9GR)0HOa)c{ z>Eaqhsgm7?qNO$-CFBtg6 zuzB@xBX~!EOvhj5dy;90#i)gWU*4{|pPJtQeOq1~?hIfY!4*%1`WS@Uc5(hBc@nfr zuE)$45OFA=q&d=31cGWlsl|$ifJA|TL)_hq!$!=BG{;T_M||@bXu1TKUYHAL=FeYVyS3i6nai3a+r@jwE{3D@2wA2=u`@j=S?#gk*`R@pBKsZ&tFX;?P=qrbN6$X|ycl#AwA*>6a{;DWYz6{1o(f*>lxP zgoE`D9V!CH3kGEm0t3Du+{e!9_~qaKE~&iNuhA+Z!$D?4yz7hwX*ElX+$&$X@UBmS zM5XAZ>#np9dqW|WQySsoI?f<+Mg*DR7+$Z-_M+mU5ctKZ-lvliXA&j+tK`(?6QwiT z76vfL_U4hy%_HL4<%90UwTbpA(=cGf1|l9nFBjC7Iv|{KrC=<2UgbpyQ~ts_mZr9qUi_mAXrNZS() zsYjYNDNpuiAyR|XJDk*NOw$|f?o!lA%cbr#g`7sOiMX!+g5(=|31c%xUW;GTr1WI{ z>J51C*2l6RNS$vR2bq_AgQ=E&U9u;+J;VQf_^}3-S4ilXZ!^zbKkzH%5ZeI`L))L( z0*C9 z243*Mnebyfnd-aUqV#0ca?(UpuD+{>>&nFy`nN5)prhbJ=}s8wSoDLV1)%+{5(A-) ze8c;137BJvjrR8NilNf^Rj)jKa(v@b7BuFy^t;SuizeeXw`Up9j+)zjhncRvkd{Za~b z^b0v6n;VZM=yUA@{@E!0v?kGG*`DjoIQI#MDglM_ww$S8d$}1u`a_Oyjj}^#OaI>f zxbd>)5`R=T;{4Xd1@Cnmq!@b$opGMg@aal6=qlE3yT#HqZOXz8Lgb=qWOP(QF-syO z=swHwZ9Urn`ODj9$jBm&S+$@Q)8JyB(r|_O?fiua;$d^S6rz98Dga4s7BC2+KV(49 z>BuLe9P>_b(mNCtqw5qCJ`+EeLd86AfC&G}RxHN$5Lm0!&V5Yq(JE+rmNyVmPp4Xf z8ufl#>7pxFBUK~U>6bDqtnfHk=dv-xiX1=3%fr?yZS&L*{s7JY;x_XD5B+_L=xkfg zwI&{5eO~Iymy1+O7mJLOKuau1@~6c)?yFfs=gKE-38-tyfCGY-cBfgj)X|euzAVvIbJ-77*qj zJ@qs{IWf`xHv0OmCpnV|(ec8eM=FZ^K?`!g#=d+MqT(`|&gq2-7@Jdz5u|pe(!(p% zGNZKe;8!sb3LqP73m5!C{e{Gg>rhr*a=`(uLj$%SZDBcFOk)2UM4e9-{m~|I-QDk( zD`g2oDrQ$OD1cEjZGadk(w$r)NLkcMMiE&gN(}AQ%;`Y97=|O4#_*pxH8XsrA+;l* z)alk^?@DM;PItObJHT~Cw+*F8F2s16^q4AY7&G~oWPwJ89v!{R5Esc%cxA&HYq-Fh3 z6EW*01JcivEO&)`c3W*&EqXv>$Uz+lwH@lz0U{;FJoeGvQSkd;y5ytfUzTFP#%TPi z2{sV^<{QfPlNjzCt&nUpQuZy9lES#r%;WEok%nHL2Z zO}eS~Kf?`-$ehpOFl*!ETe}d#Uk0ir-zYWGV5xAKzf-oP$uW=6Z=3YVhYqnl)@0^k z+qoj=NEWl}d{XU!8JnKKRweM{j zfy<+80bbi6?$<>@bYSWo%4vVIFAI=dR*muWhP@UK-?$uRD^2TXxH4VjePvP*H?|Lq zg-d|}KJj(O5K9KMu5ZxOpq*U|yA_5X*b-hk{dGQa#Th&p6c84cxoF3Cffgey8;oq; zkwr+@4TAFd>aYPPg1n5#ZwZ!-F3^rcZ~BJB#c9eYuh+J5OowgEJjKCXw&uMj4uUH{ z-x-ZOW@mR+F3QzQ9!OmE>LH4?zscJ6a>z+FhcFG}xi8qpV|pGv+nCRDd0od72yEQz zkkDI*g~{O~Iw7OHhB4d1L1vxf^PH209sGclppV30tXyK^V=EG&H;FeKX_1Ww4>cm0=q@sl$4}3|KzdD1p7@Rb(VmVVi>n zze!;CLt@{Zp$-+D4UVC!5%I*p=NPEtCm-NNm&y)o5*luMH-)ikFL}k#rw!fsRaH^KfudDp?GT8vz)n_WLj?(!S12L^x$H~r#g3l!#ZDHl zgx>ud-JX15e?0n0?qaX!_Bd}m%mD$v5%|0>0uj2rrMHJIJ1v85NIROC(@q=8hP%_r zqphRkzUDyg{u$nEirk*PDC0*8FVp<>_vM)cH8Qr^L^l`e(!BV_kc@+7Law=rd7so3 zU|PF0?>^NM1I<%oeaIdw_T0BEz85g|KPQkiyLJSbuQrVT7)APa@{IfLpSE zD|gy+IT-rC@nY|;$sI1*nEu_hr7V|vb%loeJz<$&361Owu_3_R?otAuibIvX zx;CN57W*4=7Y$kFOn>QeiLHL%p$=-7=U&d9+!~r>HOw4r@hw;vo?^8_ICey-tmR3= z30RUR2Q@`bAOWr%QlGXUY4?vB+a)dF7Tl33L#Pp{tJ_Y%(_?GTq?bgG)c6!%o}BTg zJel`HMXf z529Q}td&ovlFR*96+#&<{)ve*wI)p}+t7x06^@!(rHEL-Yn@K-{!C79fdb`yybD{G zLI{PGI7^$q=pR2&GbX?iBZfT5j-02MN@j&1$yns|a!{L9U4NABl&%BYik5G`-g0!? zXp(-tnnZ?L-QfeDPERRbzNzIpS8Tf&F2_250G2Z~^y9Q^C6*e@&dG90sV>!SpudUf6Wy?`BssVIfw zPl6qI84MmR{L$3O^pUja!^17DZ-Q8a2L9T2&p=p?>-`R@`FJ4S7I+xg?UR#QqnPBl4tEzU^**C-^T$t$ACqyy~ud?ySj-X}-P+Lap!npb8< z=4W}Wd`0tZT0_hQ+4$|vHd0Xd=6)ZlYNBsCIAZvCo>|wr8X^xXy`k`%zaEWhnAD$+p3n9 zo^G?BG&mNb8P39tS2nXx>(0);Q;$Gpy` zW3?0w;iVHJoPuOLg3G*M`HtX1`kQHsn~kRnvO6VIDW5PwjHg{jESw$LRJR~E$j0wP z77Bm1bb~RE(TI`$!4zSEHnoO|VSMiDGST2YLM$83>StX1jpI5DV1DU`=4jb$KTTGv zA+si~zGD!w(Vay6Al|QsQ3EEA3rTB_W3}^)hWdNeZ~zJVW;k0YM|*+97_=}0x{W`a ziXKTd|D66>Xpl}L;w76?0SXUG*!#PJXGQP z`E`tq8y3>a5@p|sLGg~e33aNQf~s%arI9S90ck8(Xj>YHBFzBNGq*{H_6c0aD#PN= ztKZc9CaI}Pq5m9iDkl%A-+i?k2NgO7n2hEKHqypFlZZB=7072&)lQFRCLJz$&o7fM zq^t$mShJT)G^$5wOlgpS0^hM+JqE}&_bGO23@<=v2&=aekggNQSw-B#Ep9$-;b)7N zovARC<;+j{!|8xmwX``6Wrye>(;#>*a_VsZ#4U z4g2qpTf0G?PW3dN*5)j%EI1inJlCWC)i?Lb0k^)yeqZug{dey-wDtCKsTFpV=!mk$ z+6LyIz_t)P`5Q^e53*{=P!MCaeY;W<3JmO~)k2g|6&*)Dq07YR9Lr9Zr43s^FyIk9 z`Dn4a3W`vFP%cy#@1>^e${oS(0qYXqDBo0;KwUAOJqOacZ|@VLd7byLqq|$~Fo!E)VM;W;P1aeQY;lChi!QGOcq6 zru}mn;P=UHZ*##ZSp4imt2$55pWUso^wGDFAo;z9=q&iGOK{9{PnzZOZ`;wMn8Idy zU1LX6=2G4z?!%d%pVdCswzihzPx{kgzM6{65}`dL?5sQWX?*IJxrrN&BheYlE-<^? z?`NqPYoN9A^t?Ir=fk1q|U%vE3 z%92B!k6=LSss7-v-pRt@`mm)b2c^4ew+1s+U|fD(x5iLWz)R4~^37!Br2wq3A=z?t z-SJzi8gcw|eqg^FVtk_bJQ;HlSk7hlXoM{5>xh3Rg6ZX^45oa+ktC+1iS4+p`|L}# zjE%n)e(G)#bgDJ!pb2qB^Xg3ijnD|ybMKYN9(NxGft@kfZNsS?<^$>O>0zkR zEvnKAm1sg$3(6xp%(fu{PxU&U6j3_Mx(0)qR(5H@r*W+(`tyUB=ARFx+gCh&e%EcX zI{K)(#uZNjtXCKgMGwP)M#9te`TdmT%SEHz@kRLX2@<=~B0!&he|sS^>lswDI9TZI zqVOdeK`fWajG82imrsSZ`2i=NUr7CBV0;;R;u|kSQaBN#Y1-Zm;OG{B-7_$^7BG6P z)Xmgk!0~T;zyId9tkj~VgZi@jW3m`7;j2(+%0Dy!)2B_9_UI`Nh_B7@EUDh~v9qmj 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

~Njv%Izxgf=_hk*Pi>6fdVlJ(EIFNBTu*u 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 yP+Q*|Y78xC2(*r1qmS83 0, - 'automatic_serialization' => true - ), - array('cache_dir' => dirname(__FILE__) . "/SlideShare/_files") - ); - $ss->setCacheObject($cache); - - return $ss; - } - - public function setUp() - { - if (!defined("TESTS_ZEND_SERVICE_SLIDESHARE_APIKEY") - || !defined("TESTS_ZEND_SERVICE_SLIDESHARE_SHAREDSECRET") - || !defined("TESTS_ZEND_SERVICE_SLIDESHARE_USERNAME") - || !defined("TESTS_ZEND_SERVICE_SLIDESHARE_PASSWORD") - || (TESTS_ZEND_SERVICE_SLIDESHARE_APIKEY == "") - || (TESTS_ZEND_SERVICE_SLIDESHARE_SHAREDSECRET == "") - || (TESTS_ZEND_SERVICE_SLIDESHARE_USERNAME == "") - || (TESTS_ZEND_SERVICE_SLIDESHARE_PASSWORD == "") - ) { - $this->markTestSkipped( - "You must configure an account for slideshare to run these tests" - ); - } - } - - public function testGetSlideShow() - { - if (!defined("TESTS_ZEND_SERVICE_SLIDESHARE_SLIDESHOWID") - || (TESTS_ZEND_SERVICE_SLIDESHARE_SLIDESHOWID <= 0) - ) { - $this->markTestSkipped( - "You must provide a Slideshow ID to retrieve to perform this test" - ); - } - - $ss = $this->_getSSObject(); - try { - $result = - $ss->getSlideShow(TESTS_ZEND_SERVICE_SLIDESHARE_SLIDESHOWID); - } catch (Exception $e) { - $this->fail("Exception Caught retrieving Slideshow"); - } - - $this->assertTrue($result instanceof Zend_Service_SlideShare_SlideShow); - } - - public function testGetSlideShowByTag() - { - - $ss = $this->_getSSObject(); - - try { - $results = $ss->getSlideShowsByTag('zend', 0, 1); - } catch (Exception $e) { - $this->fail("Exception Caught retrieving Slideshow List (tag)"); - } - - $this->assertTrue(is_array($results)); - $this->assertTrue(count($results) == 1); - $this->assertTrue( - $results[0] instanceof Zend_Service_SlideShare_SlideShow - ); - } - - public function testGetSlideShowByTags() - { - $ss = $this->_getSSObject(); - - try { - $results = $ss->getSlideShowsByTag( - array( - 'zend', - 'php' - ), 0, 1 - ); - } catch (Exception $e) { - $this->fail("Exception Caught retrieving Slideshow List (tag)"); - } - - $this->assertTrue(is_array($results)); - - if (!empty($results)) { - $this->assertTrue(count($results) == 1); - $this->assertTrue( - $results[0] instanceof Zend_Service_SlideShare_SlideShow - ); - } - } - - public function testGetSlideShowByUsername() - { - $ss = $this->_getSSObject(); - - try { - $results = $ss->getSlideShowsByUsername( - TESTS_ZEND_SERVICE_SLIDESHARE_USERNAME, 0, 1 - ); - } catch (Exception $e) { - $this->fail("Exception Caught retrieving Slideshow List (tag)"); - } - - $this->assertTrue(is_array($results)); - $this->assertTrue(count($results) == 1); - $this->assertTrue( - $results[0] instanceof Zend_Service_SlideShare_SlideShow - ); - } - - public function testUploadSlideShow() - { - $ss = $this->_getSSObject(); - - $title = "Unit Test for ZF SlideShare Component"; - $ppt_file = dirname(__FILE__) . "/SlideShare/_files/demo.ppt"; - - $show = new Zend_Service_SlideShare_SlideShow(); - $show->setFilename($ppt_file); - $show->setDescription("Unit Test"); - $show->setTitle($title); - $show->setTags(array('unittest')); - $show->setID(0); - - try { - $result = $ss->uploadSlideShow($show, false); - } catch (Exception $e) { - - if ($e->getCode() - == Zend_Service_SlideShare::SERVICE_ERROR_NOT_SOURCEOBJ - ) { - // We ignore this exception, the web service sometimes throws this - // error code because it seems to be buggy. Unfortunately it seems - // to be sparatic so we can't code around it and have to call this - // test a success - return; - } else { - $this->fail("Exception Caught uploading slideshow"); - } - } - - $this->assertTrue($result instanceof Zend_Service_SlideShare_SlideShow); - $this->assertTrue($result->getId() > 0); - $this->assertTrue($result->getTitle() === $title); - } - - public function testSlideShowObj() - { - $ss = new Zend_Service_SlideShare_SlideShow(); - - $ss->setDescription("Foo"); - $ss->setEmbedCode("Bar"); - $ss->setFilename("Baz"); - $ss->setId(123); - $ss->setLocation("Somewhere"); - $ss->setNumViews(4432); - $ss->setPermaLink("nowhere"); - $ss->setStatus(124); - $ss->setStatusDescription("Boo"); - $ss->setTags( - array( - 'bar', - 'baz' - ) - ); - $ss->addTag('fon'); - $ss->setThumbnailUrl('asdf'); - $ss->setTitle('title'); - $ss->setTranscript('none'); - - $this->assertEquals($ss->getDescription(), "Foo"); - $this->assertEquals($ss->getEmbedCode(), "Bar"); - $this->assertEquals($ss->getFilename(), "Baz"); - $this->assertEquals($ss->getId(), 123); - $this->assertEquals($ss->getLocation(), "Somewhere"); - $this->assertEquals($ss->getNumViews(), 4432); - $this->assertEquals($ss->getPermaLink(), "nowhere"); - $this->assertEquals($ss->getStatus(), 124); - $this->assertEquals($ss->getStatusDescription(), "Boo"); - $this->assertEquals( - $ss->getTags(), - array( - 'bar', - 'baz', - 'fon' - ) - ); - $this->assertEquals($ss->getThumbnailUrl(), "asdf"); - $this->assertEquals($ss->getTitle(), "title"); - $this->assertEquals($ss->getTranscript(), "none"); - } - - /** - * @group ZF-3247 - */ - public function testSlideShareObjectHandlesUnicodeCharactersWell() - { - $slideShow = new Zend_Service_SlideShare_SlideShow(); - $slideShow->setTitle('Unicode test: ஸà¯à®±à¯€à®©à®¿à®µà®¾à®¸ ராமானà¯à®œà®©à¯ à®à®¯à®™à¯à®•à®¾à®°à¯'); - - if (!extension_loaded('mbstring')) { - $this->markTestSkipped('Extension "mbstring" not loaded'); - } - $this->assertEquals( - 'UTF-8', mb_detect_encoding($slideShow->getTitle()) - ); - } -} diff --git a/tests/Zend/Service/SqlAzure/AllTests.php b/tests/Zend/Service/SqlAzure/AllTests.php deleted file mode 100644 index 67f8a7adee..0000000000 --- a/tests/Zend/Service/SqlAzure/AllTests.php +++ /dev/null @@ -1,63 +0,0 @@ -addTest(Zend_Service_SqlAzure_Management_AllTests::suite()); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_SqlAzure_AllTests::main') { - Zend_Service_SqlAzure_AllTests::main(); -} diff --git a/tests/Zend/Service/SqlAzure/Management/AllTests.php b/tests/Zend/Service/SqlAzure/Management/AllTests.php deleted file mode 100644 index 3e81c3f7e4..0000000000 --- a/tests/Zend/Service/SqlAzure/Management/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Service_SqlAzure_Management_ManagementClientTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_SqlAzure_Management_AllTests::main') { - Zend_Service_SqlAzure_Management_AllTests::main(); -} diff --git a/tests/Zend/Service/SqlAzure/Management/ManagementClientTest.php b/tests/Zend/Service/SqlAzure/Management/ManagementClientTest.php deleted file mode 100644 index 6713b40812..0000000000 --- a/tests/Zend/Service/SqlAzure/Management/ManagementClientTest.php +++ /dev/null @@ -1,137 +0,0 @@ -createManagementClient(); - - // Remove server - try { $managementClient->dropServer(self::$serverName); } catch (Exception $ex) { } - } - - protected function createManagementClient() - { - return new Zend_Service_SqlAzure_Management_Client( - TESTS_ZEND_SERVICE_WINDOWSAZURE_SQLMANAGEMENT_SUBSCRIPTIONID, self::$path . '/management.pem', TESTS_ZEND_SERVICE_WINDOWSAZURE_SQLMANAGEMENT_CERTIFICATEPASSWORD); - } - - protected function log($message) - { - if (self::$debug) { - echo date('Y-m-d H:i:s') . ' - ' . $message . "\r\n"; - } - } - - /** - * Test create and configure server - */ - public function testCreateAndConfigureServer() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SQLMANAGEMENT_RUNTESTS) { - // Create a management client - $managementClient = $this->createManagementClient(); - - // ** Step 1: create a server - $this->log('Creating server...'); - $server = $managementClient->createServer('sqladm', '@@cool1OO', 'West Europe'); - $this->assertEquals('sqladm', $server->AdministratorLogin); - $this->assertEquals('West Europe', $server->Location); - self::$serverName = $server->Name; - $this->log('Created server.'); - - // ** Step 2: change password - $this->log('Changing password...'); - $managementClient->setAdministratorPassword($server->Name, '@@cool1OO11'); - $this->log('Changed password...'); - - // ** Step 3: add firewall rule - $this->log('Creating firewall rule...'); - $managementClient->createFirewallRuleForMicrosoftServices($server->Name, true); - $result = $managementClient->listFirewallRules($server->Name); - $this->assertEquals(1, count($result)); - $this->log('Created firewall rule.'); - - // ** Step 4: remove firewall rule - $this->log('Removing firewall rule...'); - $managementClient->createFirewallRuleForMicrosoftServices($server->Name, false); - $result = $managementClient->listFirewallRules($server->Name); - $this->assertEquals(0, count($result)); - $this->log('Removed firewall rule.'); - - // ** Step 5: Drop server - $this->log('Dropping server...'); - $managementClient->dropServer($server->Name); - $this->log('Dropped server.'); - } - } -} - -// Call Zend_Service_SqlAzure_Management_ManagementClientTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_SqlAzure_Management_ManagementClientTest::main") { - Zend_Service_SqlAzure_Management_ManagementClientTest::main(); -} diff --git a/tests/Zend/Service/SqlAzure/Management/_files/management.cer b/tests/Zend/Service/SqlAzure/Management/_files/management.cer deleted file mode 100644 index 3301b989c9a67007c5eca366d3e66cdf2fbaedc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmV;l1WWrcf&{QIf&!SJ0|Eg80uV0`qmJI^_Nh!QI!@;dD&H^-1_>&LNQUY-n$DbTEPfA}|dG2`Yw2hW8Bt0RaU71A+n%05F0A z3Ic)x0RWTAd?W4Ozy5+)VvMOIK6O1#!c@C)TqMVlQ}`AoG%@O-KM$2J5pH~5A%hT!hcVjQ$Q0pLsD z@WaeFJ-A_)B8e) zOeEhWw*Cf+b!Ze<^yOqZHiS;d8G>!!;V5|>CNmzUAWGl*+NawHM}6jByp}-JvAVlI z@}|9RDUAf(G8b+CJH>xZV*v&mbNh5L%%lF|-Aqy1bZzUJ#Q%Rp!>Aj2dw{wb!UY_T zch_;Q!ueAl7oTjNXL?bpsyrR6>3TonD+Z?_X{Dv5?SGg!GnYbf7Y$w|JTRr zO-YtGkH3ma*mPa=U<#7gs`XO*hML_6DVUKGfYC_iRF>xfW8RL$SFv_`pQ*thgM@hZTIsWTUD z``m4c6f5HBM)HDHt*t_i8Rh&*K&r=@#~VDdqR?oqEl!-`Dje1ol29&tKPiV12o-y+t zaYpGZ)>dm-xaWmYYOG&K zkt+?${@fMN0uWqljbQYB1PL{#0%+8%<`qbtCk#Yb1@x z4NQ3!&|-q;;kWJrS;`#|q&Ykl+J~JxFg)J);QFceF{I1p7D#;4uxv$2dI{WY)JUj8 S?|CcCJCI-4?38fC-Q7m0Q7p{> diff --git a/tests/Zend/Service/SqlAzure/Management/_files/management.pem b/tests/Zend/Service/SqlAzure/Management/_files/management.pem deleted file mode 100644 index b44137ce26..0000000000 --- a/tests/Zend/Service/SqlAzure/Management/_files/management.pem +++ /dev/null @@ -1,89 +0,0 @@ -Bag Attributes - localKeyID: 01 00 00 00 - friendlyName: 5e456e5a-c311-4409-bd07-1adfa82301b5 - Microsoft CSP Name: Microsoft Enhanced Cryptographic Provider v1.0 -Key Attributes - X509v3 Key Usage: 10 ------BEGIN RSA PRIVATE KEY----- -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 ------END RSA PRIVATE KEY----- -Bag Attributes - localKeyID: 01 00 00 00 -subject=/CN=localhost -issuer=/CN=localhost ------BEGIN CERTIFICATE----- -MIIEsDCCApigAwIBAgIQLw+jjt7n9qlMLTpO5wwq3zANBgkqhkiG9w0BAQUFADAU -MRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMTEwMjIxMDgwMDAwWhcNNDkwMjI4MDgw -MDAwWjAUMRIwEAYDVQQDEwlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCTynwj7d+//oJYYoypJD51VSYG9MaWgX7RyyFma4WAWOKcAN67 -QLXa68eXSzvslXeA56vsnUzVXnP16WtFi/AL5VJFmx1V+Uy1RfB8qf7HNgQxN/iG -NYbg7s9iHLQ8AeBL3/DDzHIzHpa+lszuWY3ze0XeCeaMhPifqYR64aH9E9AVv4KK -OgQh69EpQekery9p9gJlzmO35EYgBkv4/kghyfa8gAi8blPsZDHQV2BairHZYsiM -axReJTzUu59ne6JrRmFTee+cYFwOIGViyYPhtFgV8QqSDEezI49UCEPxe+wJSK6A -9t5P/HcB/UjaXmMFRgjS/DbfJB2RZ4l9cwY1mK4JotdmsXTqNJwzwvnnUGKEo6m2 -hbCw7pbUkvXOMNPdgwxHd1I2/Zv5OxFRq5b7SsZlRuaqYV5vbfa/F8tBUK4Qc6Le -xEYsMk8mwlY9vbzqlya4a/2nnMmQslOm8y9lqWbT+0KHTCTfJbb+Bop1aBRX9OVk -OTaETsgZgm3f4Sh5HSYzHqYgSt/62qfbCEd95l+8lkDUsbq7P/KmvW4pjQTdMhdt -/zvFf01jAQYbc/t0Mcyj/uLdTFHadG3rmsT/f0TDqBt6e4C6GcIFHI5313GuwvlT -HxefbJ5nelGqqjwdrOl6P+IrBqchaaWlpe1/mDgzl0JxFw1eJeTcICF0aQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4ICAQBP7wUanld723a7Xe6qrjK64btrqveiKF4WNdm1 -fT7/MnhqedwClMEqZj9H6EuD60Jsv19yrwGHTG0dFeJe/ek+UPmW2CIs24YfO2BM -4ZXNmjjnr5dwjbyzo1I52gYMfNpbeGMyRZcixhL6gHsXU43FOq1BYRPgc4y1+dji -yLl/eVHqECcTTUmWOI+/ikrYdF30YAqS16r1UvyGmt0HKZiiyW7/ryOWo/G0ChHc -zn3JzKySpIyMZj47lhQljgFVjmhcvGf+stVmQ2P4ijfy6hgbrig/ZkHriFBDVM3f -t7RGuWXYt/Q78SrAiqkzF2773G2KFCvi6EbyglWtrUKOGeX8SUCqx5rHGzyyotBo -rS1OnOIqHNYVklAuez8ph1mVBMdaQDEzvgsu3R/6jQ7M45F4+RSmxFXhLHFgma1f -S738Dq3WOK1JlsJAY0HdaQ6Co0w6njHzHnFG6SzWRIRHQDoWJ9i2aXglhO8XEA+t -3IUwuC7WE43qUaegH1NvlgzsHgwwuOeFUWqsX0iRKw3L/twWAn5d90sMY8ZV2c2H -yQFpEGrqMnneo4hj32ow2Ez+VG4vG01munUj9LFrJI3IDUx5FtBigufht+4CWcod -EaQ5PBXah507MDze+OD6qfcxpMvmFkh807BsRUp6Cdxs1EioQu95K8w7kF/Y7JRw -xN3dRg== ------END CERTIFICATE----- diff --git a/tests/Zend/Service/SqlAzure/Management/_files/management.pfx b/tests/Zend/Service/SqlAzure/Management/_files/management.pfx deleted file mode 100644 index 29df5385a75e85c9976ce00a2945d91bbf846493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4146 zcmY*bXE+<+7EXxRvudR=tEeKeN9_>=wO3VZCsa{l6(v?|VyjhKDXrb2_O4M>%_>UO zu37u$-sg_zKHqcBdB694&-tG3-+^K2go%K}Ff8p3nEY;pX2c0KkQA7YrCkJJY3B&^ zHyD-z_kR+F9|%iY z5fSMa2up5m{5cGo$R{repqZND_r{r6wK z)X~fhZzyf3e;v#0W-apcOX{Ruj#VrBwe-m8@I@8B!yVQM5Wes)+0e3!Z;7CpYM z_^@0rbNit0>C5;}{nLdCI7C?rHlQvvu{d^?n1uJ^_^$s%FEq0^LGrbw>4Ly=OnUxBgZ5dv0RnqlZhS4~y$XGZ9>T1B-U)KGR(E&H{m;fK0 z#UL=!WysKhYPgZeREQhy=QVgTu00QTt;~caP^kqt&V`sxXI9yPkI+M4QegC&65K{{p-tzSc zej_2Kw32BBqvA_^>uU_xxe4ql%`q=yl!)Y^xcwtG5oZ* zPM9(vz?G?`;Le#;V{Y78+^&@$Z|O#pT{uFIb*zHgr{bNiy`Z{z!d>@L%W!g z6hadJaW>mBk{nMfji|<>Bt@!fDOE@%8rt{jWM8C(e>om*Nz zp3T;_Jqg@@J3Fnv@A;!GK<8|l55)@C3|BQf$Tpo&uIHxCcPVzS1f}&hpt+Db*zgY5 zAGNd>k`xcfBTG?|?NYT8PNK|G4H!GydjGmK2j#nwdq~H{VeL_8`wn5}jKX=&jhp0` z{bw0!AxG=y=GnRXI&pY0!-v0lM;-QE_s5f%Bw`EfKRHaNT`y*l64O~aM#d=3(p0I0 z7nFU6h`SG3!1LnFt#$1p2t}nnP<>m|BesTw2kW&62vA z)};%Qkvq{H&NMA{93*;WhO}S4U3pCJB%rT2LX~Z!P3YudLDIVUi=c^h#lFJ!lAsoYF6uQ5YFQ2?U(Vrz=a z`7Ekrz;OG`fhgxmYna^gp7(Uc%kM2=6|{*rLydmVdycJ>vP3T~_ho!TQb%^hd(Hi7 zgD{M0oKd$1=%?^ZvwsU9-lRYL#b@)CUH07m`D`1&Lp@}5Ufw9+J@=judDNB6LTXWO z$sTVga7Q7howtXk37sdDvr3n;~B)NmwN@d4$BIZJ?xv>j*Gg< z{*H&a?fagXg_$Z-sXXO_gP1Q?}oL}KwvG)&$s@@I% z2xe-?(~8$wr+4c~&fLZXIlnK-pyaf0wX3tgeu3YfzrFzu0MuZ=;aad%%a4ttxfMy{ zfP6j_X^@3!^*nK90oeJV-8HPZDjHr@%d#7+Ew}jN>B~V2N-M_zeJ3GzqxCH*jN~(S zI|{=~ootFX!w5Z=Pu2px#h%A(WN0@DvZMnQYR0~UKrzxA{G~G?qq3Q!rv8Y&M=nKw zk5cxBWFd+qWQIVUwUQ#;m{Q4C<#nJ2xtl)JJy(;C$8sObeDl?&8eVp?*bvS9#y)pZ zJpFi~zD#OC_f>3xk(PP##dSV>i7ptmpFje+Y#_e=NIP0eW3%hn&!d8N zHmTH%U$d+Gnd0@+$U=|~SdE@NT%YGbJ-*jvqEX}?g8XnM zHMJ>U!7$X!P^f6>+ZAvi8$;F*$G|M46y-vm)dnx0mLV?32L_5qixJy?BJqCjEKaO!b9d@H~zb>k>7-aK_DOi0DzhOk7R^vvugq*01g0gLY5>{34jei2w(>g z1HcJKh`@^jU;r5cvIW=^kQ4#I2_AcZBOyxzL09UG4bQ%4h2EW5QfCd+}~#Ip^%6 zPnQfoHXzF7B4dE-zR>_(i2K8{<)BaoO9`(=Mq5g=CoE0YU%~|W!hOg$U*(Nfe~kaw zKiS6)BP+}ir|CEbIsA6ed#={VtazByS@1ehi>xj-XsHjg(G^|>=ay3$y?bQ%nJ$!LtYv~QBJw)Bv_jvny67>UwMI{IrC~ikoHIw^@`_}bC@V| zrUgUQi$m)@Mjg4?D<>K(mU19e9-?nR^-3LjjE0YzDr|Yj8LE?m^k`Qs9u|6dy#0)6 zQx4Oj$>JLgpz>Dwcv*>ce0+qi91Vt2AaGm|T(5ogazASQY?uuxvE?T{x0C>Rjr>|& zlt9Xpiy6G>T>@D0fggJ$4V!H9zl=X@ICP8kD&|y$3dYecDYzS~AC4Ve%6tU{ozVK} z`6;!I&J)=tk5^v}IyKIjZWQO+#b%2__ctVqREHASUntJ~b@XB34YdFvljwO&Z$5h? ziFnc1otR`iQ#FtGtovqjA{?mrkr<3Hn@z@UmP>aU#U-2`kQwonzESA2PeiK) z&=mdr9kE|jzXU&MB%rbV90CV!Nt){FaIEfLr6%;dCT3j5D=u);;DW3yPkI`d+Gt$| z(&2g-U;T~!mVRMQ@}_mMXX9AeCro|I`CRuaD`cKNk~zJgTHUZIYfgr+O%9@^9{6_v zRUjr2qGrOGazxcy<=TZ4cia@E=pV>u4lpTRL$vOjOv*?s{JH!Y(Z_suVYPEX^@l@S zko;RIIf;9zGYA;Ikc$-`^`$RCmT}h2C+R5zvzZ$w%`rkH5N|_q78VyKT@blA%>RXh zghiI#j-qBxOb44<$-gW{Sxk!PV6&YCB#QVpnMHR^&J@54g* zU&qDObdQ?Qr@l41oY@~t6SM$3o2Ux(YLnr%y5-%wj=G2!n#9YPjb4?L-qVF0v@kM# zu!97RcL*2dilR6~IApYa*C-Lx?+gNW(vm(<3uv*8bokKrmE1Vq6s8N8s?BYwK7ZMv zD54pf{6T*>s-g&Mb$XwB`EQK3;AZn9US3L)k*%b0eO4u83^DYNMqAqI)h(Y6lOeW2 zZ=1JVX1SCs#hGY>q(+0xq<##Oeek=->J%&d2BO~U2l-LZEH-3RnaTFP6hDwg+8A3pW+a47SrF2b4g-pc1YU6CGMi+ zt8{xQrLzTNmP1yT>>b_hD~_N~lNqGF#sMP*lL*of z6S099PkF^zn%XeuHR8mu9won8l|$y+Ajaz@IA(*sLJ~SzCh)!Sy7B%e=*&L=+P#oD diff --git a/tests/Zend/Service/StrikeIron/AllTests.php b/tests/Zend/Service/StrikeIron/AllTests.php deleted file mode 100644 index f4d8b40c8d..0000000000 --- a/tests/Zend/Service/StrikeIron/AllTests.php +++ /dev/null @@ -1,76 +0,0 @@ -addTestSuite('Zend_Service_StrikeIron_NoSoapTest'); - - if (!extension_loaded('soap')) { - return $suite; - } - - $suite->addTestSuite('Zend_Service_StrikeIron_StrikeIronTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_DecoratorTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_ExceptionTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_BaseTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_SalesUseTaxBasicTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_USAddressVerificationTest'); - $suite->addTestSuite('Zend_Service_StrikeIron_ZipCodeInfoTest'); - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_StrikeIron_AllTests::main') { - Zend_Service_StrikeIron_AllTests::main(); -} diff --git a/tests/Zend/Service/StrikeIron/BaseTest.php b/tests/Zend/Service/StrikeIron/BaseTest.php deleted file mode 100644 index a93277a22c..0000000000 --- a/tests/Zend/Service/StrikeIron/BaseTest.php +++ /dev/null @@ -1,297 +0,0 @@ -soapClient = new Zend_Service_StrikeIron_BaseTest_MockSoapClient; - $this->base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'username' => 'user', - 'password' => 'pass')); - } - - public function testHasNoPredefinedWsdl() - { - $this->assertSame(null, $this->base->getWsdl()); - } - - public function testSettingWsdl() - { - $wsdl = 'http://example.com/foo'; - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'wsdl' => $wsdl)); - $this->assertEquals($wsdl, $base->getWsdl()); - } - - public function testSoapClientDependencyInjection() - { - $this->assertSame($this->soapClient, $this->base->getSoapClient()); - } - - public function testSoapClientInitializesDefaultSOAPClient() - { - // set soapclient options to non-wsdl mode just to get a - // soapclient instance without hitting the network - $base = new Zend_Service_StrikeIron_Base(array('options' => array('location' => '', - 'uri' => ''))); - $this->assertTrue($base->getSoapClient() instanceof SOAPClient); - } - - public function testDefaultSoapHeadersHasTheLicenseInfoHeader() - { - $this->base->foo(); - $headers = $this->soapClient->calls[0]['headers']; - - $this->assertTrue(is_array($headers)); - $this->assertEquals(1, count($headers)); - $header = $headers[0]; - - $this->assertTrue($header instanceof SoapHeader); - $this->assertEquals('LicenseInfo', $header->name); - $this->assertEquals('user', $header->data['RegisteredUser']['UserID']); - $this->assertEquals('pass', $header->data['RegisteredUser']['Password']); - } - - public function testAddingInvalidSoapHeaderThrows() - { - $invalidHeaders = 'foo'; - try { - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'headers' => $invalidHeaders)); - $this->fail(); - } catch (Zend_Service_StrikeIron_Exception $e) { - $this->assertRegExp('/instance of soapheader/i', $e->getMessage()); - } - } - - public function testAddingInvalidSoapHeaderArrayThrows() - { - $invalidHeaders = array('foo'); - try { - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'headers' => $invalidHeaders)); - $this->fail(); - } catch (Zend_Service_StrikeIron_Exception $e) { - $this->assertRegExp('/instance of soapheader/i', $e->getMessage()); - } - } - - public function testAddingScalarSoapHeaderNotLicenseInfo() - { - $header = new SoapHeader('foo', 'bar'); - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'headers' => $header)); - $base->foo(); - - $headers = $this->soapClient->calls[0]['headers']; - $this->assertEquals(2, count($headers)); - $this->assertEquals($header->name, $headers[0]->name); - $this->assertEquals('LicenseInfo', $headers[1]->name); - } - - public function testAddingScalarSoapHeaderThatOverridesLicenseInfo() - { - $soapHeaders = new SoapHeader('http://ws.strikeiron.com', - 'LicenseInfo', - array('RegisteredUser' => array('UserID' => 'foo', - 'Password' => 'bar'))); - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'headers' => $soapHeaders)); - $base->foo(); - - $headers = $this->soapClient->calls[0]['headers']; - - $this->assertTrue(is_array($headers)); - $this->assertEquals(1, count($headers)); - $header = $headers[0]; - - $this->assertTrue($header instanceof SoapHeader); - $this->assertEquals('LicenseInfo', $header->name); - $this->assertEquals('foo', $header->data['RegisteredUser']['UserID']); - $this->assertEquals('bar', $header->data['RegisteredUser']['Password']); - } - - public function testAddingArrayOfSoapHeaders() - { - $headers = array(new SoapHeader('foo', 'bar'), - new SoapHeader('baz', 'qux')); - - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'headers' => $headers)); - $base->foo(); - - $headers = $this->soapClient->calls[0]['headers']; - - $this->assertTrue(is_array($headers)); - $this->assertEquals(3, count($headers)); // these 2 + default LicenseInfo - } - - public function testMethodInflection() - { - $this->base->foo(); - $this->assertEquals('Foo', $this->soapClient->calls[0]['method']); - } - - public function testMethodResultNotWrappingNonObject() - { - $this->assertEquals(42, $this->base->returnThe42()); - } - - public function testMethodResultWrappingAnyObject() - { - $this->assertTrue( - $this->base->returnTheObject() instanceof Zend_Service_StrikeIron_Decorator - ); - } - - public function testMethodResultWrappingAnObjectAndSelectingDefaultResultProperty() - { - $this->assertEquals('unwraped', $this->base->wrapThis()); - } - - public function testMethodExceptionsAreWrapped() - { - try { - $this->base->throwTheException(); - $this->fail(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Service_StrikeIron_Exception); - $this->assertEquals('Exception: foo', $e->getMessage()); - $this->assertEquals(43, $e->getCode()); - } - } - - public function testGettingOutputHeaders() - { - $this->assertSame(array(), $this->base->getLastOutputHeaders()); - $info = $this->base->foo(); - $this->assertEquals(Zend_Service_StrikeIron_BaseTest_MockSoapClient::$outputHeaders, - $this->base->getLastOutputHeaders()); - } - - public function testGettingSubscriptionInfo() - { - $this->assertEquals(0, count($this->soapClient->calls)); - $info = $this->base->getSubscriptionInfo(); - $this->assertEquals(1, count($this->soapClient->calls)); - $this->assertEquals(3, $info->remainingHits); - } - - public function testGettingSubscriptionInfoWithCaching() - { - $this->assertEquals(0, count($this->soapClient->calls)); - $this->base->foo(); - $this->base->getSubscriptionInfo(); - $this->assertEquals(1, count($this->soapClient->calls)); - } - - public function testGettingSubscriptionOverridingCache() - { - $this->assertEquals(0, count($this->soapClient->calls)); - $this->base->getSubscriptionInfo(); - $this->assertEquals(1, count($this->soapClient->calls)); - $this->base->getSubscriptionInfo(true); - $this->assertEquals(2, count($this->soapClient->calls)); - } - - public function testGettingSubscriptionInfoWithDefaultQueryMethod() - { - $this->base->getSubscriptionInfo(); - $this->assertEquals('GetRemainingHits', $this->soapClient->calls[0]['method']); - } - - public function testGettingSubscriptionInfoWithCustomQueryMethod() - { - $method = 'SendSubscriptionInfoHeaderPlease'; - $this->base->getSubscriptionInfo(true, $method); - $this->assertEquals($method, $this->soapClient->calls[0]['method']); - } - - public function testGettingSubscriptionInfoThrowsWhenHeaderNotFound() - { - try { - $this->base->getSubscriptionInfo(true, 'ReturnNoOutputHeaders'); - $this->fail(); - } catch (Zend_Service_StrikeIron_Exception $e) { - $this->assertRegExp('/no subscriptioninfo header/i', $e->getMessage()); - } - } -} - -/** - * @category Zend - * @package Zend_Service_StrikeIron - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_StrikeIron_BaseTest_MockSoapClient -{ - public static $outputHeaders = array('SubscriptionInfo' => array('RemainingHits' => 3)); - - public $calls = array(); - - public function __soapCall($method, $params, $options, $headers, &$outputHeaders) - { - $outputHeaders = self::$outputHeaders; - - $this->calls[] = array('method' => $method, - 'params' => $params, - 'options' => $options, - 'headers' => $headers); - - if ($method == 'ReturnTheObject') { - // testMethodResultWrappingAnyObject - return new stdclass(); - - } else if ($method == 'WrapThis') { - // testMethodResultWrappingAnObjectAndSelectingDefaultResultProperty - return (object)array('WrapThisResult' => 'unwraped'); - - } else if ($method == 'ThrowTheException') { - // testMethodExceptionsAreWrapped - throw new Exception('foo', 43); - - } else if ($method == 'ReturnNoOutputHeaders') { - // testGettingSubscriptionInfoThrowsWhenHeaderNotFound - $outputHeaders = array(); - - } else { - return 42; - } - } -} diff --git a/tests/Zend/Service/StrikeIron/DecoratorTest.php b/tests/Zend/Service/StrikeIron/DecoratorTest.php deleted file mode 100644 index 339f6827c0..0000000000 --- a/tests/Zend/Service/StrikeIron/DecoratorTest.php +++ /dev/null @@ -1,107 +0,0 @@ -assertSame(null, $decorator->foo); - } - - public function testDecoratorReturnsNullWhenPropertyIsMissing() - { - $object = new stdclass(); - $decorator = new Zend_Service_StrikeIron_Decorator($object); - $this->assertSame(null, $decorator->foo); - } - - public function testDecoratorReturnsPropertyByItsName() - { - $object = (object)array('Foo' => 'bar', - 'Baz' => 'qux'); - $decorator = new Zend_Service_StrikeIron_Decorator($object); - $this->assertEquals('qux', $decorator->Baz); - } - - public function testDecoratorReturnsPropertyByInflectedName() - { - $object = (object)array('Foo' => 'bar', - 'Baz' => 'qux'); - $decorator = new Zend_Service_StrikeIron_Decorator($object); - $this->assertEquals('qux', $decorator->baz); - } - - public function testDecoratorTriesActualPropertyNameBeforeInflecting() - { - $object = (object)array('foo' => 'bar', - 'Foo' => 'qux'); - $decorator = new Zend_Service_StrikeIron_Decorator($object); - $this->assertEquals('bar', $decorator->foo); - } - - public function testDecoratorReturnsAnotherDecoratorWhenValueIsAnObject() - { - $object = (object)array('Foo' => new stdclass); - $decorator = new Zend_Service_StrikeIron_Decorator($object); - $class = get_class($decorator); - $this->assertTrue($decorator->Foo instanceof $class); - } - - public function testDecoratorProxiesMethodCalls() - { - $decorator = new Zend_Service_StrikeIron_Decorator($this); - $this->assertEquals('bar', $decorator->foo()); - } - - public function foo() - { - return 'bar'; - } - - public function testGettingTheDecoratedObject() - { - $decorator = new Zend_Service_StrikeIron_Decorator($this); - $this->assertSame($this, $decorator->getDecoratedObject()); - } - - public function testGettingDecoratedObjectName() - { - $decorator = new Zend_Service_StrikeIron_Decorator($this, 'foo'); - $this->assertSame('foo', $decorator->getDecoratedObjectName()); - } -} diff --git a/tests/Zend/Service/StrikeIron/ExceptionTest.php b/tests/Zend/Service/StrikeIron/ExceptionTest.php deleted file mode 100644 index 58727970b1..0000000000 --- a/tests/Zend/Service/StrikeIron/ExceptionTest.php +++ /dev/null @@ -1,45 +0,0 @@ -assertTrue($exception instanceof Zend_Exception); - } -} diff --git a/tests/Zend/Service/StrikeIron/NoSoapTest.php b/tests/Zend/Service/StrikeIron/NoSoapTest.php deleted file mode 100644 index f5e46aa09d..0000000000 --- a/tests/Zend/Service/StrikeIron/NoSoapTest.php +++ /dev/null @@ -1,64 +0,0 @@ -soapClient = new Zend_Service_StrikeIron_BaseTest_MockSoapClient; - if (extension_loaded('soap')) { - $this->markTestSkipped('SOAP extension is loaded, so cannot test for exception'); - } - } - - public function testNoSoapException() - { - try { - $base = new Zend_Service_StrikeIron_Base(array('client' => $this->soapClient, - 'username' => 'user', - 'password' => 'pass')); - $this->fail('Expecting exception of type Zend_Service_StrikeIron_Exception'); - } catch (Zend_Exception $e) { - $this->assertTrue($e instanceof Zend_Service_StrikeIron_Exception, - 'Expecting exception of type Zend_Service_StrikeIron_Exception, got '.get_class($e)); - $this->assertEquals('SOAP extension is not enabled', $e->getMessage()); - } - } - -} diff --git a/tests/Zend/Service/StrikeIron/SalesUseTaxBasicTest.php b/tests/Zend/Service/StrikeIron/SalesUseTaxBasicTest.php deleted file mode 100644 index a45cc099ec..0000000000 --- a/tests/Zend/Service/StrikeIron/SalesUseTaxBasicTest.php +++ /dev/null @@ -1,69 +0,0 @@ -soapClient = new stdclass(); - $this->service = new Zend_Service_StrikeIron_SalesUseTaxBasic(array('client' => $this->soapClient)); - } - - public function testInheritsFromBase() - { - $this->assertTrue($this->service instanceof Zend_Service_StrikeIron_Base); - } - - public function testWsdl() - { - $wsdl = 'http://ws.strikeiron.com/zf1.StrikeIron/taxdatabasic4?WSDL'; - $this->assertEquals($wsdl, $this->service->getWsdl()); - } - - public function testInstantiationFromFactory() - { - $strikeIron = new Zend_Service_StrikeIron(array('client' => $this->soapClient)); - $client = $strikeIron->getService(array('class' => 'SalesUseTaxBasic')); - - $this->assertTrue($client instanceof Zend_Service_StrikeIron_SalesUseTaxBasic); - } -} diff --git a/tests/Zend/Service/StrikeIron/StrikeIronTest.php b/tests/Zend/Service/StrikeIron/StrikeIronTest.php deleted file mode 100644 index 7cfccdf891..0000000000 --- a/tests/Zend/Service/StrikeIron/StrikeIronTest.php +++ /dev/null @@ -1,116 +0,0 @@ -soapClient = new stdclass(); - $this->options = array('client' => $this->soapClient); - $this->strikeIron = new Zend_Service_StrikeIron($this->options); - } - - public function testFactoryThrowsOnBadName() - { - try { - $this->strikeIron->getService(array('class' => 'BadServiceNameHere')); - $this->fail(); - } catch (Zend_Service_StrikeIron_Exception $e) { - $this->assertRegExp('/could not be loaded/i', $e->getMessage()); - $this->assertRegExp('/not found/i', $e->getMessage()); - } - } - - public function testFactoryReturnsServiceByStrikeIronClass() - { - $base = $this->strikeIron->getService(array('class' => 'Base')); - $this->assertTrue($base instanceof Zend_Service_StrikeIron_Base); - $this->assertSame(null, $base->getWsdl()); - $this->assertSame($this->soapClient, $base->getSoapClient()); - } - - public function testFactoryReturnsServiceAnyUnderscoredClass() - { - $class = 'Zend_Service_StrikeIron_StrikeIronTest_StubbedBase'; - $stub = $this->strikeIron->getService(array('class' => $class)); - $this->assertTrue($stub instanceof $class); - } - - public function testFactoryReturnsServiceByWsdl() - { - $wsdl = 'http://strikeiron.com/foo'; - $base = $this->strikeIron->getService(array('wsdl' => $wsdl)); - $this->assertEquals($wsdl, $base->getWsdl()); - } - - public function testFactoryPassesOptionsFromConstructor() - { - $class = 'Zend_Service_StrikeIron_StrikeIronTest_StubbedBase'; - $stub = $this->strikeIron->getService(array('class' => $class)); - $this->assertEquals($this->options, $stub->options); - } - - public function testFactoryMergesItsOptionsWithConstructorOptions() - { - $options = array('class' => 'Zend_Service_StrikeIron_StrikeIronTest_StubbedBase', - 'foo' => 'bar'); - - $mergedOptions = array_merge($options, $this->options); - unset($mergedOptions['class']); - - $stub = $this->strikeIron->getService($options); - $this->assertEquals($mergedOptions, $stub->options); - } - -} - -/** - * Stub for Zend_Service_StrikeIron_Base - * - * @category Zend - * @package Zend_Service_StrikeIron - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Service_StrikeIron_StrikeIronTest_StubbedBase -{ - public function __construct($options) - { - $this->options = $options; - } -} diff --git a/tests/Zend/Service/StrikeIron/USAddressVerificationTest.php b/tests/Zend/Service/StrikeIron/USAddressVerificationTest.php deleted file mode 100644 index 8da835f434..0000000000 --- a/tests/Zend/Service/StrikeIron/USAddressVerificationTest.php +++ /dev/null @@ -1,69 +0,0 @@ -soapClient = new stdclass(); - $this->service = new Zend_Service_StrikeIron_USAddressVerification(array('client' => $this->soapClient)); - } - - public function testInheritsFromBase() - { - $this->assertTrue($this->service instanceof Zend_Service_StrikeIron_Base); - } - - public function testHasCorrectWsdl() - { - $wsdl = 'http://ws.strikeiron.com/zf1.StrikeIron/USAddressVerification4_0?WSDL'; - $this->assertEquals($wsdl, $this->service->getWsdl()); - } - - public function testInstantiationFromFactory() - { - $strikeIron = new Zend_Service_StrikeIron(array('client' => $this->soapClient)); - $client = $strikeIron->getService(array('class' => 'USAddressVerification')); - - $this->assertTrue($client instanceof Zend_Service_StrikeIron_USAddressVerification); - } -} diff --git a/tests/Zend/Service/StrikeIron/ZipCodeInfoTest.php b/tests/Zend/Service/StrikeIron/ZipCodeInfoTest.php deleted file mode 100644 index f51386bfe9..0000000000 --- a/tests/Zend/Service/StrikeIron/ZipCodeInfoTest.php +++ /dev/null @@ -1,70 +0,0 @@ -soapClient = new stdclass(); - $this->service = new Zend_Service_StrikeIron_ZipCodeInfo(array('client' => $this->soapClient)); - } - - public function testInheritsFromBase() - { - $this->assertTrue($this->service instanceof Zend_Service_StrikeIron_Base); - } - - public function testHasCorrectWsdl() - { - $wsdl = 'http://sdpws.strikeiron.com/zf1.StrikeIron/sdpZIPCodeInfo?WSDL'; - $this->assertEquals($wsdl, $this->service->getWsdl()); - } - - public function testInstantiationFromFactory() - { - $strikeIron = new Zend_Service_StrikeIron(array('client' => $this->soapClient)); - $client = $strikeIron->getService(array('class' => 'ZipCodeInfo')); - - $this->assertTrue($client instanceof Zend_Service_StrikeIron_ZipCodeInfo); - } - -} diff --git a/tests/Zend/Service/Twitter/AllTests.php b/tests/Zend/Service/Twitter/AllTests.php deleted file mode 100644 index 0ff3ca0eb4..0000000000 --- a/tests/Zend/Service/Twitter/AllTests.php +++ /dev/null @@ -1,68 +0,0 @@ -addTestSuite('Zend_Service_Twitter_TwitterTest'); - - return $suite; - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Twitter_AllTests::main') { - Zend_Service_Twitter_AllTests::main(); -} diff --git a/tests/Zend/Service/Twitter/TwitterTest.php b/tests/Zend/Service/Twitter/TwitterTest.php deleted file mode 100644 index 579dde1af0..0000000000 --- a/tests/Zend/Service/Twitter/TwitterTest.php +++ /dev/null @@ -1,579 +0,0 @@ -getMock('Zend_Oauth_Client', array(), array(), '', false); - $client->expects($this->any())->method('resetParameters') - ->will($this->returnValue($client)); - $client->expects($this->once())->method('setUri') - ->with('https://api.twitter.com/1.1/' . $path); - $response = $this->getMock('Zend_Http_Response', array(), array(), '', false); - if (!is_null($params)) { - $setter = 'setParameter' . ucfirst(strtolower($method)); - $client->expects($this->once())->method($setter)->with($params); - } - $client->expects($this->once())->method('request')->with() - ->will($this->returnValue($response)); - $response->expects($this->any())->method('getBody') - ->will($this->returnValue( - isset($responseFile) ? file_get_contents(dirname(__FILE__) . '/_files/' . $responseFile) : '' - )); - return $client; - } - - /** - * OAuth tests - */ - - public function testProvidingAccessTokenInOptionsSetsHttpClientFromAccessToken() - { - $token = $this->getMock('Zend_Oauth_Token_Access', array(), array(), '', false); - $client = $this->getMock('Zend_Oauth_Client', array(), array(), '', false); - $token->expects($this->once())->method('getHttpClient') - ->with(array('token'=>$token, 'siteUrl'=>'https://api.twitter.com/oauth')) - ->will($this->returnValue($client)); - - $twitter = new Zend_Service_Twitter(array('accessToken'=>$token, 'opt1'=>'val1')); - $this->assertTrue($client === $twitter->getHttpClient()); - } - - public function testNotAuthorisedWithoutToken() - { - $twitter = new Zend_Service_Twitter; - $this->assertFalse($twitter->isAuthorised()); - } - - public function testChecksAuthenticatedStateBasedOnAvailabilityOfAccessTokenBasedClient() - { - $token = $this->getMock('Zend_Oauth_Token_Access', array(), array(), '', false); - $client = $this->getMock('Zend_Oauth_Client', array(), array(), '', false); - $token->expects($this->once())->method('getHttpClient') - ->with(array('token'=>$token, 'siteUrl'=>'https://api.twitter.com/oauth')) - ->will($this->returnValue($client)); - - $twitter = new Zend_Service_Twitter(array('accessToken'=>$token)); - $this->assertTrue($twitter->isAuthorised()); - } - - public function testRelaysMethodsToInternalOAuthInstance() - { - $oauth = $this->getMock('Zend_Oauth_Consumer', array(), array(), '', false); - $oauth->expects($this->once())->method('getRequestToken')->will($this->returnValue('foo')); - $oauth->expects($this->once())->method('getRedirectUrl')->will($this->returnValue('foo')); - $oauth->expects($this->once())->method('redirect')->will($this->returnValue('foo')); - $oauth->expects($this->once())->method('getAccessToken')->will($this->returnValue('foo')); - $oauth->expects($this->once())->method('getToken')->will($this->returnValue('foo')); - - $twitter = new Zend_Service_Twitter(array('opt1'=>'val1'), $oauth); - $this->assertEquals('foo', $twitter->getRequestToken()); - $this->assertEquals('foo', $twitter->getRedirectUrl()); - $this->assertEquals('foo', $twitter->redirect()); - $this->assertEquals('foo', $twitter->getAccessToken(array(), $this->getMock('Zend_Oauth_Token_Request'))); - $this->assertEquals('foo', $twitter->getToken()); - } - - public function testResetsHttpClientOnReceiptOfAccessTokenToOauthClient() - { - $this->markTestIncomplete('Problem with resolving classes for mocking'); - $oauth = $this->getMock('Zend_Oauth_Consumer', array(), array(), '', false); - $client = $this->getMock('Zend_Oauth_Client', array(), array(), '', false); - $token = $this->getMock('Zend_Oauth_Token_Access', array(), array(), '', false); - $token->expects($this->once())->method('getHttpClient')->will($this->returnValue($client)); - $oauth->expects($this->once())->method('getAccessToken')->will($this->returnValue($token)); - $client->expects($this->once())->method('setHeaders')->with('Accept-Charset', 'ISO-8859-1,utf-8'); - - $twitter = new Zend_Service_Twitter(array(), $oauth); - $twitter->getAccessToken(array(), $this->getMock('Zend_Oauth_Token_Request')); - $this->assertTrue($client === $twitter->getHttpClient()); - } - - public function testAuthorisationFailureWithUsernameAndNoAccessToken() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter(array('username'=>'me')); - $twitter->statusesPublicTimeline(); - } - - /** - * @group ZF-8218 - */ - public function testUserNameNotRequired() - { - $twitter = new Zend_Service_Twitter(); - $twitter->setHttpClient($this->stubTwitter( - 'users/show.json', Zend_Http_Client::GET, 'users.show.mwop.json', - array('screen_name' => 'mwop') - )); - $response = $twitter->users->show('mwop'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - $exists = $response->id !== null; - $this->assertTrue($exists); - } - - /** - * @group ZF-7781 - */ - public function testRetrievingStatusesWithValidScreenNameThrowsNoInvalidScreenNameException() - { - $twitter = new Zend_Service_Twitter(); - $twitter->setHttpClient($this->stubTwitter( - 'statuses/user_timeline.json', Zend_Http_Client::GET, 'statuses.user_timeline.mwop.json' - )); - $twitter->statuses->userTimeline(array('screen_name' => 'mwop')); - } - - /** - * @group ZF-7781 - */ - public function testRetrievingStatusesWithInvalidScreenNameCharacterThrowsInvalidScreenNameException() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter(); - $twitter->statuses->userTimeline(array('screen_name' => 'abc.def')); - } - - /** - * @group ZF-7781 - */ - public function testRetrievingStatusesWithInvalidScreenNameLengthThrowsInvalidScreenNameException() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter(); - $twitter->statuses->userTimeline(array('screen_name' => 'abcdef_abc123_abc123x')); - } - - /** - * @group ZF-7781 - */ - public function testStatusUserTimelineConstructsExpectedGetUriAndOmitsInvalidParams() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/user_timeline.json', Zend_Http_Client::GET, 'statuses.user_timeline.mwop.json', array( - 'count' => '123', - 'user_id' => 783214, - 'since_id' => '10000', - 'max_id' => '20000', - 'screen_name' => 'twitter' - ) - )); - $twitter->statuses->userTimeline(array( - 'id' => '783214', - 'since' => '+2 days', /* invalid param since Apr 2009 */ - 'page' => '1', - 'count' => '123', - 'user_id' => '783214', - 'since_id' => '10000', - 'max_id' => '20000', - 'screen_name' => 'twitter' - )); - } - - public function testOverloadingGetShouldReturnObjectInstanceWithValidMethodType() - { - $twitter = new Zend_Service_Twitter; - $return = $twitter->statuses; - $this->assertSame($twitter, $return); - } - - public function testOverloadingGetShouldthrowExceptionWithInvalidMethodType() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter; - $return = $twitter->foo; - } - - public function testOverloadingGetShouldthrowExceptionWithInvalidFunction() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter; - $return = $twitter->foo(); - } - - public function testMethodProxyingDoesNotThrowExceptionsWithValidMethods() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/sample.json', Zend_Http_Client::GET, 'statuses.sample.json' - )); - $twitter->statuses->sample(); - } - - public function testMethodProxyingThrowExceptionsWithInvalidMethods() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter; - $twitter->statuses->foo(); - } - - public function testVerifiedCredentials() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'account/verify_credentials.json', Zend_Http_Client::GET, 'account.verify_credentials.json' - )); - $response = $twitter->account->verifyCredentials(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testSampleTimelineStatusReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/sample.json', Zend_Http_Client::GET, 'statuses.sample.json' - )); - $response = $twitter->statuses->sample(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testRateLimitStatusReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'application/rate_limit_status.json', Zend_Http_Client::GET, 'application.rate_limit_status.json' - )); - $response = $twitter->application->rateLimitStatus(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testRateLimitStatusHasHitsLeft() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'application/rate_limit_status.json', Zend_Http_Client::GET, 'application.rate_limit_status.json' - )); - $response = $twitter->application->rateLimitStatus(); - $status = $response->toValue(); - $this->assertEquals(180, $status->resources->statuses->{'/statuses/user_timeline'}->remaining); - } - - /** - * TODO: Check actual purpose. New friend returns XML response, existing - * friend returns a 403 code. - */ - public function testFriendshipCreate() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'friendships/create.json', Zend_Http_Client::POST, 'friendships.create.twitter.json', - array('screen_name' => 'twitter') - )); - $response = $twitter->friendships->create('twitter'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testHomeTimelineWithCountReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/home_timeline.json', Zend_Http_Client::GET, 'statuses.home_timeline.page.json', - array('count' => 3) - )); - $response = $twitter->statuses->homeTimeline(array('count' => 3)); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - /** - * TODO: Add verification for ALL optional parameters - */ - public function testUserTimelineReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/user_timeline.json', Zend_Http_Client::GET, 'statuses.user_timeline.mwop.json', - array('screen_name' => 'mwop') - )); - $response = $twitter->statuses->userTimeline(array('screen_name' => 'mwop')); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - /** - * TODO: Add verification for ALL optional parameters - */ - public function testPostStatusUpdateReturnsResponse() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/update.json', Zend_Http_Client::POST, 'statuses.update.json', - array('status'=>'Test Message 1') - )); - $response = $twitter->statuses->update('Test Message 1'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testPostStatusUpdateToLongShouldThrowException() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter; - $twitter->statuses->update('Test Message - ' . str_repeat(' Hello ', 140)); - } - - public function testPostStatusUpdateEmptyShouldThrowException() - { - $this->setExpectedException('Zend_Service_Twitter_Exception'); - $twitter = new Zend_Service_Twitter; - $twitter->statuses->update(''); - } - - public function testShowStatusReturnsResponse() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/show/307529814640840705.json', Zend_Http_Client::GET, 'statuses.show.json' - )); - $response = $twitter->statuses->show('307529814640840705'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testCreateFavoriteStatusReturnsResponse() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'favorites/create.json', Zend_Http_Client::POST, 'favorites.create.json', - array('id' => 15042159587) - )); - $response = $twitter->favorites->create(15042159587); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testFavoritesListReturnsResponse() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'favorites/list.json', Zend_Http_Client::GET, 'favorites.list.json' - )); - $response = $twitter->favorites->list(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testDestroyFavoriteReturnsResponse() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'favorites/destroy.json', Zend_Http_Client::POST, 'favorites.destroy.json', - array('id' => 15042159587) - )); - $response = $twitter->favorites->destroy(15042159587); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testStatusDestroyReturnsResult() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/destroy/15042159587.json', Zend_Http_Client::POST, 'statuses.destroy.json' - )); - $response = $twitter->statuses->destroy(15042159587); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testStatusHomeTimelineWithNoOptionsReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/home_timeline.json', Zend_Http_Client::GET, 'statuses.home_timeline.page.json' - )); - $response = $twitter->statuses->homeTimeline(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testUserShowByIdReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'users/show.json', Zend_Http_Client::GET, 'users.show.mwop.json', - array('screen_name' => 'mwop') - )); - $response = $twitter->users->show('mwop'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - /** - * TODO: Add verification for ALL optional parameters - * @todo rename to "mentions_timeline" - */ - public function testStatusMentionsReturnsResults() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'statuses/mentions_timeline.json', Zend_Http_Client::GET, 'statuses.mentions_timeline.json' - )); - $response = $twitter->statuses->mentionsTimeline(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - /** - * TODO: Add verification for ALL optional parameters - */ - public function testFriendshipDestroy() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'friendships/destroy.json', Zend_Http_Client::POST, 'friendships.destroy.twitter.json', - array('screen_name' => 'twitter') - )); - $response = $twitter->friendships->destroy('twitter'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testBlockingCreate() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'blocks/create.json', Zend_Http_Client::POST, 'blocks.create.twitter.json', - array('screen_name' => 'twitter') - )); - $response = $twitter->blocks->create('twitter'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testBlockingList() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'blocks/list.json', Zend_Http_Client::GET, 'blocks.list.json', - array('cursor' => -1) - )); - $response = $twitter->blocks->list(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testBlockingIds() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'blocks/ids.json', Zend_Http_Client::GET, 'blocks.ids.json', - array('cursor' => -1) - )); - $response = $twitter->blocks->ids(); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - $this->assertContains('23836616', $response->ids); - } - - public function testBlockingDestroy() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'blocks/destroy.json', Zend_Http_Client::POST, 'blocks.destroy.twitter.json', - array('screen_name' => 'twitter') - )); - $response = $twitter->blocks->destroy('twitter'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - /** - * @group ZF-6284 - */ - public function testTwitterObjectsSoNotShareSameHttpClientToPreventConflictingAuthentication() - { - $twitter1 = new Zend_Service_Twitter(array('username'=>'zftestuser1')); - $twitter2 = new Zend_Service_Twitter(array('username'=>'zftestuser2')); - $this->assertFalse($twitter1->getHttpClient() === $twitter2->getHttpClient()); - } - - public function testSearchTweets() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'search/tweets.json', Zend_Http_Client::GET, 'search.tweets.json', - array('q' => '#zf2') - )); - $response = $twitter->search->tweets('#zf2'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } - - public function testUsersSearch() - { - $twitter = new Zend_Service_Twitter; - $twitter->setHttpClient($this->stubTwitter( - 'users/search.json', Zend_Http_Client::GET, 'users.search.json', - array('q' => 'Zend') - )); - $response = $twitter->users->search('Zend'); - $this->assertTrue($response instanceof Zend_Service_Twitter_Response); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_TwitterTest::main') { - Zend_Service_TwitterTest::main(); -} diff --git a/tests/Zend/Service/Twitter/_files/account.verify_credentials.json b/tests/Zend/Service/Twitter/_files/account.verify_credentials.json deleted file mode 100644 index ee65ae38a6..0000000000 --- a/tests/Zend/Service/Twitter/_files/account.verify_credentials.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "contributors_enabled": false, - "created_at": "Mon Sep 24 19:35:22 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "PHP Developer, Open Source Contributor, and FS Audit Consultant", - "favourites_count": 20, - "follow_request_sent": null, - "followers_count": 847, - "following": false, - "friends_count": 468, - "geo_enabled": false, - "id": 9075802, - "id_str": "9075802", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Dublin, Ireland, Europe!", - "name": "Pádraic Brady", - "notifications": null, - "profile_background_color": "022330", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "a8c7f7", - "profile_sidebar_fill_color": "C0DFEC", - "profile_text_color": "333333", - "profile_use_backgroudn_image": true, - "protected": false, - "screen_name": "padraicb", - "show_all_inline_media": true, - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Sat May 29 18:05:59 +0000 2010", - "favorited": false, - "geo": null, - "id": 14990035001, - "id_str": "14990035001", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": "", - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": "", - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Seesmic", - "text": "Dennis Hopper is no longer with us? :( RIP.", - "truncated": false - }, - "statuses_count": 5927, - "time_zone": "Dublin", - "url": "http://blog.astrumfutura.com", - "utc_offset": 0, - "verified": false -} diff --git a/tests/Zend/Service/Twitter/_files/application.rate_limit_status.json b/tests/Zend/Service/Twitter/_files/application.rate_limit_status.json deleted file mode 100644 index dbd535568d..0000000000 --- a/tests/Zend/Service/Twitter/_files/application.rate_limit_status.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "rate_limit_context": { - "access_token": "119476949-oYGCs2M5duG5QalbOAK2YUZh8zG3ur7DPYo5qIFN" - }, - "resources": { - "help": { - "/help/privacy": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/help/configuration": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/help/tos": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/help/languages": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - } - }, - "statuses": { - "/statuses/oembed": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - }, - "/statuses/user_timeline": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - }, - "/statuses/mentions_timeline": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/statuses/home_timeline": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/statuses/show/:id": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - }, - "/statuses/retweets/:id": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - } - }, - "users": { - "/users/show": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - }, - "/users/search": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - }, - "/users/suggestions": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/users/contributors": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/users/suggestions/:slug/members": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/users/suggestions/:slug": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/users/contributees": { - "remaining": 15, - "reset": 1346439527, - "limit": 15 - }, - "/users/lookup": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - } - }, - "search": { - "/search/tweets": { - "remaining": 180, - "reset": 1346439527, - "limit": 180 - } - } - } -} diff --git a/tests/Zend/Service/Twitter/_files/blocks.create.twitter.json b/tests/Zend/Service/Twitter/_files/blocks.create.twitter.json deleted file mode 100644 index f0f199b471..0000000000 --- a/tests/Zend/Service/Twitter/_files/blocks.create.twitter.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "contributors_enabled": true, - "created_at": "Tue Feb 20 14:35:54 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Always wondering what's happening. ", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 2, - "followers_count": 3229496, - "following": false, - "follow_request_sent": false, - "friends_count": 247, - "geo_enabled": false, - "id": 783214, - "id_str": "783214", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco, CA", - "name": "Twitter", - "notifications": false, - "profile_background_color": "ACDED6", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_link_color": "038543", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "F6F6F6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "twitter", - "show_all_inline_media": true, - "statuses_count": 745, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://twitter.com", - "utc_offset": -28800, - "verified": true -} diff --git a/tests/Zend/Service/Twitter/_files/blocks.destroy.twitter.json b/tests/Zend/Service/Twitter/_files/blocks.destroy.twitter.json deleted file mode 100644 index c4b52e25dd..0000000000 --- a/tests/Zend/Service/Twitter/_files/blocks.destroy.twitter.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "contributors_enabled": true, - "created_at": "Tue Feb 20 14:35:54 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Always wondering what's happening. ", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 2, - "followers_count": 3229503, - "following": null, - "follow_request_sent": false, - "friends_count": 247, - "geo_enabled": false, - "id": 783214, - "id_str": "783214", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco, CA", - "name": "Twitter", - "notifications": null, - "profile_background_color": "ACDED6", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_link_color": "038543", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "F6F6F6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "twitter", - "show_all_inline_media": true, - "statuses_count": 745, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://twitter.com", - "utc_offset": -28800, - "verified": true -} diff --git a/tests/Zend/Service/Twitter/_files/blocks.ids.json b/tests/Zend/Service/Twitter/_files/blocks.ids.json deleted file mode 100644 index b7f1214c27..0000000000 --- a/tests/Zend/Service/Twitter/_files/blocks.ids.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "previous_cursor": 0, - "ids": [ - "23836616", - "95515577", - "16136505", - "82974000", - "40165170", - "56703639" - ], - "previous_cursor_str": "0", - "next_cursor": 0, - "next_cursor_str": "0" -} diff --git a/tests/Zend/Service/Twitter/_files/blocks.list.json b/tests/Zend/Service/Twitter/_files/blocks.list.json deleted file mode 100644 index 741ab5bd67..0000000000 --- a/tests/Zend/Service/Twitter/_files/blocks.list.json +++ /dev/null @@ -1,908 +0,0 @@ -{ - "users": [ - { - "contributors_enabled": true, - "created_at": "Tue Feb 20 14:35:54 +0000 2007", - "default_profile": true, - "default_profile_image": true, - "description": "Always wondering what's happening. ", - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 2, - "followers_count": 3230113, - "following": null, - "follow_request_sent": false, - "friends_count": 247, - "geo_enabled": false, - "id": 783214, - "id_str": "783214", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco, CA", - "name": "Twitter", - "notifications": false, - "profile_background_color": "ACDED6", - "profile_background_image_url": "http:\/\/a1.twimg.com\/a\/1274899949\/images\/themes\/theme18\/bg.gif", - "profile_background_image_url_https": "https:\/\/si1.twimg.com\/a\/1274899949\/images\/themes\/theme18\/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/878669694\/twitter_bird_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/878669694\/twitter_bird_normal.jpg", - "profile_link_color": "038543", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "F6F6F6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "twitter", - "status": { - "contributors": [ - { - "id": 16739704, - "id_str": "16739704", - "screen_name": "jennadawn" - } - ], - "coordinates": null, - "created_at": "Fri May 28 21:14:05 +0000 2010", - "entities": { - "hashtags": [ - ], - "urls": [ - { - "url": "http://bit.ly/b1Cf9A", - "indices": [ - 33, - 52 - ] - } - ], - "user_mentions": [ - ] - }, - "favorited": false, - "geo": null, - "id": 14932507266, - "id_str": "14932507266", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Good news for people everywhere http://bit.ly/b1Cf9A", - "truncated": false - }, - "statuses_count": 745, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://twitter.com", - "utc_offset": -28800, - "verified": true - }, - { - "contributors_enabled": false, - "created_at": "Thu Sep 04 22:37:58 +0000 2008", - "default_profile": true, - "default_profile_image": true, - "description": "where we pick cash from the money tree of internet marketing...metaphorically speaking of course,", - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 28, - "following": null, - "follow_request_sent": false, - "friends_count": 4, - "geo_enabled": false, - "id": 16136505, - "id_str": "16136505", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "East Side", - "name": "Nate Harding", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/default_profile_0_normal.png", - "profile_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/default_profile_0_normal.png", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "nateharding", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Sat Feb 20 09:25:54 +0000 2010", - "favorited": false, - "geo": null, - "id": 9377514336, - "id_str": "9377514336", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Wuttup Twitter World? Hey, @robertplank how'd the webinar go? I couldn't make it. Is there a recording I can check out?", - "truncated": false - }, - "statuses_count": 460, - "time_zone": "Eastern Time (US & Canada)", - "url": null, - "utc_offset": -18000, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Wed Mar 11 21:46:11 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 211, - "following": false, - "follow_request_sent": false, - "friends_count": 332, - "geo_enabled": false, - "id": 23836616, - "id_str": "23836616", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Bray, Co Wicklow, Ireland", - "name": "Ian McGahon", - "notifications": false, - "profile_background_color": "C6E2EE", - "profile_background_image_url": "http:\/\/a3.twimg.com\/profile_background_images\/5566801\/n52950876433_9929.jpg", - "profile_background_image_url_https": "https:\/\/si3.twimg.com\/profile_background_images\/5566801\/n52950876433_9929.jpg", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/623139340\/ian_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/623139340\/ian_normal.jpg", - "profile_link_color": "1F98C7", - "profile_sidebar_border_color": "C6E2EE", - "profile_sidebar_fill_color": "DAECF4", - "profile_text_color": "663B12", - "profile_use_background_image": true, - "protected": false, - "screen_name": "ianmcgahon", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Sun May 30 14:30:18 +0000 2010", - "entities": { - "hashtags": [ - ], - "urls": [ - ], - "user_mentions": [ - { - "id": 14395202, - "id_str": "14395202", - "name": "Christine Bohan", - "indices": [ - 0, - 14 - ], - "screen_name": "ChristineBohan" - } - ] - }, - "favorited": false, - "geo": null, - "id": 15044593156, - "id_str": "15044593156", - "in_reply_to_screen_name": "ChristineBohan", - "in_reply_to_status_id": 14999351526, - "in_reply_to_status_id_str": "14999351526", - "in_reply_to_user_id": 14395202, - "in_reply_to_user_id_str": "14395202", - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "@ChristineBohan ;-) - A Libertarian in FF! - The increasing amount of libertarians astounds me, perhaps I'm just reading too much boards.ie", - "truncated": false - }, - "statuses_count": 561, - "time_zone": "Dublin", - "url": null, - "utc_offset": 0, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Fri May 15 03:25:00 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 10, - "following": false, - "follow_request_sent": false, - "friends_count": 2, - "geo_enabled": false, - "id": 40165170, - "id_str": "40165170", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "Richard Lee", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/default_profile_3_normal.png", - "profile_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/default_profile_3_normal.png", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "RichardLee4", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Thu Oct 15 23:34:39 +0000 2009", - "entities": { - "hashtags": [ - ], - "urls": [ - ], - "user_mentions": [ - ] - }, - "favorited": false, - "geo": null, - "id": 4901594956, - "id_str": "4901594956", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "source": "\u003Ca href=\"\/devices\" rel=\"nofollow\"\u003Etxt\u003C\/a\u003E", - "text": "Road_and_Track: SNOUJMESNOUMESNOUME", - "truncated": false - }, - "statuses_count": 277, - "time_zone": null, - "url": null, - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Sun Jul 12 22:39:28 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": "I love to Swallow", - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 56212353, - "id_str": "56212353", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "Wicked Girl", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a3.twimg.com\/profile_images\/310487971\/member5_normal.jpg", - "profile_image_url_https": "https:\/\/si3.twimg.com\/profile_images\/310487971\/member5_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "KelliKanyon5", - "status": null, - "statuses_count": 2381, - "time_zone": null, - "url": "http://www.Kellikanyon.net", - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Tue Jul 14 14:13:36 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 858, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 56703639, - "id_str": "56703639", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "s r", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274144130\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274144130\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a0.twimg.com\/a\/1274144130\/images\/default_profile_6_normal.png", - "profile_image_url_https": "https:\/\/si0.twimg.com\/a\/1274144130\/images\/default_profile_6_normal.png", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "smrn9290", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Thu Apr 29 22:31:28 +0000 2010", - "entities": { - "hashtags": [ - ], - "urls": [ - { - "url": "http://tinyurl.com/22v3rhe", - "indices": [ - 83, - 108 - ] - } - ], - "user_mentions": [ - ] - }, - "favorited": false, - "geo": null, - "id": 13093509801, - "id_str": "13093509801", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "\u003Ca href=\"http:\/\/www.ping.fm\/\" rel=\"nofollow\"\u003EPing.fm\u003C\/a\u003E", - "text": "Society - WoW Gold Wizard World Of Warcraft Complete Auction House Farming Guide. http://tinyurl.com/22v3rhe", - "truncated": false - }, - "statuses_count": 76801, - "time_zone": null, - "url": null, - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Thu Aug 06 17:50:22 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": "I'm a lawyer. I love women and good food, and I love Ney York's bars.", - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 63492591, - "id_str": "63492591", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "New York", - "name": "Billy Jacobs", - "notifications": false, - "profile_background_color": 352726, - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme5\/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/351857976\/dork1_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/351857976\/dork1_normal.jpg", - "profile_link_color": "D02B55", - "profile_sidebar_border_color": "829D5E", - "profile_sidebar_fill_color": "99CC33", - "profile_text_color": "3E4415", - "profile_use_background_image": true, - "protected": false, - "screen_name": "billy_ja", - "status": null, - "statuses_count": 5680, - "time_zone": "Eastern Time (US & Canada)", - "url": null, - "utc_offset": -18000, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Fri Oct 16 21:09:46 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 9, - "following": false, - "follow_request_sent": false, - "friends_count": 39, - "geo_enabled": false, - "id": 82974000, - "id_str": "82974000", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "gWave Hottie", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/475062666\/sexy_pink_lips_real_large_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/475062666\/sexy_pink_lips_real_large_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "gWaveHottie", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Mon May 03 17:08:38 +0000 2010", - "entities": { - "hashtags": [ - { - "text": "Apple", - "indices": [ - 134, - 139 - ] - }, - { - "text": "iPhone", - "indices": [ - 141, - 147 - ] - } - ], - "urls": [ - { - "url": "http://bit.ly/9aq1Su", - "indices": [ - 112, - 131 - ] - } - ], - "user_mentions": [ - { - "id": 1985381, - "id_str": "1985381", - "name": "dealsplus", - "indices": [ - 3, - 12 - ], - "screen_name": "dealsplus" - } - ] - }, - "favorited": false, - "geo": null, - "id": 13315799357, - "id_str": "13315799357", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": true, - "retweeted_status": { - "contributors": null, - "coordinates": null, - "created_at": "Mon May 03 14:23:18 +0000 2010", - "entities": { - "hashtags": [ - { - "text": "Apple", - "indices": [ - 119, - 124 - ] - }, - { - "text": "iPhone", - "indices": [ - 126, - 132 - ] - } - ], - "urls": [ - { - "url": "http://bit.ly/9aq1Su", - "indices": [ - 97, - 116 - ] - } - ], - "user_mentions": [ - { - "id": 1985381, - "id_str": "1985381", - "name": "dealsplus", - "indices": [ - 57, - 66 - ], - "screen_name": "dealsplus" - } - ] - }, - "favorited": false, - "geo": null, - "id": 13307896708, - "id_str": "13307896708", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 1, - "retweeted": false, - "source": "web", - "text": "Win an Apple iPhone today! Just retweet this and follow @dealsplus to be entered. Details here: http://bit.ly/9aq1Su #Apple #iPhone", - "truncated": false - }, - "source": "\u003Ca href=\"http:\/\/apiwiki.twitter.com\/\" rel=\"nofollow\"\u003EAPI\u003C\/a\u003E", - "text": "RT @dealsplus: Win an Apple iPhone today! Just retweet this and follow @dealsplus to be entered. Details here: http://bit.ly/9aq1Su #Ap ...", - "truncated": true - }, - "statuses_count": 188, - "time_zone": null, - "url": null, - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Thu Nov 12 15:37:58 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": "EVERYTHING IS ARBITRARY", - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 89470889, - "id_str": "89470889", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "ARBITRARY", - "notifications": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http:\/\/a3.twimg.com\/profile_background_images\/53416759\/IMG_0988.jpg", - "profile_background_image_url_https": "https:\/\/si3.twimg.com\/profile_background_images\/53416759\/IMG_0988.jpg", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a3.twimg.com\/profile_images\/523546277\/IMG_0972_c_normal.jpg", - "profile_image_url_https": "https:\/\/si3.twimg.com\/profile_images\/523546277\/IMG_0972_c_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "the_arbitrator", - "status": null, - "statuses_count": 24065, - "time_zone": "Central Time (US & Canada)", - "url": "http://everythingisarbitrary.com", - "utc_offset": -21600, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Fri Nov 13 20:08:25 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 89781386, - "id_str": "89781386", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "CockSuckBritney", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a3.twimg.com\/profile_images\/525201671\/pic_normal.jpg", - "profile_image_url_https": "https:\/\/si3.twimg.com\/profile_images\/525201671\/pic_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "mkrxwnhuovet", - "status": null, - "statuses_count": 130, - "time_zone": null, - "url": null, - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Fri Nov 27 00:57:21 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 92871705, - "id_str": "92871705", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "metric60923", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/545691202\/pic_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/545691202\/pic_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "metric60923", - "status": null, - "statuses_count": 913, - "time_zone": "Alaska", - "url": "http://cli.gs/NhRYM", - "utc_offset": -32400, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Fri Dec 04 12:22:10 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 0, - "following": false, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 94547675, - "id_str": "94547675", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": null, - "name": "rendition96892", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme1\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/default_profile_5_normal.png", - "profile_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/default_profile_5_normal.png", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "rendition96892", - "status": null, - "statuses_count": 128, - "time_zone": null, - "url": null, - "utc_offset": null, - "verified": false - }, - { - "contributors_enabled": false, - "created_at": "Tue Dec 08 22:19:53 +0000 2009", - "default_profile": true, - "default_profile_image": true, - "description": null, - "entities": { - "description": { - "urls": [ - ] - } - }, - "favourites_count": 0, - "followers_count": 2003, - "following": false, - "follow_request_sent": false, - "friends_count": 2198, - "geo_enabled": false, - "id": 95515577, - "id_str": "95515577", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "LO, Cali", - "name": "Bob", - "notifications": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http:\/\/a1.twimg.com\/profile_background_images\/62814552\/twitter_background.jpg", - "profile_background_image_url_https": "https:\/\/si1.twimg.com\/profile_background_images\/62814552\/twitter_background.jpg", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/565428644\/coins2_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/565428644\/coins2_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "coinsclub777", - "status": { - "contributors": null, - "coordinates": null, - "created_at": "Fri May 28 22:07:21 +0000 2010", - "entities": { - "hashtags": [ - ], - "urls": [ - { - "url": "http://ht.ly/1RoSf", - "indices": [ - 30, - 47 - ] - } - ], - "user_mentions": [ - ] - }, - "favorited": false, - "geo": null, - "id": 14935035855, - "id_str": "14935035855", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "\u003Ca href=\"http:\/\/www.hootsuite.com\" rel=\"nofollow\"\u003EHootSuite\u003C\/a\u003E", - "text": "Youtube - Miracle of Science http://ht.ly/1RoSf", - "truncated": false - }, - "statuses_count": 555, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://www.numisone.com/theconnector", - "utc_offset": -28800, - "verified": false - } - ] -} diff --git a/tests/Zend/Service/Twitter/_files/favorites.create.json b/tests/Zend/Service/Twitter/_files/favorites.create.json deleted file mode 100644 index e11c303891..0000000000 --- a/tests/Zend/Service/Twitter/_files/favorites.create.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "contributors": null, - "coordinates": null, - "created_at": "Sun May 30 13:48:40 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 15042159587, - "id_str": "15042159587", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "Test Message 1", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Sep 24 19:35:22 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "PHP Developer, Open Source Contributor, and FS Audit Consultant", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 21, - "followers_count": 848, - "following": false, - "follow_request_sent": false, - "friends_count": 469, - "geo_enabled": false, - "id": 9075802, - "id_str": "9075802", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Dublin, Ireland, Europe!", - "name": "Pádraic Brady", - "notifications": false, - "profile_background_color": "022330", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme15\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme15\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "a8c7f7", - "profile_sidebar_fill_color": "C0DFEC", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "padraicb", - "show_all_inline_media": true, - "statuses_count": 5929, - "time_zone": "Dublin", - "url": "http://blog.astrumfutura.com", - "utc_offset": 0, - "verified": false - } -} diff --git a/tests/Zend/Service/Twitter/_files/favorites.destroy.json b/tests/Zend/Service/Twitter/_files/favorites.destroy.json deleted file mode 100644 index 77faf48fd5..0000000000 --- a/tests/Zend/Service/Twitter/_files/favorites.destroy.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "contributors": null, - "coordinates": null, - "created_at": "Sun May 30 13:48:40 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": false, - "geo": null, - "id": 15042159587, - "id_str": "15042159587", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "Test Message 1", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Sep 24 19:35:22 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "PHP Developer, Open Source Contributor, and FS Audit Consultant", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 21, - "followers_count": 848, - "following": false, - "follow_request_sent": false, - "friends_count": 469, - "geo_enabled": false, - "id": 9075802, - "id_str": "9075802", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Dublin, Ireland, Europe!", - "name": "Pádraic Brady", - "notifications": false, - "profile_background_color": "022330", - "profile_background_image_url": "http:\/\/a0.twimg.com\/a\/1274899949\/images\/themes\/theme15\/bg.png", - "profile_background_image_url_https": "https:\/\/si0.twimg.com\/a\/1274899949\/images\/themes\/theme15\/bg.png", - "profile_background_tile": false, - "profile_image_url": "http:\/\/a1.twimg.com\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "profile_image_url_https": "https:\/\/si1.twimg.com\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "a8c7f7", - "profile_sidebar_fill_color": "C0DFEC", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "padraicb", - "show_all_inline_media": true, - "statuses_count": 5929, - "time_zone": "Dublin", - "url": "http://blog.astrumfutura.com", - "utc_offset": 0, - "verified": false - } -} diff --git a/tests/Zend/Service/Twitter/_files/favorites.list.json b/tests/Zend/Service/Twitter/_files/favorites.list.json deleted file mode 100644 index 242057ce47..0000000000 --- a/tests/Zend/Service/Twitter/_files/favorites.list.json +++ /dev/null @@ -1,1192 +0,0 @@ -[ - { - "contributors": null, - "coordinates": null, - "created_at": "Sun May 30 13:48:40 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 15042159587, - "id_str": "15042159587", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "Test Message 1", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Sep 24 19:35:22 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "PHP Developer, Open Source Contributor, and FS Audit Consultant", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 21, - "followers_count": 848, - "following": false, - "follow_request_sent": false, - "friends_count": 469, - "geo_enabled": false, - "id": 9075802, - "id_str": "9075802", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Dublin, Ireland, Europe!", - "name": "Pádraic Brady", - "notifications": false, - "profile_background_color": "022330", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "a8c7f7", - "profile_sidebar_fill_color": "C0DFEC", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "padraicb", - "show_all_inline_media": true, - "statuses_count": 5929, - "time_zone": "Dublin", - "url": "http://blog.astrumfutura.com", - "utc_offset": 0, - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Thu Mar 25 06:27:15 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 11021735076, - "id_str": "11021735076", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Echofon", - "text": "A flight of nine stouts and then another of six strong ales, tonight. #Beer juding complete. #BJCP", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Sat Mar 29 03:52:29 +0000 2008", - "default_profile": false, - "default_profile_image": false, - "description": "Web, Beer.", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 25, - "followers_count": 918, - "following": true, - "follow_request_sent": false, - "friends_count": 225, - "geo_enabled": true, - "id": 14249124, - "id_st": "14249124", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Montreal", - "name": "Sean Coates", - "notifications": false, - "profile_background_color": "7BCDCD", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/2696809/whalecopter.png", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/2696809/whalecopter.png", - "profile_background_tile": true, - "profile_image_url": "http://a1.twimg.com/profile_images/641929118/me_icon_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/641929118/me_icon_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "009999", - "profile_sidebar_fill_color": "FFFFFF", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "coates", - "show_all_inline_media": true, - "statuses_count": 5630, - "time_zone": "Eastern Time (US & Canada)", - "url": "http://seancoates.com", - "utc_offset": "-18000", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Tue Feb 09 16:42:06 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 8861422763, - "id_str": "8861422763", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "What personality is that blog?... http://typealyzer.com/", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Tue Jan 27 03:40:24 +0000 2009", - "default_profile": false, - "default_profile_image": false, - "description": "Tweeting the hottest from Hacker News (YC)", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 0, - "followers_count": 3035, - "following": true, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 19575586, - "id_str": "19575586", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Internetz", - "name": "Hacker News Bot", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/73596050/yc500_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/73596050/yc500_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "hackernewsbot", - "show_all_inline_media": true, - "statuses_count": 10943, - "time_zone": "Central Time (US & Canada)", - "url": "http://news.ycombinator.com", - "utc_offset": "-21600", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Sun Jan 31 04:24:18 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 8439151704, - "id_str": "8439151704", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Twitter for iPhone", - "text": "People who demand that Flash be replaced by H.264 for video playing in the name of openness are hilarious.", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Wed Apr 23 12:03:22 +0000 2008", - "default_profile": false, - "default_profile_image": false, - "description": "Galactic Garbage Collector and Chief Janitor at @phparch (http://phparch.com) and @blueparabola (http://blueparabola.com).", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 95, - "followers_count": 1383, - "following": true, - "follow_request_sent": false, - "friends_count": 373, - "geo_enabled": true, - "id": 14492118, - "id_str": "14492118", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Toronto, Canada", - "name": "Marco Tabini", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/727751399/c7d3a27cd4f2f0fa792bcd8916a87fbc_normal.png", - "profile_image_url_https": "https://si3.twimg.com/profile_images/727751399/c7d3a27cd4f2f0fa792bcd8916a87fbc_normal.png", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "mtabini", - "show_all_inline_media": true, - "statuses_count": 6713, - "time_zone": "Eastern Time (US & Canada)", - "url": "http://blog.tabini.ca", - "utc_offset": "-18000", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Thu Jan 28 00:55:37 +0000 2010", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 8302314489, - "id_str": "8302314489", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "HootSuite", - "text": "10 Feed Publishing Best Practices http://ow.ly/16rbQJ", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Fri May 29 21:46:48 +0000 2009", - "default_profile": false, - "default_profile_image": false, - "description": "Real-time feed parsing in the cloud for web-developers", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 11, - "followers_count": 1734, - "following": true, - "follow_request_sent": false, - "friends_count": 1694, - "geo_enabled": false, - "id": 43417156, - "id_str": "43417156", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco", - "name": "superfeedr", - "notifications": false, - "profile_background_color": "1A1B1F", - "profile_background_image_url": "http://a0.twimg.com/a/1274130900/images/themes/theme9/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274130900/images/themes/theme9/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/330719094/g12951_normal.png", - "profile_image_url_https": "https://si1.twimg.com/profile_images/330719094/g12951_normal.png", - "profile_link_color": "2FC2EF", - "profile_sidebar_border_color": "181A1E", - "profile_sidebar_fill_color": "252429", - "profile_text_color": "666666", - "profile_use_background_image": true, - "protected": false, - "screen_name": "superfeedr", - "show_all_inline_media": true, - "statuses_count": 3308, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://superfeedr.com", - "utc_offset": "-28800", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Fri Dec 18 20:23:33 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 6807246064, - "id_str": 6807246064, - "in_reply_to_screen_name": "timbray", - "in_reply_to_status_id": 6806688768, - "in_reply_to_status_id_str": "6806688768", - "in_reply_to_user_id": 1235521, - "in_reply_to_user_id_str": "1235521", - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Echofon", - "text": "RT: @timbray: Here's yer geek holiday reading: http://www.tbray.org/ongoing/When/200x/2009/12/17/Tab-Sweep-Tech", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Thu Jan 04 17:13:11 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "http://dehora.net/journal/about", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 46, - "followers_count": 1054, - "following": true, - "follow_request_sent": false, - "friends_count": 509, - "geo_enabled": false, - "id": 546313, - "id_str": "546313", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "iPhone: 53.272644,-6.244568", - "name": "Bill de hOra", - "notifications": false, - "profile_background_color": "ffffff", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/59194327/twilk_background.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/59194327/twilk_background.jpg", - "profile_background_tile": true, - "profile_image_url": "http://a3.twimg.com/profile_images/247287093/P1020452_normal.JPG", - "profile_image_url_https": "https://si3.twimg.com/profile_images/247287093/P1020452_normal.JPG", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "4b4b4b", - "profile_sidebar_fill_color": "ffffff", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "dehora", - "show_all_inline_media": true, - "statuses_count": 2151, - "time_zone": "Dublin", - "url": "http://dehora.net/journal", - "utc_offset": 0, - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Fri Dec 18 15:23:36 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 6798914244, - "id_str": "6798914244", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "identica", - "text": "Overview of OpenMicroBlogging standard (OMB) 0.9 will be ActivityStreams / Atom based with PubSubHubbub+Salmon /via @evan #statusmtl", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Thu Jan 18 00:10:45 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "CTO and Co-founder of Praized Media. Internet, opensource, media & geo geek. Je Tweet en FR @sylvaincarle aussi. Tweets are CC-BY-SA http://bit.ly/ccbysa3", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 525, - "followers_count": 2085, - "following": false, - "follow_request_sent": false, - "friends_count": 1717, - "geo_enabled": true, - "id": 657693, - "id_str": "657693", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Montreal", - "name": "Sylvain Carle", - "notifications": false, - "profile_background_color": "000000", - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/2416056/praized-tribe-twitter.png", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/2416056/praized-tribe-twitter.png", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/346376501/sylvaincarle-wordcamp-shadow_normal.png", - "profile_image_url_https": "https://si3.twimg.com/profile_images/346376501/sylvaincarle-wordcamp-shadow_normal.png", - "profile_link_color": "196900", - "profile_sidebar_border_color": "8F8F8F", - "profile_sidebar_fill_color": "FFFFFF", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "afrognthevalley", - "show_all_inline_media": true, - "statuses_count": 5675, - "time_zone": "Eastern Time (US & Canada)", - "url": "http://afroginthevalley.com/", - "utc_offset": "-18000", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Sun Dec 13 01:29:58 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 6615439448, - "id_str": 6615439448, - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Just cleared up some longstanding tickets in the Drupal HTML Purifier queue. My apologies to all of you who had to wait.", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Wed May 28 05:22:04 +0000 2008", - "default_profile": false, - "default_profile_image": false, - "description": "MIT student who plays oboe and spends an inordinate amount of time fiddling with software", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 0, - "followers_count": 168, - "following": true, - "friends_count": 87, - "follow_request_sent": false, - "geo_enabled": false, - "id": 14930686, - "id_str": "14930686", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Cambridge, MA", - "name": "Edward Z. Yang", - "notifications": false, - "profile_background_color": "4A6282", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/2580349/logo-large.png", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/2580349/logo-large.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/54757734/gravatar_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/54757734/gravatar_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "7084AA", - "profile_sidebar_fill_color": "B1C0DF", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "ezyang", - "show_all_inline_media": true, - "statuses_count": 260, - "time_zone": "Eastern Time (US & Canada)", - "url": "http://ezyang.com", - "utc_offset": "-18000", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Fri Dec 04 23:42:04 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 6353225351, - "id_str": "6353225351", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "Rails 3 : Vaporware To Awesome... http://www.slideshare.net/wycats/vaporware-to-awesome", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Tue Jan 27 03:40:24 +0000 2009", - "default_profile": false, - "default_profile_image": false, - "description": "Tweeting the hottest from Hacker News (YC)", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 0, - "followers_count": 3035, - "following": true, - "follow_request_sent": false, - "friends_count": 0, - "geo_enabled": false, - "id": 19575586, - "id_str": "19575586", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Internetz", - "name": "Hacker News Bot", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/73596050/yc500_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/73596050/yc500_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "hackernewsbot", - "show_all_inline_media": true, - "statuses_count": 10943, - "time_zone": "Central Time (US & Canada)", - "url": "http://news.ycombinator.com", - "utc_offset": "-21600", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Wed Nov 11 01:02:50 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 5605372257, - "id_str": "5605372257", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "TweetDeck", - "text": "#PHP standards group have published final proposal http://bit.ly/2wI4DE. I've been following their talks and it ended exactly as I wanted :)", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Tue Apr 21 14:57:11 +0000 2009", - "default_profile": false, - "default_profile_image": false, - "description": "Random ideas, scripts and facts", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 0, - "followers_count": 551, - "following": true, - "follow_request_sent": false, - "friends_count": 248, - "geo_enabled": false, - "id": 33927626, - "id_str": "33927626", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Edinburgh, UK", - "name": "Juozas Kaziukenas", - "notifications": false, - "profile_background_color": "EBEBEB", - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/9419692/march-09-clinging_to_colour-nocal-1920x1200.jpg", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/9419692/march-09-clinging_to_colour-nocal-1920x1200.jpg", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/293691113/profile_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/293691113/profile_normal.jpg", - "profile_link_color": "990000", - "profile_sidebar_border_color": "DFDFDF", - "profile_sidebar_fill_color": "F3F3F3", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "juokaz", - "show_all_inline_media": true, - "statuses_count": 2598, - "time_zone": "Edinburgh", - "url": "http://www.juokaz.com", - "utc_offset": 0, - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Tue Nov 10 11:53:48 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 5586709670, - "id_str": "5586709670", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Nice blog post by @davegardnerisme about setting up continuous integration using Hudson http://is.gd/4RyN3 #hudson #ci (via @raphaelstolt)", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Dec 15 13:13:48 +0000 2008", - "default_profile": false, - "default_profile_image": false, - "description": "Software Developer", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 2, - "followers_count": 292, - "following": true, - "follow_request_sent": false, - "friends_count": 106, - "geo_enabled": false, - "id": 18136020, - "id_str": "18136020", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "London, UK", - "name": "Federico Cargnelutti", - "notifications": false, - "profile_background_color": "1A1B1F", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme9/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme9/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/913196735/fede-pic2_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/913196735/fede-pic2_normal.jpg", - "profile_link_color": "067fa1", - "profile_sidebar_border_color": "353536", - "profile_sidebar_fill_color": "000000", - "profile_text_color": "636163", - "profile_use_background_image": true, - "protected": false, - "screen_name": "fedecarg", - "show_all_inline_media": true, - "statuses_count": 605, - "time_zone": "London", - "url": "http://www.fedecarg.com", - "utc_offset": 0, - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Tue Oct 27 22:54:58 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 5213696169, - "id_str": "5213696169", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "YouTube video of my talk this morning at #140conf. http://r2.ly/n8cv", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Sat Aug 05 23:04:08 +0000 2006", - "default_profile": false, - "default_profile_image": false, - "description": "Media Hackerer, Twitterer, NYU scholar", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 17, - "followers_count": 30623, - "following": true, - "follow_request_sent": false, - "friends_count": 1296, - "geo_enabled": true, - "id": 3839, - "id_str": "3839", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "NYC", - "name": "Dave Winer", - "notifications": false, - "profile_background_color": "9ae4e8", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/99323235/niagara.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/99323235/niagara.jpg", - "profile_background_tile": true, - "profile_image_url": "http://a1.twimg.com/profile_images/557815118/headshot_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/557815118/headshot_normal.jpg", - "profile_link_color": "7f7f90", - "profile_sidebar_border_color": "a6aaa1", - "profile_sidebar_fill_color": "e1e1df", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "davewiner", - "show_all_inline_media": true, - "statuses_count": 25591, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://scripting.com/", - "utc_offset": "-28800", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Wed Oct 21 06:29:46 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 5038508334, - "id_str": "5038508334", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "TweetDeck", - "text": "Damn you @revrev for showing me the beautifully great Machinarium point & click puzzler http://bit.ly/2m8xlT", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Wed Feb 14 21:28:40 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Manage X PRIZE Foundation sites. Drupal & Wordpress Fanboy. I run Lifestreamblog.com & my avatar makes me look hipper than I really am.", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 246, - "followers_count": 2089, - "following": true, - "follow_request_sent": false, - "friends_count": 1071, - "geo_enabled": true, - "id": 772681, - "id_str": "772681", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Chatsworth, CA", - "name": "Mark Krynsky", - "notifications": false, - "profile_background_color": "ffffff", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/93245565/twitter_background_krynsky_v3.png", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/93245565/twitter_background_krynsky_v3.png", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/684895249/mark_drinking_ces_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/684895249/mark_drinking_ces_normal.jpg", - "profile_link_color": "0000ff", - "profile_sidebar_border_color": "87bc44", - "profile_sidebar_fill_color": "e0ff92", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "krynsky", - "show_all_inline_media": true, - "statuses_count": 7406, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://lifestreamblog.com", - "utc_offset": "-28800", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Mon Oct 19 14:14:33 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 4991744144, - "id_str": "4991744144", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Seesmic", - "text": "RT @AdFreak: One of the better ads you'll see in support of gay marriage. From Ireland. http://bit.ly/2UyyEE #gay #lgbt /// Love it !", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Thu Nov 13 00:35:16 +0000 2008", - "default_profile": false, - "default_profile_image": false, - "description": "Geek de formation smiley-addict fuyant la vie préfabriquée. J'adore la Suisse et @AriMcd. Ah oui, les #jeudiconfession... c'est ma faute! Sorry! :$", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 87, - "followers_count": 1055, - "following": true, - "follow_request_sent": false, - "friends_count": 500, - "geo_enabled": false, - "id": 17352896, - "id_str": "17352896", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Montréal", - "name": "Simon Villeneuve", - "notifications": false, - "profile_background_color": "C0DEED", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/910317396/me-may18b-474px_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/910317396/me-may18b-474px_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "C0DEED", - "profile_sidebar_fill_color": "DDEEF6", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "SimonVilleneuve", - "show_all_inline_media": true, - "statuses_count": 12821, - "time_zone": "Eastern Time (US & Canada)", - "url": "http://www.simonvilleneuve.ca/", - "utc_offset": "-18000", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Fri Oct 16 06:26:57 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 4910076661, - "id_str": 4910076661, - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Seesmic", - "text": "wow, my \"if it ain't broken\" blog post is getting record amounts of visitors", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Mar 19 16:28:14 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "open source, php, geek, music, symfony, buzzer, dad, conference speaker, vegetarian, fc utrecht, entrepreneur, freelancer", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 31, - "followers_count": 1283, - "following": true, - "follow_request_sent": false, - "friends_count": 1492, - "geo_enabled": true, - "id": 1524641, - "id_str": "1524641", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Woudenberg, Netherlands", - "name": "Stefan", - "notifications": false, - "profile_background_color": "000000", - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/921970573/5d3c68fa-7d96-4f95-8f26-7c6d47496cd7_normal.png", - "profile_image_url_https": "https://si3.twimg.com/profile_images/921970573/5d3c68fa-7d96-4f95-8f26-7c6d47496cd7_normal.png", - "profile_link_color": "323232", - "profile_sidebar_border_color": "CDCDCD", - "profile_sidebar_fill_color": "999999", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "skoop", - "show_all_inline_media": true, - "statuses_count": 25592, - "time_zone": "Amsterdam", - "url": "http://www.leftontheweb.com/", - "utc_offset": 3600, - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Fri Oct 16 02:32:39 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 4905752912, - "id_str": "4905752912", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Twitter for iPhone", - "text": "Working on my PHP AtomPub library. I'll be ready to push some stuff to github in the near future. You'll be the first to know.", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Sun Jul 29 02:44:40 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Senior Software Architect at @Moontoast. Author, speaker, blogger, web geek, beer aficionado, home brewer, literature nut, liberty lover, & most of all, a dad.", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 83, - "followers_count": 1348, - "following": true, - "follow_request_sent": false, - "friends_count": 172, - "geo_enabled": true, - "id": 7794552, - "id_str": "7794552", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Nashville, TN", - "name": "Ben Ramsey", - "notifications": false, - "profile_background_color": "666666", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a3.twimg.com/profile_images/938351463/bramsey-square_normal.png", - "profile_image_url_https": "https://si3.twimg.com/profile_images/938351463/bramsey-square_normal.png", - "profile_link_color": "0066CC", - "profile_sidebar_border_color": "33cc00", - "profile_sidebar_fill_color": "99ff66", - "profile_text_color": "000000", - "profile_use_background_image": true, - "protected": false, - "screen_name": "ramsey", - "show_all_inline_media": true, - "statuses_count": 9307, - "time_zone": "Central Time (US & Canada)", - "url": "http://benramsey.com/", - "utc_offset": "-21600", - "verified": false - } - }, - { - "contributors": null, - "coordinates": null, - "created_at": "Thu Sep 17 12:54:45 +0000 2009", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favorited": true, - "geo": null, - "id": 4053276261, - "id_str": "4053276261", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "Posterous", - "text": "The Missing Manual author guidelines = top rate advice for ANY tutorial author http://post.ly/5PfX", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Sep 11 15:18:01 +0000 2006", - "default_profile": false, - "default_profile_image": false, - "description": "PacktPub.com acquisition editor. Mainly tweeting about WRITING and GAME DEVELOPMENT.", - "entities": { - "description": { - "urls": [] - } - }, - "favourites_count": 2, - "followers_count": 590, - "following": true, - "follow_request_sent": false, - "friends_count": 427, - "geo_enabled": false, - "id": 5808, - "id_str": "5808", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Birmingham, UK", - "name": "David Barnes", - "notifications": false, - "profile_background_color": "B2DFDA", - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme13/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme13/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/683503668/DSC00010_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/683503668/DSC00010_normal.jpg", - "profile_link_color": "93A644", - "profile_sidebar_border_color": "eeeeee", - "profile_sidebar_fill_color": "ffffff", - "profile_text_color": "333333", - "profile_use_background_image": true, - "protected": false, - "screen_name": "DRB", - "show_all_inline_media": true, - "statuses_count": 1620, - "time_zone": "London", - "url": "http://davidbarneswork.posterous.com/", - "utc_offset": 0, - "verified": false - } - } -] diff --git a/tests/Zend/Service/Twitter/_files/friendships.create.twitter.json b/tests/Zend/Service/Twitter/_files/friendships.create.twitter.json deleted file mode 100644 index bd5fad3f2c..0000000000 --- a/tests/Zend/Service/Twitter/_files/friendships.create.twitter.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "contributors_enabled": true, - "created_at": "Tue Feb 20 14:35:54 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Always wondering what's happening. ", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favourites_count": 2, - "followers_count": 3228781, - "following": true, - "follow_request_sent": false, - "friends_count": 247, - "geo_enabled": false, - "id": 783214, - "id_str": "783214", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco, CA", - "name": "Twitter", - "notifications": false, - "profile_background_color": "ACDED6", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_link_color": "038543", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "F6F6F6", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "twitter", - "show_all_inline_media": true, - "status": { - "contributors": [ - { - "id": 16739704, - "id_str": "16739704", - "screen_name": "jennadawn" - } - ], - "coordinates": null, - "created_at": "Fri May 28 21:14:05 +0000 2010", - "entities": { - "hashtags": [], - "media": [], - "urls": [ - { - "url": "http://bit.ly/b1Cf9A", - "indices": [ - 32, - 52 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "geo": null, - "id": 14932507266, - "id_str": "14932507266", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "possibly_sensitive_editable": false, - "possibly_sensitive": false, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Good news for people everywhere http://bit.ly/b1Cf9A", - "truncated": false - }, - "statuses_count": 745, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://twitter.com", - "utc_offset": "-28800", - "verified": true -} diff --git a/tests/Zend/Service/Twitter/_files/friendships.destroy.twitter.json b/tests/Zend/Service/Twitter/_files/friendships.destroy.twitter.json deleted file mode 100644 index 4e63c8c6f8..0000000000 --- a/tests/Zend/Service/Twitter/_files/friendships.destroy.twitter.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "contributors_enabled": true, - "created_at": "Tue Feb 20 14:35:54 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "Always wondering what's happening. ", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "favourites_count": 2, - "followers_count": 3230090, - "following": true, - "follow_request_sent": false, - "friends_count": 247, - "geo_enabled": false, - "id": 783214, - "id_str": "783214", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "San Francisco, CA", - "name": "Twitter", - "notifications": false, - "profile_background_color": "ACDED6", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme18/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/878669694/twitter_bird_normal.jpg", - "profile_link_color": "038543", - "profile_sidebar_border_color": "EEEEEE", - "profile_sidebar_fill_color": "F6F6F6", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "twitter", - "show_all_inline_media": true, - "status": { - "contributors": [ - { - "id": 16739704, - "id_str": "16739704", - "screen_name": "jennadawn" - } - ], - "coordinates": null, - "created_at": "Fri May 28 21:14:05 +0000 2010", - "entities": { - "hashtags": [], - "media": [], - "urls": [ - { - "url": "http://bit.ly/b1Cf9A", - "indices": [ - 32, - 52 - ] - } - ], - "user_mentions": [] - }, - "favorited": false, - "geo": null, - "id": 14932507266, - "id_str": "14932507266", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "possibly_sensitive_editable": false, - "possibly_sensitive": false, - "retweet_count": 0, - "retweeted": false, - "source": "web", - "text": "Good news for people everywhere http://bit.ly/b1Cf9A", - "truncated": false - }, - "statuses_count": 745, - "time_zone": "Pacific Time (US & Canada)", - "url": "http://twitter.com", - "utc_offset": "-28800", - "verified": true -} diff --git a/tests/Zend/Service/Twitter/_files/search.tweets.json b/tests/Zend/Service/Twitter/_files/search.tweets.json deleted file mode 100644 index 8123cedc0f..0000000000 --- a/tests/Zend/Service/Twitter/_files/search.tweets.json +++ /dev/null @@ -1,1887 +0,0 @@ -{ - "statuses":[ - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 22:22:29 +0000 2013", - "id":309791187840167938, - "id_str":"309791187840167938", - "text":"ZEND Framework 2 - Forma\u00e7ao Essencial #framework #php #zf2 #soudev http:\/\/t.co\/pKAaTjgQNT", - "source":"\u003Ca href=\u0022http:\/\/www.hootsuite.com\u0022 rel=\u0022nofollow\u0022\u003EHootSuite\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":40375758, - "id_str":"40375758", - "name":"Tempo Real Eventos ", - "screen_name":"treventos", - "location":"S\u00e3o Paulo", - "description":"Eventos em Tecnologia da Informa\u00e7\u00e3o: Treinamentos M\u00e3o na Massa, Palestras, Congressos, Semin\u00e1rios e Workshop\u0027s", - "url":"http:\/\/www.temporealeventos.com.br", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.temporealeventos.com.br", - "expanded_url":null, - "indices":[ - 0, - 34 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3301, - "friends_count":671, - "listed_count":152, - "created_at":"Sat May 16 00:58:23 +0000 2009", - "favourites_count":2, - "utc_offset":-10800, - "time_zone":"Brasilia", - "geo_enabled":false, - "verified":false, - "statuses_count":10367, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"2E78B0", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/108934926\/twi.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/108934926\/twi.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1074371685\/logo_tr_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1074371685\/logo_tr_normal.jpg", - "profile_link_color":"3983B8", - "profile_sidebar_border_color":"3983B8", - "profile_sidebar_fill_color":"F5F5F5", - "profile_text_color":"666666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"framework", - "indices":[ - 38, - 48 - ] - }, - { - "text":"php", - "indices":[ - 49, - 53 - ] - }, - { - "text":"zf2", - "indices":[ - 54, - 58 - ] - }, - { - "text":"soudev", - "indices":[ - 59, - 66 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/pKAaTjgQNT", - "expanded_url":"http:\/\/ow.ly\/ix8qO", - "display_url":"ow.ly\/ix8qO", - "indices":[ - 67, - 89 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"fr" - }, - "created_at":"Thu Mar 07 22:18:56 +0000 2013", - "id":309790292796637185, - "id_str":"309790292796637185", - "text":"Le #zendStudio10 avec #phpcloud et #zf2 c\u0027est plut\u00f4t pas mal et \u00e7a marche !!!", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":23771232, - "id_str":"23771232", - "name":"clauzel aurelien", - "screen_name":"aurelienclauzel", - "location":"43.469858,1.564284", - "description":"", - "url":"http:\/\/www.clauzel.fr", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.clauzel.fr", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":7, - "friends_count":47, - "listed_count":0, - "created_at":"Wed Mar 11 14:40:13 +0000 2009", - "favourites_count":57, - "utc_offset":3600, - "time_zone":"Paris", - "geo_enabled":true, - "verified":false, - "statuses_count":78, - "lang":"fr", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3121829633\/2a93de8d14b4480fb1d7f7ac756c04b3_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3121829633\/2a93de8d14b4480fb1d7f7ac756c04b3_normal.jpeg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zendStudio10", - "indices":[ - 3, - 16 - ] - }, - { - "text":"phpcloud", - "indices":[ - 22, - 31 - ] - }, - { - "text":"zf2", - "indices":[ - 35, - 39 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "lang":"fr" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"de" - }, - "created_at":"Thu Mar 07 21:58:34 +0000 2013", - "id":309785167126487040, - "id_str":"309785167126487040", - "text":"Usar Microsoft SQL Server en Zend Framework 2: http:\/\/t.co\/QtnwzwaXdK #zf2 #PHP", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":1106314022, - "id_str":"1106314022", - "name":"YoSymfony", - "screen_name":"YoSymfony", - "location":"", - "description":"Informaci\u00f3n sobre Symfony y PHP en espa\u00f1ol.", - "url":"http:\/\/t.co\/EW84STIT", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/EW84STIT", - "expanded_url":"http:\/\/yosymfony.com", - "display_url":"yosymfony.com", - "indices":[ - 0, - 20 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":74, - "friends_count":57, - "listed_count":1, - "created_at":"Sun Jan 20 13:57:33 +0000 2013", - "favourites_count":41, - "utc_offset":null, - "time_zone":null, - "geo_enabled":false, - "verified":false, - "statuses_count":260, - "lang":"es", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3133929507\/ca4a153077462bcdcbe99e4ddc232f2a_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3133929507\/ca4a153077462bcdcbe99e4ddc232f2a_normal.png", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zf2", - "indices":[ - 70, - 74 - ] - }, - { - "text":"PHP", - "indices":[ - 75, - 79 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/QtnwzwaXdK", - "expanded_url":"http:\/\/bit.ly\/YfwvWt", - "display_url":"bit.ly\/YfwvWt", - "indices":[ - 47, - 69 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"de" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 21:48:47 +0000 2013", - "id":309782708769390592, - "id_str":"309782708769390592", - "text":"#ZF2 is *really* complicated.. I\u0027m not yet convinced it makes sense for me or the rest of the team. More investigation required.", - "source":"\u003Ca href=\u0022http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":19575221, - "id_str":"19575221", - "name":"John Hunt", - "screen_name":"johnrh", - "location":"cambridgeshire, uk", - "description":"Born coder", - "url":"http:\/\/about.me\/johnhunt", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/about.me\/johnhunt", - "expanded_url":null, - "indices":[ - 0, - 24 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":78, - "friends_count":48, - "listed_count":9, - "created_at":"Tue Jan 27 03:30:33 +0000 2009", - "favourites_count":0, - "utc_offset":36000, - "time_zone":"Sydney", - "geo_enabled":false, - "verified":false, - "statuses_count":2842, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C6E2EE", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme2\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme2\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/73421919\/icon_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/73421919\/icon_normal.gif", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/19575221\/1356131715", - "profile_link_color":"1F98C7", - "profile_sidebar_border_color":"C6E2EE", - "profile_sidebar_fill_color":"DAECF4", - "profile_text_color":"663B12", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"ZF2", - "indices":[ - 0, - 4 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 21:30:46 +0000 2013", - "id":309778171073548288, - "id_str":"309778171073548288", - "text":"Blogged : Zend Framework 2 : Working with SQL Server and #ZF2 http:\/\/t.co\/Ujr826B8J6", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/tweetbutton\u0022 rel=\u0022nofollow\u0022\u003ETweet Button\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":43861950, - "id_str":"43861950", - "name":"Abdul Malik Ikhsan", - "screen_name":"samsonasik", - "location":"Bandung", - "description":"A husband. A Zend Framework Contributor.", - "url":"http:\/\/samsonasik.wordpress.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/samsonasik.wordpress.com", - "expanded_url":null, - "indices":[ - 0, - 31 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":208, - "friends_count":120, - "listed_count":5, - "created_at":"Mon Jun 01 10:09:57 +0000 2009", - "favourites_count":1893, - "utc_offset":25200, - "time_zone":"Jakarta", - "geo_enabled":true, - "verified":false, - "statuses_count":7146, - "lang":"id", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AE4E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme16\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme16\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3107620557\/81fac85cde13b28d1422e357c77fb6c5_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3107620557\/81fac85cde13b28d1422e357c77fb6c5_normal.jpeg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"BDDCAD", - "profile_sidebar_fill_color":"DDFFCC", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"ZF2", - "indices":[ - 57, - 61 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/Ujr826B8J6", - "expanded_url":"http:\/\/wp.me\/p2Eg2-y5", - "display_url":"wp.me\/p2Eg2-y5", - "indices":[ - 62, - 84 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 20:07:38 +0000 2013", - "id":309757250757591040, - "id_str":"309757250757591040", - "text":"Throwing in a pinch of #jquery \u0026amp; a dash of #sass to make the #zf2 app just a little cooler. Feel like I\u0027m missing a unicorn or something tho", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":144638265, - "id_str":"144638265", - "name":"Mike Stowe", - "screen_name":"mikegstowe", - "location":"Minnesota", - "description":"MNPHP UG, TCSE UG, \u0026 MidwestPHP Organizer, PHP 5.3 Certified Software Engineer, MySQL, Mongo, Zend Framework, Mobile", - "url":"http:\/\/www.mikestowe.com\/category\/php", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.mikestowe.com\/category\/php", - "expanded_url":null, - "indices":[ - 0, - 37 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":308, - "friends_count":530, - "listed_count":21, - "created_at":"Sun May 16 22:20:28 +0000 2010", - "favourites_count":36, - "utc_offset":null, - "time_zone":null, - "geo_enabled":false, - "verified":false, - "statuses_count":1400, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/333616160\/1316564425_phpcode_287392.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/333616160\/1316564425_phpcode_287392.jpeg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1806573970\/5b3a9b57-86b9-4e1c-8a70-5a882fd74997_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1806573970\/5b3a9b57-86b9-4e1c-8a70-5a882fd74997_normal.jpg", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"jquery", - "indices":[ - 23, - 30 - ] - }, - { - "text":"sass", - "indices":[ - 47, - 52 - ] - }, - { - "text":"zf2", - "indices":[ - 65, - 69 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 18:49:33 +0000 2013", - "id":309737602771218432, - "id_str":"309737602771218432", - "text":"RT @manchuck: Zend Tree Route with multiple segments http:\/\/t.co\/8J4Z3D4cxE #php #zf2", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":14915769, - "id_str":"14915769", - "name":"aljensen", - "screen_name":"aljensen7", - "location":"cyberspace!!!", - "description":"PHP \/ MySQL \/ JS \/ RHEL on one side, .Net on the other. ", - "url":"http:\/\/www.amazon.com\/Al-Jensen\/e\/B008MN382O\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.amazon.com\/Al-Jensen\/e\/B008MN382O\/", - "expanded_url":null, - "indices":[ - 0, - 45 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":275, - "friends_count":257, - "listed_count":2, - "created_at":"Tue May 27 02:08:04 +0000 2008", - "favourites_count":78, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":374, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EDECE9", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3336573137\/9012b74c0be4426e85fe35ac314e37ed_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3336573137\/9012b74c0be4426e85fe35ac314e37ed_normal.jpeg", - "profile_link_color":"088253", - "profile_sidebar_border_color":"D3D2CF", - "profile_sidebar_fill_color":"E3E2DE", - "profile_text_color":"634047", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 15:19:48 +0000 2013", - "id":309684814796185601, - "id_str":"309684814796185601", - "text":"Zend Tree Route with multiple segments http:\/\/t.co\/8J4Z3D4cxE #php #zf2", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/tweetbutton\u0022 rel=\u0022nofollow\u0022\u003ETweet Button\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9968732, - "id_str":"9968732", - "name":"Chuck Reeves", - "screen_name":"manchuck", - "location":"New York", - "description":"Caveman PHP developer", - "url":"http:\/\/manchuck.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/manchuck.com", - "expanded_url":null, - "indices":[ - 0, - 19 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":152, - "friends_count":176, - "listed_count":6, - "created_at":"Mon Nov 05 15:24:41 +0000 2007", - "favourites_count":5, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":1422, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9C9C00", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/338013543\/x60fb0339b234d2eb63eac885904a6e7.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/338013543\/x60fb0339b234d2eb63eac885904a6e7.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1829881215\/manchuck_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1829881215\/manchuck_normal.jpg", - "profile_link_color":"29B7EB", - "profile_sidebar_border_color":"D8BE64", - "profile_sidebar_fill_color":"99650A", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 62, - 66 - ] - }, - { - "text":"zf2", - "indices":[ - 67, - 71 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/8J4Z3D4cxE", - "expanded_url":"http:\/\/stackoverflow.com\/q\/15274762\/147366?stw=2", - "display_url":"stackoverflow.com\/q\/15274762\/147\u2026", - "indices":[ - 39, - 61 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - "retweet_count":1, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 76, - 80 - ] - }, - { - "text":"zf2", - "indices":[ - 81, - 85 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/8J4Z3D4cxE", - "expanded_url":"http:\/\/stackoverflow.com\/q\/15274762\/147366?stw=2", - "display_url":"stackoverflow.com\/q\/15274762\/147\u2026", - "indices":[ - 53, - 75 - ] - } - ], - "user_mentions":[ - { - "screen_name":"manchuck", - "name":"Chuck Reeves", - "id":9968732, - "id_str":"9968732", - "indices":[ - 3, - 12 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 16:21:37 +0000 2013", - "id":309700372367298561, - "id_str":"309700372367298561", - "text":"@mwop @brandonsavage Heard something recently about someone intending to spearhead \u0022documentation hunt days\u0022 similar to bug hunt days. #zf2", - "source":"web", - "truncated":false, - "in_reply_to_status_id":309687522936631298, - "in_reply_to_status_id_str":"309687522936631298", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":9105122, - "id_str":"9105122", - "name":"Matthew Turland", - "screen_name":"elazar", - "location":"Duson, LA, USA", - "description":"father, geek, technophile, software developer, open source advocate, author, speaker, and budding ex-wallflower", - "url":"http:\/\/matthewturland.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/matthewturland.com", - "expanded_url":null, - "indices":[ - 0, - 25 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2222, - "friends_count":522, - "listed_count":252, - "created_at":"Wed Sep 26 10:35:38 +0000 2007", - "favourites_count":408, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":29504, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1674107936\/270483_808419244670_47912933_37915694_7250313_n_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1674107936\/270483_808419244670_47912933_37915694_7250313_n_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9105122\/1361049599", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zf2", - "indices":[ - 135, - 139 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - }, - { - "screen_name":"brandonsavage", - "name":"Brandon Savage", - "id":14993209, - "id_str":"14993209", - "indices":[ - 6, - 20 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 15:19:48 +0000 2013", - "id":309684814796185601, - "id_str":"309684814796185601", - "text":"Zend Tree Route with multiple segments http:\/\/t.co\/8J4Z3D4cxE #php #zf2", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/tweetbutton\u0022 rel=\u0022nofollow\u0022\u003ETweet Button\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9968732, - "id_str":"9968732", - "name":"Chuck Reeves", - "screen_name":"manchuck", - "location":"New York", - "description":"Caveman PHP developer", - "url":"http:\/\/manchuck.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/manchuck.com", - "expanded_url":null, - "indices":[ - 0, - 19 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":152, - "friends_count":176, - "listed_count":6, - "created_at":"Mon Nov 05 15:24:41 +0000 2007", - "favourites_count":5, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":1422, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9C9C00", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/338013543\/x60fb0339b234d2eb63eac885904a6e7.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/338013543\/x60fb0339b234d2eb63eac885904a6e7.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1829881215\/manchuck_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1829881215\/manchuck_normal.jpg", - "profile_link_color":"29B7EB", - "profile_sidebar_border_color":"D8BE64", - "profile_sidebar_fill_color":"99650A", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 62, - 66 - ] - }, - { - "text":"zf2", - "indices":[ - 67, - 71 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/8J4Z3D4cxE", - "expanded_url":"http:\/\/stackoverflow.com\/q\/15274762\/147366?stw=2", - "display_url":"stackoverflow.com\/q\/15274762\/147\u2026", - "indices":[ - 39, - 61 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 14:57:24 +0000 2013", - "id":309679180591820800, - "id_str":"309679180591820800", - "text":"#ZF2 slowly gets fun!", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":296797672, - "id_str":"296797672", - "name":"Chuvisco", - "screen_name":"chuvisco88", - "location":"", - "description":"", - "url":null, - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3, - "friends_count":8, - "listed_count":0, - "created_at":"Wed May 11 12:27:48 +0000 2011", - "favourites_count":0, - "utc_offset":null, - "time_zone":null, - "geo_enabled":false, - "verified":false, - "statuses_count":12, - "lang":"de", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3225122929\/31390b1a496711e54a8840cffc1a121d_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3225122929\/31390b1a496711e54a8840cffc1a121d_normal.jpeg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"ZF2", - "indices":[ - 0, - 4 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 10:40:14 +0000 2013", - "id":309614459977093120, - "id_str":"309614459977093120", - "text":"@samitrimal #zf2 is much alike #dotnet, use of namespaces and hell alot of php5.3 and als0 some magic stuffs!! #whatsurthoughts", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":192501541, - "in_reply_to_user_id_str":"192501541", - "in_reply_to_screen_name":"samitrimal", - "user":{ - "id":152136820, - "id_str":"152136820", - "name":"Kabir Maharjan", - "screen_name":"kbirmhrjn", - "location":"Kathmandu, Nepal", - "description":"Programmer, Coder, Developer you name it", - "url":"http:\/\/t.co\/i3G4hKeKT2", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/i3G4hKeKT2", - "expanded_url":"http:\/\/kbir-mhrjn.com.np", - "display_url":"kbir-mhrjn.com.np", - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":36, - "friends_count":369, - "listed_count":0, - "created_at":"Sat Jun 05 04:56:53 +0000 2010", - "favourites_count":19, - "utc_offset":20700, - "time_zone":"Kathmandu", - "geo_enabled":true, - "verified":false, - "statuses_count":859, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"0099B9", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/767764163\/d3d341002c3eefb2a99440c3dcad1ca0.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/767764163\/d3d341002c3eefb2a99440c3dcad1ca0.jpeg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3038487941\/c88a127241c6b5107417c153a15bdc25_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3038487941\/c88a127241c6b5107417c153a15bdc25_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/152136820\/1357968278", - "profile_link_color":"0099B9", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zf2", - "indices":[ - 12, - 16 - ] - }, - { - "text":"dotnet", - "indices":[ - 31, - 38 - ] - }, - { - "text":"whatsurthoughts", - "indices":[ - 111, - 127 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"samitrimal", - "name":"Samit Rimal", - "id":192501541, - "id_str":"192501541", - "indices":[ - 0, - 11 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 09:30:17 +0000 2013", - "id":309596856739057664, - "id_str":"309596856739057664", - "text":"Comparison of Yii Framework and Zend Framework 2 | Techknowlogists http:\/\/t.co\/geowf6XbJ2 #zend #zf2 #yii #php #framework", - "source":"\u003Ca href=\u0022http:\/\/bufferapp.com\u0022 rel=\u0022nofollow\u0022\u003EBuffer\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":276683484, - "id_str":"276683484", - "name":"Nicolas Hachet", - "screen_name":"nicolashachet", - "location":"Nantes, France", - "description":"D\u00e9veloppeur Web - Lead dev #PHP @ #Nantes\r\n\u2014 Frameworks #CakePHP | #Symfony | #Zend\r\n\r\n\u2014 #Entrepreneur | #Blogueur | #Geek\r\n", - "url":"http:\/\/blog.nicolashachet.com\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.nicolashachet.com\/", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":163, - "friends_count":50, - "listed_count":11, - "created_at":"Sun Apr 03 21:36:08 +0000 2011", - "favourites_count":1, - "utc_offset":-10800, - "time_zone":"Greenland", - "geo_enabled":true, - "verified":false, - "statuses_count":2334, - "lang":"fr", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"0099B9", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme4\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme4\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2611057107\/v8m3c7orm7njk4r7hegy_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2611057107\/v8m3c7orm7njk4r7hegy_normal.png", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/276683484\/1348910990", - "profile_link_color":"0099B9", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"95E8EC", - "profile_text_color":"3C3940", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zend", - "indices":[ - 90, - 95 - ] - }, - { - "text":"zf2", - "indices":[ - 96, - 100 - ] - }, - { - "text":"yii", - "indices":[ - 101, - 105 - ] - }, - { - "text":"php", - "indices":[ - 106, - 110 - ] - }, - { - "text":"framework", - "indices":[ - 111, - 121 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/geowf6XbJ2", - "expanded_url":"http:\/\/buff.ly\/ZahERE", - "display_url":"buff.ly\/ZahERE", - "indices":[ - 67, - 89 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 09:00:42 +0000 2013", - "id":309589412247908352, - "id_str":"309589412247908352", - "text":"Latest News about #zendframework #zf2 http:\/\/t.co\/JMBFRdm0Sn", - "source":"\u003Ca href=\u0022http:\/\/www.tweetedtimes.com\u0022 rel=\u0022nofollow\u0022\u003EThe Tweeted Times\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":17393120, - "id_str":"17393120", - "name":"Daniel Sousa", - "screen_name":"danielosousa", - "location":"Valongo, Porto, Portugal", - "description":"@Magento Moderator. Build your online store with @Magento the best online shopping cart.\r\nSegue as novidades do Magento em Portugu\u00eas. #magentopt", - "url":"http:\/\/www.dsecomm.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.dsecomm.com", - "expanded_url":null, - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":141, - "friends_count":389, - "listed_count":9, - "created_at":"Fri Nov 14 18:55:55 +0000 2008", - "favourites_count":5, - "utc_offset":0, - "time_zone":"Lisbon", - "geo_enabled":true, - "verified":false, - "statuses_count":563, - "lang":"pt", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"1A1B1F", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme6\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme6\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2328951193\/rz86toewk0jrsdapgf5b_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2328951193\/rz86toewk0jrsdapgf5b_normal.jpeg", - "profile_link_color":"2FC2EF", - "profile_sidebar_border_color":"8F86D0", - "profile_sidebar_fill_color":"FBE0A7", - "profile_text_color":"4455CF", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zendframework", - "indices":[ - 18, - 32 - ] - }, - { - "text":"zf2", - "indices":[ - 33, - 37 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/JMBFRdm0Sn", - "expanded_url":"http:\/\/tweetedtimes.com\/search\/zf2%20OR%20zendframework\/en", - "display_url":"tweetedtimes.com\/search\/zf2%20O\u2026", - "indices":[ - 38, - 60 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false, - "lang":"en" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"fr" - }, - "created_at":"Thu Mar 07 09:00:24 +0000 2013", - "id":309589336578465792, - "id_str":"309589336578465792", - "text":"Encore une bonne partie de la nuit pass\u00e9e sur #nodeJS avec #webstorm , mon stack #php #zf2 #zendStudio est moins sexy ce matin.", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":278240828, - "id_str":"278240828", - "name":"St\u00e9phane Bonnet", - "screen_name":"sbonnet2107", - "location":"France, Toulouse", - "description":"", - "url":null, - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":86, - "friends_count":210, - "listed_count":9, - "created_at":"Wed Apr 06 22:07:20 +0000 2011", - "favourites_count":30, - "utc_offset":3600, - "time_zone":"Paris", - "geo_enabled":true, - "verified":false, - "statuses_count":908, - "lang":"fr", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2774597537\/afd57bef8e7ccf492850101389fd2b86_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2774597537\/afd57bef8e7ccf492850101389fd2b86_normal.jpeg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"nodeJS", - "indices":[ - 46, - 53 - ] - }, - { - "text":"webstorm", - "indices":[ - 59, - 68 - ] - }, - { - "text":"php", - "indices":[ - 82, - 86 - ] - }, - { - "text":"zf2", - "indices":[ - 87, - 91 - ] - }, - { - "text":"zendStudio", - "indices":[ - 92, - 103 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "lang":"fr" - }, - { - "metadata":{ - "result_type":"recent", - "iso_language_code":"en" - }, - "created_at":"Thu Mar 07 08:41:04 +0000 2013", - "id":309584473463353344, - "id_str":"309584473463353344", - "text":"@davidwindell via an IRC conversation with @mwop. I knew #symfony had the option, wondered whether it was there already for #zf2", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/android\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Android\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":309573519556100096, - "in_reply_to_status_id_str":"309573519556100096", - "in_reply_to_user_id":16421278, - "in_reply_to_user_id_str":"16421278", - "in_reply_to_screen_name":"davidwindell", - "user":{ - "id":2272821, - "id_str":"2272821", - "name":"Jurian Sluiman", - "screen_name":"juriansluiman", - "location":"Delft, NL", - "description":"Student Biomedical Engineering, co-founder of Soflomo", - "url":"http:\/\/juriansluiman.nl", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/juriansluiman.nl", - "expanded_url":null, - "indices":[ - 0, - 23 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":202, - "friends_count":83, - "listed_count":20, - "created_at":"Mon Mar 26 08:19:48 +0000 2007", - "favourites_count":125, - "utc_offset":3600, - "time_zone":"Amsterdam", - "geo_enabled":true, - "verified":false, - "statuses_count":1845, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"022330", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme15\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme15\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1158735180\/jurian_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1158735180\/jurian_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/2272821\/1349701194", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"C0DFEC", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"symfony", - "indices":[ - 57, - 65 - ] - }, - { - "text":"zf2", - "indices":[ - 124, - 128 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"davidwindell", - "name":"David Windell", - "id":16421278, - "id_str":"16421278", - "indices":[ - 0, - 13 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 43, - 48 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "lang":"en" - } - ], - "search_metadata":{ - "completed_in":0.043, - "max_id":309791187840167938, - "max_id_str":"309791187840167938", - "next_results":"?max_id=309584473463353343\u0026q=%23zf2\u0026include_entities=1", - "query":"%23zf2", - "refresh_url":"?since_id=309791187840167938\u0026q=%23zf2\u0026include_entities=1", - "count":15, - "since_id":0, - "since_id_str":"0" - } -} diff --git a/tests/Zend/Service/Twitter/_files/statuses.destroy.json b/tests/Zend/Service/Twitter/_files/statuses.destroy.json deleted file mode 100644 index 4c951fd894..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.destroy.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "contributors": null, - "coordinates": null, - "created_at": "Sun May 30 13:48:40 +0000 2010", - "entities": { - "hashtags": [], - "media": [], - "urls": [ ], - "user_mentions": [] - }, - "favorited": false, - "geo": null, - "id": 15042159587, - "id_user": "15042159587", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "possibly_sensitive_editable": false, - "possibly_sensitive": false, - "retweet_count": 0, - "retweeted": false, - "source": "API", - "text": "Test Message 1", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Mon Sep 24 19:35:22 +0000 2007", - "default_profile": false, - "default_profile_image": false, - "description": "PHP Developer, Open Source Contributor, and FS Audit Consultant", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "favourites_count": 21, - "followers_count": 848, - "following": false, - "follow_request_sent": false, - "friends_count": 469, - "geo_enabled": false, - "id": 9075802, - "id_str": "9075802", - "is_translator": false, - "lang": "en", - "listed_count": 0, - "location": "Dublin, Ireland, Europe!", - "name": "Pádraic Brady", - "notifications": false, - "profile_background_color": "022330", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme15/bg.png", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/374757042/twitterProfilePhoto_normal.jpg", - "profile_link_color": "0084B4", - "profile_sidebar_border_color": "a8c7f7", - "profile_sidebar_fill_color": "C0DFEC", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "padraicb", - "show_all_inline_media": false, - "statuses_count": 5928, - "time_zone": "Dublin", - "url": "http://blog.astrumfutura.com", - "utc_offset": 0, - "verified": false - } -} diff --git a/tests/Zend/Service/Twitter/_files/statuses.home_timeline.page.json b/tests/Zend/Service/Twitter/_files/statuses.home_timeline.page.json deleted file mode 100644 index 63d5f626f6..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.home_timeline.page.json +++ /dev/null @@ -1,2739 +0,0 @@ -[ - { - "created_at":"Mon Mar 04 21:37:54 +0000 2013", - "id":308692806464073728, - "id_str":"308692806464073728", - "text":"quite a line up already if you ask me http:\/\/t.co\/TfzEGDkUYC, this is going to be great", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":33927626, - "id_str":"33927626", - "name":"Juozas Kaziuk\u0117nas", - "screen_name":"juokaz", - "location":"Homeless", - "description":"People call me Joe. I grow businesses using technologies. The most clever idiot you know. ", - "url":"http:\/\/juokaz.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/juokaz.com", - "expanded_url":null, - "indices":[ - 0, - 17 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2003, - "friends_count":193, - "listed_count":195, - "created_at":"Tue Apr 21 14:57:11 +0000 2009", - "favourites_count":8, - "utc_offset":0, - "time_zone":"Edinburgh", - "geo_enabled":false, - "verified":false, - "statuses_count":8197, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EBEBEB", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/673679671\/28fd92314ade66a7ea1f46f3f8d4feda.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/673679671\/28fd92314ade66a7ea1f46f3f8d4feda.jpeg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3010723079\/ebb19d9506e44f13caba77a247ad439a_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3010723079\/ebb19d9506e44f13caba77a247ad439a_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/33927626\/1349452677", - "profile_link_color":"990000", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"F3F3F3", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/TfzEGDkUYC", - "expanded_url":"http:\/\/whiskyweb.co.uk\/speakers.html", - "display_url":"whiskyweb.co.uk\/speakers.html", - "indices":[ - 38, - 60 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:37:35 +0000 2013", - "id":308692725383979010, - "id_str":"308692725383979010", - "text":"RT @Sencha: The anticipation is finally over. We\u2019re very excited to announce the winners of the #html5isready contest! http:\/\/t.co\/4hpFO ...", - "source":"\u003Ca href=\u0022http:\/\/www.hootsuite.com\u0022 rel=\u0022nofollow\u0022\u003EHootSuite\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":27335366, - "id_str":"27335366", - "name":"Stephan Hochd\u00f6rfer", - "screen_name":"shochdoerfer", - "location":"Mannheim", - "description":"Software developer, Internet geek and entrepreneur by heart with a magic touch.", - "url":"http:\/\/blog.bitexpert.de\/author\/stephan-hochdoerfer\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.bitexpert.de\/author\/stephan-hochdoerfer\/", - "expanded_url":null, - "indices":[ - 0, - 52 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":597, - "friends_count":382, - "listed_count":47, - "created_at":"Sat Mar 28 23:41:01 +0000 2009", - "favourites_count":10, - "utc_offset":-10800, - "time_zone":"Greenland", - "geo_enabled":true, - "verified":false, - "statuses_count":7320, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EEEEEE", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/435073730\/twilk_background_4f49f33a1cf61.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/435073730\/twilk_background_4f49f33a1cf61.jpg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/679170821\/62f13c99b.25312_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/679170821\/62f13c99b.25312_normal.jpg", - "profile_link_color":"000000", - "profile_sidebar_border_color":"5ED4DC", - "profile_sidebar_fill_color":"95E8EC", - "profile_text_color":"3C3940", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 21:26:33 +0000 2013", - "id":308689949450969088, - "id_str":"308689949450969088", - "text":"The anticipation is finally over. We\u2019re very excited to announce the winners of the #html5isready contest! http:\/\/t.co\/4hpFOogemH", - "source":"\u003Ca href=\u0022http:\/\/www.hootsuite.com\u0022 rel=\u0022nofollow\u0022\u003EHootSuite\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":14539337, - "id_str":"14539337", - "name":"Sencha", - "screen_name":"Sencha", - "location":"Redwood City, CA", - "description":"We make application frameworks, tools, and cloud services that equip developers to create amazing app experiences using Web-standard technologies.", - "url":"http:\/\/www.sencha.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.sencha.com", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":18276, - "friends_count":55, - "listed_count":1341, - "created_at":"Sat Apr 26 03:54:35 +0000 2008", - "favourites_count":187, - "utc_offset":-28800, - "time_zone":"Pacific Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":2545, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FFFFFF", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/200647417\/oolong.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/200647417\/oolong.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1233097698\/sencha-blue_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1233097698\/sencha-blue_normal.png", - "profile_link_color":"126399", - "profile_sidebar_border_color":"F2F2F2", - "profile_sidebar_fill_color":"FFFFFF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":6, - "entities":{ - "hashtags":[ - { - "text":"html5isready", - "indices":[ - 84, - 97 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/4hpFOogemH", - "expanded_url":"http:\/\/ow.ly\/ilpHY", - "display_url":"ow.ly\/ilpHY", - "indices":[ - 107, - 129 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":6, - "entities":{ - "hashtags":[ - { - "text":"html5isready", - "indices":[ - 96, - 109 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"Sencha", - "name":"Sencha", - "id":14539337, - "id_str":"14539337", - "indices":[ - 3, - 10 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:36:45 +0000 2013", - "id":308692515626811392, - "id_str":"308692515626811392", - "text":"@ElizabethN @otherinbox?", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308692071009640448, - "in_reply_to_status_id_str":"308692071009640448", - "in_reply_to_user_id":9697482, - "in_reply_to_user_id_str":"9697482", - "in_reply_to_screen_name":"ElizabethN", - "user":{ - "id":7920672, - "id_str":"7920672", - "name":"Davey Shafik", - "screen_name":"dshafik", - "location":"iPhone: 28.244517,-82.181615", - "description":"Professional PHP Developer, Author and Speaker. Engineer for @EngineYard on @eyorchestra \u2014\u00a0the PHP Platform as a Service.", - "url":"http:\/\/daveyshafik.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/daveyshafik.com", - "expanded_url":null, - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2275, - "friends_count":440, - "listed_count":179, - "created_at":"Fri Aug 03 00:53:40 +0000 2007", - "favourites_count":46, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":14720, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"BFE8B4", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/49560318\/clouds.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/49560318\/clouds.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1759926514\/6485231835_e13c84a61a_z-1_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1759926514\/6485231835_e13c84a61a_z-1_normal.jpg", - "profile_link_color":"2C6214", - "profile_sidebar_border_color":"44BC47", - "profile_sidebar_fill_color":"AAE19C", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"ElizabethN", - "name":"Elizabeth Naramore", - "id":9697482, - "id_str":"9697482", - "indices":[ - 0, - 11 - ] - }, - { - "screen_name":"otherinbox", - "name":"OtherInbox", - "id":14793035, - "id_str":"14793035", - "indices":[ - 12, - 23 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:34:59 +0000 2013", - "id":308692071009640448, - "id_str":"308692071009640448", - "text":"Email has become such a huge part of my day. Looking for helpful Gmail tips\/tricks\/addons if you have \u0027em.", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9697482, - "id_str":"9697482", - "name":"Elizabeth Naramore", - "screen_name":"ElizabethN", - "location":"Cincinnati", - "description":"EventHandler at GitHub. Also, completely inappropriate most of the time.", - "url":"http:\/\/www.naramore.net\/blog", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.naramore.net\/blog", - "expanded_url":null, - "indices":[ - 0, - 28 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":4453, - "friends_count":954, - "listed_count":396, - "created_at":"Thu Oct 25 23:36:24 +0000 2007", - "favourites_count":32, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":19514, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FFFFFF", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/4161617\/beach.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/4161617\/beach.jpg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3026098081\/4b1f94a1633c67bac5ebdf3dfe963390_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3026098081\/4b1f94a1633c67bac5ebdf3dfe963390_normal.jpeg", - "profile_link_color":"4D1664", - "profile_sidebar_border_color":"86A4A6", - "profile_sidebar_fill_color":"D4CB9B", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:33:22 +0000 2013", - "id":308691664053092353, - "id_str":"308691664053092353", - "text":"\u0022South African province spends $15.4M on WordPress site\u0022 Bandwidth overage cost from phishing attacks that exploited a broken plugin, right?", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":14249124, - "id_str":"14249124", - "name":"Sean Coates", - "screen_name":"coates", - "location":"Montreal", - "description":"Doer of things technical at @FictiveKin: @gimmebar, @rushmorefm, @donenotdone, and others. I post geeky things about web, music, beer. Your call. (-:", - "url":"http:\/\/seancoates.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/seancoates.com", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3170, - "friends_count":201, - "listed_count":292, - "created_at":"Sat Mar 29 03:52:29 +0000 2008", - "favourites_count":115, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":12648, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"7BCDCD", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/2696809\/whalecopter.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/2696809\/whalecopter.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1597362183\/me_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1597362183\/me_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/14249124\/1349375406", - "profile_link_color":"0000FF", - "profile_sidebar_border_color":"009999", - "profile_sidebar_fill_color":"FFFFFF", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:16:25 +0000 2013", - "id":308687399305760770, - "id_str":"308687399305760770", - "text":"If I ever buy a boat I\u0027m going to name it the \u0022I Love You\u0022", - "source":"\u003Ca href=\u0022http:\/\/www.metrotwit.com\/\u0022 rel=\u0022nofollow\u0022\u003EMetroTwit\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":87594768, - "id_str":"87594768", - "name":"Kevin Schroeder", - "screen_name":"kpschrade", - "location":"", - "description":"Developer, author, musician, global domination theoretician. Works for @Magento where he only does two of those.", - "url":"http:\/\/t.co\/MdB1RqXn5o", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/MdB1RqXn5o", - "expanded_url":"http:\/\/www.eschrade.com", - "display_url":"eschrade.com", - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1431, - "friends_count":495, - "listed_count":158, - "created_at":"Thu Nov 05 02:17:15 +0000 2009", - "favourites_count":11, - "utc_offset":null, - "time_zone":null, - "geo_enabled":false, - "verified":false, - "statuses_count":5356, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"A51B1B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/179488564\/YouTube_Background.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/179488564\/YouTube_Background.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2940211149\/dcc14be78fa867049239e94422c99bb4_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2940211149\/dcc14be78fa867049239e94422c99bb4_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/87594768\/1361994211", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:15:17 +0000 2013", - "id":308687111261913088, - "id_str":"308687111261913088", - "text":"For the west coast crowd, my latest book has gone live today http:\/\/t.co\/OgkikLWSHd", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":7418052, - "id_str":"7418052", - "name":"Chris Hartjes", - "screen_name":"grmpyprogrammer", - "location":"Milton, Ontario, Canada", - "description":"Grumpy web developer and tester, @gtaphp organizer, running @truenorthphp, just waiting for people to START WRITING TESTS", - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "expanded_url":null, - "indices":[ - 0, - 39 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3062, - "friends_count":294, - "listed_count":241, - "created_at":"Thu Jul 12 02:36:44 +0000 2007", - "favourites_count":14, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":29405, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AE4E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_link_color":"0000FF", - "profile_sidebar_border_color":"87BC44", - "profile_sidebar_fill_color":"E0FF92", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/OgkikLWSHd", - "expanded_url":"http:\/\/grumpy-phpunit.com", - "display_url":"grumpy-phpunit.com", - "indices":[ - 61, - 83 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:14:58 +0000 2013", - "id":308687035122737152, - "id_str":"308687035122737152", - "text":"Just a reminder I\u0027ll be talking about Improving Quality on Untestable Code @dsmwebgeeks at @goodsmiths tonight at 6:30pm", - "source":"\u003Ca href=\u0022http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9549602, - "id_str":"9549602", - "name":"Tony Bibbs", - "screen_name":"tonybibbs", - "location":"Urbandale, IA", - "description":"President, lead geek and customer service enthusiast for @gforgegroup. Iowa native, family man \u0026 hunter gatherer.", - "url":"http:\/\/www.tonybibbs.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.tonybibbs.com", - "expanded_url":null, - "indices":[ - 0, - 24 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":908, - "friends_count":522, - "listed_count":76, - "created_at":"Fri Oct 19 20:08:42 +0000 2007", - "favourites_count":163, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":9197, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"1A1B1F", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2151109854\/458924_10150634200962817_515922816_9173861_610735234_o_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2151109854\/458924_10150634200962817_515922816_9173861_610735234_o_normal.jpg", - "profile_link_color":"2FC2EF", - "profile_sidebar_border_color":"181A1E", - "profile_sidebar_fill_color":"252429", - "profile_text_color":"666666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"dsmwebgeeks", - "name":"dsmwebgeeks", - "id":15531930, - "id_str":"15531930", - "indices":[ - 75, - 87 - ] - }, - { - "screen_name":"goodsmiths", - "name":"Goodsmiths", - "id":246623949, - "id_str":"246623949", - "indices":[ - 91, - 102 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:10:50 +0000 2013", - "id":308685992179666946, - "id_str":"308685992179666946", - "text":"Need some JavaScript or front-end dev work? Talk to @garannm before someone else hires her!", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9478892, - "id_str":"9478892", - "name":"Travis Swicegood", - "screen_name":"tswicegood", - "location":"Austin, TX", - "description":"Professional Instigator, Lone Star Hacker, Director of Tech for @TexasTribune, Digital Polyglot, and Maker of Trouble.", - "url":"http:\/\/www.travisswicegood.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.travisswicegood.com", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2321, - "friends_count":487, - "listed_count":258, - "created_at":"Tue Oct 16 14:55:08 +0000 2007", - "favourites_count":2722, - "utc_offset":-21600, - "time_zone":"Central America", - "geo_enabled":true, - "verified":false, - "statuses_count":19297, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"07090B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9478892\/1362432864", - "profile_link_color":"1C1F23", - "profile_sidebar_border_color":"BFBFBF", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"336666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":{ - "id":"c3f37afa9efcf94b", - "url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/c3f37afa9efcf94b.json", - "place_type":"city", - "name":"Austin", - "full_name":"Austin, TX", - "country_code":"US", - "country":"United States", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -97.938383, - 30.098659 - ], - [ - -97.56842, - 30.098659 - ], - [ - -97.56842, - 30.49685 - ], - [ - -97.938383, - 30.49685 - ] - ] - ] - }, - "attributes":{ - - } - }, - "contributors":null, - "retweet_count":2, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"garannm", - "name":"Garann Means", - "id":15989423, - "id_str":"15989423", - "indices":[ - 53, - 61 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:09:22 +0000 2013", - "id":308685625366831104, - "id_str":"308685625366831104", - "text":"RT @LarryUllman: \u0022The Yii Book\u0022 version 0.5 Update Posted! http:\/\/t.co\/kvJJ3hI5Um", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":7418052, - "id_str":"7418052", - "name":"Chris Hartjes", - "screen_name":"grmpyprogrammer", - "location":"Milton, Ontario, Canada", - "description":"Grumpy web developer and tester, @gtaphp organizer, running @truenorthphp, just waiting for people to START WRITING TESTS", - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "expanded_url":null, - "indices":[ - 0, - 39 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3062, - "friends_count":294, - "listed_count":241, - "created_at":"Thu Jul 12 02:36:44 +0000 2007", - "favourites_count":14, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":29405, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AE4E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_link_color":"0000FF", - "profile_sidebar_border_color":"87BC44", - "profile_sidebar_fill_color":"E0FF92", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 21:08:10 +0000 2013", - "id":308685323595046914, - "id_str":"308685323595046914", - "text":"\u0022The Yii Book\u0022 version 0.5 Update Posted! http:\/\/t.co\/kvJJ3hI5Um", - "source":"\u003Ca href=\u0022http:\/\/publicize.wp.com\/\u0022 rel=\u0022nofollow\u0022\u003EWordPress.com\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":491614587, - "id_str":"491614587", - "name":"Larry Ullman", - "screen_name":"LarryUllman", - "location":"State College, PA, US", - "description":"Writer, Web and software developer, trainer, instructor, speaker, and consultant. Specializes in translating Geek into English.", - "url":"http:\/\/t.co\/Wa6sL7ZO", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/Wa6sL7ZO", - "expanded_url":"http:\/\/www.larryullman.com", - "display_url":"larryullman.com", - "indices":[ - 0, - 20 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1029, - "friends_count":391, - "listed_count":43, - "created_at":"Mon Feb 13 20:42:49 +0000 2012", - "favourites_count":87, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":2693, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"DBE8FF", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/538578445\/Twitter-Background.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/538578445\/Twitter-Background.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1926733998\/icon_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1926733998\/icon_normal.png", - "profile_link_color":"0A0E51", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/kvJJ3hI5Um", - "expanded_url":"http:\/\/wp.me\/p2eMVC-UO", - "display_url":"wp.me\/p2eMVC-UO", - "indices":[ - 42, - 64 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/kvJJ3hI5Um", - "expanded_url":"http:\/\/wp.me\/p2eMVC-UO", - "display_url":"wp.me\/p2eMVC-UO", - "indices":[ - 59, - 81 - ] - } - ], - "user_mentions":[ - { - "screen_name":"LarryUllman", - "name":"Larry Ullman", - "id":491614587, - "id_str":"491614587", - "indices":[ - 3, - 15 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:09:10 +0000 2013", - "id":308685574989037570, - "id_str":"308685574989037570", - "text":"\u0022The real secret of the success of continuous deployment is that code is pushed before it\u2019s done.\u0022 http:\/\/t.co\/h54Ah0n3eG", - "source":"\u003Ca href=\u0022http:\/\/bufferapp.com\u0022 rel=\u0022nofollow\u0022\u003EBuffer\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9478892, - "id_str":"9478892", - "name":"Travis Swicegood", - "screen_name":"tswicegood", - "location":"Austin, TX", - "description":"Professional Instigator, Lone Star Hacker, Director of Tech for @TexasTribune, Digital Polyglot, and Maker of Trouble.", - "url":"http:\/\/www.travisswicegood.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.travisswicegood.com", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2321, - "friends_count":487, - "listed_count":258, - "created_at":"Tue Oct 16 14:55:08 +0000 2007", - "favourites_count":2722, - "utc_offset":-21600, - "time_zone":"Central America", - "geo_enabled":true, - "verified":false, - "statuses_count":19297, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"07090B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9478892\/1362432864", - "profile_link_color":"1C1F23", - "profile_sidebar_border_color":"BFBFBF", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"336666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/h54Ah0n3eG", - "expanded_url":"http:\/\/j.mp\/Xl8mly", - "display_url":"j.mp\/Xl8mly", - "indices":[ - 99, - 121 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:05:36 +0000 2013", - "id":308684676262928384, - "id_str":"308684676262928384", - "text":"@tswicegood Something\u0027s messed up with that; quite some number in the top 20 are now no longer on that list.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308681699364052992, - "in_reply_to_status_id_str":"308681699364052992", - "in_reply_to_user_id":9478892, - "in_reply_to_user_id_str":"9478892", - "in_reply_to_screen_name":"tswicegood", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13278, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 0, - 11 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:02:41 +0000 2013", - "id":308683941211148288, - "id_str":"308683941211148288", - "text":"This would be .@dys_morphia 100 years ago: RT @calacademy: #WomenHistory Academy\u0027s heroic botanist Alice Eastwood http:\/\/t.co\/tMRzvgrAZA", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":14033052, - "id_str":"14033052", - "name":"Maggie Nelson", - "screen_name":"maggie1000", - "location":"San Francisco, CA", - "description":"databases and code goodness", - "url":"http:\/\/maggienelson.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/maggienelson.com", - "expanded_url":null, - "indices":[ - 0, - 23 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1245, - "friends_count":294, - "listed_count":105, - "created_at":"Tue Feb 26 22:40:48 +0000 2008", - "favourites_count":718, - "utc_offset":-28800, - "time_zone":"Pacific Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":9107, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EEEEEE", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/2479572\/pewpewpew.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/2479572\/pewpewpew.jpg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3155587286\/dfde09ae9be7bb38f658c2fdf3890e57_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3155587286\/dfde09ae9be7bb38f658c2fdf3890e57_normal.jpeg", - "profile_link_color":"7068B4", - "profile_sidebar_border_color":"716196", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"WomenHistory", - "indices":[ - 59, - 72 - ] - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/tMRzvgrAZA", - "expanded_url":"http:\/\/fb.me\/1VBKe8YqH", - "display_url":"fb.me\/1VBKe8YqH", - "indices":[ - 114, - 136 - ] - } - ], - "user_mentions":[ - { - "screen_name":"dys_morphia", - "name":"Dysmorphia", - "id":89566127, - "id_str":"89566127", - "indices":[ - 15, - 27 - ] - }, - { - "screen_name":"calacademy", - "name":"CA AcademyOfSciences", - "id":16017753, - "id_str":"16017753", - "indices":[ - 46, - 57 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:01:16 +0000 2013", - "id":308683586461110272, - "id_str":"308683586461110272", - "text":"Got old #php code you still need to convert to namespaces? Give this tool a try: https:\/\/t.co\/Vtc8wOyuds (works on #ZF1 projects too!)", - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":13209052, - "id_str":"13209052", - "name":"Ralph Schindler", - "screen_name":"ralphschindler", - "location":"New Orleans, LA", - "description":"PHP Developer, Zender, ZFer, Hiker, Professional Eater, Nerd.", - "url":"http:\/\/ralphschindler.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/ralphschindler.com", - "expanded_url":null, - "indices":[ - 0, - 25 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2692, - "friends_count":328, - "listed_count":259, - "created_at":"Thu Feb 07 16:07:55 +0000 2008", - "favourites_count":0, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":1729, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2218255450\/_DSC4891_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2218255450\/_DSC4891_normal.jpg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":10, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 8, - 12 - ] - }, - { - "text":"ZF1", - "indices":[ - 115, - 119 - ] - } - ], - "urls":[ - { - "url":"https:\/\/t.co\/Vtc8wOyuds", - "expanded_url":"https:\/\/github.com\/ralphschindler\/Namespacer", - "display_url":"github.com\/ralphschindler\u2026", - "indices":[ - 81, - 104 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":true, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 20:59:13 +0000 2013", - "id":308683068812689409, - "id_str":"308683068812689409", - "text":"Just want to point out that @onyxfish is number 16 on this list of the 1,000 most active users on @github. https:\/\/t.co\/I112tGYm4b", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9478892, - "id_str":"9478892", - "name":"Travis Swicegood", - "screen_name":"tswicegood", - "location":"Austin, TX", - "description":"Professional Instigator, Lone Star Hacker, Director of Tech for @TexasTribune, Digital Polyglot, and Maker of Trouble.", - "url":"http:\/\/www.travisswicegood.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.travisswicegood.com", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2321, - "friends_count":487, - "listed_count":258, - "created_at":"Tue Oct 16 14:55:08 +0000 2007", - "favourites_count":2722, - "utc_offset":-21600, - "time_zone":"Central America", - "geo_enabled":true, - "verified":false, - "statuses_count":19297, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"07090B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9478892\/1362432864", - "profile_link_color":"1C1F23", - "profile_sidebar_border_color":"BFBFBF", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"336666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":{ - "id":"c3f37afa9efcf94b", - "url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/c3f37afa9efcf94b.json", - "place_type":"city", - "name":"Austin", - "full_name":"Austin, TX", - "country_code":"US", - "country":"United States", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -97.938383, - 30.098659 - ], - [ - -97.56842, - 30.098659 - ], - [ - -97.56842, - 30.49685 - ], - [ - -97.938383, - 30.49685 - ] - ] - ] - }, - "attributes":{ - - } - }, - "contributors":null, - "retweet_count":2, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"https:\/\/t.co\/I112tGYm4b", - "expanded_url":"https:\/\/gist.github.com\/paulmillr\/2657075", - "display_url":"gist.github.com\/paulmillr\/2657\u2026", - "indices":[ - 107, - 130 - ] - } - ], - "user_mentions":[ - { - "screen_name":"onyxfish", - "name":"Christopher Groskopf", - "id":32633517, - "id_str":"32633517", - "indices":[ - 28, - 37 - ] - }, - { - "screen_name":"github", - "name":"GitHub", - "id":13334762, - "id_str":"13334762", - "indices":[ - 98, - 105 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 20:58:37 +0000 2013", - "id":308682917918433282, - "id_str":"308682917918433282", - "text":"RT @AndrewBloch: A master class in customer service from Lego. Boy writes to Lego after losing a mini-figure. Here\u0027s their reply... http ...", - "source":"\u003Ca href=\u0022http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":20217800, - "id_str":"20217800", - "name":"Mark Story", - "screen_name":"mark_story", - "location":"Toronto, Ontario", - "description":"CakePHP guy, Developer at FreshBooks and moonlight designer.", - "url":"http:\/\/mark-story.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mark-story.com", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1924, - "friends_count":199, - "listed_count":193, - "created_at":"Fri Feb 06 04:58:59 +0000 2009", - "favourites_count":5, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":7681, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FFFFFF", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme2\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme2\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2917264114\/eabdb848b573a4c0b1e64c69aeadd34b_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2917264114\/eabdb848b573a4c0b1e64c69aeadd34b_normal.png", - "profile_link_color":"004875", - "profile_sidebar_border_color":"ABACAD", - "profile_sidebar_fill_color":"F5F5F5", - "profile_text_color":"640700", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Jan 07 21:16:03 +0000 2013", - "id":288393587425701888, - "id_str":"288393587425701888", - "text":"A master class in customer service from Lego. Boy writes to Lego after losing a mini-figure. Here\u0027s their reply... http:\/\/t.co\/ldoMH29j", - "source":"\u003Ca href=\u0022http:\/\/blackberry.com\/twitter\u0022 rel=\u0022nofollow\u0022\u003ETwitter for BlackBerry\u00ae\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":19062754, - "id_str":"19062754", - "name":"Andrew Bloch", - "screen_name":"AndrewBloch", - "location":"London", - "description":"Group MD and Founder of Frank PR, Marketing Magazine\u0027s PR Agency of the Year. Offices in London, Manchester, Sydney and New York. These are my personal views", - "url":"http:\/\/www.frankpr.it", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.frankpr.it", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":25726, - "friends_count":835, - "listed_count":833, - "created_at":"Fri Jan 16 11:27:33 +0000 2009", - "favourites_count":122, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":false, - "verified":false, - "statuses_count":8367, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FFFFFF", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1292466135\/AB_headshot_2509201CCC_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1292466135\/AB_headshot_2509201CCC_normal.jpg", - "profile_link_color":"695D69", - "profile_sidebar_border_color":"B8B1B8", - "profile_sidebar_fill_color":"FFFFFF", - "profile_text_color":"030303", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":18169, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ], - "media":[ - { - "id":288281355870150656, - "id_str":"288281355870150656", - "indices":[ - 115, - 135 - ], - "media_url":"http:\/\/pbs.twimg.com\/media\/BAAuXaQCIAAc3dl.jpg", - "media_url_https":"https:\/\/pbs.twimg.com\/media\/BAAuXaQCIAAc3dl.jpg", - "url":"http:\/\/t.co\/ldoMH29j", - "display_url":"pic.twitter.com\/ldoMH29j", - "expanded_url":"http:\/\/twitter.com\/simonapps\/status\/288281355861762048\/photo\/1", - "type":"photo", - "sizes":{ - "thumb":{ - "w":150, - "h":150, - "resize":"crop" - }, - "small":{ - "w":340, - "h":445, - "resize":"fit" - }, - "medium":{ - "w":500, - "h":654, - "resize":"fit" - }, - "large":{ - "w":500, - "h":654, - "resize":"fit" - } - }, - "source_status_id":288281355861762048, - "source_status_id_str":"288281355861762048" - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":18169, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"AndrewBloch", - "name":"Andrew Bloch", - "id":19062754, - "id_str":"19062754", - "indices":[ - 3, - 15 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 20:58:36 +0000 2013", - "id":308682914701377536, - "id_str":"308682914701377536", - "text":"Epic tailgating success: followed @boblord, @netik, and @tf onto the 8th floor, no badge needed.", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":302173, - "id_str":"302173", - "name":"Kitt Hodsden", - "screen_name":"kitt", - "location":"SF Bay Area, CA", - "description":"@drupal dev, @twitter eng, @hackerdojo co-founder", - "url":"http:\/\/ki.tt\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/ki.tt\/", - "expanded_url":null, - "indices":[ - 0, - 13 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1692, - "friends_count":614, - "listed_count":157, - "created_at":"Wed Dec 27 23:25:12 +0000 2006", - "favourites_count":423, - "utc_offset":-28800, - "time_zone":"Pacific Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":14400, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/268283238\/flower-red-md.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/268283238\/flower-red-md.jpg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2020233441\/http_ki_tt_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2020233441\/http_ki_tt_normal.png", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/302173\/1355344584", - "profile_link_color":"BF1111", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"boblord", - "name":"@boblord", - "id":7320972, - "id_str":"7320972", - "indices":[ - 34, - 42 - ] - }, - { - "screen_name":"netik", - "name":"John Adams", - "id":899701, - "id_str":"899701", - "indices":[ - 44, - 50 - ] - }, - { - "screen_name":"tf", - "name":"Topher Chung", - "id":14987054, - "id_str":"14987054", - "indices":[ - 56, - 59 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 20:57:47 +0000 2013", - "id":308682710300377088, - "id_str":"308682710300377088", - "text":"I\u0027m at Gezellig Thuis http:\/\/t.co\/taGMrYS7OH", - "source":"\u003Ca href=\u0022http:\/\/foursquare.com\u0022 rel=\u0022nofollow\u0022\u003Efoursquare\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9594462, - "id_str":"9594462", - "name":"Michelangelo van Dam", - "screen_name":"DragonBe", - "location":"Mechelen, Antwerp, Belgium", - "description":"Michelangelo is a senior PHP\/Zend Framework consultant, a member of the PHP community and president of the PHP user group PHPBenelux.", - "url":"http:\/\/dragonbe.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/dragonbe.com", - "expanded_url":null, - "indices":[ - 0, - 19 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2689, - "friends_count":464, - "listed_count":255, - "created_at":"Mon Oct 22 09:40:49 +0000 2007", - "favourites_count":386, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":true, - "verified":false, - "statuses_count":14908, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"1A1B1F", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2694181454\/3b0c7ca0cd31c0cc5f6984cfebc48ff2_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2694181454\/3b0c7ca0cd31c0cc5f6984cfebc48ff2_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9594462\/1354579428", - "profile_link_color":"2FC2EF", - "profile_sidebar_border_color":"181A1E", - "profile_sidebar_fill_color":"252429", - "profile_text_color":"666666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":{ - "type":"Point", - "coordinates":[ - 51.02624815, - 4.46836084 - ] - }, - "coordinates":{ - "type":"Point", - "coordinates":[ - 4.46836084, - 51.02624815 - ] - }, - "place":{ - "id":"6d6198a460e4073a", - "url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/6d6198a460e4073a.json", - "place_type":"city", - "name":"Mechelen", - "full_name":"Mechelen, Mechelen", - "country_code":"BE", - "country":"Belgium", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - 4.370328, - 50.991188 - ], - [ - 4.548736, - 50.991188 - ], - [ - 4.548736, - 51.078574 - ], - [ - 4.370328, - 51.078574 - ] - ] - ] - }, - "attributes":{ - - } - }, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/taGMrYS7OH", - "expanded_url":"http:\/\/4sq.com\/XGN6Wc", - "display_url":"4sq.com\/XGN6Wc", - "indices":[ - 22, - 44 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 20:55:10 +0000 2013", - "id":308682051668811777, - "id_str":"308682051668811777", - "text":"RT @DevWithPurpose: A little insight into us from a neutral third party http:\/\/t.co\/rhfJbzVldN via @MattChambrs", - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":4795561, - "id_str":"4795561", - "name":"Cal Evans", - "screen_name":"CalEvans", - "location":"Nashville, TN", - "description":"Author of Avoiding a Goat Rodeo: How to get the website you want http:\/\/bit.ly\/goat_rodeo Read this book before you hire a developer to build your website!", - "url":"http:\/\/blog.calevans.com\/epk", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.calevans.com\/epk", - "expanded_url":null, - "indices":[ - 0, - 28 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":5069, - "friends_count":165, - "listed_count":540, - "created_at":"Sun Apr 15 20:54:29 +0000 2007", - "favourites_count":17, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":27514, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 20:48:03 +0000 2013", - "id":308680260281565184, - "id_str":"308680260281565184", - "text":"A little insight into us from a neutral third party http:\/\/t.co\/rhfJbzVldN via @MattChambrs", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":429957007, - "id_str":"429957007", - "name":"Develop With Purpose", - "screen_name":"DevWithPurpose", - "location":"Brentwood, TN", - "description":"User experience designers. Servant-leaders. Life changers. Tweets from Dave Ramsey\u0027s Internet Development Team. ", - "url":"http:\/\/www.developwithpurpose.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.developwithpurpose.com", - "expanded_url":null, - "indices":[ - 0, - 33 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":807, - "friends_count":339, - "listed_count":23, - "created_at":"Tue Dec 06 16:03:34 +0000 2011", - "favourites_count":38, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":2858, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/442698728\/twitter_background_small.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/442698728\/twitter_background_small.jpg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1877195719\/NEW_dr_twitter_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1877195719\/NEW_dr_twitter_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/429957007\/1355245083", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/rhfJbzVldN", - "expanded_url":"http:\/\/bit.ly\/WG1uRM", - "display_url":"bit.ly\/WG1uRM", - "indices":[ - 52, - 74 - ] - } - ], - "user_mentions":[ - { - "screen_name":"MattChambrs", - "name":"Matt Chambers", - "id":131177408, - "id_str":"131177408", - "indices":[ - 79, - 91 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/rhfJbzVldN", - "expanded_url":"http:\/\/bit.ly\/WG1uRM", - "display_url":"bit.ly\/WG1uRM", - "indices":[ - 72, - 94 - ] - } - ], - "user_mentions":[ - { - "screen_name":"DevWithPurpose", - "name":"Develop With Purpose", - "id":429957007, - "id_str":"429957007", - "indices":[ - 3, - 18 - ] - }, - { - "screen_name":"MattChambrs", - "name":"Matt Chambers", - "id":131177408, - "id_str":"131177408", - "indices":[ - 99, - 111 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 20:54:07 +0000 2013", - "id":308681785867386880, - "id_str":"308681785867386880", - "text":"RT @mattwaite: Current status: http:\/\/t.co\/c3SD8rd4cl", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9478892, - "id_str":"9478892", - "name":"Travis Swicegood", - "screen_name":"tswicegood", - "location":"Austin, TX", - "description":"Professional Instigator, Lone Star Hacker, Director of Tech for @TexasTribune, Digital Polyglot, and Maker of Trouble.", - "url":"http:\/\/www.travisswicegood.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.travisswicegood.com", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2321, - "friends_count":487, - "listed_count":258, - "created_at":"Tue Oct 16 14:55:08 +0000 2007", - "favourites_count":2722, - "utc_offset":-21600, - "time_zone":"Central America", - "geo_enabled":true, - "verified":false, - "statuses_count":19297, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"07090B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9478892\/1362432864", - "profile_link_color":"1C1F23", - "profile_sidebar_border_color":"BFBFBF", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"336666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":true, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 20:32:47 +0000 2013", - "id":308676417695125504, - "id_str":"308676417695125504", - "text":"Current status: http:\/\/t.co\/c3SD8rd4cl", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":8839152, - "id_str":"8839152", - "name":"Matt Waite", - "screen_name":"mattwaite", - "location":"", - "description":"Journalism Prof. @ U of Nebraska-Lincoln, founder of Drone Journalism Lab, co-founder of Hot Type Consulting LLC, developer of PolitiFact.", - "url":"http:\/\/blog.mattwaite.com\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.mattwaite.com\/", - "expanded_url":null, - "indices":[ - 0, - 26 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":4061, - "friends_count":900, - "listed_count":402, - "created_at":"Wed Sep 12 18:53:27 +0000 2007", - "favourites_count":297, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":10919, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2635442648\/1bd6adef07a003347931a50cf0c697ec_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2635442648\/1bd6adef07a003347931a50cf0c697ec_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/8839152\/1353343654", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":null, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/c3SD8rd4cl", - "expanded_url":"http:\/\/media.tumblr.com\/tumblr_lg5suyIePF1qafrh6.gif", - "display_url":"media.tumblr.com\/tumblr_lg5suyI\u2026", - "indices":[ - 16, - 38 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/c3SD8rd4cl", - "expanded_url":"http:\/\/media.tumblr.com\/tumblr_lg5suyIePF1qafrh6.gif", - "display_url":"media.tumblr.com\/tumblr_lg5suyI\u2026", - "indices":[ - 31, - 53 - ] - } - ], - "user_mentions":[ - { - "screen_name":"mattwaite", - "name":"Matt Waite", - "id":8839152, - "id_str":"8839152", - "indices":[ - 3, - 13 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - } -] diff --git a/tests/Zend/Service/Twitter/_files/statuses.mentions_timeline.json b/tests/Zend/Service/Twitter/_files/statuses.mentions_timeline.json deleted file mode 100644 index c1ca89a9ff..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.mentions_timeline.json +++ /dev/null @@ -1,2280 +0,0 @@ -[ - { - "created_at":"Mon Mar 04 20:24:09 +0000 2013", - "id":308674244714307584, - "id_str":"308674244714307584", - "text":"Just released a #ZF2 module for using the #AWS SDK for #PHP. https:\/\/t.co\/vIaeQUxk8z. Thanks to @EvanDotPro and @mwop for the help.", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":17316566, - "id_str":"17316566", - "name":"Jeremy Lindblom", - "screen_name":"jeremeamia", - "location":"Seattle, WA", - "description":"PHP software engineer and web application developer. I work for Amazon Web Services on the AWS SDK for PHP.", - "url":"http:\/\/t.co\/uEvnF4aJ", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/uEvnF4aJ", - "expanded_url":"http:\/\/github.com\/jeremeamia", - "display_url":"github.com\/jeremeamia", - "indices":[ - 0, - 20 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":315, - "friends_count":420, - "listed_count":22, - "created_at":"Tue Nov 11 19:05:35 +0000 2008", - "favourites_count":20, - "utc_offset":-28800, - "time_zone":"Pacific Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":1332, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1672009461\/profile-JCL-DEC2011_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1672009461\/profile-JCL-DEC2011_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/17316566\/1355869161", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"ZF2", - "indices":[ - 16, - 20 - ] - }, - { - "text":"AWS", - "indices":[ - 42, - 46 - ] - }, - { - "text":"PHP", - "indices":[ - 55, - 59 - ] - } - ], - "urls":[ - { - "url":"https:\/\/t.co\/vIaeQUxk8z", - "expanded_url":"https:\/\/github.com\/aws\/aws-sdk-php-zf2", - "display_url":"github.com\/aws\/aws-sdk-ph\u2026", - "indices":[ - 61, - 84 - ] - } - ], - "user_mentions":[ - { - "screen_name":"EvanDotPro", - "name":"Evan Coury", - "id":25562030, - "id_str":"25562030", - "indices":[ - 96, - 107 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 112, - 117 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 20:05:42 +0000 2013", - "id":308669601007415296, - "id_str":"308669601007415296", - "text":"@mwop birmingham AL. Great race! Little rock yesterday! I ran in the sunshine! I miss the sun!", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/android\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Android\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308566841951936513, - "in_reply_to_status_id_str":"308566841951936513", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":311531420, - "id_str":"311531420", - "name":"Laura Raeder", - "screen_name":"LauraRaeder", - "location":"", - "description":"", - "url":null, - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":122, - "friends_count":163, - "listed_count":8, - "created_at":"Sun Jun 05 16:24:19 +0000 2011", - "favourites_count":309, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":252, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1473090685\/GetAttachment_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1473090685\/GetAttachment_normal.jpg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 19:31:57 +0000 2013", - "id":308661108670095361, - "id_str":"308661108670095361", - "text":"@mwop hey I could use your help with creating a form view helper for rendering dojo dijits in zf2, can you give me a poke next time your on?", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":45822226, - "id_str":"45822226", - "name":"Gabriel Baker", - "screen_name":"gabriel403", - "location":"In the cloud somewhere", - "description":"Web dev, linux admin, caffeine addict, not totally insane", - "url":"http:\/\/autonomicpilot.co.uk", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/autonomicpilot.co.uk", - "expanded_url":null, - "indices":[ - 0, - 27 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":68, - "friends_count":116, - "listed_count":3, - "created_at":"Tue Jun 09 12:08:08 +0000 2009", - "favourites_count":8, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":1562, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"000000", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/762798122\/0d0b9ded3ede183c30b139fe63bf6d05.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/762798122\/0d0b9ded3ede183c30b139fe63bf6d05.jpeg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/466145515\/bois_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/466145515\/bois_normal.jpg", - "profile_link_color":"135257", - "profile_sidebar_border_color":"000000", - "profile_sidebar_fill_color":"0E0E0E", - "profile_text_color":"4A66C1", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 18:08:53 +0000 2013", - "id":308640205311729664, - "id_str":"308640205311729664", - "text":"@mwop where is this class you speak of? \/cc @nelstrom", - "source":"web", - "truncated":false, - "in_reply_to_status_id":308622045367898113, - "in_reply_to_status_id_str":"308622045367898113", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":18636940, - "id_str":"18636940", - "name":"Mike Willbanks", - "screen_name":"mwillbanks", - "location":"San Jose, CA", - "description":"Sr. Web Architect Mgr; high performance, high availability, php", - "url":"http:\/\/blog.digitalstruct.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.digitalstruct.com", - "expanded_url":null, - "indices":[ - 0, - 29 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":427, - "friends_count":171, - "listed_count":46, - "created_at":"Mon Jan 05 16:58:02 +0000 2009", - "favourites_count":9, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":2117, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EDECE9", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1269296213\/mwillbanks-php-logo_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1269296213\/mwillbanks-php-logo_normal.png", - "profile_link_color":"088253", - "profile_sidebar_border_color":"D3D2CF", - "profile_sidebar_fill_color":"E3E2DE", - "profile_text_color":"634047", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - }, - { - "screen_name":"nelstrom", - "name":"Drew Neil", - "id":9252942, - "id_str":"9252942", - "indices":[ - 44, - 53 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 13:52:16 +0000 2013", - "id":308575624564445186, - "id_str":"308575624564445186", - "text":"@tswicegood That\u0027s strike one. \/cc @mwop @CalEvans", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308564908407136256, - "in_reply_to_status_id_str":"308564908407136256", - "in_reply_to_user_id":9478892, - "in_reply_to_user_id_str":"9478892", - "in_reply_to_screen_name":"tswicegood", - "user":{ - "id":9207672, - "id_str":"9207672", - "name":"Nate Abele", - "screen_name":"nateabele", - "location":"Philadelphia, PA", - "description":"Maker of invisible cathedrals (i.e. #Li3); passionate about freedom \u0026 breaking down barriers; privileged to work with awesome people at @radify (Photo: @coates)", - "url":"http:\/\/nateabele.com\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/nateabele.com\/", - "expanded_url":null, - "indices":[ - 0, - 21 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2245, - "friends_count":125, - "listed_count":331, - "created_at":"Tue Oct 02 14:21:06 +0000 2007", - "favourites_count":198, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":11621, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"6D8F71", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1584454244\/IMG_5100_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1584454244\/IMG_5100_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9207672\/1353516436", - "profile_link_color":"1E27A6", - "profile_sidebar_border_color":"00570A", - "profile_sidebar_fill_color":"8D968F", - "profile_text_color":"000000", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 0, - 11 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 35, - 40 - ] - }, - { - "screen_name":"CalEvans", - "name":"Cal Evans", - "id":4795561, - "id_str":"4795561", - "indices":[ - 41, - 50 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 13:21:26 +0000 2013", - "id":308567864758128640, - "id_str":"308567864758128640", - "text":"@tswicegood @mwop Couldn\u0027t have said it better myself! :)", - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308564908407136256, - "in_reply_to_status_id_str":"308564908407136256", - "in_reply_to_user_id":9478892, - "in_reply_to_user_id_str":"9478892", - "in_reply_to_screen_name":"tswicegood", - "user":{ - "id":4795561, - "id_str":"4795561", - "name":"Cal Evans", - "screen_name":"CalEvans", - "location":"Nashville, TN", - "description":"Author of Avoiding a Goat Rodeo: How to get the website you want http:\/\/bit.ly\/goat_rodeo Read this book before you hire a developer to build your website!", - "url":"http:\/\/blog.calevans.com\/epk", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.calevans.com\/epk", - "expanded_url":null, - "indices":[ - 0, - 28 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":5069, - "friends_count":165, - "listed_count":540, - "created_at":"Sun Apr 15 20:54:29 +0000 2007", - "favourites_count":17, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":27514, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 0, - 11 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 12, - 17 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 13:09:41 +0000 2013", - "id":308564908407136256, - "id_str":"308564908407136256", - "text":"Actually, yes. \ud83d\ude03 RT @mwop: @tswicegood channeling your inner @CalEvans this morning?", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9478892, - "id_str":"9478892", - "name":"Travis Swicegood", - "screen_name":"tswicegood", - "location":"Austin, TX", - "description":"Professional Instigator, Lone Star Hacker, Director of Tech for @TexasTribune, Digital Polyglot, and Maker of Trouble.", - "url":"http:\/\/www.travisswicegood.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.travisswicegood.com", - "expanded_url":null, - "indices":[ - 0, - 30 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2321, - "friends_count":487, - "listed_count":258, - "created_at":"Tue Oct 16 14:55:08 +0000 2007", - "favourites_count":2722, - "utc_offset":-21600, - "time_zone":"Central America", - "geo_enabled":true, - "verified":false, - "statuses_count":19297, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"07090B", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/561552939\/x7f4c8953e6e4bd4e1c3c3de2a384a54.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3165761278\/a2b009e6e0760b4e3234770b6fc0b4d0_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9478892\/1362432864", - "profile_link_color":"1C1F23", - "profile_sidebar_border_color":"BFBFBF", - "profile_sidebar_fill_color":"EEEEEE", - "profile_text_color":"336666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 20, - 25 - ] - }, - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 27, - 38 - ] - }, - { - "screen_name":"CalEvans", - "name":"Cal Evans", - "id":4795561, - "id_str":"4795561", - "indices":[ - 61, - 70 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 09:55:43 +0000 2013", - "id":308516094228959232, - "id_str":"308516094228959232", - "text":"@JurajSeffer You know... I haven\u2019t a clue! Maybe @mwop knows?", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308512685392293889, - "in_reply_to_status_id_str":"308512685392293889", - "in_reply_to_user_id":428573303, - "in_reply_to_user_id_str":"428573303", - "in_reply_to_screen_name":"JurajSeffer", - "user":{ - "id":9244712, - "id_str":"9244712", - "name":"Rob Allen", - "screen_name":"akrabat", - "location":"Worcester, UK", - "description":"Author of Zend Framework in Action. Husband. Father of two sons. Creator of Daily Jotter for Mac", - "url":"http:\/\/akrabat.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/akrabat.com", - "expanded_url":null, - "indices":[ - 0, - 18 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":4198, - "friends_count":251, - "listed_count":416, - "created_at":"Thu Oct 04 14:08:31 +0000 2007", - "favourites_count":420, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":13020, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"JurajSeffer", - "name":"Juraj Seffer", - "id":428573303, - "id_str":"428573303", - "indices":[ - 0, - 12 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 49, - 54 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sun Mar 03 13:31:24 +0000 2013", - "id":308207987015688193, - "id_str":"308207987015688193", - "text":"actually, i think services and mappers being explicitly mentioned now help avoiding fat controllers typical of #zf1 .. @mwop @jkeppens", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/#!\/download\/ipad\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPad\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308202765698609152, - "in_reply_to_status_id_str":"308202765698609152", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":132493534, - "id_str":"132493534", - "name":"Steve Maraspin", - "screen_name":"maraspin", - "location":"Udine, Italy", - "description":"Software Engineer, @mvassociati Managing Partner. Interested in User Centred Software Development and Web Architectures. MSc, #pug Friuli founder, PHP5 ZCE", - "url":"http:\/\/steve.maraspin.net", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/steve.maraspin.net", - "expanded_url":null, - "indices":[ - 0, - 25 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":421, - "friends_count":540, - "listed_count":13, - "created_at":"Tue Apr 13 11:34:18 +0000 2010", - "favourites_count":579, - "utc_offset":3600, - "time_zone":"Rome", - "geo_enabled":true, - "verified":false, - "statuses_count":1596, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"1A1B1F", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/819610274\/steve_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/819610274\/steve_normal.jpg", - "profile_link_color":"2FC2EF", - "profile_sidebar_border_color":"181A1E", - "profile_sidebar_fill_color":"252429", - "profile_text_color":"666666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"zf1", - "indices":[ - 111, - 115 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 119, - 124 - ] - }, - { - "screen_name":"jkeppens", - "name":"Jeroen Keppens", - "id":15749095, - "id_str":"15749095", - "indices":[ - 125, - 134 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sun Mar 03 13:17:43 +0000 2013", - "id":308204540845494272, - "id_str":"308204540845494272", - "text":"@mwop sure.", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308203463685308417, - "in_reply_to_status_id_str":"308203463685308417", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":4600051, - "id_str":"4600051", - "name":"Till!", - "screen_name":"klimpong", - "location":"Berlin, Germany", - "description":"Most of this is SFW, unless it isn\u0027t. My book on CouchDB: http:\/\/t.co\/s1VAk1le (German)", - "url":"http:\/\/till.klampaeckel.de\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/till.klampaeckel.de\/", - "expanded_url":null, - "indices":[ - 0, - 27 - ] - } - ] - }, - "description":{ - "urls":[ - { - "url":"http:\/\/t.co\/s1VAk1le", - "expanded_url":"http:\/\/bit.ly\/couchdbbuch", - "display_url":"bit.ly\/couchdbbuch", - "indices":[ - 58, - 78 - ] - } - ] - } - }, - "protected":false, - "followers_count":1267, - "friends_count":322, - "listed_count":92, - "created_at":"Sat Apr 14 13:09:04 +0000 2007", - "favourites_count":1630, - "utc_offset":3600, - "time_zone":"Berlin", - "geo_enabled":true, - "verified":false, - "statuses_count":22122, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AC2E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/1790412\/2198002194_aa7845d082_b.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/1790412\/2198002194_aa7845d082_b.jpg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/18810092\/till_avatar_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/18810092\/till_avatar_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/4600051\/1353200308", - "profile_link_color":"0071FF", - "profile_sidebar_border_color":"BC444C", - "profile_sidebar_fill_color":"FFE292", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sun Mar 03 11:30:22 +0000 2013", - "id":308177525094367233, - "id_str":"308177525094367233", - "text":"@mwop Sorry, just saw your msgs on IRC. As soon as @naderman\u0027s PR is merged, we should be able to have this in satis. Heavily testing it.", - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":4600051, - "id_str":"4600051", - "name":"Till!", - "screen_name":"klimpong", - "location":"Berlin, Germany", - "description":"Most of this is SFW, unless it isn\u0027t. My book on CouchDB: http:\/\/t.co\/s1VAk1le (German)", - "url":"http:\/\/till.klampaeckel.de\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/till.klampaeckel.de\/", - "expanded_url":null, - "indices":[ - 0, - 27 - ] - } - ] - }, - "description":{ - "urls":[ - { - "url":"http:\/\/t.co\/s1VAk1le", - "expanded_url":"http:\/\/bit.ly\/couchdbbuch", - "display_url":"bit.ly\/couchdbbuch", - "indices":[ - 58, - 78 - ] - } - ] - } - }, - "protected":false, - "followers_count":1267, - "friends_count":322, - "listed_count":92, - "created_at":"Sat Apr 14 13:09:04 +0000 2007", - "favourites_count":1630, - "utc_offset":3600, - "time_zone":"Berlin", - "geo_enabled":true, - "verified":false, - "statuses_count":22122, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AC2E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/1790412\/2198002194_aa7845d082_b.jpg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/1790412\/2198002194_aa7845d082_b.jpg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/18810092\/till_avatar_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/18810092\/till_avatar_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/4600051\/1353200308", - "profile_link_color":"0071FF", - "profile_sidebar_border_color":"BC444C", - "profile_sidebar_fill_color":"FFE292", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - }, - { - "screen_name":"naderman", - "name":"Nils Adermann", - "id":11754222, - "id_str":"11754222", - "indices":[ - 51, - 60 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:44:28 +0000 2013", - "id":307954582540128256, - "id_str":"307954582540128256", - "text":"@mwop thanks, I am going to expand on it with ServiceManager and a few others too", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307947937374281728, - "in_reply_to_status_id_str":"307947937374281728", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":455064907, - "id_str":"455064907", - "name":"Phil Bennett", - "screen_name":"philipobenito", - "location":"Barnsley", - "description":"All round geek. PHP \u0026 JavaScript developer from South Yorkshire, UK.", - "url":"http:\/\/t.co\/mlcS2bJfKY", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/mlcS2bJfKY", - "expanded_url":"http:\/\/www.happyaccidents.me", - "display_url":"happyaccidents.me", - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":53, - "friends_count":284, - "listed_count":0, - "created_at":"Wed Jan 04 18:01:43 +0000 2012", - "favourites_count":34, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":446, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FAFAFA", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/457050252\/bright_squares1.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/457050252\/bright_squares1.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3069420538\/1e64cae5738fdf7d28f1e90b7fcce4bf_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3069420538\/1e64cae5738fdf7d28f1e90b7fcce4bf_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/455064907\/1360758888", - "profile_link_color":"475F78", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":{ - "id":"b9ba2ac0df3f6ab5", - "url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/b9ba2ac0df3f6ab5.json", - "place_type":"city", - "name":"Barnsley", - "full_name":"Barnsley, Barnsley", - "country_code":"GB", - "country":"United Kingdom", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -1.822589, - 53.438297 - ], - [ - -1.275751, - 53.438297 - ], - [ - -1.275751, - 53.612815 - ], - [ - -1.822589, - 53.612815 - ] - ] - ] - }, - "attributes":{ - - } - }, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:34:13 +0000 2013", - "id":307952000451092481, - "id_str":"307952000451092481", - "text":"@akrabat @mwop I was wondering why I was prompted :)", - "source":"\u003Ca href=\u0022http:\/\/itunes.apple.com\/us\/app\/twitter\/id409789998?mt=12\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307949055844179969, - "in_reply_to_status_id_str":"307949055844179969", - "in_reply_to_user_id":9244712, - "in_reply_to_user_id_str":"9244712", - "in_reply_to_screen_name":"akrabat", - "user":{ - "id":11990012, - "id_str":"11990012", - "name":"Wil Moore III", - "screen_name":"wilmoore", - "location":"Colorado", - "description":"Christ follower, Full-Stack Web Application Craftsman and advocates for TDD, Devops, Peer Review, and Relentless Mentorship.", - "url":"http:\/\/github.com\/wilmoore", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/github.com\/wilmoore", - "expanded_url":null, - "indices":[ - 0, - 26 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":516, - "friends_count":1858, - "listed_count":24, - "created_at":"Tue Jan 08 16:30:16 +0000 2008", - "favourites_count":414, - "utc_offset":-25200, - "time_zone":"Mountain Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":1605, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2432334449\/7d97opore0cqhv1yvd4z_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2432334449\/7d97opore0cqhv1yvd4z_normal.jpeg", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"akrabat", - "name":"Rob Allen", - "id":9244712, - "id_str":"9244712", - "indices":[ - 0, - 8 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 9, - 14 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:22:30 +0000 2013", - "id":307949055844179969, - "id_str":"307949055844179969", - "text":"@mwop I had it opened - it notified me that my password had changed... First I had heard and was a bit \u201cWTF?!\u201d", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/software\/tweetbot\/mac\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for Mac\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307944603007475712, - "in_reply_to_status_id_str":"307944603007475712", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":9244712, - "id_str":"9244712", - "name":"Rob Allen", - "screen_name":"akrabat", - "location":"Worcester, UK", - "description":"Author of Zend Framework in Action. Husband. Father of two sons. Creator of Daily Jotter for Mac", - "url":"http:\/\/akrabat.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/akrabat.com", - "expanded_url":null, - "indices":[ - 0, - 18 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":4198, - "friends_count":251, - "listed_count":416, - "created_at":"Thu Oct 04 14:08:31 +0000 2007", - "favourites_count":420, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":13020, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "profile_link_color":"009999", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:14:13 +0000 2013", - "id":307946970448801793, - "id_str":"307946970448801793", - "text":"Sitting on the bus reading this from @mwop. I really hope this isn\u0027t the beginning of the end of PHP-FIG http:\/\/t.co\/lb518zJkse", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":19536633, - "id_str":"19536633", - "name":"Jamie Hurst", - "screen_name":"JamieFDHurst", - "location":"Washington, Tyne and Wear, UK", - "description":"PHP web dev at @HurstDEV; engaged to @YajunWei; attendee\/helper at @phpNE; commonly found listening to daft music and attending pubs. Whingy sod.", - "url":"http:\/\/www.jamiehurst.co.uk\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.jamiehurst.co.uk\/", - "expanded_url":null, - "indices":[ - 0, - 28 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":786, - "friends_count":555, - "listed_count":35, - "created_at":"Mon Jan 26 14:35:51 +0000 2009", - "favourites_count":22, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":13454, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"1A1B1F", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1644989727\/3d7383fc4945a769cfff46653671bd1f_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1644989727\/3d7383fc4945a769cfff46653671bd1f_normal.png", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/19536633\/1359903435", - "profile_link_color":"2FC2EF", - "profile_sidebar_border_color":"181A1E", - "profile_sidebar_fill_color":"252429", - "profile_text_color":"666666", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/lb518zJkse", - "expanded_url":"http:\/\/www.mwop.net\/blog\/2013-02-27-resigned-from-php-fig.html", - "display_url":"mwop.net\/blog\/2013-02-2\u2026", - "indices":[ - 105, - 127 - ] - } - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 37, - 42 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Sat Mar 02 16:39:14 +0000 2013", - "id":307892867731427329, - "id_str":"307892867731427329", - "text":"Benchmarking Dependency Injection Containers http:\/\/t.co\/TCwUhpRsTU \/cc @mwop @taylorotwell @fabpot", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":455064907, - "id_str":"455064907", - "name":"Phil Bennett", - "screen_name":"philipobenito", - "location":"Barnsley", - "description":"All round geek. PHP \u0026 JavaScript developer from South Yorkshire, UK.", - "url":"http:\/\/t.co\/mlcS2bJfKY", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/mlcS2bJfKY", - "expanded_url":"http:\/\/www.happyaccidents.me", - "display_url":"happyaccidents.me", - "indices":[ - 0, - 22 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":53, - "friends_count":284, - "listed_count":0, - "created_at":"Wed Jan 04 18:01:43 +0000 2012", - "favourites_count":34, - "utc_offset":0, - "time_zone":"London", - "geo_enabled":true, - "verified":false, - "statuses_count":446, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"FAFAFA", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/457050252\/bright_squares1.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/457050252\/bright_squares1.png", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3069420538\/1e64cae5738fdf7d28f1e90b7fcce4bf_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3069420538\/1e64cae5738fdf7d28f1e90b7fcce4bf_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/455064907\/1360758888", - "profile_link_color":"475F78", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":1, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/TCwUhpRsTU", - "expanded_url":"http:\/\/happyaccidents.me\/blog\/benchmarking-dependency-injection-containers", - "display_url":"happyaccidents.me\/blog\/benchmark\u2026", - "indices":[ - 45, - 67 - ] - } - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 72, - 77 - ] - }, - { - "screen_name":"taylorotwell", - "name":"Taylor Otwell", - "id":28870687, - "id_str":"28870687", - "indices":[ - 78, - 91 - ] - }, - { - "screen_name":"fabpot", - "name":"Fabien Potencier", - "id":15072316, - "id_str":"15072316", - "indices":[ - 92, - 99 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Sat Mar 02 02:50:23 +0000 2013", - "id":307684279247319040, - "id_str":"307684279247319040", - "text":"On PHP-FIG :: phly, boy, phly http:\/\/t.co\/0w7ONZNYzv via @mwop", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/android\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Android\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":15685803, - "id_str":"15685803", - "name":"Jeremiah Small", - "screen_name":"jeremiahsmall", - "location":"Altadena, CA", - "description":"", - "url":"http:\/\/jsmall.us", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/jsmall.us", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":40, - "friends_count":68, - "listed_count":1, - "created_at":"Fri Aug 01 05:02:08 +0000 2008", - "favourites_count":3, - "utc_offset":-28800, - "time_zone":"Pacific Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":127, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"B2DFDA", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme13\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme13\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/756248431\/js_profile_icon_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/756248431\/js_profile_icon_normal.jpg", - "profile_link_color":"93A644", - "profile_sidebar_border_color":"EEEEEE", - "profile_sidebar_fill_color":"FFFFFF", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":{ - "type":"Point", - "coordinates":[ - 34.1956833, - -118.11858767 - ] - }, - "coordinates":{ - "type":"Point", - "coordinates":[ - -118.11858767, - 34.1956833 - ] - }, - "place":{ - "id":"fb76b3aa366004c9", - "url":"https:\/\/api.twitter.com\/1.1\/geo\/id\/fb76b3aa366004c9.json", - "place_type":"city", - "name":"Altadena", - "full_name":"Altadena, CA", - "country_code":"US", - "country":"United States", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -118.177575, - 34.16765 - ], - [ - -118.094903, - 34.16765 - ], - [ - -118.094903, - 34.220091 - ], - [ - -118.177575, - 34.220091 - ] - ] - ] - }, - "attributes":{ - - } - }, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/0w7ONZNYzv", - "expanded_url":"http:\/\/www.mwop.net\/blog\/2013-02-27-resigned-from-php-fig.html", - "display_url":"mwop.net\/blog\/2013-02-2\u2026", - "indices":[ - 30, - 52 - ] - } - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 57, - 62 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Fri Mar 01 23:48:34 +0000 2013", - "id":307638523610161153, - "id_str":"307638523610161153", - "text":"@mwop you and me both! couldn\u0027t get away :( \/cc @SaraMG", - "source":"web", - "truncated":false, - "in_reply_to_status_id":307567084462800896, - "in_reply_to_status_id_str":"307567084462800896", - "in_reply_to_user_id":9453382, - "in_reply_to_user_id_str":"9453382", - "in_reply_to_screen_name":"mwop", - "user":{ - "id":18636940, - "id_str":"18636940", - "name":"Mike Willbanks", - "screen_name":"mwillbanks", - "location":"San Jose, CA", - "description":"Sr. Web Architect Mgr; high performance, high availability, php", - "url":"http:\/\/blog.digitalstruct.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.digitalstruct.com", - "expanded_url":null, - "indices":[ - 0, - 29 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":427, - "friends_count":171, - "listed_count":46, - "created_at":"Mon Jan 05 16:58:02 +0000 2009", - "favourites_count":9, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":true, - "verified":false, - "statuses_count":2117, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EDECE9", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme3\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1269296213\/mwillbanks-php-logo_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1269296213\/mwillbanks-php-logo_normal.png", - "profile_link_color":"088253", - "profile_sidebar_border_color":"D3D2CF", - "profile_sidebar_fill_color":"E3E2DE", - "profile_text_color":"634047", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 0, - 5 - ] - }, - { - "screen_name":"SaraMG", - "name":"SaraMG", - "id":8295352, - "id_str":"8295352", - "indices":[ - 49, - 56 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Fri Mar 01 22:34:57 +0000 2013", - "id":307619996945752065, - "id_str":"307619996945752065", - "text":"@jcarouth Ha! Wasn\u0027t really much of choice, mainly done out of necessity. \/cc @mwop", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/tweetbutton\u0022 rel=\u0022nofollow\u0022\u003ETweet Button\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307619370950090752, - "in_reply_to_status_id_str":"307619370950090752", - "in_reply_to_user_id":12731142, - "in_reply_to_user_id_str":"12731142", - "in_reply_to_screen_name":"jcarouth", - "user":{ - "id":10909812, - "id_str":"10909812", - "name":"Bradley Holt", - "screen_name":"BradleyHolt", - "location":"Burlington, VT", - "description":"@FoundLine Co-Founder; @BTVGig @NEPHP @VTCodeCamp organizer; @VERMONTCAM @btvwag Board Member; #SXSWi #OSCON #jqcon #ZendCon speaker; @OReillyMedia author", - "url":"http:\/\/bradley-holt.com\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/bradley-holt.com\/", - "expanded_url":null, - "indices":[ - 0, - 24 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":1322, - "friends_count":437, - "listed_count":143, - "created_at":"Thu Dec 06 17:37:04 +0000 2007", - "favourites_count":1, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":9435, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"EBEBEB", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme7\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme7\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2866448717\/2b0a7540cd2a1b0ce8449a0408b4e4a3_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2866448717\/2b0a7540cd2a1b0ce8449a0408b4e4a3_normal.jpeg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/10909812\/1353274114", - "profile_link_color":"990000", - "profile_sidebar_border_color":"DFDFDF", - "profile_sidebar_fill_color":"F3F3F3", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"jcarouth", - "name":"Jeff Carouth", - "id":12731142, - "id_str":"12731142", - "indices":[ - 0, - 9 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 78, - 83 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Fri Mar 01 22:32:27 +0000 2013", - "id":307619370950090752, - "id_str":"307619370950090752", - "text":"@BradleyHolt You are the smartest of all of us for that. \/cc @mwop", - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/android\u0022 rel=\u0022nofollow\u0022\u003ETwitter for Android\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307618414413893632, - "in_reply_to_status_id_str":"307618414413893632", - "in_reply_to_user_id":10909812, - "in_reply_to_user_id_str":"10909812", - "in_reply_to_screen_name":"BradleyHolt", - "user":{ - "id":12731142, - "id_str":"12731142", - "name":"Jeff Carouth", - "screen_name":"jcarouth", - "location":"College Station, Texas, USA", - "description":"Web and mobile developer. Liftopian (@liftopia). Co-Organzier of #bcsphp. Food fanatic. ", - "url":"http:\/\/carouth.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/carouth.com", - "expanded_url":null, - "indices":[ - 0, - 18 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":612, - "friends_count":144, - "listed_count":49, - "created_at":"Sat Jan 26 21:55:40 +0000 2008", - "favourites_count":154, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":7905, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"131516", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/711094417\/ed049140086102868773707bddce9943.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/711094417\/ed049140086102868773707bddce9943.jpeg", - "profile_background_tile":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2963153528\/893067fe8709c631f0d1ae7a3303aa31_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2963153528\/893067fe8709c631f0d1ae7a3303aa31_normal.jpeg", - "profile_link_color":"009999", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"EFEFEF", - "profile_text_color":"333333", - "profile_use_background_image":false, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"BradleyHolt", - "name":"Bradley Holt", - "id":10909812, - "id_str":"10909812", - "indices":[ - 0, - 12 - ] - }, - { - "screen_name":"mwop", - "name":"weierophinney", - "id":9453382, - "id_str":"9453382", - "indices":[ - 61, - 66 - ] - } - ] - }, - "favorited":false, - "retweeted":false - } -] diff --git a/tests/Zend/Service/Twitter/_files/statuses.sample.json b/tests/Zend/Service/Twitter/_files/statuses.sample.json deleted file mode 100644 index 23f8944c74..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.sample.json +++ /dev/null @@ -1,1534 +0,0 @@ -[ - { - "contributors": null, - "coordinates": { - "coordinates": [ - -90.532719, - 19.830304 - ], - "type": "Point" - }, - "created_at": "Sun May 30 00:31:38 +0000 2010", - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://myloc.me/7AsT6", - "indices": [ - 28, - 48 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "geo": null, - "id": 15007779000, - "id_str": "15007779000", - "in_reply_to_screen_name": null, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "source": "UberTwitter", - "text": "Vamos x la 2da peliculita http://myloc.me/7AsT6", - "truncated": false, - "user": { - "contributors_enabled": false, - "created_at": "Wed Sep 30 02:10:26 +0000 2009", - "default_profile": false, - "default_profile_image": false, - "description": null, - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "favourites_count": 1, - "followers_count": 118, - "following": false, - "follow_request_sent": false, - "friends_count": 238, - "geo_enabled": true, - "id": 78485547, - "id_str": "78485547", - "is_translator": false, - "lang": "es", - "listed_count": 0, - "location": "ÃœT: 19.830304,-90.532719", - "name": "veronica martinez", - "notifications": false, - "profile_background_color": "DBE9ED", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme17/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme17/bg.gif", - "profile_background_tile": false, - "profile_image_url": "http://a1.twimg.com/profile_images/825836252/DSCF3118_normal.JPG", - "profile_image_url_https": "https://si1.twimg.com/profile_images/825836252/DSCF3118_normal.JPG", - "profile_link_color": "CC3366", - "profile_sidebar_border_color": "DBE9ED", - "profile_sidebar_fill_color": "E6F6F9", - "profile_text_color": 333333, - "profile_use_background_image": true, - "protected": false, - "screen_name": "PillitaMartinez", - "show_all_inline_media": false, - "statuses_count": 1163, - "time_zone": "Central Time (US & Canada)", - "url": null, - "utc_offset": "-21600", - "verified": false - } - }, - { - "created_at": "Sun May 30 00:31:37 +0000 2010", - "id": 15007778000, - "id_str": "15007778000", - "text": "vh1 classic es una buena forma de matar el aburrimiento o de despertar de una siesta", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 27191178, - "id_str": "27191178", - "name": "sinistro iturralde", - "screen_name": "sinistrobjj", - "show_all_inline_media": false, - "location": "arround the world", - "default_profile": false, - "default_profile_image": false, - "description": "multiple times BJJ WORLD CHAMP", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/879992980/28159_413740013932_591928932_5147275_6661219_n_1__normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/879992980/28159_413740013932_591928932_5147275_6661219_n_1__normal.jpg", - "url": "http://www.alliance-ecuador.blogspot.com", - "protected": false, - "followers_count": 99, - "profile_background_color": "1A1B1F", - "profile_text_color": 666666, - "profile_use_background_image": true, - "profile_link_color": "2FC2EF", - "profile_sidebar_fill_color": 252429, - "profile_sidebar_border_color": "181A1E", - "friends_count": 89, - "created_at": "Sat Mar 28 06:25:43 +0000 2009", - "favourites_count": 2, - "utc_offset": "-21600", - "time_zone": "Central Time (US & Canada)", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/50908903/_MG_4623.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/50908903/_MG_4623.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": true, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 945, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:35 +0000 2010", - "id": 15007777000, - "id_str": "15007777000", - "text": "at home watching eurovision missed it so yea :/ :L lol haha", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 63556065, - "id_str": "63556065", - "name": "rebekah n", - "screen_name": "destinyxcyrus", - "show_all_inline_media": false, - "location": null, - "default_profile": false, - "default_profile_image": false, - "description": null, - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/930881677/100410_172128_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/930881677/100410_172128_normal.jpg", - "url": null, - "protected": false, - "followers_count": 24, - "profile_background_color": 131516, - "profile_text_color": 333333, - "profile_use_background_image": true, - "profile_link_color": "009999", - "profile_sidebar_fill_color": "efefef", - "profile_sidebar_border_color": "eeeeee", - "friends_count": 67, - "created_at": "Thu Aug 06 22:11:37 +0000 2009", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/67769949/zwbra7.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/67769949/zwbra7.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 458, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:31 +0000 2010", - "id": 15007774000, - "id_str": "15007774000", - "text": "Milhares de pessoas prestigiam lançamento do programa Minha Casa, Minha Vida em Juazeiro. www.sertaocentral.com.br", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://www.sertaocentral.com.br", - "indices": [ - 92, - 115 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 79738493, - "id_str": "79738493", - "name": "Site Sertão Central", - "screen_name": "sertao_central", - "show_all_inline_media": false, - "location": "Brasil", - "default_profile": false, - "default_profile_image": false, - "description": "Higo Carlos", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/661970544/logo_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/661970544/logo_normal.jpg", - "url": "http://www.sertaocentral.com.br", - "protected": false, - "followers_count": 761, - "profile_background_color": "022330", - "profile_text_color": 333333, - "profile_use_background_image": true, - "profile_link_color": "0084B4", - "profile_sidebar_fill_color": "C0DFEC", - "profile_sidebar_border_color": "a8c7f7", - "friends_count": 1996, - "created_at": "Sun Oct 04 14:12:27 +0000 2009", - "favourites_count": 6, - "utc_offset": "-14400", - "time_zone": "Santiago", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/44248325/higo.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/44248325/higo.jpg", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 1126, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:30 +0000 2010", - "id": 15007773000, - "id_str": "15007773000", - "text": "Wonderin why my nipple hurtin my dumb ass had money stuck in my ring lmao*", - "source": "Twitter for BlackBerry®", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 127754413, - "id_str": "127754413", - "name": "*Coco*", - "screen_name": "thiicknic69", - "show_all_inline_media": false, - "location": "Harlem home of the Greatest*", - "default_profile": false, - "default_profile_image": false, - "description": "Bad chocolate bitch nuff said* href=http://mylikes.com/signup?token=thiicknic69img src=http://mylikes.com/images/mylikes125.png//", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/880181726/100391586_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/880181726/100391586_normal.jpg", - "url": "http://null", - "protected": false, - "followers_count": 366, - "profile_background_color": "C0DEED", - "profile_text_color": 333333, - "profile_use_background_image": true, - "profile_link_color": "0084B4", - "profile_sidebar_fill_color": "DDEEF6", - "profile_sidebar_border_color": "C0DEED", - "friends_count": 360, - "created_at": "Tue Mar 30 04:10:19 +0000 2010", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/88880974/Jan23_014.jpg", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/88880974/Jan23_014.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 4170, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:29 +0000 2010", - "id": 15007772000, - "id_str": "15007772000", - "text": "ãƒãƒ«ãƒ”ン・トゥルルルソン?", - "source": "API", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 128592391, - "id_str": "128592391", - "name": "ピザã¾ã‚“", - "screen_name": "pizaman_", - "show_all_inline_media": false, - "location": "ã›ã„ã‚", - "default_profile": false, - "default_profile_image": false, - "description": "è’¸ã—ãŸã¦ã‚ã¤ã‚ã¤ã®ãƒ”ザã¾ã‚“ã ã‚ˆï¼ã€è‡ªå‹•botã§ã™ã€‚ãªã«ã‹ã‚ã‚Šã¾ã—ãŸã‚‰DMã‚’ãŠé€ã‚Šãã ã•ã„】", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/790683386/o0350046010331203264_1__normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/790683386/o0350046010331203264_1__normal.jpg", - "url": "http://pleurer.web.fc2.com/newdir/pizaman.html", - "protected": false, - "followers_count": 89, - "profile_background_color": "9ae4e8", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "0000ff", - "profile_sidebar_fill_color": "e0ff92", - "profile_sidebar_border_color": "87bc44", - "friends_count": 93, - "created_at": "Thu Apr 01 15:47:08 +0000 2010", - "favourites_count": 0, - "utc_offset": "-36000", - "time_zone": "Hawaii", - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 3890, - "is_translator": false, - "lang": "ja", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:27 +0000 2010", - "id": 15007771000, - "id_str": "15007771000", - "text": "irei fazer um formspring.me para o #euja_ ok? hahaha :)", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ - { - "text": "euja_", - "indices": [ - 36, - 41 - ] - } - ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 142114624, - "id_str": "142114624", - "name": "euja...", - "screen_name": "euja_", - "show_all_inline_media": false, - "location": null, - "default_profile": false, - "default_profile_image": false, - "description": "Um twitter feito por @karol_arantes e @analuiza_farias , no dia 09.05.10 ; com a inteção de sempre postar... eu já quis.. auehaieuhaeiuha. :) ", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/939283957/e_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/939283957/e_normal.jpg", - "url": null, - "protected": false, - "followers_count": 349, - "profile_background_color": "ACDED6", - "profile_text_color": "ff6a3d", - "profile_use_background_image": true, - "profile_link_color": "038543", - "profile_sidebar_fill_color": "e1bbf0", - "profile_sidebar_border_color": "1cc758", - "friends_count": 281, - "created_at": "Mon May 10 00:54:47 +0000 2010", - "favourites_count": 1, - "utc_offset": "-14400", - "time_zone": "Santiago", - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/106463556/3487472232_05ea679f3c.jpg", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/106463556/3487472232_05ea679f3c.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 1186, - "is_translator": false, - "lang": "es", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:26 +0000 2010", - "id": 15007770000, - "id_str": "15007770000", - "text": "本日ã€ã€ŒSOLAR FREQUENCY ã€ã‚¹ã‚¬ãƒ¦ã‚¦ã‚¹ã‚±ã¯13時より90分Playã—ã¾ã™ã€‚  http://www.techno.vc/", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://www.techno.vc/", - "indices": [ - 91, - 111 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 123203587, - "id_str": "123203587", - "name": "SilentMusicTW", - "screen_name": "SilentMusicTW", - "show_all_inline_media": false, - "location": null, - "default_profile": false, - "default_profile_image": false, - "description": "æŸã‚’中心ã«TECHNO PARTY 'FUTURETECH'ã¨'BIORIC'を開催ã—ã¦ã„ã¾ã™", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/780902559/35855767_22_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/780902559/35855767_22_normal.jpg", - "url": "http://www.techno.vc/", - "protected": false, - "followers_count": 60, - "profile_background_color": "9ae4e8", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "0000ff", - "profile_sidebar_fill_color": "e0ff92", - "profile_sidebar_border_color": "87bc44", - "friends_count": 116, - "created_at": "Mon Mar 15 09:56:59 +0000 2010", - "favourites_count": 0, - "utc_offset": 32400, - "time_zone": "Tokyo", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 36, - "is_translator": false, - "lang": "ja", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:25 +0000 2010", - "id": 15007769000, - "id_str": "15007769000", - "text": "justin bieber is sexy", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 146108581, - "id_str": "146108581", - "name": "Dalisa ", - "screen_name": "ilovejustinB493", - "show_all_inline_media": false, - "location": "California", - "default_profile": false, - "default_profile_image": false, - "description": "I love justin bieber and i am training to become a singer", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/939650119/Photo_on_2010-05-28_at_19.44__7_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/939650119/Photo_on_2010-05-28_at_19.44__7_normal.jpg", - "url": null, - "protected": false, - "followers_count": 1, - "profile_background_color": "642D8B", - "profile_text_color": "3D1957", - "profile_use_background_image": true, - "profile_link_color": "FF0000", - "profile_sidebar_fill_color": "7AC3EE", - "profile_sidebar_border_color": "65B0DA", - "friends_count": 4, - "created_at": "Thu May 20 16:25:16 +0000 2010", - "favourites_count": 10, - "utc_offset": "-28800", - "time_zone": "Pacific Time (US & Canada)", - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme10/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme10/bg.gif", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 55, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:22 +0000 2010", - "id": 15007767000, - "id_str": "15007767000", - "text": "Im not there ,missin the slack promotions lol RT @abunny_: @MyKhal - LMAO. you here?. where you at?.", - "source": "Echofon", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ - { - "id": 237163438, - "id_str": "237163438", - "screen_name": "abunny_", - "name": "annmarie \u2728", - "indices": [ - 50, - 57 - ] - }, - { - "id": 30716605, - "id_str": "30716605", - "screen_name": "MyKhal", - "name": "\ue502 MyKhal Angelo", - "indices": [ - 60, - 66 - ] - } - ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 30716605, - "id_str": "30716605", - "name": "MyKhal Angelo", - "screen_name": "MyKhal", - "show_all_inline_media": false, - "location": "B R O O K L Y N", - "default_profile": false, - "default_profile_image": false, - "description": "If skill could kill then my art might Body Ya ! ", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/643472599/Screen_shot_2010-01-20_at_3.41.00_AM_normal.png", - "profile_image_url_https": "https://si3.twimg.com/profile_images/643472599/Screen_shot_2010-01-20_at_3.41.00_AM_normal.png", - "url": "http://Www.Grimeyville.Com", - "protected": false, - "followers_count": 437, - "profile_background_color": "000000", - "profile_text_color": "050505", - "profile_use_background_image": true, - "profile_link_color": "545a4d", - "profile_sidebar_fill_color": "f4f3f1", - "profile_sidebar_border_color": "f4f3f1", - "friends_count": 396, - "created_at": "Sun Apr 12 20:37:49 +0000 2009", - "favourites_count": 88, - "utc_offset": "-18000", - "time_zone": "Quito", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/80588363/mikey-twitter.gif", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/80588363/mikey-twitter.gif", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 13284, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:21 +0000 2010", - "id": 15007766000, - "id_str": "15007766000", - "text": "Uyu Damla uyu sabah kalkılamayacak sanırım :S Uyyykkkuuuuu ZZzzzzzZZZZzzzzzZzZzzZ", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 84396856, - "id_str": "84396856", - "name": "Damla YILMAZ", - "screen_name": "yakamozdamla", - "show_all_inline_media": false, - "location": null, - "default_profile": false, - "default_profile_image": false, - "description": null, - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/905579364/GetAttachment_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/905579364/GetAttachment_normal.jpg", - "url": "http://twitter.com/yakamozdamla", - "protected": false, - "followers_count": 63, - "profile_background_color": "1A1B1F", - "profile_text_color": "9c009c", - "profile_use_background_image": true, - "profile_link_color": 258505, - "profile_sidebar_fill_color": 252429, - "profile_sidebar_border_color": "181A1E", - "friends_count": 53, - "created_at": "Thu Oct 22 19:03:22 +0000 2009", - "favourites_count": 26, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme9/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme9/bg.gif", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 2599, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:18 +0000 2010", - "id": 15007764000, - "id_str": "15007764000", - "text": "Road sodas :) http://tweetphoto.com/24627509", - "source": "UberTwitter", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://tweetphoto.com/24627509", - "indices": [ - 15, - 44 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 16322863, - "id_str": "16322863", - "name": "HeardREI", - "screen_name": "HeardREI", - "show_all_inline_media": false, - "location": "Georgia", - "default_profile": false, - "default_profile_image": false, - "description": "Name:Reina,3 degrees:Business Administration/Econ,Public Relations, Master of Science in Leadership.Now working on my Ph.D in Psychology!", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/787409701/rei1_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/787409701/rei1_normal.jpg", - "url": null, - "protected": false, - "followers_count": 182, - "profile_background_color": "FF6699", - "profile_text_color": 362720, - "profile_use_background_image": true, - "profile_link_color": "f2ea3a", - "profile_sidebar_fill_color": "E5507E", - "profile_sidebar_border_color": "CC3366", - "friends_count": 397, - "created_at": "Wed Sep 17 03:07:06 +0000 2008", - "favourites_count": 0, - "utc_offset": "-18000", - "time_zone": "Eastern Time (US & Canada)", - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/70594212/DSC04739.JPG", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/70594212/DSC04739.JPG", - "profile_background_tile": true, - "notifications": false, - "geo_enabled": false, - "verified": false, - "following": false, - "follow_request_sent": false, - "statuses_count": 2425, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:13 +0000 2010", - "id": 15007760000, - "id_str": "15007760000", - "text": "Just got my eyebrows threaded...i forgot how much that crap hurts compared to waxing", - "source": "txt", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 74595984, - "id_str": "74595984", - "name": "taylor robinson", - "screen_name": "Taybaybay4", - "show_all_inline_media": false, - "location": "p_town", - "default_profile": false, - "default_profile_image": false, - "description": "haha you know me! diamondback 4 life", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/444160016/taybaybay_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/444160016/taybaybay_normal.jpg", - "url": null, - "protected": false, - "followers_count": 32, - "profile_background_color": "000000", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "ff0090", - "profile_sidebar_fill_color": "000000", - "profile_sidebar_border_color": "000000", - "friends_count": 14, - "created_at": "Tue Sep 15 23:53:06 +0000 2009", - "favourites_count": 1, - "utc_offset": "-32400", - "time_zone": "Alaska", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/41293963/dots__.br.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/41293963/dots__.br.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 2737, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:12 +0000 2010", - "id": 15007759000, - "id_str": "15007759000", - "text": "RT @portrait23: One more unfollower===&gt;@innBloom &lt;smh #damnshame", - "source": "UberTwitter", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ - { - "text": "damnshame", - "indices": [ - 69, - 78 - ] - } - ], - "urls": [ ], - "user_mentions": [ - { - "id": 750834726, - "id_str": "750834726", - "screen_name": "portrait23", - "name": "\ucd0c\ub2d8", - "indices": [ - 4, - 14 - ] - }, - { - "id": 574135525, - "id_str": "574135525", - "screen_name": "innBloom", - "name": "izzy watson", - "indices": [ - 47, - 55 - ] - } - ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 28163598, - "id_str": "28163598", - "name": "Miss Lady Q. Johnson", - "screen_name": "QueenBorne9", - "show_all_inline_media": false, - "location": "ÃœT: 40.686027,-73.76704", - "default_profile": false, - "default_profile_image": false, - "description": "Complicated, simple, highly intelligent and sarcastic as hell.", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/930692380/109816998_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/930692380/109816998_normal.jpg", - "url": "http://tweetphoto.com/user/972361", - "protected": false, - "followers_count": 1401, - "profile_background_color": "0a0401", - "profile_text_color": "0e35f5", - "profile_use_background_image": true, - "profile_link_color": "0a0909", - "profile_sidebar_fill_color": "dbd0d4", - "profile_sidebar_border_color": "c90202", - "friends_count": 1361, - "created_at": "Wed Apr 01 18:38:14 +0000 2009", - "favourites_count": 110, - "utc_offset": "-18000", - "time_zone": "Eastern Time (US & Canada)", - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/79602114/GmasRose2.jpg", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/79602114/GmasRose2.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 46598, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:10 +0000 2010", - "id": 15007758000, - "id_str": "15007758000", - "text": "ALEX MANDAME SALUDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOS !! TEAMOOOOO! :d (@speitzeroficial live on http://twitcam.com/tmoe))", - "source": "API", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://twitcam.com/tmoe", - "indices": [ - 95, - 117 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 109114456, - "id_str": "109114456", - "name": "Mari Carmen ", - "screen_name": "Magykc", - "show_all_inline_media": false, - "location": "Crazy land", - "description": "soii muii liinda\nztoii bn pinch fumada\njeje ♥I LOVE ME♥", - "profile_image_url": "http://a1.twimg.com/profile_images/866514626/Happy0700_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/866514626/Happy0700_normal.jpg", - "url": null, - "protected": false, - "followers_count": 24, - "profile_background_color": "e31d76", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "254ec7", - "profile_sidebar_fill_color": "ff0558", - "profile_sidebar_border_color": "ff0d4a", - "friends_count": 213, - "created_at": "Thu Jan 28 01:02:37 +0000 2010", - "favourites_count": 3, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a1.twimg.com/profile_background_images/80836420/colores.jpg", - "profile_background_image_url_https": "https://si1.twimg.com/profile_background_images/80836420/colores.jpg", - "profile_background_tile": true, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 897, - "is_translator": false, - "lang": "es", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:08 +0000 2010", - "id": 15007756000, - "id_str": "15007756000", - "text": "#MUNDIAL \"Si Palermo es habilidoso yo soy malabarista\"", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ - { - "text": "MUDIAL", - "indices": [ - 1, - 8 - ] - } - ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 83685648, - "id_str": "83685648", - "name": "NESTOR ARIEL", - "screen_name": "NESTOR_ARIEL", - "show_all_inline_media": false, - "location": "Monte Grande, Buenos Aires", - "default_profile": false, - "default_profile_image": false, - "description": "Amo la expresión, no puedo parar de hacerlo!!!. También me gusta escuchar, lo aprendo cada día más y es hermoso. Amo el arte de la conversación!!!", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/505429704/m_db3c052c1ece4970baf0a67b95150757_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/505429704/m_db3c052c1ece4970baf0a67b95150757_normal.jpg", - "url": "http://tuexpresasyoexpreso.blogspot.com/", - "protected": false, - "followers_count": 15, - "profile_background_color": "FFF04D", - "profile_text_color": 333333, - "profile_use_background_image": true, - "profile_link_color": "0099CC", - "profile_sidebar_fill_color": "f6ffd1", - "profile_sidebar_border_color": "fff8ad", - "friends_count": 17, - "created_at": "Mon Oct 19 20:49:29 +0000 2009", - "favourites_count": 1, - "utc_offset": "-10800", - "time_zone": "Buenos Aires", - "profile_background_image_url": "http://a3.twimg.com/profile_background_images/99861997/rosa.jpg", - "profile_background_image_url_https": "https://si3.twimg.com/profile_background_images/99861997/rosa.jpg", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 514, - "is_translator": false, - "lang": "es", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:06 +0000 2010", - "id": 15007755000, - "id_str": "15007755000", - "text": "830 n my night iz jus about done.... Sleepy as hell so I'm turnin it in early latta twitter-nation", - "source": "UberTwitter", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 131211884, - "id_str": "131211884", - "name": "Its me", - "screen_name": "TheReal_W1nner", - "show_all_inline_media": false, - "location": "ÃœT: 36.7992,-76.003899", - "default_profile": false, - "default_profile_image": false, - "description": "Yea on my twitter grind HHEEAAVVYY... I fukz wit my team #teamfollowback ... Llleettttzzz ggoooo #teamblackberry in the buildin pin:24b15e5a ", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/913144683/IMG00145-20100519-1051_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/913144683/IMG00145-20100519-1051_normal.jpg", - "url": "http://null", - "protected": false, - "followers_count": 1012, - "profile_background_color": "9ae4e8", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "0000ff", - "profile_sidebar_fill_color": "e0ff92", - "profile_sidebar_border_color": "87bc44", - "friends_count": 1039, - "created_at": "Fri Apr 09 16:15:31 +0000 2010", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 1429, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:04 +0000 2010", - "id": 15007753000, - "id_str": "15007753000", - "text": "Done and done. Show went so well! The crowd was awesome. Had 2 head home early but we'll be back w/Toby next week in Baltimore.", - "source": "Twitter for iPhone", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 15972949, - "id_str": "15972949", - "name": "Carter's Chord", - "screen_name": "CartersChord", - "show_all_inline_media": false, - "location": "Nashville, TN", - "default_profile": false, - "default_profile_image": false, - "description": "recording artists makin' music you should hear", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a3.twimg.com/profile_images/615208191/19548_239204716217_7475971217_3779790_317186_n_normal.jpg", - "profile_image_url_https": "https://si3.twimg.com/profile_images/615208191/19548_239204716217_7475971217_3779790_317186_n_normal.jpg", - "url": "http://carterschord.com", - "protected": false, - "followers_count": 836, - "profile_background_color": "fbebd2", - "profile_text_color": 919191, - "profile_use_background_image": true, - "profile_link_color": "dd002c", - "profile_sidebar_fill_color": "3c193f", - "profile_sidebar_border_color": "36173f", - "friends_count": 80, - "created_at": "Sun Aug 24 21:33:33 +0000 2008", - "favourites_count": 1, - "utc_offset": "-21600", - "time_zone": "Central Time (US & Canada)", - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme8/bg.gif", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme8/bg.gif", - "profile_background_tile": false, - "notifications": false, - "geo_enabled": false, - "verified": false, - "following": false, - "follow_request_sent": false, - "statuses_count": 744, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:02 +0000 2010", - "id": 15007752000, - "id_str": "15007752000", - "text": "http://dld.bz/dGt5 Does self-checkout actually save you any money?", - "source": "SocialOomph", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ - { - "url": "http://dld.bz/dGt5", - "indices": [ - 1, - 18 - ] - } - ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 141693017, - "id_str": "141693017", - "name": "CodyNew", - "screen_name": "CodyWrites2", - "show_all_inline_media": false, - "location": null, - "default_profile": false, - "default_profile_image": false, - "description": null, - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a0.twimg.com/a/1274144130/images/default_profile_4_normal.png", - "profile_image_url_https": "https://si0.twimg.com/a/1274144130/images/default_profile_4_normal.png", - "url": null, - "protected": false, - "followers_count": 225, - "profile_background_color": "9ae4e8", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "0000ff", - "profile_sidebar_fill_color": "e0ff92", - "profile_sidebar_border_color": "87bc44", - "friends_count": 234, - "created_at": "Sat May 08 19:23:26 +0000 2010", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274144130/images/themes/theme1/bg.png", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 4815, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - }, - { - "created_at": "Sun May 30 00:31:01 +0000 2010", - "id": 15007751000, - "id_str": "15007751000", - "text": "Who tryna do something...I'm bored.lol", - "source": "web", - "truncated": false, - "in_reply_to_status_id": null, - "in_reply_to_status_id_str": null, - "in_reply_to_user_id": null, - "in_reply_to_user_id_str": null, - "entities": { - "hashtags": [ ], - "urls": [ ], - "user_mentions": [ ] - }, - "favorited": false, - "in_reply_to_screen_name": null, - "user": { - "id": 140059643, - "id_str": "140059643", - "name": "Greg Mandall", - "screen_name": "cizinevyxul", - "show_all_inline_media": false, - "location": "Brissy", - "default_profile": false, - "default_profile_image": false, - "description": "Guitarist for Autumn Heartache D", - "entities": { - "hashtags": [], - "urls": [], - "user_mentions": [] - }, - "expanded_url": null, - "profile_image_url": "http://a1.twimg.com/profile_images/941686188/GHTNKx_normal.jpg", - "profile_image_url_https": "https://si1.twimg.com/profile_images/941686188/GHTNKx_normal.jpg", - "url": null, - "protected": false, - "followers_count": 15, - "profile_background_color": "9ae4e8", - "profile_text_color": "000000", - "profile_use_background_image": true, - "profile_link_color": "0000ff", - "profile_sidebar_fill_color": "e0ff92", - "profile_sidebar_border_color": "87bc44", - "friends_count": 85, - "created_at": "Tue May 04 13:05:41 +0000 2010", - "favourites_count": 0, - "utc_offset": null, - "time_zone": null, - "profile_background_image_url": "http://a0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_image_url_https": "https://si0.twimg.com/a/1274899949/images/themes/theme1/bg.png", - "profile_background_tile": false, - "notifications": null, - "geo_enabled": false, - "verified": false, - "following": null, - "follow_request_sent": false, - "statuses_count": 28, - "is_translator": false, - "lang": "en", - "listed_count": 0, - "contributors_enabled": false - }, - "geo": null, - "coordinates": null, - "place": null, - "retweet_count": 0, - "retweeted": false, - "contributors": null - } -] diff --git a/tests/Zend/Service/Twitter/_files/statuses.show.json b/tests/Zend/Service/Twitter/_files/statuses.show.json deleted file mode 100644 index 67812cbeab..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.show.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "created_at":"Fri Mar 01 16:36:36 +0000 2013", - "id":307529814640840705, - "id_str":"307529814640840705", - "text":"To those who write docs for APIs: please alphabetize properties\/members\/whatever. So hard to compare when they\u0027re unordered.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13278, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":3, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false -} diff --git a/tests/Zend/Service/Twitter/_files/statuses.update.json b/tests/Zend/Service/Twitter/_files/statuses.update.json deleted file mode 100644 index 67812cbeab..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.update.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "created_at":"Fri Mar 01 16:36:36 +0000 2013", - "id":307529814640840705, - "id_str":"307529814640840705", - "text":"To those who write docs for APIs: please alphabetize properties\/members\/whatever. So hard to compare when they\u0027re unordered.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13278, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":3, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false -} diff --git a/tests/Zend/Service/Twitter/_files/statuses.user_timeline.mwop.json b/tests/Zend/Service/Twitter/_files/statuses.user_timeline.mwop.json deleted file mode 100644 index 466f5f4b9a..0000000000 --- a/tests/Zend/Service/Twitter/_files/statuses.user_timeline.mwop.json +++ /dev/null @@ -1,2454 +0,0 @@ -[ - { - "created_at":"Mon Mar 04 22:01:32 +0000 2013", - "id":308698753609646081, - "id_str":"308698753609646081", - "text":"I think Twitter has been deliberately vague about how to create the oauth_signature for its headers.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 21:05:50 +0000 2013", - "id":308684734299525120, - "id_str":"308684734299525120", - "text":"RT @ralphschindler: Got old #php code you still need to convert to namespaces? Give this tool a try: https:\/\/t.co\/Vtc8wOyuds (works on # ...", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 21:01:16 +0000 2013", - "id":308683586461110272, - "id_str":"308683586461110272", - "text":"Got old #php code you still need to convert to namespaces? Give this tool a try: https:\/\/t.co\/Vtc8wOyuds (works on #ZF1 projects too!)", - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":13209052, - "id_str":"13209052", - "name":"Ralph Schindler", - "screen_name":"ralphschindler", - "location":"New Orleans, LA", - "description":"PHP Developer, Zender, ZFer, Hiker, Professional Eater, Nerd.", - "url":"http:\/\/ralphschindler.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/ralphschindler.com", - "expanded_url":null, - "indices":[ - 0, - 25 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":2692, - "friends_count":328, - "listed_count":259, - "created_at":"Thu Feb 07 16:07:55 +0000 2008", - "favourites_count":0, - "utc_offset":-21600, - "time_zone":"Central Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":1729, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2218255450\/_DSC4891_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2218255450\/_DSC4891_normal.jpg", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":13, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 8, - 12 - ] - }, - { - "text":"ZF1", - "indices":[ - 115, - 119 - ] - } - ], - "urls":[ - { - "url":"https:\/\/t.co\/Vtc8wOyuds", - "expanded_url":"https:\/\/github.com\/ralphschindler\/Namespacer", - "display_url":"github.com\/ralphschindler\u2026", - "indices":[ - 81, - 104 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":13, - "entities":{ - "hashtags":[ - { - "text":"php", - "indices":[ - 28, - 32 - ] - } - ], - "urls":[ - { - "url":"https:\/\/t.co\/Vtc8wOyuds", - "expanded_url":"https:\/\/github.com\/ralphschindler\/Namespacer", - "display_url":"github.com\/ralphschindler\u2026", - "indices":[ - 101, - 124 - ] - } - ], - "user_mentions":[ - { - "screen_name":"ralphschindler", - "name":"Ralph Schindler", - "id":13209052, - "id_str":"13209052", - "indices":[ - 3, - 18 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 21:05:36 +0000 2013", - "id":308684676262928384, - "id_str":"308684676262928384", - "text":"@tswicegood Something\u0027s messed up with that; quite some number in the top 20 are now no longer on that list.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308681699364052992, - "in_reply_to_status_id_str":"308681699364052992", - "in_reply_to_user_id":9478892, - "in_reply_to_user_id_str":"9478892", - "in_reply_to_screen_name":"tswicegood", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 0, - 11 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 19:39:03 +0000 2013", - "id":308662893719744512, - "id_str":"308662893719744512", - "text":"@gabriel403 Will have some availability tomorrow; ping me when you see me.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308661108670095361, - "in_reply_to_status_id_str":"308661108670095361", - "in_reply_to_user_id":45822226, - "in_reply_to_user_id_str":"45822226", - "in_reply_to_screen_name":"gabriel403", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"gabriel403", - "name":"Gabriel Baker", - "id":45822226, - "id_str":"45822226", - "indices":[ - 0, - 11 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 18:16:56 +0000 2013", - "id":308642228635578368, - "id_str":"308642228635578368", - "text":"@mwillbanks Online. :-) Subscribe to the vimcasts RSS feed so you can see when @nelstrom announces the next one. :)", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308640205311729664, - "in_reply_to_status_id_str":"308640205311729664", - "in_reply_to_user_id":18636940, - "in_reply_to_user_id_str":"18636940", - "in_reply_to_screen_name":"mwillbanks", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"mwillbanks", - "name":"Mike Willbanks", - "id":18636940, - "id_str":"18636940", - "indices":[ - 0, - 11 - ] - }, - { - "screen_name":"nelstrom", - "name":"Drew Neil", - "id":9252942, - "id_str":"9252942", - "indices":[ - 79, - 88 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 16:56:44 +0000 2013", - "id":308622045367898113, - "id_str":"308622045367898113", - "text":"Just starting the #Vim masterclass with @nelstrom - can\u0027t wait to see what tips\/tricks\/tools I pick up today!", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - { - "text":"Vim", - "indices":[ - 18, - 22 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"nelstrom", - "name":"Drew Neil", - "id":9252942, - "id_str":"9252942", - "indices":[ - 40, - 49 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 16:30:20 +0000 2013", - "id":308615401036738560, - "id_str":"308615401036738560", - "text":"RT @MisfitGeek: The Growing PHP Community \u2013 Meet Shishir Chakraborty- http:\/\/t.co\/mKGgbfE7Oy", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 16:25:08 +0000 2013", - "id":308614096075493378, - "id_str":"308614096075493378", - "text":"The Growing PHP Community \u2013 Meet Shishir Chakraborty- http:\/\/t.co\/mKGgbfE7Oy", - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9321012, - "id_str":"9321012", - "name":"Joe Stagner", - "screen_name":"MisfitGeek", - "location":"USA - Zend !", - "description":"Building Web Apps and Strategies since 1993 - Currently PHP !", - "url":"http:\/\/www.MisfitGeek.com", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.MisfitGeek.com", - "expanded_url":null, - "indices":[ - 0, - 25 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":5515, - "friends_count":1513, - "listed_count":450, - "created_at":"Tue Oct 09 02:52:01 +0000 2007", - "favourites_count":7, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":12096, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2204148489\/JoeStagner-HTML5_normal.png", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2204148489\/JoeStagner-HTML5_normal.png", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"C0DEED", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":true, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":3, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/mKGgbfE7Oy", - "expanded_url":"http:\/\/devzone.zend.com\/2818\/the-growing-php-community-meet-shishir-chakraborty\/", - "display_url":"devzone.zend.com\/2818\/the-growi\u2026", - "indices":[ - 54, - 76 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":3, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/mKGgbfE7Oy", - "expanded_url":"http:\/\/devzone.zend.com\/2818\/the-growing-php-community-meet-shishir-chakraborty\/", - "display_url":"devzone.zend.com\/2818\/the-growi\u2026", - "indices":[ - 70, - 92 - ] - } - ], - "user_mentions":[ - { - "screen_name":"MisfitGeek", - "name":"Joe Stagner", - "id":9321012, - "id_str":"9321012", - "indices":[ - 3, - 14 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 14:50:31 +0000 2013", - "id":308590284353196032, - "id_str":"308590284353196032", - "text":"RT @grmpyprogrammer: IT\u0027S LIVE http:\/\/t.co\/OgkikLWSHd", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Mon Mar 04 14:45:01 +0000 2013", - "id":308588900304179200, - "id_str":"308588900304179200", - "text":"IT\u0027S LIVE http:\/\/t.co\/OgkikLWSHd", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":7418052, - "id_str":"7418052", - "name":"Chris Hartjes", - "screen_name":"grmpyprogrammer", - "location":"Milton, Ontario, Canada", - "description":"Grumpy web developer and tester, @gtaphp organizer, running @truenorthphp, just waiting for people to START WRITING TESTS", - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.littlehart.net\/atthekeyboard", - "expanded_url":null, - "indices":[ - 0, - 39 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":3063, - "friends_count":294, - "listed_count":241, - "created_at":"Thu Jul 12 02:36:44 +0000 2007", - "favourites_count":14, - "utc_offset":-18000, - "time_zone":"Eastern Time (US \u0026 Canada)", - "geo_enabled":false, - "verified":false, - "statuses_count":29416, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"9AE4E8", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3312427651\/a329ae66656ae180cb9de9d629dbb872_normal.jpeg", - "profile_link_color":"0000FF", - "profile_sidebar_border_color":"87BC44", - "profile_sidebar_fill_color":"E0FF92", - "profile_text_color":"000000", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":30, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/OgkikLWSHd", - "expanded_url":"http:\/\/grumpy-phpunit.com", - "display_url":"grumpy-phpunit.com", - "indices":[ - 10, - 32 - ] - } - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":30, - "entities":{ - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/OgkikLWSHd", - "expanded_url":"http:\/\/grumpy-phpunit.com", - "display_url":"grumpy-phpunit.com", - "indices":[ - 31, - 53 - ] - } - ], - "user_mentions":[ - { - "screen_name":"grmpyprogrammer", - "name":"Chris Hartjes", - "id":7418052, - "id_str":"7418052", - "indices":[ - 3, - 19 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - { - "created_at":"Mon Mar 04 13:17:22 +0000 2013", - "id":308566841951936513, - "id_str":"308566841951936513", - "text":"@LauraRaeder so, where did you race in February?", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":311531420, - "in_reply_to_user_id_str":"311531420", - "in_reply_to_screen_name":"LauraRaeder", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"LauraRaeder", - "name":"Laura Raeder", - "id":311531420, - "id_str":"311531420", - "indices":[ - 0, - 12 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 13:02:04 +0000 2013", - "id":308562989253013505, - "id_str":"308562989253013505", - "text":"@tswicegood channeling your inner @CalEvans this morning?", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308561906170466306, - "in_reply_to_status_id_str":"308561906170466306", - "in_reply_to_user_id":9478892, - "in_reply_to_user_id_str":"9478892", - "in_reply_to_screen_name":"tswicegood", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"tswicegood", - "name":"Travis Swicegood", - "id":9478892, - "id_str":"9478892", - "indices":[ - 0, - 11 - ] - }, - { - "screen_name":"CalEvans", - "name":"Cal Evans", - "id":4795561, - "id_str":"4795561", - "indices":[ - 34, - 43 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Mon Mar 04 01:41:24 +0000 2013", - "id":308391696440360960, - "id_str":"308391696440360960", - "text":"RT @jvandemo: Just wrote alpha version of #Oauth2 service for @Zend Framework 2 and would really appreciate your feedback: https:\/\/t.co\/ ...", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweeted_status":{ - "created_at":"Sun Mar 03 23:47:13 +0000 2013", - "id":308362961053958145, - "id_str":"308362961053958145", - "text":"Just wrote alpha version of #Oauth2 service for @Zend Framework 2 and would really appreciate your feedback: https:\/\/t.co\/duV3Pm5Isf #ZF2", - "source":"web", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "user":{ - "id":108026902, - "id_str":"108026902", - "name":"Jurgen Van de Moere", - "screen_name":"jvandemo", - "location":"Evergem", - "description":"Coder \/\/ Lead developer \/\/ Food freak \/\/ Gymnast \/\/ Dad \/\/ Deleted old tweets \/\/ English only now", - "url":null, - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":178, - "friends_count":388, - "listed_count":7, - "created_at":"Sun Jan 24 15:33:38 +0000 2010", - "favourites_count":188, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":246, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"252525", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/683745743\/4576ecd1645451a79e7425bd927b01f4.jpeg", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/683745743\/4576ecd1645451a79e7425bd927b01f4.jpeg", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1782123335\/jurgen9_normal.jpg", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1782123335\/jurgen9_normal.jpg", - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/108026902\/1357739890", - "profile_link_color":"0084B4", - "profile_sidebar_border_color":"FFFFFF", - "profile_sidebar_fill_color":"DDEEF6", - "profile_text_color":"333333", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":null, - "follow_request_sent":false, - "notifications":null - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":14, - "entities":{ - "hashtags":[ - { - "text":"Oauth2", - "indices":[ - 28, - 35 - ] - }, - { - "text":"ZF2", - "indices":[ - 133, - 137 - ] - } - ], - "urls":[ - { - "url":"https:\/\/t.co\/duV3Pm5Isf", - "expanded_url":"https:\/\/github.com\/jvandemo\/ZendService_Oauth2", - "display_url":"github.com\/jvandemo\/ZendS\u2026", - "indices":[ - 109, - 132 - ] - } - ], - "user_mentions":[ - { - "screen_name":"zend", - "name":"zend", - "id":15012215, - "id_str":"15012215", - "indices":[ - 48, - 53 - ] - } - ] - }, - "favorited":false, - "retweeted":false, - "possibly_sensitive":false - }, - "retweet_count":14, - "entities":{ - "hashtags":[ - { - "text":"Oauth2", - "indices":[ - 42, - 49 - ] - } - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"jvandemo", - "name":"Jurgen Van de Moere", - "id":108026902, - "id_str":"108026902", - "indices":[ - 3, - 12 - ] - }, - { - "screen_name":"zend", - "name":"zend", - "id":15012215, - "id_str":"15012215", - "indices":[ - 62, - 67 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sun Mar 03 13:13:26 +0000 2013", - "id":308203463685308417, - "id_str":"308203463685308417", - "text":"@klimpong cool - do me a favor? Ping me when merged? \/cc @naderman", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308177525094367233, - "in_reply_to_status_id_str":"308177525094367233", - "in_reply_to_user_id":4600051, - "in_reply_to_user_id_str":"4600051", - "in_reply_to_screen_name":"klimpong", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"klimpong", - "name":"Till!", - "id":4600051, - "id_str":"4600051", - "indices":[ - 0, - 9 - ] - }, - { - "screen_name":"naderman", - "name":"Nils Adermann", - "id":11754222, - "id_str":"11754222", - "indices":[ - 57, - 66 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sun Mar 03 13:10:40 +0000 2013", - "id":308202765698609152, - "id_str":"308202765698609152", - "text":"@jkeppens um, that\u2019s true in zf1, too. We\u2019ve shied away from it, as we don\u2019t want to dictate how domain models are structured.", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":308162641854099456, - "in_reply_to_status_id_str":"308162641854099456", - "in_reply_to_user_id":15749095, - "in_reply_to_user_id_str":"15749095", - "in_reply_to_screen_name":"jkeppens", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"jkeppens", - "name":"Jeroen Keppens", - "id":15749095, - "id_str":"15749095", - "indices":[ - 0, - 9 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 22:42:44 +0000 2013", - "id":307984345782689792, - "id_str":"307984345782689792", - "text":"@padraicb I am experiencing both schadenfreude and guilt reading your tweet stream.", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307958321434984448, - "in_reply_to_status_id_str":"307958321434984448", - "in_reply_to_user_id":9075802, - "in_reply_to_user_id_str":"9075802", - "in_reply_to_screen_name":"padraicb", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"padraicb", - "name":"P\u00e1draic Brady", - "id":9075802, - "id_str":"9075802", - "indices":[ - 0, - 9 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:18:04 +0000 2013", - "id":307947937374281728, - "id_str":"307947937374281728", - "text":"@philipobenito Nice set of comparisons, though!", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307892867731427329, - "in_reply_to_status_id_str":"307892867731427329", - "in_reply_to_user_id":455064907, - "in_reply_to_user_id_str":"455064907", - "in_reply_to_screen_name":"philipobenito", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"philipobenito", - "name":"Phil Bennett", - "id":455064907, - "id_str":"455064907", - "indices":[ - 0, - 14 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:17:46 +0000 2013", - "id":307947864535990272, - "id_str":"307947864535990272", - "text":"@philipobenito but they\u2019re not well documented nor well developed. SM is more flexible and faster, which is why we favor it. (More)", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307892867731427329, - "in_reply_to_status_id_str":"307892867731427329", - "in_reply_to_user_id":455064907, - "in_reply_to_user_id_str":"455064907", - "in_reply_to_screen_name":"philipobenito", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"philipobenito", - "name":"Phil Bennett", - "id":455064907, - "id_str":"455064907", - "indices":[ - 0, - 14 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:16:43 +0000 2013", - "id":307947597514043393, - "id_str":"307947597514043393", - "text":"@philipobenito pimple is more analogous to zend\\servicemanager. Also, zend\\di allows non-reflection strategies to help speed it up (more)", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307892867731427329, - "in_reply_to_status_id_str":"307892867731427329", - "in_reply_to_user_id":455064907, - "in_reply_to_user_id_str":"455064907", - "in_reply_to_screen_name":"philipobenito", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"philipobenito", - "name":"Phil Bennett", - "id":455064907, - "id_str":"455064907", - "indices":[ - 0, - 14 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:04:49 +0000 2013", - "id":307944603007475712, - "id_str":"307944603007475712", - "text":"@akrabat That explains why I couldn\u2019t log into my app this morning\u2026", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307888014732955649, - "in_reply_to_status_id_str":"307888014732955649", - "in_reply_to_user_id":9244712, - "in_reply_to_user_id_str":"9244712", - "in_reply_to_screen_name":"akrabat", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"akrabat", - "name":"Rob Allen", - "id":9244712, - "id_str":"9244712", - "indices":[ - 0, - 8 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Sat Mar 02 20:02:54 +0000 2013", - "id":307944123330072577, - "id_str":"307944123330072577", - "text":"@michaellehmkuhl tmux over ssh. :-)", - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307882357065654272, - "in_reply_to_status_id_str":"307882357065654272", - "in_reply_to_user_id":1269541, - "in_reply_to_user_id_str":"1269541", - "in_reply_to_screen_name":"michaellehmkuhl", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"michaellehmkuhl", - "name":"Michael Lehmkuhl", - "id":1269541, - "id_str":"1269541", - "indices":[ - 0, - 16 - ] - } - ] - }, - "favorited":false, - "retweeted":false - }, - { - "created_at":"Fri Mar 01 22:25:26 +0000 2013", - "id":307617603055144960, - "id_str":"307617603055144960", - "text":"@BradleyHolt I love that. And nice to see you on twitter again. :)", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":307608289842180096, - "in_reply_to_status_id_str":"307608289842180096", - "in_reply_to_user_id":10909812, - "in_reply_to_user_id_str":"10909812", - "in_reply_to_screen_name":"BradleyHolt", - "user":{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false - }, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - { - "screen_name":"BradleyHolt", - "name":"Bradley Holt", - "id":10909812, - "id_str":"10909812", - "indices":[ - 0, - 12 - ] - } - ] - }, - "favorited":false, - "retweeted":false - } -] diff --git a/tests/Zend/Service/Twitter/_files/users.search.json b/tests/Zend/Service/Twitter/_files/users.search.json deleted file mode 100644 index e92932bba6..0000000000 --- a/tests/Zend/Service/Twitter/_files/users.search.json +++ /dev/null @@ -1,2429 +0,0 @@ -[ - { - "id":15012215, - "created_at":"Thu Jun 05 00:20:39 +0000 2008", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/126087338\/zendlogolarge_normal.gif", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.zend.com", - "indices":[ - 0, - 19 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "statuses_count":2368, - "url":"http:\/\/www.zend.com", - "profile_text_color":"333333", - "id_str":"15012215", - "follow_request_sent":false, - "utc_offset":-28800, - "default_profile_image":false, - "name":"zend", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "favourites_count":0, - "friends_count":277, - "screen_name":"zend", - "protected":false, - "location":"Cupertino, Tel Aviv, Worldwide", - "profile_background_tile":false, - "followers_count":17664, - "profile_sidebar_fill_color":"DDEEF6", - "following":true, - "verified":false, - "default_profile":false, - "is_translator":false, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"Pacific Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/126087338\/zendlogolarge_normal.gif", - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/fvaw7rLSOe", - "indices":[ - 117, - 139 - ], - "display_url":"fb.me\/2befkr53L", - "expanded_url":"http:\/\/fb.me\/2befkr53L" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":3, - "coordinates":null, - "possibly_sensitive":false, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "id_str":"309661711189831683", - "retweeted":false, - "in_reply_to_user_id_str":null, - "truncated":false, - "text":"Did you see that the recording of our Zend Studio 10 introduction webinar with Natalia Bartol is available on our... http:\/\/t.co\/fvaw7rLSOe", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.facebook.com\/twitter\u0022 rel=\u0022nofollow\u0022\u003EFacebook\u003C\/a\u003E", - "id":309661711189831683, - "created_at":"Thu Mar 07 13:47:59 +0000 2013" - }, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/61357839\/zend_twitter.jpg", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/61357839\/zend_twitter.jpg", - "listed_count":1205, - "description":"Zend Technologies - The PHP Company", - "profile_link_color":"0084B4", - "geo_enabled":false - }, - { - "id_str":"51834991", - "id":51834991, - "friends_count":121, - "created_at":"Sun Jun 28 20:33:54 +0000 2009", - "follow_request_sent":false, - "favourites_count":14, - "entities":{ - "url":{ - "urls":[ - { - "expanded_url":null, - "url":"http:\/\/framework.zend.com", - "indices":[ - 0, - 25 - ], - "display_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_sidebar_border_color":"829D5E", - "url":"http:\/\/framework.zend.com", - "utc_offset":3600, - "profile_background_tile":false, - "followers_count":4966, - "name":"Zend Framework", - "lang":"en", - "notifications":false, - "profile_sidebar_fill_color":"99CC33", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/421924014\/zend-framework_normal.png", - "screen_name":"zfChannel", - "default_profile":false, - "protected":false, - "verified":false, - "location":"ZF is all around you", - "profile_background_color":"352726", - "contributors_enabled":false, - "listed_count":338, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "time_zone":"Amsterdam", - "following":true, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/421924014\/zend-framework_normal.png", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_link_color":"344869", - "geo_enabled":false, - "statuses_count":303, - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "expanded_url":"http:\/\/yamgo.com", - "url":"http:\/\/t.co\/4LN2D8qs", - "indices":[ - 49, - 69 - ], - "display_url":"yamgo.com" - }, - { - "expanded_url":"http:\/\/iadvize.com", - "url":"http:\/\/t.co\/BZhYbFOT", - "indices":[ - 71, - 91 - ], - "display_url":"iadvize.com" - }, - { - "expanded_url":"http:\/\/truesocialmetrics.com", - "url":"http:\/\/t.co\/ecBayEur", - "indices":[ - 93, - 113 - ], - "display_url":"truesocialmetrics.com" - }, - { - "expanded_url":"http:\/\/fr.semvisu.com", - "url":"http:\/\/t.co\/ugFsIO6q", - "indices":[ - 115, - 135 - ], - "display_url":"fr.semvisu.com" - } - ] - }, - "place":null, - "geo":null, - "favorited":false, - "coordinates":null, - "retweet_count":5, - "possibly_sensitive":false, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "text":"While ago I asked for ZF sites, here are some... http:\/\/t.co\/4LN2D8qs, http:\/\/t.co\/BZhYbFOT, http:\/\/t.co\/ecBayEur, http:\/\/t.co\/ugFsIO6q!", - "in_reply_to_status_id_str":null, - "id_str":"300749763253510144", - "retweeted":false, - "source":"web", - "truncated":false, - "id":300749763253510144, - "created_at":"Sun Feb 10 23:35:05 +0000 2013", - "in_reply_to_user_id_str":null, - "in_reply_to_status_id":null - }, - "profile_use_background_image":true, - "is_translator":false, - "default_profile_image":false, - "description":"Zend Framework news and updates, other related subjects and even personal help.", - "profile_text_color":"3E4415" - }, - { - "id":15184101, - "created_at":"Fri Jun 20 20:34:58 +0000 2008", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.zend.com\/resources\/webinars", - "indices":[ - 0, - 38 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/www.zend.com\/resources\/webinars", - "profile_text_color":"333333", - "id_str":"15184101", - "follow_request_sent":false, - "statuses_count":861, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/558946653\/___moodspin___WebinarsatZend_normal.jpeg", - "utc_offset":-28800, - "name":"WebinarsatZend", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "screen_name":"WebinarsatZend", - "favourites_count":1, - "friends_count":25, - "protected":false, - "location":"Cupertino, CA", - "profile_background_tile":false, - "followers_count":2069, - "profile_sidebar_fill_color":"DDEEF6", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"Pacific Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/558946653\/___moodspin___WebinarsatZend_normal.jpeg", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"alanseiden", - "name":"Alan Seiden", - "indices":[ - 80, - 91 - ], - "id_str":"85011009", - "id":85011009 - } - ], - "hashtags":[ - { - "indices":[ - 16, - 20 - ], - "text":"PHP" - }, - { - "indices":[ - 43, - 47 - ], - "text":"IBM" - }, - { - "indices":[ - 133, - 138 - ], - "text":"IBMi" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/R7S5FlwkNC", - "indices":[ - 110, - 132 - ], - "display_url":"bit.ly\/ZpuJo2", - "expanded_url":"http:\/\/bit.ly\/ZpuJo2" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":2, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309288770790912000", - "retweeted":false, - "truncated":false, - "text":"Do you know the #PHP Toolkit from Zend and #IBM? If not, learn more about it in @alanseiden \u0027s webinar today! http:\/\/t.co\/R7S5FlwkNC #IBMi", - "in_reply_to_status_id":null, - "source":"web", - "id":309288770790912000, - "created_at":"Wed Mar 06 13:06:03 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/61356634\/zend_twitter.jpg", - "description":"Zend Webinars provide knowledge and best practices around PHP development, deployment and management, across mobile and cloud. And they are FREE!", - "profile_link_color":"0084B4", - "geo_enabled":true, - "listed_count":150, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/61356634\/zend_twitter.jpg" - }, - { - "id":9244712, - "created_at":"Thu Oct 04 14:08:31 +0000 2007", - "statuses_count":13045, - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/akrabat.com", - "indices":[ - 0, - 18 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "default_profile_image":false, - "profile_use_background_image":true, - "friends_count":254, - "url":"http:\/\/akrabat.com", - "profile_text_color":"333333", - "favourites_count":421, - "id_str":"9244712", - "follow_request_sent":false, - "utc_offset":0, - "name":"Rob Allen", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"eeeeee", - "screen_name":"akrabat", - "protected":false, - "is_translator":false, - "location":"Worcester, UK", - "profile_background_tile":true, - "followers_count":4204, - "default_profile":false, - "profile_sidebar_fill_color":"efefef", - "following":true, - "verified":false, - "profile_background_color":"131516", - "listed_count":417, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "contributors_enabled":false, - "time_zone":"London", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2869088328\/73e2da0fd72b84ab0bf7a08ff90b104c_normal.jpeg", - "status":{ - "entities":{ - "user_mentions":[ - { - "screen_name":"lornajane", - "name":"Lorna Mitchell", - "indices":[ - 0, - 10 - ], - "id_str":"7356002", - "id":7356002 - } - ], - "hashtags":[ - - ], - "urls":[ - - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":"lornajane", - "in_reply_to_user_id":7356002, - "id_str":"309794226693091328", - "retweeted":false, - "truncated":false, - "text":"@lornajane I\u2019m expecting a blog post! As an encore, can you fix Google groups\u2019 \u201ctext area\u201d?!", - "in_reply_to_status_id_str":"309791344157655040", - "in_reply_to_status_id":309791344157655040, - "source":"\u003Ca href=\u0022http:\/\/tapbots.com\/tweetbot\u0022 rel=\u0022nofollow\u0022\u003ETweetbot for iOS\u003C\/a\u003E", - "id":309794226693091328, - "created_at":"Thu Mar 07 22:34:34 +0000 2013", - "in_reply_to_user_id_str":"7356002" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "description":"Author of Zend Framework in Action. Husband. Father of two sons. Creator of Daily Jotter for Mac", - "profile_link_color":"009999", - "geo_enabled":true - }, - { - "id":9594462, - "created_at":"Mon Oct 22 09:40:49 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/dragonbe.com", - "indices":[ - 0, - 19 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "statuses_count":14944, - "url":"http:\/\/dragonbe.com", - "profile_text_color":"666666", - "id_str":"9594462", - "follow_request_sent":false, - "utc_offset":3600, - "default_profile_image":false, - "name":"Michelangelo van Dam", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"181A1E", - "favourites_count":387, - "friends_count":464, - "screen_name":"DragonBe", - "is_translator":false, - "protected":false, - "location":"Mechelen, Antwerp, Belgium", - "profile_background_tile":false, - "followers_count":2696, - "profile_banner_url":"https:\/\/twimg0-a.akamaihd.net\/profile_banners\/9594462\/1354579428", - "profile_sidebar_fill_color":"252429", - "following":true, - "verified":false, - "default_profile":false, - "profile_background_color":"1A1B1F", - "profile_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/profile_images\/2694181454\/3b0c7ca0cd31c0cc5f6984cfebc48ff2_normal.jpeg", - "contributors_enabled":false, - "time_zone":"Brussels", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2694181454\/3b0c7ca0cd31c0cc5f6984cfebc48ff2_normal.jpeg", - "status":{ - "entities":{ - "user_mentions":[ - { - "screen_name":"grmpyprogrammer", - "name":"Chris Hartjes", - "indices":[ - 0, - 16 - ], - "id_str":"7418052", - "id":7418052 - } - ], - "hashtags":[ - - ], - "urls":[ - - ] - }, - "favorited":false, - "place":{ - "name":"Mechelen", - "url":"http:\/\/api.twitter.com\/1\/geo\/id\/6d6198a460e4073a.json", - "country":"Belgium", - "place_type":"city", - "country_code":"BE", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - 4.370356, - 50.9911961 - ], - [ - 4.5487362, - 50.9911961 - ], - [ - 4.5487362, - 51.0785736 - ], - [ - 4.370356, - 51.0785736 - ] - ] - ] - }, - "attributes":{ - - }, - "id":"6d6198a460e4073a", - "full_name":"Mechelen, Mechelen" - }, - "geo":{ - "type":"Point", - "coordinates":[ - 51.03010369, - 4.46616853 - ] - }, - "retweet_count":0, - "in_reply_to_status_id_str":"309765981805363200", - "coordinates":{ - "type":"Point", - "coordinates":[ - 4.46616853, - 51.03010369 - ] - }, - "in_reply_to_user_id_str":"7418052", - "contributors":null, - "in_reply_to_screen_name":"grmpyprogrammer", - "in_reply_to_user_id":7418052, - "id_str":"309772050057265152", - "retweeted":false, - "truncated":false, - "text":"@grmpyprogrammer well deserved! Keep up this evangelizing of testing!", - "in_reply_to_status_id":309765981805363200, - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/download\/iphone\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPhone\u003C\/a\u003E", - "id":309772050057265152, - "created_at":"Thu Mar 07 21:06:26 +0000 2013" - }, - "profile_background_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/images\/themes\/theme9\/bg.gif", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "listed_count":255, - "description":"Michelangelo is a senior PHP\/Zend Framework consultant, a member of the PHP community and president of the PHP user group PHPBenelux.", - "profile_link_color":"2FC2EF", - "geo_enabled":true - }, - { - "is_translator":false, - "id":9453382, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "indices":[ - 0, - 16 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_use_background_image":true, - "statuses_count":13317, - "url":"http:\/\/mwop.net\/", - "profile_text_color":"3E4415", - "id_str":"9453382", - "follow_request_sent":false, - "utc_offset":3600, - "default_profile_image":false, - "name":"weierophinney", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"829D5E", - "favourites_count":357, - "friends_count":191, - "screen_name":"mwop", - "protected":false, - "location":"Sioux Falls, SD", - "profile_background_tile":false, - "followers_count":6372, - "profile_sidebar_fill_color":"99CC33", - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"352726", - "contributors_enabled":false, - "time_zone":"Brussels", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "status":{ - "entities":{ - "user_mentions":[ - { - "screen_name":"rdohms", - "name":"Rafael Dohms", - "indices":[ - 0, - 7 - ], - "id_str":"9453502", - "id":9453502 - }, - { - "screen_name":"tiscilla", - "name":"Tiscilla C. Dohms", - "indices":[ - 97, - 106 - ], - "id_str":"36050374", - "id":36050374 - } - ], - "hashtags":[ - - ], - "urls":[ - - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "coordinates":null, - "in_reply_to_status_id_str":null, - "contributors":null, - "in_reply_to_screen_name":"rdohms", - "in_reply_to_user_id":9453502, - "in_reply_to_user_id_str":"9453502", - "id_str":"309770838184452097", - "retweeted":false, - "truncated":false, - "text":"@rdohms Happy birthday! Hope you still have some pop tarts left to celebrate. While you can. \/cc @tiscilla", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "id":309770838184452097, - "created_at":"Thu Mar 07 21:01:37 +0000 2013" - }, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "listed_count":611, - "description":"PHP and ZF Developer; crazed father of two.", - "profile_link_color":"D02B55", - "geo_enabled":false - }, - { - "is_translator":false, - "id":12778882, - "created_at":"Mon Jan 28 09:56:17 +0000 2008", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/phpdeveloper.org", - "indices":[ - 0, - 23 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/46486852\/twitter_img_normal.gif", - "profile_use_background_image":true, - "statuses_count":9226, - "url":"http:\/\/phpdeveloper.org", - "profile_text_color":"000000", - "id_str":"12778882", - "follow_request_sent":false, - "utc_offset":-25200, - "default_profile_image":false, - "name":"phpdeveloper", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"7D4D4D", - "favourites_count":0, - "friends_count":1, - "screen_name":"phpdeveloper", - "protected":false, - "location":null, - "profile_background_tile":false, - "followers_count":11255, - "profile_sidebar_fill_color":"D5D5D5", - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"FFFFFF", - "contributors_enabled":false, - "time_zone":"Mountain Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/46486852\/twitter_img_normal.gif", - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/XpCeabAQqL", - "indices":[ - 114, - 136 - ], - "display_url":"bit.ly\/10lZiji", - "expanded_url":"http:\/\/bit.ly\/10lZiji" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "coordinates":null, - "in_reply_to_status_id_str":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "id_str":"309737475574738945", - "retweeted":false, - "truncated":false, - "text":"Lorna Mitchell: Installing XHGui: \nLorna Mitchell has a new post today showing you how to install XHGui to hel... http:\/\/t.co\/XpCeabAQqL", - "possibly_sensitive":false, - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/twitterfeed.com\u0022 rel=\u0022nofollow\u0022\u003Etwitterfeed\u003C\/a\u003E", - "id":309737475574738945, - "created_at":"Thu Mar 07 18:49:03 +0000 2013" - }, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/1927752\/sidebar_img.gif", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/1927752\/sidebar_img.gif", - "listed_count":681, - "description":"PHPDeveloper.org - PHP News, Views \u0026 Community", - "profile_link_color":"961A1E", - "geo_enabled":false - }, - { - "id":24173089, - "created_at":"Fri Mar 13 13:51:31 +0000 2009", - "profile_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/profile_images\/94865980\/39d66a8cf.7605677_normal.jpg", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/t.co\/zLVoh56J", - "indices":[ - 0, - 20 - ], - "display_url":"goo.gl\/YU5C2", - "expanded_url":"http:\/\/goo.gl\/YU5C2" - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "is_translator":false, - "statuses_count":895, - "url":"http:\/\/t.co\/zLVoh56J", - "profile_text_color":"333333", - "id_str":"24173089", - "follow_request_sent":false, - "utc_offset":3600, - "default_profile_image":false, - "name":"Jonathan Maron", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"BDDCAD", - "favourites_count":2, - "friends_count":311, - "screen_name":"JonathanMaron", - "protected":false, - "location":"Charlotte \u00b7 Bremen \u00b7 Taipei", - "profile_background_tile":false, - "followers_count":5213, - "profile_sidebar_fill_color":"DDFFCC", - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"9AE4E8", - "contributors_enabled":false, - "time_zone":"Berlin", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/94865980\/39d66a8cf.7605677_normal.jpg", - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - { - "indices":[ - 90, - 95 - ], - "text":"jobs" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/fTUapkKc", - "indices":[ - 96, - 116 - ], - "display_url":"lnkd.in\/T_Xk8C", - "expanded_url":"http:\/\/lnkd.in\/T_Xk8C" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":2, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "id_str":"303484676146855936", - "retweeted":false, - "in_reply_to_user_id_str":null, - "truncated":false, - "text":"I\u0027m hiring! Web Developer - PHP, Zend Framework, HTM at The Imaging Source Asia - Taiwan #jobs http:\/\/t.co\/fTUapkKc", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.linkedin.com\/\u0022 rel=\u0022nofollow\u0022\u003ELinkedIn\u003C\/a\u003E", - "id":303484676146855936, - "created_at":"Mon Feb 18 12:42:39 +0000 2013", - "possibly_sensitive":false - }, - "profile_background_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/profile_background_images\/6047727\/sky369.jpg", - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/6047727\/sky369.jpg", - "listed_count":305, - "description":"Head of Web Development. Multi-Cultural Project Manger in Europe and Asia. Senior PHP Developer. Unconference Organizer. Zend Framework 1 and 2 Contributor.", - "profile_link_color":"0084B4", - "geo_enabled":false - }, - { - "is_translator":false, - "id":9075802, - "created_at":"Mon Sep 24 19:35:22 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.astrumfutura.com", - "indices":[ - 0, - 28 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/blog.astrumfutura.com", - "profile_text_color":"3E4415", - "id_str":"9075802", - "follow_request_sent":false, - "statuses_count":9614, - "utc_offset":0, - "name":"P\u00e1draic Brady", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"829D5E", - "screen_name":"padraicb", - "favourites_count":70, - "friends_count":870, - "profile_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "protected":false, - "location":"Dublin, Ireland, Europe!", - "profile_background_tile":false, - "followers_count":2561, - "profile_sidebar_fill_color":"99CC33", - "following":true, - "verified":false, - "default_profile":false, - "profile_background_color":"352726", - "contributors_enabled":false, - "time_zone":"Dublin", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/374757042\/twitterProfilePhoto_normal.jpg", - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/bsPABZjxCb", - "indices":[ - 51, - 73 - ], - "display_url":"kck.st\/YPBIUV", - "expanded_url":"http:\/\/kck.st\/YPBIUV" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":2, - "in_reply_to_status_id_str":null, - "coordinates":null, - "in_reply_to_user_id_str":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309786369847328769", - "retweeted":false, - "possibly_sensitive":false, - "truncated":false, - "text":"This kickstarter is quickly becoming ridiculous... http:\/\/t.co\/bsPABZjxCb $1.8m in two days. ~30 days to go.", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "id":309786369847328769, - "created_at":"Thu Mar 07 22:03:20 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "description":"Grumpy Irish PHP developer. Contributor to Zend Framework. Author of the Web Pirate\u0027s Guide To PHP Security. Creator of Mockery, Escaper and Stickler libraries.", - "profile_link_color":"D02B55", - "geo_enabled":false, - "listed_count":259, - "profile_background_image_url_https":"https:\/\/twimg0-a.akamaihd.net\/images\/themes\/theme5\/bg.gif" - }, - { - "is_translator":false, - "id":26628904, - "created_at":"Wed Mar 25 23:42:12 +0000 2009", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.planet-php.net\/", - "indices":[ - 0, - 26 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "statuses_count":5135, - "url":"http:\/\/www.planet-php.net\/", - "profile_text_color":"333333", - "id_str":"26628904", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/584197411\/twitterProfilePhoto_normal.jpg", - "follow_request_sent":false, - "utc_offset":0, - "default_profile_image":false, - "name":"Planet PHP", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "favourites_count":0, - "friends_count":45, - "screen_name":"planetphp", - "protected":false, - "location":"Web", - "profile_background_tile":false, - "followers_count":19005, - "profile_sidebar_fill_color":"DDEEF6", - "following":true, - "verified":false, - "default_profile":true, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"London", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/584197411\/twitterProfilePhoto_normal.jpg", - "status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "in_reply_to_status_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id_str":null, - "in_reply_to_user_id":null, - "id_str":"309748553553702912", - "retweeted":false, - "truncated":false, - "text":"Service Announcement: Due to a move of our (physical) servers to another data center, Planet PHP will be offline tomorrow night (CET\/UTC)", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.echofon.com\/\u0022 rel=\u0022nofollow\u0022\u003EEchofon\u003C\/a\u003E", - "id":309748553553702912, - "created_at":"Thu Mar 07 19:33:04 +0000 2013" - }, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "listed_count":1131, - "description":"Echo of Planet PHP", - "profile_link_color":"0084B4", - "geo_enabled":false - }, - { - "id":14309129, - "created_at":"Sat Apr 05 08:01:22 +0000 2008", - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":null, - "profile_text_color":"333333", - "id_str":"14309129", - "default_profile":true, - "follow_request_sent":false, - "utc_offset":-28800, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1879952169\/IMG_0829-4_normal.JPG", - "name":"andigutmans", - "lang":"en", - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "screen_name":"andigutmans", - "protected":false, - "listed_count":306, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", - "location":null, - "profile_background_tile":false, - "followers_count":3284, - "profile_sidebar_fill_color":"DDEEF6", - "following":true, - "verified":false, - "statuses_count":951, - "profile_background_color":"C0DEED", - "default_profile_image":false, - "contributors_enabled":false, - "is_translator":false, - "favourites_count":3, - "time_zone":"Pacific Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1879952169\/IMG_0829-4_normal.JPG", - "friends_count":372, - "status":{ - "entities":{ - "user_mentions":[ - { - "screen_name":"bhorowitz", - "name":"bhorowitz", - "indices":[ - 3, - 13 - ], - "id_str":"16242081", - "id":16242081 - } - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/qAxyTTGWYo", - "indices":[ - 54, - 76 - ], - "display_url":"rapgenius.com\/1548040", - "expanded_url":"http:\/\/rapgenius.com\/1548040" - } - ] - }, - "favorited":false, - "retweeted_status":{ - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/qAxyTTGWYo", - "indices":[ - 39, - 61 - ], - "display_url":"rapgenius.com\/1548040", - "expanded_url":"http:\/\/rapgenius.com\/1548040" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":49, - "possibly_sensitive":false, - "in_reply_to_status_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id_str":null, - "in_reply_to_user_id":null, - "id_str":"308018039599816704", - "retweeted":false, - "truncated":false, - "text":"Marc Andreessen decoding Andrew Mason: http:\/\/t.co\/qAxyTTGWYo", - "in_reply_to_status_id":null, - "source":"web", - "id":308018039599816704, - "created_at":"Sun Mar 03 00:56:37 +0000 2013" - }, - "place":null, - "geo":null, - "retweet_count":49, - "possibly_sensitive":false, - "in_reply_to_status_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id_str":null, - "in_reply_to_user_id":null, - "id_str":"308025904884490240", - "retweeted":false, - "truncated":false, - "text":"RT @bhorowitz: Marc Andreessen decoding Andrew Mason: http:\/\/t.co\/qAxyTTGWYo", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/twitter.com\/#!\/download\/ipad\u0022 rel=\u0022nofollow\u0022\u003ETwitter for iPad\u003C\/a\u003E", - "id":308025904884490240, - "created_at":"Sun Mar 03 01:27:53 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "description":null, - "profile_link_color":"0084B4", - "geo_enabled":false - }, - { - "id":4795561, - "created_at":"Sun Apr 15 20:54:29 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/blog.calevans.com\/epk", - "indices":[ - 0, - 28 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/blog.calevans.com\/epk", - "profile_text_color":"333333", - "id_str":"4795561", - "follow_request_sent":false, - "statuses_count":27679, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "utc_offset":-21600, - "name":"Cal Evans", - "lang":"en", - "default_profile_image":false, - "notifications":true, - "profile_sidebar_border_color":"eeeeee", - "screen_name":"CalEvans", - "favourites_count":17, - "friends_count":167, - "protected":false, - "location":"Nashville, TN", - "profile_background_tile":true, - "followers_count":5085, - "profile_sidebar_fill_color":"efefef", - "is_translator":false, - "following":true, - "verified":false, - "default_profile":false, - "profile_background_color":"131516", - "contributors_enabled":false, - "time_zone":"Central Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1376139884\/cal_dpc11_reallysmall_normal.png", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"nashvillegeeks", - "name":"Nashville Geeks", - "indices":[ - 3, - 18 - ], - "id_str":"14105595", - "id":14105595 - }, - { - "screen_name":"kateo", - "name":"Kate O\u0027Neill", - "indices":[ - 23, - 29 - ], - "id_str":"668563", - "id":668563 - }, - { - "screen_name":"ellestar27", - "name":"Lora Stevenson", - "indices":[ - 47, - 58 - ], - "id_str":"16287570", - "id":16287570 - } - ], - "hashtags":[ - { - "indices":[ - 104, - 114 - ], - "text":"nashville" - }, - { - "indices":[ - 115, - 120 - ], - "text":"tech" - } - ], - "urls":[ - - ] - }, - "favorited":false, - "retweeted_status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"kateo", - "name":"Kate O\u0027Neill", - "indices":[ - 3, - 9 - ], - "id_str":"668563", - "id":668563 - }, - { - "screen_name":"ellestar27", - "name":"Lora Stevenson", - "indices":[ - 27, - 38 - ], - "id_str":"16287570", - "id":16287570 - } - ], - "hashtags":[ - { - "indices":[ - 84, - 94 - ], - "text":"nashville" - }, - { - "indices":[ - 95, - 100 - ], - "text":"tech" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/3sziCz0vGK", - "indices":[ - 112, - 134 - ], - "display_url":"wp.me\/p2JUV5-hk", - "expanded_url":"http:\/\/wp.me\/p2JUV5-hk" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":3, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309794970510979074", - "retweeted":false, - "truncated":false, - "text":"RT @kateo: Code Kerfuffle: @ellestar27 elegantly explains some growing pains in the #nashville #tech community: http:\/\/t.co\/3sziCz0vGK", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.hootsuite.com\u0022 rel=\u0022nofollow\u0022\u003EHootSuite\u003C\/a\u003E", - "id":309794970510979074, - "created_at":"Thu Mar 07 22:37:31 +0000 2013" - }, - "place":null, - "geo":null, - "retweet_count":3, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309795592857600000", - "retweeted":false, - "truncated":false, - "text":"RT @nashvillegeeks: RT @kateo: Code Kerfuffle: @ellestar27 elegantly explains some growing pains in the #nashville #tech community: http ...", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "id":309795592857600000, - "created_at":"Thu Mar 07 22:39:59 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme14\/bg.gif", - "description":"Author of Avoiding a Goat Rodeo: How to get the website you want http:\/\/bit.ly\/goat_rodeo Read this book before you hire a developer to build your website!", - "profile_link_color":"009999", - "geo_enabled":true, - "listed_count":540, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme14\/bg.gif" - }, - { - "id":147184528, - "created_at":"Sun May 23 12:43:11 +0000 2010", - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":null, - "profile_text_color":"666666", - "id_str":"147184528", - "follow_request_sent":false, - "statuses_count":540, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/923777414\/zf-logo-mark-big-rect_normal.png", - "utc_offset":null, - "name":"All Zend Framework", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"181A1E", - "screen_name":"allzend", - "favourites_count":0, - "friends_count":0, - "protected":false, - "location":"Paris, France", - "profile_background_tile":false, - "followers_count":783, - "profile_sidebar_fill_color":"252429", - "is_translator":false, - "following":true, - "verified":false, - "default_profile":false, - "profile_background_color":"1A1B1F", - "contributors_enabled":false, - "time_zone":null, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/923777414\/zf-logo-mark-big-rect_normal.png", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - { - "indices":[ - 131, - 134 - ], - "text":"zf" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/jVGcNCsCPa", - "indices":[ - 108, - 130 - ], - "display_url":"bit.ly\/XCWWII", - "expanded_url":"http:\/\/bit.ly\/XCWWII" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"308413623498313728", - "retweeted":false, - "truncated":false, - "text":"Event: WEBINAR: Mobile App Development in Zend Studio 10: WEBINAR: Mobile App Development in Zend Studio 10 http:\/\/t.co\/jVGcNCsCPa #zf", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/twitterfeed.com\u0022 rel=\u0022nofollow\u0022\u003Etwitterfeed\u003C\/a\u003E", - "id":308413623498313728, - "created_at":"Mon Mar 04 03:08:32 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "description":"Ultimate feed of all things Zend Framework. Pure knowledge. No noise. By @maciejzgadzaj", - "profile_link_color":"69B604", - "geo_enabled":false, - "listed_count":59, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif" - }, - { - "id":50256541, - "created_at":"Wed Jun 24 08:55:29 +0000 2009", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.zend.com", - "indices":[ - 0, - 19 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/www.zend.com", - "profile_text_color":"333333", - "id_str":"50256541", - "follow_request_sent":false, - "statuses_count":217, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1425848890\/Icon-for-Twitter-FR-flag_normal.gif", - "utc_offset":3600, - "name":"Zend France", - "lang":"fr", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"FFFFFF", - "screen_name":"Zend_France", - "favourites_count":1, - "friends_count":164, - "protected":false, - "location":"Levallois-Perret", - "profile_background_tile":false, - "followers_count":180, - "profile_sidebar_fill_color":"DDEEF6", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"Paris", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1425848890\/Icon-for-Twitter-FR-flag_normal.gif", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"MisfitGeek", - "name":"Joe Stagner", - "indices":[ - 3, - 14 - ], - "id_str":"9321012", - "id":9321012 - } - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/VkMvtTWRae", - "indices":[ - 78, - 100 - ], - "display_url":"misfitgeek.com\/2013\/02\/instal\u2026", - "expanded_url":"http:\/\/www.misfitgeek.com\/2013\/02\/installing-and-configuring-zend-server-6-on-mac-osx\/" - } - ] - }, - "favorited":false, - "retweeted_status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/VkMvtTWRae", - "indices":[ - 62, - 84 - ], - "display_url":"misfitgeek.com\/2013\/02\/instal\u2026", - "expanded_url":"http:\/\/www.misfitgeek.com\/2013\/02\/installing-and-configuring-zend-server-6-on-mac-osx\/" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":6, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"307153746515853313", - "retweeted":false, - "truncated":false, - "text":"New post: Installing and Configuring Zend Server 6 on Mac OSX http:\/\/t.co\/VkMvtTWRae", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.MisfitGeek.com\u0022 rel=\u0022nofollow\u0022\u003EMisfitGeek.com\u003C\/a\u003E", - "id":307153746515853313, - "created_at":"Thu Feb 28 15:42:14 +0000 2013" - }, - "place":null, - "geo":null, - "retweet_count":6, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"307154780801888256", - "retweeted":false, - "truncated":false, - "text":"RT @MisfitGeek: New post: Installing and Configuring Zend Server 6 on Mac OSX http:\/\/t.co\/VkMvtTWRae", - "in_reply_to_status_id":null, - "source":"web", - "id":307154780801888256, - "created_at":"Thu Feb 28 15:46:21 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/791397899\/31a03fb7249b58fc5b264f7c29d9bfd1.jpeg", - "description":"Zend fournit des solutions pour d\u00e9velopper, g\u00e9rer et d\u00e9ployer des applis PHP", - "profile_link_color":"112585", - "geo_enabled":false, - "listed_count":13, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/791397899\/31a03fb7249b58fc5b264f7c29d9bfd1.jpeg" - }, - { - "id":786965016, - "created_at":"Tue Aug 28 13:06:07 +0000 2012", - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":null, - "profile_text_color":"333333", - "id_str":"786965016", - "follow_request_sent":false, - "statuses_count":3, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2552246710\/zf-logo-mark_normal.png", - "utc_offset":null, - "name":"Zend Framework Devel", - "lang":"en", - "default_profile_image":false, - "notifications":true, - "profile_sidebar_border_color":"C0DEED", - "screen_name":"zfdevteam", - "favourites_count":0, - "friends_count":0, - "protected":false, - "location":null, - "profile_background_tile":false, - "followers_count":135, - "profile_sidebar_fill_color":"DDEEF6", - "is_translator":false, - "following":true, - "verified":false, - "default_profile":true, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":null, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2552246710\/zf-logo-mark_normal.png", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - { - "indices":[ - 9, - 12 - ], - "text":"zf" - }, - { - "indices":[ - 92, - 106 - ], - "text":"zendframework" - }, - { - "indices":[ - 107, - 111 - ], - "text":"php" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/9bQ2Md6KNF", - "indices":[ - 69, - 91 - ], - "display_url":"bit.ly\/zf1-12-2", - "expanded_url":"http:\/\/bit.ly\/zf1-12-2" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":22, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"306168130894438400", - "retweeted":true, - "truncated":false, - "text":"Released #zf 1.12.2 - in particular, updating the Twitter component: http:\/\/t.co\/9bQ2Md6KNF #zendframework #php", - "in_reply_to_status_id":null, - "source":"web", - "id":306168130894438400, - "created_at":"Mon Feb 25 22:25:45 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "description":"Official Zend Framework development team account. http:\/\/framework.zend.com\/", - "profile_link_color":"0084B4", - "geo_enabled":false, - "listed_count":7, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png" - }, - { - "id":53009060, - "created_at":"Thu Jul 02 08:23:41 +0000 2009", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.zend.com", - "indices":[ - 0, - 19 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/www.zend.com", - "profile_text_color":"333333", - "id_str":"53009060", - "follow_request_sent":false, - "statuses_count":148, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2645974572\/646a68a2eb36beb744f8e15b5c6097f4_normal.jpeg", - "utc_offset":3600, - "name":"Stefanie Gebke", - "lang":"de", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "screen_name":"ZEND_Stefanie", - "favourites_count":0, - "friends_count":87, - "protected":false, - "location":"Germany, Stuttgart", - "profile_background_tile":false, - "followers_count":140, - "profile_sidebar_fill_color":"DDEEF6", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":true, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"Berlin", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2645974572\/646a68a2eb36beb744f8e15b5c6097f4_normal.jpeg", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/x60QC75e", - "indices":[ - 119, - 139 - ], - "display_url":"lnkd.in\/HS_CCK", - "expanded_url":"http:\/\/lnkd.in\/HS_CCK" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"279533819902693376", - "retweeted":false, - "truncated":false, - "text":"Die wichtigsten Funktionalit\u00e4ten des automatisierten Deployment-Verfahrens von Zend Server 6 stellen wir in einem 6-Mi\u2026http:\/\/t.co\/x60QC75e", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.linkedin.com\/\u0022 rel=\u0022nofollow\u0022\u003ELinkedIn\u003C\/a\u003E", - "id":279533819902693376, - "created_at":"Fri Dec 14 10:30:30 +0000 2012" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "description":"Zend Technologies GmbH, Senior Account Manager, Central Europe", - "profile_link_color":"0084B4", - "geo_enabled":false, - "listed_count":4, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png" - }, - { - "id":34441429, - "created_at":"Wed Apr 22 23:26:25 +0000 2009", - "entities":{ - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":null, - "profile_text_color":"333333", - "id_str":"34441429", - "follow_request_sent":false, - "statuses_count":2620, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/183352980\/Unbenannt-2_normal.jpg", - "utc_offset":-10800, - "name":"framework_zend", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"C0DEED", - "screen_name":"framework_zend", - "favourites_count":0, - "friends_count":15, - "protected":false, - "location":null, - "profile_background_tile":false, - "followers_count":1568, - "profile_sidebar_fill_color":"DDEEF6", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":true, - "profile_background_color":"C0DEED", - "contributors_enabled":false, - "time_zone":"Greenland", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/183352980\/Unbenannt-2_normal.jpg", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/sidOilGaZ0", - "indices":[ - 114, - 136 - ], - "display_url":"bit.ly\/14yZzMD", - "expanded_url":"http:\/\/bit.ly\/14yZzMD" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":0, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309762667642499073", - "retweeted":false, - "truncated":false, - "text":"Propel ORM Integration und Models: Hey, \n \nwie handelt ihr den Zugriff auf die Propel Objekte ab? Greift ihr ... http:\/\/t.co\/sidOilGaZ0", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/twitterfeed.com\u0022 rel=\u0022nofollow\u0022\u003Etwitterfeed\u003C\/a\u003E", - "id":309762667642499073, - "created_at":"Thu Mar 07 20:29:09 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", - "description":"Blogging important informations on zend_framework", - "profile_link_color":"0084B4", - "geo_enabled":false, - "listed_count":89, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png" - }, - { - "id":9737982, - "created_at":"Sat Oct 27 17:13:43 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.magentocommerce.com\/", - "indices":[ - 0, - 31 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/www.magentocommerce.com\/", - "profile_text_color":"000000", - "id_str":"9737982", - "follow_request_sent":false, - "statuses_count":3838, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1431382474\/DSN-157MagentoTwitter_UpdatedLogo_normal.png", - "utc_offset":-28800, - "name":"Magento", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"000000", - "screen_name":"magento", - "favourites_count":2, - "friends_count":12544, - "protected":false, - "location":"Los Angeles, CA", - "profile_background_tile":false, - "followers_count":30683, - "profile_sidebar_fill_color":"FFF7E1", - "is_translator":false, - "profile_banner_url":"https:\/\/si0.twimg.com\/profile_banners\/9737982\/1358458709", - "following":false, - "verified":true, - "default_profile":false, - "profile_background_color":"000000", - "contributors_enabled":false, - "time_zone":"Pacific Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1431382474\/DSN-157MagentoTwitter_UpdatedLogo_normal.png", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"monocat", - "name":"Mosses Akizian", - "indices":[ - 3, - 11 - ], - "id_str":"16366137", - "id":16366137 - } - ], - "hashtags":[ - { - "indices":[ - 23, - 39 - ], - "text":"MagentoBugathon" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/3VWM2PJl96", - "indices":[ - 86, - 108 - ], - "display_url":"monoc.at\/W8q3UM", - "expanded_url":"http:\/\/monoc.at\/W8q3UM" - } - ] - }, - "favorited":false, - "retweeted_status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - { - "indices":[ - 10, - 26 - ], - "text":"MagentoBugathon" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/3VWM2PJl96", - "indices":[ - 73, - 95 - ], - "display_url":"monoc.at\/W8q3UM", - "expanded_url":"http:\/\/monoc.at\/W8q3UM" - }, - { - "url":"http:\/\/t.co\/6XZ8n95dIc", - "indices":[ - 118, - 140 - ], - "display_url":"monoc.at\/XKUBZ1", - "expanded_url":"http:\/\/monoc.at\/XKUBZ1" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":3, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309734410004099072", - "retweeted":false, - "truncated":false, - "text":"Attending #MagentoBugathon devs- please follow the GitHub acct 4 updates http:\/\/t.co\/3VWM2PJl96 Want 2 join us in LA? http:\/\/t.co\/6XZ8n95dIc", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/bitly.com\u0022 rel=\u0022nofollow\u0022\u003Ebitly\u003C\/a\u003E", - "id":309734410004099072, - "created_at":"Thu Mar 07 18:36:52 +0000 2013" - }, - "place":null, - "geo":null, - "retweet_count":3, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309782857113542657", - "retweeted":false, - "truncated":false, - "text":"RT @monocat: Attending #MagentoBugathon devs- please follow the GitHub acct 4 updates http:\/\/t.co\/3VWM2PJl96 Want 2 join us in LA? http: ...", - "in_reply_to_status_id":null, - "source":"\u003Ca href=\u0022http:\/\/www.tweetdeck.com\u0022 rel=\u0022nofollow\u0022\u003ETweetDeck\u003C\/a\u003E", - "id":309782857113542657, - "created_at":"Thu Mar 07 21:49:23 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/766413455\/e67020773abe0008269e7ff5878cf25b.jpeg", - "description":"Flexible eCommerce solutions, a vibrant extensions marketplace and an open global ecosystem", - "profile_link_color":"F47B20", - "geo_enabled":false, - "listed_count":1496, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/766413455\/e67020773abe0008269e7ff5878cf25b.jpeg" - }, - { - "id":129482704, - "created_at":"Sun Apr 04 12:39:19 +0000 2010", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/www.zend.com\/studio", - "indices":[ - 0, - 26 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":false, - "url":"http:\/\/www.zend.com\/studio", - "profile_text_color":"3C3940", - "id_str":"129482704", - "follow_request_sent":false, - "statuses_count":347, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/831022894\/st_normal.JPG", - "utc_offset":3600, - "name":"Zend Studio Team", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"5ED4DC", - "screen_name":"ZendStudioFan", - "favourites_count":0, - "friends_count":1829, - "protected":false, - "location":"Cupertino, CA", - "profile_background_tile":false, - "followers_count":963, - "profile_sidebar_fill_color":"A39B9B", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"159909", - "contributors_enabled":false, - "time_zone":"Amsterdam", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/831022894\/st_normal.JPG", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"nataliabartol", - "name":"Natalia Bartol", - "indices":[ - 3, - 17 - ], - "id_str":"245770498", - "id":245770498 - } - ], - "hashtags":[ - - ], - "urls":[ - - ] - }, - "favorited":false, - "retweeted_status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - - ], - "hashtags":[ - - ], - "urls":[ - { - "url":"http:\/\/t.co\/Wi52c65h", - "indices":[ - 110, - 130 - ], - "display_url":"goo.gl\/EEG3x", - "expanded_url":"http:\/\/goo.gl\/EEG3x" - } - ] - }, - "favorited":false, - "place":null, - "geo":null, - "retweet_count":2, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"303899315728949248", - "retweeted":false, - "truncated":false, - "text":"Developed Cloud Connected Mobile application in Studio 10 Beta and now updated to final release? Please read: http:\/\/t.co\/Wi52c65h", - "in_reply_to_status_id":null, - "source":"web", - "id":303899315728949248, - "created_at":"Tue Feb 19 16:10:17 +0000 2013" - }, - "place":null, - "geo":null, - "retweet_count":2, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"303899594364952576", - "retweeted":false, - "truncated":false, - "text":"RT @nataliabartol: Developed Cloud Connected Mobile application in Studio 10 Beta and now updated to final release? Please read: http:\/\/ ...", - "in_reply_to_status_id":null, - "source":"web", - "id":303899594364952576, - "created_at":"Tue Feb 19 16:11:24 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/93075947\/st.JPG", - "description":"Professional-grade PHP IDE designed to maximize developer productivity, solve application problems quickly and improve team collaboration", - "profile_link_color":"010F0E", - "geo_enabled":true, - "listed_count":72, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/93075947\/st.JPG" - }, - { - "id":928961, - "created_at":"Sun Mar 11 15:39:19 +0000 2007", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/toys.lerdorf.com", - "indices":[ - 0, - 23 - ], - "display_url":null, - "expanded_url":null - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "profile_use_background_image":true, - "url":"http:\/\/toys.lerdorf.com", - "profile_text_color":"666666", - "id_str":"928961", - "follow_request_sent":false, - "statuses_count":4181, - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1844920209\/rl_crop-modified_normal.jpg", - "utc_offset":-28800, - "name":"Rasmus Lerdorf", - "lang":"en", - "default_profile_image":false, - "notifications":false, - "profile_sidebar_border_color":"181A1E", - "screen_name":"rasmus", - "favourites_count":3, - "friends_count":114, - "protected":false, - "location":"Santa Clara County, California", - "profile_background_tile":false, - "followers_count":22873, - "profile_sidebar_fill_color":"252429", - "is_translator":false, - "following":false, - "verified":false, - "default_profile":false, - "profile_background_color":"1A1B1F", - "contributors_enabled":false, - "time_zone":"Pacific Time (US \u0026 Canada)", - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1844920209\/rl_crop-modified_normal.jpg", - "status":{ - "in_reply_to_status_id_str":null, - "entities":{ - "user_mentions":[ - { - "screen_name":"marthakelly", - "name":"martha kelly", - "indices":[ - 15, - 27 - ], - "id_str":"17578918", - "id":17578918 - } - ], - "hashtags":[ - { - "indices":[ - 112, - 117 - ], - "text":"etsy" - } - ], - "urls":[ - { - "url":"http:\/\/t.co\/POgyVprHaR", - "indices":[ - 30, - 52 - ], - "display_url":"onforb.es\/104EJE1", - "expanded_url":"http:\/\/onforb.es\/104EJE1" - } - ] - }, - "favorited":false, - "place":{ - "name":"Sunnyvale", - "url":"http:\/\/api.twitter.com\/1\/geo\/id\/45cadd6ef118ec9f.json", - "country":"United States", - "place_type":"city", - "country_code":"US", - "bounding_box":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -122.065265, - 37.329895 - ], - [ - -121.98242, - 37.329895 - ], - [ - -121.98242, - 37.464087 - ], - [ - -122.065265, - 37.464087 - ] - ] - ] - }, - "attributes":{ - - }, - "id":"45cadd6ef118ec9f", - "full_name":"Sunnyvale, CA" - }, - "geo":null, - "retweet_count":6, - "possibly_sensitive":false, - "in_reply_to_user_id_str":null, - "coordinates":null, - "contributors":null, - "in_reply_to_screen_name":null, - "in_reply_to_user_id":null, - "id_str":"309198995660627968", - "retweeted":false, - "truncated":false, - "text":"Nice interview @marthakelly - http:\/\/t.co\/POgyVprHaR - and yes, I did notice your favourite languages answer :) #etsy", - "in_reply_to_status_id":null, - "source":"web", - "id":309198995660627968, - "created_at":"Wed Mar 06 07:09:19 +0000 2013" - }, - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme9\/bg.gif", - "description":"Breaking the Web", - "profile_link_color":"2FC2EF", - "geo_enabled":true, - "listed_count":1768, - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme9\/bg.gif" - } -] diff --git a/tests/Zend/Service/Twitter/_files/users.show.mwop.json b/tests/Zend/Service/Twitter/_files/users.show.mwop.json deleted file mode 100644 index 89b4dd4ebb..0000000000 --- a/tests/Zend/Service/Twitter/_files/users.show.mwop.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "id":9453382, - "id_str":"9453382", - "name":"weierophinney", - "screen_name":"mwop", - "location":"Sioux Falls, SD", - "description":"PHP and ZF Developer; crazed father of two.", - "url":"http:\/\/mwop.net\/", - "entities":{ - "url":{ - "urls":[ - { - "url":"http:\/\/mwop.net\/", - "expanded_url":null, - "indices":[ - 0, - 16 - ] - } - ] - }, - "description":{ - "urls":[ - - ] - } - }, - "protected":false, - "followers_count":6358, - "friends_count":191, - "listed_count":610, - "created_at":"Mon Oct 15 11:34:13 +0000 2007", - "favourites_count":357, - "utc_offset":3600, - "time_zone":"Brussels", - "geo_enabled":false, - "verified":false, - "statuses_count":13279, - "lang":"en", - "status":{ - "created_at":"Mon Mar 04 22:01:32 +0000 2013", - "id":308698753609646081, - "id_str":"308698753609646081", - "text":"I think Twitter has been deliberately vague about how to create the oauth_signature for its headers.", - "source":"\u003Ca href=\u0022http:\/\/hotot.org\u0022 rel=\u0022nofollow\u0022\u003EHotot for Chrome\u003C\/a\u003E", - "truncated":false, - "in_reply_to_status_id":null, - "in_reply_to_status_id_str":null, - "in_reply_to_user_id":null, - "in_reply_to_user_id_str":null, - "in_reply_to_screen_name":null, - "geo":null, - "coordinates":null, - "place":null, - "contributors":null, - "retweet_count":0, - "entities":{ - "hashtags":[ - - ], - "urls":[ - - ], - "user_mentions":[ - - ] - }, - "favorited":false, - "retweeted":false - }, - "contributors_enabled":false, - "is_translator":false, - "profile_background_color":"352726", - "profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme5\/bg.gif", - "profile_background_tile":false, - "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/58517578\/logo_normal.gif", - "profile_link_color":"D02B55", - "profile_sidebar_border_color":"829D5E", - "profile_sidebar_fill_color":"99CC33", - "profile_text_color":"3E4415", - "profile_use_background_image":true, - "default_profile":false, - "default_profile_image":false, - "following":false, - "follow_request_sent":false, - "notifications":false -} diff --git a/tests/Zend/Service/WindowsAzure/AllTests.php b/tests/Zend/Service/WindowsAzure/AllTests.php deleted file mode 100644 index bbbd3571f5..0000000000 --- a/tests/Zend/Service/WindowsAzure/AllTests.php +++ /dev/null @@ -1,104 +0,0 @@ -addTest(Zend_Service_WindowsAzure_Credentials_AllTests::suite()); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNTESTS) { - $suite->addTest(Zend_Service_WindowsAzure_Diagnostics_AllTests::suite()); - } - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_RUNTESTS) { - $suite->addTest(Zend_Service_WindowsAzure_Management_AllTests::suite()); - } - - $suite->addTestSuite('Zend_Service_WindowsAzure_RetryPolicyTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_StorageTest'); - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $suite->addTestSuite('Zend_Service_WindowsAzure_BlobStorageTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_BlobStorageSharedAccessTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_BlobStreamTest'); - } - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $suite->addTestSuite('Zend_Service_WindowsAzure_TableEntityTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_DynamicTableEntityTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_TableEntityQueryTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_TableStorageTest'); - } - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $suite->addTestSuite('Zend_Service_WindowsAzure_QueueStorageTest'); - } - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $suite->addTestSuite('Zend_Service_WindowsAzure_TableSessionHandlerTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_BlobSessionHandlerTest'); - } - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_WindowsAzure_AllTests::main') { - Zend_Service_WindowsAzure_AllTests::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/BlobSessionHandlerTest.php b/tests/Zend/Service/WindowsAzure/BlobSessionHandlerTest.php deleted file mode 100644 index d6ae0b90fb..0000000000 --- a/tests/Zend/Service/WindowsAzure/BlobSessionHandlerTest.php +++ /dev/null @@ -1,207 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_TABLENAME_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - /** - * Test open - */ - public function testOpen() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $result = $sessionHandler->open(); - - $this->assertTrue($result); - - - $verifyResult = $storageClient->listContainers(); - $this->assertEquals($tableName, $verifyResult[0]->Name); - } - } - - /** - * Test write - */ - public function testWrite() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - - $verifyResult = $storageClient->listBlobs($tableName); - $this->assertEquals(1, count($verifyResult)); - } - } - - /** - * Test write large - */ - public function testWriteLarge() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - - $sessionData = ''; - for ($i = 0; $i < 2 * Zend_Service_WindowsAzure_SessionHandler::MAX_TS_PROPERTY_SIZE; $i++) { - $sessionData .= 'a'; - } - $sessionData = serialize( $sessionData ); - - $sessionHandler->write($sessionId, $sessionData); - - - $verifyResult = $storageClient->listBlobs($tableName); - $this->assertEquals(1, count($verifyResult)); - } - } - - /** - * Test destroy - */ - public function testDestroy() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - $result = $sessionHandler->destroy($sessionId); - $this->assertTrue($result); - - $verifyResult = $storageClient->listBlobs($tableName); - $this->assertEquals(0, count($verifyResult)); - } - } - - /** - * Test gc - */ - public function testGc() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - sleep(1); // let time() tick - - $result = $sessionHandler->gc(0); - $this->assertTrue($result); - - $verifyResult = $storageClient->listBlobs($tableName); - $this->assertEquals(0, count($verifyResult)); - } - } -} - -// Call Zend_Service_WindowsAzure_BlobSessionHandlerTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobSessionHandlerTest::main") { - Zend_Service_WindowsAzure_BlobSessionHandlerTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/BlobStorageSharedAccessTest.php b/tests/Zend/Service/WindowsAzure/BlobStorageSharedAccessTest.php deleted file mode 100644 index f435d32b78..0000000000 --- a/tests/Zend/Service/WindowsAzure/BlobStorageSharedAccessTest.php +++ /dev/null @@ -1,222 +0,0 @@ -createAdministrativeStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOBSA_CONTAINER_PREFIX . $i); } catch (Exception $e) { } - } - try { $storageClient->deleteContainer('$root'); } catch (Exception $e) { } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - $storageClient->setCredentials( - new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false) - ); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - $storageClient->setCredentials( - new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true) - ); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected function createAdministrativeStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOBSA_CONTAINER_PREFIX . self::$uniqId; - } - - /** - * Test shared access, only write - */ - public function testSharedAccess_OnlyWrite() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - - // Account owner performs this part - $administrativeStorageClient = $this->createAdministrativeStorageInstance(); - $administrativeStorageClient->createContainer($containerName); - - $sharedAccessUrl = $administrativeStorageClient->generateSharedAccessUrl( - $containerName, - '', - 'c', - 'w', - $administrativeStorageClient->isoDate(time() - 500), - $administrativeStorageClient->isoDate(time() + 3000) - ); - - - // Reduced permissions user performs this part - $storageClient = $this->createStorageInstance(); - $credentials = $storageClient->getCredentials(); - $credentials->setPermissionSet(array( - $sharedAccessUrl - )); - - $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('images/WindowsAzure.gif', $result->Name); - - - - // Now make sure reduced permissions user can not view the uploaded blob - $exceptionThrown = false; - try { - $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test different accounts - */ - public function testDifferentAccounts() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - - // Account owner performs this part - $administrativeStorageClient = $this->createAdministrativeStorageInstance(); - $administrativeStorageClient->createContainer($containerName); - - $sharedAccessUrl1 = $administrativeStorageClient->generateSharedAccessUrl( - $containerName, - '', - 'c', - 'w', - $administrativeStorageClient->isoDate(time() - 500), - $administrativeStorageClient->isoDate(time() + 3000) - ); - $sharedAccessUrl2 = str_replace($administrativeStorageClient->getAccountName(), 'bogusaccount', $sharedAccessUrl1); - - - // Reduced permissions user performs this part and should fail, - // because different accounts have been used - $storageClient = $this->createStorageInstance(); - $credentials = $storageClient->getCredentials(); - - $exceptionThrown = false; - try { - $credentials->setPermissionSet(array( - $sharedAccessUrl1, - $sharedAccessUrl2 - )); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } -} - -// Call Zend_Service_WindowsAzure_BlobStorageSharedAccessTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobStorageSharedAccessTest::main") { - Zend_Service_WindowsAzure_BlobStorageSharedAccessTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/BlobStorageTest.php b/tests/Zend/Service/WindowsAzure/BlobStorageTest.php deleted file mode 100644 index ce447b97ac..0000000000 --- a/tests/Zend/Service/WindowsAzure/BlobStorageTest.php +++ /dev/null @@ -1,866 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_CONTAINER_PREFIX . $i); } catch (Exception $e) { } - } - try { $storageClient->deleteContainer('$root'); } catch (Exception $e) { } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNONPROD) - { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_CONTAINER_PREFIX . self::$uniqId; - } - - /** - * Test container exists - */ - public function testContainerExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName1 = $this->generateName(); - $containerName2 = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName1); - $storageClient->createContainer($containerName2); - - $result = $storageClient->containerExists($containerName1); - $this->assertTrue($result); - - $result = $storageClient->containerExists(md5(time())); - $this->assertFalse($result); - } - } - - /** - * Test blob exists - */ - public function testBlobExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlob($containerName, 'WindowsAzure1.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'WindowsAzure2.gif', self::$path . 'WindowsAzure.gif'); - - $result = $storageClient->blobExists($containerName, 'WindowsAzure1.gif'); - $this->assertTrue($result); - - $result = $storageClient->blobExists($containerName, md5(time())); - $this->assertFalse($result); - } - } - - /** - * Test create container - */ - public function testCreateContainer() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $result = $storageClient->createContainer($containerName); - $this->assertEquals($containerName, $result->Name); - } - } - - /** - * Test get container acl - */ - public function testGetContainerAcl() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $acl = $storageClient->getContainerAcl($containerName); - $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, $acl); - } - } - - /** - * Test create container if not exists - */ - public function testCreateContainerIfNotExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $result = $storageClient->containerExists($containerName); - $this->assertFalse($result); - - $storageClient->createContainerIfNotExists($containerName); - - $result = $storageClient->containerExists($containerName); - $this->assertTrue($result); - - $storageClient->createContainerIfNotExists($containerName); - } - } - - /** - * Test set container acl - */ - public function testSetContainerAcl() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB); - $acl = $storageClient->getContainerAcl($containerName); - - $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_BLOB, $acl); - - $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER); - $acl = $storageClient->getContainerAcl($containerName); - - $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl); - - $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE); - $acl = $storageClient->getContainerAcl($containerName); - - $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, $acl); - } - } - - /** - * Test set container acl advanced - */ - public function testSetContainerAclAdvanced() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - require_once 'Zend/Service/WindowsAzure/Storage/SignedIdentifier.php'; - - $storageClient->setContainerAcl( - $containerName, - Zend_Service_WindowsAzure_Storage_Blob::ACL_PRIVATE, - array( - new Zend_Service_WindowsAzure_Storage_SignedIdentifier('ABCDEF', '2009-10-10', '2009-10-11', 'r') - ) - ); - $acl = $storageClient->getContainerAcl($containerName, true); - - $this->assertEquals(1, count($acl)); - } - } - - /** - * Test set container metadata - */ - public function testSetContainerMetadata() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->setContainerMetadata($containerName, array( - 'createdby' => 'PHPAzure', - )); - - $metadata = $storageClient->getContainerMetadata($containerName); - $this->assertEquals('PHPAzure', $metadata['createdby']); - } - } - - /** - * Test list containers - */ - public function testListContainers() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName1 = 'testlist1'; - $containerName2 = 'testlist2'; - $containerName3 = 'testlist3'; - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName1); - $storageClient->createContainer($containerName2); - $storageClient->createContainer($containerName3); - $result1 = $storageClient->listContainers('testlist'); - $result2 = $storageClient->listContainers('testlist', 1); - - // cleanup first - $storageClient->deleteContainer($containerName1); - $storageClient->deleteContainer($containerName2); - $storageClient->deleteContainer($containerName3); - - $this->assertEquals(3, count($result1)); - $this->assertEquals($containerName2, $result1[1]->Name); - - $this->assertEquals(1, count($result2)); - } - } - - /** - * Test list containers with metadata - */ - public function testListContainersWithMetadata() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName, array( - 'createdby' => 'PHPAzure', - 'ownedby' => 'PHPAzure', - )); - - $result = $storageClient->listContainers($containerName, null, null, 'metadata'); - - $this->assertEquals('PHPAzure', $result[0]->Metadata['createdby']); - $this->assertEquals('PHPAzure', $result[0]->Metadata['ownedby']); - } - } - - /** - * Test put blob - */ - public function testPutBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('images/WindowsAzure.gif', $result->Name); - } - } - - /** - * Test put blob data - */ - public function testPutBlobData() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!'); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('test.txt', $result->Name); - } - } - - /** - * Test put large blob - */ - public function testPutLargeBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS && TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNLARGEBLOB) { - // Create a file > Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE - $fileName = $this->_createLargeFile(); - - // Execute test - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $result = $storageClient->putLargeBlob($containerName, 'LargeFile.txt', $fileName); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('LargeFile.txt', $result->Name); - - // Get block list - $blockList = $storageClient->getBlockList($containerName, 'LargeFile.txt'); - $this->assertTrue(count($blockList['CommittedBlocks']) > 0); - - // Remove file - unlink($fileName); - } - } - - /** - * Test get blob - */ - public function testGetBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $fileName = tempnam('', 'tst'); - $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName); - - $this->assertTrue(file_exists($fileName)); - $this->assertEquals( - file_get_contents(self::$path . 'WindowsAzure.gif'), - file_get_contents($fileName) - ); - - // Remove file - unlink($fileName); - } - } - - /** - * Test get blob data - */ - public function testGetBlobData() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $result = $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!'); - - $data = $storageClient->getBlobData($containerName, 'test.txt'); - - $this->assertEquals( - 'Hello World!', - $data - ); - } - } - - /** - * Test snapshot blob - */ - public function testSnapshotBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('images/WindowsAzure.gif', $result->Name); - - $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif'); - - $fileName = tempnam('', 'tst'); - $storageClient->getBlob($containerName, 'images/WindowsAzure.gif', $fileName, $snapshotId); - - $this->assertTrue(file_exists($fileName)); - $this->assertEquals( - file_get_contents(self::$path . 'WindowsAzure.gif'), - file_get_contents($fileName) - ); - - // Remove file - unlink($fileName); - } - } - - /** - * Test lease blob - */ - public function testLeaseBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlobData($containerName, 'test.txt', 'Hello World!'); - - // Acquire a lease - $lease = $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE); - $this->assertNotEquals('', $lease->LeaseId); - - // Second lease should not be possible - $exceptionThrown = false; - try { - $storageClient->leaseBlob($containerName, 'test.txt', Zend_Service_WindowsAzure_Storage_Blob::LEASE_ACQUIRE); - } catch (Exception $e) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - - // Delete should not be possible - $exceptionThrown = false; - try { - $storageClient->deleteBlob($containerName, 'test.txt'); - } catch (Exception $e) { - $exceptionThrown = true; - } - $this->markTestIncomplete('Test inconclusive. Verify http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/9ae25614-b1da-43ab-abca-644abc034eb3 for info.'); - $this->assertTrue($exceptionThrown); - - // But should work when a lease id is supplied - $exceptionThrown = false; - try { - $storageClient->putBlobData($containerName, 'test.txt', 'Hello!'); - } catch (Exception $e) { - $exceptionThrown = true; - } - $this->assertFalse($exceptionThrown); - } - } - - /** - * Test set blob properties - */ - public function testSetBlobProperties() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $storageClient->setBlobProperties($containerName, 'images/WindowsAzure.gif', null, array( - 'x-ms-blob-content-language' => 'nl-BE', - 'x-ms-blob-content-type' => 'image/gif' - )); - - $blobInstance = $storageClient->getBlobInstance($containerName, 'images/WindowsAzure.gif'); - - $this->assertEquals('nl-BE', $blobInstance->ContentLanguage); - $this->assertEquals('image/gif', $blobInstance->ContentType); - } - } - - /** - * Test set blob metadata - */ - public function testSetBlobMetadata() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array( - 'createdby' => 'PHPAzure', - )); - - $metadata = $storageClient->getBlobMetadata($containerName, 'images/WindowsAzure.gif'); - $this->assertEquals('PHPAzure', $metadata['createdby']); - } - } - - /** - * Test set blob metadata, ensuring no additional headers can be added. - */ - public function testSetBlobMetadata_Security_AdditionalHeaders() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $exceptionThrown = false; - try { - // adding a newline should not be possible... - $storageClient->setBlobMetadata($containerName, 'images/WindowsAzure.gif', array( - 'createdby' => "PHPAzure\nx-ms-meta-something:false", - )); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test delete blob - */ - public function testDeleteBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->deleteBlob($containerName, 'images/WindowsAzure.gif'); - - $result = $storageClient->listBlobs($containerName); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test list blobs - */ - public function testListBlobs() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure4.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure5.gif', self::$path . 'WindowsAzure.gif'); - - $result1 = $storageClient->listBlobs($containerName); - $this->assertEquals(5, count($result1)); - $this->assertEquals('images/WindowsAzure5.gif', $result1[4]->Name); - - $result2 = $storageClient->listBlobs($containerName, '', '', 2); - $this->assertEquals(2, count($result2)); - } - } - - /** - * Test list blobs with all includes - */ - public function testListBlobsWithAllIncludes() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif', array( - 'createdby' => 'PHPAzure', - 'ownedby' => 'PHPAzure', - )); - $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif', array( - 'createdby' => 'PHPAzure', - 'ownedby' => 'PHPAzure', - )); - $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif', array( - 'createdby' => 'PHPAzure', - 'ownedby' => 'PHPAzure', - )); - - $result = $storageClient->listBlobs($containerName, '', '', null, null, 'metadata,snapshots,uncommittedblobs'); - $this->assertEquals(3, count($result)); - $this->assertEquals('images/WindowsAzure2.gif', $result[1]->Name); - - $this->assertEquals('PHPAzure', $result[1]->Metadata['createdby']); - $this->assertEquals('PHPAzure', $result[1]->Metadata['ownedby']); - } - } - - /** - * Test copy blob - */ - public function testCopyBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $source = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $this->assertEquals($containerName, $source->Container); - $this->assertEquals('images/WindowsAzure.gif', $source->Name); - - $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy.gif'); - - $this->assertEquals($containerName, $destination->Container); - $this->assertEquals('images/WindowsAzureCopy.gif', $destination->Name); - - $snapshotId = $storageClient->snapshotBlob($containerName, 'images/WindowsAzure.gif'); - $destination = $storageClient->copyBlob($containerName, 'images/WindowsAzure.gif', $containerName, 'images/WindowsAzureCopy2.gif', array(), $snapshotId); - - $this->assertEquals($containerName, $destination->Container); - $this->assertEquals('images/WindowsAzureCopy2.gif', $destination->Name); - } - } - - /** - * Test root container - */ - public function testRootContainer() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = '$root'; - $storageClient = $this->createStorageInstance(); - $result = $storageClient->createContainer($containerName); - $this->assertEquals($containerName, $result->Name); - - // ACL - $storageClient->setContainerAcl($containerName, Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER); - $acl = $storageClient->getContainerAcl($containerName); - - $this->assertEquals(Zend_Service_WindowsAzure_Storage_Blob::ACL_PUBLIC_CONTAINER, $acl); - - // Metadata - $storageClient->setContainerMetadata($containerName, array( - 'createdby' => 'PHPAzure', - )); - - $metadata = $storageClient->getContainerMetadata($containerName); - $this->assertEquals('PHPAzure', $metadata['createdby']); - - // List - $result = $storageClient->listContainers(); - $this->assertEquals(1, count($result)); - - // Put blob - $result = $storageClient->putBlob($containerName, 'WindowsAzure.gif', self::$path . 'WindowsAzure.gif'); - - $this->assertEquals($containerName, $result->Container); - $this->assertEquals('WindowsAzure.gif', $result->Name); - - // Get blob - $fileName = tempnam('', 'tst'); - $storageClient->getBlob($containerName, 'WindowsAzure.gif', $fileName); - - $this->assertTrue(file_exists($fileName)); - $this->assertEquals( - file_get_contents(self::$path . 'WindowsAzure.gif'), - file_get_contents($fileName) - ); - - // Remove file - unlink($fileName); - - // Blob metadata - $storageClient->setBlobMetadata($containerName, 'WindowsAzure.gif', array( - 'createdby' => 'PHPAzure', - )); - - $metadata = $storageClient->getBlobMetadata($containerName, 'WindowsAzure.gif'); - $this->assertEquals('PHPAzure', $metadata['createdby']); - - // List blobs - $result = $storageClient->listBlobs($containerName); - $this->assertEquals(1, count($result)); - - // Delete blob - $storageClient->deleteBlob($containerName, 'WindowsAzure.gif'); - - $result = $storageClient->listBlobs($containerName); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test page blob - */ - public function testPageBlob() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - // Data to store - $data1 = "Hello, World!" . str_repeat(' ', 1024 - 13); - $data2 = "Hello, World!" . str_repeat(' ', 512 - 13); - - // 1. Create the empty page blob - $storageClient->createPageBlob($containerName, 'test.txt', 1024); - - // 2. Upload all data - $storageClient->putPage($containerName, 'test.txt', 0, 1023, $data1); - - // Verify contents - $this->assertEquals($data1, $storageClient->getBlobData($containerName, 'test.txt')); - - // 3. Clear the page blob - $storageClient->putPage($containerName, 'test.txt', 0, 1023, '', Zend_Service_WindowsAzure_Storage_Blob::PAGE_WRITE_CLEAR); - - // 4. Upload some other data in 2 pages - $storageClient->putPage($containerName, 'test.txt', 0, 511, $data2); - $storageClient->putPage($containerName, 'test.txt', 512, 1023, $data2); - - // Verify other data - $this->assertEquals($data2 . $data2, $storageClient->getBlobData($containerName, 'test.txt')); - } - } - - /** - * Test get page regions - */ - public function testGetPageRegions() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - // Data to store - $data = "Hello, World!" . str_repeat(' ', 512 - 13); - - // Upload contents in 2 parts - $storageClient->createPageBlob($containerName, 'test2.txt', 1024 * 1024 * 1024); - $storageClient->putPage($containerName, 'test2.txt', 0, 511, $data); - $storageClient->putPage($containerName, 'test2.txt', 1048576, 1049087, $data); - - // Get page regions - $pageRegions = $storageClient->getPageRegions($containerName, 'test2.txt'); - - // Verify - $this->assertEquals(2, count($pageRegions)); - } - } - - /** - * Test put blob with x-ms-blob-cache-control header - */ - public function testPutBlobWithCacheControlHeader() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $headers = array("x-ms-blob-cache-control" => "public, max-age=7200"); - $result = $storageClient->putBlob($containerName, 'images/WindowsAzure.gif', self::$path . 'WindowsAzure.gif', array(), null, $headers); - - $blobInstance = $storageClient->getBlobInstance($containerName, 'images/WindowsAzure.gif'); - - $this->assertEquals($headers["x-ms-blob-cache-control"], $blobInstance->CacheControl); - } - } - - /** - * Test put large blob with x-ms-blob-cache-control header - */ - public function testPutLargeBlobWithCacheControlHeader() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS && TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNLARGEBLOB) { - // Create a file > Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE - $fileName = $this->_createLargeFile(); - - // Execute test - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - $headers = array("x-ms-blob-cache-control" => "public, max-age=7200"); - $storageClient->putLargeBlob($containerName, 'LargeFile.txt', $fileName, array(), null, array("x-ms-blob-cache-control" => "public, max-age=7200")); - - $blobInstance = $storageClient->getBlobInstance($containerName, 'LargeFile.txt'); - - $this->assertEquals($headers["x-ms-blob-cache-control"], $blobInstance->CacheControl); - - // Remove file - unlink($fileName); - } - } - - /** - * Create large file - * - * @return string Filename - */ - protected function _createLargeFile() - { - $fileName = tempnam('', 'tst'); - $fp = fopen($fileName, 'w'); - for ($i = 0; $i < Zend_Service_WindowsAzure_Storage_Blob::MAX_BLOB_SIZE / 1024; $i++) - { - fwrite($fp, - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' . - 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' - ); - } - fclose($fp); - return $fileName; - } -} - -// Call Zend_Service_WindowsAzure_BlobStorageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobStorageTest::main") { - Zend_Service_WindowsAzure_BlobStorageTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/BlobStreamTest.php b/tests/Zend/Service/WindowsAzure/BlobStreamTest.php deleted file mode 100644 index 575bdfbdc1..0000000000 --- a/tests/Zend/Service/WindowsAzure/BlobStreamTest.php +++ /dev/null @@ -1,313 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOBSTREAM_CONTAINER_PREFIX . $i); } catch (Exception $e) { } - try { $storageClient->unregisterStreamWrapper('azure'); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOBSTREAM_CONTAINER_PREFIX . self::$uniqId; - } - - /** - * Test read file - */ - public function testReadFile() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $fileName = 'azure://' . $containerName . '/test.txt'; - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - $fh = fopen($fileName, 'w'); - fwrite($fh, "Hello world!"); - fclose($fh); - - $result = file_get_contents($fileName); - - $storageClient->unregisterStreamWrapper(); - - $this->assertEquals('Hello world!', $result); - } - } - - /** - * Test write file - */ - public function testWriteFile() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $fileName = 'azure://' . $containerName . '/test.txt'; - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - $fh = fopen($fileName, 'w'); - fwrite($fh, "Hello world!"); - fclose($fh); - - $storageClient->unregisterStreamWrapper(); - - $instance = $storageClient->getBlobInstance($containerName, 'test.txt'); - $this->assertEquals('test.txt', $instance->Name); - } - } - - /** - * Test unlink file - */ - public function testUnlinkFile() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $fileName = 'azure://' . $containerName . '/test.txt'; - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - $fh = fopen($fileName, 'w'); - fwrite($fh, "Hello world!"); - fclose($fh); - - unlink($fileName); - - $storageClient->unregisterStreamWrapper(); - - $result = $storageClient->listBlobs($containerName); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test copy file - */ - public function testCopyFile() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $sourceFileName = 'azure://' . $containerName . '/test.txt'; - $destinationFileName = 'azure://' . $containerName . '/test2.txt'; - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - $fh = fopen($sourceFileName, 'w'); - fwrite($fh, "Hello world!"); - fclose($fh); - - copy($sourceFileName, $destinationFileName); - - $storageClient->unregisterStreamWrapper(); - - $instance = $storageClient->getBlobInstance($containerName, 'test2.txt'); - $this->assertEquals('test2.txt', $instance->Name); - } - } - - /** - * Test rename file - */ - public function testRenameFile() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $sourceFileName = 'azure://' . $containerName . '/test.txt'; - $destinationFileName = 'azure://' . $containerName . '/test2.txt'; - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - $fh = fopen($sourceFileName, 'w'); - fwrite($fh, "Hello world!"); - fclose($fh); - - rename($sourceFileName, $destinationFileName); - - $storageClient->unregisterStreamWrapper(); - - $instance = $storageClient->getBlobInstance($containerName, 'test2.txt'); - $this->assertEquals('test2.txt', $instance->Name); - } - } - - /** - * Test mkdir - */ - public function testMkdir() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - mkdir('azure://' . $containerName); - - $storageClient->unregisterStreamWrapper(); - - $result = $storageClient->listContainers(); - - $this->assertEquals(1, count($result)); - $this->assertEquals($containerName, $result[0]->Name); - } - } - - /** - * Test rmdir - */ - public function testRmdir() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $storageClient->registerStreamWrapper(); - - mkdir('azure://' . $containerName); - rmdir('azure://' . $containerName); - - $storageClient->unregisterStreamWrapper(); - - $result = $storageClient->listContainers(); - - $this->assertEquals(0, count($result)); - } - } - - /** - * Test opendir - */ - public function testOpendir() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_RUNTESTS) { - $containerName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createContainer($containerName); - - $storageClient->putBlob($containerName, 'images/WindowsAzure1.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure2.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure3.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure4.gif', self::$path . 'WindowsAzure.gif'); - $storageClient->putBlob($containerName, 'images/WindowsAzure5.gif', self::$path . 'WindowsAzure.gif'); - - $result1 = $storageClient->listBlobs($containerName); - - $storageClient->registerStreamWrapper(); - - $result2 = array(); - if ($handle = opendir('azure://' . $containerName)) { - while (false !== ($file = readdir($handle))) { - $result2[] = $file; - } - closedir($handle); - } - - $storageClient->unregisterStreamWrapper(); - - $result = $storageClient->listContainers(); - - $this->assertEquals(count($result1), count($result2)); - } - } -} - -// Call Zend_Service_WindowsAzure_BlobStreamTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_BlobStreamTest::main") { - Zend_Service_WindowsAzure_BlobStreamTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Credentials/AllTests.php b/tests/Zend/Service/WindowsAzure/Credentials/AllTests.php deleted file mode 100644 index 736ac3fd1b..0000000000 --- a/tests/Zend/Service/WindowsAzure/Credentials/AllTests.php +++ /dev/null @@ -1,65 +0,0 @@ -addTestSuite('Zend_Service_WindowsAzure_Credentials_SharedKeyTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_Credentials_SharedKeyLiteTest'); - $suite->addTestSuite('Zend_Service_WindowsAzure_Credentials_SharedAccessSignatureTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_WindowsAzure_Credentials_AllTests::main') { - Zend_Service_WindowsAzure_Credentials_AllTests::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Credentials/SharedAccessSignatureTest.php b/tests/Zend/Service/WindowsAzure/Credentials/SharedAccessSignatureTest.php deleted file mode 100644 index 2faa9ec3e1..0000000000 --- a/tests/Zend/Service/WindowsAzure/Credentials/SharedAccessSignatureTest.php +++ /dev/null @@ -1,142 +0,0 @@ -createSignature( - 'pictures', - 'c', - 'r', - '2009-02-09', - '2009-02-10', - 'YWJjZGVmZw==' - ); - $this->assertEquals('TEfqYYiY9Qrb7fH7nhiRCP9o5BzfO/VL8oYgfVpUl6s=', $result); - } - - /** - * Test signing a blob - */ - public function testGenerateSignatureBlob() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature('myaccount', 'WXuEUKMijV/pxUu5/RhDn1bYRuFlLSbmLUJJWRqYQ/uxbMpEx+7S/jo9sT3ZIkEucZGbEafDuxD1kwFOXf3xyw==', false); - $result = $credentials->createSignature( - 'pictures/blob.txt', - 'b', - 'r', - '2009-08-14T11:03:40Z', - '2009-08-14T11:53:40Z' - ); - $this->assertEquals('hk78uZGGWd8B2NYoBwKSPs5gen3xYqsd3DPO8BQhgTU=', $result); - } - - /** - * Test container signed query string - */ - public function testContainerSignedQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature('myaccount', '', false); - $result = $credentials->createSignedQueryString( - 'pictures', - '', - 'c', - 'r', - '2009-02-09', - '2009-02-10', - 'YWJjZGVmZw==' - ); - $this->assertEquals('st=2009-02-09&se=2009-02-10&sr=c&sp=r&si=YWJjZGVmZw%3D%3D&sig=iLe%2BC%2Be85l8%2BMneC9psdTCg7hJxKh314aRq3SnqPuyM%3D', $result); - } - - /** - * Test blob signed query string - */ - public function testBlobSignedQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature('myaccount', '', false); - $result = $credentials->createSignedQueryString( - 'pictures/blob.txt', - '', - 'b', - 'w', - '2009-02-09', - '2009-02-10' - ); - $this->assertEquals('st=2009-02-09&se=2009-02-10&sr=b&sp=w&sig=MUrHltHOJkj4425gorWWKr%2FO6mHC3XeRQ2MD6jn8jI8%3D', $result); - } - - /** - * Test sign request URL - */ - public function testSignRequestUrl() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedAccessSignature('myaccount', '', false); - $queryString = $credentials->createSignedQueryString('pictures/blob.txt', '', 'b', 'r', '2009-02-09', '2009-02-10'); - - $credentials->setPermissionSet(array( - 'http://blob.core.windows.net/myaccount/pictures/blob.txt?' . $queryString - )); - - $requestUrl = 'http://blob.core.windows.net/myaccount/pictures/blob.txt?comp=metadata'; - $result = $credentials->signRequestUrl($requestUrl, Zend_Service_WindowsAzure_Storage::RESOURCE_BLOB); - - $this->assertEquals('http://blob.core.windows.net/myaccount/pictures/blob.txt?comp=metadata&' . $queryString, $result); - } -} - -// Call Zend_Service_WindowsAzure_Credentials_SharedAccessSignatureTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_Credentials_SharedAccessSignatureTest::main") { - Zend_Service_WindowsAzure_Credentials_SharedAccessSignatureTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyLiteTest.php b/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyLiteTest.php deleted file mode 100644 index 188ad4b1b2..0000000000 --- a/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyLiteTest.php +++ /dev/null @@ -1,170 +0,0 @@ -signRequestHeaders( - 'GET', - '/', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite devstoreaccount1:iRQpXGzlMRb1A57bkcryX7Bg/3Uf5YOfNCG+XIingJI=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for devstore with other path - */ - public function testSignForDevstoreWithOtherPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite(Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY, true); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/test', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite devstoreaccount1:MsC5SIbFB4M4UZd83CiMaL8ibUhaS5H9CcJBJpsnWqo=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for devstore with query string - */ - public function testSignForDevstoreWithQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite(Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT, Zend_Service_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY, true); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '?test=true', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite devstoreaccount1:iRQpXGzlMRb1A57bkcryX7Bg/3Uf5YOfNCG+XIingJI=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with root path - */ - public function testSignForProductionWithRootPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite testing:vZdOn/j0gW5FG0kAUG9NhSBO9eBjZqfe6RwALPYUtqU=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with other path - */ - public function testSignForProductionWithOtherPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/test', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite testing:HJTSiRDtMsQVsFVispSHkcODeFykLO+WEuOepwmh51o=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with query string - */ - public function testSignForProductionWithQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKeyLite('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '?test=true', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - true - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKeyLite testing:vZdOn/j0gW5FG0kAUG9NhSBO9eBjZqfe6RwALPYUtqU=", $signedHeaders["Authorization"]); - } -} - -// Call Zend_Service_WindowsAzure_Credentials_SharedKeyLiteTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_Credentials_SharedKeyLiteTest::main") { - Zend_Service_WindowsAzure_Credentials_SharedKeyLiteTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyTest.php b/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyTest.php deleted file mode 100644 index 8bb20d7984..0000000000 --- a/tests/Zend/Service/WindowsAzure/Credentials/SharedKeyTest.php +++ /dev/null @@ -1,170 +0,0 @@ -signRequestHeaders( - 'GET', - '/', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey devstoreaccount1:9tokqwSDIqvRioVZ1k0mv5m/iseHsGRYmAMGJVu6NcU=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for devstore with other path - */ - public function testSignForDevstoreWithOtherPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey(Zend_Service_WindowsAzure_Credentials_SharedKey::DEVSTORE_ACCOUNT, Zend_Service_WindowsAzure_Credentials_SharedKey::DEVSTORE_KEY, true); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/test', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey devstoreaccount1:YHPfUXoeL/XZjEYii2pfSZi3CsOB++5sA4QT7CAvPig=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for devstore with query string - */ - public function testSignForDevstoreWithQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey(Zend_Service_WindowsAzure_Credentials_SharedKey::DEVSTORE_ACCOUNT, Zend_Service_WindowsAzure_Credentials_SharedKey::DEVSTORE_KEY, true); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '?test=true', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey devstoreaccount1:S1+AcI8z19N0EP0eRTEj4UUCtPbKyUcZDAt299AWudw=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with root path - */ - public function testSignForProductionWithRootPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey testing:amg3/Z6Yx0KxwhRz9yn1ZCPZXYWIp5aEDCeZ1H5UIwo=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with other path - */ - public function testSignForProductionWithOtherPath() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/test', - '', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey testing:ISA0m0Gy2SrxxjBO9ogtIbz0xNNyJ/GujUv5s1ibQrY=", $signedHeaders["Authorization"]); - } - - /** - * Test signing for production with query string - */ - public function testSignForProductionWithQueryString() - { - $credentials = new Zend_Service_WindowsAzure_Credentials_SharedKey('testing', 'abcdefg'); - $signedHeaders = $credentials->signRequestHeaders( - 'GET', - '/', - '?test=true', - array("x-ms-date" => "Wed, 29 Apr 2009 13:12:47 GMT"), - false - ); - - $this->assertTrue(is_array($signedHeaders)); - $this->assertEquals(2, count($signedHeaders)); - $this->assertEquals("SharedKey testing:vlfVjEbBaRVTv35e924cR4B/Z5zCaSYjbtMz9/k3UCY=", $signedHeaders["Authorization"]); - } -} - -// Call Zend_Service_WindowsAzure_Credentials_SharedKeyTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_Credentials_SharedKeyTest::main") { - Zend_Service_WindowsAzure_Credentials_SharedKeyTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Diagnostics/AllTests.php b/tests/Zend/Service/WindowsAzure/Diagnostics/AllTests.php deleted file mode 100644 index 1f9c4866ca..0000000000 --- a/tests/Zend/Service/WindowsAzure/Diagnostics/AllTests.php +++ /dev/null @@ -1,61 +0,0 @@ -addTestSuite('Zend_Service_WindowsAzure_Diagnostics_ManagerTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_WindowsAzure_Diagnostics_AllTests::main') { - Zend_Service_WindowsAzure_Diagnostics_AllTests::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Diagnostics/ManagerTest.php b/tests/Zend/Service/WindowsAzure/Diagnostics/ManagerTest.php deleted file mode 100644 index a92e029ea5..0000000000 --- a/tests/Zend/Service/WindowsAzure/Diagnostics/ManagerTest.php +++ /dev/null @@ -1,191 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_CONTAINER_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNONPROD) - { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_CONTAINER_PREFIX . self::$uniqId; - } - - /** - * Test manager initialize - */ - public function testManagerInitialize() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNTESTS) { - $controlContainer = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $manager = new Zend_Service_WindowsAzure_Diagnostics_Manager($storageClient, $controlContainer); - - $result = $storageClient->containerExists($controlContainer); - $this->assertTrue($result); - } - } - - /** - * Test manager default configuration - */ - public function testManagerDefaultConfiguration() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNTESTS) { - $controlContainer = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $manager = new Zend_Service_WindowsAzure_Diagnostics_Manager($storageClient, $controlContainer); - - $configuration = $manager->getDefaultConfiguration(); - $manager->setConfigurationForRoleInstance('test', $configuration); - - $this->assertEquals($configuration->toXml(), $manager->getConfigurationForRoleInstance('test')->toXml()); - } - } - - /** - * Test manager custom configuration - */ - public function testManagerCustomConfiguration() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNTESTS) { - $controlContainer = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $manager = new Zend_Service_WindowsAzure_Diagnostics_Manager($storageClient, $controlContainer); - - $configuration = $manager->getDefaultConfiguration(); - $configuration->DataSources->OverallQuotaInMB = 1; - $configuration->DataSources->Logs->BufferQuotaInMB = 1; - $configuration->DataSources->Logs->ScheduledTransferPeriodInMinutes = 1; - $configuration->DataSources->PerformanceCounters->BufferQuotaInMB = 1; - $configuration->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes = 1; - $configuration->DataSources->DiagnosticInfrastructureLogs->BufferQuotaInMB = 1; - $configuration->DataSources->DiagnosticInfrastructureLogs->ScheduledTransferPeriodInMinutes = 1; - $configuration->DataSources->PerformanceCounters->addSubscription('\Processor(*)\% Processor Time', 1); - $configuration->DataSources->WindowsEventLog->addSubscription('System!*'); - $configuration->DataSources->WindowsEventLog->addSubscription('Application!*'); - $configuration->DataSources->Directories->addSubscription('X:\\', 'x', 10); - $configuration->DataSources->Directories->addSubscription('Y:\\', 'y', 10); - $configuration->DataSources->Directories->addSubscription('Z:\\', 'z', 10); - $manager->setConfigurationForRoleInstance('test', $configuration); - - $result = $manager->getConfigurationForRoleInstance('test'); - - $this->assertEquals($configuration->toXml(), $result->toXml()); - $this->assertEquals(1, count($result->DataSources->PerformanceCounters->Subscriptions)); - $this->assertEquals(2, count($result->DataSources->WindowsEventLog->Subscriptions)); - $this->assertEquals(3, count($result->DataSources->Directories->Subscriptions)); - } - } - - /** - * Test manager configuration exists - */ - public function testManagerConfigurationExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_DIAGNOSTICS_RUNTESTS) { - $controlContainer = $this->generateName(); - - $storageClient = $this->createStorageInstance(); - $manager = new Zend_Service_WindowsAzure_Diagnostics_Manager($storageClient, $controlContainer); - - $result = $manager->configurationForRoleInstanceExists('test'); - $this->assertFalse($result); - - $configuration = $manager->getDefaultConfiguration(); - $manager->setConfigurationForRoleInstance('test', $configuration); - - $result = $manager->configurationForRoleInstanceExists('test'); - $this->assertTrue($result); - } - } -} - -// Call Zend_Service_WindowsAzure_Credentials_SharedKeyTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_Diagnostics_ManagerTest::main") { - Zend_Service_WindowsAzure_Diagnostics_ManagerTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/DynamicTableEntityTest.php b/tests/Zend/Service/WindowsAzure/DynamicTableEntityTest.php deleted file mode 100644 index 1808e621f2..0000000000 --- a/tests/Zend/Service/WindowsAzure/DynamicTableEntityTest.php +++ /dev/null @@ -1,188 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . self::$uniqId; - } - - /** - * Test constructor - */ - public function testConstructor() - { - $target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity('partition1', '000001'); - $this->assertEquals('partition1', $target->getPartitionKey()); - $this->assertEquals('000001', $target->getRowKey()); - } - - /** - * Test get Azure values - */ - public function testGetAzureValues() - { - $dateTimeValue = new DateTime(); - - $target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity('partition1', '000001'); - $target->Name = 'Name'; - $target->Age = 25; - $target->DateInService = $dateTimeValue; - $result = $target->getAzureValues(); - - $this->assertEquals('Name', $result[0]->Name); - $this->assertEquals('Name', $result[0]->Value); - $this->assertEquals('Edm.String', $result[0]->Type); - - $this->assertEquals('Age', $result[1]->Name); - $this->assertEquals(25, $result[1]->Value); - $this->assertEquals('Edm.Int32', $result[1]->Type); - - $this->assertEquals('DateInService', $result[2]->Name); - $this->assertEquals($dateTimeValue, $result[2]->Value); - $this->assertEquals('Edm.DateTime', $result[2]->Type); - - $this->assertEquals('partition1', $result[3]->Value); - $this->assertEquals('000001', $result[4]->Value); - } - - /** - * Test set Azure values - */ - public function testSetAzureValues() - { - $dateTimeValue = new DateTime(); - - $values = array( - 'PartitionKey' => 'partition1', - 'RowKey' => '000001', - 'Name' => 'Maarten', - 'Age' => 25, - 'Visible' => true, - 'DateInService' => $dateTimeValue - ); - - $target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(); - $target->setAzureValues($values); - $target->setAzurePropertyType('Age', 'Edm.Int32'); - - $this->assertEquals('partition1', $target->getPartitionKey()); - $this->assertEquals('000001', $target->getRowKey()); - $this->assertEquals('Maarten', $target->Name); - $this->assertEquals(25, $target->Age); - $this->assertEquals('Edm.Int32', $target->getAzurePropertyType('Age')); - $this->assertEquals(true, $target->Visible); - $this->assertEquals($dateTimeValue, $target->DateInService); - $this->assertEquals('Edm.DateTime', $target->getAzurePropertyType('DateInService')); - } - - /** - * Test insert entity - */ - public function testInsertEntity() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(); - $entity->Name = 'Maarten'; - $entity->Age = 25; - $entity->Inserted = new DateTime(); - $entity->TestValue = 200000; - $entity->NullStringValue = null; - - $result = $storageClient->insertEntity($tableName, $entity); - $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp()); - $this->assertNotEquals('', $result->getEtag()); - $this->assertEquals($entity->getAzureValues(), $result->getAzureValues()); - } - } -} - -// Call Zend_Service_WindowsAzure_DynamicTableEntityTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_DynamicTableEntityTest::main") { - Zend_Service_WindowsAzure_DynamicTableEntityTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Management/AllTests.php b/tests/Zend/Service/WindowsAzure/Management/AllTests.php deleted file mode 100644 index 7da247da28..0000000000 --- a/tests/Zend/Service/WindowsAzure/Management/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Service_WindowsAzure_Management_ManagementClientTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_WindowsAzure_Management_AllTests::main') { - Zend_Service_WindowsAzure_Management_AllTests::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Management/ManagementClientTest.php b/tests/Zend/Service/WindowsAzure/Management/ManagementClientTest.php deleted file mode 100644 index 963fe2231e..0000000000 --- a/tests/Zend/Service/WindowsAzure/Management/ManagementClientTest.php +++ /dev/null @@ -1,189 +0,0 @@ -createStorageInstance(); - $storageClient->createContainerIfNotExists(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_CONTAINER); - $storageClient->putBlob(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_CONTAINER, 'PhpOnAzure.cspkg', self::$path . 'PhpOnAzure.cspkg'); - - $this->packageUrl = $storageClient->listBlobs(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_CONTAINER); - $this->packageUrl = $this->packageUrl[0]->Url; - } - - /** - * Test teardown - */ - protected function tearDown() - { - // Clean up storage - $storageClient = $this->createStorageInstance(); - $storageClient->deleteContainer(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_CONTAINER); - - // Clean up subscription - $managementClient = $this->createManagementClient(); - - // Remove deployment - try { $managementClient->updateDeploymentStatusBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'production', 'suspended'); $managementClient->waitForOperation(); } catch (Exception $ex) { } - try { $managementClient->deleteDeploymentBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'production'); $managementClient->waitForOperation(); } catch (Exception $ex) { } - - // Remove hosted service - try { $managementClient->deleteHostedService(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME); $managementClient->waitForOperation(); } catch (Exception $ex) { } - - // Remove affinity group - try { $managementClient->deleteAffinityGroup('test'); } catch (Exception $ex) { } - } - - protected function createStorageInstance() - { - return new Zend_Service_WindowsAzure_Storage_Blob(TESTS_ZEND_SERVICE_WINDOWSAZURE_BLOB_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - protected function createManagementClient() - { - return new Zend_Service_WindowsAzure_Management_Client( - TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SUBSCRIPTIONID, self::$path . '/management.pem', TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_CERTIFICATEPASSWORD); - } - - protected function log($message) - { - if (self::$debug) { - echo date('Y-m-d H:i:s') . ' - ' . $message . "\r\n"; - } - } - - /** - * Test hosted service - */ - public function testHostedService() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_RUNTESTS) { - // Create a deployment name - $deploymentName = 'deployment' . time(); - - // Create a management client - $managementClient = $this->createManagementClient(); - - // ** Step 1: create an affinity group - $this->log('Creating affinity group...'); - $managementClient->createAffinityGroup('test', 'test', 'A test affinity group.', 'North Central US'); - $this->log('Created affinity group.'); - - // ** Step 2: create a hosted service - $this->log('Creating hosted service...'); - $managementClient->createHostedService(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, null, 'test'); - $managementClient->waitForOperation(); - $this->log('Created hosted service.'); - - // ** Step 3: create a new deployment - $this->log('Creating staging deployment...'); - $managementClient->createDeployment(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'staging', $deploymentName, $deploymentName, $this->packageUrl, self::$path . 'ServiceConfiguration.cscfg', false, false); - $managementClient->waitForOperation(); - $this->log('Created staging deployment.'); - - // ** Step 4: Run the deployment - $this->log('Changing status of staging deployment to running...'); - $managementClient->updateDeploymentStatusBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'staging', 'running'); - $managementClient->waitForOperation(); - $this->log('Changed status of staging deployment to running.'); - - // ** Step 5: Swap production <-> staging - $this->log('Performing VIP swap...'); - $result = $managementClient->getHostedServiceProperties(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME); - $managementClient->swapDeployment(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, $deploymentName, $result->Deployments[0]->Name); - $managementClient->waitForOperation(); - $this->log('Performed VIP swap.'); - - // ** Step 6: Scale to two instances - $this->log('Scaling out...'); - $managementClient->setInstanceCountBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'production', 'PhpOnAzure.Web', 2); - $managementClient->waitForOperation(); - $this->log('Scaled out.'); - - // ** Step 7: Scale back - $this->log('Scaling in...'); - $managementClient->setInstanceCountBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'production', 'PhpOnAzure.Web', 1); - $managementClient->waitForOperation(); - $this->log('Scaled in.'); - - // ** Step 8: Reboot - $this->log('Rebooting...'); - $managementClient->rebootRoleInstanceBySlot(TESTS_ZEND_SERVICE_WINDOWSAZURE_MANAGEMENT_SERVICENAME, 'production', 'PhpOnAzure.Web_IN_0'); - $managementClient->waitForOperation(); - $this->log('Rebooted.'); - - // Dumb assertion... - $this->assertTrue(true); - } - } -} - -// Call Zend_Service_WindowsAzure_Management_ManagementClientTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_Management_ManagementClientTest::main") { - Zend_Service_WindowsAzure_Management_ManagementClientTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/Management/_files/PhpOnAzure.cspkg b/tests/Zend/Service/WindowsAzure/Management/_files/PhpOnAzure.cspkg deleted file mode 100644 index aa1057caff3769240cc5bd4635118adbea097de5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2243138 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∈f=W@Dah1Pnijw+50{pdQH{nW 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∨9Cm>0&nM@Uwoc5 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

|yVdAq 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

CD^vdahJ5fY7Nd)>Ttbw7p$s~>pR&198U|j(f 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 z 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

-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

  • S9wx+Yj}9+rGaW+w5kb$Yjyht))3ShubBq`G^?3kO<{*?~awh$FHg-p_p9R5fO% zBMN{f(oVU}DJKr4grSS~KT9YmdL+=ZK7f?($Ko%n2B-OP=6{gT&;|rVHZSC0L&1q6?{i=6JImugLDAS*_} z2;?=rm&Ia(0Ge?EZOjaLHyP^Tl<3PwvjAx``>&Xm1hX4(GlwU3_=oW0P*V@1IC7q7 z)=zO8Zy7z7If8u`r{!1SJBy|kmd89xlF3mo@ z@XJ*`ZV9ecrr^JC0Z;|Ln%aI!yOV_r@h(46E>zt08;EQ>o$;ec72wn_`I3|YBb}~r z9iSTy^Y;wHXOYd4Bz*E}U)1@ZRi*b=#p(b+Ab(WZ5exw$+ZNzy!rwOg1DPYM!1|oJF&Mkk|xov}LgVL-_-0rZ<6Nmwc zoP!gI^~Q1ak}o@kQ2slu!m7`1xnGm}fgg{;0C`nUd{iyonmN^MzKperd0Q@n$aR%WIH1QTnKO z_UC6Dg}F1Ro#5Kq&6lm1{cMO%tk^(L>H+~&KLG9v?ziAOty!2pv~7Rt+;`Ee|0Ys= zLr0*CXAIEQ@iMij*xXU^GQ!(5Z$yeQ+IiQ?nBsQ;ZX9AqrzDm6SDakp3wqG$Z&YTV z_9tyfFmN8!NXpgL%zhJkzf?-XVg=Cnnlz9pphzU@v^75{PRpXx;pNyx?18}t?&5dp z{^#I7#@L&)F|D?b+XA+&zp8M{_kh4jXdA>X9JLgnd&%g*XS}Rl3>)9QBoO&l7UEWI z{ib^2npkBfwqI8V6;sn+vFCdo?Xf?T0!N^pay6hpU0!gbs1zC;DBsdHn!|g;d#eC& zDNvKtlvQae4F~-ukjG2ltC?xlj8}R>yXIS9bo<%Ww)e6<5cwA@5c@A`O4wKbZ508J zF(ZaKX63!wX;t=Qih|_^J$o3He)O-IY$hxQApW+fo#v&A=;2M2+yv)znGoLpGN@M> zd+D3MTwvL6yFHLfDohex`}Ziu94;-)8t6aRC!_AutXY#QyCcI3MUyo2cUWJ*o6B4! znou!=3iJ~?ll{mx4Ps-Y|0l!-CRAf?(PXj@sVEY}5P$^`D|VL9Meoh!blJ%;+X%+i zF7M7PtXlN09X=kmf-p4-gP-krtrn5d@rjpab*r6QXG^{}cKo z$;rowBx#g$vW_FAe~-Q=;E|a_!JEFSOI(B?J9U;oUon*zpWwB|G`@Vw@9c;#1bY^b zlvjQ?h?OyfnYpwz{)84mYQfSyTfwd|5!1)+wNQ?N(i2kZ%a?oZ_^zyAMDx2}HBd4B zP`_q{0sy}0o_Ka=C=?syi)>yGvK6g)@NA>L#X`9ZPN3oHI!#-(sw$8AKzt4N7@$&n zFzBErT;h^vs(>i?h>mM#YBYM%A zFAG}~Kw-Y`rw`Ue2f6@Q7!R*nm8*$I+uM-nGoA(eU}d&U1?yJC){ZnG@IhMW9$j`M z&L4Tm5l&q)F7`mm=R{zTJC)GuyM+-lKC71vW>?D!)I*p#!*mts#9`~5Z51>bBMK^i zKA9Y(af4Vr=oKSKV|=(>%gmoBhvmWcJxJE0P}Hb+POuDHAy{K?P-5eTD!Oe?J<25Z z4s#!1Ok{=fYwVn10T8c)RHF&IkEgSUnh*{-jIU#r>xdnnpzo+;ajz^$g*&-7Q7HQ< znsg{3(t!4NmD2-gi})2p?dHHok8~v?V7kX*s-3BKcu4p1{M0p9alskI3?cOsJa$t) zE}B@SLIXio#v5ceS3Z=6;p+J#a(bb**9YnM>Q|hSv|V0kl1{081ag&LO14&Xl31uD z`ZFlxh1rGH?z`ETPv5^3q~51S=J^sA>WHeA{P2logF!8TuuG3gu)5yZI>pH50#LgP z-?*j7Vdld@r5foTOG!}883w}9w5(_{(Pt@eG6_~zWeqXLLOCUnoe8C{^5QT`1$j5} z)|dq^28u`>mj=LA&Y@mqhPz2@Hpk%u8F)99?`}0N0W5}S0OWGK@~}!4*G-0ytifWE zD~6gx4-p2JKj*`y)mG}KzkwoRA~)P3Ybo^Laf||7&UMgyNJ9)2d26n_w-<%HTj+G^ zMhk{p#S`zjeCsplRMb!76c|of&~Q=!um!1z*~;(Lfz<;l)ttEx75pP*Z9zlb&}JiJ z>NL#;R66W&@`2YfrW6P?x6;K$E&DSi(qNqN4oaa<8ICi+0@JHkiUUS~Xv{RBJpQOjDR?iIl(3>(TI06EoYx0FRQCsIFQH!{(+;FFPNDixum(#Fci!5wx) z8HObh6O097*HJA&m9|&NgC3(#L8&$uNl}qZO<8NdXgqC1y_`duqVK=zqW0wY$IK%y z1^l|B_{Gf~m8Kdmy;RTe4OHDw55`mSDQjiw6w;*T?c*jB*?&ut6FB-IWtN$+RT+0( zK12ozS#C=kG^a^|r+ce#QaNohrI)hRvbAvWrD6)I!6SU2089EDB3^gwB!=rXAy^v$HQQu(I5p@$spdVCXC@Dm54 zsQ5vG|I&{*U$BqHf@Wk{Q}?&Og-1v3;(XlfRgm=Icz_|Nlm3|R{*yGmsaNz*PVWq? znoa@_Iy7K_xzqH?05LFb5y7CTIaikiWP}Z01V-<{T zp{`=dhfD1_To+Wy4{Hw6+j!dhqAewFr*Mut<&(4`VSvA+gwudpF>9f%8t@hWu4dRy zohjprXh6l0=d_mc2*f_{U`2jk5jdH{RRMXJB3>IhV1r?BvfzwAOYjyXAiBx244QxD z_`sgxv)cKI_cAK&J*jB%D;ET?ZO7)CUYTR3$0MbwIzW;4k?xTJR|@&S;qOfI-x}ff zmRxbORt%W^W2Nbl3qT7?rZz%hXdr9+)O0mek%pz64G16{)hMoX{Yi|5_vuWoT)M{H z=^_gLiQ2v=POuSwDr7A#k13oK^5lB{#ni>&_Y5wbE2|Y>k-)tY=yipX{Mk(>3&991LqwKJ5o+VYTS;>u#LbqgiGt<|3qv>v+@}wW0{?|H`Vh=1@YfgLDv21I_ z64}3E@}h09*u%2W3#yL6OQ|-N_MSw*0|K}1Dtq(TreRblMv+w(aKhE~13QFDfw8A*+ zJ1l$SM}9Nv9!3LD`Dls&tI(cW)X~p2Kq%w;(6w1RegaWW{3(a-wT{#8^BRQK+}VXV z^bGzHwgivK7vI>FI+Cu+bnN#w{Fp?3yz4XxRUC&i@EW#dCDjGpzn#!c3wM(VihOA3 ziRv-1ArA-jr&aK1Zy{ZZw=Fw}hLnHUxs>MYf%RRA3<0D1ofE~-NOZXaWTJ}qI8XFW z2NUdjpM_6B1m$(Gs$_*t1HsSELJ+wLH$V*Waw1HdO~T04JC*mGNn3?ij&0O_ebl06Mk zM$%hPEUmQAt=eG(0RQ-yh2RZ*S0Qfh}fyR#tw6D}}3YYP|nUg2YLnx)1R9ElFS zOk8?45~>>PUlDcy&bp|~&uN1K=hbIUQ&upU8oS8{(hF1+2;d?EE!J_{zN#U6$1geuw&X(C!b~tuw|U2KJ3h$1{EA{$&cml5^)n`f}08 z?Pw%LI2y!2e|MZyRk2+!a}8u8K@KiBHIoOq1r-okFfb=GgKJ2kFB|=$`K2mL|-;b81VLL&qTZgKfG^wA9G@~AIzVcmVssHB zr0uFy6b|M(ocN69aso~4LeT{!s7$1Tbx#Z^McYnl(eIfDmhXZ15-X;=^L{7VT;Y`G0G(n)u0n8+OAwc>S4;X5%uKO-ORfNRey{F}$pQtLr zFGD`l&rHCY=#{@pczX`b-CPwxIVnY#{FX*P2!B;0-a1kKCEI~f6(S`ZlA(A8kQLZa za;HT(c?J)OYV|DZqJ|G5IKiD`Vp`vR&`EfvLG281#oTy=l&{Qx4PxJD=R73wQ{f?Y zjvS5NpC?O0+ctAnFu?cE)X-a{FgE+nqVrc&NYcPu#f|RQHj*~(83kX8gbs+Uz5SaG zTj0&~V(`++C8`)j63N>#_cFgS6Z^7*s$t~1C$iui8f|^T@|e(*-Zpbk{v7;KX2vnq zq&ep=;S;Rb#t2YL3A*a_z}38cLaT+R+)Iul@7D>Sdtl+`B;i{qyJij*LhVv zMb3|qmmz@c84TzfDFfeA0;s1M4fD^ zv}}lx2gURb#VN??x9BA|;Gs6Yq;n*XoJ+CLYvtMx)iHC_U1#z@HXY$F)coX_D*Q0Q zI3$$;LVvh({!U1;jj<1iC`F2)RTiGA%qy*g(G|JSg^Qk3-oQ!N#LwP~jlhw|1snVl zdf4E2pH_=kMu^Y(`x1njZu`6!9aTHDENz54scdTo(m#MHmf1=iN2!orc4d9_ma=a3L@YnH0YnqXKakFI|ji)w?wu02L$ zBg3b1Pc)q{zVbevn%<=W+#Gib`$3Ccv@&)#bey3evZn^rw8G({!R>U#SnSZkzKx`S zP&}RM!VAWF_#!`Yjv(pl-+%IhKAM?kp0sQt*M?);OIMLAnm%ZsqJbQm{&`lg#sKB%>t5HRk> z&jmC124v3*EG<}A67eP_MWt|l+j8JAkV5KjQzQ?pN*=H@|CJxg*K4?6I!_{5@5NrF z|Icq5Xevl6ZntP{hf88uO6yB4T&P8_*$zA2lVBzZRoT?2?zzmPz#~i(pV*lO)4u*<%6MXj zhHX7mRYu)_bnS{a;h6wDx_pqnmY4nQ3%?)Hpza}N>6Rz@LcwmPwq_^w_Fhx@`*L(M zb|I>2P*C5>tSzYtJ68~li&wgf_wCXl%VVpsQKGO=P}90THZD%Z($5%*n_#nE*Y_4+34>pvXFe#wUMNzOQC+;2UO86DTs!L2?6$YS*1QyJ#Y{5qeMtmA>voWfRD-}` z+Dwl5RzZe>T2(n{Fz*A4R^rE@R4iw0%n^nL=N>AA=3PA~> z3(%BmtAg#v$^cx@MZssy9mvfqYiuCFS$n?s_}tU29Ef7dhZ-$fohaOId1_S|FCE*? zbt{;14yI>Hl>i>a#o3&E!7nc*i$GcUZweCSl+D+hY{sDkp4ShnNGU`Qf{1AYUw1Fz zH^~xD9#K-tqpMP)%g@!Dt>|$+0KwuOwLK{EXXdb;;8!Kh7OTaEHRg5*i>o!K8}GEh zqvr8Y<=Iklk+FRLxuz@o;5_Q8(MwLqz6aOjhnCq}R2Y#rq>LF^%fJ+%?(wXZ@B z>S@eL;A&E7@|f~hK(;U0;S$+FSr!4UZ&Ze-XnT$C;r#Z@8ySP_R;3zOk0%^o{Zc{m zI1*Az1zS~8&}&dpdkmG>41F4vKk>M<7vPebpszu8;xmAn*Q4p*w$Iou;} zs9j!ISQnuYBu_F&!5PGpI!FDYg2q^30E$RI57p^Di&*22LRcB|TIytoN(=^tZJ8QFtN{@^_iqLW zp`Xr@FGC~Rn-!c#m!fb8KHBBILd6|8vz^P1G4e=NUd`a-c$9xzFeWKD3|*E~P`eVF zziBKz_bSCAP&bQrAA#_({T|P*o{WtkkrZwAs32mzAi07hmFdk^JzPhqv-QQ*C#u3l zXs7gmG%JHCzS5>trl}lNAw5Lx;n_^ps!14kEB7h&zjKWLC+nYG-}MtGzmZ zSa$0YqY0!%Aqb-~v-|!M;bE7`vgW?=O3}5z{va`Rc%l=!zgXw^dszfOdcplmuN_$g zN)_BkmBtA0M`k)lJ`{OLU4Kt9!?;))5CH2kv~XNbp%ALwqO!45kCG`^8{G%xrNqfF z_MZoh9%I`^*N$#Kyx(Ku*0Jf49PR@^>zi~(1aZLC!-yM5)C9dh3fIpV98-60C$*Js1e}i^p zkMBJsQxLI@GXiepX;~WzrQ2-zWK+L`iDp-UPA*ozc{Zh&&eA?%ZI2NxV|{oBo~YxdTzwvV%L+%umu6=-VC6eTqm@qb z*|nKrC5lwmqc`fmCUXIz2JR*PMK*S*dut@~9 zNbJT_?1BFtbGPC9D*MTjZREKW_nP5?&!OMSi7(d_t`~6UblPey;2`}68y9qNS=57q z&emEdPU|YN;jHa?1H+Cqev?>>_dE`cB3g-CFU?tR-43%MZzs)$Kp(mC_lY+Q#Hqe_ zXBfQE9+3}0$u*8AM?oUb}9_-uh zYn_x28{Eo)%!S^&eh(0EF?Nn)*5$r5o$P?)majVX((JS0RRI$9(KzVR=$%5@6bs>C67YqMJY z0To0-2A=8hf=b>}29cI89#KYS>=hva-p+|`PbgRNERha5=X}eC+d@GMqv>GQG=M74 z4$&d8M_J_C0h}uh=@_#D${yjRA=kTNb^eSd4Q6LT%ZmC?sv&08kO~*W0EeS{C%0+! zU!X+<8+a4mdq=r)LQ_x~2ki1-K@4l?LH3C)NzQ zRIBm0kv7^UOE#)Qhg5_tN*bp*-vczcKN*>A$9PvL3vBTDQ%*j!?1Ta;uV>>*%zRnR(PH2_EIX9OX#t3IWne{whRBj--jN!K zor3jRLsD3hkPZs%>aW*aAYB`w2~w_qjhwwj*aY9TJ^mvn-4Bpf6U;0nYOgF5u7yj* zM~T^O_<`a45^v7QyaY#>QMc&bnyCqOg`+x_kC$Q$fKqL(3*VW@Szh+2pl!;6L?sr- zV1KXOTv6Rni#tkB#;sbtQdstQF!KX&TCq+E#IAf?Ieb$kZ}>ZNtrt9Y6A1o=$I65AT6~ zthy7^M3D=3_-C5oG7KOPXtKQM6_WLl!>7k@Qb6`WMUahyH@U@Pq~Jcr4#zj*E=U*S zIBh@Nma4Uc-O)`mVuEpv6DizjJ7ltu^#2$y)Ti+*#J(QJ<)f3e-=JGxEqnm+x;S$QLl?neW}&n4bLg%vo#D!g{&))_M%CsRYuP}8>`*? z`%$0_tlKWvqOq+^=Uuwd^9)HYt?I~GJSH>(RNJMm6!TOcfdA}21KR;*6ANYBL@)K% zeVVmbeMMiDt<-*^mBHVA@C4ECT1d^16eB@qLaB)wte0d8k}2;64a_tBnl`3^)oXo3 zNm7a4PbwgNC`_VsCM(Sn;a?dHzt~f_!&VE#9Hzo53xO^={hr(oF*-70X~2H5F?pC) z|M-Egn2E>7mZG)TlvUVY0o{&`{F>tB3B{z;BUeSXAJM~N12A$#|NX(dKL|}wbZ%Xy z;uWx>HOd3Wn|NIP;Kig8bgY>=(P9EfX`1g9b#0<)uGFqy$>fdszg%9Ou(I1P^{Hc0K`Q2u?aTS=#iIRn$cM>a5f;f|=7n zPt=&rvlJN!9mi^y|HqAbF9dG93<$5<GnYY+70_wJA|q>xEX@~! zaB1dacFPohLcR_+3iiVPa%nA7`KeeZ=aLt@`yxSWPi;rYK9yuUf>I%`_ooNu72|@0 z7%xX%R%K6s32pqg=fD}u1T4|_=q0&3rZSmyV+Y6{h9Z8l*Wo{4G{J7U_k*zU$J_Gu2z zyt!k6baBnAm52koiLeBbfp&=sALEbL6o_4A&8Q_lx6U0rF7KF2b*h$ZrETBpS#5>6GKDlhs@{I zgV~0YnB7?@cQ)q9(QTE5&&onmW)?+e3*IGTx)=PcP{jc=d3jeC%6jo~XmqTg>skj* zCX>N1mv`pxHnj~g+PZ0ruhnR9Xj-zDTYgn z^QUC&jDfrZ?FKtX{SX#@LvRDX8jh9H&K|DW8Ye8sw*k<8>XbGXVl&YhczeU7M`xhZ zl&=p;5P}}}8x=hfhg`>DgiiV7!lZpje~ST}%UTWst?UIowP;5m&=l^Sq(H|*B15SK zoL)MuvduDM6%n8t^ui!jPny?peug@#;zTew9+>@5K|gf*WEJ9rKBMuth9)kPvz1^f z{9|v)ccJZf1E@7|3J~Q4JEUeCgGh5Y;SrVC!JU%94mP5hJsmEec}aX9UahH^0f#EAv*Pcr+` z{&v0X;h&H|q@wtPg!mvKMlA-J{33StEeWLI1B8@WmxR!r2>$#fV11Zo|7R5lnKIUW zUZAC1xxcb{*oi|UpjnQM+@nF4iQ<>`7Ir4*aS3At5mM@y<<&;9G9%l($##W3`>GMu z4S(tqOui>DE+}E9f`$dN5jE(+oaFlHU|zS8n(ppwXUq4lUdryDFF^vcIT@ugCsxkU zIXO=(DYuJ{Xd!P2H71hjzsot*z|hfm6c<}yIu`zZkA7!>7Z&3mIWN7|T;n0n-&d9= zpxfyqN$a+Kpka2C0B^9T#!_8V+7OvX`oL7SFSICdrz8c<%=O>;E zofbNj^=FXP_qNm@n;8VntcJxg71t0O@)V(~5orR8lNK9P38wN=JlA_U2b546nXVL` zkSl|dvCiZj=$L~kZoQP!lk7#-4M_*qIVtb3(_Fm{kKRfr>Amfy^fZ!tcG6R!Zn#eK z?a7eIu9G0+U|@!zqoB$_UrU(Y%3Zu_z9?>{YO)V1m_Tz51n=E*!B>oPk`hYqwTxBD zX&-o?Z3grfI1o)F6u{9H*wp2zk}Mmja_xSjA6xU$Z9{V9B$YfzaA7stdj$q}oWhjg zUr}8NYAk}u>94bnPMpILB&IXmwIl6nVIGZgV^(EeILs6b9x7>$WR;`zoSs}2fas?l z{-(H&VYf)L%z>tV?Ud!5znoFOoM!O!ES{b9=$|lGkj&|HcF(5v$!Bga^IV#Lu#O67 z@{U$bfWV}$3wV;xN9P?3Yt;N{S}i1Eb{WRgXG zjE>Byv>}*Uhu9~003(u#WZ;rnQW~f-CX(&wrGZwgEjB-(ezT;G@mpsN(@67)lP7zI zI86@{IgBX}=WW}Kv&gvDInt7;Tm~FXUF}QqvG2O;j0j32 zky3*c%31z_{8KgMNYLmJ{#2~)t(YM>Z$8GIn39pYc;Ok9e7(84R|Xrib&O`%bBOhf zSwaT-UzfAfbN>1(oJ}`Hj8_Cg=bU`ZC)mw%E(9KdO~kFmE#9+0H@cw*CIud5A=5`z zRcK2A%Ed*ms3tKH6|96DQa~s0@EikjHZ@ul*yIq5*ytAI0fHf-k1$yn)nn_U#&hA7&&Z6m-wuc;$|=;9WtH!!wG)@ zUQIEPpw*XYvGr9LbBBdofwTh1Z_LRAvqAJbM>tWQuc#|lD{Vg#8MhP21tS!9f1SwR zGpsK5_h*&w4CgvlaV1k}wdNWI4moyI%-BHBcVzo6KxC)&UOteW5NZ@)vv!2El80wP z^(!Y>lJ*6AeYBO2!@7o-gTcsUwv3!lA^@)NZo?%FlXB`4J$Xt+#uo2K#U9QUokLUp z<-=NVpuui9&d+S{$frR&(7jGZrT5)2ElK6 z4ly@%?BlFno^pS{d;(qAe$Z7X9(nF`uG9a5D`eEb3MZ_?R+?)ZAt=(E>ds3sLRxvu zK@ja__37-yC>?fnw(`cZMn(N53@z|J zP!vqJfHyExGMn7n96=itHTHz10oRK+GJA?X6YtP-!{?QEWD}v;+t`wC>FAuO@Z#wH zJ<3EP)O7}v2-KGmYrQ6ZNlB6u`P`{skqD!dPOXiJ*C8`!7&H-aO{e|TPeJr0O7D)a z%GfoM0*}P2n=8?{|A10}dBT~~I^N4>zR9k_L(gz?@)xofmz?nVs8*wTlxxEzRnSU0 zT37|n9g#`X5XYB`T%bjJ_yDg7eu+m~ANCHyamF_1ZOEwEsot zjlc$*kscjlr4?yvLsXiCiq){m^R#hiBV1vUV|V5~V1LW=9D&yGSDxuaq@G3e5WZw$ zI2cqq-^w(sT?LFPc4cKRYu*2A8hN|+L1#PiuH;wIk6r(2jxg%6& zVN4D8gT-#GT~vDhuOb*MhAL3Q51aX%X~~nd&YCof7S`k-^{8KUV^EsG`$1cv(RUT0q~KO)o?U!2?}!HW35Y}gW>%-*+FSgC~c z;Wh~-(_Wsi-FBUw;ra4%odHT~NhzD28Q1CbxD{^sr~?ssCGJ4-z2LVqi#gBt836J& zz{;+B^*q2MFWsIGyW4NqfR;!%r5jwA!sT^po7wQwuK;Y38r4~41lNi%$kECVIxxZ< zGo-$N52!7W;KCYEqAo&3Rx#W--9*;*`x1Hz*E2Zw8G#xw7(XZK(5~qGnKXEJ9?0tV zT1e(!cE5&HQQ!1Coihw7E!q@WfmVo4n;(-<-wcTD-bm9ofg`&17AyX=v%lBTm!@jM#r zyGCBjDsfF@fgYv<$9jLQ+oOL0g$!vXnB!gjHYDnsY+xS7B01_Ge&L$KwA=)C05{=Z z^pW5Q-%KQ`o0}Ktq(zaWE)60uDby=YI%yQ;o$PL(3T^gsv6gITZegBf#O6%=A>WSZ z0XPVnbqWUhxuu9>ow6F7C@H8+ASVD#(kN!j^<}HkF)^yQxA40VjAFv(OD5AvhyIPY6(XN}>TU8R=k~LQf6a zPsjevL$0A8=SILqu*&_Zwa5Mceoup5ea+ZbY9Ytbz}XA9KV~)HHt2)9TBzGEt)lb= zn)5B-wCWA4fAUt?4K(+d-~}Qd!6{uhxX1c3|Mn;Xa)#rw+!?YxN5DjOVB3qEx~1`~ znbQd9WDF+5mY>s^jspw#fmpp;90)dAuNK()mK0z|Lm_~zt+ph6aKEzu;xLIGY?8n; zK-L5X=Y1KoG5lrQaKbUq;t$H$?#VE@kFruj*|eQT+NWEJkuY;_#(po*PuQ-xX-o+} z!-OS^WqFD+faw3jCK>meVQK{Z>t#r5_WA$1MI7w&`}`&?-0Grw;eM0{Vx58$#)uJt zF_}2cqC~aqilS1R?mzDTzvqfh&md4!yyc(Qyo$@BhckE+kZ=h0%%6&#W5{wKsAEM) z|0T7nS{yj6o$y4xl)$m5N>&y5@2g%r0tZWJIivk+NE4BXRmr$c4uyz0i|8sKc7owb zYlC$@<14IyWHmT6T3qX77%(WI3JW}?CfT~_&L%k_2G?`wGS{!GY@F#8@z zr*8IB2Z@A8C7M!Bm1}?!y`o0cppnuKOde| zHiq!PzEWfe4hemyoUzvk-+!Jirjx}Haf*s?{lerTT&~N7208?yd1;O_+QbKsP!>z zjEJfh_s^G&B^-cVX}S>AzK&4A^@Gie?Z)>FfH7p1tnW!<;+jf=WW%@QTK{H(<^MAjgN6?OtYDtFk*OA@!Amtb$pdyeI1@9-V*D}wsvkXV;(qmG zCUqOQVDme(ZKqjYWpdp!(}(le2<7DG%mkKdLKu^-=C<)%jMa{*FULh^9 zXnfJ=DpTntk)q3CNrLG&f&+Hy&TFCgfPaXNEN;WWwUmS*OtS344*h1779s^6o9hQI zeYIyt-s4v?D{u$|sYb@Mj^=pYwifSOaxwirW2}hU6M}59ArGIIJ-x;8GOr>GY~M_y z2n~iuPAV2I$8O_Dq_`@Ly`^sU9aiPO|8A|v7Pc9TM1Z)Shh08%C`Ch4Kdyc;6YmZC zGjm81CitQ@*DR+Mp0gwV(SpL(pb-pvZv9a4)$L?MurJ6p_*a!;SvBgH`8Ou~L+QdF@@K2Fms zE<3bC>=K1IE*5hPX85HH+55La^T6i@qj9hf|0cdJAT#nlDVpY0Bb;y$FQMJ^N9vdt zMM=6v`waX#{fSjNQ0Sb9sl-C_s+@bjjmHbG-2-VghS)bmg;xALYwtu1u|8A{|DfA+%>#p9FXc_Tet>lEfhr?f)ACxvgnAEu3QNW2*LLN(qovmO9yP2Kpyn7sl8*8#A zING6#)r?Iojf=q401LIhKiNP?v9Tvh;C^rqE)%nJCB%2=4zLj(OYL~1jo$eg<{zky z;`O~UHw><{jA7G(&eccqu6O%baRBry_u$lVr%%zg2jWdvIK$CD1oK})vi4K}gaq0l zZib(^T+506=3%Lm8uM7v>`&IRbu~y}wGbTr!-b?AhjkRJkN7c!&@u#+3FmUwPAfGH z4x*aW8GESV+RtPTLZpOZZE8@UuN22jae1elEasHu_AFxy>Bk|3&|fM$FlSCsBcMH$R;mSr#EEC@O?yf_YU7bne(X4=R?$>9q6x&u3@n z4=4X-CuKUQrImZUVFf2ozOjpLs%G1$OvDx|TyjKDBA?%E`eMP*d*Yn(w96q9Ckt8$ zT%+R)(i)OMQRk{uT+p2ZvCcXK)%qQO4!jk%uFnUNW}OXE!s96zewUt_jWi2((KSw~ zJSd5X7hUC|jxBpZlHC38_=f4kaVmN3K(XdeoY%S1^%5Yj2GH+(P=)T*-wyK{|4*P< zwCRiT(1dL;VuMSD&Ekf}!mQ7J3U5W$&E^l9oXn?H$h{!MZ#DCnru^~GS{MR&@i~c1 zryf6kMU_`5Gw%)ia-|EaIqZY`^TemFfg>`!5(k()@FiNK6ueY16Qk-}$yhzuQn8=H zUHG$bdR(s;0}{p5A?N29dT~LJdVGPdr?i8FB=jnrF(sDE7nZ#A+H*EchP53?(^VG2 zjN!qE?wQ1`7mI^%Xzgj->J?{P4U6W}t9OvtEhAMue_FC}6GK1M%ciRn8OJHJNdr`Q zP-$eS!9w$!$;afe%1-rJg||^|hNr*h!Hd)H^vA2{g4;z;>30V}hJLxJDBegI?J;Zy zsDBh9Bdmu~ABNEDkW!qH?7f!oIin9eh=I|J>VRdO_Id$DSnpc0NNE@CYtC*M+lBs2 zdmC=^80=%~+UL>TLcpYLy1d8wc`ln8sx(#Fe(#*rcqJ;fTOlY`ItcE6!iyV#O*rU% zrToWzih6J?nO%HL3zL*l=KfJxpA4ou^sLT-58H3&d)I1LklxmcF{TW@p%`|y9Is?L zz^*H~#H~9`OF$L3^{2?-YR}Mmx&Mmjipbf4?3Q-8E0cfz6NS{$v;kL(w&U=b+OfbWexd}6LIh~L$!zAc zqqzX{bU@}dK%9isze7G@u2(s?UF|#StT;80X+2DYatl>NE}OlP?0}W?D?9CJYA`zc zKt^tCG&BCj1bOj?JTg#pP6%q7r;KLIkOq)ACS0kLL*Rr%r9PWg$42pG4q(768(6XA zXWN>gnWoM)(QMBG8pt30F9Q$AyO^$XK-hvzMnB7DEm;x^@dSI)9mKprYeo_F~!_>T$l|76n*@fv@)h!%n!I(+nlL z^pw8;9C^wMK4%St4I!qq4DB~QZ*m^nY*Np5D&K8y6Ia{)n4g80J_G`ELUR5(O60yc%4 z@*a_2&i>Cd0rRMfg}S+wk-`V5g|HvDki)}=h%?M zwyFidq+Rf}s(CAF2ZvT#KQz1XZtj!BkSUP+JIviKy!Q9(`)=QfhV?q0G;N|0;baC$ zCZOw3)|Gp`F{fiD#}21DcG|c*AT7vbXvBqeDsHpuVt*QBYUe+Ihpo<_BjN_9wpXbM zeRlsz>~T8U7GG!|lfHa4$TYiNBD(lf;UOe73z#?%I?)4OS$?cB87N#_@9laQ!#dCf zEQX5SdF$d{Bz7VDFl?qS#0JiO8JAqvibDls0L+6&wM}RfYE;dJ2jcU3%(@$z2}f@w zwt1SbOgMgb2F44YX=>~SDNzdx{vC&iP*XH{r`#r#5=gb40t!mxfE0LzHvLsB?m70u zVVsumvj6+yyz(A{T#lvQ6Q+PFeGfy3h_x6R16o}Knbr%VEw@*~%j#f##d)TRLSr^r zE@x8=H0@EDBX3*IF>>xZUYm%2HP`K+FstkAnxafHfZ~RrM(y%8koWc3%^k*1a7@av zOSHzJPVtf#kG945C|B?pRi;apsfY^4fyoU&7;I2Uec zu=6qaBf}F6-JY#tY~wx^OWut&f;VANU;7Cx>9aaL*5f|dhf(MQy-{2V_D`kE+LF_O zIUcubCLc<}BAMZ8sQz^s2+inWaSN{ixl$Z}7RXo{me(UZB-@bOX<#=WfGBu9)6R84 z=8335*QK=wGqUTd9hvVG^C6-t92#k(weILlxS*%i=YU_rON-SaPfO4g{!hZ|1)h)0 z*3Jh45dYt?k~1{QAfaAs09je}^gwPirnV_Zj=s>D?be=?(pcSsNq^P?B*GCy#3E{0 z#f!qde#Q0E{gzd~8o}^Jb(j;z_r#oSgJDPh6etrgtBmPEI_S7xl)zGB&!6cnBW#8h zghT?iS#c9tMv$x@b;d?im1gL(m}7DfT8(ojQ)NPpPt&n#4^A+fHy;YcX~FbSefEj< zrq*4cvp?)r(-Czpfzmc+1AFeIh4oTE`pZ%s6QnGvG^+z2w=gN_!EsP=LNdRvAxx~l zJk~_D;0r<_H}XA7GRZTC$33JvXw`d?by@mSX6E0OCsj#Td!;3tX9Y&rC4#9zdKXC2 zuKnd|F}et8_q2SXQK{a%7qoOE(hkgQr*Bj^UkIQ;0@s!_X;uL+YWz~=wca5sw&%;b zXLdlb=j8ahtW>i|VB4_BA*XD+KlzUJN_O!vQixwK1!%gM`IFe9FoFG|P|r?}4e9c> zk=UhF&`;H(y}l&YaTbV9D%;)=aa0_53->O1#DotSqS!W0^!2}ue1}XXxW?`p?a`UO zGV}AR`8;Y{vQwKasN-%vyPQ!+v~#l*#uy;tVmxw48e&y97tIL*sY*ugYNX#=A6VoSv9*aj?uJWsKra+k+;fm*H)-h~W|-Yn z8_AH-mO#efh=6iJILWD_;ay2zGWS}60CSTJyb9?q9B>0r`!~>$A`BM4PKKC`_W(g$ zxG&B%6$Bg%j^i1>Fv8ueH;2#>qb-S=uu1~ftt0uKG$%&>of*@_StNTB+=+?H#6%xX zxMZXZj>G|b0)yHgxTZs2$VxI7u8|P}U)RQs?nLjN^6T9U&Z_8x3owV1>=5^JWGhxe zS^!u3H1dL1#tPr5SlihK*5b-|96_xraQ)139e2f?^*wUhEQ9JPMk{wNQQ}1=Yb3jrKT=mLP?%>JCFBw>R!)V z%DMgoK_WMKSE6Bsh+9Y)II%T@x}bLil1EbGGZv*yHgwUEADIIGx zgi&$gd5`dl>WdA@RfbuQ%ekTJKfI}f)xY>)4~}mZznD#WQ)d=A9EsM^S%|)EA;@yOXE+)mZA&kzjpu;ppk+X}k&#GH}3L1<+`pI-!))b-`1Sc%L>t zAD%2$q4(prYjT`)adZ4zH1DkQzt_C2Sro4*nkLMsIR0Fd1G?erdtl zcK@{`Y82geMjCT?f=@xqCL;e9in^o`o;dSwT$W8;WSRAwb;aQi5%+}Suf2&dMEIoB zwXCt;$?qI0(tQtM|EW;a)C!hgURIMO7h#NuZ}=?5`mM`!hCoy55L$SUU*MPAg}GPq z#MZcGDc{Efw5kyKcBJQYNlE?6hS^T^5Uhv+TvCW+1g9q>}6o(p@%LlogWQn(j*7gP;$%8d@`N(H|&*=FEDDo~G8+x{jZwp>Dj)mlgzmve|qPf6~frc-HN4t9P& zmVJ<8!LTV}U5FaFRqCab{gdW}rRLI*P>^f^F}|4SQ@=f+s=zfyo^g`h$SB{XnBkUl z4Mh~lh%#4RkSBt@t@^Wbha?*ejEe&pU{glq69%7Hdc`HWl<3{pR98@bSg%Xqw5G0& z0#K5#TZeG02j2Dy*F~KaV#!JT_}asa_MpC3T3-b}@1d|C4kBUu_aiTgWiU$&3TGB~ zB&S*uEQDmaL9WBOxx0kNH2|bG$vyF4zM{bz(W$i$De}S1+O&uOJ&c67KFa@$AUNcv zVU_h{*jQQwv>*YwXur$nl2&&(l*Zpab|1Ti42OvFj6NjZV~hBU$k}2}rB-FJ+2y!H ziDAa3P}t-y#RyXNLOIdfKh@0C-)7fbX$UHksYUEz%g@l(VL+;Vg5r!9%#9il@NAb= zDclDTNKxHzC1s$jrl5-z$|0gh3?{a-X7a$$pv}11HZ=f(@T?u)q~*d*o1TtOZb{P! z^N;gX)DJ)8q+K#aoEIN9s1`q9w{q6NfQl3_>{;NcaF%lFK zTnwA0G9Oad4`^_V2T9n^>u;BnTaD6;3(2gv+sWWjwBL2ZH4e*ZS{j0^!|yG(bA9+< zM9s^Vd+yvWLh$gekQRF8dl#`yEos-D$E{IR-O907cz~eC3m@)#(Wt0+%n>g@yr6q!|TOZf>S@JAJhGmh0aj%CcRTiIzSe%k47 zciA21^ISfB*gS_J#eEVFS!X90p+Y=E@`BN`(~7vK&6{kDdIOS5m26Z1U;!qi`=K6J zH<)o)K>%xhR81Ti;wuOEJ6LEc@WQ97;|wJE+pmHWJoA3aSkcZKhlbI4Xa*)zptiWB zTw0hHscqn6{DE}XZQJJ=6o#99v`L?HfDhhrh?{7W5+L+dc=A;k`{^55P5I`F;2f~i z@&#YxPP&#(buo(<$r)_f9WuHVWTO+QCa|;(;Yq#vso~x2z+xu&rgTvJLNw(& zoPd!A+3%m8uVP@;(rQHp|H$F3@eRxUwKsvb363I;d21WtX&TeBzoAxd>g1<`x#mJT zU3D{X{3dh{ z*B&)N*#?A*i6XVtwyE#&oNE5l5)vM}T0)Ws%d9ZDo#hvI z1)3uCUDh_$g={w842|*)0w?Ho2nP1NIc4D!wXer<6KS;QRkIr=fEaNFwsqMou@cyl zuMx{BH~I2c?6>Dm;yP$v-kfCs=68q*dSHVl_D3d=lUo+8vF^DGsGY#xdipla9ld8S zrM{}8=qUS&*!A+gkEm6mO`l;&+Vr%t#x_Dg8v{$Ci_B+C97pCcH^;PO3QlUv!fdT~ zatORQPkHUqx_yS9$Ql5(8xCSRGM!%NE&e&}U*Vd3xp{p^`Ta0pi7esJ#P(*h|4Tc; z)SIV#T}nHFh!^LjC9gSlf0)sU@`^WDwAuwjMlh$N@r06>A!AJH@CG(vfhyOy9Hrf? zragZ}>LzF^MnNDD+)y6nn8Rb*~$fOePNCb4M0QaYulGAQx7hfVDcj|&R znZ8za9JMwYhfpiciaWT}V0jquUK!xbRuUQGLT_CVGK7vZKYAt*-u1&e*QS@s+}Ck( z+nDV=+8Kd>E*^lofu>%<;hU{yeAc0nij4e)#m=#D{l73sWd}jlsWX`USpGy2xxR`>KU7mlg6(JP_$@_RA$-0{u&X6b|B*WL3+=!SGle}>1D0FN! zNV zL37OSO*(;#I>^ATd6<~_{Z{74-A%;m{5ha5ozfI<^Q!I<&l{u>KOHtCsV`QNi8lTVgfQ4(TqMJ-^yzA0ZqFz(L*@Li$0?ZF1c3-9|uSC6| zU7GE$&g4E>|65LaDg*1PWA!}bEdEmF1TM14Z7xa#SA|4IR7+{NmYg8D{} z&m%;2P7tzvQSz!Fjg1o{HsD0$-bUXOfZj6ff)x8hit)z(L;$rB1$%?emSvJpOMJFA zxW)tvHNAgzK((`TZPV=Hm1c>#?7-PDN6b}Zu7Wn-_JXAA*_J zRgBl--ojiQ%q{W#V>(&UC)QVt}iZ$`xfm72f z`8IT{#scRkF93`R(!zP=9+pd?>%)KN?>iD@#inZvr>26dj|YyyXpc=VYiBSt_sOJA zcO$B5{npVK`ZU`~I9uP&T-Z;dRweZHnU<+%m3Ml_hO(Mj%o$^5uVD^u$b>+>sx4{d{<1Zg^ojQ)UXHA7Xt3m?nO4C`CDTX}@j%RPu-6JK$gUK+No0^6+_L34TSi z$?tyh_2IJ^PZd4I{j|>Q(SNT!Mx}CZVRj>tBj!sv6m*@i3+f`NnZkcb?8=eK%j7I} z_dI&5vd@dO{#Mz#{OWv_S{U~*2!Q?1Y;`^*JBpi3LyT0ITmBoNi?BHWJwU?0K|+LZP8_rl{jC7bWL;)l-j& z;J6mxW}GCALOwo+B{e+kPm94_6p%fX#|Xkz#^*udNq*)LP!68nH%Snj{-pS6r~`+o z5wK1y+x4jfLMwt+gw}&Q=GgBa+xLvT)$-h`3p}LD~R> zfC9HsFM*i$!1OO!w7~|<)u7|`EXu`e_Xn1-`(bKZzrvBy;zhHiakw;SrA^0FFZ($% zAm=-=bFJCd5()TAXw+jon_kNKnmAoCh-_?o$l~Dy_;gCAVi~+NJ_eh~Akxa%9av`u zfvrs_m<*)*ku|+?)_$MdWgp3iTQ$y5`FDoaaho+=!dT>w);|lK5)cb$62}}|!Ej2G zoF;a_9g}+GnRU%Eswj|~xo`V2_Vdpm$4u>JeD@3h2wW{?)r3R;_A9UU$NxyU1! zZj%UsDcOif19APKcN(FpfG>;-*@$!H@jSdvHDZ6IWOC}}s)ailu+|TL=}G#H&74VF zyBa#OQ-_&FM)cm}dAx&y&Ij#WUNdXhdOjDn_}a(+w>6a4*74u$d&Zn4K>z8e6>_6@xF>FMI=lJJH#b{P^xk3@3Q% z!6Az`!}Yaw^7!5$Qwq11RlbDVQ0XzPf)zE-Y@-O7gc25=Csv|@wIN)+ztuYOjmLu= zSzgfqTOTSs%zgy_I!Ck$Xvlx*LH3m8op}VuCSij#U(Kvx{i$8M7?PiS3WAgv%aGziq4x}VJ{Fq}orJi%QXTO}t+UGp zos7Cy03jdx7@(hfBq3w0?M{hjl&9e3@-_;R(&Tm56g-)kFV7{|V4!(K5m@3wu>09BD%1?d&IS zJS{CXK&6GxN+Qzbb~qD(Jh*n)6=#RTJG0jZSO0Gle?7Ikrcs^-EUdK;?|rZfIc|Sw zyQGKmSiB`IqT-5*ze@mF`unT>Czci=zONN z8RVJs|1QPjveruWn+NEcg0qV2>Dg!_RI#A%7`iFNw-(w2TI`RPEtP?RN;B`N9}0v$ z;o2dB@0ouWZyDQQPA>o>R{a4LvI%p5$9CJid=&c})X=4rMB-H>`-Q4G5!!mBd^CEv z8WLuITj(Zz3Q9*KV>m${+Nj)P54(DXClkQr>KQVm?SRwi8BDq~?cG=pL|Nj=z?h0N zl0_Xbjkq?6LwlD1G=XGHn!KfOXyw3E@=9&-*+k)!!d3QhwYoT0q%PbBSV;gT6z=AQ zGR?$k1iv`9N7}=C3j(i~LT0cd>Cy2u9iwH8K;#1nymgiho`f>B3V;_As+9jnV9OTv z_wve+fwXzU1v(5UiO-V5iV|Zf2T-5nDbw|=LQ#Ji%tXG7VPAhoYyj^HRl@+veP8WN zoZM1rv?BW{1|)vs#sJOn8<7v7(Zzmzws?J$X75(9A&uUW_=*m;1LVeSX3-yJas0C0 zu|S7Akkm8WSp;_^uK)Uk0QQ=|HfBUQqt>$zG!B&`bSFg_9#z^-ggg|>lD%i}l_1r+>1 zkag5SN!Ryy?0}@)clLHol2iKd@Tyj_8M$n%yE;X){y%kVU@)h6E-R{bKs%XDjbx5c zg_Awp8iTHu%VScaVt|29qE5#jh)|fT(qlW(kpT znPWvc;ZsEC!QE1TLzy|1sCw!BaiUHsGmf_lki;Hmxk90VD6Biku3oZKX%5jA?dV0> zB}K84p_y*};%-LW^=XF@cgMWt*NIh7YB%;=0azWR8_0fcdHSJ(Pj(Ordc(RF2Q~ zo-Pzxsi%q=C)fmSRhUX9s$$lKN#)EdTlKE5h6X;5aFh?Z%!jm)yBZQ?s%=U~Up6l_ zVt5@1){cTKbp@<4kaEr)KOM4$qQ`69$&zADRF5{-KjIcd<#E(0;3fAy;9RGF8ka{+ z`lpRV96GRFzSfqkMm$1inHfBoIrGq(NWDDGkneKmM77^46vZk@r;HUx=xt+pbBA}q z!SsNgq><3toYH=fe4iNYaGI1rL#c&*jfB2V00!kEEYHhrskVO&nkfk`r~pH z4RWI>cP{*M_ooh<7CqD@obDjab@BTTnePXxB^||qHqHwiWzDT{+uH#;S|d#3P-2)C!7v4Cr>o6XWSs0?HVjA= zTRX(dgFxGiA>*5-C7Jd%!~!fHe-|KJF6Rf&t05lS+{mr&r3278XQbjmV1d6`Ms$R@ za>tSqz-dkG45Ipn|597-+Zlfnvmx>K<1!$Y4YkhxhU6#GsMK7(IHssN^~4u#`R@3~ zeTrvFGTXgEV`#XK|EjgmN|-lx)Z!;6G|5H*$NdO=au6|T!!z3}A0?MNcvCoTBPnJH&hMR(!L%te-fMT_qg#da#}RMyn**$RnTL`U$W* z)oCY!7cxfru;($fDjutyTB=jXfd6{)3T*Md@w{3ZPXE^ETvc@j$Wz?B( zgqVvL{A|4gI$H_j`Ao*lACjd<;kWAXTa3a_1H~tkA+>;AR^Mx8R#K+?{z=>Ae6cdM zV2(mHJrc;-8P5T@R&W5T_$irquL-r=m76qx`tXmwgLqRp?;Tw(#D zcEJH;jLzi~nBf$UZD9lWljTk=tk9TBl9KCQl^lm87G4Pcd{T4)I@Kzl>h>M{N@d|X z3y&Op3iR%#(E?Arv87_|v2I#6;^}>0l@y#@;jI(aoJj;z-apeN3j&(uNlM9rJ@9rD z?p*saM{Xp1<5)`ia_H<;HN+qK5(v2qe*Dh_^|n@GElrz5gU_?8DR2aPkGxXeOawS4R zOP6H>#+}>KIuGIYMiW394ikUg&A6_oh7jg#VqGqr4(_l3zZ~rJEV7CsSmO>o6QPu_ z;8g@A!HHhxqn3aPLsVL%byJBt#DQ;wB+v~XUvs}LUtH!1?L(Vz%;J8YUt_^BWla%}UhlnJ+2^U6XO;x(@(spKCcIHHL`Ye>gq@xVJM{@7$rwL=ApM6mMI@ zF_2VENEBC1N9-4~RMsTsk>**J7o~q03XVMH=Uy1(zT+rvnBE5WJCIMX&Jlx)?matd z+}yWf&7+831l$kUw9!y;wPfPXKdaTEH;EJ}RKaWMS4||P<_>^JId0Fiu!$C|-=6zU z6*$X+Y2*)V=6{dC_!RqA_6P{7{X?S7)`F(Q4c?>=T_|7Rg_6lC78rXl0?b*%is7E< z5(u4&($KO}@FD%?5TFr6&lVRU7W}d{#Pzd;*qu;NAA+XJ3gFIk`JL!!?m1UJeA>q1 zdduV#UUG_z11fr+Q(`ZE9Y&m=5l0#d?y=hRV{&+i;v2S5(XYL!P;L>;q25m4qHp4g zVbmM+&kSzaj2xmoOH!;$g}Yk>6nyBXeKdxgpe7Hgz@C?JELe`<(6rt^1app|ZpsjD z={<)8br_Dv)HCw9)Q!ZhQ2TCU0t>eqJ37DcnNcl~E%6V#bPC&8e> z{j}f({MXh{X7XQojtw|!PhwW4ch3ousWgKqB+@OTDXRrMDz^vK>Uvf8uMl+=Czt;l z4{OLJ8450R>+%SsU{b`5c`~t?De`(H-eDW{&!|h+YiT4Rc(ic6w(mVUOJ${3Hn{Xu zp9y|f*pgFcR!l8}WY1m~;vobvcnOv6Z+`W9$ss{pk*WEf9YB&DN1&Va*dap|%>r=2 z983L~My$M*Hr-A=P74G)l)HMHGwomFZT75i1Q|Ysi}KPltqZ`wh(NfdB*QiFegG}H z6>D(*6-OZ^FL&K^kk*nHGbte=BBDzW@9J`rW_e>Hs`I#m@)fa(X zSM6iQ?MNMmtmVnX)L2*&`bhz3vg?*4;ojNi>{>%`Ajy*5VeldiRkk}(Enfjv3NK8l zCU?=Bpa}OX z8<-A)g~^}{XCj;Y?)~eTF0z-<98~`L7Lk1bPAbxX56DPyELE8+cO}`$mc1+c9!ocn zWT=@&Ml#ah%AOMW*HGRRdrrW2U6_~L9Rf@2*UEqI{?IrEu2}?sp)z8mxSpq!NIRhX znVroS+zW`e@=e#0j&q~JNtjxULqmB`T=X7v|M_~)DLfK?RL6@Jz2$X~PuR26ZL7|w z*z^B-h+D4ic~d~B!Tu_)vz`+aa?CGy;I{nZZp`xJDE5Z*?n8kWbFzdE~_kK#jL+65lR4}PTc0=CKxQvyJ8enaD<@eb1oq*?KhQ3;U zaluJk31ysRB@hCn6%XW9_~`{xA7i0P+S89qN}}>}3n`Ygrwq68#cZI-;}Rx8F2UamAh7;c{56XBU$N5Gn}d0ae@6UR>7pp#Om;1UC&-9*(x&~{KV{h zH1Lhq&So0NM%w*=G9O&^I;eozQL^Asz$QOMNEbD9=%|h4m;D!qTao`sfV18P8C_br z!nS+YN;Tij_UQ@s$xDVduJt&HK{qDft#UbbBmS5PTWmH3n2QZO1}m-N8pUN7w*>_V zH2eIY{e8~_GjPmE@JSl)km9d#;8IlM)M#B$KsS)2Ex7!0gMG_;byNKMBC!kS`D3sB zh7#F>mz-G=Days<0WKd!*8sZ-F0#8)g?cGzRvub@F4hrnVFKUvXL6%@((8$|`iR_)W1Hl*uF03?y}Gw2dD;s~9lF?J`+aCJXm%I2{b488 z;_K(tT8wmYni}Nc{dd@NC|+dn)_*IpQ7y1m_e$9*R8Gz=ESX-Qx=Pu1%?b2HTDkpR zF8oW6MC!(dh<$2+8ZrkKxU7zZU*0x^Sf?BdS`3(&`f6~gHu`mtTL;%`95W)l@Zd=| zkY$3imb^6yen7K&+GL79d&I&nPpy9>C#ZPpYVSNvwBHEDcwqQ_`vPD!pQelr^ ztAXi-qDrvg(r^PlV{ zPF*sPvCjY@ScPzSBd%v>fGAqp0YNi?WRb&y_>$h3TjUeZJ2>fmzVdDFRYc5hbmM$n zWp%!R_=cD%ghg|={ABIh;0LVrr&#p;pTDNjrR>kbOr1YhL-moj7V5uPhy4UPV<&Kz z$-e*=hBU#iqwTU_mG3|f1X}>C45AhUb4wj8ZS_?%QOuA!6vf;iCr}Xv5O*jz^jSRF z*@t^$;l*XLJ^r1uGJjyDg0>u{)q*|~EA6jLdA#$PvDIO%hq(&^_4#&KW?OSwIWDm< zyzxjbZ%O##R(6_tSXR_)y#1)H*|t+opwibM9g`MRs4tJZF95*C%-FyR>dm`S1Wm~2 zJs(2c*ZJcRGZ3dg$#dmuqDjPtTD3jvt!Q*32*_z?kWewJ#7LnuTUzubCf5Q8Jj9OR zbah01EtI|D8j$vR-vEsv;-Zct{UV$FTAwDJGVV)M zzM-=#4)qiHCyGvJa>B87$4XO2GdC{G?TeX>4Gj4ry7r<2yhwFL9vf8uU2Ln!!Iu@m zi*BB29~ey;%#SCdBq!GM5g)GE;6}rwd?6Moizm&!{QyJ}x|_-WF<1xBso2^Ph3PVE z9A>+No&AU|u3ljoxxy*T&y7s>aEX65IT}cfv{{+E>}EA*EcBz==}>dj{|Nr6O5gH# z<0~JhewRPb^}Kl%mQpzhp#zMYOk|a^#5Jv%Z*~i93Q#%UR4hH(SBStSOdlzg>H4!r z^bRao4Uv`GUW0J>F-Wv|l$J?edg5fB_Kub#$WZtu3PK1Fi6u zbsXbd7;9d&8dbR_1d11+SMK{=2|aLXVP&iKW-+odkbD1kLpVU>o$Oip>_M!5e7XG9 zMo0#Zvvjb(Lf?@jb5fottRNVHt_=hxk?-Q8JeWN^~GaStgQZLCP;mV3NqOkWTp#oS5}s`GzrU zae=g%S1-MnDT>^Ryn0_Qh;KrO%zdxSpy$j%hZet5ixV@au z<*82~n~{X@+m-smZ%VzEh0+5LKOuHGB%u4e)TyTwEbL%PnOk~$#EplRw!hlH4?{1Q zjIlE(V}G)~ZOGpm8CI5ga)4B!nf%4`sAQTTm3;NWI#-$upUZQsu1h7k3X^kh+p|Z- z$*|rxRv?oYjUrGpMAoffZv`{-Q2^ckbtI_2s^U!tw5?VeR`3HG+d^g$SMiP{48Cgl zgEH4@#=<<(g&B{8Zxc7EFP|%%TDq8LO5i*jxA|oT04tKlJ-^O#57E%W?awt!g_}1b zv5GDJoT*^G&qzJYul#Z3dyY@t$S$D>>Ij{nbNd71c7RppsZUEt(?n+YnroZ!!vq?2 z09#nZGYs+f;l2^N#siFxGvRqlBIr;`Tp<%VxymnTeNL`uEDyi0Z9l9<3X0RbyL}oS z3GVXq|I>fzjN5_p15WrF4)z;hyJea9=5x@t$FDe?-HN;)FG%Qu2(b8nYH0R8A!bfD z6apf)$QKX}GsWSsuNgmGEkj5!-fIzxk-o+WL^)$z9pgZDt8N5am;4RuaYwqRt&BS# zV$$%xaq|Q7$#|K?B|kSx?C{9070N{%j=Q zp(+qBAJJ+0_QY+0WOd7*d>i{&k8EkzP@zvr#!0#|qI?X_EEv4RZu0aLob#33K2iqX z^pB&YE}LbjZ$Ir9#f#R^0=Qn*toWpU>HyV?iadPqsb90aF}^RSE_if|%4(Ix1aU|P ze!cpx`;40>4pGeG99LUp-oiap9^QrZCN8&u5lH_q&>|XRC|y0<=L20u$qbK#LE#J$ zk7MM|{7>?xx&!O5O{I8Y<4&Yjkd_nx^zZd&ijS)sq#i^r{ci9O0GM_mGMKEcs@>o9#09L-Lbc2N%`8;oZYp|nKMmA zcBG{ZHY)G~GB}y9oMo!A5p9H*x5g13(&oU`Qk(p8a@k#W`l@G?9KW2{Ldy+$YCWKI zN$lkbbN)B7>qkmA-Bop1n@SI?p%~9elgOqbn&OJryNLAm5O)>M2K`<3UU|Eu!}}~a zm$p5<4K_uQjJl5MhazM_YL!%$SxbW9U(PCX`~-7?{47Vq2s|7rg62eQ6SJCYDyXu< z%>91{XY7K?N?T~J+*L(gsG-l#4_skDdiK4dU6iRb1H$s10J#w#_p!b;(>)nbJ!~$R zDUBogQW>7CoCUBq_((f@mgmM2tCjH|&Bg|r&H27J&kt+&v*i6|@@+C4^zVvyEzK!E0Qgk65YJ)7ac zBO6A=I|9+d4G#v+2BN0!%-k0w$Zor5gqeCXWBjZLTBa^&Otoi_yX4Cze_`Vo^Y7G{ zz`N-!_za8EZOGM4$jtbyX?7!KP*b_liofCJM&c8VqfRTQtpzUiS4RzEZphU-i>e+| z@Zs`7z4#O*)303@T33h?m(^4K(GMaBwCh0I{xy7qb+Y^_0)%&GN}c?8s>41SpF&8mF{<5GELZbIRwhKv%>Pg^9?ooGqL*c*C(CP;I3;;_@3fy(JuX9eGkWDg} z8cQF{{+w1Y-%;xghfwkog?P+h0DYM1eP93Uy;sE`EsvHYnmbtFsnO_Fk-YciT&mIubOZih`$MoAkf@$kn6|WxK4%<58Eh#Ko$onzIzyxFAqQm94RzQXcz6mi*y7D zbk}&&l1;jn-c!Pv^1F70U4^}o>`D5Jo`rcAbH2>AGR%klUFm9_!ctm;$u8#sN=Oji zKAEaqHOa*AOZ8kF8kpibwP&ZrfgX%dm3_;8@vXL~5pG%_9MCgE-FD836c(Qx=;kXQU}Awe%p3S_zPlAyUm2<{m#%vs)Yg) z%_$T`zH#&7{D@w(lV23f4LA~c7L$*0F`TditQU`(HoTYgFD|<8rNKYRh(szN5ksBH zsGomK#u!GoAQ}!LbCyeh)Er95VFj*spm;b7U7GU2HiVi=cYT<0=?1p-hZb+KNHt;q819)yJv-xXPVA^4@aI$gk$}gJFW=He$ zYR~ZMn?+|^FPek`7f;pr#NT!#&rd}ZD#~lQg_m1ZBQFp324IOPAr$MtBoqn*W_+n{ zGbl;#$~EBB$xTd8UkU`MhB_}9*2D^}ZPI#Qc#VL9P|(A}wiE9!Wg(8}+m-o21uOe_ z$LeQrVi!jYud!0ck$1FRM+}O;3G!F;j56)x2ne5J$LFtD!qA6TF#FcP+{11MA)l#! zJN3k)B&@U|ul=ENl&o};cvLyPgqAp)e!WTnH)rn3@VdJ13qla!%aZ!dU%6jYflZ`{;u}#{DvhE zd1Zk4&pNwL%ksBx>lllDBfG5_WvA1V`nV$!N&!T_-xhnpP?j_>Jenn^DY^@v*);_J z>-_o2X!_?qZ`dAi+=HEm(VqUqLLeu9S+c=pH}yFgaI^N|jt4ECtEd);6zeLQdVcq$ zvCr?=r-yqbZWoev}rdApS(l` zcMPea1eR8#Ix5`2jOktBQn(1T$|XMQEz7#&_K_TWF|t+mI%!xI4sr{Kc-) zUcKj>j#m@r1O87+B@&IiF;hE51A6tKnd;&#Ic|ztjA>+^Z#g(Wb_eF@T0_LpwwOl1(3Kl6@w4VAKsM)tC`plAs3evk1 z=r?M}5y33P&fl-Kjq&p)1RYPIXc2|R3ADK9crvj=@@x^^xVIuL| z3&9%;m_h*NY*(HiE5$fo_2?$^>Drz^1~rz@w9M`D2$LdWW4Oag z{WILkY~Q(Qin)pIlDc?6U3rj41b%4FFT=FCvcCZz#qP5t_V=6cvPYTPSV+5(6U1TH z9y{Rx>8q1j$3^lO$m%=EATFAP>w|dPwr$qLQR&3P`TpJouT9O4-&e6BlXt6JS`D&> zHQ@7aqj8p<9KO=tmj-e?FIzHpWwc_=nEGUD2R)RE=+1zZMtbIHs}}4Tj?#nWX{51? zYf?*QNbv6CZZd!nX!xY(wKFiHVYi<2G6q8H`okBHdSYj2h$$mvKaDOjiAOnZ2-mQV zpK4wZYo{o4GJU}fO{curj*5|PDu8RR6iRtmJ{NmrLe~ksTzv}R9+O<)VeA!<;>OTQxM zT}Yw>sR2&3D&EtrD@LQHG#QMg&Kk5+dZF-LQF-lgyFMq{!XnRutqf~4Gkm3)H>BK_ zLu4%jcMt_M+YK5;Euxu2YCFptqemBoT$`Znsm#J*lT_bDDm0<5{mUV(J{EbdJ_}^| zz>ILcOhi=E`1=mg+6jLQp@#<8?3VX=2W0QvVO}nKv-`@w#2CI0t*&WUK{5A76k1lc zNK?YHFCUeiMX#Bl0@zUOv5J5>(~Un08jA#sM``ExLU@@On^U40sdv#ue;l)M6mjr1 zkX2_;Qa;)W5fKmy&$!kYO1mv!ZbooXqymHV)u()I)V}~Pt?7=4)Mn{-5Fh2ER9jWn znOWA$@aoX{`F31qnLWEE8rb#f<;Htkm@rCxNU0#3+@8>IJW#T{1)Ie#C5O7(qc-Zh zeI#~>efl{iws%l=**Eu_I#Y?^B|bhF^ZElpwaq3C!2Xy-V1hFaO%MT_*vTEVF3Q^7 zvXfdSo$Z}3G1FvH3g~gyjxnS%=yh~I zB$yy5S0rdXSetPj_l>fEb%R5{g6Vl^Z(P9%LG~nVZ2n3tRq`K={zCa6g!kmYU#_V8 z(f1vAm=^2<5f$Lb=nq&Ss|{59=#z9IYnRmkVY<8<7a65Vt+a>s4JZi^O&+UL()s6d zs|v}JR%p4G$sG`x{>hP>PZYuhG^?h{Nnn*GL_V-uc{CZp^^bmD({Y`T${`r3bfWO1 zi%aqh1Ud$PjJATKEshONeW9~uD7$n2{d=JzR#yzyYN8P92t;j5yJ5(5eaL!lf&oyr z1fn7jrz)pMCXp@QnZ@440ty+iNgsf6fa7@6@(ZCXYw;=-q4?-c+67Ku&*84W94)z& z7l&G3PU(Ede#BP4*wrH7Ih`D{u&;S}Z&dE^e<;$XL)(+|3t%bGUTXIZnWmn))(%;* z-?N9^0Tr>Kg#Ud{KFyb7zVTkr%(ep7=7*vfeGeAEC{@gx?s!vcLx5)b7&gT>`lfMC z{M%i2!BRu2_uWyX=8KX0+WaxbUzoXe(fq?hPr5z0z44oZ7E6m6oyvn{Zlvrx)QpO{ z*wC!vi&e&u)|WEyXzWNOgqNV;3K6~r))F>=8O+q)t)O$!gFziA6;PMlM(3{$d~bEI zfxEQ;Bsy7F;&4K4*}ye5;bm=;_@QBEBYV`F@vK8sw7Y%%gW!yNJQn!X7o0(g(Wwlh0MN zb6t8J7xh2*&~7jmy8a1?R3AN|TqxK^g;r8w-4mj2VMup<){4jT7>()bF`V>86Zn%1 zDg5ZnY)T6V7ssSnN9w#VJn>l4RSUMV4Pn@~Q-Kb}V)DlH1_Mzvvp*-_#FWnoDC zHre_XX8&yvF^eM`E&L*5x~ON$0}lp5PpX*E113t&qilOYzMb#v$p8{Dg`X2W?F;>M zOu$I_uLSd4!%nInO@h2V*3}+NdpaP{jk2tvsv#}{_ecEq;j~pD6J{Y?T!389t$gh) z{kHpX4vuqA`7C||K#KzoJ^|kx>`pq}MWE18@|5h? zW%Feae3@Q5nE*tQYP)IACyVoS%3u53ajhX(4iH|@WAn)sNh??Fq678CkXxLyR$9;#{$2NKgnAA^# z;QH}yZ^MhL$FN&Tg8=C0BS4rgr#46r3M%FH9V|EN)clXiQ3&;Rxkb)=-fjIa)3P=v zpG{drB`b=T*Sd?y071tYb;C-I<;hKCkfo-f(pzNsUNeroMWD2K$2D==p5G+%(%C{% zQyI^JWWiQygtngW;E-5Gi``wtBWHSVXNmvx90AL2Z^1^MYRbNg`VMq2WkNk=xvM)^MCyBAcJl-SB z|Hv^L=l5N1AT=(|oJdq-$#t1wr|nCk0Wc(O64@DC@%d^p14os5ii@*Egt{yFWMIX-Y*hE%3pFMZ7c|53{w_qtH7 zL>g+_3DSkP)hM5QyIpT`hG}!@Thi+oPXDBM(`D6pi4CL3u9J-#%Nb2D>S!WdS{>Mc zhC$dAz{iF(OM=~W^gIH7t@rpMOFOE8uw{g~Mixd>|E*HO?RNqbs0vHq!Y{^u7#M&M z?`NPq6I}ENCjF^n^@(=;?cot8^+j&}?#8q?cvw76Ct#iU-o21*cXxTYlddIM0bl+J5 zAV^)3<9B$v8CdR*5F^obO*qr)@tarK(;Z$V>aL$#r^wp}uO#fI(86JhkINF3ZuW-= z3kHqK!(fXkJln8Svb~Uyee(+gcfIG28Xh-;XdynZPK08ok_EegVtS|az*|#cB^?;tV{oMtUmgO zk*KB-QL34Ui!z^8B!ArL#22M*r2rw#06IOn34gP>9y1mT2<*s;j$gd-G= zsqGoEie=8GbXZa*XepZxFBAx?_hb?tcD0~^q{P>zAdgVYMu6p7CC}UR*jVu!SZnY1t{p2AW@tg@i*=k5Bl%I!JgR^f7B$= zx2mw8{6=zX_8797#G^+!!>KX3CNG~)nb`}9j zN}ofbnfx#kwI6m+MbcvTpQU&y73DVsW@*XJj6l%N_)!e!4z9<;n_)Iz#aUce^zFY1nwMxS`US?=cQI?n~ow<1SA)l;#k8^tMQTp z4;_nO?x))^N>~9CQ_x&znrQ)n`7Q>KN>RvW?`dAWfXt8QV+U4(J9ZGmT=?90d^9(7 z!DP|OKfLq!8@1_N$E;^3zN1WV*=X(XOYz_-VcIGmG|8Z=Lyb=!`^uCN{+N2(j9E$n zu9yG;ISU&GFeek05O(Y~s3m%%voSjW7lH%8=q1b6*=eo8nvc92|Ka+dYTq-LW)hqt z*mgYAda=&>R=t&DUOlk+Cc=X+>c_0%dgoWMh7j+gw$zjP-Ik#TpRy8Zi+`wM3Zg(6 ziWb%KvG6E8&Vo4oVPz<-bz0xh71)%K}v}`*s2S0c z%!t`d&KTr$T5yLGhs2sYWbvxTY`<`DZB8iapi1wP{lRa0mJu*lS52?y_gv|)C!n`w z7ZikUiVqvB>B}n-qSK>w4~(liTQ=7$J5?+Vp6HS7_kXsRU9Ej`;`zK@8l*|rNp@0P zj`)#>+UGj_KuQyIX~!+`Q`O^@ccy;Pg*NJN&#Ya}qk%P`Q|lc}ykE%X1*jQXI%4oM zlM4 zPsz{tDPv~}si*`C6)zC)lk+)48eTj%1^0>pSK9I4aThWMAJx7eu^wKDEDf~;RVgGb z-X{=rA1O~~F<8=Y_+qmTUh#?HSA*m(4vvc<=YaFcTAw(dWm$*>P!toQliK9?$+omN zl{c=11qV>j#@Vxs+FwaDz!#(^3muVP6q*!~A_#p6`I_yM;(QFE0>1F!kGGAF5=Y^@ zKNJ=yKmJRutg;$32y_}lNz~@upLsDqvY_Pw-D=nG>I?g`Dcn7Jl|D@9hpY=G7H~PR zi|AH>zRWzcf+m;Y+O=Ouu!5jN9GC&fOiwb!**7yW;dpIwRP{JU<1URegqALxg8_8xOB(Yc=3w%QybwOE@wD zEi5*R)#CtWX+^s9FEKgaGI2?RvP_o!Jny>mr>cSGL6wimIhij^wZzuWaJvpuYWR_= zQD%~xA_|STGM;?Dc=aUG3X$Azpus?K5}6JQ}4C(cYvjVLbqwRlKdbH*O*J>m2qr8tB`bQx=oZ>~v;)+5G~mqG0LjzV4DYw9;pv2fC2U>PL7y{& z#^O-X&mw3{(Z4`{mGmfvn22?gJs_PqBOOk52vU$CzmMByAYSKN=jSc~ZKh>c7WCEt zlqUgW3SL5Zqu%s~E)5xtVvfeiI3Q@NjQb~?2#QoQl*b%*rxW+~QqRKRrC|7kdTnM* zrgaxfl<6+hGBZKGU$H;U2q((~LKE4KTwd^Ler$l2Y2N!b&@~$dvm>IY(yX@(V{8oS zh|>d`xL+hmurdhA3jmfK_5OCX{FqLYQI&D~K0;Ew5`uf?WM5g)Ll2{W{wpigUcbcZ z4xBj1z|Jah)nM+Z4!%?ehe~Hu(zuk)<>+GS z&uBbiRkaRJ!h&LIlOCISMj7y(DaSY1)Y|@$jAE5%lgYh$31Xa)zb4y5O zV2JslOZBcSQ2+;H3NFRQ>M$O4KqOUJd@NvTd6#AJ)`zXB>{XF$X2-bP!h?LvlQJ9& z%bSw!`gNIdhd$ul6GtNO=dVM@(d{oIM^IxG7K?+HpeN7ok)6R+Umn&HUVU{{cKkRg zU2?aL@k?x-mIN9>CLwogT>+@xK^oPliM?f#^3-8Eul#*{`*Oh~TzIdrMz3)Xfs6B| zk>nbS7Sf`{TvTv>2-=b$iP_6qs^u85Z6!-95xv$$8`CK<7HU=h5?KMXW+<60lXOX`DCGJ-ZCPvX*Wv6u<+<4`>TpQHto>jXl@yV(?nZhm=HauF&VWe{TNom6V1~uHb zc7e>{#!g@M5_)1wUsU%iw51%<-*o}AM0Jp|J^dLG7p`LdoxAEQ)k^MO^2 z3(WIqf{g2Sq9Us^CYX5D1eq6wGvijW`q(#+XGSOwlJ zc4LxzbD-)hDy-iA& z_`=VzgxRaLLCs{z4gFEw#ZkF9KWeI%PPN4GuHg=+F8h6X=y&0(r5htnC6b13TJryF z7(dbHvs$TbCdVLt+K>Rx*ZugJFKSx!ILu~q43nV0u|u@#Yf6Rd&G}*xDb}bwHn%h5 zK}GweqEuc*c3)OH&>5b_CAGl%+qC^2Bk_#2&Q)Fvn*RdnJ2_I-bhT`j^RLO6x6=d}^-o`=tN%rPCU3pT ziuRQIwp$aDn|A;cWZ@5A@`2%%9S6&Ce*5CY&G37M7G(RViD^xe77xzWmKk;fR_ept zmcWf?KV#8SzADF~2SCe@Qmn3E(3yTM)2&=$HTJGdMJ3uc6~o2e`jbjISz7j=;dTWK zaq`F?B{T*hs{j?7QUhw|qrn&2r0_e-^*^OIp zF-~cY5~kWO`$8=Q$b`9HScm$+c3_xqxFU}{=C~+ve7mPI+CHq8f2`l*2@Ut3v7#?Q zb=5~A-W)@-b60(`54B(wd-^=*h1Z!pzTe`GI*P<;8ut_sCULU(8>R(hnIi|BL^yd! z;mZy$;q~MgPL4QIa|_9egIF^q@{aIx&#>w$wY9qnldqR~Qnv5{Ig$iv@LXN;FL^nF z?Q69u=1dN<1^HsZUhH&dB+UT2MvAitN`!FCWekOztYSdf{j%V04iN0w#1QepjjKaT)B#^#7P@wBP;A9KdYdJtHt* zN0OdEdxX=G(3@I|*4x)dcGuANXE!&%G{j7nQj&8lf3f+n};pt)P$b0-FF4_wXn)dN|qPKuVdEXcdhb;a8a~haL|yc(|p}*2Gc5q}mR?Udalrg{7F- z%<;#a`3?S6*c;2ATO+kRiCv*h31bsL9}N-xf^Ges&H$3UNY;b+G@-nLenRi|4b&h) zdFAn?R>FuPBSG@E)8OS5-S4?Mk)kL)I26+2cvr`xR^srBHnPPx7Hfvn?rA)@=*M~Nyy*jKkV&8gzHto1e{t99Hvs{z@N3-O8 zL(&L{o5u3}i}#6#_^ZLSpuR<@r8Wyx>!+!L$N#IF)!jC%^w;)$E4pRlKd9S{$VPM$ zkkG-HuWtgXrUk#J>z1|N`cEfU4+!|$SHIY+`sxN8>1tl!@%Zl&zrUfZ#;(kZT(@0P zTYsK!4>Euh**h|$qp6i>#^1QriyBaRq`u1J^&=+B>ZjqPC6%%U>O1@Z-BuQE3@!X^ ze<{^4rV(yLwPQfMj#cm$Ei$y<^;s-qLkdu?$cgQ|iG8Y}=H-DZwG3FEkeQ z|0yW6@aQbMw+*)A8i?6YZ7@?$7E2*Bj^|a*9g)zVvg&i(Ce&B!R?|iHbC*Hj8R(Fe z^EajzW8`JM4;i$1qlfH0_H5*zfmFo!tKD)t6kBlzKCWkE_1Vq5!UXU#^fnNzhzLTc zU|=)icnBNHd#=4W*5b{4UvngfZI_P|!}(pWK`kGmctMJ#j`Jf|T}G(j(}iqz#WcVz zeTfvHfwL#05W6_6=Dk})^PKeBLK~%cFa3YIdlBzvJYTMb-^Y-wjXH#kH}{BxFj7J4 zIVavKeqi8N3Y6x`ig0H2ZYU3%fd*I9gN0R9$oZC|NLB~t;4 z<9@H)l767=RU;>l>Br!>2wOYbkgVA+bwC81h*=HzhMe%Td+8l8&u1Dx@litOT-#>A znhuT7SA{k5$4Usa(xj6R0v{xkoGF)&F)C0R4wzgSC1+`DZK+4VkIB|# z_#{Ka66hQjoGehcDCuO@Y)y%CX{ozYkDo4pENMf>(Q$T~Y2%(dP!w(-^l8GxO zMcXBKzj?d^RZrYJk5rgy55lFJy^be?Wd=;iYqz@^3%Y=Xrgqwf`vvLa?GeVtoc>$_ z*x1JtI`}CiM3Xgb&%8dNt!5bnzRW)s0LubNqHhjfIid`^@ha3wazXc+x#?1EZRL|M zCUOvys4Dw)Mo1(Mw<{GPC!66|4*EF2{s}++?5#D`=HA?{_HS=(vLofNI)|jC=#ur> zRK%km5IHrm&r&j{o*92el4}wgnB-g~&sht3GUT;vO9f4;gixF`GUad^{jS3&#HL>` zfmy?GuKZ=D>9ar6-ATgn7u|;Y$K$_97l@dYHRckKkyJoTSD^)h%3l=KpI1q^b4EI5 z-Jk_f6*@?yT1tuTjoQS$s{&k3TyS3jw(ZM3k3-il?Sn)AXL4#3iJp*H3hWh#;NH$s zq8CQk^o!?s?|i{Rt~L311kxw-&74P-KOCWZvLfDxeImu_<-fdD7Bdl-p6g?AZR+r9 zzn`A-8v?)>L9-1m(hz{8!9m)^olQ%B_poo3!fA7LhYFRP4qyW!*8IC95(xN4`3j2{ zDl5SuPE@*4a80|UdZ-BY)An1;Lj`xYz=}F)L7(f)R24MG3nW%J>NQ8qnfNrL!$ypo zfUC67KoJ)c)+-&YQ{SD}{2<*z_BZ&qo3{5y-E^|$jVlmqamml%W*fSgt4 zS#|Q7VtY&0+2-&b+@z>nZ~2B_JKPiBZg1ZByl;nv=)a^2*5%M0;ad1w(ds zD<7SgW!^NSbH2|&RYN*rRKFZ*&`Qe^MkgI+#gopbG@Xx*yx5}mlwn^QUuikmD9h%6 z*MsJZF`+CYWw+}h_unl)tv3t<`HwmkvJ${?hBvzi|gshPwYD4GJ31Wqb5`42&#>SL^ecYV+sJm zWG+O^J=c=c6c-d+iBo7t^;#Fu9l5Nh^t}7#4^2uS_t-z%%P=^=OES%PhF!!HhE>+M zaxy0^HYpi@4ULH`4SdKwL{%9B;}f`|>+-BSRg`;1f&@=uq|gmO+VOBArKBaNkGDUdRy(jFaJr;VXC z$D6em5CusZjZeNkoVvkm1+P)dUhuIs9Emel_ONrO+IG97TZQ&7;CJ`Z!bV%^vAw$7 zyV8{V*xxR39Nq>OaI0U+DkKst;f|%bCiUEffW0P`cARxt0*>m-^X{EZ^^XVL70)*c z<8fxVnp;U-8oW!{Yp`FVn^a0AjvPy1rL902XwcADEK;l%bT+b4$xCS7x)>j^m+Z;7 z^m!FVvKs}7J*ZpOL1m5+sa`t%a+GN7N%!z7Pon_zqAO~JT;~iV)nGszyBV1D210Q* z9&WW0>N6ve_uRTT;Eahg&QKTnOzwt;*bNyr)U(PX0i?3#?|_qC%pzvA63?~vuVW5M z`MS-lI0P1~;BW$bD9sj8Wk+xG^LjndWw_?Jw(;Gw|wT>rvr;F@)Y{594M5= zTb!of8xU5E4;3sEsZ`j+O%OW++R!D`;Ws_5$N?$W4-}_p-O1o?ROg3*6KF0_DHe)MK;szkFNQ*;fMA6xS6Tz{4W?OCXVY6|9D^^O7|Lcl7gKp?!CSb-YGwmH;T z1@ITYe~l-t<(a#NV!%PTFN!eC8nagaq7g>zQL>H7$fbq0dp8sf0F9i~KF(t286B;4 z3HAmSEw&-%Iuo4mgHN_r6^#HT|IR1_yGGY`l0@5#r7AZ$hziiHok{-)uH`n^*ycHZ zK!kceI(WYCOquaQoVnmGaOZ$2Hg7Vz;g^(xNOTyhC5{)e2k$M%A#UwFs@{Ob0vWhV;qTH-~J| z@HRTeeI|;ws7*El*jn;+1ot4GQ_U8s8u}MPV0pv6+P_unCg+wI!WK%PYUS$Otm0@c z{`J+grccXJ-Z;@LD_TjW5Z($#T|)J#a^J8e4z!=XA{k91W0px=@vM=y(PsXb2yigkt{ow`+UM- z_Cdk$X*8I)IFl)&)C{$xn;myhVe&Hk0R^?rahPa*ltAmzg#m!Oj$ZV(q=L)Va?gKz z7b3EDM>On7)44LhMq0GQSfGYH1`zbasl-l>Q~b@`E_!!)cbJogGY2@#6=(hN7D&5Z ztkjUzmlCW2DM&v_g4Dj#Sq^==(W~XWxzWHwc^rL!$m+ov4yB?popUo)D#dx}?{KN4 zXR$Av*1;mZuR6;h=$Pd1Jv{CcNo`s2uG~qqw1(Jq{alS3cn=6MKgqytF*l=POJS*) zMFCq%jVf{I1r&j4`Dhn-{uR{0$b2)fi9B*t1xbUN@GwvbNTsqX?S5})eGD|~Ea}Iq z$H8hQ8C(ObcbRvD7S5elBxl`Q|3OqbFl#p1%{k6nO>o!Wv=~-98WOQ=m6R|rqe0?> zF8u7@Wlm$W#NjOXOK|SI0LQU(6DmNQre|rYX(QMbnJR{xnJ$iutZCJbudmr{yHH4J z`mQ&7W*>)U#J`QH0EFro{4op)gwM>MXT(@eoFTb6qVK=I>0)C-8x+G$yhHn0eXB{6 z2*M*8wvFiJ8c1yBrn$X8cHH(Jt#pY3MTCu3Cfhlw^a-ANRn>EJ1TsdV{j9fsL~mz( zgQ~1WGM@9!BGGnFhwfPRo!O~=-CO$K{Zyk-Z?idDS< zDPU2?m46r(RCh+lAH^r^*1^!gIlN(p8&X9+$K@djxXnq9>L$W@FYQ#Qm;4V ziI1rSR-(;7+-`NSr4l2-saPj-O5-U>$-*0|&VCOmZI`Fy>B4A-X+fnW!YQk&KW0n3 zYCyF)TRn1(`I>iEQv?Yc7ys5~Iwn6?n?!&zZ1_#gMu7FcQ@g7z`ZR{NO1ptyL3{L`rgSs&;qZS%58FrT(%t z+Z0B1XDW%*0R_bcsjuJgjIs+kw5fIieCC%oiQo=~6sc-WDT3%)!<*0jmh6#kn+;p^ z@C%9IXv$xrZG{<@Biv+v70mOb@aCF_JIwcq)EqYyIBUvGsUmRFg01H>R4m%FjbAd{ z^h54;swYAI<=?qE}m)PkrB4HOm$(YEFYHJdbkY;eJhLWlYgnm`@@+ZxT% zzAx;GPvG*SdR#6D0fcYOC<$ROM{NQ{rG-fb-Z*G?cT?kwYJFOnW z;9*w^92Ecab3kxtTZ+)}3OR|t6_;Wzo4736nNp)TJqSF_^67R)7;Tilfb&HR@lXz@ zkvZ(Nl&R$CCUO|&AbRT(yg0WL+0Cy9xL_IG#tAN&C3NP3R6aP@tQ5@7Y4_mzvAl4a z&(z)froyim8u*HD1qyTQ`VPt>9ckHfHnXLlo?;FFq1 z2ik|judKW_4knc%eQ?KY*e4KmVfZd`bA~H^MTtl3it0wGh-dM>hx!9hhegM8D)(`1 z-S~j8fuO_m2Dol0k!C{dX4r9Zp%IPKmz7(2MD~f90m)!t#Lx|a&|lkNxC_g`syj%Y zjIjf3W&8}+LMsuw38S7d?*$m**HjM`tkGk4ix5mFnF$gUwlrnhFq->0bJpa515y_A z0gF?8Q+)4yc`e-!v;@lC9#dzbK*5V%f_rYX24v!D5V8&qBwUJE_87RyAuZq)uUWRm z^BY7LnzK03t_3qgi}MTACLE*C+z3^9^<%{8(au`C?wD9){}vU-jY!?j@(HZQgtCZz zm%cB`*77j!18za=m=mo43d@rb;C`?cl2yeE`2#o?i8`D0>Brjwm`hN~>UC4Sw<5i- zPl^ApTnzNP*;8h!kb=0l%Z=(8kDGzY?mPoUZnxTMKi#4Xi;C8X*gNu6cwEsZ7zt4}KOyd~7_-6j=hOp0_pb8Ks1y8hIk z0Vwnem!fY6S+$k>MR-D;uOrfT1h9|_$Pc+++O;bbaWL~sI}d=bb@HDX$83()`AQX$ zR`QQ{H>LO*t=7z=$E2D}USMEz^6Lp?sp2}`Um>ZHcJxc*M$S0T0D%5E?yP6J1b z4Fh`#WAYZZ;8?o+c|9Y?i26@~^bKTD^@$})HAqW?6}V$YC3&U}Viua2Q z>vg_OI$RtT581>V=56$IuNVFy2`!fS@j8SLTm zG)fGk4?)N05A+JW>%0#^7bxQLWU_6~?J6`;6s@y%l!3Zyq``OF~CiL=SDWMn>G+mjF?92uxbqsp~N38fGZ?Hw?qGZr;N9 zxr*J{rP%#8rOmi_PBgoWMPLGRG*u2AA#;!BW9Eu>Dr07Uk7$yvz944@|3b9y=6A2C zR$jk)f)4C?X`T@U$59z|pW$&l$;gH9> zRNJsiqZBM^Xq#}-?R~yM#q^q>q8Kj=)lin@RIgxPIXd`fWz$6jm|lI0s93bb8NTxV z8k=ii%LxG)=O_^~Q{==*_F{mDbRP*`ZTulCiRXNK7SZY#73&uc{5t2N*1J;}dy2(> z>~U#ZijJc$1fa3iQ4d>rxXU%#gjw5MGMMY`atj$Yj9R9p#4UesuVJ&S{%}^vq2x#Z zTk6;S3cY%bX9sp}Mjou{MsZDMNYvb(iEH-ui`tu^w3W z+7HQ>7tpX$c}3YBm^=M<>=yW|gPecuGF*jsG3sBfvx6?$j-kP~a%j=_+^eZgmGnCq zxdjhHeeiEww@~)$$qUMfL`)-8gg{BvbA{%XhqtC8s?9s9D_bvBn7WtWo$-@ZY;Oj8mB1mR5G4_`uZr>^LFU?0Xz#PA4+ z0*B7q0u+_@lQp-}g5Lzk^ukbi-6DJT`XL;~5!mK>j>-jD!KvJ#0+S#^FT8PGomQje z<%%v!{%Q%eF(lw60b3^!wt@KzAVF?H=0O~XI1K?+5^hOq#&nt^r4e)>#$2@M0d{*` zo{!HA&D61@0zzOn&|sPERZz2r+bN`WI;+V$6(X5`Ub{nb9Cut-HEe@_FSJ8-mpRN9 z7S_Ftpa-JC9+UM!VN=@iH)(c84#X+UAwDj8zK&1KNyabOzgD|(ij&KOqW zgv8V@Hy?K(B<74{>NkRo6-^W;-er%!S0Qxm7~lQqccC0xu-ygDHL+DbHxMk$bX|D& zSS0=_PtFb=$pA809m+Da3*ecK?)?X?BU?p0+GW}(A^Q{HaikReN^x$rj=G@GG@n@+ z^YQC>SOq^#^o^T+e|&w-gp;XXiwkTMzisX53onyQf=pw7yN@uO|1mLy%>p^8(}hBJ z?|r&@bGigLF3u<;F|Hx%bs*{P4yce05;$VEByCARq zz>~hP6bT$-(0#S&*yiKax?jQgvu^hDb5#=ESEz)HHhpKt5>2WYj0JqW+ zY2fRUsM;=Mwj1uo&rsAuJb-&a>P(Yos*w;ARloTe;fiCoU|W5=sr$H?*`a8X(1zy; zCZYaHh5fU4EKy_LGU)-w;kki7wV;XsS(d8JtFUUIT-nAwEDQbZbL^j6c_SPwMkZ5+8qHaz=-(( zZ3smmhu1(;5NG-{2~vtd!k*9uK~_rlF*pAMfz1e85gR#4vrn?}#c2E$UdA~(G5gg! zo)cZ9JzKN@WMl2mSmZ!G-hP3XzM{AsMTgDm@3x}faG?pSHwEDK6=RC+YR&sh;m7rR zS+K`o)`{VUNr{L}t_~HkEq(_CdF{qjxtf%V-SJ*#UwX6VfAAPuILh24U;g(}>M<(J zwxwK=uQ#kISXU3`6DyC(_H}QZrc$I(yl4M?yjD|$cTk_%q`8Yr$%TT4tV9#73c^TM zD{Ej91vkDP{2pi5HrW2hS5AH))#X>V@49`5#L030#r=$rij+^;PBVY4A1zT^@UKU) ziP5D&hrKmGX`$2Ja7#3Ft}sU8eulQYd%fh}SE{K})4f63cN#9Lv@=a5&*w&Cb6@!H z%NUIWVJ!KCqWq8v$tM}B6-v~Yx@i4h+ z9T#CoB0A*tV%T%2=m{z)HtQ5OSKQ^@ot?{k^yreuk= zKY0T)XR<^vhDnn#bfRXN7H3o%aZRldj{WtCai$9pYS4)EW~pixRRI1yDy;lbBMb-; zTsJdZR7){(7{^bCkPL9M9Xs#apMvQ}?OL+7!J1eH5vkf>2nXCk#<(3Qj5@t>cj2qPerL>NUuW$re784S|3 zk!tn|{C&CkVk|!+OXQT?TA_Z}H{QTYJV5y8!yLgwbQ}UBG2hG{nU8{QJ~2!a1=Z-8 zH8qcFf!K`A_e-#1x`-AX)mz4mT*pFn$eN|q2^`pPR;Wo%NV z%GbNyf1Fu%ztb9yB9!*UYXss*4J_@zv=V|ziAnExl}`S5lOTIqn>`~<$d}`n5A||8 zw()Sh^S3D@u3}F}VAJ1nUqRE+F%r7I1PDBaGwnYm5Vf4dx0_E0)I6iTQ(A>6CFCIB z*BB>SBC|zESxqLfAm&;Gd`7JhSRxe08is0n>OcF^J|t1tB^DUWV~(Zy3cJrNf36&c zwwujrF_UMsU6J{JgrO=(mUe3Ef&CVHF;AB~qrt3Pa$_gI9qie=vjdd;&Ywwk>%xL# zv&#($FB3Rd)IZ5Q?t*e#w>j%D1rYp?e~>Ws4dLd37!x#=;zZ6(bu1C8Do4cBn4)({ zHSv4KfotfPOKmKQS}B@O%)rp0ui$;W25_-9d#yMkbJ>0___MEbwVaDxd}uv4XV(C;e~n5CIgiCb(e7Z8eu_ST!e@&I{4U7v$i?5LEado?7vbm zKd?hL(CK_KV z=W_~c51U4i1?1*FGL)y{Ece3~3>^!!0~_}M1-H>JUmm;-U6EPd0JEb9o2IIa=bXrF zQz5VDG;tS#KqMl}GQZ67;m;F_YIPsamwua(HbBhIyUWAV&c}$;3cUH8YWyczT&BTs z-eD%fD7X*7C1@dFghFLTzFoSNP!;7*KA!S?Ln2h&8Qtl!$Ec6zThz~gt>kt_W&cxC zAs>(UeyP#|yK?9%aBsQWX%WxNRc+@Va6t_VV%Yq{D>ya%;*h)N==JN27&)RxFX-!j z{RAbC)!h9?_ggcYWW*6`S$X2^7}b-H&xebj=Q^Yf5GZIa!=Err8TMalSD9L#q(&kx z3EOsy(6U30@c9@P37$~K_6tG~DfbExU4GYW04pXTU(W!#u{DhI1<@3ij(ZbTW|F$I zV=`fm18Z}a>71xkA!{!h_jp3^ds<*|!$N5^csS#ez1%W_3lap(rz;p@FX4~bll{!!L-sx&n8&^;==sns}kv(pU30hSzQ`w=q% zp3_RFcFwzQP5gl5obla5AGdr0!vI~YPMWr^N(WW6=r`YC;qHS(`P9dUcEJpI$go2x z@Sbf#kO+2g37D0`Unu~gTPni4mc_C)E-7G=1Oaw z%V^~4w6Tmi^}~L^G%sD*9v*?r^Uf97?1I|gFa~g@g-m)DX;nv%5?Qy64UJsL5`jL5L>KaOR*nzP z-B7C1(0!r7af;KnFH^R??%wA_B0|56~O21!- zwlG}0)`zP(9H~kq&+Oii^2yvRI3AN$s$5zQ>zZ{6Y!xfRFDXyo8WWa$!dz5s9j&;X zj1`Zkut4B}w|x(Toc4%dEcp$GEd5>)Fmv;}s+O+mRuwCYE&ocW4FM~b@)=!Dz)>u@ z{WC2LkBD8JPAFE6Z(-x8%Hx-z%_U#bUL4gz3}f7;??47wNYbM~ftvQbLz*TD#}JQ; zSp3>0qeIK>cKY&oqOTD`AFX1 zOV)Y}=ZjKPaGNMQW)FlKrMF!Be0uU~yu& z>=q^c?&)+D4Y5UOiM;hKvTB?nHV5N)9) z(Sg8?h5Fbyk9MF10T3``xf$j>)gJC=Ch9)=S-zT~`#zD>8wEclzm+_WB8BK|GUttQ z5&#_?Alm$kh+;}wZx+lsGLhA@8VMa=QDpfom+Z)If_?1Q_Ov^dQo*#(-3K(8Zjd5? z7h>@6&PqV`!IJ;@yZGG%530z2jqp@h<(_hmZlbb2{aaYlq+sk#e*T34rd34j+6}>deaE{s3-|dY9mp$t zduxn!8^Z%v;J_a@1ZZsC5^1Qu_+HJva{^cVUmmKy}Ktm$nEI)z!{BY}mWQ`0tvMMjl8El>i2@ zwg-Wx8P&17KzbmIfic#ou~*?P7DDAGMC--tY!_7~<) zXL>dj4P^EkIwBk1Jj*HdNuy+4$uvGh?mNK!`4f7s`;^CRv`Deotyn3xi?(JOA?Wq? z778qcMYxgkh*N~NNwHoE>x`#&Tst-MCrv)V49>_dn;x>Q`=ra+TX7yr7U>X6U8@@b zv|?gp3dZhL{bX3Xq)S)a;A?c_S$%*F-BEm}Zflucy#Q(P$q?XG>DBBqprU_29m&^G zYT~Du0nQ>wYWy|^1ry2A(aZ(Dy zI_UfWbuVr|Wstqt&=~i|_16P+DS*yial?=63Dgm z#t%fzIxK{stA7plocG5qA;TFH2dsd{JG+~~QvCg}uyj-?p(jK6?6>Li-r%$+30VH4 zYM;pJ0R6$z%O8h7?-##-gBj{7PxPEF+_XcyuZFCB<*@IoLT5F*-E-_b2T`y$I?5vH zsYOl3w_#B}kQLF=uPzehDNY7r1GUi#z}EEn!)NgniXh4k<2n3NnKjs{&i?c*M?+8j z5CCMyG}IY}&2ecR_KW#HAywU2H9=6BGNA&$ncG8+wmKky)Z1(GAb9L&s)g zLCrHtHF_xLjOWV_3kX*4b>I!CaLY<4j_0ZwcuLK5QN{tboI6fKK1*n#0Pp~0vvZ6W z%C0-AihnlLsGILW1F@Jg=cAdmMghIut^ZHLt=5?nl?>)&#?ZD@|ZXL$DMH(f$$sPIg9R+&FkSi?4(NN;n=u z$F&n&G1?JymChfQ$5RQ~2|o`v?W4)$+>O-|9sWFo=nwfVIAq0E6Q%6xZO4STK}C!vN|^(GleZ%lDEGup??jt^V1fZV(}$) z)bP;ILn_uEi>^+xIqV~;TC^hYD8T?>lT7iXHS+;-_uQ$U;VrM2gfy&M5YE(YF3P?W z`~=F@)zne{!{k)5OLQQ3fJuv0DI%z!De3BJ*Y6PYL$tDsv}#j`GRSu}$H`Ut%|cvG zrOtoE-6R^*nw3@n^j9r^ApHz(t)`^f!Zfg0?%Jmo|6`S)KQu$5S-&Q?865qT4~xpegp z9SsYz{Q5S}aLjHpyWT`Ul2^|@P9#-_cu_0#{M?24-rj|IVm`_i`~1zSa|k?VoGfxG zjQe{T1rJSK2H!FDEm79)fypfiO+Yf}h>nm2L2=#wR3xYS9de+d=q;OITkAD1n?k93 zvE)bF@5pp}y}UAkMcK)?$IBJ(Wxu>oyi;kVo7U11;|*PcRHRoJF(lxGsl3wZVh-y* zh6az_=iuy-y`Y#O2er|yf~G>2DW5zgRNttGsA)|KGI6sc@)hR{J{$5=+)bKzQ zJlQ%Kou~Hhm0hzn{pl&{+;A43=#fcgHgXd9>Z}3d+2jRT&!zK*)c}%<2Vbr%zH&0} z{_UBIKSVvTRRZ@sU*Kaol0#%(@>bMLW7etx*W9{cH8&=^NfhCC!>{jm;_4cd7r%g@ z0j`AVBlh$a%@osxisR}yB^Nv|U!UEPo^gw!{u_81L5uLEGFO^X5f}00yf2e%m*>zY z-(F$Y<@Wq$K^@?8ao}YqtcYnRVDOz?X}~CbV)V2_RhsbgWgb_0l&*w`xbJXZRTr)$ zf})-{k=xW4rQ9k4K{{xk1nIs5fpdc=e87^$@iEPkJ-~3sxMkcF zb|F_dPOfds_Ze+otEhi9{Rn1L|Nm%_VIH2_3HBJR%ADm-RX-x;F0XqllVNzDUFNgp zVl?)Bs=oS+EAIJT`GxECJ&0U&PuAP`TVzIWnl0Rp)Fmmhmic3JDDCZOo?gf{evpbI z&%($6BV}22CLEO(K1hWdZFs?&hEvXvkEEp!U{^!41^I?cp+#rmnB<5M`njgxQ3ulM zz1lS=&r3z!?{l~Z0KCJugsSfK2Y$@~NhLq@%2lKfLJE1_sWL7k^HfY0IT&vDg)6NS zR=hhi`A7?7w z2g!{W(OD-cv@^f%8JQ9^W6R>GiENsTi$U8$#X3zR76JbS5hxl*dXDTh(CKdg+^O93 z?WN+4cm-C)dC+)cSo@SqWNp&6CG2&p#g(h^*YekE-+`z>qK|FcYJQ1dvpgs7X+a{g zpze8dwc;9#oJ^Mgq&bQgl>Q9In1S>yB~pvlt#moC%$_`j#J4d^5J9@ZnMo)IO;tko zFzx;m1di?t_bqx{T^2Zb>Rh#thEu(TRVsL2sy34fiP+9nx2Ab=2iv|ELg>Y!pQ;0pRFq?t@dyD-`Js{weMwJPQyW!078%$udq3?DYIQsx}b%=A-_X8O!& zEY}xfX4##7bd@0zb-X<`tOwX%aO(EI#%tvGi%I{(N7wunu@sWf=@fPn<^YSR8_J6i zKK;`ij7N%?-B2Z;B95$C6<|7hfJ(lFp3X3m~YvFk5BMmM3k5gGAeh?oV$xqz6$3HYdkNZZr<4T_eSA zP~5qE^eH^6a2Dv*`)JlXDAaM4k(7SNyK|s%j5ZHi7BQ}<`*2|5P(voo2S#uG0Kn~PR%t^3L0|}H&2K7Wp2jBF^7ir`RLy-za+LF#5=u5 zQygQWrkKQ^sCrm8mmoLKigBh#6ctSCf?Ut<{Z|@~{Z6Vj+uDGY$MvF8RXUP1M>m4- zufaWSQXwG7;U!ae@A((9=h-G=XE9R{JCxH5ePD4{CpHUqe3K_n*G4e&3$!&EfEDnx zy(oD3q{Qtvwp0l<7Y(Y+I>rGNSnWf|8~k>ISKZN=qef z8Z3#jUvP}qtEmEDFuhcqx|TGcgW`LUSXM%~th4Y%LO?S%Cz{sxo5#8(KNWA2e|)c) z=~H@m5?RxDISq4vk(lJRtE@AJrc4-Gq-oSpV3a>mpp_WwlxGIfoWxsP7yj$*=&0>)T%P&@_UK*{Pa!`+Z}= zQnfH^jehV!!YvX_E(!k(4GiGlv`wJ&!Im(8ce^TqT4F|H%@J=Q2*L<5(eg&1Z;hU2 z7=DJMn>~bUM{^Do1u%U@V}a+#m;%oD3HJz9b#(;##zxu_q4%a;+Ee^7ucn0p*0MSQ z@GF>8;fHtraVlPYn{61P`0g7F3$~$`W^M_&^0fVbYGiQVjS2{Sqm8^fZQbFC`yIpZ zWI5GiVueEvUM}tlp|hdTcwu2%j1p=|niwL^V2AKwqP&q5UVf=;vRMbsnjV(F6z#K& z?(JfWaAC^EeNPAihax*ou1^HbKCu8%XM>D31#JiH3c7hwJ5vOcSGvPI;L4^CzrCL1 z)#mlYf={5bzt-#^NMGW!r^b^sG}pJLNpU_jejQkjzCK3X-3w1T(%k#zLpe3jN|p^d zjd9M7{GB}EkXZJAmQcHmjKko4)$)F`{{3hjDZSXcSCOeMHJQdS3I1<9Yg|HlGyJv8 zW$of^O`jnwUUA&@5OXn0O^GXasWi*Rw&%M~k#rPJ$#gx1GVRsQt#Q7**FQi7)#N7R zD4#b&*h8rpSq+txG$N*wEi{XEM2SQ*RQTyu>5g~kg(96%*(}EZ)xL+Xjj$SlKFAF( zH}YKB5<(*H(+%>$sQ}K!I5%{GX>s+jrij`TtqyUa1NJAnEgBc1W40zM{CHhKOSvsh z)cV#|5KApEQ>m{&4+0Fc%UrG`hD=u6?tyh$b1q)?F8=cJWQFy=D|1&y) zMG}QR7J)!_uKu=Kpk3uz&7g#mH~(|<+K%IJeWLqhF5B>>G{cicBgf+dKkK2;vNzjX z#4!_saC?9R%lQC325QTKXW2@TDz1uo(ZMo(FvL_55YG^NQDy8tGEByi=ZLla_Ndp+ zMM-!X*lO-Y8+vh8Hw_a)jmL4t;<Re&c@%zy#_=GkFLOg0_6^sK%Xn-KqqLH zORyH;g>h&yyvG1gp_$osXB>|e049^(3BZGObKF2;R6B@D3!6!^a7sDVgP+-@SZEuS zs#0f)K6h4ZeJXbD0zJGZeeRk9L@`;ymlevCaSs<&ne(daYz2Ja1reL6ov%4R{6%td z|EGa>aiBYpaW;>*?qhGx79U8ty-kxNKR910#t_`fM%lY-Sz{PQY%n*qL8^QHaeXCS zmdT5Bo?3JdjR8DMCC8n25i$c2;~HQ1;98ZmH%s3lVLZ_xiGEem>8!zK$#CBXDco$X z9Y>HOpM*0mt*O1q+y@;KNa{;RX$Wx+wI(jFg8ofr>Pk_Gy^!iL0^lj*d>bMgxf*p< z$stLG8zL&4$nt(vSgptS+bDXMlOqzvjo*8gK{ao0ZYNLjzA^(El83-Jwkxv^aD|H; z8SvfWdE3P2)UCjWIS~OHNw^x#7XTRuZSn9(UKWGW5clFMf}8dV6wP%N)O#;74098} z(uGfoDJJe%RDMBF!U6A#=B3qIy9o1#pE+`f6&+BgqchSB<>YusJDW+4d0c`PQsP{a zez+^mVE+-L04JiEz6U!yBG^iwzaem9CB}*IX6C)7!ysW?;nKC*1A|DxlMNO!jiEH|Dp7yOCS|R zhEx;_1e`ViTR^10HK`ofe1)wiTKRzFLPD2z*N;kDEM*4f5uwwpZa6U+mwR48)d#n& zIpRr{MP_*xrOsEQZ#+h#q6TAf+KVea1@zAKh3A!S;QrY1pY{ZMwxrrMZQl2F3jdo# z{pNnRC5|=F%Qm^eCOQH!h};R1 z%#65f#ohLQLFKwY zKpk2T+2hPH0f~S($`hPi!1m39ZqjWLMR)L6U0$DrSkp0R$!ce25L{;fDhQIe#(R76 z>`<=*>yPZwtSQwOvx_=y^$Z=0s3Def5+gvmWM+uykNya68r@PuQKRdgi?PYas7UsM z7Y=mRbU;=AfjO|GQxYl^VCh|gTJssdW2HEzt$u1iPXAOj?*hmjrV&ghObcBKwR`A261T2iN(F(8Q;Mzl5M_&-_rw;4-w_Y$sF( zPiy(gB^ak8f{0|ULrLSqLAN_shL!O%C`K49o7BznH+Oo7Mwc^Xz8ta7HpTe6tygtB zGShX*jCN1`RFRmSB8i3{qyT5u&|Ne6BgX*wqzjCdOXUhBR^>2fXAX6+x=^CHT}1(B zrY?{5?rGt(uq-Qi*+m0>_9BPx~FV9#!VUrCHCxo324Q_M|o4C6U znaK}sH;%8IqG*n^HlBcS{9F#37jYo=uW7#6DMCnSb#Ho$*@ht?prV2uB&bmvxBNs+ zXjIY`T$~}BLfF14yFaL11^ZUehfWpEb(o!)`j4`@WxifDen(=DdNx6*XOi(_A;2l9 zXU+eiu_}l=3^ZK&6_#r&v@}J%VRJDB5llXLb126(5mAC;n>WC1JPb52yZnTp%0wrG zWXu~ci2Ft=SG##*ZE!YuBwzjYzpOm91@_%MR z!O4PoD-C4u@w50>i?=otvk1M2%0*HGlI^001{6}1>_5`%Z3ISa$@@tJZy)-=l9dzfvF`#Q2PhpCvT^)aFQoYq+jMNuq&mqNgw>ibyeoY$4QqlLOm|zhe)M@nI)iwZYts+46jHpiZ~4h^ zKtU<8%|k)PR-}HAMG00Xj7HSF38x6=f$?f#@Gzgde;u|J)os^$T$Hvjl*)26R>y4s ziX%G>%O&*FMbEnfku>hh?v0Hz?uugPFv|PmLl_%l(icq~);U`dZ@9hKB_i%P6yOck z95jVxQ+0R0O4&b+fs5jaZb*wzQ#@qS^+!Q#YH~*4zPbh~vlreADJubt_~WB?7K$ag zIMoJGDU(H4w@G5wrVw)tsKmufK-$@@f$C<&>q zG`RFGoBNCQy!r3p6d)S@h||qywBB zJ!F%PF$kBBCtnpe3SN!*9K7QdI>O7$7xC{<&X}E)$R|MRV9-dGHl$S^05y9+iuET4 z#aaiq-CS)-NRqw7!60%{8vR{8GAmo)pUOGS4##4s#h2JYMo0FnFZ|yLZUS!sLs^2Y zFCZtH(E3W2rdSK=l!8nXJXbL7Pq%UPLcg=j*ZN^fgXiEh7h4SjqD>hcYFWcpF@m54 zh{ylYfu#L}PZi|}BST@uM-+5|Kj1G&wq2doN70X~LI|iSQ-78956$bS5mO^mQUZQU zq}{nuklP|O;d1cB8^IXh%eAl#Mu*8caAS!Z)rkbOn4u~#p|GBWD(fFhN;+V8KjMrv z=GOyK@<1>|Xta?T44O@)`(qS}V`)*UTepu_5W9Mc@m0L79zIC>?FcIUb~j%@8RrB4 zK)PU1cy>A=#3={xF9`59m5vSb5APaL8KJnttA>{A7U{^iKoaH{0x@tXJ2PIz&Emd+ zrY4k5C>$U=@w0Eb0ku8ZB#!ab*P-itet-}kt@c*N1)MwM*BC&1$uzbw2Qqe86+^N< z>tq78EbBs=fZcT>D?kqr0FvWu^9oO?T)mY=!;y1~R?FR_?uM>@lf(mPu@15uKp1g$ z^k9@xwoRZtH*1U|`SR6)E>-=3vQg*jh?VGMNYZLkPUYCBuk(ttcjyo~cQqSi;KC%% z9_DgGjv!mdYfp7I^#W5t_1 z`l>PcoE4O>hQgMvr!o~Sh1sso{$7wXC~mFCxgy-*Pzm;zhLi77?fK00BYmmHIkYvK zbw?@uWazCpz>htHd4L?MRJaOY&%n-Nnu(|buY;#5NtY}z%&6MMErZ1<2`*PKgTh5X=Jnmj~97mA~%$1YmWKv%4vw;b%f^X}mtS zNNKn{WGz`~Ds!TSg&_Ql8&?j~nahK9HDSiUn%K>Ds27adqfp|}1rdhd-sT*JNnesL zp7>(w$gi$?6aG}!^~NR1J#yFWed$9JLjZP?M$pWF;3BXd@uBRlIZG#Otir!S>gSrm z`n!5v&3Dx0<}5A;%8LWR+%WiE$P!uCw#UB&5KxIDLRw}i#k+5I$q4&7LB4x?M0xk* zqAZf*LOs?v=pk``EyaV6Ptt<4b1Mb(`Vs-)wFVVJRVb4ON?w0{Y3|fbn#3&HW{>=B&}n?>ALF-)^uK-v-CTl;-FY_yU2a~O74uKn*1Ne)KK!JXm>@BiD7|Rx|~Guo79H<3Nn2yt#oeY zzoA4dD)LWlSsub5ulu!3YVLSS04d?%3k>5sjtyCO#mXwHiw_ZsLEDeWQB!|vENKVP zp4-OrJIZt3zRO^EI1D`#1+J_Imt|kE{8*M1UTlt?yw(+Q&H!M=cGfT#0PSiXc428? znv4mp9KDhh-t|=_R(e!tf?F#!qee7?k=x98Kt`mr1fl;>d?fUYq=vKS@-9|5UP&mn z;_GzYckAy{DHo9{E_n8fpHBD{wb_;J9cpifxcZ{gW`=8W4p*KA(KzYR{znCnu5$BW zeIPADM{nD0j}k5Dyz+{6A!{i7BMifxbko&M;Cs=yjZrOocYQHT5_?HzxgNpO{jjk^ z_S24Z?uj^^3+=Mlm7#F2^Or3qD~@l1uN&@q+zvm=ZD98TG`!m096}wSCCoR4pJz}-UcMcsDOXfT~NbR$C7j*35Rhw(Znp1>uU%3 zyI-tp!zXsWq?RLBze73g#hnK>iiF2zywW2pD|CtT$~Vv}lI~Nj0gOPC=>9gy&wJl% zghK#UvwPBHxR@FhLE|n(SIh$(Z&qAmd@r$TRspvP!j>XtJ@^s>gt$z>8kfU1J*i zu=%-Db?)TbD>9ZZov^LLf?#TfO;+O5Teg((3&0zjOB6$xP%iaWB`%Sw?JzXK9i*H| z9Qo{pRn_wEMb({{CJ$pR8&?S3F(=`(_9@CpE0G!MdKE`;*(#R z8VCtaJLIV1X#j@oI?erA%YL8N8ya9V7(^7>OR_o^*dek1=CE#0!iqtXcQpYOU?80C zSjq66OLziIsy@2}?th~0Y+VK1S8Wey6Ey*?;`Gm^kE6`oA?;VIF_)6fctIbf{m z1kV4^Igf>{ufN8F)zVrv@MGIOa&0ai!LSk?fU`}bf!ZoT*$DP{3s0&|a}CUQ7%db~ zlcpjU9@8aFS^Vy^n{R-~>V^<xA1bTgM)|7N%VKL?}&3Pm(obFu>r0xJeY8(*6LSas7;-FK053 zp=@tyII|0+@(P{J`@+&M-6c`Jc=yAn7>a(&@Nwh>4b6;)&|Z1yIGW~V3@Y2*Y5loc z0jnOsW+xh2(3NwpHjtWD<88D)9)d`NNWXD!=n(Em5bqcB%C9lHd$!W?7T6aDbP4*e z3RrEOsHm<+k50b@vW!n^8a&9eTN_mNA}*A1-@&m2f(vEh?fOB%Wz{?J5NBLQpbE35 z6NT375~~d`BFhV1yV}xC1GG-vL=5R5M^0Hs-+d7m%q0l{xp^Y?5u+`?P((+Z#JiE= z5rYpuWLR@N&L8sw9nst#unz#f?LB%?xaHHW*>H?yEqDd+Z$WsT8kz6RXm_-iLOPs} z+4nv%lz?eNfDa3%XW3qZQTt#oR(H3wwwFyAZW%j+K)P0%-uTF?#Q}O)Pu=--{EtNC z_6iuBoVeT9BFLM#q0$Y~biujW?pP=07Z|_SL@ThD;%;4NNWM8x4$ZBnil`DvGz7K__cl_PG9E3F2*bGdDc(4WI=1Y$pU=n{bO z7t}D4&K3+f1~UBq&~3Z#oOR#-F#hX309^ntPak^qgM9sArCOJ)1HENTD-B$koD;|l zYRvd@XlkUE-?V5B7#3EMz3lxHos~?@Nl)FYE$Xz~MrZ31}vLf#%;u zd^YyHH`qw;p54QL9a{MmGtq8!1D&ygNyxEN##f2K<d zJ2z6GVzOh6Xyz=DezoV%jPKi9V(?k#Bh$TY>p?qJUpA&v;Pu0NT4Nmkm0Jlj`E6qo zpTdGA7Xsn9nya^X&ixaNKcD#p$}wWV{Xx~&m2gW3`%e3)*cw8jiOYDCi$+$#5aHKb z!4IEGbe-6(4eDQb1*X#nNYN6XijvWzAlN|cjf1;0v8ad?SrK?;$*d%Bm$c=*FR0xt zCi8rl0=kUj7BXw|I{z ztv#H&gQ*u(_zZ@pj(Q15aYW$KXr8U@>COusM+}NvVF$l4Vc}bQQlw$pVfsAPGl zNk3A6_N16fpRUcCi3r%5Me=^>)BQKSvxXAkHo2eOzbHeK+%s(N15XdYGr(<73QKPW zkG}=w8vtcnk&26+-<`G*`HM|Y5 zwSxD+W%*JZcXaBU0K6VSl9rJk5CuQMsPBe#;WXw_j1ZNM23DUW-I5V8=GYtq`~5<{VF!Mu8X6;W&hfTEONoteH`gLe z=g706;3;Tcx`w@)*j3tR7=tLZ%N0dXZntKOl0{aP4_PonF*>^(acB8>w3GE~N0-UR z%=q9XuYRXw+VQ03(r_7R@r2Leim6SIXBFwJR4}K<{ngFH1lkuU4+&223p)#sM6Xc) zrBGs#i|i{B0Iw6T^j?3XU+?Y(0{)<@nmPfn{imhaX`9iAXiR0K{Fw!Q1`w*OG%~M4eq;4sqlfMs|pyJYpnqlc*OWY)HRSOxMONlkh@&AU~_8!!=+FQ zDPJ}|(^XBzxXtVyid<%5J*#(3kqc_;u|MsJ@r z`t3ZLCBZW?MSZjSY|#QoUCo_jSFKw!7+!&z8_~yxK^XO34R;+d)-w}blfOhD`+D4f zE3e@RpynIz6)q??Qs34VyzFAn2mLn01~UV3OxKcTGd^mG=QPM^kZU{F*wm5~W${#O z(IOp*mq9TT)n$Z7Y@BHQ2u|u!TkiMfP(K?R-SUd=gFP4@$uj@Npkpci@uK)y9;)J~ z5U0|SQ7ZrEXCVh?OVF?-b=f{6;#X$1ruBT7D^ov4EwIAoMcA4e=dMHW!vQm*XFt?g zRE#>k8uC=v%So6!Eqfl0;L!b>v4y>35(w3r-|63TB%d!x*kpyl3s4kRz|T6no%SaL zS`QDX(h^jen44+}`Eu0Pw7N3KP8?~uzGt>6TcE)W#A zyM_z0A5wLA!ojj+t~)|L#07Vsk(^ll1CMKWA3-}%bDE=046ejK+!1P=22A?U*XV&D zJnEh{h0me=@EqfG$bpWPnOd^68$l{hZo=)U7WY%a4Ax0Jq{A#WYR_-kW}dV>hfiU+ znasKIlp@jP8Ea^fSO&)Slh{zUh^nV*WsV}y%%&{>KbSUfBjR~g9YDH}NrNceyl(JQ zLYaj19S{k`6uK}!Wu$W-_PpLJw2gGyqB#0{2KXzq3e|7dAyxoF**YZOQ=K}&e#LHM zaPb*&XE77eD%wWz5x?EZr@DqvtH<4xg4eq9mHFc9Li?8ip;Sc^Kz6m}KENh;-R#dg zfTc)Q#**zSbYOhd?`cMj|GRoMOMkU@uJtZt=U38BHV%m?FsW$s5~J|+9aBY572=-> zAcdFBJ!Owmm^#MEBv?F!%}IS9dpLjoZ_aFJp-Cfw!Hqs@D&s_@2Xeb(+IX+(>{lhN zc7N#Sez-P=2C>g4A3vG1o0`ijd7gJn4qy_7cTS zU>2P>=Z1SF!38-IRC*)J=Y761Hdbj3RjJT@tttLqP&Yk~DQf^z;c_r9Y4ib`21hJo z#-b_{;MaKVmYkcuguq7EYO=B!ccg01YT};PTh0(vejgmgA}44LSXK1FQDaDb_&hr* zjjS0#2+=-sLOKM zwzJ}2P$i#S-v1ByQ`7duFIUm*x-*%t0lcCdB4n7nm7pA?!OKSJG=HiMI*iLdl){FP zpt#z(I(n}rOnDn8Zj-==c-m}-FDzr|FEm!k zwp?wiaBr|;XJ9l-H(_;bt-;C`Y9YVB645_G|uEG@4#$lHn#t&V+{9U%7s{#St!wjM=x))_*^U8G8;xKzIaZyBG$H!J2M~ zA+sJ4=19fm!QvsHs`xKO*>x<1IsYo_2ghc~OB~ z^`LioWox|%)n;>zy)sa0G;$V??fQ(9;*3K1>(!+j=s+)p5#zeA&{NrDK7=TauE41v z=e2;gS>dCk$ljlvD0j=UJhYqv&B@+Fu5XmBM%VUq-axDgH>tV-w|2OUcqv3xt=`zd|``FmJj=Gajc6k<=UDv-SCwZ@{%dt0*X!UX} zju=g89h)!A;Tq`12MEhn&TFc5^e77*7QygU zs>wS-2yv@6$0-jemwhyR$GLBIFdPpMxUdZ)%!X@zYJr(Re zGmLN1(~1xOqY!-R2*Wb!6YPe!I1-bc_KN8lOL(!p+|dH`c7G|2O?J6+MCoh6#AOQt z&z2rZaY0opm^Q1)d)yU!ErsQRY%{jc=uc)xI$ZcvPoD24_TX34s zOy>lM>1)SW_bCSkXucwwSAYSj+0lA0i!PGYjc~}XMhZ|>S3R_L)8n($8Q>I~$Wc=f zlCKTKE5#!EK{aJ&(KqbxBrGd%2XEHRc~n%^Eq1BqAFq=HZu59uvPCl)>z#8LY>`Yd z>$N+*whuh$n?nsY)bB@UdMl@{Fvcaa?B3eN%BoRO;S z%KeG%reoZL_?FwqR)~*qi23kQNhSBjxbiac)dfRwWYH>+#}5k8w2sF{Uh{^z_bG4) z$V6cTHF+XF^)fe@HPaEhaLgAxxPH3pO2hpB%a)Q=$YQBuKNz{UMGkNmb*%pzf*VJR z$}ozkpD$n_u63dglEu*14o)dKU( zX)sca3;bq+g8&bJ`hJD5&%yh;Au$W=%490;I3t{Y~E}xA$_W=Vml=R&d zl6$pac`&a3#)#qihOd5uj^IIS&-C*o%~ONhcDlmbaT8F2Z2jntY=%j6KqzZORT))4 zM7PQjsF6R1!5jLPnRfs{(lpHJ*8MB$!%}DW%WmS^qlb{I;c^)^p}TnE&YlAE zdOAJs<^5Gta@+#JEILA$Qk+DZf3H34JYSo7IzV$?g^ChU!`Aqhw;bbsjuTF=Tb=QH>jk%1|xF6N>fJPiS}w<6b7y`)0y2_6!RHzD9uunw-byg2_3~j zAd(Nam*cTF@#H+s@X(~&u03JW&rz8CO8pa!l6`r_r{gIWg3B<-3Q*%6#WPU|M+(nA zt04!9M*1Vi@s{E6-)(B;wk6J6%t3{SfOA01F0&lG=9;~zTTLQ!_@x4LXZ}KSI30$n z+Y_CGl(wqnNkr-1!$0V7wHes$N_~zjw)TfPL**=|OnlMFgKY&>9EMRaoV_94+(mB5 zWi6t%=4PicCszFiDI4bZ`q<293p2b38cRzxPi0$UaACjmA9L^c5BDX!`9SC;Q44|> z8OqF3>gJd;ZD)I2yB2K*-|WEf$j1L+0Thr7N-3ZooXPRBB>MbwopaRV zm9(2_LAfomuBMwLWUVTH7 zCDWTS_|Bu&cYR0cWtnnQIPu-$6>m6j>Mm~==-Hm!&V=1+A4e{B66&n^-fivvq1;|6 z$eP}wWW99eXPnqe2shuCfc`Z14jlcW3gXtA!%Qrq%>FsQk62>)4gxhAO&?LG}LkjFM^h!&9#-u~{acV&| z1t=_nQk4m95KCXqv&B$Ic=1n8Bj86t7RjHi9|7tuASmvE64$6gk;u^?)Fl#0R#*(R z!3vsB)}+=r`Ag|v_;V43^lk&pXRp-!fQxUgkx_5%7vcsN{DIyuCn|MJL5OMy41Y~3 zW~ichPi#-F1bkr6Rg+bJv=r3kX;^)LjpYd(w-6m?3-aFX_=>LwJx2?7EFNvT3JXLi ztW2FQ%LF_`v)$x^$u}Sz?7*h6Zp-=t({}1|kqU~Tz|eY98^|)poy_TKJ7^T6+7(%g zZ;Tsth=k(Ka@GP#K7`}k`DYszi{7|JzML3#p{P0hs+*NV&2oT;U1n@+Gd7=hq#*=h zET9nW#%_He^PsSQC#i%c0G?>1uHyo!)sjw7<0*;6OWqik@PT8H{pC=t{ z#Vo5^9b)vgUsC5d%7F?n6ambC~%L&9G-vkIYcZV1K{=spj5AZB>#B>IXc2o%ZM z)zU9fTH@1^A-^BZ4V~Mnbn8ZCye~=MMtVQ@+5Xn41*J71mcQ|&J&GyC%e4qdBX)l! z^O#qu58dRpJMO)xl?`G0c>Xe7FE|O zXqL9ys$GnP>;#Yr5S%$&1xhtk(qT&CUMf<17PjyL*H;jf@o;%2FaHrL=7K!*ESYqern7xGA9+FcNn#ri$&|t`SPbFp{W6=)UmZx$QETw-FrF9R78DodBHM zd*A%7${I$F=!@Jugas`8BwO}DiN<(w2HRWnnD~ip#gFNO`d-pO#qr4Ju)|gXSULAO zw;gRE+SVXndX|Q?58O_pX=ZKRVMf_A3P2hr`Gm@3Zmj_Qpy_H*m+?Qn$je2DS#;o(u;sTT#O^ zI#5a+)k|OG%lzZx$)T;buy%9B>jE`dC_^+fPwOL24_e9<;~qTd{{zLwYVnckH(!_P z+~Jzmb45BTEY%&)Y_Fh3-&79FPSQTg=I$s}$b$tiKh^m~f@mYvHJ9p#pv>3qm2=^} z_Wh=}E7GcYajQG80zrY(nj0>(tp6HEG9_?X#{w8WC%fe^+dKb!kkpq~bkv^Lgz6RS zh}%W1RKv=W?7-$W_$O6O&rP19i3DHuy4Xi~OGjInw2&1@E352i=MO{McUpxU1ykMr ze3i4b1n&0ma8*BF2QlgY0(OE9QyyRj>6s_LXne%TQD^qFrsTW-@$RFSwP>ZUUt;f6 z4CQFiLuQ#HlZi91ZPe6OWCq{AX5g$Wx6)a31})*fw0?!!+IsUq zqhdn?HVXYi-kA>zLP#w&{%MVtPkyO+Gem@ zfO>YscpAe-tSkZYEJEJ3?VXN3J5K(KRzfMHYjwbaB0uVhWsi-?9m}Uk1*+XLo_1A( zDwFR?W$yXlGLXxZu)N(NvCbX9pTK#Qz68Pp6S&-r?^eYYFN)xN)%MV+lNEt}|H!JR z_IGrLNoJTOjAwcD4L5(j5W@JC>mI{0pFTIK2-|Sk^)w?s4H^1DR*9tq$h{Jdyxz}? zTk7`!L(&WfF8? zjk4w^F)>Ti%ZpB2FjKz@U9L~DnFk?7BNp3pS^)7C0;2BCMhZ%z>UHmIps*gA9Z~7h zhBo>-b9t9ZG7$yxPJi8Y;P8yeQmOzAzB5W~hgeuOPSVX*px@54iI}E;+H{qb zogEW){>>l-Ey%x9{~G2T#N&G|Z<(q?jzS?vpzY0crh9>UyjQ4mBxS@XZNT$<#P$|R zjhFgS_Yrj6b2>$PV0aEiMT!3>zhcWndVJHqPmO`)=b` z3=Z}o%ixIa@aNnejT8LqR_^_4^MBDn=_$f@u;Wz~uB`eHk2xfo@HsM@lo6UNbn@(Z z+GmRI9?m9E;~Lw0G)TzosOv88bXYxu*eoEc?eM=7>(^}B^CDSq;^qNgqTG;JHGU8> zK8=CeA+lsPi(T6O^f4jO`hvcoFxZKca-V`(^TOFac9`#)h7dM&laT;bR*n~w88vzf z9x^|A9gtu;jisd%;=x6C0=|#64SdzT4hervRvkdkJu5l{7t-Q^mqW>p8xKtDmfhxA z$5kbN^lY`fW4(e&>$^yZN!7oqx?ZN36$Kk3_ysF z1Lk-n%pQO_g-%v2FVoK1Yi(9{O&D7Z+qvw!sHF)!-2EtmKCVbMd_dn%m2PJCr{XL% zb!!QtgI?-C7a0YHaIy2$DUya%WBihfa|_M(930DuAgC&A4P;EiHwaB_m7QdSeAgE~ zGNvE{XI{_#s+Zue5A)ZJK=+6Y{$i z!$k+iR@YP4;IkUUPM-bnsJMx|;pIJ$;<9DZ6itwQOZ|V-wiYDhKCuY|XMCfL!6V$G zE`oruQafJVw$n}1@kA=B;7djebN8qqjTA07+q2Ug>&5 z?Pl~6x^)Mq(?j8#eR{sv8jVZb#Vw-}FfOxurtMzkd%nuQX+hm4}UoQ6{n< zk}KRyc-Hr5-9tEd{2BsKy9w$*bTM^$PHBt=rSlz~;!*U#mgE9Ca<4l^PsU0u!)>_} z^02+TY#;v2BZQf8*#s{?mMA93$#QE;iv;j+jjFlD(wv2A#Xcig3z@grUK!AOO)_;O zE^zy5s&~|w?uv)2@Y+kvvB#iWz3jJ_m}XYMtIB{Hi{Ns*KX04EoW|t4f^s5cg7lZH zijo}L#?k}y&bT_Kn+ti{fdfiy-3V^Yl>}t0G^An#UnMwbjcbFrJmxHc6*s{cT!C0J z_fl~-RwTa^?(4UESmJY}J5GBtxP6@eCz0 zWVcS6%4s*ct+whvT32(?B$2`}thllcX~1ha|4k)F#JONnbStFT8#dOi2AJMtR=wcR z**=?F(gfeB2kvgMYq4cmZ9NFQkX!!XOa{j|Zgg%Yn3gP;2Uk$$t~iTd0^g?Qt>S_; zEnx{W^`{{&xTOHG(y!Id2lI7_qV-G(*>g4!yN}) zWn3tYYyi4vHWFsJ&D5b{ax$p65u~GT9ChTe9U5ksO!GZ5tMuhSD;6QYi4CjU2|WL8U^*F3f;D09$>7yN}-?8jVE71%6>Dqj^*32 zeq~k@#7>XZ2;F`YP;Y4azSBRhFdrnZsgEWTJWlpR+IiEbUpQ3+ZF7bu(Nt_f*_=Fz~$3>oV~qs`O74yFyNB4Td>vv`vI-KCBG+q%X&Ax_o&8r=0h`v|ICpv+#yF zlkd-T;H>Y?iNC6^(==kX5Wv!rrSu_9`@V3mtso_&4Jk^;;4X{>n`bZ$0^$)R2(o>m z6V5zp<9KejP6X@5w4L|`DlgMVv+^svY2c-Y6LE~#vg~O*T%yVyet(6FOn?2Dx8PfN zJ-7Z?l?{ygB7*KPRyv$u(l{fYO|zL=E2}Fz_-)rLO55MY8}Q>D6>itfsjuU#^pkXW zF?c1@v%YAgEq)lhEBc%fB>q+H-D!||CUQV=`0tzMu64oN^{ac}&Cmc=(_WJbG; z`+v{Q1HVs2CkvNbN)$JnVevW{Hy&&@Y~HVJpc7Ag3&#JpS{k*_Wz}-fCUIm$EZ}v6`@9N0 z?za`5Bt=jTJA`zOvJb4{g+tKJJ8dQxUxPz>2xRt*xsXsajK1n4$L=zFL_vmar?sgp z39KJX?}2~N=Kzij9<&iNPEyD?G(-s{qw8*2DsJQqQIN5&10z4{1{JmOJOvzHN-ETj?u~F zuL?D$uY;#JaOzi)$X7PkigTF43wS3Xx=B-dQ-?l(JjwFZgyv6d2TD$CjT>Xe{ngCU z&XPFqArw%Xv&HV}+}{P{`6KpF_(wyWqGSgvOME2TkOemMnnQbPtCsU~#+1XWf^u`A z->Gt26yFW*cBJuG-6@_kn84Dog+NgV#?=iSX9yJn4+zT3MKc*! zjrY+rk1_cMtKJ>a!yy!RZgCXMX_+^XtlcW{Mw6?fIo_IkNX(P9q`X%T`&D!7M-{jd zp~&jJ!z*kqz|E?H?+T>II7N(Zd-Kv>aR+$C&tMAOrVNn~%n6!jXA3@^#x$l9RLJ7k zRHV)*^*1JRNFt-(W-E_~>*2ifZn!8phJe%#>(=GG*w3ASZ`!jBoCj)7dEAgg*T+>} zS4C9}<(FfTLgsnk=8oZUcIA&3SvD`$@3!JFN(H^qGUj2i0ToP`mwW`00LTw4DGa4=(A8*mw1AxGat1a!luW022^f>{ zLL(!-6?(enMuAB3K~h>?kSzpwQL8(L`HLAJe+=+!VZK_10(rb@wpmoL`)0VFypV@K zJ`z|Vqw0t#0>icjWS&tv%a#dpPTLI8BBvIZcy@pN@;cz&%(@tyH{2NQ(6H$UQ}PVT zZ?kek^at0?iGGb1s3RdJ}D)iJ=)Ak z3z&fZ5}vr&Lpq31uEg+GLtAzbi9dY`(ZV*r;>~GN2?&6jgWoKkS_7|-F%IUhNMUtO zmW_Gl4VBR91-e|i%I-|N=^>FpfeNE_a?O|28%wlielCo}gNQ`hc?5TzS!+CEnY7z9nOhucln4%|@2tl(7YIeMlj*ZPbC zt5U?Z0)A|qsbD?6D2*3-v?hybq_^LwuO*{w>=a?1vhj5mK64z9SQBLUM+7NdPl&>s z>>Oy{^Q>)zZH8caC^BMu4GEIM{mkl<68_sqAszRX<5145iUU7*^iuNC!Q~q$6> z>ftCN`f{Kre7y<&4$2=st^95C4LGu1y8mLKvtn?1p?$8U?Pw zX|g2w1waU!24blsN2E7|kzVvuM~A-ldj3a^sqix!SJIEis0W3ddl!CrUn-CRGo7^N z;G3dB2xWR(?ZjRQg^(Orb$p8jqFBc|#ED)xru%TZ;6yYljeuZ zf@Uns$j0i75fr_Cb@(}$H!+j*q8dZ?zGoR>ew6z-SmEm<8|g2S^}l_Q1^cnhyt207 z-rL;Em_C=FkYgV_%h5Q5D`LcblLcV*BBw;5``iJF7zW>S=(wtzZKV%XM4wt8@;8S- zy3J+RoY>l%MeO+Aoat)xYM5ADR8aow&)^bX0_q{gh=cpWeyhODk4z?ALlpR#38U`X zU5QGRSL0BZ8icV};t^v%=P88ACBi|mJCAmPsJw??U}+t5rX}An2c_Ocy=0_IHuno1 z^YjKq)1jzxnMcn5y3m}ERQQ<`^jO}B&hJDvkn=xhFx;bNL_dc2$$1Ex47&@=ucjA> zV19(|_oJ3*d-7waM_#(AX1>DznJuk0j%VZ!B62?G0~98FQ24ZinZ*0QNv(+!mTs&g zkKY(kjr@AfXbHs3au#ST;S-c*3OR^ZN>#Xcusoz_tK(g>7UdlB6VtYAJVLHp6=? zycU(ZXK62UREM0SLa(=5$fNsRJGah()Ddy)Nd>kVS{g~UH_c?t~1AT=!m^hM120)?Mv#rfr_)EVW zg=w87=Kr8nmTBEwQ!H`xA%B-+}^%qb6SV8N~D+`+5c=;V$AZ6U59%J4H zrLkTmI;Oyf+17dH)XUUO;k#NEODO)hTfagiEV=Fx zjsDzs6}kHDg46TC2!idAFf+~ixWE#A>7#u#^$nENlZmZg5j`q0Na1u63=*ZWV(j%T z0H%nlK~ty^Bp|Q98}I&(oz;;S?-!XfTZ97Jr~wPHvTxi~nK!;lqQW8Q7`4-c?vakN zT~jK8Th@WD+(r;}Ur#@g>MGkp?cw{EHyA!8(i=7HrB&KFAg)5Dh5>#sXzM>!ZXLALF$}1GrUvW2qEcc^xs?E z#cZ;<%gQDL1W|*2Mx~3$)Jb?fc<9ibQuN?`HH!l=2x*wyM~HEat@&UcB#(&X2J&j& zQD-EBgv;2b%Kq(P4T#TN&~e1Vg-w;t+rzwbSgd@tQp*z0&Qh@WfMS}ladQ1f_8+|G z;Fs!p&9WiB_~_>C8p-{CC~@K9Fgn$Bw$R5r_1f@2xW{0t0D@z#TnL_=$gG$dem&Hp zeR_i?o_~?9xWxOYcD^AB@`!Ip%koY9xv;5O9-OU-sh3Y9vTRsDs~}bNG@UgvR8LLsAsgyPQ7%V=LU9f#g_PPxJE^7L>yQ_lu8b? za_7Wcq~ZNCHRE$%ES^reJw9F@0cZa?WtH&PZ`MXe#gTHE6&MOA0;c!LsxnU-{IE7R zmYd}OJ3z$0rVVfLdYv|-2MLjDnolfWAIrE6XLo*`+4ABy%hcOB=_REhOZad-ol*|$ z;*f&%PZY>+dXiOKq+IKDMPI1a|MpYKk_Ck+%N(N;2e&p>TnfD$OCB_W;CwMz zpdMl@2S+$EskKNu-H}CB3!kskIm=J$nj};2&%LM;2OHhO`?qO%k2PdXN-as|=>92F zE|%jvRSxUWSP`_v1bIB0PtM9cYl2wsnuJMXyrWB0ag=WHYV=3G>_Km4vQw1h&U}f=f^auN;Cq|9Gx(?m=VGp? z=H5(IrO<1XI)PV-PTrX?yeUCaPR>lnI5Gw(Woliofg4wKYN)pCN0DzkZ=@3LUQDRV zB$pd=qUo$=sco;jc&4DaHfTvWn>PJ_|`@Qc4^!!)+;F}s2R$A#aL8tI%6J*F3w z7ivn^M@P8RdC9OLQu@rOq$e2gS-jk(1jFC#fjH!a0ykhYoe_3E8K3LDJ>9u?ChS>Y z%2$GMw8|`V08=$KlM}dCw^DD;Qnk538xQ*Il{V_uxm)(&V=iKATewYR*8teSYFjR% zyGR5NE#!ZteseSLSx49YQKzga!qF*g*rOLbE&Ggn+t#Vt*&?X0);mn?^iGNG1fLe@svZEYI{VRFU93Lhd!X6& zuD}&t7#CiXR87g6fcD_mlkdCwAZWpso+`D&2`M|WreaH_gstTS%Bp>+Vll#*?|g;~ zkx~WO0qm~^;ot7!+6J#4e^tDnqk2EV%hzndziYKQDKEz9Q z6L~^dE*EfqscbYTVf~YrJu-1`1m~)p(N87QCb`bde{nrP?Ua!v!{SL|L4ku{voz|9I%mepcju+UC8FMSK_3iTCw;t!CREsuAo@YL64fumY$AB z^7Q+`FzG!(PDV&f^%@{S;{ra) z=j(SUTAt&>y^h(aUfDpHcxSu$;QZrsy2C`0{hPzxv;MFCjfXBtS+Gby)nA3sq}z%T z1ER-l;vpd=8d5!lmatg==e4T%FW&b`*Q-^?RX>mkc-7A9wpZip=rC})?WB7jPe2Dj z&fnox;h-}ORy_`Q~_R7;pXovGI-YW zG;-9;HX2o{hf(3KRiLbI*Kk2+|De1f_&nA1$srVzz~L7xH~$bsD;{wLBbv2fkT;Y8 z9nyeR2JN!s*m?O;lfxs(`<98cfM zXuC60iv^w?+4_P8Qd%guH2OG|(H2)Z8$t!Zo0FL9@Bdyz2XL*~Mf+>yqt^^|H@WCb zQ}0dzoJJzr+Oi4}3*#tGdrI6Jvm*`*>8}yfWr(~7{9L0`J7Qj+?3_asrMYd7`%vET zMH?Y&RFPlnV7hHXbQpNWXg?8*C+#4j0k$6n?m=PWB8rPZp1^O!=8Zod%$8YQ=Y*A3 zl`%sU@!b2VckYinC8jN<2%{~3F=H1Y@15q_CeG5h|6Zj&88MA7#+9hvD=ktG)ONO` z#tJW&`I{~UbcBZZ#fE`;*)hc+h)00BTP!M$1IaOVbRO1K7fAatg>eea=oiWu{m8(n z?6SaG3~SU+Zd$9N;H3GULBQ4eu{3$T^&-f6m<~HhrEJP^{Jn=XWbLA#21@f;N&9Y9 zL9M-MDJ?@hZZg45w!l2Om2Xo223O^tQdqnDh#fDKy=0NvAa5<5UNl7Tf~{mk3abFO z*&xo@^cABWoONb2ZJ+-g$MHOg5qo{|@^PywBV1|&?wfk3=*ND#Y$L-R4!yRD?tL59 z(;gr(*-y-iPUEay+52aX*ZIbvf(BT zB7f0qNSr99NqN&rCRq&q=Qb;^@ZrfWjG$?i=N2|{Tz_IV$B*2vOE{4dcxt5d%azRz z3_S(lxVQe?1Ey|Tzw>;Ia^2FcK}-5`v}dX=z^I&OU%@v;1fS!wuCjwl5;+)i98)WE zO{yacqjY zQm`RTCTg)u(}FAv^lxc=$yKTTxq0%`Ku=|-zT%%``gc#1I%hw`gF7)ULMNZ|EqmcZe{rvV)z z=6pj}j+B@gtMoNra|fmf@hRLWs6Ou=(FQAD0z~z@1x@qKDla(y55d^83AVqb6Y51V zgBdhTzOxRRZXdq@n+sP8+MZF(D1wN!mwfLtr#T;)w;N^9iRFi>RO&-(QRSzSLGi zAyUfvx`@>5kG?Se>O7&*8$B1?5d7e^zF>lTyli};6)mENPHPC>9DKAi2z=QRO_Nvp zPrn>Y7DBKoxtV)p;23&znjPKlf;ZVBCzoikhfj%T5Tqp`xi0CYb}j9Q%PPW`A9u>R zUtKHrYEKXWIjkerH6OzoB~)*C=+W;u;ceQ8RKu{kT5~3ty&277pf^mqqm_KCoS-xR zSffEHf7d!c&1Ou9p@HzZ+XzceR=_u-)h9p95=G84yjW33R1zj_+q2YcXF-!WJx;nb zoC%BQZ!@Zf1Jn4_(xMn3SFQ?~l#oN+AS!Hm?Hae8OyP~GnD@NG(3vfk2;5;I+3xf( zli5!NokrWcxSSW(&_*>OcRbqXu3WMArUa`(If)!{_7)@zgE@{@c~ttPW9n1vob>`< z!AswnAGv=llo>E=^jH4Apq^o9V4joVNJzLK+vzpr-`00Fa40jDe$p@;Y=wlGdqm2` zEfxGzeVmz9yA?I#B32+=Saigj?1}f)cM@x;tWw)PxfeZT=b9plUS?qIDi!w=zhk%i zNiI74;Q@}4twjg_{Vyg;rq(l&O_})l8D3b#%IoR5V#^GM0az|m4pAJxLBIQ=M04ws zuu&ThdcGdV)I;l;O3QGwI%pGl)#st#`i(uUI0uk;*gpnf$nIe@sX7{bX)$~cwSthF z$6V1hpjwMwmq-#Syh!(kZExT+Cl^GEB^O@(n|m%E4w32LPc$_q_21;GW-t*DJmh&@ zgdTs;7VE_wPEm2HGk_j2z2Ee{uA`SOS*n)Sa5GBDcDT~FaV+xd1B#9FA!I%lMn*30 z2#M$J;5v8gYW@01@T{bnreXkXVaD6piZ)4vHabhQbwypW>6(I5j+w4S_u{!fal4jZ+dTWQ-o(PyF!-1tau$a}G%OQuT5lAPU)~UP< z1oU+VOb}*%Sw-cq`g4V}ZMq2*`DcV;xOk(wu4cR;x&zZx9TA`Fuj$ID%33gEuKlle z7^xgnK2|yp6WP`Z86hi#<7R%u{y{7+&sazityTHs=BQ`6rMk&c>L?YI8EYHZ7U6c* z(UzcM)1H+7{|brrIk-3-hNL?8dGESBB3ZRcR97H!;gea4Uf7bJ$wI?}%=|9nI-U(f zX9904eEO*%if&>nH+V{SMUf<#^AU=BAf4}s&>bU4$avU6L&H$vpiOX5A!!6;6+DqN zqVCaSgTVU+da5P%%%LaBT2_d`-d$yvLf34<@TfC==e)l1%N&J$yr%Irn)cV%lWUrSYWPvg-N zT}YIMZC9BeOqi^LKZj{%Ex6wbyR))umSvS^cpNin?shTcEq%qyiB(jKDSd74BjY1y@o5q)vt>P9#x*Ho&)+KFT6|{k z9O}f4TcWX-n9Pzs80n?xp=CmOnh4`NZ89U{Zne|o6*XV`X znYR8jE#Y&=x-uP?43SCtec4x<(#6a%e1=89cD}77k_L6}OH)^${b}Q8mmId}G)0Vh z+0@59wbT@s9Bord2uB)Uq&!apy%r0gsAb056P@9k{9{CS;0$Q{I$jovPeXjafjuaD2ZGMdum3@0O1=2n!?;6OUA8}@gUOmE*Gzmjn&Hs$$2%oo9k4Dlez zls_pLs%0{wDI;v$3T+u!O9q-$t}1Xg+5i)G-Kbfpg}fcsj}ZH_M{qC2{Y+V@c4RyKtmA z#Rwm!L^4MWRBizoKzNV;-EGN9kriDq@^whAoNjrT z;nDy2>(7Dwd>!9HoQIvu6_U}PhYFeS6!hOt4e@iYY73O~Xn!KEb+ktjW4VqlnD`6n z*1^`hc}KsZRbm)m&N+ZPfpW(8VHn};@~Iq2z{cTHh$l6=J7DADESazr)SWZn7ZRBw zB*9BW?Lnf@I~_df@VZ763L2UvqQJ+e7rSj^Y*Ed3^HR%O6O0fsVip=(`+m(>>d6~m z?|-=<)`V(^k$7ETp=NL(<=#1h@)6y@Fcknlru_NA!q@6`>S62m?*T_|&zz*?KK(2p zv(o^A)bU=*Alq9qf=sC2NNqOIo3=a3j$|;J#t}5`3--?6#2!42(KzZef3~Ih#7~p` z_I02ck>f1kbQs?}NWKGWSJH8`+Mx>74<&k?`XaVX;utN8R1qWAd}-<(7Cl8)Jd~}z z40h9}R|S*r?O_rGNJ7uB3=5k_SWAkkMz(l3xZG>+{D<>j(tbK8v+XqUO$$Sy(u(XB z!QwAeHI(sqat7&pn>|urol}bQ@UNPBjTRa>6s@Z1E53g`sNr5~uTgx*QC$<+v~#$| z?ic`f{kdZ!D~ta=(GxBYlZ;Fhw8WT~J>cf@2&Epx;VYp;%_$V)ZD}+G+Ps%Zy5Wp` z%^-q53a^fn-%v3tzu`jjc@rYTRxZV=&EOr8+$Kl9kAnvpMa|VxJv8A;^YcT|UxC{H z8#rwnk6c^(*_~e6;X6sJYt-fDpa4$F+90iyscJu3e(kSwP-1zjQI{m+F~-op2+jJd%uh?{34l*7SUycOG~WAqjN z%J-&0 zdD!EKk1B#sw@-LP(Md`(7%)W&mNZO9%?YC!*iMNSm5JSYxB?!gt^{;jR49;=IvRcB z*fCKkGbkP}QCyrTq*o+S%{CJz@M zSkn9)jT(^L=OBTi59v0`7$bKw+*AZRa6W+3Yds!?%@A@K!muhzR8q1i3M`ni-rz#? z0hl>5oRM$fo-1EvkFlR)*-aN@g*y}P##G`C5(+uTlWRB-%01YjQ_5!ZbDCy)7SOEF z&TThvu;K_P+i9jCL;4L^kE79T=ZlmrXxt??D{eRX_`8!U{uX>^q8a4Oi9ShMgXIoE zsFS>biHWj#J^`FK171ODTcb`ljx(qo9DT-ARH^-=??s~tJf5bvV-Xl#wQhMmp%D5S zl)l;|2aw#|5;E^(NwZkltM|+Mz`2^gX09|5xvjW>)s!X5+|{x92(ADTK-P5pa9puP zZmzg8Y1>Y(Yt_Q!uQGFVM6L5KgMm+%LW7CADJe~EtwIgYSI4V>}4KcHy{2+}Sc+#4Ns5c@JGkqZG+v>pA~NV0az zYy_&&{>VjSVP(a&A!1s7#vCs8FMj1mF1&dcUMnij(Lm9dObH$OJ#iaqq#(@Oxu_I;+Z_#Mh4$g9m^($V3yIo%`O+~ViI-nWJ4rXnbRybmm-u6X#>j!6 zI}qHKE8BxF-6xHc5#-{$${kP`qYf6UDYe(~rVUoU#)_;R^E<6mzZ}xz$^B2(Ej9{b zaI&)-@AaF)UKvYNGSnoII1A8%m^HDJq4Pfj+|WlzPkZu-x*-Cbn9*~6XwMu!6c}>6 zQBB)Sv7Pl>B0^1{Rs3Ued0tvCoM&xnUM-70jo-}Z{(ocUtI7-8@~EicWRjC7eV=w2 zD?d_UjDT_wyW(cwgTZbl38AoO;?<5A(JesL$-d2lvrZ$V;=dZ0LGYogt~i`xexPp0 zVg8jIbI5A3b^sv_VY&8jI!I`e^)Y#Fl#BBK@gZNe&HF!W~|74a1zWF^5gU4urz_D%4v zTmLPaU(d<}itFZoJPxLpkQf z2DXn&2a%w7T>?R&}UzEOSi6xD(RznLATPihe zJaW7ABfp4Z*yR-Ta5+JdTx$Cpw>#-c=_H5j>aT0YVe=qaN99R-qW*}!k+ZEs#Ee6` z)QIV~utTSMhNQZ$oN$KuqBP@R)eYYZ4n{Ab*$0-$Y1Q=1nkdGkFG6PbY^$gN*G1qF zLVVnca98%5`H`CDsct{q_c@&cVoqDT`e5T%Xt!>UEPJYSXK=~!3I(L@9ToGlGI&vd zN;*Y;cPO64>VbH1zL88bl{+QOlgi;rW6vd-0-^>uO7ony&y9pxag9uht6#0l^@3m| zy0l@f)$#1mnI6d6JXih||ko&uo8zRV=E9<$nr6Y9JJOIqMV z=awerzIy!Ds^L(`(Itj^L1TJ6Jvn_WH(D|{7~(m`NoQHPuPXDBrCm`)h)EDOA>-jK zx}BCU3ux1ba(aH-z=YvXVFvT!gTdqZ0;`Px0znfsyfFHM4R^;dkTkg)HgE*IkYCBha;^e)M?I zrd`vefJLCSS8Rs!f5Jo7!V;Hy4g@$L;okoB1ZxV_RMnsPC8Q=XF9vgs6+P8&&pN47 ze$ck&?f)2oMy zBB*fPighEx0f+eBWk{9hDo2CYE}oJxQsznugs+v(4h2iP_JZG}F>;Y=4leq3aY2Cq z!>nTuE&MDUr%Zh(xb2hruBK&7FilX7!1kfkD;Jcmu-h*}Vr_$yXWdnkvPF{UZ5=I1 z+(`9WYh(w}uo#_Vbx=`FcUpf|Dwwl^+8Z{n8>ws1h(yoi2UJ*c3ldc^;Qijq9mhQu zA_^KSZ37n9QH$Xq9n?$}&dvWRqrhh%hCs#XO9~9I__VAXprodjU?%^e>uLKN1Mh?r zT0{_T)-cVP6;2#B7tJNKm$p$;EkNCRxjKj`gq8ff0=5#w908&~M)Y%mM8Vy4wV%~F zi$oOn{H!s5E*CDAh2ohh+6K%t$VU{mR$(mfN)CdihFGEmc4`Kv4GK9yMS8f#h%qf!?kLzC?% zt(gcqTl$xl+g%qkht(5xoha$)SdI6v-aKjd=iM)kZ)WP@}&yI18i-gS)BU?aL z&T_bfKd|~opd`K&iqtGTMQpgux(TwSp_Q*PxuZ+x(1(?}YNH`+8i~Mc?P*<0s5d7i zKcofm^T5zl2U$hcKQ4Sk9vzX-%L8wcxds|1Q+ZeeWmGQS#~tC$x0+g~QLGn8_C!fa zg37qLH?9#_`VfajU(q&CzzyiN;YBjS;i9-{rNg>Gl7rO(ejZ>MT9W^Lfdn{{e5i!Q zYGts!{nZx{lP`gSQNXovpc23%V0Wn@mrx$Ph{D1`@;gJK2c`LrzrW<*0ddOoRN0ED z9Xm$le@MwnAx{kX&f82N3Of5gX2Eg?NH=zjZ;-7z;*hA0CODRv3~$L5X>c#nEDLfq z(^wR=ntm4b_#X1#H)A!=)%0rOFO$y%!Pb?*Hz|aDTKAWMlY5`zq|cYaC2qs%P`(^3 zhWBL>esDg6Np&5ez9dRvYTB?WzCK3D1#Q+|mUN(ZOi)HmB}y2rRhC5)-<#oW4*p8Ty~AYz^-d=Dk1j{<-OErspLtZrqkAC4#TUvb@ix#!4x8cxVY80wwZs)V3SiROI-4pojT0ul%hJyqE8Q%#kYDhx{xbo=;KSFI@VLOe7=6M2W)>NI+4n;=6 zawgb^|X==AlbNO z3V-{H%66N8{5TNIw_~(7R`Mgjh+ay4EzRvYwX}ek`K$)R$_)sS?Bu~ft{Jd&F`uRqH=Zj~o9;3l*jVdi6m$ns~6Sd0eWk{?QUOp_t5O?Q&- zJPuJHTk8{}JlmEXeuuUfeQGSG{Ac(wgOzrXW>4%{_9egC+cv}Xm`ffGSNn{oxB{Z-%DoHB564WiDXhc( zq~Vcx2ucfTPU`0BihRIk&#Y4j{nX&EBQJrc0<<#;FrBW35E14G*VkFWCvH8Ud(-kW-b{k+bX;f+oH7i3 zVGPDqb;f2X@2(toq0@1htBN)I68H%YGG7}F=F$o@64@n;K3ia^oYrcy$;~f}isZH5 zyu0%i-Ld5)b)o#@i5}%IE%+5Lz@@wq+uo!ane>SWmkB$)vXXga6u7YtuTPqS%)b=+ zBu(_MPEs2E5V~M)gj5+>?qLZXI?mo;=KI<`aeV^j{-~2<=mXtrT&Dx=6{7-nhBjYs-)BRE3mV>CD};Sk01zz)o`&H4`ns#fBu6C%8~vf+N3<>_FP?R=YO|_%uWDVHf~S8Z#Ez%5xmV? zN%~F=+9fcm3SR6ovS&R^IGp9?#nl5Mjdn@Hwsy{o;c4wd<{Ttl1HRxDmuwaT5j>a=!x5P+HTMC2Cij20`*>kq0XomQj~Y^v7pbji80BSDKJ+kY9g z7pVo$V!ew_UWK}YIfZA?P{GeXWF0X~k5gu_KUC_5RU>`m?JG z-<{4rNpF^Ta#u98*-ofnT>i9Cuu$${Q2AykCMO6p4ST@;Tg0T5CAu`ft@{aY-S>~K zwT?FDJGC6x=AEH@{C)>cAz6Ye62VoUxM@~2NpjraL3rrpxhtUn2I;Rx47K*`Pm1*0 z7?YlBGqYBGsWS!ilO)*op#>-w`<0{Ja+>+=STPLjuEtAKg;`YU0BWrO{&0gCD}4YG%GI%t&24CtyZ z;E9E9o7$0d)y$C&P3yX%xT~D`O+o^e*2>>PzUY@<9MayHRY)(Bv>|efKDl_*m!#yW zX(wP8m8K0GX19#A7e`VXG*#xqC1b~Ys<(vfH_0=WDxn&d8IhCa`p~2pokv8jO2h{r z;~-M%!?XQDsw0>;<&|HV=DA=(ky&Yhl8jz-X_zo!53N*ZB*V{WS&Q`+3ilVI=Wl{9&?udo-4cqg(opEGgix6qxsr4m}A#fI= z4RB>}lw>*$;-g8Zbe~*|CC5JNpbzD8IvTm*n&^{)K&sb2vzEH(l^V8gcx#Q|n@Ssx zpOzvwJvenw_%4}lEZSTi1RGQ`!g7Q)6vnVKYlq4*A6-O@=Tv)$7b< zY$1^L4L^%HS_pawm!x+d4=9^WNf~pzGhWSHc*Xu>|GcUapuLOE^c&>S-y#q?!s+EG z(#Ft7a|F%EQw;T{pHv3zaRovv&Xl3k&;ZbQ($;D4>}f2aT%hE#gmz7tHcC{ zN`)ltwS=%cgRiq>8)e=KI{u9^z@|9Yop`%Gf$Za#AD&jQUbN)jV04FXR#ty3 zU`s73Ccy*V|7U09*<-pdZ8Do1zqSKajsthHE7mnwZ$hLdY%Bg;qXV$&S*+}0X+S*@ z;9=hnybs+Btds{Wx z%P2ZNM{v?Uezd;Si$&*LT~QrfZLdg{Rrwu?MOmM&Qi zk6D5R)yC_7x-YWCk4=0vuJqhJtcirxnTlRJjp;oU-GNPh#7Y+^K5*<(bv-3*5;y2D zS&Afeks<1$jade*A=h7vorR?sTTvZ@LvgR2D9$W*Of0;i@|~1^jng)g3o%1uQtHeR zG&4i-W%(-di129A_m(ms5vNZRd6a&Qn%i?yzZs?BWI%_wfO7`Bh(@=NQNT|(ENaRz zHf$=ILUSbn`HDi@ngd6&tHQXwSx+GUNJ`Xx3hp6D4An>b3VWXfN@*JJH~obQ7~?y|0Tm@c~UNJ-b+rayx8 z=I!lNqpoh>wQvcd(h`E_Y8i$b1e6AnwigT@O{$_6PJ9u#o^KvrIiJeZHBX?Q#IIN> z2|N=YT0{VEgRP1uT4F1i$9h97?eqq5#uPoq3MUdGZ(Fgo% zAvqU+ALG($Sf#mWIWG8We1kZIRD%@Lpv-b&_Cbv(U%;nU83+kx*rZYc4N`v`?$XHa zEGWRmsleCnG@VTT@dJ*!3mgW7h9-Hi>RvvztRjb9QoudoCZ08CaSfJk`Bo*Ujhyn7 z`aY%nc4(dytBO7qDH|S=3_D?GbET5kGFWh(OFo9PY@ zgxZeWVFi(#4N7z~8LgHA!)=#eKM9YKBrLO_?|!(?+rGcF(FpF#1y)=OALp9)#qkgy z%CC4pOi=b)3_r)+D-m9gb8fJLXA$le`L<@m59WxxWmiON(fzw6%X;rP5T)_u9d~Us zE!L;HG-jMgf*&&VVyFx6(o-aQU&bkgdH0^hijPP_(wfTjbHizb5Oj-$2`vkYC@k@* zDFgm)gaKTCMHc7Ku`UdjIr*H&XfX@Be|MGKZEO%3y`*12{yi3K=J8%FPL4bPj*IoN ztIwcrf}8XuTO#|jHKGVD`kAHI%wTynAT^qASF$bq(W7-zG;O?0Jgd+anE>RE(dr_z zS@~9t2nP_URd4-*h>FBRMO`Mr$y#~8=KYOFhKb*)*uC+99B~#+UPmuP#X?&=Q

    $aIo^Ot+8vcOk;v?&1I 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

    L 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%0App;@r)yv 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%0D1LeA=cnXZmQI)DLs>$nOr$_t_ zBE;2*ouheMrm?6~({Yz8Bswq~K4Pi~&Av{UZjpMJFtj5IBxN6uAwe zxKI!6Dw^}RuuNk(cFMZC-7BlFz~g_n^8Lor4TPwnk?Hu(j&^l+$OaX)UAEE~3n`&v z3vw)If=MKN$)d}3OJNHz7pTW6%zP)Bu%L0eQ>HKG&kb&Oq2jVjdG84iJKIqjYPZjU zBSuqmXf=wT!MoaQcLhI;kcu$SHk29*P7f_sqx9xBr^T5>6$#Og5as#un^z}N5E!XV z^KfP{&uS0%7R+h5EYc;;;9p5ddgYmtWUswFomz~-|286lnK5Z|XSICqb*qxkWjj(M z=_bzDmkN<E1}dFt6U**L#)X&&-??Du*^i(r8W~Ec~YtgrQu`z<E^?>YP+maIyS>*K4mC9`F2b7?ksV(p(f-I4W<&T)wb+U38m zxlW_S^s)jg`hi8;JBb->!j_6M_f3NH6tE*AlMewMEWHh1)<4M%$Zj%=WWH1${~BQ7 zQZN@S3eB81;vt3fbftyD4BuXWy?LZh|7^F~pLN0c_FwfQh%OiTI2f(xXApnW`i`58 zC|G_V9`$gKJ|v}bR_J1-%)LRsF38&gi?z8&q@ydls2t1((5^*%L_**#E@4_2;{eEB z&Zz@4Nj!^$|JE-FlQ_Jcv7a7cAy{$ExXp>h1L>yPA<^Sb{7fhicx5n zYa*J3yb+lJHQ{Y-ci&gjR3qso&#M1+FB>ggfI^#uo=R;iIaX(-zZ?g4ES|jb9M?JpV~g8m>fok8Rg2eMI@c4Npl4Dib%O{jf(-<-j6d@=)I;8E9y=9>yFzBnQ6JU3k+!W=#j#iB~HbP0EHxr3+0 z%sU=wjen=}P?HqKjkCiir3i^IE1>TP8l7}=btVYgL?+VRQy5Wc0joaJheVj+>t6z= zadlP`zYlKUCSuFLmZgL~omOYWZvKk9F3$N9u<`J$n47O2N=z!)Kq6tUt&M7~r~mSX zDqOreVvkG@$%a_VYSnT{ux$=g2P{2;m1>aww*W#52pF2SL%rA!{G!2q)jWT)x01)D zPYAR4VU8*M+9n}11sFJze-Xw@r>G-Cy3}~P`y5Q~xn*7>X{(Cof=CWfxaAEm<|QbS zZe9zR&{ro(IqIOgzOzG-_f(+aH$-U~@2D`d3cpU^8+GgCIhRR;CzeH60ko8}Q> zxorY>Vc8u~%+#%FPFxNb>3Doi-hEg(f2pe;@OWcbqp*WyJTv?XFv2YS4%da7n#w`P z)xWMW9tIN-r~*b_HGU)CjC~ZZs?6`(dAVNzA+(I!u6wo28;ufG-xZNMLGw!DQ8n6@ z4TUy)Wgv(F@!x!!CAI6o$*Ns^5VEzG-@x7+`z?P8r{M{QPUJcko>mxe0}_QgE_De# zWmw-C5g@4U)i=Q{1WDj=SHK-9^i+~$4v=%Fepa)ypj8GB5{(u|fb8rteao~F#RLO3 zn2ISm=K(W562xL&DuG)Om~WSR@o&A&SAA3{whT+HVL+uGp6srRsvIgXIIB1k!G?5? z0~Qav|6|8Fh|%(@yl*sj-6s{J4CF>OU=1Ko>G#zv(WAB@Ah+Oc`UBD7Oif2&CNJ!T zLZiKzkr6397Ep3(t%=Z4+#v1arR|(dC@`T3Q4zWxeUrTOq{8ScPgUCx$$*JG zuW|SyyI94$xetZ5G<$H5=TZr5wI%cAx&<(S!{XdY@|+Q=9Ws|d)~EPZr+Tt6v62?# zwSl+ul6c62}8qUZaO(4zdz zp~ceL97hPlj0gAl1r-;*yy$bCfXYFdIsGfDcpvKn1%K6y-z%{pEq3)*Dg@%_9K?v@ zOHP4e9)Jus9lL0={%V5Ow%~Vbv8-R!=hre~<_2R-=;I+e?2c0fDMF!D z#iiNHDDRR%0SOg1h=XO{IV3?;+i!+v{ent($QGy-Q3z!y!dl7$I?6}#PIk@zwWOoS zeany_fMq0eD|?V7{kO8h_~Ya^gSwQJZ)($R?`&cszbDaLv;)%b^c*bJpk^>iWGJly zyRK$+a@+}pQBN%_wJjg%YTc7*D+%(H0+5H^q)d`}jzDa;n||78kdTN=wgfuAEy8G9 z^AJB1%>REO{bM2GS`Og1A&$5xs0V>h@X-RAkL!uDInGM&CGLd!WTN^LHPk{_1QyZQ z**jx|j~fH7bCNAsTuKJ#rXqIj>(3#k19E3j<(P|GcB)vU>bJ|)oA0+P+UuhaJgs1` z1A7IG_AlUsfoFLq((nmGaER))oCO^xQ+D&<7{>0@1US;n3&>*vMkwNu@2CkLJY_e$ zjnqdw#gRVZM&9Wb*+{ls3dU)=xj<$*Xewt(o}A#>M^~Y-h=0z=s_L%iC?jS~xKLNE zZ&;{0Y6^qz$Jmm;vO#Jh3JbPd(-R6{239EKDcK^VhL4gCA159SyKZ7^(lIvaDW>%N zpcJ1YzLz%u>_Z?y2#Qd*Q19a?G9h$io=nVg{{j>eE)o3q+{qy+fw&>U|IK$2UNPag zVl>C&d(=-0(~^{j z4NV);HhX!R`FbxSDR<%9@{Eq+q>)D+FQC07t7mF6xf2`g{%It2qIMb`O_yW0en(&7 z!QPMKB0Oqui96ja>0ki%*tb(u9|=!Vji1@E<2q|BCSC>^o9j1TlOCKbY+*_1QJW*L zyYh#XLb98PFyr0Ya2HV}hA+LA&o>ESs7!7m5O~HBY0Oaq`?^mJT6q1MVTzP2qBljU zdH(Z*V^fKBd9<)2$Fexg6P;sIw}0;!%m#D8k)piu1Fj9qXlkq3(#5S8QG*>22WCJk zyjr$W%=FjBG1oL>r*Of8&t;3H{`nvAqH{hZ3-7uZWD?S{G4fN)zy67j;aM$`a~;Vj zKQ%&rPFg$igzcEvf#yR1MmEtetq^?+?fK{&hG zG$z@$aqVxReD$_Cz}{qG@WEINFLC)(Qb1X&FroU(kE!Brm9YYD-;JfFWsFt78bpC* z((=numP6iMP#nuYi`$+cI3lB??y;1W<=U8|RHc+qbdwzTx1Y8Z05(lf{XfbwEuG1e!_>c1(HTt|8%fi}HqIbiQ5F$JL6d#M@d zZ0(?|Gy(&Ch`Lg-Tq`f4>`R$5c-><)HB@wa;shwq6}t-U0{)ecZIwNV%Z+ob)FD1u z@Ha8TsS=)2GuJ`JdQ#QQMU#gOZwE7u_2NFf_!Du z872*CB+iL`8=j`%4XL$60=Gq3K(r+AK5(#*Ux@%~f#zX2Ew7-Pgdm~!{W;eI2UNLD zb;(2fubN$#@asZ6p336z_#?#Dl8Ce3b{C5$!*K8u;g3{1hb#~$l?L+x7{D&m95^aj zxyi-x^_5VCeq-e}MS7y%LB&$`%&I40J*b7dJvxY?(RS0QutNLZVa$u2hcXWDZ~49P zP24Oft2%Tvj4Sfwl#hxa)YZ?54$!P@@oE_zAwEpfb^-Z;^F-*=Wn#tX*sm%oc?X!q z*g>(YLUcMf>Filn=w2Hk{XzH>Xcs0KW{|hpB9T@V^7;P(dNL!u(;{wq8_~T*IR=i+ zc`om~WNT0>-+rUOy6DGNii3Jis^jMvk<{~P>Tt|TDeemAB00G07uo!yjqYu_()jJF z&0$W6_6$kL0*G`u=H7!icWF>c_!kwjez%07F_xTQZ0m!Ustw}AB;%QNe|cwddQcz7 zAQ^UZVOn#$t*LD{cK2EG=ZrnopYyNx+!YDNO|{h`BA~4>!R!hvqZ+clkf!AvC@>eU zZ#OZpy6slXT&ou*g>s&^FH8u66}z1NA4&GO(H;-DLkk+l{j41c#+wA{_LPK2?&7AS ztVTDuB$Aryw-Wbd=}e9_2uaJ81mP{wP=W;I*@26QzkfTA4&!}ODLdTb1}m-SdIW#E zW1|xbv%Kxr+M#RyO6g_G!cDg{1upsT+U}3oYoZiR7BB(}uYH5~$Il*R#MSXrC)rZl7V?^KSB5sBbx!JvYwRROK{C%6Q$z9Nw@tyZo7hg*+uZ z!LElTuOlqy`m3Sd1)`JXLvi)n2cm|?)E&7s_gv*5Xq~HIjUq!QP`h_ToswErNv7Al zh*^7Duvpq&oH&fV+yDcYC8#$R?xizX?rLXDwAi-l3pDrdAAa|zBeO{;hW)~B$rQ%% zYW|V(S4}}jz=kX3f|G&EF++`-_k?#)1FllaL@UZcI_`p|V}RBUFPWLe>&1WBQTuaa zwS^d)b)EJ>PYR*%i{{R&7Ysdlr2+UJD(xpAe1~`wV#23GiZNP`_^=x0)I%8F>310^ z9YXi{0TaioRbwyYKVeON9CoD>@r3Bh@kbWrH+9D|s=5x1@aMF}x z)Q?-23C}D+_6DPw*iKKx^-sG8P%svfj*jsvrOOZ>&+f(Bv+w~xa~-k4y~hwv&6M$? z-qA@tZ!3T(o{|7YEec{V7l>hsz}xxE=y~8sZ8{&8$E@pR1t)%pK_3yI{buR+(R&|Q z7Kjntav*>v8u{BVhIr6p7kmJz3ZHb6cr@;*&nyS$B;IGx@;ItIgGDm0StQKgXc5&K z^4{T3%4$i8>KyiyeyER3P$+*n!%inDnJQZ079Bvehgt_|UpZbN5T##4Xd=1Cp&nfW z>CuLj{(^e`Frl5TnF}4IrihKD=;8+#B=g(;WJ+J4sovA2HeG(?hx41*_tf{?aTA9A zp>Zg^vVD9Nf}y*E1|uF!U-mIxY~DP0!Tp$lCt&OcK)AcWI1h4f-kGE5)5}QQbsYZj z>f$VX-P^6lVcKmM@b}4G{w}_rLh0l4y~%`O3Beii7q;jeC9#y73s z;C*UDeabHJI@PZ$&MRQWCDA1E%Z`$sKU&&xWm-?oMl9MkR5qrpY?~YtQnJ_9izyTpw%KY90Mfup0s=!;v@k* z`+#|2kWxpzjnYl{XU-bM0P7-3z@PQOtnJno@w;^BcOG?aFBzBT z9#hJLMn+;36Ss9M(d5uTA5i8?Tc*d!R)~J}D5mP55u5kbkr4o{g0usgsa;_U7h37q z!TD+;sb?ZC2#0|;D>mC5E3~_U6VdJq6((1$oPlD&$Vcu@G0lcS@%>i5KZtULpVD!t zAH2iW5AyZ>5(Efp%V*s_>U^+~1Xdy-ntH!8fDNTbDiZu^ulSaXBf_`768dZT*Nh0F zD&1fV8)wzD;P}m}(>#pjaF9PpNby174>jYQ!BA z0A*I|nE%t(Y|%~PNC24?P5(Q5xFlWBH;T-#m#6Ew9M0+F${v~0`fK{|>|~R;d%Ats z!#98RdXW?)QHKVzqg-qfQk|+j{gny@jR2S}D_=2`tylku$Huvm<2P%2mnq`r>3KEc zkiMXw$8HU#;@g(8RP2;>B@zCrHyi4mX>WsYL$`niNil_@+G&++TW;;UT_#Oc5($#> zmSn8Bfik-%MGmD@1<(l0j3s@5~* z$H#ww$AtT~G>(-CCsTewz(q+UbR*TIjAwfoQZn)>`!%{Yf>}HNUJ9zf3u}K-b>oxp z(j~JaiAE=2Fu+!5I^(QiyCZC5{$kpkXu;J3fTFGwwvy-VjFPWG%PR;Jub>$^hnGiC(jmH z2x|Sn=StORQnq1(e0849Ii*2;cYaIEwY(pf%4A|r`{8CEc^6HG2NtmDh`L-SiTyP? zV{2aj4_`B#D|{MCSQOUKeLcoFHO_xW0zTr$0}VYQ2v1;5=9ttsvYWTlwz3KMj1jXa zlH8?|9n|u12vhH2QoY-bw2uqdZ5Y0ed(cMd5qdLM@Y^!F%cgVh$gN~m0E zf?rCp{O@gkYTxVLOnkB(#PUYS2RYi&+qYs1o0fNdZPwuU*F=@tEy z$?bl+e)tQi_q_S|nO?k`VN;nY7{)HXTNFhP^Ut1iJKZ#=3#uJ*=65c&{JD65blIBv&CghE|iEGM4|V)q22AyNH)3R|?5Kna)$&4|zX; zjSnUz;Abi~S@{Ec&z8$`hiHx{(D>Q@ z*ug$smqDC#L}0GRK~dVPjcCFH6DI(2;pXd!1*w_g;-GuQcPZ(Vi}oq=w0fi}4kw>P zP`_=+m{NuNSzBGhEVl3&1a7}ID&X!P#S19ZuL#_qxlMj(`fMpM#g!yqa5*|rQY2gM z*nD!x|D^ORb(P8qTT}KBc-r???P+7G5XcdzNYzMF1dWDooMmQ7ZPfT+2fjP&&n`Iu zRp++}Vf?}1(Qnq5Rqp_zT9Lh+26Dj52Q@<(_;5@(The|ex9j^#C<9~WJYat@pq=x4 z*cCY)utA;Z_0c2yceG&Y2POX%WUbeCO9Ah21_op*DK|)8xa*fz^wRrfN~uV>*Y@cozU(kE?9fGa+wUpHg;L0 zrIE_Z$a$X%x*FXR!s$=Ir{Y1>4kd}mYh0J)W_g0x+iKcKL@cv+vtotR#M&2hD+jvI z=EZBKM`M`1ADkVF*ap8jA)y^q@f}Fcx@RO#)1Cj#@{~2*|9I8Hv4uxd0$}(D8u3;HM4BkTwNLiAk7Wh3$zYyG@n=9%fW5Msy^VxI!P_uE2q>k-X z@!lS-*N`sAJfk?Mm<-9nl#L;8{3b!}tW++5Vg*}qf~>lj&4!3}up2`wFN|t9F?nVi zW-zXU`~fNNdv0CyF2~k`)3;ldk*bVj#=C5>7mwXfj2cG*p_`L#LUxl@(A7#j_=>mD zHg=R6AMB}5Z*a|`m5q0QQ}`BlrjtT?QrC8@H5?p|`xur{kPpGs;<$6pL=#=KiRS^# z@JJK77?r6|ey8YK?l@@ds5o$cql{`V0R7w)J1x7z&Q!~;)5oVMVQKhnAp|Qpmcdk; zYEH{ULE$X-)&wL;Qp|%TuQ$8aU8)WE8*8dBjPc@5JSDK_9ZXYGNpbT!e}fl)UJvsC z$2CPsdX(iUbsQ;E|oA2;P*g0cPN8FQ?a5(T1B zt<(M>)9`zaBI}cVQp>$*ca@Ri)h==1?Kc$^M_2(J3-=5wm0-neLr`&aX;JD3yu>94 z^{6i2Tg6&o?u=x&<$AxU3ON*^jZZ$YI2tcaleFsXD;Hc05mK<6J`d_J3bHliZcCIA zgpos4Gctmn(|)C_PJ8to#_fV8EM=6>xm zxUJ;Y^>`q)uCAhc4@-`p`uEb~sLpA6w@i`dX^^sQ*Qb!bqB(+ikX2ZV_!o}!MSo8` zIL=-TM=Gof_Q+`aIg&EJB@&9e%T2b=yao+iLfhsxndOMmE7fDpxWbfY`3uxF(3`q+ zzf}h_e74M<%C45@)}ABvu7Dk)81#&8kR&T!x$hLUX))A(<^z^c*MD#@1zQUWVE9oi zE-2W2L9rz=n(c5}r6@NAB+85Cj5rS=fhxe0zNERHj*#1EWqF*oT~wd>Ts8S)n%A5R z3-drD9R}7S-Or!gMfn(niZJx1hgH;NJI=4Y>cWua@Rk!rquRyp^IT&R?ew{+zPCpi zGLuwZ-w;^sPNjN4Bm+8!DVBm$&XANwlP1HjTvn_JTAv#)|Jw4$OW$WE)fL&?Ou9U3 zWNj^hayWi;g4t@7Hv;c^i6*0bAy;JeMxPRwtJJQ z^PKNlg3}^51-dNy`wXG+RMr4NnW7~~X1cgDj6n|m>R6-DqGl(qz}2}kq&=ij0P)kn z@`e|EgZIEAsf1u2bt)AjgG6{SdX!*FwW}!t; z3hKDY*u!m*RvqkzuLh|-up}ROuWpIOxxh>{|iUf=MMxpg~AL3)2nL*slrkKZ>f-s4b{ef19 zLKliP#9h+FTss=q-SmG(^$9N)82ohJ7>#P8rp*o5L%*EX&_uKR*`Rbb<;bj)LMsx4 zbkQnq+gF|tm_p}gm!u3r2LZ^fDepDJThGq!S~#5OkeEdexzq%3v;tk~UbX|hg|kA8 z{e?$}UsZ(B6*SNRaV~yZ*_R&gVChugdg}1hWBSzbCnIN3!z^wkelufq?<0U5HX?*K zQh@qiv9W8d-lQ9HI5UuHmFfcK1TY}n^!e2g+Gy#f8qFT>v(_!c&*N1%YJ7*xr^LwP z3x@&K;mZ>gTW3W7^&Gy}VcvMj(4P{-dYcuywH}fRri@<3r!eTES5(qfBE$Db)Eo0M zx-ud_y+Mk&?(nV;{Qk?9?fiOP?ZCCOL&>$N6c7vG0Jb6Zz{4_qbc#-`q4#)ANLeA1Nz)<$~#0GY$#y?NH+7(UFg=^G|50wDj z+%7n|g^D0;o|jvQ`{S823CZqQ#vo_QIg2}btc`=lvU9}-2m{@$ff62cWF|pf(Ooi? z$Ir^A$QXKktHeRf?oE@lN=W4C&d84qB>Ac+z4ho+B(BmO-J$Ua-;wA@M2+pvmhKL| z%mYT^d!Wo$&Ful{U;UEUuG|SxzHDqO(;p3L4RCMnYxs~sJ;!d{mLsK%4=v)2%`+yW zSWgdphj&EzAxLj)@AbifXm6%8fyCC5D*UV95Z}ZoGb;qV=fgJ-0909Aj5od)JR9n1 zFdloE!#)%@)MXSyJYof|k7Mi?^ip&*qr=%|NHhA>dWFa^?Zq`$5{}gf%7NQ#jZH1_ zPJsXG9U2~b8JKOIs=f3za1}G|IX)X%vMH|HkS2`l6N(HpUZXM>!T+^TFf*Rz=uE(N zkDG=-c(urG2~Bi|n0$lN=BsfUm%kauj7`(8q`CigbL+d%jx7Xm&6pbVw8c8HC#tHc z#LFO6==KeU=N9k3gqti!n7r<*Re)cGzY}yezb>VRcloet<}ME;yYZ1>VbvTAkQIQS zqwj;(#|H`Y?K6A)|E0t$S(SbUQjrj;HQ1OF@RJPsGJoqBl{t_KzWX1TRGv>*zU3)C zQ@@}wXL(0mJk@(`q19!__0Ml{M9jAYR;^#%4jHO1L^3DB3>k%X7Gb=VX&OEuSqVt3 zZ%8VGI;|;FX*o?PD6%zZnqo?u(Qhr418K+ED%{yLXqYpfp8wJvLdYkuo&m5WVd61D z34p@i;YR!{6=0tN^1X|<6^{2eGlqL(QWqjPi@Y@?eL9iU=2cGt8z%BPYgg`g=YktFsNE3j(PfYezgNBN!oAsQ)z*q%$eCO7l+OP@LBEg@M>CPL`VpX45X(F!;;EVtP5`_%2@BwZ<(!utEF<=LTtw93eLisWD1W-T5c(k-Z;rVP>c?@^a^2q- zQ1N3lf;$&{Ak zPwr0a%pih|Kd1ygd3b#O|B{C|rr5o4p>}RUBJ2`|sufnM;$&hAB!GUL%4m<>FoRm^ z+`pvpVz!(v3l}rWX9yS|%RbGD>{q*{sKZXa>+!`WAc=PpraD!jkdGp5x{-l|Nb0)h zWk75J2lcM|4V>!vlY;^`<+V>_u$!ur2eRWSUx^$vaPZx7#k|pI6;`(s0WkVNIf~mK zt+I^z9MYVQQhpNuJLS0hjs+~cl-KNbtS#1R_WZ$S{G;7nXJX*&<|}XM>HQ08 zEa#ub6#JY>F$GgQdgnpLytv zST{PIrt){X!aw%jI#%w#$|gqG)3gigrV@1Usk2>?D|EPE^u6QcS3Kmhu}1+-R7Y$1 z{!e`0e+tz#o+E*;;)TJ)EaDFc*SmBD_3L8=V$19aUiWF`e(0)HzM^mkmZic9${G^A z+7q-1(oSxZvM2hMA(bz<#}w8<_XwWOqV6Mmq7etXl$BR|pZk+b#QVfuePW2_VjR=y z^PW`e_2qwg+8PIS2t-cHX8?@CoCK96gdP%vD!URUOWhJ4e4{rcLiV7{ya$8nK$~pk z#kBz0;9Pw&Kt^+o0LZGh^u0Wgt82^!&ZDoqQ-`s$IO3QHSo)ER+gI`T+bxp*vjWzF zn(3a$O<5@bIoQ-AY!YK6amzxr=tbdvi?5HHShZ+_EDICE=8#FjcXm zpGmAShmFZ-S=-)Ti!se_`kMAWbA%0KSim>4*~9ma*Fo1tSa%}E_lYxNzgC};k%byK zjRr_!JDf6j_L_<~FkRMB0(`wk_r)(&Xk-X;zZi`HI&6N1YvBM#C#R@eheHcTt}Zj7 z+OlJu+2EpEM`tBe&ha5UWXJD2Dv)IS>m4ki2FL~ z8vAehY_JRVfCkwy_ptlT+A{{5Y!IS<98czZaUFIkrIghda%s+R5oJ@|ylmsBbg$Rb z5o(5>N|DFFc2Hm>K`Bt(7#C3n(1NA+l@JI$UF4A*X#&-j5$WAr93o5s&t>=nW1&eN zOn(wYdC9v6axbw8;be004BzF+sY4fiCMaeT3bt~3{nif@CW`2bGez3QFhcWBpsUC^ zrCl#y0PkTvcI$swB<^X4MyOwS^yF@M_H1(ZJ&w~h^`>J*#SaM5FG5Na27i`r18uTO zv(rx*G*v-^3Cq;FGOPACNfKzDn>+<34weKR>clVE@qmm#!SFXcEo(*6pki7?1QFKFhbPKedQeP8RWhgVG6ep>|6ml0Kq z=5$OR>jjw-$0}2>GMjp!d?k9;?X2pYddwA>%tF;s@v&uxt2J8S3;vWCk1^U)zG;J@ ztGs(o6zBMk4K+xdSeJgYOVXqKb_EoEIeuCZlRFu}QNW25u)0$pg?-DLoS%Uhq+PH} zT`8=0dURf{PhCjNbG9c{16fY+gRtT?M*8k$HXZT3>~3#+@bcwDlQ$M0wGZ%%z0uE; z>J>$w<=F+Y$qTyotKpj+l?l)r<*r3fE1$eGE=5wlFlpC+U46t+e_9*cnvz=X+^9i| zrk0CSvtVhN3Q>B!lz&}1fQg}F*CsjrBc>=m3raX)RMk6ZYV3zKK(}QFCKTi)XolWLkiIE`mXMDO{_ZZM)vU2q}PLvIP`emd!zPny92ZElnG6O#gPKsLq zV+dPas0J24!2rzKBfl{SAzv_#*|9*L1$wx0^)Ovrey7FMJiL2u73RVL08)&jWrEar zvG*plqJKVN4q;%8u!@sf*q1VEd8cZ+bpBgiDO9-U&%CNyFh3sOkw=VU_#|azu%6++ z^rcyua`gc#&;Xh>#?UNb7Wzf`ufX=os@0D@F29JAD#TH;-p~(_GFg3Ru3(+olB4@& z-}Iq?f^NT zZ1rC+0tlrASdV$uTa>E^+F(kLDxKl*JkT0kn+Z3IRq5O5Q)s6&Cf0)J3)#^=59kM(iSVEcPPzL4k{|`-2fFB^Xr~@mGR~Y zUZQAYePZ9b!o}_3PwU0Z{jrrd6H{$eIKz(0%JZ`%PL+-Rs@-1qM#uN)UT+MJaa+Rp z0NVi^%$-RNbssP}oU{rFAYMK0l$5O>x9cO+k)k0fou7H6=M*&RLb9OQfNjgs?SX7= zP)730j59nVsZn>QFYJw!ydHl4!{;>sx2MUx&mUaBL;NMd2+pi7LnUE)4b&CTaHPXu z;i@%I02jl=4Oi1fFw4-s>^qqP?>k4G%YlAVB_<_rteXUxKEjc(YS5x_ zje4_q6CH%6_WWEF*Z2Oo|0%_oFwOyZ(5^;Kq^VpKa%n5Z!y9o+&RSNQk`Z(mkESZb z*IPA%SCP$~TXO$`n&XIPC5%_$-!f_O5-a1utJ@t-&xIpJbV!6B(a@k_!9Nt zB{7BAJC{D!uvk?*Q?sINo~@Ho6L?KKLj8FgCW^B=XG`u+Qc;OlPDVk}h`>Pg2CM6j zG-8acip#-N7SX!Ge*5NjN#0n2tk>_v*H*PK)0?Ew#8TBGr%ho~FLXdE3t5sj2BDt? zk$^+4y|cK{anMrd{0rbxIX|ve-k-e28W@Q`?irM$7&H%rB4aWA>h`hKF(Y@+f-%d? z?%jw$NNZ_wUATe=4#>Fpq%)CXtmHCKV(F;E*%|d-`5=a@kd5rr_(sKT4#SI2y@p+) zTA*66Qb*=~o^b!WEG}v-2n#{fyTSdz2ep1YTn&JrQXFLos-QR=w72L9!cSi5sY;7b z6E|Usp1EYj5a$EClJ)_SGJ=V4nI9|o0N;rgTXX3Yj5Hh2&1pG_juHVpb4U_0seV{U zAlAv&U@wA-H}7*`W~$R4Cb9i>>cuiP#{r%y2a#~NR2!lQXVLzEELj1BcE!e0Lna5n z!gep}BX5($km!%}bFZ3>ey(I9dG-nc!dsH`oQHf%?1znVu5Q+4P9K-RNacO(c8TvV zJ=>XenJ{fw%(sGOKo1P>`ZT6&|IbBJt>#bVmaUulFF>;n zDt^}sx*f^r91`RZmtko?+A;dh@(p(3iiTmwabAuM`3*U?!cn~!(y%l-8mfCcRuIQ!GbOn9EC0&MbaLjm6gWR-zw7?$fsx zSB-2M?)M|mKC}BYgj<*S#2MiLCm-O(_R-VC|m&UJ#p@tEX8mud! z9ogv%V+Q{cgy-l?IW8jJvrrG})bPvS)kI2a7gXsVZ^r(bt!8f$D% zaRxn9Gw^HURE7OXX`Hjqhddl{^`2J_BlOoT1FTLo;NV!W$4bs@b_OF9w(oE9@KMQU zqBNw0WvBS1#y0+y;nndH%NO)pmIAPNNb8&N3-rh$V;Wr7J-x~WBZIcfAUg}U{+ovk zTx~!mo4tDyxO^^vC_=b1H&r2i%a|XDj*N!lw(yMEyP{39HeIdE14~)}3M`b+XXGrh ziln{hcZcmdq0!OFNmPi2-6)9mO2U9US5%-za{AN3jly!}h)FaSu+R(z9If z7)oh<#5ME{W#3|?_yo$he~XbogE!i+Kn3u01{mPaMydCntb1*gN-R&|wnpO^s$YEC z^A)R+SY=;OsApVgmKo|TM&&jV#yXK7-S`6?4(M+VwzfmK!gn5ES6$!yKGX5_YB?jq z$4Nv&ZY8u*t>u#$JwCK)I<$9^*WdD9sMy(OX*B+2-tc=V{z!k`tZsP7K6mi0V;4&; zF@yKTt>;IBW;M(*xgP;4T|TcuUe&w-aCwtVE5eMslXVp;e2?K0=UMk>2TtL z>mX67h|(0eCFug|Wlb3c1)~{V<>hZ~6}IblCQherwgr4RAJ)K$gN#H-K3@2snn-zq+%r3uT9}sfs&by6y_k)^fdS{WLmk=Ds zYwhPtpfNgnwl1?zCHEAOd}2U`wbuvtLT=jL586ajKLTg!gqF~7z;O5=L4y9?%JY~Z z5CU^r1JgxO?gE|*n@q-K6c8Hh^ANmS@4MTC8yX3XR(Py6%fPgu)U8?sPuWzJIcRdh zXZG>2z!!d+aUpECAT~6<5t%5*if2h%D#S^2Q$_!l)dQP;8g~4nC!Fwe|J^%F+)dtZ zMrK+nhZ)SmF<=SQ`T-kx+Dcsqq*9Y9aQM$vQiNeMUV zBoO6QXXz*S06{>$zrh`7Z8EzlIhwa>g>oG;k58X(LULi_L5BT?^AFFsjgzS|t-@M* z$Y113>n&%kYa9ZD8LJMowg?Mrb8?WFQ0s8*Hi^Mp^Lfb=q;;CfqtqbqH{Ll*fw@qw z(Rmp)pbB*-H3JWKtyi086-LiLUrwCZDlyjgH(dAyL{|}vNvNZa`Tnu0c)B%n6uy0r z&*Y897RYbU%oxUV|MI$@7`-0);YC&i0p=R5WTegG&sgJ|SO<#|7N2RyKFp&SxsHaRV zGRy83<^`(h;vYs?oLn}?f0=!S{UiVOjuBRhh)yMNGE(4ZcPpPrUcr>!^LE}^S>TkJ z)TG?gsg#fk(%ZO1)((99gD{yBZgPB#`5aMwEEEuZ1Lrx}7Ykj8tm;fPDB zaYgd*h^cAoqKbFDF4mVzH@*R?Uh{%SOBnaGA{|ORFMksd3$;~`wZM0!Q9a`V+2M~f z&od9eQmIa5E^AEQI!X=hLW$q-IvIX%y2Xk|?#${46z(*2=N0$9Y{HDzEmDXSrKT6! z^KY6&6`eq^3Vb*la+}g=i)$1kcV9W(mxq|7$77+YTLYBOSd;+R=THyAXlJ7X>ztZk zkm^E?p<4NZm%3Z=!+HWER!Q;aZ;3S74Pi+n?DWBcOXqoqIA`K~4Mk~mVO7X6d%mKB zd(1WgTGkqEk(&rSLBmEGZSxer(ME-^jrX3l(8}8e6$-_w>{|S@69Ewm-H&xi@l*7* z(BmAm-@Fog*`aNKgwTg+rfkLFDE)J1si52I1pUeL#L@6)3tV%#)b1;{ka1EMJHqEk$6 z5VI9Q?9>SUB`$0M-_NDTzCv{gQcRnL=$bL)zm+&$NERl17K_B>oRfIoV)B^ff~;PG zAg(6*R%;8N1oL01>7+yW^p?)13jZBoce3kj*5N+ntMkMX|9X6tgIGs%>1%)+yjx6! zYR!$fRZAvmNj9WUH(c^{I!PghSeVsMd+H2H(Veq{Tqxx>iB($*sU=4C%h)zJLmA!@ zziDX?=i2OvzQFCCTWyr=b?!+-20UbWhMb4n6NHShd89B9B6uPr;QMoqaOBO?vREQ; z+KX8{D=dlnW8pZdXQTd;mvbHCP(h7;W@YT#9%xdE6DUA*OxZzdgN$idhsm`stKF5# z$sv5sw7tD8X}h^S$uLd?_LPKsE$(^xKJ!(3asPJC!xttWp$AVBob_RS4}cgedCWuY zp(A5R0Jlkq9-ddB6Pk`Lg9FM^jf2VQ2sajb)BgjLSwe>C88boUezV3nML%+L3R>$S zPgCeQU8|taQfX*$A{3iW?7rzP6VxN1x0N_@gH!+G1D#lOO8UXGH1PO(cl!Dr*PNnQ z@rI}|j)Or>LE;5`Q9TL2s2Ow@EbuXzFokO=2Fp%}%#ED3h-@_Wh%t#Q&;R3q|uXuDH_*) zz%rQH3%T6XHs^|Zmm8t4r*S7Gl~b$y0njK)BV~fFTW6$tG6lEiUL5jHGSSC==l_r* z4_J;a`3Wa@@^#^chD3TEZpsrfrr#`9=DMMkiWa-^c*69I*8W3LiCReTE>>uDVCtVY z4{8!bz8WS8Ym0HwLf2s_TY)bl96dG?)bA^>fxL|VTuRcH4cj6%X}7=7y^E54``_?G zPU=2f%r6n*XIhkYCJi)xYYL(#;=Mn?9Yz|c?AGX6cpC#pPPyZC19i1m4l<9O@N3G4 z+^c#;Y^eF%3?*ZaaxWIoDerA&x~9Vc{9Ux3^*Z`obz(Yt#u1BbL?)*nbaZaHnL@cS z!kE1jc5V{sf^g{WBYN_Rj6aE~Yn+u5cfJ+*m(+9nS*#OSIFm9L;_wT}qxJemIV}Dj zs(iS6mWqXMZ=(T$HvaLAV9a|+ImI3J4EKrRaQYag)GzV(3H%DH%_PD7Nd=`j?6ti= zv_ZL2y}2Yu&>JsD;ET3tggesTnO-|PA%IgVZU!@J<*`|m-U>-KMVzr7f8T_57+FR# zz3z-%{(Y9EtHo#MgBEE&0R6bvMO6IS?f9;~PJSX~ zN~HZU-YSU*nvb3Z~ zTcnh=wai)*SRe5$2fdIp>Wb_})8ZN#iq@{7k=T=DtgF^# z{lHplu%-Pm6zN|dlDjFq5GW!;fdV`U5k2Anc~_ph40PAHlvWy4X#)=FspR&rYChIw0aW-as2M+wL)cT^1}x&*2#0=}JUah7+eBA!uT7d#f9)H}L-M zBrX~T-S(8EFfebxcB({WR+m1{aagu&*%w)|DfPEfD->#@Sk8-Z~ zGm8a}ZAm(*UeJYra5zmhm=^JHDdQ{ScrrR3By8z0s!SZ#Huz<@3o4HA7=E*`n0>#l z0V;D}%)dFuDE=vpopvAugu$vGq@4M`fT92G0{jt^YDu=sFqi5bu%YpELaJA6jj(A% zZh_}s@z=u?`*c&}DFOI2($&J<_uUCkt*Uu+lXYSMMjdtw%3Lwc@ph%fFe@&zFKtQ%}lXc#%lh^upgsV{k{!^De z4$tV-$}a|{?(fcGaEKZ*c(lrPQiwGy~sd5qdPynG=3H+PWLNy}?tbnJT|KcLGv2k4l4Lz!+0xMF8r{pTjZ z4^Oo34L{hbLyqHb24|7csff=&fs3M}8YSTOvzyMYd6Pu_f4kL>I`wid377_zJ8P7> zNzIyf1moQF2cp;wIC;*rx!krn1?-;d{GRFJx|wVNQ=U`?aWV-nBkIuKsP=xJfOhfm zBw|Ck&efr{RPM4&4eekDg@HAN9c{DG`M-iuqEHvl%AVhhv(c`C>AY@Knyi)Cru-i8 z?TN-I{{avt{t$24K{19@u-&~kGZ#KoOb!yck-xPb5u3zEBz9+GHFSqJLrx9u7GJgg zl=4_ksmPrOEcj>B%bM;}O9o5)L&Q2q;+2J-SgTYaO5S*NBk{9VpG$4l5!z6(4>|$8 zNir8uFl0~uZ%*@_bMD}^g#u^6WS!p%fR(6HgG7pZ_5U(@v+aVsfej*cuV3~*W)++5(STEG&8nU2ulyIGfYuwX)3Fn zspo5A66d`}!w=dDOboA4QpYmC^Y9}8^NE4s0Saodt#+!!4VB>CW^j@7Ti6q@5ewK+ux*B zcAI#LyfAz;JmV^E%B061tBtHjxzE9K=U6u_&~%^B+{gtxsaljqULs6~2!Tkr9;I{Z zxCnTB`7qt|!qbCkv#w9MiNY8$VH@Z!&El6w)okWI&iUgHP9c($%%E zRRlISsgleCJqUj}77FEUA*UH&4*HVD)4=8|P-xJzxb*4OxxsYnp zUgPN}>Gl5sT@3Lk$8dll`#meh(^1Xtt^edf809LEsFT2sR#JN4wZRPBxZ5g<-rD{$ zkT#JIyMlOykNBbL2x%}D@p4n*T^srZgU)k_dY=?7Va!vbh6uun0s^UKLL<2}g7D7T zwugr}qxDKQ5Nz{L{Lp%>9wZW&Y37eS@Ttaznt^?e(^Gg}WC$^6#wTQ9-{?sV`yG!Uu52a@J2P$N;G!NqNdd;h{f4Cv1bhX*=O@PTUc&!TUzF>ry96?SbZ!}p};~& zEjZ3j-6#R{p{baVCiz10*y!On6xZ((-|AKKBPPU`5|fP8K`PxhvnGaa1C;2WJ5@@o z!SNNQ|IJhsJi6Iu$w)%!d$SXKL%**M*bd(CwZ8t`iPq!*_u$l{I6kF|A;JhU8y<-Q93HA`ZI2QdD(`bwl z5qY5uBs+ryQcr>je0sv<8DQ4%+jcUUrro<7@Ms8``Uc2Jdw7DhkXXVsfxRn6gj}Mm zwDSCcSrX%-gyh4Lrw4TL1W3jw2*Rw)V9yq5Yw!H`BVook(uebMz3f<}KeT z#55EYS4Hh9x5KDvIB|&R-Rfba6WEDb1x+nxaKX*=4=(Osl9>ic2}!%cst>Cc3Vc@sUWX-3rAAX`W!d-XO^RWaUOvMBw^$8=F|}vmN&8PY=JxD6M6w@ z;UX=M%TGYarz&5SretmhEd7DH2IVG`mv=0A7}o^l)SewouSDzl7(6!>qaFPb={+<@ z@A4ym{df{uMRT}cr00w{rXW=805LiPu(8#A5kUYVu)n*_IOpEs4mghNJj-X^x-?M_ z=m)2)=f|;k_Q_-LbvYKEdmBjySlVF)Pz!^ko&+9ROgkZB#}fAVAFo++PnkaMSy*qsa* zcS0$mlfu5EW&jX|1`x#j*#@IZ23H<$(4?+cHi-Oc*3>31ao??hQWS5AVB4WGP=vp9s~$co_tQF*qFga@+(=yz#J~0 z=-Ib1*{}RSZ;`Jc+pPXyR|WyC>Xx>8gL7f3@h`Uc(v2ku5HarT{R&{Wh_D$u^3`Fw zfB#DJq*MI@yvwrQP$K#Xh!@~aSZ>filQ5{F0{8~C{y?nx`}uu!R7Oeu9N)9H?B>=8 zU!wSefsyx^&AbNuuzCRM*Qle=vSeGrK>yRTY&nvk4eGTJGzbYB&(8X6w7_EraxP~S zmP7?Z+8zd9IXr&jBvtU8t~4oRi_QCOBt^*8BETL<__K|!`O5%yHOM$bj&>X%^+^42 zEoMd6U^buqU8b(z#9xlwkWB&=7y#c`E)@FI2g2K$#Sf9bzEDx3G;#~pD=1~fucRs; zR2BBTP>7g2nC1wNuf0X$DwxNgCev9 z^>C<8Yo3c724Z4P0H#S~_^~_OxnON5h+-5#=`>%z)(0qkj!}8)M@;c&=8*~~J25@{ z)(3~3$-St^N~idpHDgd+M-WIYUdPqRD8dHL1Ph#RZmMlW>pDnUc8ZMh}CQ zfFsCqE=Q$KM0-%@tcr#GjT=+8GGeCAqR_Y6a6q#?E@*?RWfo^tuI#QUvZDVDbanNB zBqePzJQ)9EFYuk0@Mc0BS({CBef(Wf}N=YO)N2Et-yv(=6ymNnpSbjBKRX`m7n5tx$} zP;(mH3KLd`^vQPkKj8p|qLw{sad#LG!eSj0pYT#yNI-$cAaa^KHtk&PuUkqGvA)gE z+SsPUtf6CK|D4wx96)b~!*+mdL;3Y}Oc$fkl8mb~BZbcStgC zYfZp-;EIm0AWkEzpN)QzX8nZzG^Rq+`q{bu*k+N(%#R6mJU#u`VAeA%U^(GlqC?im z$rCz(62U^2{)-|U4mgCC$4yBu<2d0a zdyvB=cL}{5>0=jl_yi76s|hQZy6?8$WG)M?d8Yf1>mY4Wy)Gn~jwA~i#)nWB^pM~t zq@>UfvTGj?Tuf=DgqAaUDLutxozu+nhX+*VQtqaF*IJ^F0DrnC0N9fjtNs>|`O;ioihl-0hk$j|J@Gii-omkR_SL9@` zk(#$a1@6{2L8K9Y{}PW{7pV$W$mQc@b z34vUgX$V*)#b^gKP@Dg&1I15%H?p1M=WqPCA5ltL#~n!t?L2CsWR%n~;6WS>^zw9A zQkzL&4$v~JoM0Z^NGMTaOzAkV9W-##_;uIdck1Q{7)6%pQ{9|xb*Bo{U#%yU08x@p zBwn8(dFM~&rD);@lj!UhOGqOwT88M~>R;%PlP z7y!H~clr09t{j9vEb>fYeNf@v1&e_9Hb+^f(h+*j2JlK*0dgoSXj6^Q&Ec#>@|y+s zVlkl)RJLZh_`vDA`RM-9(bN2|uQLhsMkPQGG%FQdxV_-jn;{t3;u&(Sv{&p}>K=hi zJs>u4Fw3|%DNJZ!FxPidcmebNVQfiF0rLi$b9L+50%6VPeBa(}Fxzv{m&xtQPHyl) zo$n~NDct|pnlIb#G7Zbv1lJVs)RC%Nqn`Nf^wglkEt}?Z@VxMjPs~*1pkjP!H)NZ? zI4*Q2um1i4SpaPc3apyWo`W|;Vx9Qj#m({^6ASYNIbyAkT=A3Xvi4L-HZ>P_i?on&^S)cjou#zV19&tnQB@PCTB|%21ejLx zc=g3-Z(FaIGWZOV__Pgkn|S@aCY~t=VPLq#38rQ8c*Ixch@pc3d=SdT<%v$WR4+R@ zx1d`SX9LtbfcmWJ@DMPkAFy!xv>$NQPtEIyWJU`HquTRi@8jUL5HV229|Nh~vo|b| zXe+IXdbz^bCrqMM+RQyXDQZ}^@Ei$Z{HDK_I%#2U zKi`3ML|6ir|I5Shs@O7!T!!{3zJ~%;ruhbRDf0JrdqZ{G!gqLZnB7u^#--uf&`m~$uMcV*v zx$aE*pb3(zkfstqg6@v-*`wL5g2RHc zQ*YWXDzzewdU%o+-dpOs`iKaH6ZnzzA4J4YVLC>|lNgHGV}J04A}v3-5sJw32n$3*pv%RbqKj?;@G#%9k#*7GF`*^8-+vLOl=wHE{iu`p>%onu*kGT!so3l?T{S& zU~IGZ7SV|f>w!~4d|6SvTF$4(+jE2>;=M}q2jCe|2p%eKVU&h{f2R$ig!Mqp(&4Sw z$CDdg-~V(43=hG23F(F;8n1^cChje>z9iJB^-5}cw?|G%$c9{kf(aKnV#DDird9rl zz02e$LC-T+!O^I_NG`=qeUDJjNMHB2sYp)xLaQ6kLQN5)*Ct{fFZ;5T^oCsW*XI!Q$Xq#QeZc0xgW~6t2lf5tMHoEzN!TK^DXJD&DN=2nL>Z56G75Zrg zx-ZQ|aA(WtcPzojZ@rD$rCMma$B^Vcji$wcdTp?KowB)XgngomfdNxR=_nyd>4reG zB?ag=tFvaf;Lr6ENC85!eyJ$M>R~FIb&lje%nCsMHpneMkOUFz*mcDV7nwpyjepCT0DW5a521>(5Z6a4eDK{2ha zRH$uGEAvt0s=l?{qod5~PkB5e+NP0Gs>zfgfYX}^RYxiiVD*a0%p2NdPvi}6*znTa z#v(9}kfxNx2U-4FXGM4Ao4^xReBg}}J0sMuZTg4-WHF015)=P|fF}(7Y`{)@4=*XD zTeI~)`SdpGNyvUGv7Hih`Pt^RB5HRuIwBZrT0wHCKymzYJ0reT1%3eh68>~tv+WB4 z9yK#s$$Xf_WhBt{8^l^J}pV|e)YsXJOAG&p8%wl~a z{mQ{xsnI~R<#3*o)GO_|9LqN!avhp*Ogj_Fby{)0*8K4H4oIoJ81lwaQFgxKGC(7H z?s^v5OL=i{+lO3$woG!}HKPkX0B>kd4zp))o}Qocx3rshhI(!nIFlHy^A8x(09ix} z7wfLxk(G7p-5?c+QA-QK>=zYC{~8TZ-kpv4s<3jEcA58+BLrjr^e8T#?g#Pm_m ztn)w{0zRAX_Mfh*R6lAYuKCGjtjAJq6JY~W^AfSKRT8fXM=+!X_q%AeEu*=QH!~7M z+>=A2@R>G2f7K8+gYy0aoFO80>`IG0twTbT_sRli?rUw-&=W`~ z81zY(5Wzqs;%yS$rzD>^07zdU3XIeLn!QT^AV<+7D12GFFAYV*C;TVzo-2rvYVOg@ zpYPws&UcMz8Ab2BOF#;zf_UMlf#2b(2N=i)gCY-z#uE_Ols$IcsdrX(u-j_j4{+o&55wx-AG25hxg3>A(R3+ z4RV3%%8FhKlHZjOsY<8WWBU+{#Wsh#C6L6V4uQ}wTZrkPvISbodsrAyME=ppxUvIA zg41AJs+=U3y+@#5n=ydoE_hmFJoN*=+bo;1;ponf0}&c+>8CUWtJMSmN)ppKXU@Sd z3}*r)#@x)dehI8Z< zGYl4_FPYSma&($en!J|4EVn(lJ}`f!FZ#ZUd|)ITk^AQ)&%?N@LM-+CgrvM7#&tbY zhhTG;thRlnp7A^rRdRVd3L>M0PuJwuu*9k;dM^X=QTMt@KviTtTFQBsY+t7LbhQ;R zh|=Nf8_1B5XvxfQS^; z{uttCZ;>y!zV=R6&_5`!DQkmw_a)D0>?o8T8Ttp9$TglSGAz zj{Govo-?-&{*c7(Hh`px@Y)i}q_lzg1-ZcK*1t7+eqBsTQ>zLxsXAqH&3z0dKGg!@ zu(A$cueCX^oKr_)VyOiKmp0oT(wa1Pg=z)aUbtZ;CbM5`KY|1JZBS7v7BX+Rcy1LY z4PpdJtx*5X9v-KdRLs_1z>Q>ykxIMr$na9gN5h(R#LzxmT5l_-vp1nw8xy}lvWmrL_{ z9R?&e(a^%TmBa1O;BA5d!9N^59kZ2MAB6XOh>yfs;f>oCV~#IZc0psE!-K8`iy>#NQ;eJq}E=+@Pt;7F+T1CJX?|Bw%1 z1NBr%b{*m$4u`ZQT%l}so}dpRoIRSEHkGd!gjA|H|6>!~63OBx50ZJhy0@M8C2;Sy zzfRJVs&Q+c$&bh}j)Bl*ja61&_4GZ#VR!4$Iy`gI)>ft?`+~UoqVxx<6@zrk!D0av z*vHvOj9l-HIx+-m#&-C%P=Y5okAwTh&w?c&`&0UB6W`+y1t2ksl7T>|{N=|9Ubzj6 zD$$7$@@kw+#X5~y21o?!2I|7bYLP3^-;}p zswc4uAZ~61OT4(8ph?LN*V^m>a{H7mSMZr85W}qAMpf5az$;6L;7}%ni43ORD09&s zC`M+CKmB0=T;J2;{Sm=z+#GQ1EG*~^p6JH-@@3y>&H|4 zM3V>@K>=^y=p&aFuwSZ{&ZoXa8vhLv`Ysi(z;(KN6=KAX!<6~!NV6&VtWWnA*mjNlVc z9r}URO_Wr&q$z4>=Y>*fJVwyi!|&y0M$=uP4WHQRQa{WQ!E_#H0op(l4U`lUIz$1R z^SR@EW6to|{P;=Yi;7aJqrH6GZdOk3|3XWe2(4`2dl=HKfa5WiY;ky3gyk=jVeuvX^DM3z8w zaAD^k#C0wD)#$xLkWxu?>{Fo1fW!nHVI_tHY3JT5vw7>gN(G4z$IQvN;^xPLIgwC> zkDkLal|{KWd1kAInt$Gn{P{-jqGoV|C5dpi#B15fBDNtg|J2orV$X;d3b-g=pa1RJ zhJLOlAM?!~_>=pG5=`Rt{-dB?Glj+>N}EJ@heH)}ZNvcQnZi~8sIDAcD@-)?i(+=& z#G2V}!297*85DH7ONszpAPC!%>Dx^1=0scoLg^$*IwGnb?j4Yp(B9@aB@BYbzD(Wo z+OLd{D1|Ln^TBmPhkkdUQzahAsFpKwbSW`9H-6h9S>?}L{N)BX2w|ryBai`Pd5fSM zdqH?eP%2I`!GSJM>#^XaBq{4ih7BlJBLYcf?2X)YgnGHZZm=a3)IJG5ngnHL3O+GR zhyFBY(`bd6L1j=K>rpLhkw=|DTBts)Sa8+>%}?&kV;vz0w2gcL^e@RkEbIX}ei9Is zE$N#zri}F)H@1X<=P1Zw2Djck4kOw(ct^chP$CniA0*G56)`M zK!2b@Dz-EF@^d9y+COOvkH9D(X2e)RF@;koc8w9w*Bgsvy44T@8qloO;BVhu+EmM5 znaPmT&9Nz;zQ-5=q!!L&wt!nJ9(0{|;Tb2-n-P(AyRjaThHVTTpW47A^eS%*AYPK) zhEA1qe9>KS`yi)03aA3zdCvUFTm3kNA5y z9Bs=!2l1o3dVahgvzpF6>TN8uIemI}SA-C!4Ld^VY;TwK1>l1bm63O%72;Irp!UlV zH~u#^KI+Y|ipuv~)e)u-{~cR527(n!p6!&+%*{R#lLbp>IJNU6{y^MJJSG{IzJ;Nw zBC(SD(Q@t=6+aS?vo{;zU^!|C@igi{U3_DeIex)~2TPL52R|iY_^NEk<~ao}caFT| zrL^POdJ(zLFuS&3x}tb%L3xTM_JKI`JWXDlJP=Sd zr<5N)NP&PsV^1pKMbK5!o>j?s?nQrB_qbog%&AmNF|6xE0=dVOu>5iJ1UIXh4Ra2S zlUMYPu`+Z-b>79j6pH`j^>>byK52yQZ*gj@w7l8S(4`Se#;$-c5GMT~&Gq6^b z_dTlRtmiA&R7;aYv$y>sW%r-rJ*)zDc+Ikonz`*0RLx7Dj)%83wOXLjrydl+Z4erl z6k_+y%0RM#oH^maNW??yeXrK*)}1_G-`j%HFo=R&@Ca1J)I5$MO>OedO?-cpc13ab zkuBWZW?Z2`A$tSd+Dj&Ewq>z3>pJ^ToTkogeuXgUksiU36wEi5s)>U`pc(c=IUvJ- z^=pgIWFvU=&F=GkcUxdKWmw@V2Kkm$8{95tW0sMvlw-8?)s0KzGc&brrH>Cw2(5uS zfZ6Bn69o~(@czhV%KRbzBaLr!m#YMkv2VT@MX~NaLZX;n&gxbF_Bdt}DGA9_iOWO} z`pG?m&+UbrhpBX=TG6SGZOc}DO8=zX4 z4=d*@$sTd37bS=OFGhc$i8lFLsEeP;c!jl?Tqk~hP<>pGv79DZW_&hV+Hw1}LmA<{ z^xE8yF7WIQC8amh;(Kr%2UqHE@x^(JF{5ymz@n*;D$ej^zc+`=AD-YM*ppTo9^;o+ z(z2l_aGIX|w()_1v?rdlVc#q&LF|a%o@V%`qkbaR zv{6RJ19#ikyoHK3xt$zO5x@8DAU&12Kv+A^EE`g`m(JfZk5S88K}Ppi#poyVKFy70 zO5lT9_ythj%b2l36Oeved|Pd>Xq;K)z=qt}bI(!*4*Wj_O^79D8qp zydBo_i@`Yi$6o&yCf2s#2gfvq(D$gv71TX5F>z;5NVX!p6gpXQHWu#{TabA!!R!Zh z)0BytB?@eXEG_%yu8|X9y*EbNuSalFc|+NJu@v(MfYG_l=ti{#dDhG!5TwI%7#ypJ zuc!3UR;TR2HV}LcN2S-&eDnW7boK zH!l%}M#$`<1ntp{P%3Qds$IR~l9%$dVF+opL#8K>ok3B>n$t)}Bm|WbIuq|GvP+tw zn8{h~_1|I%$rZ;vgivE0FUkv2e<%tUYsUxXOAj;^8$K!%u|F0tXAPpDc*dI?j!&AQ zdgHW)vj`T9i0q3~Q{W!itqrXY&TF+8d_gJ6%W%z#Tf`xA-}@P$pK3eqHs4Oy{oF^_ zb8;5CY^65mF0NR7-m4!qw4D`S5*nH3wfQfSs0&)Q z|1MQdantp7F{2ImN1XWQh#>*?24_quwe4wb+Du-cH!zk!EIC9hK&GWiaY|}o-k=zv zKCa^`b@RN`_Y!T)YoLZ;7VcG2;zpvH=JSruvb+u1mkP4v>cd5U9Yy@}VA8?CQUp@| zRt%v`7iBtZZW>KIOs*@jIiH6B9FAbuk9K%UTdQeHHF(cAXoa%6q;@O!O$A^-2+AJE z(o6dzIXY_S>-KCqDd{96gpmlS6-W>@uu|67HXkGOx38Jqx?%LMrvPAvQylH^APZ^@ zX<#_u3s@>FTWAA96AW0$Jc?^Y0vSr`Y&vs~yxB8eOjb6WLN&bB7P#Glm@_VeYYi-A ziVWd}qyTWwCCA&-o9bfYB1F-{Fx4F=aT>vVt$>iliq4&`gO~9oueNy+Q^o<~FW)gM4+|&$!BR0zEPEWcGD1X){<$yyCfotgH|}KTM-J zm4x3=$8T5+3l11?DKNmXsNe>UBglsJ5i6srBTYnFyqELrBqkReuW{J@xWT#a}xXT7SrzsJifT;H^g^+AINMFa>$H)AyQ=-YK8K zzf3Etdbbi;M6byio1!^$XM^@0($M%#9c?L^AtTnxuBaRfCW3pjD~OWiQxiF$T4CVc zw5r!m70-LklE|&5he)TEc*cNLSq7m z-VIMSEKjG6zsTtE^(tE216p65LqqX7=uVr?8z?_3o}RXtG58N9hgwPh=;Z1v?~<#o zR7U5~Cq=sk3zzib;@~U;QHr>XXQg``40ljXr4zx;upyxJIDpoOSCh$4T_%)2T`&fI z6KlzJBmjAVLq57Ox4qa(lAixOx6TBPA9b_nKe@_!k0@4|hK3^#6R2Q9qC!>MhFb`0 zrfaWrcWsw`VcG&X69`(7WO6K{(Spsa*$zrt+mo(*bkAJs$-mo7fD|Pc-K>x@Pg&4U zECILOEbX={f~*ld%M&F*{!GJgPM?(JS}m19@|78dRkaT5;%Q8X|K^;%#W1kJ^c3f}${r38%Am`}}Q{YQxcbCW<+TZuWvZmdjlBw|I_WP~S ztIn>|T)Uy9qVy4Vtr+m+k|-U3E3JAKNA@7MEXL)Leet|(MXP0K29x>pGuyiQVHVMM z#xbJmH+g+qHNfkR{B@RHYq4tWVdGU>&jAKR!0GulFZfs5pX{c&GhFrbEK5{hI4ky|bx~ zW5#`Oy}!i>rXVZu!J!TF}V%ewtxEp?IAb1xh9)3P^a`a>dv*dv6{Vi&co#bb5Ktt2eDX31%48#40*_!yl0?*x`F5fY*Tp(pY+41yF=;c} zGmvkaGpJx+iRmRdvYqt@jGf)dfnZf;R}6fqbTfwBFOSCiMtUgIMo{r&rQa$#G@>P* zKO6vysdT{#)$$8w3wUZYZQoUv(6A6G={@=VO5l{iBW8i0InNeTgupLsE=O8;AE`Os zsRc5@Mm%{#2G%)YQ`h9d3v~YZq=bMq#Io5_k%BW#)Vo1neiHntGh#A#?9JS`CxB)+ zU>i~$232tvIEK_h!=h!>>yuat2weA^m+&;2++|ow=X{pAqmZus&f*NUrwY}}tB%-l zl$!<7IbP-4XL%p%)Jlg9iHZ!c|6IB{yI2X%{#5HKUFMX~oklM>Bxv8TGV>h`g$tO7HB18W zk&ePJb_7T}lrA*!=gj&6ylTEbef0hQ;0Sw@o6vlKXeof{dP+CnB_owtLV z+aIpb1K?z}2`z&KOJVc({4pHck-TKM&h$M&FN>44GuR6$x3qV`^oJT914rZE0dvPO zO5v1>9h-@fKSX?CS&IUvG>);;=R9Ig^~R4VSzGA9$wmcp*?(eDo0c!O>72^3$dq9@ ztQ@l(2Z*^GXl*VNF3IXP8YJuM2r_vXUfag`0safWsKGop*m!W{lbE{P&$Ja-+(cL$ zg9?HI1g-w`#1xSmh_G?^ipCoS;OwwY>ddqfRX5Wewu?wzSajetC+UxjdEJf)Rk;+) z2(?f4GqVZJF(;2yqI_qUL!1~WvABcNIl*#}f^R)&L}rhbX3T%|BVWM`Mds99(tzpY z^$|_0i`A~2?%b(kiv`>+__Sj3g^gxhpU0_ZQm$mAP_Y-!&iK2oXt5GDQgQJ4t-|DF z*f!O->VgWZ1kYa#W#s@Mv*f)Y56Q<)w@{ft{$7S~sR!Nha!IDNNz6kCzRVDmZ1Sr| z6YdwgGFd#nobPc&xG7J&<^Z1!Dpt!*thk1U(e_~Gf6F1jRoqy7+ zk2!5BcmN}5>{p5)bFGWk7e7-H@y5oV^k}vkcW>6|+apdDw!UajlU%F_cwyX>N#eh( z6`+;08^tIC!tU_2Z!<;a#47uL6$JynCBdxxcX3JMZQ}OuMMUUmC}2q5E@?|Ub$OVb zy=AoEfWT@9Tlt6z;OW3k?>#^>6h)0ZU@li1iTuR@QGBp*nbAt{C|PG>y<2?OsY z8Xx$uQKdY;02DOd-V&=T))s$aB>MEQ=8fmQ1|6AGy+P-;=_cK2{w-Me4;LrFQFRH4 zV8{E%XBQHuDb`?V+a=y%$q}y2ZVZonjdfGOnskwOnyr3Z3e~B@`G_XfBdOw?<-nQR zAr{{ycvmTH+lhsqnrr)NED2p3rDxi?B_KYv+8G&N)N{(I8SOP=J5Y+Z3Y)(dDw)u z{`IpiRaKqpvi);OX%r~)7Gw38X&0k@qI`k~XMIl!?oqtAhw%;{Sb`D^N$_?Y!^aqB zFn>=)@0g#VG34DF@+Y)i!opeN%t2Uebe>{@|JrO2*mzu(4xNysifbwhim+@N>3IVS zDKq_f%;kbG8^kLSQ@{It%+Zr#!*$md$S3&3v<&i#*-CQylQc^;hRPGnm#yNFVd z4D*bq6O7O1*EgCTSm>T)#V}R8QzQzC5So8@k>>r5576&8(UC;{op?+vJKRgaEZnSk zyxNnprI7}J6wL2a0U3}uE}AlC#~zbE>bsfhD%sjXn-8q_uMRu>p1KB0a0QFh{zE!6 zKV$urn|n|YKnl9;KP<%mh;aapOKU$*VnJ^DL(XFwlrJu|Q|XLy%ZxY#>aFHhOkxwQ zLs3||5lii0HM$}jFOD;|g$_l-J$_84C=w+Jsmfd4olx@_Ei^RT-L=TdMrAue)c#Y~ z5q{8apTjHklT7heq%VTFVqhlKS9#)<9Z_TgakPb~clY;w)_!tMcwAjh8+>=5sGxUE z8!kb{C}R~DD2`hKFC>LHal#G_2y3+@e+7%^QhgVo7zGh3qNrCTbY16%B#i&S-~!s2 zCvs1FWSS)texdt@X}D8UQ4Ca)f2z(9it8~9RU!{~jbH?Pn&ctZX-uW{3WmV*SSCEZ zlfBxL77yy$N@>3wT>LjfMPmbU1H`#!6k^USS|P90c~_|p*pK!hWCkX}G}>c(qw)VH zY!IwZK&mm}^SGriYUB+@Wv&m>o#NS^%01&vMA=Li>dwQ z2YhhP;+RPPl9x6uZm*F~3AV#Y7i4MzSYil>=Vd8u#KC>XVQfiPVEZ~-2xoi862`N_ z_-;@dazkX8h}UZDDY_q2ZQ12KyYwQ!Hq8cCmrnpTK*_&_qc+@J#O-C8k8Xdr>IV&2 z9&EqX@?N+-{(f*`KZNv_Xa>u`WMY>G|sTQFsmaTYr2Vd zfVy&9)ppcZq|@&nW#a)V{Nmgq>hW1_|xLi+ywahs#u34L9OTEo3N?H^mMeXCN`6^Thr2DyO7btXVQR z!|Naf@EMaWH`Jgmmp|UV%*M>x=C2UU1h@$dUfcubTIv;j-g}qS%WJ+D;F9D(ViLk@ zj?uo5<+Epml5$J8(A8eZ-Fk4-sey_dZ^x>u^i;-RSuaPPI`G2gtz`e>HdBcHFQRSW zu5V5uGu2x!-^EfRja`1NhO+3}Fop<@e-=Inlf9N2RoQh9&892h#{lRGC=tC#ACq z^74=LQ(cDvBbxz<-X_1WJ?GAM4ly6+a#xb-y7U-QvXkwcRrLybc{VR5+yj4$>;Y3^y)OfKgT(J z@y^-Nn#scZMAWfIX{}(;KDPJhwlZy;ZD{WwGbsZ(L`Tl6m2d7fAs@l zy%O0LII1KFe&NsPTgqcbyM8pw|KkI8#n2=!&KWLgS+Zjg2B%5>#gDwp!;Dwo7I?x1yl0PT7k-r$g07H`|ACGOy!s!wkwz2A`-($xK8{%R|9P z4mV7IMSZD?xttk;00v&w@ss(ECW*RkQk90>Edvtet&^D=^l_St{sERSX?|KZYF#@+PN|7O^&myIofi}LiE8$){(4XP|}hw4>Yw9cppvSj7WZFXgOq`SY~VR z?bCR&9w2=sv;-kxWA7PVuRiUxAj6hmD4Y6+(E}XNE2<;nMGvSfBoH}Oxl5fq_oK&Q z?mUMN{$u?G>%I8RcHJO3mQBL%ydr-i@$~pMr~L7$9e>i^_QGI=uEx2jQL*DSjZ5%Z z>=v|b40%Nv3Z2EZnVzzuj!)JUNn|$uGUc6AZrk|I@=2TS4N+?j(T@Yppln8 z<>{>J5+zuaNxfyJq-7~4G>saq^;*66++MTo61oDD^xZK->XsxQJnHxbwg;GwL^y|F zDfKj~7m`i~0o!$qmBAf!f0$G`#{vSU>4-hg6L9PS~Gi!4AOtTtn?C*ZlkN;0hZDU^Le0%l?u1^K#A@?%DBK#Lomickgw|z z1q3cC@Ru(cEOr-9gTu~c84s0^3J}}mr5uxjsWV#}-a{?Ds)1N%9T-+x>0LfPwJt>R z-ynMxc)%JDZg@6-3%hCbXqvz!rJ_67Y@4e#&01>QMx2*taV;!rWdm) zST+F};IKTgAadQ*x(+EI#QVGKn%18lbKQ(Z_=;(*9-KsXz8{MctAAW404B0FiGlR_ zEx~7*D>utI5KGe+1BcJ89$0qQOB&Lhxq?{CBWj0F7h~3|NZj$o@UL73^Q%SmJlH!+ zHOPu3XmcxvO2@`y$AayFdC58E>S}y`IXwiRFdUdkx)VZuA7OHj5^~PS4^#V_f7wK( zH`)@%te4!}FWZi+L+*ovW<6aFS*iU)eehSLfw~>k?KoWDR4Q)o85AW@y^wQ}Tz!#0 z&B^El^+nt>{6kX)6T==0oU{_caO!jFfqxg-qJhY-PTXGju4*>GWek z=pE7R7z~o<+5=ZWtDNudO#&KLLpG0dxiz_nQrkKO`lpEeo4cbi-NDEixeE&DDLwkg z!>UMOemSj~I-cS<6x()*$6h>o6H zoa$g&@3*t zBbbOGIQMZs&&zrCqvF*6QjC_J*uxj}SPpLXfH*(;Cq)!)R%c{HS4|K)h`uh`mNM0) z^3RTAzD{3b8ofEeFvsmYcd)8L8DrwnIYKtb1WFmP?~aaAHiP3E4yg6p+1BwdcyOj7 z^cW!?-8uUy(l0;s%r(b;ToD#$hIrNnuxfx3dRAL*iro9n+mIdrR`>|;2G;C!&eQom zuh5d&U7xyM-~m~=df}Q0vY2%2#hdVICkj$3 zCLb8Vrl}Wm=s{4RqW0W$IzM+V-Od9}h_~@ywTGSuS>*RoD*9=u6sg(@zBqTfF@*K% zYyanuo}CbErBc*vkM|`pE8L7_ZOOw<;jkP&iP~_EEqe&Lu$vP-zc`uJy6er$gG_@j zQDX2vg3h)UzXIk}61+^PT9}&@V+}*98XgcKAn+r$b6A*>0gg8G$?xE985D~0(LP5T zFvH}mSao?q)(wni5_$b{YA2Zim_)%lzYrvy3B;s6+=Z>cF6cg50gYX~WPQ^4PfM$% z4mOpE0B=Uv7fpcEOt5VQ=Ci1rtssYJcWzuQ<jS!Z%Z+RMdXt5pl2% zD9joJaQw*aTt1{-df0oCFvKLEivtD3vUOXAa>xUBSZC0qKdHkmJ5?5512}Jb>o<{b zO7|V79VxYQ51!0{S%087P0d5Tc*R}HE$s7Q@ zH=)QghCxX*_Eu%<2{2%{m!%^x(9>wPnhA4$@id&^PvxSK{F;ra8_8mrC;7RP7D@TV zKIRj!q?tu}yXPJQKXP!;vM|B7^#hj;g|HQ|?}sK8W-A^|eYK=HS`AeiE>&0I;2EL9 z&PjMZLoq~g-Nw$0uAT~~6J5v~p|km8eoqe(1*0@3H`(Qq&wg$DM58 zjfl6MG1DFQRm=QN>#wz``y$*k11W60^mxdEpIw%jHLDHy&u2E<3_ci`as^5_*B3j%E{S#t>P$&F#B!(n$f7Gg8;l?JB6Ku(~Y~49@9;s4SIl$jxKZazO>hUyuwo z#**h+Yb-U&b`)pDdF+86o(mf_~mde%;t0AALt`OaUmeH}T^P(}kpWj);ml6UnL%^>xanwH1(=VlYx}#MjvWMQu zbHwEWpeP-RY3tI?OR;P*Q$qmbG+CNBFKPkYR-Cz#KMxq`LK|A&O47~!Hu8h-$BSw( zd$H%Vl^~WtAt^tGI}-jXJUR#%)lmigZMeksryq#QN}+sk0i@+SS*Ea)!J#1&peS|? zgezG``y!eDrOYd}@+HrqXNZvT_kn2qmf+x;85(PhVH*zBjd!Dz zs+s?{o}yP&+Kp|Pgg6uqDez##m6&Pv1EeUvL#Yb?bmq@}Vsr16@Y+Pp(zYvow>F?{?X}5ZlvYV1=4!ZGku?gvnuu4^VzB{NrL?S_@y+SBo{6*pJb&_mh+x z`l<5M5u?rxefH&U^{S& z$9epSbC8~a!gfTXx|w__>fA!Y)~`17%ye0haxiL1|?aNVD^*b#p;0HPBmG(yf{om3>Pes*K&~< z`spuy7)_Y%6p|3j@=j~-QlB*yki69jM zc7tQD&m*~5$p0hA-FxZm{h7T-w0)AA<1Q9oPN^iGb^#nm>zXT`%wljUa80)X!6`j-UONe2le6?cErI;ZiN-RbGkpN0w(CVFxd3 zBXZIU?WJ#I&%?c3L$1EPJdA6Zny_Cdw(wnv_(An-=8}!QeNs*t1l3_-r$Fqz?Iu2ZDzVU}W(Z#dc|`OcZwm@RXo7@!g^yj%>?Nbv<{dAE z)BMDd6#V(+3~HlraV+%vW=WZU@FeK1?)mXDwpW*h-x(_f%bmYKS90n&mbfT%X$P48#R=;@&U5(cEElc3{CyX1`imxL<*iMmZu-SS6X zkwE5nGa_MqI?>WgQ^dtO8z_|f$#mj{+5qDPfO<0&0T%mV0Z#o41wRC$E=hXMW~tCM zChw@E@&2*+L>wEG0vt#fr*=J^$1c5g5&}&q*(QiJSskMXOkemOq4j#Ak@I0{(mcR1 zyV?b^dvD8vCNeS1s7id&lk6(#SzXPO-zF*?{ZFhv)Q{~kTwiKvx zKZ?zK$uDkWmNvt~#v5LCl)G9vH1AR!u+{6(aH_S~s>W3w>H7?fAd+Nufq45c4)0slSz4*Y4IV69a&F0f3RkZ=%`Z_jWSD5XhbyoDbjtt8IguKZT zZzZaI#*NFV*ZIJMb!!7E1$nhwJ06BXGhxv;dOfDNaPyA@+#)BKqE?NpypxdF_eP3; zniVCH_e_k%V(kgxpP7$CrMbbf>6X^LJqL9xK~e@t4Bw%3Xpwdi$QTe<8jtL$e7MF4 z6XIOmbTAR z^q|5#oFdq#7Mr`yRd%4+#Sn}UC#3lz)Iu&b%&%<&4Lcs{$NNV5<-~&v$auv4GPUD! zCu~Nx831&+221{H-#slTNFi#qjWk3LP*XYu5`4bztgBE%|EWK7CJ+5}F5|NGGEjD< ztf5Q8#>X&<^vZ|We~GZVBLccY^VFtF8{T@UxrHvf4q1=fWdVnvi?_{mEdw;_UJ$Ue zAY2Qo1B570i3v0O2x%&yWF)n{a`0bpy_#zJI0d4T+K(5yA?zlK@gACbAmby%Tp z+J!Z~+D?+aC=Pn)H@xLzVYyL{!|cN53Oblk+*jTIK@*EoqW-utgk2(5gAcp zc1d1v{nH|~YA>7iF87~DU(2EW==zaXy|^o0ALgs-4JT}t!%ex$gIv9I>!C`zR;|Sj z7$+9_MO#4jZ)O8{t1r;;W}J^h6FV+A1k++MgSpIZGr&jBXx&|Co7aHD7kXnf4Z%)M zibRGt(}9i1?M&o7&NzGPP)ELJV)I<|SZu3bpHZ}gdIx@lK@JpAlfAcLp%YLvt^!K|@Zpmu+XBLp39$L}TC`tec7$ZrB*$mIkw<)ki${g%=mdb(p#{A1{ zDA@zm2wm#u#b(BQ00xG*(+p-Go5&q*%(xaCp{Tu{=*A2h)qHNPfeU$UKGjdc(C(Rb za*m+iK`~qF+q#ur`UWU9g8zEsd(y}O`F%DJHHdY2+5x3j!aJcSFl9Wa#@{mwY*-lk zV363megF%d#vxuao@Q_1k;$fej5}zq-wgI^(y!cK@~wfB)+4{cKsh51_KnI_GKmPK z5I|@av)JFvv(1bK_E~JKk9wV6;Z*~S5`hN{Mqzgfo8ag zDqQ)(lJB`MK$I52Ij2nyR3^*p>_fb2+_6Q~HLsJNc!w8443m0xHe|^KDYj>drM?cq zSHH*bhUo)@H+K{9F+$3wg6tErY>zL4O7-peK^~FlEA-D5W3C0hnnpKKYzWfkoc%U1 zGozAs{`I7%R%(8=`>YS&^S}g7*mqimT1MRxAc@J!{BXvVL@}(<2G>NcBvEDSS8QYM zxGY@5xf^dR>#YODnU@_5PQJ);>rWSe7k8j#0}>i_ zGI3eVa{mAEiD&pp=KJ&)6=7}QKb&dA4}?q=H^|1ZI~mCz;y;d&Y23oC8I^0yZqIX= z?HMT6$l5)M?51B_BrDq{6YozQ8AYm1SYd_?@vd2LBg!s6Hs#6m>Ph_xbS>ZNq~dJ# zrk3_l+_qBORHbT$OJ-t*F;B-8F|06f9%;mX5yTs4y`-EAXeG(mhLy%hLsugG#>aV^ zCREZ^?sIa)FP`0atq?%Wi>ha!0U z%-x5ozJ_SH5rG;4B!SBBLlo{mp$0;FdZ|fg=++#uL$p|jm4>XbfFiMB%c=i85Q=3w zDR$w$q>Yh&qmhHB5@8x5+yXaU+fUT>)NY~SRBbUvY`oy&E5Hu!T5{Aj<9TEII|Kzc z-#@#CYnSRnq#PX-_V{}b@<$XUmuxWNFRFK&qL3@g5R`(PIEKr?UnE5-xb-Z4L?mA> zR%b{1P?CC9A}{ubwB|b{{`6xXgxX#zR`kh9vhQwTR>V!1W53M#fO0LEp_ud2nwq4`r%kp*Og?e zvEm^hCL~;O-o6BDBTUp~gmbX;)aYUh1^F>o`Q4sF7Zz9KAu{h?-4=}aNN-(ojzwdA zsw;ziKra&!v|vweFhPCjV3i3Alq&j!ZmKf-8d+7V;Q|ptg&5Nx=3N7T9iHjxV*C!& zj+>f4F*&Q%`M}D&VNN`9wJ1ydt9SCQYfCK8b;(oY+Cece;6e%3k7xpcx?9!@teHeE zO&J2Q@GugHKC$7V25mO_Yr|{;qS}S;Zd2w$q~jYV++-91XXq}vVsZM!MH(mljrNnY znkjVDg84sD!WT4o|7xQ9)b}{b{k5?LX{jHOY$KsjJhlvT{H=9eA{=YA{oTHIA(LdlUW6N$}hC$tD4lqbd#2xV#$qhBahYR~(*c;62ycS8& z3tPdrC#tI=#hn_IsRUAWOli@B_cfGh)qJ4^tpoYbYgJudesdLUH`jNx4r4ninada? zmxiyBkDKg+rvIj%-ZD3eOHlb;&JRbQQ_2&Pkc90qhmTf}NZvR~i1Phiy7*>1-g%j4 z7r%@L+==7&XR`SCc@^=7aJ~2ha0M{L{~_eBUrxd`s-w|STMN$AGFdBI_f=#Ymr23w zirc~Pk>h%o#If=;B%axdRV?YHI~O|6!l_%@16LwL(hC2RnyYt%LVIWm6l`KTt-T8x zP_&&^6ymccduz(t8Cq{|#E;DmRt)no0QLuy%A(j{^WHMUch|VicoQI~gxjw0LmY~;Ww%$`r>$m>jnvaMz9~5GWgTeC9mUcuJ(!9}o zx;HbLQvn4DG5mr9RLQMezXA-&$L!2eTp`y|vW6V!N9vQAVr!#0KP@}F)d=7LzAgih zkIYf0a7h3@K!-xbBHq)}YWPw1aP=@N-1%bPw-ZK_#rhkmc*PM|{&(~Xh6e51n|+{l z-%JC$qR)oz$*-#rz<15OTiTt?1=0C6Zy<<|Up4#Kls6}F%4PoX+g)?v+#_{s2Xevx zDIb!!&}(Q~Z|v7oqo(z45@LTYny-Z%h`^4mF;VvFW`XB;`--WjK;zIY` zbZX~IX_>r1vFTg7!Ns_l9R);Hr;g*ewpGgC_IgT}1z+rHSs#FvZV3~BQyZW^t)oW4 z5@3$$jWixbdK{>@LB48GP8$YG^bgCs>B5wqV@vhmFi!rKB(u3awKWta}*OMAa^m6ye?D zfo%+gS)UD}%h4+{z!S4HeXDKre@$3U4lm=3jy+>}Niq>(q8731T5U!M2zpJ0Bj2G= z_@Cmd7PbX3{V&6Xg~%ZYRQMo70d6lfs>U3@R>|t!%1`N6JrF1Be~#UF7E(*)*Ard3 zcpW$c0g6-Jh~u-bf9QSW?H|+)vRJ6Z%$d0w@-PhEY!n_vxoPsv;!`}##1}Pr%!|rL zA)8t(lWvaZO8fU||F}pl7d{qU8uSjteJS!A(!v?OqV}i^M*J5Y=jw)o3rFmfVl|$q z>V%7}Y{aDZDKSu^TTh2$J7@NhGFJii7Gq&Ln{Sx~Y@6|Wkx;w(aX98_=sX&`H+EW{ zT5a^tWMGoYj^Uv%!Npo!f?X#t}N+>8KHIzwh5sRzaXxAgNfx? z0y80e=zjyAS?73}r!#*CP+qN|-W2$IdG9&=dU^|85{NyMf!Jf8Ik<=u&;U=qoK`K7 zw?q6X0n@x`jUQSr*dGar;c4vl--~+9jGU~>vq-SBmS(3k(&jlwrBFw?7=e4x(LH$q zpH0i%L7V^oFIU=Hv~)+q;GFiQlqJ=CIa)R4Ew!q`d0Py2BREYK^H6dE<9z2u5!)ex z{YbijcP1Y=$(XYlbMDS~VuAh&;%w;xd^rf&bbc5FHe8%8)JTDL(VNNl82ZHneFoz6 ze7k&i#9*V+Z-W!LD0}@^5iuu$^6-VxJY5EEWDbDo)Jxcu`FXF)3g#Mwcv-lNE;8Yh z#@tG_*r+Nj)W0_ZzSr4I2LK+8K58H|3m)@n6$n%e+Il&V)OVW0_G(lh5MH|6A<(&2 zs(QL{c41?w-n)VtCB?u0vAB^P>;oOGq(koS?U_BLZ}xI;%dM+vw>2#yM1$8tkbf2f zE6 zik-FwR3~2UIe}&5QN>oaV7?t1L~RV85DaaqVUMw+@i_J06Zyss%RP7+N#I08hMuAl zv-LFKs;4X@twva!$d$5O_)lXFyr|!stE|;{LNcZ{nn5JJ=!8ak(6>cd3Oaj2A4^a7 z1|*~;I~L`w^KJOZJ5(HWNyT_U1gre>xo5*WJ3KOz*A}Ww_E%CXVDhQgS<&jNXq5hON99wQ6Wsl_}77*bR~y1&jhKW{2F- zcTCbH88K9xpPKzwe-o_7)Y-%ikfh*u7blU}mihlmVe)S%%jK2_<-Ub5Ki6bF7+=}Y zjnxW*&Xnz{J+cm)3KT0_d=-%WLef~FuhPA0B_O3KLr|Ge9ivGQ9R=RT%Xmfie;Qr< z^a!$PEe*=p&gBa*ieJx}DC4J%r#o<~OE2%&%b{+N#9=n&FJIn_we#eEGOSHpm311o zSLFH~?De|}L*XoQtM@ESga(IgY)Kd>b*#{Vsb7ePoE+Oqxq8W#2JLM#bYvE^;FZ#( zlLvLnBL5B`uAaV!IMGkFM(Ww(KyX!)9=ydN zSGUXMD(a6)EX&YITL7??4t%sG?p5?w<}0ZUk)qpaRLaN{VO*1fyIS4_tJ81`a?`24 z^l&3d=E6pY*Cn^=gl|X8cdHhLC{Z#{Pz%haShYAo2(+LQdVF6Ah3n8ZR@4>PS)?xl zM^(N3$TG1@l5j2njUZzT>Gek?Sig^Tj}?pKTyS+Io~e*4Twi&Sz^-f*kTW+(Cbq99 z!q3iRO2g)Nkb`Xr-&!@T5kVT#JaMkj(pdrYe+}SRrF$lQ^16n)sDi(j^OkH25FtkK z|8_;!4mCs^24bn_tpPlw;a5-)clM>``zdW zWKIn#VT}*RDC3vWH9mh2ThQx{XC=8_2;CnryzpYwcJJ}w$m>cpn2~=80eG@6YIJ^Y z(w1?7NHq_FF7|?+CW84~2RRtVj@>yNKngb$%kX66J-@Mp2s9QW;S4j~qRgBZ{gk!H zTRe(RP7d~#LUq$Tb^q!10@~>VBU!Wk;HzO(5;+7#ZBDw5nW7Y}%*GK+ zE2NXLCJ=A*8b=-^3WUhf`#8Fc>jG9oOy9zLM+4$;;tk~^zhvlTMxkuMp{12!dfC3; zmapHf6Ssjkm{f3O&Op5REzIyl=c^YJr_Zu;W99`y02B<%or`w_y>5(F56IejG=wK5 zhCeQuflMd!Dg@<;K!|wc0|MtY0?mVtz%@kPYRuQt=4(rS2l0O4)Ys@_9JrjY`kqO| z)ffV_Z|Acn0UK<{SL5vPRG^;#k&zHY{QN7a{R=TxF`F$xAxA+m$4AjyZ8r16UNzXz zhR5yt=y4JNHVl9xmRPL}FSYU12^M(dhJW-Yfn@&kT_hqNcJoz3FVXrsW!PenKvA$* z{69D`0~JS4`u4P&-kQQ@OaK}@8?O{}BBC$-;!d?Dx-8#CZ2L|oqqcE}HV~&Qrq&hC z(Y^Y?+Wd(d0xLn_oM(B}!V*BO+-S#GR{+F|Mqr^1y6NG~7a_TU)+{LS3x@kM{hm?b zOBZ08F1HE#Ox}#w;g;Lbp4~oJW7GJ*QU7$)_N6XefilA=R}PV8^ynQyjE_ zCjW(f!+(2FO+0t9F$Gx6wZ*j-?=zoO$|QO7g8!`FTqd#uv!lw?TRkai`6KAqv#dS(;6Tsl zkJnL-)npFPK{>B6bU@2mdpBQlhQsc-tme(XhFa;2@D?tQhm<(O|lWQ?Y{m zxr*i=&m_)q)eZW!#c~r=)F)-3r+ z%6`70|L|t8L7B%eaKq6t6{V3ZamTmJN6zi@E%?NOg$-LQL_l2Kt@U*NUj$2>i2M*$rcK&>TK;lSaS2l!Y*a6F zE1WUy>FX&+a#n%v&oCv({;>oiJ>JRU?6#r)7%}>u)|U>lDfZ)xlUQb;<4N6}Ho73} zTn~)35e6g*lv}v#?(WJU1X&}6Wp-z8<+!DrSpU#sR6B?ONQL(n>utuikNKA3 zhyB$8GMyAeaqhdjrRY^7L1S3KGTa~%BBI+F-FlgA#HupIxbW%230IpGn~F_z|06ls zPi{WwxXaXkF9>IvGhF_YNO&0}gqooj@EV+h+hZ;>R%7u#bXcxvL3D$)bOrjHMvF-d?uXQL zXY~c~4vN%btQTGOtg>+)@Tq;D0XQbWQSk8(PcdPAtCp2dVdFr{iwW=Z~*)J zq@UvBQ~VWx2qo7goXowiYQJl%iS7eJjyOeH{xGLp+B?r_*AY3K`T7%gI8!t$qf9F3Ob{*BQIja3Q<4D!PJ#F1avb#T|oY@V}El zItE`z;5+P@Ne~Od(&&=x_z~|5?6B!=cf5=?s~u;WV%)n!DjAZz>WkWNn(3mu{%r^a z<-j!uTM0-(;L!s(GfpSytUm}n_MSEsa?>@(+f*Ubq(&q4kaT{zlJy&y;4V@5^jp?a zl81f`5}@60Q9xIUvbx7}EcBea;8gz$=vzZK3`HgjC-#wvl6SyrmYe(VZL*5e@xjSt z$?Pu-v&4T%j|GhT4PzBL4uf;^xE(&i!cb-#x4*$N_=(d-F=|N#-WDi?j|%qo6w_zS zxf)xE0r}1L06%_Rr(e+IrzN5<#Z-X`z>Jl#8A4ac?j0Hd;w# zyFj90vxN3Tb-!Mh^~qLwqCk^VSP!l`5XI^8wP%VkiwD-4%s0HWONDyrbue}ypdi!p zrx@DT_(=~7SF`SfbK!{{S*w^hdaYk-= z_iWpDwLJa`C64z{f324~cIC9bApBY|*5i1ZITUNntW(t>Gg$7ComCMi)Ktat-fJB} zbHDT6TT`57ENo?cVMqnvvjbQ!!EI(2CEnHhLp6%{(WybF zbz-$+uITGg3Rbzwg+Qa%rW@#fETWp&GAxe5ZZwAJ+&UTX#Lk}?aB;Z0d!n$~dDiO8 z8$~dPXVY^}LthvFIY)Li?jCpuELlZy*!VyiQ>zHEMWhJDq^Jp=_KyhSAvP#ZU4d~cf zB&NUnj&|?!W+jSgw>}qtR~&mX7)a)fY=a_lov@KHgffG{{-0SIlQi4wW}yzG&s;!f zIgg1zSHI~;IYnQp5GWN8W8wcgr9B?YJyzEZv(PF%UlAmg$Zxd1$+gJZFW95c8L^db zhH$oiS-<5I=ahHCW6t)vsebysST**O#>c3lJss~{OuIIsGfU-bRF%G96;X6YKZ?2_ zYD|8s{&K?_6;ZDOV=7Vf-b^GB4Nvg#8{G-vWmxgm8;x>gDXqSBMda$?n$X4Gaff%| zmkY!Yc9i|9oqJEHC2bYNdsaKN#Wf}}*W97LGmqT$^He>x;id>~-Dav{X10#^aAA_t z1BvNE0%x3*!J@YsUR8L+SWBvbQ5vL{5D~9(4B07JH1Q@&%%zNq&^Kw3c|vKvJmTKD_qxY6YLlK*!-sTd>Fdq3s4{H~ z(wX(l8z#cQb7gEXO!Do>WN0g^XG0iFRnG;TR@P>YI&LkA1DjKVp6ZbT6k0i&#(5TQ zPiAPUL+D6(=vZVpC{(TZs(S=y%)YX|;d?YN?K=6Twh6*J!z>jUwv>rq8h$jp< z5Y2yj3CZhAx)JtJnT)2>1EBTcJ!cf*A(6KPc`McUoQMYyLnh)ARc!>&vygn-)F0Mg zpn;IPL53}K%$n{qmiki8F;V22i_t^urIX;z$XId3VFY}S$xzP+&BLNnpu~J`b6p}m zg3Yqm)Z=_i^xjB)_}F&79mq$8bl=~E4M)>zN{4D>p0vvdS679Y>V|yMsLN)uTh=k_ zkW6ACh_h;_mC7;Vct(_Dq=lF6Si{Iq{>QJS8{CuYiVT3;oerskN2Fu+6KwReQc*$t zJP zSAQP)bE-kn(bkgIN_w3jIvx^$Jkg!1%)IeEYack|5prb$Jlol6QnKs~Yp2v?kNc?c zH^1-2-_E|m&-=O=3^WO>$>?haVMD9=%DR-<8*7vq7L+rsSOEi|8JE$a!BY0 zF$83PfoK^qU6#%=3e^~#vzYc)+SjV&Z4f`3E?lyK^SYBe)g#I{j zMKrCuZRTH0#}#QtvGLno+9VOXLLH=9%~~^A_oi?*e`}_dV|IL){F7w8S3f?<|D%@H z>3Bdf8O6yQ%fZwJ_HK?k{b{2Kz%ND2zL) z^4?$oL`++d6W`*XB`ZjWR$AL@O)wJJ(Ywz(YVC>+Q_w`O1bzhQ=)+$E6F61lo8=6< z9i6?_ZUeR=tV#`po%&YxBB7no=PeWvP+a#y!6a#LySHf2Q8`lroZr8JpHn`Lquk&t z@BN!+?0yU=|J^$e@emv4m_g(#W!syh=z!CFS|)wL8|C@;UQ_;2Paf%nB)Ajn8u1pE z2(fa^JXt5vW4mZ$u9~*~_9WtsMbgw?D;^|&S ze`{h?j$jaebpx-k>Mr}Yj4|Oa?b!1GeR0jaeU6nR-;c zHqUfU!L>k$-l~o{oBU5;|LJc8KC1XzET9|a3)=ag9$;^NhKVp01p9h9-E<|NGWZFc z!I}TPMKun2Zp-d-{1%Ez(%(HIhi2-P!Vu4Aav|keu zYs;Jz$wqcieudn4KxdxoK%m|>(s$E&<=5qE=W2jNW&!d7Q;VPlO1aJaU}PT;Ey`-2l7w z1DKzbkLjcQib;N{CprRvQYSrx&(JnX4%H_B`Xl{K93yYVNb^6q*#2S=BS0Q7j440$#hGFwkoX2!)+%G@H(r1FU4&g%MbSBRA# z!~#%q!u1GbSCtWc9tI9iF?>W5*27}3&#~OVj_=BTmDhLKkY?VnM^J2 zD*#wZc`jOCkNmRnnn#%!lN5VpUkTJ~!h|#$gzWa^@ItVqF{5Id>!(7If0U=o0Hx#2zamLtC!LYZGs1gU|)kAOU zY?37>+6NV?9>Uc*y-GqPWiqG?nT#R-GzlJ;Yd#^;%&rzslYl?MxKZF?~qOV8f%!XA$HRd8GB3lpP)8`9$2Tl3}0^X*!p6O!uzt)k)IUKMG(N_{ABQN>67yD`L#-cnNM3LO*=+j*b6=WhN3 z4Q-&f=MFnmZI048MO_-W&Q*J5aWG{;7NzwF0t+XQt?pR6Xze>_z3_v)f}mVUjO2}T z>?ZE-COOk}+x%Tz5J)O%S$E^>DcQ=%6SK69dr!%o!0KE80C947{gH>&URhA~$Cr2I z;BlJe3-Z|sy9EbN7|JMpn?ajBz;hc@D|BB6xCjFMw#pr){UtcyxO@!Vt|ijqz{~@J zI>&kuf3DXN$HeLD@vVu|A_hX@sQq^(S<*ut2^tr9^A!ws^I>(0u&= zMJ-Vvb}SU@=t$NBv1WVv%=~I80Uf$KG+Tp;Q8SGp&>?QiET;9Nz?DeMg#>N@mC|OC zN%$aT{K?Lv;hctNlAqFY^bK{4^NbpCav1pV*x%5)nGm?I75Ib(pNDVyLC;hV@y~p~ zt@Ws}BbqG=j$WZy2Vnld7}A7UN$HSFq=O6@{&^26raNALq*}U>_>00i7eL=&Fe%W@ zUjaGRXb~88pz;ut^A6ed9Z04(BSagaK;HzEdla7FH!TfV)TO`%t{+W(o<0h zl*dBYy5o{yGN(f_!zsb7`bp8Ys96~R0sF5^^WD9k8jvn7iU5{Vbb)hv%79rMGOh+*9WDxbd> zD#G~ZU?Pz?K$IRYz|fh-7fnUKAz~^_A_Z-m zkxB}WI!{i#DESL6dybFEuMb4%aFn!{E?5IHMuY<80Kj~K3ue5n;h!y{v5A}TkO%9g zTko^yhWpS2H$JbMfq+`7m!)Vw51Jp>s!zqEI2S*hB@6;RJ>0>*f}=SmZ)5(TpX$2G zIH-d|$Npn_gel&5Y(x&d7+k8a}_l30+v;GEwfHmgq_8kop;P%BV+AJt~f|fwB z>`tTb4XBoeFCxpplN748%;_;#od?GyGY3VeZ`q&bl$>Y!#5&iPAlzmzERnS?icPr4 z8Lu}I#x`gnJ>7I;zsVs{GCWjTRE^HS|IVk)_Ccs)(vLoej@a108#{yVL$$Dv#ept5 z%zkV5pGfZ_Y{r4TNm{ZuK_h^|zw7CzB!8ae7d}cVN-w6Pc}{YYLkY}QVy&yXyN;&L zbWyaYVa2-`okD#exzR+Of`lt?5)3nh>1C_?HI11Y!Dt5Oyv+LNIKI}2KmfR?nZzhF zDNim~1}dGw`+;cwL^+!U0ERoMt^Ob^7{Tl@ZfpjuA_E?2D`y)~3M&QXl`3zp78%>2 z0${_koM{BEo78snU?|@1w%=s#^nE#!Na8m8tL8iVjKa9)HjIJL-LCjkDwi+Qu-m!F zm}z=t@)MoidHneiKac$UnwQ$S*!X-B*EMfRy^`=w6zeS|*o9 zSxkM=mC|}{J*)myi8Pm4Q7Mt~sU&i5G zsl!ouOD#u^x88YCbUMh0qCQDXsr08zEcoGk&Ie5toiP*c>N*n|dOl45Sp@T+GT2+5 zpsj*{;SZ{U)18^$ASX4K(h?X$f(09AnB5xs6%z!c5kD1l2x4Q*@;7&BX@8uX^tjjJ zb;^y{vf@mj@sl~fO1mKZ1G+P7j1Za0db?2UN%<2m_kUwuQ_8x!za3UCW}#IxS?Cme zh}HZFE-tLbusa?{mGsHD;3gpH*EaEU)bYV+k&`c2wkkPTM}%#OUuehe1jaeO9*#+|JsdKe;+Hs~AxPe?Lu z8sQtSL~t*#T@?F26k4TBDh5E?JpYO>DaaCqic1>#`RgLP*4Z1;1t2JCPj6Lf zsr$xlxta5F*zejTUPdo1rxfZ*@%0VbI8^lp{}|OuQdrvTMJ*t8koc^3ZX^_HnUaLo zMNn3olZ$$A7}DP>6t!N4`%K>L}TPz`DYcB{&UC&bfCXUfRk*h2HD%D!jaPGrf~G zuEYK3BemBmV!WQNKhmk5vnm}EI9z=|s2q}lU*bNFI90{iL2@LZ_PvyT#czJ4zxW18 zuD16$OfzS99^Uw%(g!;Pbz5Qh-cVo7C-U9SJRr> z9KxJ8Q2p3^@#p1s@-RWauL!6OXXG8#odXMWTCI^43B$$*-x0Yp!Se>tKq72a%pw~6 zEnE=bI~u!hIYWVyt?sn7>Oc}xnC<$4TM%izq9wDbN1XG_@mxjNQ}Tno(Q;VLeYiV% zDM~s1CsLFg)6d1w!wO|zpAUOCap4|=RapNSg3$(^OY;+&WB+Oxs`~NP%rab6JKP~d zgZv!rF|Oo9JG^ySNN7FPff6NQzGUKv5t-MHV&US7&7f1(pGc8KJ7rVW-ufaP1}KaK z%!vL|P@svuMG)x0@Hh&-Sye!xh*A}vRzVfFIEkP-+w`sjLVdM&ddD-XTo_lwZ5Ygi zTt3YLY1 zJqRw&J$|Z|!iVwKf-{Sh>0)1UWu-{$K9rK|G*eJLUUkDJ8J&~zj4VC*0-LPu1-l^m zIl&WHVSGBHwG;afUUGGVOWM+59oSDN)nI;I^3W98U^9tL8Zx^&qWF+mLXK#uVWKWZ-dL}} zuIT8Y%F_ocplPl`Jr@Y4%$7981t4IAgTX@999p7%(wq(6NXr`Z;}ZHh3B3ZWYO9bC zOj@`qVI+d%(x{l(nPHem2q)y{|5U!1 z{tD^W98N4nTMY%stro`lpb`U?`q+k$-e}gE=J=<`u}{x9xWL|9ASc#nQ_2ZwyB7mF z8J_Ou5m`=)>)s7;t|6H1GX2E2vqH*G5g>vFdXrT{AF!DIF7A+s{K!bO|BE| zCek!c=@h~VCl7~NlzaEBtoi%3N_YQ@M(Q;I?~vZLWG?m1%o#0E=#`Kfls@cDd{sLl zC>0~xO;1w%Lr2g9P{F~B9Nrt_C2M$sz!8W_wqas!a?#%wJBc7BZOn`qh|olA?sigL z3(Tec{NhPpJRAn?hUm!s?^aHKgh*rBaffx(Vp7K2#F%UxRwDy=Ao#dPeWRflve#Qc zMSx;O-EqRK+)NNXrS&1uf`x0$tdO>R(eO!F7&4pZ*doOp>`~(BQ172Yx@JxB4;I<2 z)#{!aP!FCLzS7C`hGBIZhp0 z{uY#DvGTs&(J=!e%-1}ZQrtq`s(vC`6Af{`@0MSd+HTCjpecLxmg;m(BJ_s(>w)8k zV3wO@#L)rugW65DAptGgcT%{=!_qHKGkQ57R!V`@eCELRiLwZx^%w=fCP`!(m={tK ziy|ExZrUKQUb^PeWoibYu(jUrYE-4Q$s8>I({=K=4h(H>a(LO!yiYB|Zk=)UP}_~X z+A}$ds}p?Sb!4cJ5@K6+SC`INzsTI(VqGf&2NIJXoRt=Lx&H176wJp>6W&i(?cG19sd++{aPuCn%!2eA4%QeEoYqL-wKt2uE+67hfe(89n79wgy(Nj*BuqMoiWF5tR9p%fo~Yn<03Mf zTtI_b`0B}epK>rSDfUjbjmX^9B@CkuY6UPwAH4tU=rsErwG6z9cN;$~*~sq?aYD$} zTl343v*v40zLEg;9}hK8nu%j;L)o%g56*h};cLUD9PO^8SE+`^ur*&p=B8$QJFh-B z?q+8?s8R22pH{$vUQ47_R|~;B7<wEmcZy8LN$WlIoL)ITb1=p~+oj3ad z4<2kFJR^E$hXpo7AKVEW&pnX=JW}tu0`O{!YainaoaqnBbtSX1+!@>$yI42z{jd&c z=tR|kR&@^?);IWV`y@y(9^I2bIH*2Kzsy=2!&gb^gcT_ePRy^51UAy3H~3 zZzff}c(@p&ov1TQ4Wb5Rv2fr)(Ee5ewPg()hcnvd(7zY`ED1>S{+R{3D(7OP4UQ=I z>C2+;t}}zx{{&NmZ%c>+uBg#qw%GM5j+PcpzqIo9nmJ1#MPo!0^6i6Umds1lcY#s) z(i!a%md=OFwBjp^eqd$=ye;aHM|Bk^4WeZo5hs22M%~)r5jSN3#BgjGz5j6`vz3`@0RkIP?MIRa}LC@i1Lw&jpwZhuL)+R=HwI!XXRH=+7NDh%_NXfGbm&8!sXu zgK#8gk_|r8VpC!KT2oQh>QP|592*wI?&@=i;GatqHtPfj#q10}I8gv}^575;YNBs~vqjfd;s?Vyl z7!cggv=q`W4XZ=_D=4yQSkYsVNaYw&9n+G!H!Af9udS-~m$a6K&kw3;oV%?-oK`MY zv#430}1>l|%C@4(#k)g#X(n1-U>{-U3AlVoZ7Z8@Z(NAywI&J}vd^ zS$VjrKVu%xN&*|odVQeoV4yuV*JIiE((s|&``&LIICv-c-9A=1n8I}r!HvHav_#v#;-}@sp zax=_Rx%3ywKy*$e3<3}Z=gdR13!gPRrNBBt(k?5^298kbF{jyO=GOG8;xWf|0`tCQ*ZQ+h$0fX4ny;#~gvX^_SHy}%hq&_JFGP3H=1oNayx)4~K;P!e0;%qvr zGX4{_5l)oZ4UA9xJKTHQ@lq2okJ2oe=+9^XT}!_6^=^zctnV8-!b-W_*wkBlItcPI zw!*-%J|CLO@P9B;S%{>01mUX~k`P5gS==9r$Wv0ocXMMJrj|enr=dq3wy%`gt(n}M z?2*izn{WuD9Da?^4#XHe6`XNTxM{)%luX;?Qit$)on?XjOnJPn@9@ z?j}B+nwe^ zS$}vC)PjF`oRBi3ysSyd+0&!@7DV!&?NT*7HY%rLV4yVz(z|TztX#7f8%V}h! zVET5cSb!O_AMO@hDOaM*Lh7e5vW-%U8KzP<)u8<`e@d`V*oTQ$(R;HdZkqkH{yfPH zz;FXfxJ3>21N$Ylqwumx+Ayt4!voaGCQ!Wny>AAp^aOC#doKnll|bGK8}w@8CcIVP zHb9{T`IbWn%W78PTKSSa-4`|{$zuA-^`Ef9uiPx{AF}ibSc)jB4b}bER&KG3dr?T; zJq-kr>~V3SX$MS$LP_C1KM-#sgf(ge*OAj7QnfD`HYpqWfxw{pJ?&jcQ=OdDZtxs2acy_#N`*nqHU>!Zw+?{6-i-B zyOOg+nw3Bi7Wgd1D2n*D)k}bMK&z(h)Hxjp@1^2(LM&n-zANsuk65w@YbEf^)I}=> zipOdd0ao8Fgp8K8rw=#*TBGU~nxJ%=J_SqWWo?kEHz>1qH(`IvivN7wR6t>ckDrI0G&oQ|~fqY033jYCahp`g73S_fuS?Y(ky6Yf4f0AU3J;Ao- z-~cH?p66JdZ$mlKCw5L+d<)YLWIz@VTc6ySUjsk3Q)*gdQ5Lh*sDVYnOC=OqW%=?) zRC3ii^BC(&nR9nZH*)2O>2fXxbv1rQn+Dh|^m^V!6`CwMR3|JW`YvX1{)pH~hMMoMNMW2p1vW9+yEB6)SpSd&nfrhIV(tvPKXMuI=NT>uUu>9f4dOygcs% z^6-j(qL1X0p)8SBeTMs`XsE98)ebc((_+cjjP}2Hks#<`SvGOj*fXpf4;_r7JvyCI z%oEBMbm4ex+G!D9Nqn%uVd&j)x-VT|?^Vh4ZPBH*kNV=jrz6uc|3%Azgm2hPwmlx3 z+8e--k?fH3w>N~6d^jV7?qMhrxCXq9{>@b za}ahEk%{xm`v_Uw(6DrLz|5^j;98=H+?$j~jqwVNhTEe%upO10M;OoVo~6u7OI}i& z5_W0XruY1`r7%|xu)~*6(alo!-p#gTAwicuIp?!Qk5&&VT=9!gqKKg%WdRQs;#=!% zsRKy4jb(BdU9-8!QHO-{R+W$3EK&zp(B;a#KTswL*swIOH@`g4JV>}jwAZGDAW60( z)6~cT-Jo{AY9+6yU#uQRk_eP9b)IwFYMWWA4wCq4;fCXl3lP?xevaDr)IV`^6$VAR zLec@-r^l_An&MjRdK57BoV2s7l>#G32_en;eaZY(sZJt+ z1>BoqCM7n`?ZGn23;-YjH;gv)XcnCZE$%Oj$X6_SfyUk^n0%I(5p~i2&C961?LHFM zLXrft;+V9;`Z`Nl;b*4g<=b~ixOEqIz*f2>@w3no_d@idtIlGI8{OGfQ!=49! z0d>+u{di20g1<(-W9{@KuVPVPXN$sI!t03wR@C4Psw+B{J*mtnJoT+w*XS61*+ z7J+{Hu`@SIw`rno&Op|Qd0pL_e!r;qekEJ#U0@cmX({}JyA zvQcTL$fJtV1xSnfFyGhK>3EhE3Q**2^luICP|$KR+O5@1T?bQo$Q}Xznd{F#FE>N$ z5T1%K*AwS)4B)W?mnpv1iUsV!_qSJq)c(~`^Qv1fBz?UcVfWw(l=}A5G4NY%6{)jd zuzhbM03HzjEp%nO^!G8uv`a0$GE)4rd2gujK)gLKCBJZdg_|GET?bwg_Spj=aDx4)c*urH<~PLUHXm zAQ+xMC;bv`7PSo4&(=)FS=gf9`gHfkZtBL^v9uFE7XWnC>VBMcG(!Pwh5GCDFQ+hV zeIooqA^?$oGxaLaTAh?f4}Qb6G!@}A{&GK~CT2Ijn1h-OwLW#=?;403%I!Qx-p<2r znlv4skbSswV(Hesa1uzBCxArnMW$}&fw+{a9h*hPx;~dW_4!p!NWfUcu_blifF5J zwoy;Ky73)QlPl#nz*vHY{j1ZnzT42C1pGDsP9^+1U@eL9G-2=Yg^hiT={W)Ol}59Y z4y`sH9D{a}@YPSb&=nqYMpZW|jCG;N+gv;-2*M5(8dnw)`VZnl+D zJqrbjZrn`>B04=HKGCg%RQm(~&gj#U6dR7gApafzm5;PZ zpY4(C+PVpieGeMK(9B`LR@Wn4hmwi}U8LhqL(lv5 zaHcyWOLS|jhe7Rqyf62?tGEZxPV&$nW}g`Yp#s~h@IMrs^p+^^$*+7O;@C%blIAcO zxN(y(Wiw0&z-~b^V{kb-)JiTG&Yd4ba{qt;JJ)XI5cykuUjeLB9ou5278jMiU&N@; zBn*4riT#s?g<2Mz*<5ultOQmj7;lQM?EwK7t;Q}h;2wklK3yKogk&p@sVXtxVQvoR zS*`=US_l=YUsf0j(;ElyZ^vQS(`=d@(_$gr+7XiAnk37^7S|rg7t0z}#1#-iXJD8I zW<~(8^tcIZNQ~mO3e)j+D-)kHA$7~x%IDxw2mG)(^b!i}7c;FvvD?hjOzq>fMDhw# zvm{YOCkVz+^Qu~~k{VU$tuH#|*+_LhbNSt|j>P4^jBRuGq7l|W3j=~%s5m7Di9Dh$ zCWIh6gvXjw#0?B+Y8brSlVuU)&my>`j|Z={4%A%1CimnD5Uso9k*W%}g>w|}{Z3B} z92J}MRR#n-WjAg-(zmZ& zt#6|-{7c|ksRo{s;c!nwwweFoZ0imTpw1er`>PiIT@OPlN8!M$e8A3%U^xC;OjOQf zh)Nc1+Y(cJEShxLP?*&&C9NU%f;%pe^ld{4$CRc$gD2<;H7QSI%IdFjR#nnagzQ@1 z6AYe7$5wQTyZKd|{G7>`|0~sJDjd+7Fq(4!hyi~9tpHyJFjQNzppN|NMHg3RCXy(2 zUrE1$mKf!LRq`P%sn@uXDOb>*HySikymd3WzivIh|#U{Z5lm0-#1%@1D{# ztGRdX7Z`!p*>EZS?`vF9`XxNTcSV(!WomhSmGXY54g8iv0v$<8XsHL&3JXC6=D9Kl zxOe^|ZyEk}ctOv%7hAyS{w3-CI|kT}%8YLufmt0=1mqP;e4l>D`Fk0kEcbKmy9LQ_ z!V@~-FkowDsG{13$^{Web{u8bo>-58a=d>c;Kv5-10~u>NIy9mU-}cS;K!UFX1S@J z3!BG8p-Ntwy4v%8WtzsyZLk?V1)~H6%7P`X(BLdCH}xSCz4{2@NDjAbCN(M#=2GJJ zlrSS*8M4p#M-;;UNbo&bApX(1Iyd~175U{%!=h*iJy1NtUFuYL!Y362cMaZKj2Ad} z^(pB^d;4PBudqU7T#~97 zglBeya7%mibz(h~+%=pD<0YfzVb1Q<81Wu%`5BgX`8MtV*f3+~Y%m4yyjSqsA zo2TPtq-3M;zoDPdnHXY#fGpZ9dTjcGEyFSJmX`6|vTTrdVFprBZB|{9s%>v1L`-A< z(=6kFW3S@L-n1v}4*nwhXn8Fz=iz>udT|}9+VT9k;Ong1s$5FzK^Mbo3dDV`%I9+2e*!hKd2^!Wxl-Y82f90BxO;WlFd9aC1po8-U z>azqSV~Znq26UGJhwmRl@CWDlnaT)|Zdc~83}aag|zH2 zZ3u_Gx62Dt?aq1z#Cx(^m&14QlW(2GTG3LrcUowe#N>6?;LToT(7=jgdrKUC^!~s_ zcp|X-DgVaDC)qsl* zhi@{q7VkpR1}$dgQ&llHM&6pbB?aPSO?WCx`V6?6sqV_cp{jIA7N8_ zKY2EtBKI`C7&11}g$rFBNX=yLNkk<{?qV%ZCsnn;WF5-#meBOjrxK3Y4?9s_*wY!s z5*7}$*{0dDE9d!HSHKSORmffZF;6pO_Tz-*TTuST=6`oyb&y8-e{w7c_jsGg><8!; zR|kgh#<=Z%d6vII zLW5W?Zq&_v3RyN3d0rPG{&k0clkM{lUy>c!FwjT$Wqn4UtQyjbv)v{Y1I16B!hZ*s zVJh8DRqTQcQk~Fku3aDe2v?_Fb8Fc9-4C-t5I8788-6+$n_o42Aj6El2!64~0_~-Y zd=6mTOc60Yg<7~gthAOFLnN=1A28DV`l3V9_xfnae}dj7<|()FO$-!n{^cBeVuaoO z?m-Mw$fVuLO#3LKu9NSp_;}wtkM-TFs%vVIZ~7B+&>FPqplLw&+&zj>XU6m|fQs-lY29BIVxQLAt!QFJJ4=HR<#d9!>UbAREs zF!mi?vBf%6^-nAfQ1Q&;pk1e9it73ega6D8ccEI(z58p`o${~Mwd<+txk^TDKPB2_ zYfgwiD*++DaFit$pf6dYi4&Oj$@!V&w$U4i5r7H-p6@9oXnLZufM56q#-aQwS|V4< zui)mw9E>Qjsz;a}Vx6s@B>rMptW=T9*SN3bzMU5Ho|+DgWZ7+D|GZz23(F@FTRdqj zK3N+1592JTTLMIN*CRG0sDkGqlo$9xuKtvi8oMJe)u_u+-NVeV3hR>Wnt7jUt7C@L zplTMYvJ;C|7XaVuW_lFn`dFslU$pM0voCC6&eum@}?p34gOU;~U``j43 z#Th*rGU@4njaNaAB$a)6tg$uRNMhUV_?Y)3Q%|zCp7+^d1Y%rs)gliJpN!5Si`H*k zxO`;4cO*)HV7i|V&jeG|K^1*SYb8N`oc&%{FN1qiWM2Z&AFTHW0X-JdOnMoS9>ptE zP!+KdIBjDtd_O^Gk5DXh>+F&3;w#^wu!MDsLeAh_Wrhsh|7?_^ebNcM&Wh#G)nA3q zm{2#*fkHSf@o~=n_%TnhjnXw;LsNEa`%i`Yk$?xJVm@A&IhS6k(~{Ebxj1rOUNVg? zjn*% zPgx+m)h1}jFuBRu)!AY+z+=0fUFBY@0EY=ncDTP*jLjSvAAD|_9GUX%lth9l_xRAC zfr+|D$H8<=3n=opXX^mJU)2y>@1k$^35jrsMAhXY7Ic9%Sn~N()G#LpFE&qwx885T z`xKka{KuY#KvXxT8YpTw{(pF9!R5dR-KOEajmaVe7ap6jftVdxloirS6i2>*-a7Am zvcbz0v4;NEHzWOYW4r~~l?Rx&F2{um2ZY;XPtWmFtMO=L{jt!wD_SAEvcT4SyxA5u zfINQ7WCYv*^R+(BjoBk*-~!;q2f(mz(X{m}oc2Xca`p|5PKpG~_)fO1Z0op9#8Kt< zE8?npzzBore_fb-$17sUgjdHvuHTM)fzOmAaccNz!jJfEH%P_U)*j@70$ zEVFiqIvXG5Tp~<8Sq&#ho;c+E%|v1gerfe;s4 zKm=45m5(7s%bL6kM;%^S3r0wxC4I)6k#<1P%R3R|=#?QR!PZB1Vy4n$B%b@3JW4|| zVz%~1ijeWKMqM*42d#9G(&+M&64K744Q83p-YPBcF$UJ-CD=Zz9z%3Ii=j+jFzmJflsUN-@UfvP!0=kzd74vEl?2H(ECsk zUuLCQ24H^J89}JN&#`?vB&RfABwZlvDz>#xs$TcSz~F(3P1kM zR!9S~zc!PhgALtE!^T#~GPeH+Z-t`$Z%eI)a3jS45A!+WtZg!)XRSQ= zvnKZ^5XH}Il}1UC_%b6Bs(7qf(wuSbyJl_bO@`E#?&ckbpeDpqpOlB2&6y!=*4GtP za6{z-AzTmFuU)W9S8SZ1{kV}3Q_^+>B?=DXJAF1edEns|obp)ce1j6YB(u!2_(!;0 zNn^nfqAQ>m7s5mywrTyJEDIinlK&s+WWS>g;YG(ePwWd;^1{uDXJs!_=qrP)Zu)oK zP62t5HjfhYF@FA5o}MfFxP*&+JlIKlESzI&j8&|vI?vTLR#&3W#b^o8s$=8R2E8C2 z0=SwcFk6nU&rl+5>Mk${LXB$g3{WK)kW6RtUK*o+%9-tzaAvwLk{e8s=HO?G+QU?z z6nnXoa@)Z^&LX~Kn7rZq?$QW}5M%J{r{~MM;qXd`J-&QG=|s#yyOOM^Ty?0@5gWD~ zv7O9!@+ayLhfN(xm2>$EhaXn2h;(wEP^f$hnSIsI&uNh%LKM0 zP4VObGP(9cMyl0}ks3W@+{JPb5+UP*j`G{C?*Z`7v5PT6^6%#xC7Qp)NgQvY8}F8p zR-Bbrmzw@eSs^!!1U;{lKgKJy=c)_4&vCU*I^b}#yLc$cDL8l!c|G}|2ld+13ryCh zd3Q(iUtt7r2xZZ#(0FL0pbSY|B+)b!K*&1OG_Uc(s4A49jcs~~M`|<;`hg)-b=k6ztNKN_ORXQcalc%14--yXXdYpCI=Hb{5 zMv*|+hk1<-md&>>tKXFEd>Tthwa#>&RURQ!8{8v+{iS1NHGX2nXhZ}aV_n#Ffm9p= zi>jgp~dvrC8shfB)vS0snIPZg}t4kItepv_eeWmx$jxv)Q6JC zXKGQ6e&CcUahqN}4#{)cfIuut&3z8H$~e0^m4E^PV7w|10^9x)db<@hZ8wdnOXPaX z+Q}$dIaH;c5Yq(G%w`N{8R#XARdNPtg-9PlJ8P| z#5Z7+axR>84z{q%pG1bGUaDNjqsTIXHi<7-N=nw>`R7Q83q2Wn}2k29ICC20w`Fg#U28MgM4@RY~qB4s>Q8eHP&2Ci=s+tD<^RbKTN@_t+{Z(YT;tZVe`CA*`4g%=gdR(mjb zgk&K{m&&jZXwkzJG>w)DAJ+_B(;r$JE!m$#l*B)Im~~I{MAHA$3ch%B6k%jm(4E^4 zO%AKuDywK`%2JNHfOI>$_ zT60beeC+%~#c8L$GR|2ixyd#A)y7IrGbT>5U`9a@2wL_jIr4dD-d{_O!U&)|*&`qf zv$|ine_FTNTyIE%97Puqt$LZ;oms@lK^1JzRr(~FitbJ zcqCP&>@C~7zQHq&=5X&pVzlZ9aA|D~@7(A46VKA}lY(@m8+5iOkfQEQBC93r>&l6; z4yOv#ti|Fqn~@>39NC3mAe}omQeqVH;CQz!x1Ad2nRRvX#feUTAW{w?x0KTm;xXXh z6O5e{SL-DKI5ZiZDi^B{@_NP71D3j{9*npLSqID zRk1DKV(o{IxVo@vS_hlZBRlnVwl&p(DU&F}WaH z6P`FkM`;l|I+cL;1o+mtE38M$tp)Gxhr>M;w8)2*ZI#4;T!Zu}(dt^aCVszw3rWKy zLov(HatGrCj$zkLkv0z@Xz3!l`-ZAzt$ju1PlAB9oOTblJv<6xp-YszX@8!@8IzWB zZ}D$^e-1#uGf5CmeZWQ9_j<#$7NQ`YB@Mj_;rXIBZD?|Y4ay1c+jc?w-P5P+;r0fJ z=ykTN7-3q-R|g}mYY8K1zfyn4U}&RPbJ~xZ70ZUcv-)76%(`1I?7bwYVc8ckEx}A; z62(rb*yPz{2 zP)Yc*Tc~#0G@{lqExW)@cw$vxACt%NC>)qGmec>5cAHEZ54aX5lGPI9{HXa}vd~X3 zA}zd+S9ZEZFqTk_(iWF&BV0{6C4aGhU#T0euk6r^h z&9oQhVNxJ^W6CvV#A%R-{q+|o(MWEmNY5ZoYg*msodo;Qlf|4!?H$+n2YO#6Iz+=O z6lZ}$yaWhMnoE{g`zmYt^-4w~L{G&p`FO2+8~>AvvyArY}tRCTFSvWCt6SX7lF+6gQ>9x z=M0i9LFKHS@?~0)Dm#_33_& zeEGtTKX$pY;|XY`+BK2!{_z)|Yi`~~rPecPz;%9j5_CRI!ckf#j>xe5tUkil^cBB3 z*7#Bv4Y+<3O>7;Vqe8)MejbNFW%VlNdMg7Dr*ti;ydfOO)j{M{?>M@;FvauIxUvz& z#!>x#TU#@bgVxMcjZ+}=pW5j_J7n|Wkr)M;YOG;GY$QzH`2)NE8!rxH1*ne!Kv){i zUAxVc9v-pKDGfdk^a5-XWgia3JYmn7Yj%c{OEkMIIYXK&kUIq@Lh&zihe5ZLN+1nO zd~BOOWXTDWU$%WdR?>O-)JG&Awjg(>nMwa-@#Fh?hqz0$Luj(Jn+&It3L_Uw(QSg? z@Yf^GHvDLj(l(l6P@PDmty)y#I$=a-llYgA^Lk%ar6F%dM@!)h!Yat3vwKZjF*H{Se`1+}NSLea3>8Mb=MKUn?# z7a@!iJ+Y-oj(2ft8>!Fg>6`dG=1l97=CEwKU8~Dfdl2~enG;{M{}@TY%#YV+lEi@K zoZfg-NRVnl1f@J$)Xf0PJMVG%K_MLL@8@%yu2ju0Xc+Ug7Jc{7tYoaV7J_#Px13qIt$5Wb|CfL_w~Bp_5xY!hQS|?i zS2)&53sIKBEvuLE3i!LDGmZQCt#~5l#j}n!5$vdIQ!T*^Pwc>X@@>P4oqN4pINpi6QoJ)UJS~XNZ@T0RC#DZ11Nu^dC6x6bXH2 zDv{#1;5p#dBS@AR{&gWJTLf?(*F6V(ad&7kqU&4BdtR*Qd3%@{2Lx1ul?c6p)s0m+ z>2`>h*K+LJ)5rlm2?wxCovT6LnhHoNi=J0a9?sgeZWv*u$m*n4r0COS3_&Df>+Lzn zYd99uQQV6)ctaRWiahC*p%36eABmPe#61J(tOqW!k+yS1l8a6Kq1f`MO6Oxm&-|TswO05DpKt&aT8;RdP@ABm{fu( zY~SO;Skxc3lyUI_muhg5tq5QJ@<}vM8SqOYP=uC^Y6h zw?r!hYB5FK&qCj_O`Y~U`LULfaqaPWRsl<3_@9m8jq_PIDn!kaVZDYJQ8!9Gws(o1 zNz2htvwO1mov(Gi|GC6=sX%H;2#j=qie2#T%EdF+q+h=o?(FNDl+y6`VKZ%r? z;IL;0Sq#`KRlK?D*t;o~fFQdXCL&ToVr?YDHc=!WDig0&rAOUA6(OU9iYRWGo7}Xl zlLbi!H-D2qa~!3;@X^q)ASfQImP9WN(R0_RbuBpD= z$?dOS$4w#^uO^hG)7*tzD(gO3Lnr#z|;GW5{~sH_qHr``z6id!?}P@t#KhO zvI9)eYyJN;c|c%Ub>kCKgXlb76Jb~7QF>c7ptu|*qFCEO{KRZxz7j-yZwo)pu*H^* z^Z4r=pRP4@i^QX>Ib}+4(aRu(X)($dJe zk#VEeZ!8bIm}U|Tw9<3_CeOBH!H%=Y22HBrjD`79J93}B74tAzl5vdezl9m!gw)4n zty>ICU(3TSYP5vk`H$OaCQJ=qv0(qr|HE@-`jibYi;eshPOk%K^x!{v4>^PyYERda zOu$gizWh0Fpv%VUz+>o%;>#~+gk6vViuIC5Y&jB@nO$XpmD9ejia;D@jW$o+a8QLG zWHj>*>EIB0TMIkbHvpp#csO&Av3l02EnGllp#jnW8rTsBKf@%+8xc;@xbnH>w3WE#6xCOLWqk4(k1`NsH#kP z^(;7G(Cmg7@ZArS+CJlAO--rXm+-{Y0v)%couwZhe3jN1qzW!0CbO!B&J`0A39-dHqIY0|KObs4oBlPS!0)BO0Jb7 ziFjO`2~_M@=-Zkqf2{W^`=E*y(gFdlab-O^x;Yq(k2IS?byh}%Gvo-*O=q$)#F<-e zJ?|mh)gN3*0b#=5r`SfX$4m_Rm{%KF9wDyB<^%(Nj{L^>{ZC`(K|HWTx1n?afO+#u z4k0c$&zQjJ_jxAiPIBh9lWlWG#29j^B`GH8*%Q+vr^6+tei06ujl& zNPQGMnHr(t09f`unP>vqW6}M-=@O?LT*B}L&^GJfZt;}EA4?M;8baD*vy&UHXE)-e zZr!I!je@Jciz5767xXj~8~>B_+rTL}f(IYb;j0+{H9*S0_^^P-p>y`e=D5`y&||-2 z&@FNI+Wud~!sfa+nW?*Hya>%DL zex`QFsycm!Y`EG8F1YaIsnHkLD8V(>54Pv<_IJot!{cue?gB%eZgBW&960~zAS?H? zY$g`AjxMPGqmOE2SRa<9S7=x?9j=yobPRPQuT_Bs`@;+?=$%knzrt#CYWAecO|-9t zu$kgW-sev3fz&&BV>kDPRg;jNF?TI2sUa^@UKOLh6JGOT2TU$Pu+9#t5jPcGVv1P3 z{vr>X=Ziz+M`^C`sA?qM=JtKVC|6Jii|Ie@(klUVcKZTpbr;(kICPj>_^Co*4?#o$ zY-cV>ROPxRt@*o^wI`5+TH3lh1b^+%VJk(x>6srGznVi8)hM$ycR4%UW{<`vROHzE zgA9d+`yRp$VS(Ry{kG2H*;EH9g3b-gblY$dpDWYpK%%^YGi9Bk7DY+paW2vVleR~A zC6eN?W}AgGZL{Oe8rTqGE+a~VYL!ENxE2WilkA+kQe78eDIpy1pe4>5ftmKK0S?0q zAY7;=?^yyX=Q6!4mD9ht09bB`gJtc443!D-^E4N6kJ5Ey)aQ!# z6nUDSyVPzI^6XMFEoiYQ5`q5=m!rw_&CPnw)CNHlfyUhe64py_#&7(K7qTKKlg<2k zi(>pkI+v__JK1t6sMX!N_u^ zpVh~zN9DR&_9Y)dCj>J2U|ODbj#~!!V&<5(W|c~SmrbrkDmH~H9BAT;&?sSjWKRXH zOQbLq9+#O3s|Qd&X;*I7r+$ zqd{!#g@usbIzSS5d2m@gt?aJ!R;7PtCGTJj9S6c4Shy5~S=;=o{*sz*#g5Bg(gTB>1C}OvwM_Gk=_PoCgv{DgvQceINh!t}PS|84C@=@P^;`U3M}EyjH` zu`CQ`tNn{*2H{@=h|%_yK{w9gWW!*F;~B4q+CA7im5*Qlp#}DufU{(^;$`BC5%7=A3}HoyFF^WetU?)oiffc}@uX=O zV%w~pxNMUz66>La27yqiN(I><2G!!`2yJ0N)XIzGOs;=Yvih8PExm8yLXly8?^K0F zl^)m%;Dd&rWV?pjr24^0by&Z7z_5X$d;Bg!!H0%2PWOHPm(A7Q{o+6xd_pTq(L#Vq z$OhEk^_p0Wk7~6$ znHCySuCz+a!F8m zl|`*RVmp(^N~m_hfT%42#~chcG+w7gAd6&9{XdQv7++f*7#Ywul>v|P>y0@8VcQlA zPlt~C3GAtfK7t%WiNna+JM2cOza&5BJiz%&$2|12P_PnAMXB@m-!Rhey0=q=p1nWfmK~~N!rrn z3ZmkEO-5^S#uU$x#cZ{i=Tk6Y%X7N>HPi~3u+jKUC*jW(?)TQP*0RWX}N=p0o~emGVfpP}4;i1Ky{ zS1CTGanWR3Dz{+9s<_NNL`P4oOPr{mcI8(|v|%aQ_5=Gx(2n*kmtbl1lLJML5$eD1d75BU99 zEqM-arTWoEf7p;N#wjKa%CG#o;&G5PdX2!g^>dAhYCV$YtU>2sI)2D zgh!}eIa2L?hMW`JE043L>z8g*qrvbBt8ETiW9iBXcB2sUWC0jCn}9gsyZZz(`&!7c zorgZu}>=bQ<6fGt+bnoKbE~71dY(lGUxrWwB!AkWpm8p z&Cz6(3Fw-xSpv`bdOs^+gO1a-PFj}q z?xV)1nh@E>G{fn@{|ChQGx=8cBER!0BItrLRSYW9*igrogC(<;lXoDes;qJQ)$9?u zZ*^F_RkFkc+lQKm`-cAsbEx6M6xGwVhP+a6%`-zael!8}r5mtz_5eQIRat&}Z?2%8 zfEaZ=+s5z@xvcCbY2aDgdWRpw1Fmb+fx6tslPr^N`(+(9URXq|uiPPS%|5#;CB_VW za^dU>)d5ISpK|>O;3B49K^^I_mLa9DolqeD_ZZ?vqEon`uA^dw0xvti%F4e&$G7Ud_n9 zb-vTcolY!=x^w#x(bL@YRBt3|^MZI#JNLBMGO2b27r}|AUb({SRRYtvW){K$fb`n! zfQHIL_wd^&$V$0y+zH#aZESxtMyL^qTbx5g1g%t9#KC%iG<-{-L9on3HYZ5+%%NC* z*y~_LW;>)1BzOltV;1a_J-bX&T^=dpFRQOghWId8CbUVvTF#m|MBfuLZ-V@WA==(> z*vvj{NZa!k3~5nPa(G$^zj@(BqqcKRAwBMFl{j|y-2d(^9w0oN*;nhJEhSORM^C80 z+hu3gNd>?D`>WfD6t?H69>3j*%v ztA&Z%3;XFlI@Ne*O?u`Wc_ty4jHmwBR&)@J9#^eXe3OIH0+mnD;L1PYhTk~m2mpxW z8xo@fw5EU-0F2v!6L-))-E>Rq;vPU6-leA!(-uwi?Fn(BCR$;!@t!p@DQcsqm!7N1 zJpsq|_&HcKoR3$Mz(+}C`rR6il5>z3UCjD`33Dn8Vo}$(HqHsd-in59hv8r79?mcY zx#*n+ZBrPRJGh|HtGvdn!*lps)Z=YWOP1}GZtMTW2!@|JR#Bs64xv$)@rpnAsu#OvhtrLO0IEYq+Z3Fp^3E!XO9-elP7I@1n9f& zYUkV5flGSYyIL`5O7MkUrX3jv7RD{%ZEBiL<}9KrIy1Z1@kU0SJK4?%U7$n11xi(( znh6<;w1bMJH%d#K;xAn7kqfb7V>*(VapzbcUo{3}5CRX#IXNrhNqe z*jb{AGK?(}(MnLGfJn|@*Xb9P$W+mm5n{$MePHCd$v38^!R75}Bxl-A4=ur{QCy*z zFTSX4$HA*P`4mAA8M#(T{WvHGgy-SFg82GP!4o0u_Vf1bS=N5jgR-|wy4KKbC$Ssl16rA-H?;Pe&uFScuw*hM%n3}B~ z=m_x`6Gj)Ete4P06b{Zt5u0f5oEq|9ug=d&UFi8>3#oI~N|1rHcE-85>i#zytr*Wp ze2#38`AqrxV^;JQxD=L=TzQoA2srbMLdYFoAVlkRvrk%%+_M#>xpAbz%~(0(O=XGw zLh;PlC!(UdML^wu1cw4Fw%?bu13~tjWOL)E#~@s1PCD7LoNRx$NI#r+hWwpnm-^$1 z>B&=pd>ehhZMyLsv8oMd&RQ!bH5)JVFYV8%$A)is^6#6s@<4Sdzjxce5GxSZq^<*mW zR}UKulk_SIq-%DTpqEq~n-jEV^#C;lml>orLD6xXD&IaFG~qz&ZcDt%KG3wGO=1z2 z__l7q_bVQN94T*(!ZXq~D_S(C9~A#}Te@2gfdx7KR(pbVn!D`nUCu9(w(2kfV}uDo zXYiag)wCj}s}Zf?=e(4kuTLo)G)^w#pa-T~1QnT`pSmT`LhbiHNg`sqC@9bhnT-YT zoYf{frUf#Nqu%!ILkc(mbA7iFSD64-A0;nWY}O0Csip?GhH(W$s|2MEAB~N?E;jH?}Nlzt*^tc8dqDVqXF&Z zfO!xfr)-6Xy=Sp{_C#A<9gcHWAbVHk8k>QR>D~$4w|L9c@APP4s*DbhB}{IPR5tuA zfraD|STA`zx{A!#9bfvas$*hqtoQyKm#;$UPGZFy96#I+@zC=r^YzZ4n&a(pv7j8) z3yl+=aG-}iTHmM~t?kLXygVej;)>4}@lXLTb0jArhfxbmBqh|i{WMD0+8w{upf0_g z7=q8s7<$-lPGdN{Y|ytp%1%M!ySz!{(osi-`OhTx1e&y3+bG!DR30a>1CN{Jq%>(7 z3poBoeQxVTVAiBCL&YC~tX*Vu`r@6sPCdzG(qsddls<9Kbt=+49ho5bV<&yCd|g22 zmUnZG@4861)6=JFknPeaHvj#C9`v{6%yxFw@A~Q4hxA&YQS}V{^l&+9B@=|Q&;b75 z_i7twj_~A9mE&vkN&r7~Fwe9kZ39GdCZK>!^}cp=SjOD_Yi1^A95{0HK(7{}h8s4# z=cOe_gv98csK=-Owpi{HSutGxzPz$k=>-Wh66i#quy@g?0>Sb8O*J=|8t)Vo9JEC< z)&OtN_m6C83s(3n6tfm&rg#1|j`q{2V)6BJ5a(S@?8&Yop^ZtIJHov-wd5IXG4=Y2 zHE0^g*1g3*U(V|`2KO`fvm26YC)}2OyX_Zb!cnte3d1+oMvCj=M}9|@7PI6~p;#Su zbU}o?;j$s=NnrHG5LKH(yG+S6QrO`EdpWaPzwnzKhW|1Ez>&xWW=`bX%$VqogC;Xua2W__NO(jG7Z2-9c5NP9jUj#7op)8TEVYMkkXUh|s3S2NyV9GB@^ zU+RmDhnUA4*yeP6aCh2Qnf>Xe7`J0Y%RUWO!xQEDsWE@@HBtcq94cZOABi}U3%{a) z>@hWml@qDeHx^KuX9B*?{w`}Hq+zs6a3vqj5oeq>v->b6;@l6X$1f|149%(`;aR_9 zIHT13{AfGoVcZ#c#BV;QW%OK9WM?A^oxk==IrFtPVt8!!ZEK_^B>hU2EgjzF=@+a? zyR`AB(^M*yi^MiIbxFBN6*eoGk1l>(!AJ6#Ie`h}3@423;JK*??gztisx-I57bKGt zfNaz>>E{uItp#xIss3!q{wHq;Kz?ijY-%ugGeR{j!@ozqoyv{XYV1>`%5rGaP%|mV z(v(f1T<<_TlO^F(LmHFfyK%Rj=A8MZ$Pe~I=rrXLKP*>cY||5MJrQ(9aG5#B3#FhM zVicJXDWMp6kIlxDYxJN8s05FCW{V)g#udWBk&g@FPE?*P>vqy9K}sG`muTf0G1Rkh z9EFq<&|kSmroJZ;7dc{^EEkg+KX;Isl5D-4vQ7v@vxsGyr%z=iZ+?IL#za@|s;e9Z z6EQgmBe=A!JOo+yUJ?om0=}sen$XndX(Pfa;A9I;6X-Wc@N@LuJ_JFgJ3Xcvb0_N& z+FNppR2M`G7?uwu1q$;{tiKryC(z(oYOmn@GJ*3su^E?~w2VB=CfiQUjE4q0C;E*# zoo9C0fZoDqk(u}z=lPIGg>68bz1(VFF|MOOPhz00kPh|2ar8Z?a6}bIMCIF$#Zqx_ zXCM`zECtp!sg|{VER)$5Ck1&;4+9>uvmq6yvef_i|N>THk?`*X@?)L%8OA|pWm0jA3T~Oa3V4b!F5teFL^f9 zZui9k?X#LUFkhEiIh!=lSckf~7H}u6;1clNkM#w&yn1m+`EEB{$!Hyrs8Eo3sUPqc zCmMW9&!J=|KX}BDLl!SSf|a_MYN*;cOr5YOV6l@%RIevt0&q-3)sYD-e`V}y1JV#ll7JpHT_n|# zMy59qpksIJAi7@3w*BB7%!4nK$UO5PSU{;L?JWM|S7O!@4crkX%0H%y*GF1<{zB)0 zd0s>g6MrI_o}`7>^_0!(bOBjc(Xb4;X3iGtuc(&# zUZ+H;)*&leCN7y;U-fY=V@P0wlWvOf)Qk#B{xo0sNSa5CaJXcrV$ZvT%+TK5m|rNtqJe{nfNh)}Wi>tzDX|L5N;brndzyeo@Et z@I|^biGgg?yZLt~G=>k^p#^`IY!us15;$z3{@4mNkp^HJViJV=kZ_>NBI{`4?qNG0?NO;M;o_bK!T%9G zHe2k0%w!=~84%a0?zUsHV{+0Si4^zN#Y$96#$J!X7oxK3K)N%BqPFfcr?jcqOOsY^csUiXtk#xPR{#zWM2Yy-Q#ZKCMiA^bV{4if|2%QDiS(v##G-KSQ!uu~;(h05&x&N52Vby^BW=)#FQXmxmQ1Q?)JrjW2qv zQ$LuzjYH-vAKc5oz`OiH#+A(m?;oB*F(1#4LUc$Ur$^iPs?>0@&00m>ESz(eTWd1}p zQ**zk)tl;_8a8ko{%92M&9 z7ok$UP}IP6-8BkE=eo?1(oT&HU}SQqC|wm^0Q^E$gYn{Cp(&ebR?Odytp6sof=2kb z?_q{k3Ez6c8D5kD{BWIxHm&2=pXs`AJ>op!)7)Ypr&-uF70J5V)`pv^&XDu?igD4F zUm0eT?~f(C^+4(X=ZD8|h@<}?6A(Ji1xr5nb4$s1y2B%TIJWZEXq6-@{Fe0PIp=bZ zYAvn+7umh&im@&NbD@towuE+(A=a$tO|6(d#8vq zXJJ7?p1xW^z)yd^DwsACJ_eXZFKD1dpgguO86ufk2y1bQ5ARA<7Li}ElK@Dn!a9JR z|G7ZP?Mek&-5_I``GaNcmx}xNecdjnq77|U=Uv}z@>-(6nloZ(Q3k7~KF$lISijNE zi*sXQTAyuz8K`Jp>#eo`opG3};|zoA&UK7<_rcx|1_Pf!Fp7N9`3xE>r_&+uu74UF^Ax=9Nz9D91a-~!W}Cgxr?^tORpdEacSldsPO4?l2!Y6kES_7cudMaBTEYKZuK9Q7BIBWpq3$XgfsaqL zSq&j?2hQN9`kP99W$Td_H=*uEL=eA^Rgxp%X-5(%ci{PW4?C5Nw=jm0D5iNNG10XU z-VYD*vR>vH%5E+s+^4r6>Fhbw%jT*>V;v24NHr1}>{3(z5$U z_Tyk6al4fRr)I8#31(W9%$9U#0mpmLfIrNJ?=$@>F-PKSNgwLyLM+~o$hZs3t*lKn zPnzJG zkqGIpA6On44}U5$%T!CGD|3UfhuEXo$y*shCVje9^&EP+H9gdZ7Eqo5Z{_VY? z7WWxNW$E=DHa>$?)*{^^hyQr`N*iE*{IQeD*Qg(^SirkY@Q!U_BMx%qRB28&_ElJV zZI#8-?YzKNbMx;pch7$Y>IF%h3yu1b{JOu|1Rlg z3Ka6kybFTkpo%Vs>Wfuqg1ueGxSEn2%8UA~Zs}Y$eIr4Y-mkdSkpiKc2Wcj2$#YtzDbf2-p?|yK29Dg?BaG0#|0f~~XBa%tEDG2S$750D9kvzKCu-c2 z7CjdgAH@m`UfUCappiwA#XZCXOKvctt2HDI?dBmzH@LuEo*yh~8b%CQd5#Ume1MKzBNkpi?K7!G7#hSd97*3qc|hQ0Ew~Rpvx!3J7K>5_3cx^x zH{4R_IH<~BW$hfOUk#CDPbP+BzH*_+VLXWJ`?D*YUPVS~)K@omA&!n^y+7=1n=xj& zP$ZAF_*5!Ixsu~xK!j@5n{R%ZlGXml-FK^s>M)r@qH>g_s~6F1YQMryJAz*mE>9PM zE3%5lvzSiPd#ko>Bf`jW<^n`7;UiCT^}?rPnlZ<=(%wy~jszah=nXo!*1*ngCKqiQ zCd}geKSH$9tg3nA~A+@Y0n8^8<$cm zqD(%Igtjv#*&t)OUzcT>uOH3{-Xt6s7u27i;>3ZgNxJMruaKQ+=_69vTnZ5muCha` zmA{cW9%vc@0nRsg2nW8*$U6TbUVUVu@nq5GjNFj|Egj^s>LhZMBVws?UQf5c!F@ju z#`J}T#nz6OX#$@zpnbM+Hth<7!8jTG;I*$2lik1P^UTlHgNV$MqSL0pWZL=gixM1u z71JWT+<(1e+@m(@)F3Ypo3<_^lk2U}BTFkDI-otk7}GB-{&VLt1YE%>(I`DPZZThB5wboJ>H%Ywpr^9EobWFcNxrOl=}*oEFEfCUN6^ z2I%3P_I0e%fg%b-veczG6`xCg169(<1T&rN#vU0cziccMZGjgJnycZ<66ye{nKH$i!7j7T<_p zSt{|vTYxjtk)-fpMQL=qRrEm9M9DeT*;>6n*XZ$GP0 z-Ex3Dv@VSjP=zu!1TBC8UQSP5QpPWxILA|dpQxF(Y;b(dE*sa9 z%Hbed5zSDvUtk#()iec#5HKbrpL)pa%Dc zXlA4&(kQB*IX$B5bqHy5rx1J@PNg>BtrJrV*Rg>Jy>m#tDyZ}Lle371r2I@(3&;^G zY`AQ(m5NfrQ+uS!hMAmoH^`6Ima9iCa07XOM`YU5)l)$qKuBkEdU#oL8BJyj{=%mdR=n>mWxf+OusUgj|4aIHvXwzVo7|Bwr6WKgvI zJx=~G`W{U5M6drI-D#6t}tNIWX7n;!Mv!&>y4zFTlv}KYk<(xY;DsKqEXEB4sdWO;*|HIgZa7GWSW& zC&|Q&3+_YMA65V<)%#u#XIreVgqMN6m!7 z0Tya4_??M+*oa+|34K)c%fzk>X@Gf?X@>fQ~*P1t?OMr;Krlxhd;5^3))Nj~@5wYBn~CJ=>7 zEZfO~#+sZfVSNY|)S(lHn-`l!=Y$wYgLsYor4;vO56XjSDX`iEY}W>|)Wp#XYgCsI ztdps6w52%uv(v$&s{$A#lWt4=_t&nVymmXMe)A4A8jm}19i>lszto6((XEp3N1p>8 zL&mM{CDyr;15`1tEW?7p&LQlS{w8&!?ue*EdDG&;x_w=mC@?rAc~DG$tKyJ#nQuTk zmt*#Mlr&_#_M-Q7^Ugd+(PPL%NOIp82VZ1v*HeS}DA06zHw96+3+5M*ZB0ECX*+kE zq9~aQLq(WXJlgilUN9h8C);zN$fX4+HgE1M%cO(XveYCJYDIzdLW3A8B*Pmv*A%c_ zLzZOG|6cMYF#3pi%-%Q_ExLQQAFIG9mzmqFhzqW4a7hfVul&PHkP{9(r*{}#GDRaj z3yMsoBQ)rypv6ztT{Vn%6WE4BimZ6Q;=4RV7*@x$(vBYLn!y;Bt>b9c+qwxD&gg z6+zja;;ii`s~Q}~pFu!XTMIlThd_HK_GD?Y(N>!x2sYchb0B#uQ~vO;O1VO*g7I*r zRh{L8YjnH*wRbd%y`8h-8E!4XT?hkGt)t zcw6CEJj{pgidh#fOj25S$QrI_X=qh+uRRAY)l5(Y3$H3LjYyUItRE*>uLHWYzHcWr6{$Kq^NcQv-6>eaREoSr0o1t=O-{pFoZ$+~Ju&d;?TEkE z8pKcvy<94o^!{xg7<_0b*70G;Ce0mZo7U0if6T4lL}{-RJUX+?s!Br45n_zbg{_T+44 zzCjGA7*a7;MiZn+ekaAiD09x$Hu7|L{RzynwB+6IkiDr3qfRue-4nj?8c^3F2>}gqTr8SQ{_`UP?#REJtrIcr zhzLsQ*)*wtUKSUho@>eALeWs!67`C4k{tjcdFlmba$i3RV-FeDya$7X_3& zGgI89Yc07<<;WY7Cyly|suRoC-7(O64dP;Dq;y@Q$9Lj=S>RJ>@Xx$n11({KhY^2L zO}3K$|DFI4(eXO!UaYC3FNHcDwo*OpAG~=<(-?VVW+Iv1`O`M{Az_7If?qXu6}7PN z?7_+mSFMb4Aow~sPY)i1CNGUwy`;N$f$QLdA&+;m%|@U?;yHRCy?-B&H^U7SLuXS_ z=k)$5hg)TlzYB!5sRb-RXmZ#`h~8=v;7B@ggr{Qii*4cM8%~K89&Ss>n3>u`O7bgq zNSoNL`?kSVv_tsd1>ekxu!}nU+fg$9ywM!01+$w@g(zp)nv~-J7*wSk3Wae+Y)|RS z4*MD|dt$7BMmfX1IX8LJdOfWHm$zZj>J@6_W^)AmHhiYmg&KbPbo$M2hGlw`9juYY zAP|AYbx)SqqyI(yU1M3qF>DQBMV+#jHu`pKbHt+jI_F6O7iAOBgtmLfGcSTM8@l;x ze{71HeDwiPGTBz^!j)U^7Jdayf5=MX1TbuVGH>O-f&iB?`?(tfdR`c`UZ}rLo}FU# zav@s66;tTk6Ef4$hF@pD2N+%DunGeo_M*eR*x_nD<7yNka-oMIz)2anki?2UvEwjQ z5c(_onFt-ks<_B0qH$G$%#)F3JT1int@(f;?uPvnx(dNZaHbLlWyX6yjwa|RvFQOLE08thU5-3i2 z0M-AQJW7%FvOm1tV+aIUCcW5h6e?6^%?|wUI~LSARb?B^DRKzVr2kq;x7|EVqAJjR zFY22I^|&boG+^==kyWf>NhzwJ(CH7A=d|+25zOpky4$Sug^XwIiE9pv_oIPW31sH+ zD9v2)q#=OnF%3Kzn17oSP){KIANzkZ4reS#ZOI2bY=bs}8I9B%la`vDlf>WaIwrV2 zhy*aCKJ zvKp3=Z;t2H1tQ(W?#h>~46#j4PN_E|Sd{jJd~-P$;1fq0ROfRS$OI-$A&$R?6-zrd zI4-8mj?EO8W|L~Kjl(Ww{Wa6_4DHvh5z4sZ;h)W$IGci46tLt-0XU)M)V!XO3|$aZ z$PxIfzRVqPH-1ZQREeb^kfZjb2^8h>9I z{{uFV>O_EjR*0CYYdR)0#R7|Lw%+jh-<)5bK*wYqa(Q1XCx5WS-m_4zRD({4-B-A> zr7Zf*I9WR??SQWcyy!obXc$CCzd9fcpfS-|*qOQH7rs2%0;Q|rKl4nD+oxK5$?$uI zr&Axx&Nk9{@$o(~grx&Ywi-|^n4mvj|GP~#+}PqM1)68WEmW1bWKDFJF|#3Rd6iWi z=xMW>>>MYQ`IL2-3mELC-n|y`^2iXp3$Q;`W0!BzY`seb?P_^XXV~OB&bWNs(~glVB|Iz!BrKo^|gK82d0$Ot?`f z0;{<$l^AK1ACd^5LXz%UYRkrQ&G6d71NbJjlQY_2>SubEV(P_p*l?46(sYQo$+`eI zHS-gS><#2ED&yfcdY7Ntt9=Ygib=a{^#^$hO(!l(yaGTj1GZctq;P}fzTfBVA*Duq zI=QONq5rZej#1Hyb5to%{!+`HF`8c2^rG4j`cqBO9eR?&hR$|NvSq?5A#Urv+zsBE zwD_NF%OpV}cW+bJ)_`Es&-;NdBkuY+L)R}p#d+v?fpFMM_x0bfsTf-j{A{RMeB#5uCJpxOt6 zSg8!j)a>r7m2BO1B#U-?N`+i~vhp<6q;s_Wok$4yAaeANS|>6gR#V6#lzJ@yD1Fn; ztb@OcE*#D*xmwkjKJ>QO&C%is>b3$=@|3ve^hm=#W0dfAJc9Yd{N9ih%_)RKkwq%{ zXvP6a0>_K>I)WjD&T{9@_a(NNUPbE(Y`Rzu@?+43BT8p#T36=4&2vlP0ExVZ*Z7c@8&B^m<&k%+_ASEkwdR+} zCeunUNH?k13?WI z{NRNcOm@>+P91{^Dk48VQX9hrr2>3(I8IyQ5#vgjc^b^&Flxt^B^KB|Y2j|qF8H|( zfS_ppqPh>=%fNpsFJ78kLGE#!rLUrarHIQ*Wn!BZ{lVmAaL0UDZju6kZ5Z(KLd;Sh z-n@fycFYVivlKr%-{-rs$7l99K(DTe67y1z=6_#DZDjUDj-6pui*Zm`y*`VTdwc(j zH|%TkwVDUFDX0&a%=OH{Htj%2G^fKiJ*lD{GQm$%J{D$CgS$~VT81`FP1 zsU(qM-BWwU1|(;kiZz{**lP}e)9;4kS>$zui{S1#QY++W5269)@K{X_k4}64u#F8Z zk{_0|A>=eM*fuh7}kxb*{SH-mu#Ngxga@@+_>ayc>ZOf2o44o3q6L2CI zP4;Q&Xk1{?Ps5|GK&>lBDrMIunbBnrK}Gio((R4rdLYuxT+Cv_3|IKjw$8?p>`62? zi+P9!DxrVmNh;?R!{QL7PP2Vj&?#YAmW4h~Xkw4K^F2Ca2rSGWc%M@VrR?oZuMZ)1 zf0gE%ppo-Zw8&6hvwlIoys?2u8x>Qy-7lb54}S(k zK;LSvfE*3}fWkZkn^5!B~!oYw6 z>&G~`)?mfCy=BorC-x&z^y(*i&&qOmL@2@F6K(bL{A=YX)NbOi1YjF7i6?}yN8 z-(KqIQc5mSGZr5Lj>Fk+fmPI}`fNCv4}r9Dll0`q>??MM0g4pV9!xqdGyXfyIl>X= z{beKP=pkcIXpZv#ST-a2OxtT=%D*`NJr{+(7)OeqbLyw+epgMX zkPU9syurZzb|9u}GQw5~#%<$-#E}nGz~xmY;l+xtd^2t>h&;6*|0N%qY_E+K2E~^v zdGfuI2sRnMsgCnsQx+w4n&M%LXI>T1Q-98a`MT0QKlh>~O|vG;I#p!Pz}!0gJry3@ z5@i&OnRI&z4h#=C0)2cmF1VO$70eD2uE~Nw4UCH z6buEQs1>=%JkQG-uXMvR1y%1OqN~>X+qt+vfs#}R?VG2{EtY-`DL9M9nDCtIrVF5T zWDMvZ$mZC6x>;D&*&rs+u}e}4d%aFVJ6+47lL#lLO8r)@)23q&@a7Ccno#l?p($S@O+xrHg!V z(2>RvPXo1ry%wY=*_F_Un{|)hIW=Qn)e$7l)Lwsonyk(ER&9kLN@L8bsxI*5xM~i4 z6U~7kG0psN3)oWReT&zR?J)owfW?V8DC7z0zo3!GmQ)F;PKo(Gg)lHqQ1mp_##7JK z%MbwF;^#nm+lM9*U|OZ`gT0!XZy#?J#J-1vly-Q>>*IgsLI~y$cp1@tNq?6fiFXCM zmr1rq6N)F+L$_+mT{f1)U*l~7#7PGgfJyg=`k%0tP~vj!WWRA-j`Rf*ZBzaiJWX#j zlM!NLd^^sZ zbYpRkeus;brPbW&M_i@~C~f?r=3wcQ1V>@G?@@V6&yWuyA;Hyv9O- znqeBJok;r&-{MbE;Z*QD@kdsEbIT%#!&;JabdSgkp{!dn6SZMkzj9Jj*UT9yt8HXs zy5x1;*M9SfU+@&b3TppiJyC-OcE4^P>vGB`n!95q>pTvSq|P&UaE8{UFy*;(#ZBiK zAAM2V0Tg6EVF#avQRiu%*}1!?IgO#*Bw%Td!9^N0lz6xFF{Pkk9adx3my1&%)>S(N zhsHMUV=Ea3l(?jl_t>r%F4ZR;FMBtH zzp~bpXsx?Ot)ahha90h2@XyebWu>3Eqp>`kW2#O)kcCZ@cjG*p$!ViH&I*}3fs^v> z^Fjf_?p?NCvKJ{>NVb`KWAbXgN`c#<-E*8Ubd$=Wu1B50@W&FYj2!~&6Pdbs-@_h=&J-@sh@t1ObUAjAo2utL~W)R_&9?G{cCl;dS6f_+Fd#S;u`ofJbz zcza0bA+V;uOtAo^P>tQ5G-;(1$CeAA9w@tyIK*qw^Ajxx7GYbgXX89jeOG5qwc}HVmYYuj9 z{tp@ge;C%m7qou@1yj1PJ90?+$IE1>>v(JL>M$N?*N12R2!0Hd(8w*v(D`~oA z+ixo~R`}Sl_O!`?B7R&7&hq%c#tAA5_N`+(q+C_Hm-t1eetxq zsd<-BD?G;H*P`E|+D8(5dO<4stt&=M7zyM}8G%`Ux#IU^(w4&~SyhJ28*m(JH{cab z2@XYrE%5Y6^r28WHhZ}goq-E{jij?nm*9~I6-`_4q&QO?GS5X}(YDH*p1}Nr!Rjkh#hk>iy6IX=9kwARdK1i~G);u(44Pjf;5@9**1>M%tqL#rL@el7H-C4l<+5>H zdB=~NbhK4XjNVVQIe4~p;@Hl70#EO2n{wfF1}-3I_`%|k2AvG;;HexjYXb7=-jB-V zAn}(Z*cnoLIC~#1RgKr$#z*>K_r8kvy{_^bm2GeP;DLq>P1?&#E%QAOruDwMh>1La z{3w!mWSu%3w8d+v?wikE81Oo;F9}tV!b4&U%T~DLf#^WGNvT-}(<@a#zn?XY( z7JEfu*jRGq_bm!==P-HMPAd%ejZFl0b{(^~W$eTX=` zFgYn)RFU%77`6>;Uw96FpXR%(eo%~w7+@1iV_k)w8rbx?&LEc7Zr$G~vHW->>T>h| zGVC1jLA=pT`mfyGM&p^67_14q%#f>+0ODIUg`OtnpEjh|p}o!;pE5_yo&6)!U)%?{ zoDPWnvL`&u3C*gZuhc8w)lD6rft=WbajoaRu){6bn-vcTy9@0LwG!ZIM8qPpMpwQI zA<9f^LRUv{EehCW=dG_Bw8SUUJU_ZB?cyj&VO^7wYNkFHf?gYUPY%lZ2IHtijHMku zLU*c9CXIq!>1sHgav*2=D0l$HR)2)*=@8uF^In^+akc|%(E^;Nl#0RM{xqDiL_y)z zMpl@NAGaQCbbYT^acWJO9hdN*l$J%#@defyRSOrd_z&&5k%1T7_OUy#F4< zF%E8dELiB_ZMPGA0ibGr>cEbYlW=HcDhx}q`>vRlPg5U7lQZrA|D>IRbAj>e2ZIsr zWcjL^xj8C_Xd+y*hR4F|Hj4nRbqyLioUoaZ<{?}+iJB5w2nw80P5?VV#J`A5BNz2% zJwp#&nx5>#t``810@M?eeLzTxLJh<90Q?J?AAW&U^vlMvx{H?Y3p^Q$*1dHBQN*zl z;HMnCx-VC~@22!8kfIwOG$8ju0foTQLi3g`Tkc)5S~ZtQNlp(AF*1iYlYYN9q2+z! zQAHO^Q-tM`$N9TP05aL=+ffX>X-qRa>{~Y+T=r8OPHm~G)x*8kUz)9U!}UrD$sNF; zx|5XCFr&%Wjh)I@?ow9OyQ}M^*Ee8XdT#l2x;E;RSY{Z0w6!|hL7Y-$NBxu3Otg6c zg<;-GF8AE{pl+r5I=FT*yyXp+C+J`9gnV<&z}Z*S`if;c`q5Ui1*g2|EY{i1@kQ>= z7z3y3bWWOqvQW=NqVX6??iJN>X40_dJE=gRRwh^y19CXm5W)S#S-ADowY)SkPmuev zXP5#o2oWH#eFKaQq0NEBzbcbfW*3kNfz&rC%U7WWrl|afz&>3MQh6+4nlGoOmpHVY zERy_>4|8b$Du)%P)!Qn23xe=~lEAjD%)K;C2e!L*7O^v*Dvyn;Ts?W_76h_PdoL~m z-ZO^j?y{HthoZ)Nu?Bo7;O15P;G(YN$ zR2V{Nd|wc-3Z}5jpbaJ{XH>_RpbiHV6%ac9lBDe(|J;2S2gzDW9DG#uQ$?A$^-}`M zgVv@1X~s~#OBZ<-q_$ub0CidaYu>k;vjD0NRn;Db2}?QroRqLK1{Uo>*Ljr{M47cT zl3>wGTHn48H1BN{rJWUKTKKqTjELNQMMcAQmUlw{RK=&02X`R+Y&u2OMAkOm;A~i& zAs~ySy876MA0xj$XuiM^26R-4;Q%q}U{tR7OLRT{3dFHz7q)oMlqoDWC<_48C8!0L zx5`ukAHR-r#FL5i|Gy;H7$2SuhIQOCVB!Z^N%cNsv9PK8*XOP)aQ^^zz1XLD$QDn5Dohv1jMLLgH7L%EbBH{0 zcm}43PdPdTUMqg@`jIa`bFAAzVX5E?B4aFUtlpjI^d`h#({gU}IyX2FuTY(s$3Qbe zW`~w+dcc1l4xLoQnd5$_+5bU>;E)u@Fxt>%(qb$#bNZ&>R{&PU0y%UqFX1uB0k=;J z(=tZ3Tm^xk0a$3uDr4+~2iI$fbVRA;3w?v1B|DW1E%t!rD)_t29|2_4D& zEG0)%eW7T{M6g?=xhC z)Fz=*{10VFxQw#C&zP7HX3JsYwPG`e-xocAJ^VsNe?4|Poz$-}Ice-(QGKC09^Z)F z7l?=v_Zbkz?V3~`rWv`oiP9U#WTMzf2DY`Q$wcZ5;WxFMmhyONp%S<4U8vZ-Z0^6- z%isV4jHnHB)^%mN+Bbw6`YM%OvhLCcywJ|XZ#5{-Jc?5(fIw^QII0y3!(GL+sXT3u zNxu4AjH~~JcA1|7z~GeI(o;1r{1JKj>dEn7{T!og)f;0n^oT$H3k|F zqO$A(osPl;&G6@b1}uQ0Z=4g696UBMPV7-%F@u}mdWv*JNg>h_kPk8Do{97i zI1#cOzLK*9VSsRN9|IAHuSJAHk@dpNw(*rXBrLb^I@ZEfgU?u|nyIo6oE+iZ6G~<= z7zCJng{Cp8d4|ET;ju( zVr)&_eW9gA%0HJ}6wk{r{zT?OjuqW|rYVV@IMqlztB6?cyxVx)ZBHhP2EVE*8w-!w z(0AuWD5?;CznGuY9(_zc6p}y0H<|Ecj5RrEU>@BCKoRJ%6dR}2pL(_R%F}%ounSIj zUbY?hREHCPazLyy=`56D$}i}!6#u{fZ|bE7)x8;9b;EYyyGs7$U%}0rF>%*nihoPJ zDh)Uhxm(3A0;sZ)RUiz2P#8TKJT@AS6z{VY?|td_zZ0Te9}1#vR@ZO{m(~80GEOqj zbIDHE=yPVF|Ji^GL1}dyI3hj0UZb}dJepW~fOe}%9k*bHX9WZURL*?3r3h= z;6)l`AMb*OW((cEV`+vrj>)?2`RcS=gFD>9g@rk+G0B=vbxrFFaynLv4zwnk#`Wf9U4Wwu_wCzL)hx(K}H!Gr^9%94S<-f4I*;G5( z^`xZ>s~@D5V<)qA01%SSJUPJHcI(dc3N_(Ro|<4!EWNa$NGTG)R>hxQ>Q^FYlMm}Dl8%STKdkAv< zvxiDoT@U4eGmVzXG!kS#cec4zcP|y&!P5|>akd!ISNTbV9Nn2}I6U&r;v|;6E)DLMsMh+gUmVE8QAVoMuKM>`ga?TPkL(Eu6LjhRh&C1IxalTQ-zB|iYb|7DXM zMGK8fZ4pq%nAOmia7tH%?*AS$OB1~~c1r@k^u+!#l`reD9iQAF(Z$W3%&A$@$1Ao@ z!SkzEK z;hm1-U;{V({KWAmUjQiPTXw}1Rk~B+^#b)V0JxdprugQ7d-_&|nIX!C>3S6#7u(+6 zsviLBY+=?T_m_hzoP981^DR^HgDl)}SavMZh&zn!L`l3v&Gs(_oxM=#tZy#Gxg6;D zu2BBW!U|x``7stXO!@?9t}!i)dJBBQtVXQ%=vjfzPwMWl1YqR5ggVWy^W_z?D3;Gn z*+dnO2dgW#IOy#y=%UtNi&cb%vkWvdBtH9)4 zSnL||Vzq0;1d3HPWaa|bIxJ9h=dSGKOHxLG!yQ})^_&;U|ACcDke9ai zSNF9=+GbVb+)F9XNT3h$Y|pbvLB-?m`+=Z*SZ*Q9 zUb<#L0PDsM##tJ`^9s6F;^IQ)m&$Ac>$N@F-_n8b4vL$(=;tJ!xqDzT5CWH~#6;I1 z-{Ji2JFy3`uy;0WLh}A2SMg0~as#-0%OFiSs z0W>uP5O&ruwj%&X&ev~=^M=?ZLa+_(oSllZ$hRQ7BnF3p@!vvT0g^-0Uvq8Ku@fLB zLu*@6c|;U01jce#v0WUHV$bT={Z_vw^TKB1+M2DR534R>0b=<^=3;ZD#Ih$(X^75n zJqWbuj0muw=!9UXsF|?Q!?fSuUyBJ{*;hP&t;BK=-G#WE{VZ$E{ROEn%?{n$YTwsSW2xj&9!Z^)ya6%Hs`j^7})mcso|Y zKFZh3M{%L&K+u;W!x}^eF6gB(1;vrTCA2qyVbt1{YXYMJYbuH*Ls}r~w;Z6l@qsm- z<=|G7ax>;wGRu+(<=Ub@;YA5XPAlr85+)<@>$aKN7Ar?wVP4ggq#|!RhFWQ4PajJz z1PTAna?f8w6KA_S1Z17TskDcF)tfv-yUT~-{2m#g3GN#+#?q|4G~gcFcDj6(ZRN** zbRQhP>-0gr4_*7>LzGe z;3zrgW>0TC=Cs@>fIagG*46A_60bLbtm%NG{W`K!vyf#ri7f*H0z?W`egar=ggmZl z6dx&HXkhJ|t{v&>E9Ex41ErbBUk2b;8>zd;90TsQ7MF*7(iaT1hPpN$U=I#KaEs`7K1A~2qeQyzq3A24IIT;{{WIDw$^IC={Q1Ge|syD@FuwdEU!wqmgx7UaX7=$V?uckrg|CoDH%Hv4Z4X}5sf%{ z-MfFdt`&Reg#`@X_jp4ajGKL^frHf~l?k{)6R}Q2x$EYN$$L-&v!jprCthS;Lb-(k zt9t_ij18byia~}zm_?N&oB7{*n|Cwi8<7*VMf^TfaxQB!aUAxWZl(~3hd<7t&w}L4 zMz~PWlR$>2`H2|KwC~zkL~znfzY=mFDYqyFXzV&K69Rk3@BQ^$vf1+v?D!l@_0>S& z;9O|}HP)V>uqA(kls~ z!;k;9Lz>5LX<<&FK8gGN@hD56NEWphp$o3{}~%^8AxVtOLyY3DChc~gm)1R__lF5ICCaz z6qn%uG#Q5{uh02LK>x}}D2O)~h?$0JUPQ8OH`WYt(dr0jDIWlI;n7H8N64mRQGf|i3nV@23T>V9oowysqHBQDiU2DcXn*C-c#0kTz?3?6cou^})!7(zr~ z<8a&!;Bwc^zxdtE-A(**n=@GfU&anUJMNJA_YT~Vp(VBSof8j~eGMrd$sM`<5y~9H z2rL#&6Z*qczl94G3Y#pTTGkTLz?)AnRb~MZ9=rPc%UFEF8H?Rxg|$p#7{XsRTENUP zWF#Tyd@Tv(y+En@zcH4^T7MMEk@~jK0yq&nGe28F@CJRhMS65UD#LkQq1u=>WQv`n zfS<=OU{3%&Z}p<`+HXZCGyZ_RS&mTZ)Yzbn+w04cot6+oGF-j^;y=^ca)*RL>S6wU z9lO6%N$*jdd`M12u9#qOd7dZ4+7NMDNYO8fL+)*_$aMPb zYvKyX-kIwOcxFf(-MF9Gp`r~i>`z2su45Q!GtMS`BOMjQsR3RPN?(Vg&i9i}}Ldl}j2krqCFqEgX=67Nw;Sk-NK_no00Hk9|vp zd|q`@f7Mbam(wG?(Lh%p-}J%5_k4?M-2XLu#y2jbpbVnyYxPPy_`ajp0LN0HZTz<3 z%7&?5@6o1st`gUJo!m*&0k9HLMUk~LO6SSP&5KE9osQ^pipGKnCT3>C7axL(e}Z4P z;RhG~(I^%+8y`Vis<=Yscu>dxdFw&+BT3UtWQ<~~*rf1Y>M{9qs@aG(aXJEb^sq5z zVBeXk#QGxaqJCx*p^IlCs+s#JwD4U-5{mx!pn)t-zjfXixqo5%UhEUzG^u5K@Dz9G zkGo}Xrtq_P=h_$|KTS4hMchtn5&QB&vL^#_^9J-WyS3IA zkaUCNI}?IVc%lsn#9KFAx3QJqAcfN)QB|70HLEEBA)C-DeSQXUfK%LR1d^gO&17pD zpfhaqp<;i80V~TULr})V08r|0k8fSvQxVdJuj#o^v+LJ8rB3Cxa40}xJXbkEUk@%x zd;TN+2>o&huxL>$ZTXiOI7a?Xt*8P{TKDHWTc`#`*WK7}ZAV*h&26i<A_nJSV#OV|pRM@u`{GTp z>bKrzkyqkU4D|@|8|7|^5Ifuo8TNv-n<^%Hjb|vR&esL-e+)Om$0ysaqW-R9oT^F1 z5FoF>)H_wRZO`*L#J$dBoqdRvSt1$)E6Ov~M~IqHmY1E)j$w(Xu6Z1G8`q><8{8I% zPUUgJpAYLm-ik#G3W0fX+*=vli|g(Gxt2qcF5{B~^5m%|j3_V2YQr8p6hvfBAyk-m zV{S@5%*+vL`d55BuIK)Ib*g~+qyu<|T@B-_xbN7(v5A4HW|*s)-p`u;H}`ARX1gp^ zS^UHuG^AxBwAsU(Z8=cxeHHy%NHaKGVSp;4X|1M8Dk9qs0)#Ld4Q`G8U<^G_>4a>G z7WKS4ZS7uOWg9X^ta#a$w=ZnfGKxVB1I z4m`5{ljC?U9+glH434wna99i0L50IlYFK?I6-TZzWjRM!d}EE|RSviOa~TDJD9Fr* z+qYkyv*9SLePr9@b;ny9$PXT@Kkf2ea&jMq!rm?4-?Z?}=e?|c9>A}kD(&=&fT6@h zylX9^$I?L7FIWkQn8l}*_D&A7#HScyaD{n~L19@p1KG!Ss8D-e*l@l)09UPdDL8Eo z_xu>wdpZ7HoQHGK9gqwYha!fs6R2h7F-U;YU48)vqPY^8|Y5kLPi@ik-la|v7nW-62h-kW2bB?@fOl@45S-Eu1Q zSSNCbXh&;cvX13})!Q8N6`8QL_XqA-bP9Vas*pyKO(&1iZkI-g84g5z%o@Id%Jqj% zq+!H!*zMEzA6XaZzUh-?ZHwRTvcmtrwG1kTF;s95l1nz%z?pK&3=r1|@*VFqiTk`! z7dH(wi3x(T8?X$_jZ?fMY_F<<&*mEyUPqT;uex;x5PGHokz*NQmVXjCDTdJ2W0pAL z+Z(1g=-&n*vCeSjbFSkWv5!pNIu~J@mwrQ$ugouvpE zi7kq5vV|oXD64wo#b8enf;A3MbH8DYs%R5=vK#TH|~!^;4YM`*n^$GBS62>lU>* z?b#(N)cId;K0G5=C1FQr%v6By=TIJ&wL0omtuxU;>!Y|2tK|HlawkM=?W1C%VZO^T zu40Z_66JmV_u%)k475XkV~4}>23Cysm}lLC!`ePJ=C!`da$QHe44R|}R^^g^H8@m0 zQ9XVYz`I5oT2gs6PDtFIMQbH8I#(#W1FwRm444%V#Z_N)@3Ri>4B1It-TY(8YGh11-I z4$7xqoz=e&`0-zdaE%g*N#BC@@SnT2ya6Phk#mjS_ej#SF|+lxYe5k8S|tE)7E0Ei zI#9n`BQ+y(^+_hXsn&4F;)k?`2|Y$UN3A_Jrzbd|Lber)(SC6!bbh4zDMi#giM34=vhWB0hJFnBarF>wb zP&F3mZkT|RAu+HT^Qhr^&$@BDbebF9n!>{oI*(g}*pcI1624Q2bzdx+dUO>1-hk6_ z|3L3*n1pB#u*5xOdMpc4xhRV4GyK|iU19PBJo?td4;4pG^ zz}!)2kH~;DYE5o=*o()l_$*yj7oEI<&w#Ywk@QMdaie8oB4dW|jtbqYfAjtgJl)u} zdyUVoNOu@M*6s*4lYWzlCy~VaU2!?Bi6*2{1c%1NckAoD_;+JYj+zK+hegn=ZNQXl zZZo(Wt9?`oG|Xl}i@9UfL!;UWvWEU0=AT@c>p2`8!*T{yb^pqcg^<=pul&*x3r*>s zcF$Ab@}x9Qtc10Mu~6-F0`c17hIm9-F#ZpHY-36PD4w<_p^v+rjiG}{=A6Akq!duy zy|B!;3ncGAWmNx0^UJd5P9WLRbriNnd*_5d8yseGoq*E|jen$y@Sx)eo`Q$NueeA2 z_&C?fL=l;VbG!`APh1qK^0VnxCW*>P9is<0W+kxn2-H58Szcy6MyYH%xT^<)=u$M- zqr<5{fL)9FgNGOkSS*Rmo?1I9b0v(~eA{m0Rke(mG{x>K=dO!EE!xo7y1*s#tWJ(W7Krje+PLwkB&&OGWGR`by_K%s zI_;;CM^7FJ@;AaM!tR(X2C;JXQ-u~qb=t|!V#VB7v?(u?u~euYk|-u-A;pmuPLMwR z57vcu?qKp@8oA=NlJIq2DUT@nRjCsY-+dS~tEMHlFSuJ+LuOqJCifnH*9?QJ4}J(DCAZN3vZ=-fDar*hOgX zcUfHNZMx|3^C|$1GR++!oRabS$YN66&pxBXi?*iCL?8jhKAlu9Et!If-4aKPnuu_G z9T^ZRSW1RkRJOFg?;-|ph?}guqezhfmsV_CJwJQv$V9sqCW0z&P=pnKO+*x&%F1&s zt0Ws`7DJ=IG?G$_imR*@a}Epx9m^fWJ*X=csx$)^IUN=qkLYEv)iqY);b?R=go;hU&t5{$gJjEY0 zAe#Cp3D%Lvg)(xJZKss&#N-dg$CG7t&{-|HRuKD7v66D!9p(R|HJG+l*kZ?}s22E; z$D5jU)T*PwZlWH-0zLHit`#mjka|NLXN_yJWf2S8P(Y`REuQ??3TZ8ViAdm12dAbb zRJB(HTR*&UIP>hb3#X(ulE5%6t1dSUHQmCVZs02$PAzgbST+x=91~;SB{}0Nya~jU z6WAj0Bh6xijhH1b*Y$-7`}a1OuLew z2r<=s3sE!$ZlN5RHlky#zy5&IwKM6u4AcqtKxpaInv$_ORsd?yi{au1EbI`*$8AF| z`P$kNI)1u+6mr!&JnSv1A8G;#I>#}BHS1#udI=B?l)6|{J-wVNSyQ`_T6H(Cvr^x+qV*~vk^|=r>;Er#`4@2wuE^GNbFd&2qda)*`2_;-M>B-` z2(VhdF7ft0UF~Eg@kY|$7%+fme}eTT#Ci?CA8rC{6@?QJmuWlM6acPE#Bkcbe51G8 z%YmYq#Z~8PCEGz1l#EwO`xW^RV>~2r=tI@n`55pA#;t=x<3vFGJnjrFB?ELaA9{eZwkq|A4$z*t1guVkMQ^IfkwJlswP!d23EYF9@9 zKC{{E1uW6D7$qd0gm&Hq9B34f<6#YUWO!L1scFM?(m|4LQeYto{BOl%^b{T70?e@z z=OstQ9Y{PZ)oHOcd`Fs8@LrO>=PzwcXcZr1HYlr3oD!zlwYYtDc0&`i$UU~%s5EhH zJ-=K#^!Fdo{>-{;kTRlVYpj3+3xO-XYu(+xB}>QI%O|C^03-3U5JtXZoq78&7Uo-W!G-CrKm9l)u#AQHyV z4$JH&#qqp#^!n1AE#SpbR4O@CaJXSDod(?&rTU4O&`ss)6v99cviI5dSgBZ=mQX0U zCT#(BTw;K_4UNZKR7TX$6uBtp=qH_s7B$3mxwI$y!)8)&+bV*iOS0b8#WQ-CnJ^sK zz;W?>D;UlbiUBCI+HFv5-Gzo!ogALn}@2)+B*#?yR$|dh_o< zDqD;KeWt$25ccoq2nDe3prPhpbh7fNcPn+zj&aHk zX6#Akk!v*!HwYDsk1m$iE(Rzq>_uvz4Nb?##fVH0K_UN;D?f1Jv9>8|x`DYJPfZhm z%I1&xyB@a3+M-%*i9Nqzc2MVy?deZ)1tCq?@wL?&N%v^M=ItI}*)rGmkxIV(0GQCc z2h}7+^|WDKBvz)s4BR@}TZk*W;4J8h0v3A!EF1R1k>mDO`fJf!z{`(LKRFWR_#0&9 z%Zt8?UO(^O&S%T9JMAw97sHhEdzp_6q(dm;QuPQko+`PyK2PU%M0Dh4cv#B5`m%?1 zb&CeXtnAM>Z5xDpk|W{nTK!b~o?Z8qJ3HT4?|zaw=zoy=ASr&e^;T$BlrEP)Np0{x!l^l7>>R zgj5ZfFOdKvorCbOFR7(I04<5)Xwdt%1ozKC;=0q?A=h|dchL~T6@Tp`iFg_=IlhBP zR>XUSy^(8JyDtKyptB5_w6*}QtkiB?hBY?g9R4%UHxR;#jrn^VAcuftaaz;F{Vy^M zt*&G$%b`wijrl_{e?F6oHErBKIoS05cSoz+J(R@r%`1hmwLB*yXhr!Kcm4yF(3ww! zQ&Ix=fT+SgIx?hs3aRJ3XOXw+7Ay~q%R~+U>9tR3NEb^b158}B+F5q;WlR9m7hSqP zgkt_<1$;2zo09Vpe{mna#j1Oet1*+N+9ihLbV$Cn8JDwn&yhan?x#i6ZY*QJ8FXf; zhJ&USDeY6(J0)uo&IQsZ^IAKNVlyrS#^e*RUSwtefwK!Vs!Tu6hx^H^R}u(ZLlzW`AZ^>QD(h(^VZRVx<7g2Fvrcd`=B&!nYRb znALyQAREZwGoaRXS;%|_2z*7??w8eYI21SmvYosx)K^W@?^$a#f&_C+FZ)vN|46PH z_4Kz$%&qo7AHm(61XkTyg<%RF3>{v?gjhWIHXmo#WPvRJ4X)VBwHd`gOuN(w%#EjM zMxVbLDj4A4D)3+9!I&YV%wO9!xEg`Rv7kPOk7cEM2J7+L5_c$7zviDrR<*tQ<>CML zQ*au8y-O);Fz}-YJxN+W9ZQR42^Ng$+k8`xs%y5Jo|^tC%6TF)W3oH@VzHjg89s`I z7@H>GGJnUWN-x7}33dFEZDR-vv5Q^iU*-I}`>NSvj2z45e0fZTRe&YGsx!2kZe8an zW>oYeZ}`9UJ|%T((7LF!c58L#7syq(Wy>d1wF&9$J6e^=ConV5wg8yWt;oySJW<(V zkgTD;-04H&-Cb9yyCIPn-w&Ll(zI0=v|-N;?6(z~JeWBGtY`%K!FskK!wjQJJv=Wx zEw&s&%ZxNrVD?G4a0}hpiI`6}`27;vL*I+i2O|Z&9m50O-v1vHjr#yb#+M#%251N* zHr0nqMRJ$!+CA{wEZg@rE9Yf%TE1p@*j87mK3z>j`Ih|9DSSt?D?35ttU2f8?s}I~@vRmZ~=V8o5 z+kpc+hRqaF2riCU%f-@=q4MdbO7SV;(Eq~$z-gwf}b7)s{+Y~n`VYK+BuIa z4OW6S*=6U0-Mfoe*6(amW|B1K{6-C2!c;ycOd7pHDbumODc&V+5snH+Vt9B!@Z1|=NMF<;_67T!p25eTvack~~5v6MFC3cMMAit^5=({$k4AXvyqR?zIV9!_S z5lu|y6YNkF+3VJ>TgjH~BPP|SzmUN5y5IU(MV!_QqBe#Cw2{E8yguE}(O@VVTt**u z6X1$3Zv_LW{fL@bSY3GhK?0fL>00ZfC2(DXO=HafM>Ac3$(n8$PTx_iuDa?WJ>qFzP?dI_ZT}cZVzi-n*kKVR1{W_|A#IsScEOI1D*re zbOEP}f_k{@;*`l#Qp2mY6XsN;1@0)w7IHOv?k`^Y0~&~q^)lAeh?=h>qOUJ*Sk_ys z!IDh2s&_CB69MwrYV&*w^s0n~MY&B0&VOSYpW;U^)&F9s^xNkJ)@MQE7|WilaodqE z9cSa2k~ltkUT36*9eYyjbLAi;cA!y-ttCa!eYV-{$I$5WnGHq*7%6`c4JlQr&)&k# zER=SahFzvY>xH3FQH0fe>Y}sma+|uZweHt;G(M%3aF(Z!`aO28^FClb^48~e89L;;&V1+`{yt`!EX6z^^Y6LRQJ ze5j6AKuloJakoJL^I?S}ucM0U5A(WR1zKPaP*Wrb<#R#Ck>$fp-p#^kW1A>t2*SsG zo|U8g_IOG0EUV;08OxS&)9KAcTHhC$x5htVb-l^@0z9F6)^lq82P4rA%v97TbwQ2g zz7Z!~^0*Co^+!W}@LCYn#x@4u*J)>s5J%EMm*>5QLX zIiYD9o4x(0>yVLEttIFWG!a3~TIksW*p>yZpA|O#6f!Ynfq~R8Gg$v$VoUFm5Biug zOw(doZHZedm?RGqRSOqmQ8W7O1J)UbAAUMVpnSRFq#*`;OmH|ZPrDrweT1mbj@?}z zyH=}dok5we(!4Hz*-uBCoN!~1x@YvxTz!n}C|pYb3w3we6r@W=N1-F?5Ih^bML^E? zv(jV&uhCgm6snPjhvBKrr|;7_g(ulYlJDWc_pI`yV&Hq|1SrJ{jIF{{D96<73csmb zVW$zOEjGUf#FUx2zwtsT7GZIUs0gcabUJe1QLL$MgC5KLN$Qsy5IfskbXlX1f;s zPGuojAh1z0gurWo+vn=N8^VRi0K%`FfYwW3B2B(oT>-Urz|3cqIw zV%J0l%iGhM5;=1G_3b`x@~(O#=uo5B2X7TnH@&;Wmp7_6j#F7>=+;P=kFP`gqfB#9s^TNOXAxo z=md7xbJFT}4FDNxxYA%l_?xNu`{E6LoFlce;<;uT=C_x5nR%wvVpa+_G7VcjhT#?A z5BjzkW)646)M@=Q{{n%_v~UIO`%ovS)_WQ_^uyvd(AtY-ULmH}jgTIQQ>mk#8$Vg| zPI>dHa7(ZAvI6FTJ=$c0BV12}d!!~SIq}bnRQ!I=WO@9y&oG5^0LP2B4AuDR-3tA> zm^=_N(1JbkPy|sYf`b^DCmoiMhpE#?`7)Nud*A)xwiW3DCEKoa@Pme}F%tm9SRUN) zRR8jux#G&A_2?m7X%SiZ99vRB!+O3HMbJ3`(iJ3S?9P5AwLgBQ42T{9ei-mi@(^_; zzghGV>dc(WdCrqF$12Qjb2PvUK)gy8vs@L85t6rHu z5*@RyN!PaMs?x_e3WTij>7ArcyxT}n%)%EFG0v~Q0<^iHkNyJ{86P>m|3Y1lUnvZL z%OwTig$^eY$YBi_1ec6`+%IK+UMID&oK)4IP9VhP`!>D|el~QjvO&OL%kSQ*8?P@- zh1_IcstV(Ghuqh2>S&shR3iDaz8Ju^_F68I^e~1S*L?n1AP!^1oz+5%p(MM6ri@%P zbFX=9Dkjiy)=dSM`phBDo4@6RfmLX=MFWXxJ8^4VxQv!n|4>Lh;)Y~_A!g#@>r-CK z6C^I|U;!TtIp=BK&XP@f&xGk`pwQDxY{h$9?~_R4-iM6%jpzr2GWsz1#cVx;dnZni z$H}^I#p8Q2km|Si7-5DYzGA9Hb(92}6_DTwAn5@_y?(!!hv34N6Scgk-_;N?QL48J z%vN$us;&g;{WCR5=XEY*cs95Bg&RZn_fC%$`JF{a%Y0CT55R&6eN4axSUT(?%#Ka| z{y(l>lCL&gH3eTZxJUO^T+#kGs;5UVkysSlUiEPP4lH_xN!-IPfv`)VB}L@XZ&?0& zy{$tMA!2KTGl+P4JOn8tqI%qZd))^_<(g=ivU|xxWjBK?6@)RnDyj5B1sixXoU8o0gJBZn`8IJt%`>V=eSq%-GqhSR3;pt4=2lwzKQ>W@ z0@W(ENXaeWo0#i8YP^J&PT8#lN(+tVmRp+&>D+@t^u%)4KZkYS{}q8*Ms=<*j4-@o zmibH?B6)ucZfazjugz4tL;c4dOz3gKZ?4s|}M!u@oG2$~i%0Y9BTE zf&szBO%1Vzm@USRw>M}Zm^&egcSbiI8s>okT8tF)OXchkC=w-T@>YvmLM^ zV)wO{Kk}2;e1OwuVJNn@gc7&rCXCD&xa^2a=iI05e~XYh;6-Ueg4RF@_{ljRrLrw1Ay4a!|;Z6=LR+JQ+JPRTj zg-|^WyX54+mc#h<@B_Vp%)NqkKo+T~szCal;xiiq7U=4m+pL%4pUUU?AoVF;9QoN^ z8;uNORoxl6LMmXPJq&q!&S)=Sa%baw)AVn#EYcru^<-NeZw6wFe2&U&I3B*40QTl@_ zFmkN;p}Ep8I7?epAAG2#n4hE1od~KHsFv4gSVn;sB;3*3) z1D+55_}y+kpYwKy5U=4e!S2p8;}i#9Kw9>#>vY!$psmXmY7C#u-_!~_-ZtQ z7mHn1rU3f0iawzN{uXuwplRfYs~xf^KsgrF#lLtE*a4^pS#pvhF=)%NN+FugJr55xOw7TU>kuKP?&ZUX5KK1wE< zbY#$dsM?lRealC@Ruw5ujIA8AoH!#W%}>h;3x!uaKNV|hbc|kFOgHxB#4{9s!Zfy%6o;6`XJmPP1BdbCdBVw!y4&TysPV*5LV-7i zbTmv(<-`c;G7G-=EEl}S{bF%z9a=QpxOBjj7NAG(b3U=Z=H|CL|B7rl#3*iB1N}M6 zIhqG}@<*$L{CL}`$)S$$uSzdvi1!)4!dVgHok4n~x2`>yZ)s=w zNrmpFi8TbBTf(SQN4KRT+PIy*?W~Oq?4tHjZ9yU(_2yY>vIgZGg8LR+l7`x=K^}uX5Psxq7Aup#fvoe*gMHw-oS<7m&{ghvN|KOJ;463I`Aft zmGjzgba(jLn`0ct%u2cK9&ksb{@_Hw8T)J!fNBKv7(TMFrUU#T)jORMF=ga1;+qjN zb8~)0EiEty`fUgD->KM;Ed+DB6wEy_GhJUzf29ZOgvSU#xup8U81P*jB5cjsPJ353 zSD(e}4B_*yTQI^ftec6TD_%TZ$FK5T=CGEbg@M6S$yCzwcc=4`bTc-v@(SW)_y|CS zfhUWSjV^x%l;nZ+SUOCzR(*Qg4&zB$rIesu!%- z6&F871=M65^67$TZ+qCxg(i?y&xPv;_ny{<-52|%<(_VjwI|Ng(aSTCvPKsG8aX*- zjvhvrNQHZnXhAw{!L2X#D%-}HG?(nr%F}%$C}Qepa}Q#GV~nbRcHT1Hqch-rC(pzO&3=QtY*~TFb-A`%wV0^Z8hePdWkt?XmVE4n{Yu>v zJBjQTFpQzc!8C~q6w)~oO~ihFoN~h`>Xw7g`JpX}B+fak^qF@UpptW^VJiQ(sE~Bb z;THg~;C`4ZA2E@2{x-rr=HDqc7R3Py0F|_S{46g>Ytkc}!2a+3KHTnb^X7u3hQ<(5 z{dsGp(7s|ygqHKnIyF(QcOXFas^f9_VCSn5Ui&vWe2eXfE3UTaQ25(fH(qs|kzfM{bg5oh=13>_bUxjmi%XLz z$nZSkNlS6`%c{|uG&LP@9aXN!o$KopCe*lfO<3t3a;2Ty|2R@ivN#+KC3WmHogiv) z10^04@&GSD(7)2*>Hx~7q{7MQPYKK;nr`IK`H>Y05opM`GC=e<9#uX4#XukeR z23Be?RbvUf64==%kW8E{q2Y45cg=f`RJL1)iAdqTv1iB!8`M-}h_{L?9d=B-@-+%) z-cA9BP*;ywI^-L|%Y&vwe2YvRziUF8JVWO397Tu1K{yd{uDo=FXejLxTL-`AW z6C93dysE=m2rPw`ketZ+RujLQfFNrEai87@oN{bR@Nt(F43Jg;o<`UKe*Iwg0RiUR zXq8AVRIvI$QPYq{Yki}_$7XQ4|C}ZThg}Dm3bBd{p(b)dRkr1Of$O4DCu90zPkJ|F zx}AY#rN=&0gb(uLT;GpPpGnmqFXK=uZ%V?NtCdsL0)GY)qWZqH1%EY>B=g+JO^8~@ zWD~-dm#bgio8ueW4D;fy);Ov2_?m*1th44j@d4|pjT2{%(TB%i7K3|l4bYIbsB%u& zlw_CiuXd>h)l0~i1ma^fM8rSgl+)@ur$!7eg(tX!(p%ppLd3!$fS$BzqvG4*e17ws z8PaS&OS5N=T$sQJkYrT<{Z4$M`2t&{)?jW^y#_9P)@DRXfgOWohnm_+NUXn7xE{#v z*nw#1nw7%OgkM11gqoYj#uT?v!|LzZyq+hOxB%pFA-;hZ85F_YyBA{$cq~_i8CVmW zR-3OV8U2c-dH%+FXABtxn3jH|R`tEYSrX0I?0X+Ew!tdE?A zUgVxurLYg=<o%d;a#m8crNPr%`SSO8;+b?Ukdu{ ziW74uLu;7h#vxb9DhBamXA$?ILCpuPAoB$fcO@6du!X4Wz1FK6QXaT>7nszf1;moJ zRUMBko=wI{k{iF4<{-8TyG%1cF#p$erwG3ZO9LApnXKL3UeNK_<;}W+@q!T!yKA%C z;#vE52C;RkD|2FZPoq%){e(J!JP8+LELOfJgWLEw=HGaIH(%Z=i#X*V+=k(|oKPci z^|2W{VjTj)(1SRT*`LT^2=9$qkJ=ur|J~{ZI+O!;slKehlYIj-pUzAEb-pUPH16nR zn8^`{mn|^w(`J;Z*Xjgpq>>qlA8IMu$9Dr0T<#m%bhnR6_PxsKw2HT z>aceJu%Ei%Ps;EO(!2#%5OD$>i! zrfltZIJ*igH{tr{6!ivwL;1l{6u z&OFmdbHAYf_tEcaeg3wIGc#HVxxfEk3>Sxa;kQ2eC zK4$LsepIE5^5s@4G-yy^3BIi}eKLBPX*p;D5r`@ zv~KIy-H_lSl(yj+7qyLqcp?Ma3~3g;l3iN@$+nO-mwjlb0lZlDWpFGew)i*JN%}|I z_wap*8Z1uS_4|eUQI$`v1kA!DR%yxoj-ENrE1b>+#P0D?zLi5-8`AkhsNUpE zuuGTE4W~otH|e_}YNzs(w#@vCR>^m?M8dSgE00Mi@jyv9rVU=>FZVlug-2hxSM>ltu0IBLWfz%D5H= z;Rl-oW0k5PkW@p}jGu5DgrKBSP}L#$0*-5RHOp zp^qDTiSFGF1am=Mdqdo{(w~C3HbCILKR@FfqKYN%Y!d5bEFn}_T44CRfF@B6!ELi- z#naY5xIv*6E|CAjK;$jKzHY^Sb0?2G)tjx-z)A(kgNOLci=^3iT82uyW3EOI!~ke>>E})0b##u>`uWJv2)z>^kXKp!&71#Bo0k8Mso^$#;mmvMQRe# zBhi3W#6|qRb_O#o-~oCKqpxk~K9e#o19;#PAXg7l5qW0@np$SxF;xmz*n-N)$QC4y z2YH%i+$Z`h>2~}qC7)?aY`!IuBZ-3}hLZ^~X-PdQawSdi>l6)T@a_kX zZ-DEQ$TTW`Gr6ccNriiM1%*Uh3$}J0&nei{Oy1W+)Sd-;p=N0f^Md(Je<7~K_a&;z zQ7sIIDsfm6dwMI2yM8aGh>=LJQ=&Mwn9h}PjV(YN8!x_2FO|DLg8c%AO4l+QC5C;8 z^X%Riqq22}u7>32)z>0CGT@#^pRR$)T6<}wC9@nB62b|oxqq196-sA!uRi)GV~|%K ze%}JIHEptDl$PbiDON_GC#G2{nFEX=t)4)&%E@BO6;svUGbJ zP!bO!SM>?odf+?MT&Y=Ro4&V-Q}McxP}PLK`u-0#(oA>4aIK6`JH#c~Y5vkjGR;=w z^Z%(MC!^>>YwS}VU5&EiS+Lgf8joBt*sYwi0)y%~+-?6;LMh^*k}BMzasmOxrwTK^ zRKT*028-<4Np*w2ALpJnBz2T}&jIb16_GSad;WZK=I~1>Pba(xhL)UjLA`=E7Fx3|4R&TN*l)26#VAc*JTad z?-7yKRVFnEGOH+C!HxpGf(_>}BT@VG*uA@C7($Xe0<(-qFn}pk7;=pB&gATW*OHa@9_7riYSOdhaBr zsX5|K*H>As2YSEVOSN})A{~7N%E$^dstKL}A9o-u1_Ctex<2{My=9CnJq>Jwp10c!w5>jqZ>xgp! z?aIrtB=QAWerfA;l7&%@hU?&j4dx^4fCFI@0oE`DV&kyG-De@FjCW9rZ+sv7Qh-%SE0F4s4Casyw%q znny5^?BeJsBjY%DuW&mU6sqHAr=O4Z45Ugh94jqyKHeWO^^ON<$e*C)ybJWLh7yH zg3BV!CL2t1Ljfp;tybav8Zn$j2+y?gF&y})!6fs3@1vgQ2_ft|N)Hioyl~sGDODJD zxgA>_-gXQbC|sge6Zy5-4IXlm7Z!7^=4}kWq$nu%nnP8TpQtti=8XseB~Q_g2^N7b z=g00;BzdDwtMS%W`jaH{^L$+nJqGUnu-!{Z<4d6IYesvw%#5kPgyg?#uMVT7qdd}X zU;S=#{#CR=5=gP)bBLo>N~g)mV>o|AG_rEH&oG*nam<-2(MdFnAIZx1lN&vZYD)pZ z)Li#zAUXTDmTPU6M;HYq4jywmUELPpC}63-m1HopIS*R`&P1>ouuhB!*cnB;nHo_! zv_Xu{G6B!WdZt{7ce>yIRIgDf);A}sK_uFu-%L&)sK|9|cG~Y(W;NA1#9Cx4!Wsz~ z)>1WyM3&px!ve>(iC)U9;qS>rTeOi2H&si23xD;d%8E%-#i7^xebaJfw}`1?EZZls zSdBEzdB6?Nu$qh%csP5}g?|ZaV7|P0ed+C7YnM>NLMZw5my5Na z{QH;EY>0>hRtLY0MTM54_hA5oAF73pFKY&kvj`1lj(UZgYEnQ@TWo(S>7HqUAo&dp zJbpl7fdX^_&;a(`DC3XLAMn zNDhtbg!WYTQ&;IiW!^QechRE%ouysNBKyYMiDsyKB}}9NfEz_I@Z}N2aRkCU$aL~#?-H|S1IfB5ach*Ra|yZec+A`wh=_rja8CkY4A;&jfL4?W%vnDnFLm={8chf+v6uwJ0pTY?bH3|mt15+7n6|<;SDHc zCsuJDTY#SAAAMH2pez&tpXs3in0hnGn`PNY`?~IV)o!K=62WX{eBiAsLA?_>C%#3N zPVx|&Eq+QHW8<$uXNHL+C*W;C;QT_dJ$6b5tc!-vijkJ}ftuSz@c}nP~{=NJ~goYdgD^WKjbgLvUIVJXAXn7QI#c z%cjST%TzgtWF+CRG)zu z!A4%(TTiLK3${ZAKvm+HImx|F{@7!^A+#U_b#@kl?q0<=>R%jlo=YPyf&xV#iLpcuTSR;8mDUcSKsqRvl)A5;Sv6q4~N%yKjMTR0M)tsr6|2vaL z7qKn3Pvxx#YvBZG8UTS!>uKaaAVZT)nu#nix3u&>BuEO>r_QK@z^#nYiNG#)3EnpV zS*5^Nz1or$s)uc>@K*D;sr? zE)V7#Iear5A5X)=8jho6bhvfl-d>>|N@jOIAwMacic>tHmTxbrtALek1^1YQh*0d~H=daP*PJVW|)B{W2_9DX7+7}@~G384Ll5V*bU?)2OLx?^jl3v^SIq_x-JKyutuWv3V+(j1$k4j zQLloXxGGy4yj_=3@mooe2`?UF70>X3ZCel&BMJ>{YhWSd=?>~WHaMwv%=EM?laAt( zd-D`>Wa{I@!YQcJgVL2j5iD8oQ^q3cSM^3>6rk~mHNl}~W}#AXn2LL5V|^cu=Em}T zpX*@sKKygKvtYn;O>c&PcN!#nSOy43kf&O{yAyqh#yH5|sf!~%nqorNyv6d;o`?v^ zPCU;R^^O-vYf+%ak1q0WLEb{@YX`IGF7n5r#VU;5dh7qBZAQcDN>0fEYwGVRA)AKZ zMtPSV6e7ktvIFcr#XV5OOQfq2QkIbwNvuOwe4ypJ>}^> z-?=h-=m`Bj&_FQ{oC7CCu zACJb!u>AZ)#lO_H+JKuOsJD7q(eQS9LIy+JDVC9uVa4N1JTI7=${xdeDwEXt{Upt* zfEFz|ZXuzl(y>EngV*TO(@gF3Pf}Q!M+imnSj9Z1yY546QteR?_;&z5lLrJmHYmdR zK-pS*M?A^snLH}Ut97wZ7&svj0)hNLFA3$9A;yNCpv)6B-%#Zh&nr|`fXs|I%3DVm z_W+BbMMu2lwqoMQi%fhH5J?F`E(yS)^6zY3fqz6CK9aLBRmpA}I~5dH?Nrh3)F1WC zNPMQFY=t(D5-(l8Hh(^6X2e2435*5(cX<0^13N8G8W@QR?eX-6=O6~clA>KRdq0Gk zh=wfznQ(!R5ot%^5n}?gJc;t)6zg=?K{>YczxzCu_5gsl%56NSk>jNeAmo^@PpU8T)S82 zt3(nilmp^$7J6+>yi@#{yhfkkv7pI1^m-~@lTig$%Op$cor6s|O;u&D5M-4l-TgAb zU{n$G*)SYKEMQ|<0Y9yR{?76}gGh?zIU~ztqdg``G^(^Wjb_0#dW1Mma@*^SH1A@C zB}k1R9W0t%co4}d`6GM}W)BEsW^5)%)e-mT5uU%v;vNMsTA%QIh}21YTiyF1)IhCC zt`4~$qB1=SOp~SxH`tS{ZXz)6dT?_s6TC$%gPm$4?I1w>x$|2-r72igmPtw>F+}!o z{0kkd4(OYm48-xKDyw9$_m5Jd&~hSkg*&Iza6|xIwLc#Dm3X;+=Y@4(t-ObYSA9YXB1leilb&YAApfpoTO+B{=xONBy4}OlSM>@o6TF0t#1QP(_}Lw;8jT^#mm-Hx;8pP zyYn=$cArMx=CKY1Hw~tit77VAKf%^qh0G|z{E4RW(mvIYBL?l_^YM@e&)JiS zGXV7G;)mc&NBF7TqmJmeOMnl>cNE;{l6E=bD)YE86w$#Ra)ZDOPI+B3J#D5VdezD{ z<&aA?Wat$p>!FTLED-Jhn_PvG?|r6$7MVq)A+g?VI%6a08xDX#jJ0=&5fgNA@42(4 z7t>r5l0vi9ff?oH9(OZ6{dLth$xx0ywf0o)JOuDknJm6dr-Sbt*cRWF73xU-7eIpE zZLt2|3i>PI8&g&<$IUM;Gp0gNIz6Mf6z|%y4JMc#w{IFB`dy=pJ6{DkXB+3J12i)l zLdU)E{PiT)j&%m>Uib{Aw5)m#r^sN%JK~~1y^PJ%LVEG8#(v)EU6?EP!)D{)Phd0; z7cPX5M6IeUpu?^;lbTRCn=2<1-VEBYon6CAi=%-_?yCWZSN0dTrcJnjFuj9$NaHxf@Ld ztKqmUIyVsbMNSja96xQ$kcG2Vr5W!V?oUNNu>t)@e6s^#5QzR;Y2X4XNDE)^{A+^g zYJmczc%Er$QmqIzg3z{KZuH#aw-vNC_8uJmRAu>Afz>qE4vV5S*sF~a)^q??hZ3q$ za)T+@P&fC#Fg(b%x8!W4#q58ntP`l1OO>@dx-Me!EN0}?&=J2eyQ)Pd7tiM}uI^vQ zKgZJcWmiiD2-Ll~hs$s3M(H`}?4$B0k7os-2R8Z*L>{|kC)k-GFpv>Y$!nHwgR{=Q zLdh6macrpfx92{1Qd6W}xmCUXIYLwGVxsT)R3W-rnxG1G`UqaF`N%VQ1hkS+%m9`b z4ga-AKA;Hp!@VF+7S7W9T*WWP5ODc6Yw+NLv#5&MD@I^~Y#u_ZyaGmLWa$}x(j%bC z=)75Amaa)V^(0w7v7?#e=+l95y`I*wPGuoOURHQd^3z{CRMm*RfC`(=gG*QF;Q54Q z2K`m)uPM-t|IOS-TE9p`PQo6tZYXIR_LH{FOuzbY8cTf!RYbz_qhVH7GU-)dmf#U@ z&Qm#$RUj~YJwbl_ryqRue-XBT3`#x}>TeZ>bBo+SEj3k_h};cnUO<%SFO(_^<%i{) z+D!MuMax4Y(0oBIF4feGS!^d4(LkCdSbe`G#2}k>e^JR4J<4u?r^_*`F5Egk+VP-- zjYh5z^;2!PkU2Ex`hF=~DbR^TuS`vrtFG*RukI0tp1(5oRBB7$ZUEa(mhKtG2qV1} zK@`V@d^WR=O%3TeF}0^xk~{#dhwPGmmAL{Wthg!3QEiZF{Cy-PZtMd93z1jaz0~f( zo5WaZc*Y+}mM;%0*qz{f5xy|`3V9=}N|(iMObT%))?xbzc&?5Yq~aEO?lEmu#RI{l zz(7YHRM>8-aMthU$`uGWh>OluI+KUG)BtCi?xNH^D|g#PO9ig#G}N7)U*(Aq`h^$M zpMcbj`B~H5!b3ZGjP^ZtjT1$$AfKph#0@C{kxk)XwQDb6rPL8=AsX(kr0d2@4} z&;K9(=kcGB%+gPJRV16T2dfeEK}AX(;|!+!0?HWKt%j9wI`(~gQuGI<0m^q+a+^cK z^$2iv+l#wDg>@V1?YM=fyMmywsnMnSv&M@#8Q0C(I57&Jq0o(r$@}jkzhUN?&aL(w zcBO0GRn`B$P^!Q%8Tta9G<3-94MH>Wt4Xql0QU#L1kTJqtL?)2%xYJWmz5bg>*&)? zLV{d21g#s;-g+1z(^P2iBdP~(|8*d=ePlJ%Eep-X3t5X?c9^)~c{y72Du#8r$e6id zaIE@0T%tvRNM?|f=`gZ9li2SYGcea3>Ab`RPpCpRHe)X*xzVDUO`Ab~$#}{PVR2m> z8G|=!G&W)|j{lnb)jT)+4zhyahZVD6$z$rLImxEoSS7}Bv5-5?{9zO|Pj$f3TFNoN zw@Wux+MRCeb4q{*j~g#rLMw^Ny}4Lops-jc<&GNZybrb)zxgr>^7hU=d(2-c)5|t8 zMSkt~6DW5ZA4YYm?NQJP$js}{q`1#%B+5_lWPdSUsVO>LI=ob4&{APT%O#R}LC6K% zQUoJUU0)r%>=!_BZxC`V0+$e$(@UWIs7CtP2Y^EsB&^sC()ud7;H9W`M&uq|KI;Ov`i)WyM4mwTO ztVjKWuRrHUAfHdXkBj&>8*W{%udcc7C@dTVqs{56O!O$5Xh4S@b-eSgYYx>l5sTx_ z)QrC^x|x90*WO1jsHK*Hgb+!Dk(03)C*cR5hiOe3@s(=Fg{d!O9)xFF+V@ezP8b*G zhf+2m@RUCp)NeDjr)~>|>*b?>t}R-}<=eR7*QX{cUa@AdgYsQbzbI#Z{ZF6aBD*FG zL*G=+1it%0Mz(X;LyZ4e7|GHr$~_yP6yhtWWCiSi2<*TcyLoRxCpl|;uwlPdd;DUp z75t*c2rIdIwmTvZMNv(Vsd5=f%#V)bnyJ#d= z%ZnM)aC`sMnIE!T8evn08iaS^WxU^Za{PwB3rm$ew>EK$z&BobQV5L1qWqPM(x}X) zn&PyQQrE!9030zxQF{&pxMPA86U)8!ih}duJlWBS`GnnkN z2$t^xw;e3$R(ykjEZgA#28!5Yc)d8~nh!4X_=`2e9R}hidaxTKsQdj4Enfw*fDO|9 zF=sWAc&dV$38Q`l*Bz`^KX$|1vLpdzq4RvK!gnC&Z4O(e4k38li~ttce2t2ryH2wf zy_f?5YRF(jnSH&2z%oeK1o5Y3e>}Ic^>v(rki=Y$HhukQP>6Bf0~UFAp0XP)Y z!wYqv?h%Df65Saul-Ij^gk|0RJsh8xE+O_f2lw0^UJa7t{~+$bV$|4%o%Gfrth&=P zz_{Ce4+<6Uy=F>uD+zj_SKz}z1BXl@{X9`s2^Bdj6J`T%tbn?QwRLua@+?lEzGXCx zuKE0GV|*%l+>nn0d-?}l`X`6=)>4uRd!B&dN1BbDZ1h_Y&lf;|<|Zp0gzgqe(r^V4 zO*G<2UrNfHm`Qe6S1RM7%hnC<3i_1mt%P{YppF>w(6){|tWz4+P*eRkn~4HY;Y(k5 zzjP;BLA)k1EkUfEt`^Oq1rs1F&7E5{w@F_=l$UOH;yY43seeXHC~^;Q60OdvvDiD6 zzui$yA#CvodQudl+9qyIDFN-KIB8!z%R9{fpVzaYZmW(N&H=fTG?BBanae|+P>ehv zxs|FX7_XZ~wsd&0d$WuqV!g|#OFGH%m!nrA&EC(h4AT|o73&~V^uT{*d;P$Q|6UfuB^nQiJ zO>^+4j?D45;ryp>{g3JPFJZvWf5J4*Ck;WY$L96oD<&(L4P$#=!@ff`0DmX}dYw0j zeMt8>AREO*C9F-Nv%CCVc_g>x;o&{bptH`J0K4Rp4_d6;g-51m3`S@w7)@PsyrVZ? z>VGzZYaHazyx9T;QYt?$;THKCF6y))F*Oi4oQ+*n64e9oc{quL(5R9TGjCdJF*U}S zX4EtOkbYM(e*E-BA~2qrY~YqG=LjMD-C@0UUaB@Ou`x$jJSy{7&n4IW`8}Jq$Ct4= zF5P!E%v+Q(^7S=K=UB6ya0#7H3`^`TH$=$4Y#Xx|vn}nC=0-0s$fW`q0 z(R)Kiim4`3zomy?1FH%@*x1Pen<4Iz?QBvzRa4KOS3Ky$o$6054=<&2g0kM6^zryG z;r#P3XDDhymQoZgXE0`uilfh3%=0BH3;)6xX&&@M#cN3n$FrTR97W9Mdv;*L7OP$u zUSJ7K=2%_`6^e2sI!8g!a;b#b03y9D`+?uH^^ebQ>Jq?{=9Ps3nDtXGs!H!)NgL9H zgQH`54Is1vSuS(cr6l!4q#j6Q!uOQf2QBFGakewqpKY)*)MqLFRJEqW$r1p7or$?s zakI7Cs1&>VX(12x)p`ye(k8k~)6_x0^uFjoGmc<{TldWS8Lk{@mc`UMQ$|&5e7Xge zsl0HBZMM(=m5jI=)|mCM#u<{9wCbNmDN&Lh7MJ)q{Qc$Rfr?ZqD+cg*+HZXyUK=Ac zF{v=Et-*+Pw4!?cHdF%1HZR}{yKIB;n|n(k44y?_G`?c4tlyu8Huimi9cLW$Fd%58 z;Q|S{1&E{#j55RN(^h9gjs|IaGLwg$HEBz^?YmJjj64FBjq_vUAu^hM#~Xy<7KAlt*81TKEgF zJRo8*5AZqxm?{*}V$s`@iwW8o$2%j!oTY1FU6aclJxSlyvck5NZF7<>8&Gz;aFS)X znR*2)5bL7rWT;d&q?xK~}V7V)&d?yq~hR*$jKQ3nysr0C2Fkh8j7`dCV} z)|o@a99z=;@89{=B{er#=@8$lc6x#4IpZiq8c8xu)ZKARVc7Fd4k(Q|jc#T_bn8;Qb4;uk*WfzP2=`Lg6l|J}veO`H=2qYY(z(c_?;aIwxjMmR8 z0@nK*`LRBX7oQ#JtKxe99+&lwkXMFnVyc;tJOuH=u zN8Q+E_{O9xeBT;|o$InYq~JmIf!ATVzq0YlyVoj}MB9kj&M zFAMR{EAFzNHB!zscsI#d$lofFRZFjMuc7VjKGW$^HaB|?Qf#eXx56zspAP2*55eVy z%Faqr9GCU!E}ri~4n{W?Fz9)hWfnA}u4sNgKrnAxulMXhz5gR&W{Zro4heH#Q1Dt* zm2DCZj1h3em>EG7x7#+E9p<<&uTw5hJ6j=OEXsD5(Qj0tN3eeo_WI7S7NlUn2hi!c zE8LOk8c8`+@0YYPrZ%C&KSKLO(t2LUMHo#%-GT}|kGd!AXQ?!`<_=@AKxvVIHO`lL z6oln{b^G79m25b}nRqq2{tuN){|;n!Y9{WvoNPYu10D^hl3WpbXzd3?E?(ZaM|_9J zg;sNrA0Z}0rkT|^nLls^{02CTF}stm@{AmvTaj=$=>rSTD0+GYaL1oC`REef^5)D2 zXAo)y7)PPfRis^_R$+JJpUv`l<{vDZSta{@uA*qnU{0SqHP5FK9vY;d^MY$OBg(EyPYSiOB3oTddqsA*E<19+0B~? z{`_3Nhvgce3JIVh4BvxLkf0%y;&H!R$u(yVB_uQw39|xD50s@ucv(=v_}6k-VZ!7D zea~(9>xIN=Dw{y_R04e!{3FEir`>2Y2**Y)D6wUg6UWfnPQ&-lS#VpT@;&QZC^=D? zjl0asbl!>)u@RP#-Pac?inpb83+dh z?Mwg#g}k7!=b?YV7$a&8rK55e{##YdC}Y4QLVjxtFO>@jgrkFadkaCFe9{cG*5I4~Zh;wScRZH}#V`ZL>l zo$f@jS!B?|l=V&N?!*IE~90#LeciWSl!DlJ*ja?7c6Mr!*ieQh=5gTx`jnz-W zjQnpY>(R0y@=J>i8(N9UmHsE64QKRe*s_lzNpHOFK;lcy<+0srHQYV+03%v0V^5Kk z1k<3_UwYTPEwpYBYAfjvMG*=9S7Dn1UZ*rFFsw%CXRG>CqI{hWNcZr#X-Ux0VS-vA zHnPQ4Zl7=dBG87JDJ(xKQLUNZrY!@f*OMD^v@eT-J6KPSu+qQEM@W*{Z||k5zcalMSCO?i!;~|LfuSCILg(AA)yXPFKin z7Qq5sjbz~J|A6BrOt^x(GrmrDv=AuiISD(kkhlhCeIVmea+0G<0&6EF<|3p$38CJI z)HLlxvEWGsd3qLvjWno_J2Lm4vx4W5N*n#zgP=2nF{D+ya-KvAjKk}>Pri+H?K>yb z!H;hQfq3aplxWA<0-!FoDrZi%LQnXiop31l27qMWAbYA)y$)cUVdUQYUD+yHP0XI- zS7u^oYLf8J-HDV=tVUZ);EsvkM>;;=p|ZucKAe$oFug#u-du~$&aDwHk)Mxr^yh1G z4rADpOqO#w{^R2f)Z%Aro{czrPun{MG)<5b>=h1LPRm1Elfyt^_LvX9&R-$1)Z~TK z3SB!bUb84rKSm+&NCiPOXhRz1S`|)hdh)L06LJSfPeta4d^F_I*N21h|7W@9U5kO$ z6Ya0z4p$m3{;*&B?!403Z!b5J%7|Ep&iKYQacf1j&be9`FjZq0(szRLdBW2(CDOKl z7>LnEHXRzSO2`}7t+?pZe}?ioX7UYOPjX}S~!5&&uGM0z$x zT{yx=O&5KrwEej+_JDUSyYYgr1eM9!8UyXy#F$JjeL! zzP7%@qQ$_MYoLj&CTcuv5?_Ff&XK(<>b<@Ojo zsRM+DjG5gv*3M>AZHa=v1!vtdcIvByEA<$jM7&#W;q=a==)lI-<^^3D)VC{===`HD zhcYy$2!*vIEW;1F8F%CO9u7JE+5{@Mrz?cHXVCm%MLS~S(ys`!P1i|`5c>5~`9Vp! zoB##Ck*r}NSuvVpdx6Ty8zqr5yn!INFY+BDyf)qs`M%1G@Xlkpe=l7!5X~fBK+%t- z*%G7L3<|7XlqY-dwV;*HeIL~W4Z=Bt5|Rv>T=)O;va$7|K~cudENn>NwT$uX6Yni> zjDNdGzvLWN%OaWX=pOE710Rg7KBkL3D~|pC7+J6UHT;OR=tAg~%7#k_%3FsRIr?sx%@rK4JlZ9DS{on1pm*$fe zI*d)SB{j3wNIuFG_S5->WBtmn2caU>-~&P>hF$7sA0|rrMu|*3-YA zRV7-fuT|{;No=NR#`DIrWGzvPAUPY*9`tMn7}Rp>I>MR3gF2{3K9cjfN!QP(FMw8z z==-YO11h?m5k@nZ$1~%9-0L_4E?6cm=z(kZOPvrbi#xp{&I_PHMH|u{G^)z_oAF%9Wo$3) zmaw&(BuK#21kD$XR3(JE)iX2oOp#SX04K;6(R*+i`c~n$9)dT4CR8(43ij^@R)zv& zU7;EZzn|Z7n?hW6g>n+btG?kNB$=HGKt>d^Z9)y{!G8ai1x~wp9!tS{y0^3ZJB3bY zL^=~l z+T1TYm*=s?Pjm(cUEz%4a?+;YLfQ3=(c|RF(Em7~cuP3sZIm`%wk@YaEnHO5Ko0@ymgnd$@mc-5(M&?*#Hp25BVhZmGP z-Cc#LJEjM|YP^}8%%6=jvDV1kYr{AhR6qWSyhQW=JM9NLinx<2MQa$&IPh8Na)&r% z@Wi+w1HyCHaN@*GMNJXYO?r753(2;JTPKQbZs}RHw{#0(A8=JMuxm)*Pg*zUy87Z( znlwak7^H)+mHh1kZu4KmM5#k33=xW5g&+QMru>7}0tpHeG-%CzWe(=xTdYhHlfd>!PV@0%W##eqKD)f)r|kD0>-5%o%T`B+BNB1dQk36C=X{+_yG z>z@D|^JL~dM#^fs0EdeMvi+pVU-QI#1<2N@JkQp2v@YzGMr9v)3 zOofUR7Wn5d^~dJckZv$}o{fMpaH4r@2y?750<+n=AW{uI$yA+?KOeQf(FIPQ|07NH z(3_mbGb@jYyD{2X_X6e9qa_HnN;bmj%QiO58Y{K#YPK`Shr7yrAHWW;sut z!}Ag7NII_O&`0!LNS^U+P4&|K7_|@h8*F2g&<-Lm)?yF-2trE94cRwes6SXu!5=x% zMQ0h6*`uAvMrGIS$)DE`gz62^yclHOI8G}6*RNn!6A%yp%m-#q>wV#Znk;JJAQ?8k zb@1LUOMq~R5x2ES+0Ka;`^z%FBt&UGTaHRcAJIsiVWdn<(!DB}p=@Edz&{*CPJKTO z=;%rAACxj~pi_Bs*&&2arjPzy&ho}~5a30wbYUJ?1zB|*e8n2t{O42pw$Ii z*;<*5oEN^*=D}Pn3s0c5b25n4pEgCGJ5tBAKr3m^(QWnQ@&-`CKO`pN69lQDPbyY> zk*r#H8BYYjxpLArwUx3e%seU!Jn6d$WPQ;B2aYw<->@m2Wfn-&sq*HUkZ{aGQnkZW zWnbJD%_rJOm;fq3)xXCKIdthc9NxG`&Mc8@l|6c$HDk!SZtsNef|b0?B%b8>yBAYn zvUzd%+{A^Ox%Qw6j<&K+)hp&oRv9eTjN_@#kPpm$Ue|b_^;0thP{pF*n%EalCE?a_ zYH7(nA~-+SDg0GwZsj68BgKdsN7P=286E?+!Og89m?;EC?u`mCf;3c*9h!biz6B!KhgA0+}O|DPK!r9WI~V=7PFQf*d8K)uHG~ zO+GW183ex|YsZH|)V2IBNVHn`NJEO>E`=OZnYDXjSoy$;bV+E)#fqY;k8)wV1>7pM zs;ca6?45ze@~*?=xjl#FRa#UPsI&#ohgn4BbNHxK{3L{6kWw0t=G*IJlnf&_O(o(! zeZHG1A98-8K~w^_jV_o?^sZ5DTd3Q57tLb_T&X;AhbiP|tGLvmupdU1*Mazg(1M*H z9yoeOsyBxWuQlIkGJG?vdk<%fPRq;)R2yZ2GserndV zV-a?){hY#X921V>Qt|2NjMlC zH6h875OoE#dx2?)l7iVeVY+LgE-#{C%ZI*XxW{^A%!$7>9b&Y}28k@=nZ=?mX!3Bl z>}|3N(kMmckg2c|y+yMXLFj?rFUnAFjn&)t8F0iAMJevVJ4sX>E+T0&jG4R(25S!q z;f=MI^G(|@qL#*J7n=ui3G2MHOuetv=zUcPK2x=?n6k!8hk^gHy%S=8J}z zLrUDdwShQqN?d)4KQ2)xRW`*P#~P!>vhMwWe^sUVwmqJq{Ut8wc0Naqm%NRo!Agyiagm(gJfJL@wpBBBcugLtUcatM?7IH)m~mKQEp$l#JI!RzqY5c<8Q zWP|PfQXijVKFDem#J;a7ETk0pHMAL3gWx2woF98ISfDi7L3?bUzm5MGes^Usc#Yw) zu^WL9@0s0IeL)w-QNgW-x=qBy4IC)E0(fVm<(G>*W@#cc{zT$AdQ>tNnEFVh8w}Vn zP6aCdy{=q&ZXcby$20Psn}rfR}BTpSlZLdKanHnX}O@tlrXwwkrS~^VzW>vV&z*S%oFY3P&0&@aU0- z2I~Yf@d4dW_1KSeUv7AlkY)=2Jb*q^!Qgez&FDo2cfdU9EmSQ<*&uKW z+qx^aEaxD!8U4lO!)?(4UQ2p$&x0Z%dknW0QDBVk3Jlbunith zHWO-1!~XIBq)!C048$zMOtkkkY%n)lbIp?TRnJGi3zSqD3LWE|Jk7+Zf2-@O>SGKfO{}(EL&k!Gr=#&0% z^Z@0^%y4l_jGzI?1+tNbXU^omSEa4r%#Imry7{or6(Q_%%oT}mHMr5C; zLL-lbUd}Isg$*1iHaA6=ha;G{jT2LVXu<&j1(!?%OlT#HM`q!)i=ZJ#F@8zP*e@f*|hoe=v$zno`VA7L@ z@Nty|mWudJu{BT5Dir<@i$x~IJjMDSzbU-6G(`TW0N){fLdc&$DN0X>#aCYoYlFbA z8m_vVnvm13qpmblMi0qMS?s=7?sbADrWll!w{)T^JDT$ox)jJxt}hsKHz$9Z%yTLv zp0H@-WL0q$$0=g}Ob+1kvMWA6{Un4pC5@4XTp|#GZF!Sr*6HjjhAF^JQ2OZLjXPNS z;BWS!KwkAX8{XhU^-dXUf<0b_FUzF4>-Y|Mkax-~d0CsS16fBoz3xrsEmom9QZ){* zAwJvR6lg_?sWL1814Z}qG8Rf-i&iXpnBccPF%g5WTr}$Zi?Cx4(wbc&H8Wmz4G$dE z`TsIZT`!;E*9+)r5PUKd)B!hGqg7sixdKnRuobP((UGXt_9V(PD&wV3pD!ji3ql@2 zJ)>=nFBi}-M1+j2ir3CrsfdwKsb$|(WZfJ%?N3jbA;TnmVzH~LOA>SgY0!)Xy+@%-KYj^~Sp9v`LsVL{w`^}yAT=Z;nE2DSd8_Mw!H z24`)*BG}iz258a0zowK(wR{iT8P_JE1xG`n#Z#yl8AHt555n*Dhc{ireel4#`d?nb zw}JY~v%E~@4cVqMSb|&=9G#gwJo$jJ4&p&e0x=BICR?AcdDnneQmGb}f24qgFjH_^t?-ukLMP`ulsek71(b{Cp z&X!_e#apCHql4*Mo$-rKh42~tw5=t*Dk^KFz|b7kFke;eF9D}Jz4CraO^<)ONvEI$ zoaImiO1+;=1IE+8EeV%|^^)wQQg2o}YMW_j`=<SpFh$x$TP!h2mA|NWXX+MuUtOq}=FG+xC}*I5Ko2wrLkxq*^B?0`^5>R- z`tRG_Avk_EL!ma|qPoCs{(MQa0Ba5O9w8#$Lr6fN3*LWNy;XKTz-fp;FDP1+ocHLF z3xJMhIp+#bwGgft7_G;nw;E*+arh6$HTmy4&ST`apHO0`=dKmgqs3{2?hMzuT61~< zdT$KBM`EUT{tzPguj7g|GA;MiK(G?-kQ#M|xrjFAm3CR$vNh3*e-NQLT+|1w^WpcZ z80MyDooQbaXbwAbBR=>3UuS2~X~=(ebjY8PirJpbnH2;Ara@p{I80>`xFF;jKA=qH z(3hk9CS`<-nu?ZCGIAvP4OH!-GVkP?emRZGnTjeX>#VK)$8n9qXMgu>m4 zhXwc={Dxt9=9=<8W5gNiWT#QW zkls?p#VoB4YS-+&&Mz+75m{2p`{!3q=!%xceWxAFEmp7?y8Wib;V6Mwb>84mSSR<3 zkh(zHS$LBMZN3jRWgA!z){|5f-XS^cG}JEl=xaB?(^1QKKlEyg(ex`R-Pe*p@HKf0bSJ5{8(5PE^dB z`0s2$`(e8Bs;o-k9_R`+5mDpH8tWrzZ0f{oU!Ee{mq)w`hqlT#w|bkB}*m1Is9W#BBBWrcga;jC+g$%xVj|+8V9}W_@ATeG7^k)Ydt`7l1I~4Uz(8lHSKiq+vV^ME!#r71?l#OPH%9+qw*i!oTINqi8+A|w4-EjWMN z&95NOYsgiV?4-#iAQZO0l=bu$K6a*~&R#gTUd(UVc(@4HNYAF_vXAxb@ph3yHG`)3 zXzn83aM)}$S4x^}mNLil=IKwmPJQc`bH(_!JQCClPk5h&77iS@ptrc3vmK<6al%?K zvt8vIati>5N#gk!=A%x$UYR>aV2e}eNtMPZoZom`%eUz>ZxI4$K%M>J3fGahosUww#rDn+Guq^YVD z5^5BUGwng}#vlJcXcnahk@IqAm6J)Qm9i);J&4aS1WpfDk>hKmH9s0x*y#?Ov2(gJt!m%q+n_pYrO?%5+hN1v~^1K;<%}=aE1oq=7G;@Kmv_r=K6* zogZeg+8N4q9aAgl=s5&#Ik}YIJUh$n@%zwhy~3?^s5pCfWA68dX5cbp{eW0$TvEZl)ptZiK)N6ejh& zM$aEEIhT`oG?zsB?F7@)EiWG%uQaEbFY#+q9;{OM!N81X9>jX;=hRPyr zH*K~>t03SmvhkQ*5<^QSr?4tj@+sOZV6QMJAf(x}>2U~kj3zVAJ77}d{IdxqH}fa8 zS6qnwhynCZr``aeirn=@u_2l6%UOv6ofhTWG#cn^NeyeV!K%M)o;;-9u%=s5-&+-G zk{%xz6S8FZQogI#OgCGi+x9Urpji`aC+rZtYVpC9m+%)yI~-ET%q)N0 zLs@EZ6cx~Qo51Qn@GmzNy&rx?E6Xv`jezoN{u79hR|Dy)yhQl9MI~G0Fv%QJ_Z6V0 zCTTo&&*WW^2QoPDAXf~cX#YAq`!U@qrQhPMCW4S~%d&@A40JQKf}it2C!AUN#+#d3 zbjc)1IL!CSSVz(XGO4b5cz~5S7I|$-xMIonFPCcV7KBoV^J-JgEiw%hEhE6L9lkXT zP5&Y|Y58Oj!W{ud9hvP)ZGb7+_*eW}BOv>ShFJ-$(;1$S<&`_Tu z;8*h4#+Px`@E*xn6iI;&u=|goInVoC*OwCJv_Mz^FC%{%4XmV22;wEuaWDY^UvT|E{pWiS#`{HoP6bq>9K>=g7B3ZyzJ~uM!Whg!doj$;W zSnBBDPn8qw7(J{(nUzA^IqFSz%M$d`xWOogr95KgJ^AagDwWtRCX-r)0Agi-fJibt zKuq~6L7MR8z4z@Mxk*_2*}s1{2Wr7tXRH3K<2R%)kXpG&4mlh4&+FgMPry*d(E7}4B3SMW&+ zMl^W2a7vV8Y&`1VF0)!LoIt-QXN`@EMwkDS@ZzH!)jR>nI6wXfNvTaT`fQL6kDqzi zMBG%MpHLB(<=G+svEfP;5TXw1+;U8J%TQIJ@ixwLxI%QMbyMEp^Ws)JQ> ze}Y+Bp;U^FbeWhZ)8!X>7ABb5GI=s_qt}ZSTMI@%kcczxR2R>9DB#w z``<9NB;Ju2em1Rq-D9m7!ddgf8sAPV9i_JM7n;|V?pmSl0WC}M8dW3H3V+Y_<@l7K z#n#Hx>b)_tF*))%zvpS)%({H8gQe_X=Xz}r>`M>;deWMNaVe3J%Grs3$cvkmci3Wo z2$VI33Nj}eGqEl^ zYtb(*Az;<~rA&raLo282O7i7lyy*AvtU;t*gJds8UP(ddj^+2dBaq400dv7|6o7`)EnOpk6c*ipb~5Gg8$1# zD*tJ%X-vytw#xz7?B9&Lu0H>teW4jF1t^{nP`>7r_r0nz79md!=zbG_OhIv;9JWc! zp@bHV(DdT9T2Gd`dMC)OGh+-_i^}KBjZjC_E5#Z-%U0@m(74p8`zKeh?q*ZdJH%MO zykuU1`n=6a7ti}dQ%(kPz8gkc>ekv*=ycPi05|7Bm=$s2vmnX$T6&Uo;$8y+b0bRX znpewcVpdQia)VRk-EieiG+2J@DRdfHhPa7N`N}F=|0*R;7ZDMtwo5L~qV)p2k}j2t zf)dfQMt-n&$rNVQ4Ndx)g=J57M0^lOOZE2e!#h{iVOISf6e$QMJw9!wz8oP1v|-C( z{e$RPTo-pwJ|G6x5@HeMu`_mQcc!w@K!gO#41cBH4c$~F#%U4>JV<}c%vjDcYiz(o z6o%i0qnm31S>P9d~9elYbKWMrDl z3a+}g`&YD-(&UgljN6B`QT#u|rkl}6B&a0O@!_Km%a}$Q)zl z#8+yqy3waMR0d-noMn3Ycx2+ale?eD#81zkXMOewLk0bU0YM4v;2IbzpqS$?Y4jd? zIp7#Mux@5CQj4dwpH~5)3U>&1NRA(XRcShEl#X~lRhU7_@1;1Sa|&H#*k-u#`SGa9 zU`=8tO>|;Eg1_DD^P_A;HRYL!5{vVd1jI6X{DG<$kNX2d$1Efr>Gw=T_NaoBH&gcD zMf&H6J&?pROMCUQj!CYT3TRCuyMA14L~qBCS0F3NH~fj0YG(B)gwi^Er~Eo{69q`$ zQ1u5y$@L)F)|}T8xCsw~7-3!C%|aDB_=1)u9?;ejRT z$r0DH?ZOxq^=+n2Y1-!&3p=gvdN=O?gu|~mx9!l>$A!NLM+9D)37``Q8fW|h%svEV zg&znkzh-b}s|2JCyy#z@*Q(zCLULp(hV71yf|hIa5$=vj#t6lV_fDf9cJWp*B!lGTk}3h<^N z$5c==@?kl$%}dEY7&(~px1U5Lq)nkA^1(6{9E9W-Jv)Fk4gfhD$S%@;dHziZo!UnY{?%4tK5X0bF1vD5&XV<=G*6mo3;?ac=#gYD)V9E1wajNcPAheu81Dw zUJ4a7vm9|-Wn<3QNh$w_99zr|cac*(D^-z5#W(#2JMh|T00q8QeJKB;$SFwt$e1N7 z#7R*WI;mfOYBrxM3rx}U{Noi!%}l4Hk>e;~_a#|1vYc)C33WCFiRwJdHR)&^!mj`* z57opAy)}xPr2wrerC zgXl**l5}Z$Whc@r6d5%JGUf$-e{i%!NN2~?lyfbvQ49;oE(%p>ATb4Ovw0KK_9R+~ zXZqL7)*AZBUKQC~D>vRTG5a8moS7+beBwLo~w=w9#D8Rm7UguOY;Omqipy) zmrJFjGo;BZ&9leZaAtNVaWQ%sFX#Cpwic1#!nMXKrFI|rF@IFP^*4?H6OoY{1v{0R z)W~a42oRJ=amskSq1|3vFL9Dy78uj#up;y_qW^j<4Em@KvGF~o>ya#H#+1n;9 z6m~A^bWh&12vp6m?#+q*M*1!D->{ZDWXA^!AfNPv_b*G>3jd?vWit5>z_L)7td-k9 z;FAOtMDM|iA=^sc3lN`ztq!>)^(+Q9O`*E` zY=x5@#ugh#6Me!j0gC@(Ofa=)FbNdotX<(mHji?3Q+5s(dh>(q7h_m8+CEEo2{Du6 z!M{O0V&_$R;)i#~nAQ{+oK`|_>4QpXbcUc*1k%j(J$1Xa-oBTx$(>`>@2_ST{SSYu zcK(N(Hyo93YveuHQPF4W$fnM)fvIJG>+t9)9Ui8vWZ!J}vTr%HMHDe{cR{$_(x2*F zgw)FH{$)}_SMj4jZcER-Hg9!7*V@g2Y_|FKb7FK9q#aa>%9m-B>9=&PYF4FGhZ8!Q z#)u+=(*##-P~uA&7J-SfTO`C5HjIT7%_k`bitb6TgH+8jVN|P{SJk*gq;TmEsY_vL z@8!_T60w~hU{GQdABkfe_nqPjy_A?`S)oJZc#H?~P>Nl9I^tXGV6tG#iMQ|}naP~k zp=hC-l6z`dGGc>0Ru&rC47FuKC&Q^Q3YfZp2jH%b@+*2)#Vw}o&kQz&9-ce|79A01 zT$!k*)#GWRMckkogHq8)<|7i@vFNDs&d71@48yhSX7@ZlU^kH4a&0)6+xZpgSj6E& z^s75usgiL~KS$GW%u4HL{4jG^fQdv+iXlrKl>4C8wMhuwp0R(J9Rfazv5@Ur(Q&hF zKGG#r37*mxLWf8ssh~J{dpxw*al_lJlw^u!CD1&QgP`o>!QN#(VN~n)d+CD1 zU=y<>yAuGM{s8}I$A8fh3Dr5B^_;%iF@`Q7?mLPmlLO(C?mn-FU6M6acW0Z}uZLUr z?fcGscHX`ABRf{^#Bo%~>;OO+I}?OYmi~dEQ7G}fno;tYwmnM2hkOts!+36A?Q_SN z$KCls7@J%`e!uLbsii*Siei!%hBZr!K zR?ZbMn>x@db|WjJ+BoI@(N|1AT3?HoXlayDl%_maA&y1ws1`K>@gCyWL_8i?9tl*1 z6z$5unSx_dyWe~u>55fbj_^Wl<~bX?1DIUVTfHglEVm%Ly~Sf`0E%k){+m_~2f7u( zB$ubC`jxyue?zJI9s5&BMX-wkNaW_6P*rKoi4;4=?%?{Zi1&J~--~?avwQ1N`*#?x z=>ozrI1TGM??&EooGE{5*dpmcfYIQO9}l?Tj*^Xi?70Q;*Aq}aUUK6KCELD4r{@0L z60LhgDFl2ReJsaH|3oE-zSyiUBOn9@ zhtK`Yz;GvIdQd3a?0a0*FqDU|e*2V!;Di1^Yq%Q(>!kQ`hzkm*eiV7f+MM&|O_e82 z8ZpA>p~T{Ui3*BYmP1NLj?ByxU#4QHqNT{T^Yna@;(Y9}C>A}mjyGVNiZ|E6SH+@0 zoQYWjsNRv#J>yBGXk$?*tCgcfJj%Ao;3)M)N>N#6YNJG9;yqD*z~oVW{YL>x458wH zNlnc*)d=%Sm?t&i=iy7#XCDG>{uVA_^B$Y%_Q9}Uv|^T&W5A&}TbM{RTCw(tnmK6`1?NcN5EVP&Wc>(1 zAAX02f5};#8&un_Yi!(1-c%hIi(enSN@b7>olnsgld_LF0S47nc9E<_%b?dDCgIYb z=aff%&lc+aMG_nFwrccW#0x=5zln~f?csYnt7(d!m@7n~{(b|@ftCzKGF7t)38<1L z5&jBUhskAO(*CfV8tZz);IFF=PZLQU!2_n6=;mKyiVFDkz~g%5?rL|c%2cGL(~K8C zJk@&jB1G?z;aNz!M=3R8jlOw?=NRn#pMv02mtI>Gs{>{cDl0TT8rn;UxA_=^FqA~niyKw60S#hVWN+LGun5U2xlwD zc@1PYyf+5J&D$Rh%l^zS-pbm_+8``8#`~_{Z3=)Z3!^J_WCFr8^`89K{mYIFE`$^r zCvJ~a>yo3hS|wP}osB{wS>p2l{fOXK+9!X0M}0@m2hB>gPeKc!tqzBC7-rvm)SvqYq*S$kVZl4t3D-)x)=|g~M*gi88v*U~jWoHJE`l$v?)c zbTXRs*x5D02mP;LCa7Mc{5~$m#X5UAR>|sufYzV;vTEY+nKRd!VBM`~4+sm0P}7tv zN0lvy0`?}pPHBI$N5#EGcLhCte3%T=xshosZOIu~zwkcN{y3^4{6@_{{BC}>DWG#o zoPR6K{-LNeVz7vahf!V=Ehz}uL7BLJ60g0U;=x=Jhl4Rf93aSLrW|m~!(v89s!vP@ z6Quaz-5LpD$xNKsJRA_w+$^|d@5V7=P};|NNWD;H=QN1uMPu*rZa(_ws#ajmzrHARC< zHIv*`!_XNjD#$-j`n!*FewW9gi!_ojz{|Qy+MQwdxVZ|f_P&zIMQHhe&E0**N?PjGQGH$YYR!t18 z{gO7T{}6>VYigj&rqo#e*H5Y?r;{$F&v+2bg_Mzk4BPij-i4f7Nr(;28(pS@Ab%I6bf;=M%zv{7<)GrJM%~z z=*q&Lcw_@QFq8%P>ypNqc7Hhiz^@1@KB{-*dPN@n@7neOUVkgf*JnIBlD79pXG#Z( ztIFyE?Wj@{b{`)GC)UaWC=c5PcmcH+&IZTy=UGYmu0Xl=L(?a?8Y>&JeVWF8D`}TCI z#~1rGk$CA@lLqQQ!^%Q>UH8ZkH(T!;G9=<05WQ3TxtY(b4pvM?M4*=gbw0d2X3V=e zz&7}nm1MsNxl)VWD&yf7X*irg>*^) zls6a~r;sJrku4s+?D3Eu3*i`29ArIIquI3<>agy(KMgGXv3R?cVwcIC&qj3QYY$k= zc#Ei?ESb{D0%y8Zw*LJBOf=O&lzY0zgToq z9bzt|iW5NN-1Zg7Bs+eM4L=PJ^Ea^XjH9GRk2`xpV~DLAc}Ug}_cZvCX#ayjLZOP2 zY;kAb|9|P^P{6Uv%_JpmT1eV&MaOS3cArEw-S#go9?rpN~j zSL%gGgTnS;!iJ4T-zx-pcPB)309n~8cJBd>4o>T+bS=+LkP>7xSBI$fe%$y|>>|f;H)d2*#k;GHZRe zUC~7Cm%J=ycgDTLf!lR#{QOur{?UwbP*7q6pk%dJdGn*wpZ*aa_ftTNIaKeb=avbE z)}~$o9g0hXx#KzCnBG`^@@&}xG!*>v12_`OAJ^^2!6zh3{`{2Fb_!!mjn<+T{N&RC z!d0(3uu5~x>U}$q`(_1po7G)Q0K&GWD`4;RI-Ceym$Wg5KGu*{wY5LL=qFUctR7sp zfq?k!vgw#GN27kPE0)bjePGh8(?4@wbLlzXJ5_8~YMo0U{-KvenU`fp7*^G=lpX0G zTj|JczoF!QIUANaku~m%7K|2V_cIS3^59z82ugEsHP^@X5C(UIN4Y`Aa8_hZW1#Yg zUpo$$_EHC;f%i_hm*^tZRO??M!of28@vge843o|ZJ$E7iHQ0hvq|Qdy!bT!@jb`fb zU4MEFmCQ;|7K9`g=wQTab^^ZLJVe!U{*8P|J;+c?^d#HPJ*! zJKlj+7MMrIpC~T8HmqJ)IX*=Tlkzpyr}09DbOnI@fSFqBvuC^nb!N7~ z9KcqN-YjH&^QgJf6ECtLtClI*)k_)rO?IlbdQBLr5B#`;s1v<)=k^TUYhq=H8TpM8 zst#m^l9e0vJS2pIW5o?~zJYROTX(O-7N*-oA|_s#ZX6J03I-Yi9I%~^$~&o$9Kk7`rEnj1ec)&LHj@j~|fR}Of)!Haq)hox3!qSmhskQ!Jj!> zSdCSD#b1kSk+}B?(SJQ`hC{W-yP_=hb^yZ?c{$w<<#BVa)xtOxbJ<%Y!^WPe&*|-m zq`F`Hpa??7k%&GN(h$*ev+Er|!`FVmzwY5EP@!kXt6Ve=ySe!LO66bdHUHLuIXCbI+`GXh zegmwReq@hvu^usv18B-WvOfV!hQIHu8!gxq9N!rYT8wR$y%?(!?iqx%x}6vlEaI4< z>ziKu8Z$xr>0?Nghz4CPZ+dpbSa}wHQeaVgxnhpTgJe=mljQ@8X|_vET@HmW&Z$y6 z%Yl?34mlJtO*M=2TQBa%%l_81ZpBh%JHS;p1ML3YJ_A8d{IaHr&!%4k!>@Oj$ZwO_ zLyJ1i0Op$K8^F9?z>?^QIrxE@qxB*){s!hue`rgpr*k2(y6`+Yuk6M98h0r60L#OX z%#JH{+8~70#R$2)6?9?~rD~jw zuaZi)9Qcm@hsh?g86rPJ;%E@gBX$mxsVisS99WwBGk0Jh4oIHL1!_8>G`YL%lm!=X zpoHN867Gt5XGWJt1h%3q!CK&}vNVX6jo>Ie{;b4^Lu!-6oy+Bpv*NU#nSZL&jYvR9<*3wL+_d~^hkw4yRr`o z>O`GR`W(Old9kfJF?;^#IQjdsHfbqAA4`zN0 zQszP4+z{DveGcfCQ1$B&EFZ0%#%3Y8qB6wcqNU{C2q6u%Q+?vY+F%gB0)=r!-({&K zZDrCapX@s(7VY}1It|}p(#qM_^3Vt^;?i`vu^MP$VKVW1ljVrWd85sSg5wQ0t&^<7 z{8FL?Uz9cDOA#@im|3rr`7pA*VmJr9EFNDKm+;VBDHTydYHI_9MzM>$%Slo1niEae z18>`id(MB9J56fEAj3aQQ@X}RS=Va+wyj|Kx^?V8XC}*}N`P&(kQAXF{_wwqSrs_h zOY~kiiaO5cI2ULN>COEAJGPPX^o0h>E`^mCz={sGU@Ff`aB`@w-$>})F!*sMnG;yx z2(s41yN3?$v|L>_KOKY^3Yn7_$i9p< zb08&_siQil=HlV_a$%tyxte!dUht{2s{Xxxz_cUjE3k8a62Syowuy9MLZNL)Npfi| zgu<*6du9MLh|m|1Q3U{!NH^f@b)n|Bi)+F{>+8pGMKNJoI%Be)@}Qkif9KrJbH(zT zU9U~@&vB6LaFe%0)`k=Qy!5`9*)bTcgWngVEzN$4Mk7q(a|rT*Nw5S=$`{Wd&V7XF?G z@Fn3H&{PAN;oKFfd6Y1@3JB{Bv1EJiON_o5sMtg|Bj_bXUWykQIF^5V({B(ZmwLIx zje>4Gc@O7i58VR_A2A;r6gAM|z*|1wJ5jh3By^kr_>In0dY|cd1^3G4hIPvqm8N33 z_c9wsiYE5FO-@g=JNhi6ZtU$Fp<4@6dTK`QxxdE-lq)gpX)(-#7~nj>OqsCL)Upy4 zgtMW~If5GLEywpYHahrHI~tY+I}*}7MoPyw$O^Rq{<=uTZxxY4tsU??4EgIk*``IY z3r3<;{b+G}&k2gGM!VhO#c?SM+!Gn@uU5(hVUUJ%MO43KG9uFkN+4_$h%&v|(3X}$ zHbLY$fb7Zv*`P1f54N~$7$KoqYx7`@@6}q(N~8HVJuW6`6fYm4GY2DE_vi;Fce#5B zk&G``GUpGdxbSHtF|mgpkx;mH221mIJCj=bH>-1-$Kobf+yt^cO{B@w{CJ2vWO%AVuCHAHqW1Z}R?@M1#ZZ zFyW*Lyrz2?@vIqSt#`X})&Gf2G06$3h$d2fgULQF9xhUCl)9B-wV3KvrNg*@T#}8Ffz`SppA1~G4|GN3;a@50*dkdYQ z@bPuR!B5~H&2ckN;}?A1R9y&^9uuGq1t*cpyJzcFx(syohVCH%6d4V?i2p59yRP;M zS^`y053meOd)A!^)!bX)K}ka`+R0fv^};p!D~+RCJP~EG zZ@_7FSsvh=&&@P|ek^?V3I~{Jplr8;RtXgS7Bn(e=sqHe;#Rhb!O?jch+@esDDM=q z`+Bp%9$)H*2Ww`mWP24`8(>OA=BKt?e9qDQvQHH`FWPOZP|FdWB2i832;2NCcx9qw z1t{;}=&jqLp50`^Rv$^&ph~_o@1D#GKa_i&es|d_5Hv3CAvk3KDF4N&yt3Ac2L&M5 zSPguP3cFwdmkQMMf$)(oYnlfe*vkgw@timjW&o@|PBJDZKk9YEm4KvGIG`iPr?Hdr{64{cdfUpUTcBl2~+QyAT zxhE*$zmt=#H}fQ;vHD9bYo)wPvb60PNH=s2d&FH$!;n&Q&1`yG+Ku_p zywdO#cux(GW9#Xh@-wtMDaW6q+ezrAV;2lJuzQ==DBz)U>ncd8}>o@AhPvc-h( zxGo#r!bzDpH*vU|ZUw`}Q?CLXI}k4Z(eCD{k#^F0Pq@^(!bVkMG(GDI26L`5>{7kDJ6M5=@H+J31J zFzpSKpBau?@?-D?254`fPRW^%as^Z(iwl?ra6{6WGbzX@2`RdguqlFo$Bq^aD5UIy zidt?&_hEJZ?Y}%z?<7Pazm1y%$-&b3-&Q!3z*Nn3hz{-oZDzxhsS3I+U@BzyX~Yh2 z*!vp%Z&(^kLUyNad?=DfFB{~&U;t}qaJ?tehs?}y*UNuw*b&7w;gWd}6>!jsics;^ zGIgN;M{pt__J4&Va)SiS+9A<84Nj&a`bX~S5wNhLX^k!8(%7IX2W%1p8gMyiS?SW1 zhCxP$h0z^8Q`o5ZJBk=us+sk))nCr9R$Fm8E2^B69wp9FJGih1$j7yMEsLHXN^fX;N zIhNh?hdu*g?D(Cq1xwO1p3)7qKjeEMGUA9ozdC>N)aGmE+Soza5O2l>gmv7nGpI)T zuS18eRBbw%+5s_SEux*P050b1C_HK@KGW9LhIQhX*mA@4)pe@IbA%q2R^!5stv3aJ>ZqE6$TNJ{-{#X?rzu@bhAa(Ma==H-A7qevK+E>#_Ab= ze8&zkMlRGbWa(n=VUd23!D4{4(g-YBz znHMPl)ylv;+z?wqPMPts3VCi?5AT~qRbsZnJ3iA7prL<~4FSn7Oy18Jv1NWQ@ z4t!o(8f>3^=>X%0cG0_@7rO^luH3nFmH@5N??tY-kB53F=oldQNPli}JT%|a>j`2g z0JvY|Bp*%a0c?uws~3u|77|okFVfOWY3@71I>ry~)iQg( zw@uffK4>t`Tt+r^FBN$-(Sw(V#-RfiYcjMW9}-MuaaLJn;35Nz$7?6~`k!v+$T@Uq z(B3Css+i}{x$$*1VBa_H!hak<<7B`I!SZH@_Jx0#`qiKVygKpBnyh*(ra-L*O2}DhuQ4xL%haDtp01^BADPuE8 zrEyFM@Nh`|b1|~0gH~p&XB_m|y^#2M1pu>)<+xMFcUgJv=)o0=nak@8f>&1C1-5KqWzg`je%PN9{>CocUuc8k?{=8aLD%aCvs_Jntuif& zt8?o)ct5M#AZfenUI;%s-5r3_uDgoNdfW*ZEikaIf~25{FPI$9WBepmZWM z9?;lzFjO9h zN{}!NDWB%uNOi1RV2;y=u*(1hpI`HOcqi=2gNSU&?RU6e;l=&U6U6K#1zktONEsL7 z&ZqL>RkWkP+qM8bPqwb+*6-nU*ZYP*HkW8%h=c$NTq-tCU@qb1{)!LY zky`TZv<&zM4(nEhnL@D)@~QEcANaaY)^P5jTX{zsk`BD}FOfB~s~F$yi|C0LLdYM2 zDv!4BJL28s5a?8v%0B7@E*-2fu@f|L{N_RiwFmw=l|CGLzs2{f7~EEnMW9;ZTfH<* zX7h)g7D^50?C{ab>()X3-Uha*Py8Cn+fA_>+hGQ-U!$oJK94-(y%Nz(}xDhWDr_8F2>Pi=f2sEVy zBK$8a4!c-HnZ~Lbq67018@B`S1;V>WpIia6b;pPdbM6ZVhADk7jn=eh zyF}*5WA}1|kZBlOef<B!=Lc@3mI!oiMxX^QFyG+&w;5TOC6Q zF&sae>rPDn#1pFOgmuIqM2Tpy=tP-)Dgv|v4C!*HG4b|o@uUW-y@E1wK}o&Ao4H?y zNXtmQIPvMsUO-@HQApNZ2+#=%vQy_g!N-BJy}Wt}Z`211Ik~5IFcB0hbPMY{FuUE( z(ajq_u{eu8K~14f(07d6zc(p1(S}Byw(?_vSuP-|et|JX3`WH-F2iTw2L*hX3)If# zRx<`#hTheodeuLViNl@ccy}yy>hTF~*u{8lsQS5jf>L@Ai*F)wdI)jC3}gynSch&&^EAkNV1Pa+}I%`4|B1Z+g z%kz~5q)41NQr|7}#;Z>@Kzu?_sl9IhNl3VAO00BWcv!lFJ#7CUZ&_fNkeTP>mclRP zy|`RWZ=ZY2=fpL8x@R6$1EAA4V%&zIhm`JrNOS9ej&$b$h@pvMnP-nk+J;Lif(?Jw z^k!&(Qkoe(!MRi=`>~sYO)zjGxhqfXH|y^wG~wrVew2x;K}TI>IICkhbO1B6 zU}gkyp0R8q*T;P~fqiY8eVQu*gSCY!cE)K1Q=U3ywrF98jplS|0v@C_Y{un>?368z z*|iW~a5p|R7xG_}fED}lpIDsix27<8<&i;WvT zh9NlbDlcfE(!v5^n_Rs0Je77Nf$Eb(EoLWztL0|GXZL<#pu@O@4}uU7_3e<)33B!k z+yph>^Nb}2G_EjIKv`ndPYZT-kwT#7_s}`d(|5MQ9`WCu@U?{vXQK!1TCC zRlL%JZOv(8B;cV87F4Xk9{Uz3bEi|C;dS9d2;YxJ6xh}DNieRHVJD0uL^+lMn7x0( zn4oQ}zQpzL*X!@9;Cg;#;AuD^MFVWrp#fXN|H5>UQB=R@{n#i5{CBap#0F8-!Qy-~ za8OS9a@vMAJv9@^1e^gTwz=#>B4lR-J+7qP-Qyb>KKU9ntSbJ)XNHO9(j2{G0ZQ~t zf_a!uAf$A}FwxctBNcM_D-nJ*a;2nDjc7sle!Z?eKD4193Q%SAL&(u4u#{1y_G$Q< zNJF2E5`XejM1OYrzg!xklx!K|Wu1wvEb?P``WHccXY(Uk(W+$+1Ke1=B;vUI1@}IyheHoJ z%6>iXqu#9D~}N6+`>0-bV;RuL2ZHfEBIeZV*2`TFP%V$XyB2SH$FcVJw9x+izD zHN~}JA!2uAg4xOh(#kgp>xhRddjp+I3!Ly@_j`n`pQCg$t{_Z}@)7Y%2iRs%B817E zgl?2A6w!*!eIq%+WT#KGErd73#re8qpWZ(E z^qyyQEMugd-c66Szb)I~LRiW2*X__4@JYi*>e`ej{wkY#C(jE;?R-P58=sx`Ys@+7 zZbzd1WbtLKDu+}g)v2}Gtj7hv6D40jt{vuSQXS{$FJ_5l>cqjjsGL{ zDvSV=PfhZkkTnYDHS_VrhKsspU(z(L>^pF^cMRtdILr0m!LhK^%$|DHVvsjqxe1}% z1b>%m7&PcJHoiEh@Q~;uK9~3a$P$?|k;4wdPJSsD3CP%qRUd!{-0LH}+yiQ3UOjxIM=2j#uQ<}6&u$!-Y5tX;{n-phnmHdEq9;bCUMHgxv(^rYy#13cNV- zZSQL%2kk~C(ZIA{oSx-!Z#8Mv0vQ8#1ms7F!oaG(?Yu}L++}zUr|#%oO{dK^H#eIl zqlP&EPS`t@xG^LhEGUQZBulp}p?0Mx-dW2A*yE$UCB`6sLP7Z34*{lUv)oK+=h5R0 z^tBhhp|ou^`+g2l{hw|P zHv)d#b2^Pz@#Vez^aGPuVlMIiq*J^=fXLKt=Td&^na|IW&ZD0lNzT@ihi=cYT&c1? zr0u%pkP;zDM8@ZblV#@+~3` zQBuM4qz5!FdGpRuSk0-qoSymgT-Est=GYs!XB*ec2!BOg%Wf#!a9KbP5*tF!b7{P> zZD}twUmy%|71?b3Q=a`DPUE6YYW98(i`6yyi5e_W#YVY$+C(ME2V(U?*sCcY8u!8_ zA;ql>vrzu_7Fm(x!We;9qHU!v!|<1-t1*HC^n?+9AmUhf>);c0FmVG2xONk8C8)Th zQBOtp{DZr0im-I1sK8HfyED^vDUmqcfE2bSM%AdTaA(5yGuk6&Av-B=;-@h|o58kN zFsJK*7M^wOlNNd~2pc5?jp_qcU+j;?n!ESjOH?HGW3tVHt#c}Nk)g?-3Aa}g-XtFuJvNySQElp2|8L_1L+zS~Y zbK1pNu1t<0-Gc0_SqslEgI;si+;I3!53ik(aEbWgbpvv3B<};=&Dy3LNk_t10>n45 zO`<%CMM&6`wA>f}ig8qzpDHJnd(oPDF`_K@RYPsYv85oLk1ZVj3czZowLsOTO`u|d zd_92Ss_2<7-S2ZGe)z(McsP9XUP_uY2dcO4^Eu6}IG-tW$eDq8C{Zvtj3u5aUH))B3g5Z{YwzqG5PDYxV4{Gbuw;^+82Aq=CX})C^ zJyM))-I7osO#Y|w_a_N@tuJ~xmR8`JhxnF48|dTZwHwnbc%cgjYMxur@NPS9Z1^+0 z)dyp=%KyiTDxA?bun4w#oA`TP0xD8+LjrrOlnG9p3$Q177DznlNj`Td|FE-u|D)BP zG(aU-wYk%Uo_p%^k1TUt5wj8?ONF&X0V_nvq47{MU_tEWWWjV|u10wr;%33!&Y`)a zR!O@7?4Svl4hO=SQLf>%tx3^=t;Mq@D8|Q9uPcXY2|$e4)0;@o;^)SLr?SafDDe4P zy;7gXWzi?Xy>?HTwSQPTtn5JzMj?D@)^m76UgVa{U3dUDg!VX668IFc_5y$#I6l2~ zfY_f5=w%N>37!YHHW=`axpnvSBLKVslW>%9zk`+U!W56_L z#NH_BH>=YCas^}1U|yOxRvmnxG!9=2Xsctex8CG z&-^!MIAqkpgob|DjRXh0?}=#KzqPM#w&LUf(GGFjTl-4b1iOC1fH|am9g4CAjV^Dj zUW|JS(J)9s)yEe+ag+V`=S?BEiFjibTheLe-a;>%9BneORjl>0>d!N?qQpx_g^3)a z_<_EoJq_awO*wz+e}`SJg3yT&=laD1w7CpvOG2*`*qY>bb0*lUT4(@*PLo+w)apV+ zmUV=Z6J=vxPG8u8zRx6u;fwu+TjPsP)FGTm`GLtsFZcQ1bwJ%$*nQl>R&8aYC$ zYkdbg7ChUKA7h2C4-$AsgrQkQWa7u5U@n?NMV9zBh{VI1x~KDp#Mw>kOx&fl*V|UW z1~$d-fw*{KzZQ65%BAOcju}KrVV9^3=o;&n8iI`cVax`3`y0_xTJZ*^@;2ptkY3_^ zYaL(p*EzGy(()bkKhh>0(oM?UYmEoc0_1En9= zQ~&ev>aL5cj)6j+MrgBaTJ!e;ZP+xLB(Qj%-wXE9;70W8Z7i;;v7I^trvH#{ds|IF zAB)=kcJ$vN!NuS(k$;_x-Qi+4xtvWCMTDfz#L7$5V49VRQI5&Q>2)!D3|Q(E57OS} z^9MYK{qpV%N@9{s6EO)2Id4q$oGj>j4uC2`gJFQ<bXRF1N)Pu%aAoXer$iUv*^gMK5q@#|HN0?`#NHesDY@C0ayh>wj;s(|aM z_#i*;FynrYOmQ_uz;HIs)!ao%lO?M8zQWt1fXik7ra-hZA)_#8!0DIwR{lRZPU^XL z@e4`UMz11Os~9jx?Ak z!ZOHef-SO-*kVvyGu4g1HPY~N2*N}r{!wk$dIh%|?>;a_2`Dz~xlrKJ=#(Z1bNBUm z8ys)&V>m=z*%E2hM}kX48<7_Av9tF8gTB}S$Uox^J|gr9ncf`WO)gSVE$zj@bn1Pv z-bdoPveg?;CZyA{;^i}}MMduq)Cp=*(nfOMd~Z01pQYkaoovlYLQLVO-xtEoT|LFp zmtt&bJnSCV*^95p7Z1A=zgT(i_BB|hK3$QNRhCh7n^s*78Os7O@)+F*{kAh?27)xHt!fCn%QYB7{a{7 z;Kwlo%lg7wP;55Qb$aAJ>5cM*e%Yo&kqq@^2bVWc=f+C6v77VlK|{K#MP;skKQWh4 zO?4}SuKHt)em>MG4s=ta&9cwa*N+X^z2hIaMfv%}3YMuRFn z=#HYY77!@68K`kgQ$UG&7Q>BSL9V{S4V|A2mIoS4q=2Q8v~UtQmK@|X&(vdbafOi4 zfJY*9xy-07V=!u|6J9UC?}T`D)S-#$K4`6RovVVOmqKF&MUF^ue5G8ATocO#JvifSdAWk z;iH}?#`4%_VswK9KdiNG&DjA2*2YYZt>c<666+u?)#?aVol2~}|K3`G+5yS9?5Vc7 z-d-ZyY}LmI(ms)fX%eW6!#?Ps*~c*&rR6jdaKNTDZX4bvlFi}f$*fF2UGq?TvF~y~ zofNG)N8Hy4`|67J9cC0~)x;?OAxz!@P=4{s{4nF=y=BVSf?9zRh(dLzvyfB#E$fI)9Q z@BL^yH2$x(BF;u|%@9ky1g7FMjO_x(*D>+3L!&;Bu}7RTyTQQ4mXbD(Z}EU&s)a_(+hyeOqJRxQx$*piAXn$W(= zO;{ICWv3tFS<<*i8pu2D#(acOTsK!~{Fpe!tCee7!KuSopn2IAgj+hP)}<8W$;oN6 z#rfEM3k_Gf?PKm7={m9>RiJx;(ve`sbD|yMyU(*&HfA3B5$~oX9{EvEp)MCx;uO$cd!sqRn=gC1{0?_;R1evn6 zcrn-gF$)5Rl!=xrhW=yE1G(27#x0oBO`vYK&o;O=ag{jR@(MXj*rC3?HZ`Xo*OXS) zd?;68*r+>|5gOwRc;2q@KxWv^7j`NwJ)H2Au%;}pOp`Ym4*og-J;A;Hs}`*41hXc# zv`T(7I+^qX{@3TC>d^G=fV2#NwkevTr5mr&ZS)acg=2QIq2pW<*(S|&fQ#W% z^KmTDRJhLBpvssq6t+@1SadK~!Z&R8)sW-wm&0S?(Fg<}7liSLg6&A&+L9nj%{j$B z7U>!GAGodK%zIOAJMPLXOtBTvK`YCx++zLV7!fNYbx8p`{<50KS*#LnP?|vMA{sr} zX#fycFT`UConAua8mv(nj)9;;fJ)TzC*-^KrwNCwhy{!}*0;R}I3XGf_Fai4_sY;R zcw8Kcc6i)Y5$LUBP#LK;D8IEH{u3OnhE^|S`{b#??4cjYo@0%#zCSUn!2`s zP~g&P2J4%>y2>e_HVU<3$nY!~$lt%QD=bN%;ijZ^){e$nZy?S;!nB2@N$hdQE5?ran zNQ>5-R?jbVM(;SX_+KU{$3#dYnoj@c8@vo73L%x9CHRH06*u*Q&-MA&bDP4YXBXBx z{qG^UrMuuUdsK|Qua;0r&OFGRq`k*xO|HyHb-JbckJNouurNVy^F|3K8=le!ikqkT4eYpfRj-L-0-hz6Ym|T|`q8VQXleh0RZM9tsp7S5uFPg# zl}}C&uU5=ea12*n(-fqT)hgyoS0 z_~RldkD%?+{ijmH*<+a(SxMjYjwhVEY6OJ8=ct|Mw#Zv*ALiMMOiC(}&E!wMl?*ag z&ucQrBEQ7vjN8%nW=mtC>6ujzVH+LMlkV3_?%t~ygwfFB1$yXV7D;Knt}?MZbj%bD+jK#85eH`ve}mtTWc zM$`%l8MgZXdUNBpf|P6M|wBSTyC=}U$7OHOlSYGyqvx#y;ckENnG&o3z8-`;or~y zcog%3$D*yN2z;>7d_vxFEX@NYH*mOD_5Dt+S&6uVbNQH;vXLHbMDZt_b$SZ<$mkW` zBDQIa7(0QCqNyFBNp>GoH6L4Cq=gT_gLePOmmp5_BcWVGO#Mlr&!QiJI=+f*i5Sfo zYT(8o;yH#+T8a4SJZ(JML_{XnhoNX#(=|CL$xVhX&ev^SuZ( z^HPTf>NWNE=bivqK=|c=b-FL}{f%6Nk1HCz@WYSMTDMJ!%;86H64q*-!I(J8U5ie@ z`N?*dGn2#BzAGQwRYUurKkwtr>KhYUjxF{Suitp!Bw{hu>t%VWQf5j8EJZ-6UCCG} zAQ7-pGrf>2Xz5l<+_@!W+caH2lyCewNLz9ZQ$igkyUF_Eq*nrb)riw^NCteDEH$;b z#2>QWS{Ar&g88Yg){HT5l(W87hm4wTacwc|7n1mXNv>%MG!KdyK z>5@rBsmGf@;BNoE8NsSqHw1c|67wb!(p~saZalim176cl;yhO2oyRW>YnTL9v~2_r z-a04$4(X2cfn6TYJlXj_p~(bpdGAi@-sguCF?QWKl%^kZ#8-p$g9xGycE*jQ)+Q?0#)7ST~-jlOeIF$9Q?)OY>nMvwGwx0NO*qtuM8 z7c;YnYI|+Wr=I101v&D{XFz9K>If0&PKN*Pb>?@wrLNoZ(6~^J3}|`!wD39uWWLP% z=zEJlV$B|!>{hDhk-m)@ti8fW51XNU&iK}#tacJK>DCPCsGHB}i_A7HVm6Zs-BG!7ri#n3@Zb|w8pv#$-Qw~d}=M* zbkmR`tb@9DD0OPTS6lK}*eai~u$~@Ye!slAIV#t%sH+c`(L?*~m>Qv_2 zfM3X<0!T>U7|<+02n(^X@HNB!xmM4c>Jb}$&*IQBqvZcs7RLmVr*dI!_$%0*c62#B z4}9tTGALKv5f@8?XR}uV&&suowLMC$3N}#Bm000bL~sy9Uy$J(7QM6`t-(Yx2Ff## z)^=v0OzL{&hh=7`AISBkoj@FIgi*!Yfl{tIY8Bg-K-!s^7bAgDCCy{DH0_zYf_;7?3hiB_iaUBwx>%LUG;@Q(O=Or_$%=*;dH<0>n$-`E9ehP;7 zgOIZeNDd}xNJi^5tovHAZWK>b|2yNwaB&p1N zSWMe#ce`JXX(>-vni-Ei))Jl5G1+(;%59J)mLXqRntdklBiE7Dk+{x>W-0h>>AlDz zV$(O7bZ#z?sPUA;MNGec8i=Dci~Axtj0GjLnM(Ws->D5~6!4^=?#FPaFqUwu2X5$R z@cF0TwMXKRVOaa4u^f3nWk$*heAoH+@lHxLtEtqmI|89ac~YF8ZeJ<_TO?k?f8ott z@87+_PSJ#B(^-rLZh1rB4)W^eqa}ZNhJ_t)63`ih_*kI1$@w)JG3*)DP;!-h6czT& zfae4HJc}>VY4jbqrECfOx)8M(Mg&wC!s!dxEIQwNmFDJeU^oG)63Es+DBp(py8b2* za~FO`LElJLI(^vu(e^8bB=hg=L7^zCjeQ&q3ua)X)c548T7W$GX+BHXGbQ$iNppY) zmK_;Ly3crg>77rRF_P0tp9zTNV5w5m?c6hD-qD28fx2js(>adgv`8Ha3c##JLsY;O zdEt$CrsbQ8N!h32-N5I!#?FT0=r0MSFgRa7Ui$Om9=!@p9I21wLZ&}CamcTh_zBWH zUq9VEm+@GH?NAdLAQn!SjR-J=(xJ`k98#dJHJhWr9oOhH@UyqLah6)2(fP%I)wqvR zvE7m{@D5P&!teE=M*x4A3?hr#qI@~I0auQdcQ`2#YhY3^7y~{OQ^PI*h{ozQ(Oxwy z5|~g;HtJ^Y!9|2HqKxwy2$)^%<2WOSLvM+fPG=JC19TUs#T`7DB&-|Ox z=keyLi9rt0XgPK6{L$!H>tAca(3>Ie3$$cbW3w;3e9z=0F=_w7kN5Q#oiMWT zi41R5yF(tat zU4~RAkvP=FM}`#9N*F5+7cfO^nYehxfkR0bLOL2x2H$9>h1r%lCl5V@YDAqVBwuXK zVm-(+?%^*a$!--qa%abSiT4bf%&2BT)bjNH)S|w8i)-jMJz)mvhg}PG9 z@*vR+reaAzWr=F0neiQh$_RmX8{Y)Lt8ZPO0x?wB@iHr<%cJ{Q_1N^1Fl!dCld{HGQf`C7So{;h|VL3|<4<>e65~ z3iPxIg1cML<`dsT>00U`4Z{AMr%NY7fbeYmH0~T7h_Yc^h{L#tIp_KU$dC35oCDlK zY2mtrMhadnw?7;B>&QOmD~u%Z7;s>XKqBpQe%}W1DNh}=WE2f^Az1IFwNrp!K?T(nHWXf!cEsZVK+rJKkna_FDx^0U?C5@mXm#9e)(xXrI;y2xbj*z}52SoA)R z7f|Mnr+d}KY4=K0s%eJ0dXz>0{~jupF3UQnFHUxMrSZIxOIzAKlO_N+0_bM*nNhal zM%vd!#vF-?Hce1Qcbz1DDNN}q%v?KYS4_5Dz`HcoxMkHHnHB1F6#C)VSV3#?@@7ME zGsS>AYN(a~5XbN_#_Q4}&Kt#+t!w@sGNJ2esl8@Y8{j&t%64HgaI5-rem-h=WeTy(#k95+ja4d*RIA0u`&WZslJh!p={rCKY<-1O)78H!_LKdtFlHeWT zO_Ga8x@2$Jxy*yyC!D|ns3A3q;r8mTvVdFOqf4HOe-4^iwDN1Qg66PNoTCxg0vRiq zr1I=%d4c=Fl31i~E&_i9r58VnMd<3(a@~?xrNB%$n8-!f2qDALW3Yx(n8(d7TB&0;xtG8I_u>{qitUREw_)UfxS{8U~%0g!~J*+qD+l znvnm=+5yctj|JnxW%o%7%#BZ-tyC)f?cT(6Bq*sHSs$t=)1M^55{cd754TJ9eK+Q# zHpu<`lSV6O=xdV_IB?t91CCdBlnIN;SkBx@0ZA;gprL#r$+C4R;T_wi_I&0eP7e&B zdrH+m-Ho;4uStw@8jEjI6Xw+GylB&a%hnaQW*KUsFyw)>Vq0V-N5-JC`p~#LR}v?x zP-NKXBGsoxx%$9?5#Vnm?sM%|-eMwF9f6RPv%47j9=!qA|F}wYs^FV^fAf>*01(L* z2aKC@qdIqlr_%Vv3Bs+NjO?(EM6Y5+#B)B-+2t(5^&7TBuqJ$;rq8U&;HCszJ6(jd z=2g*Y`%tp&#YiNtuY1>2H%ZcXBF{T+nWKCOfWuc4zMJ8lvXRBwK5!OkCsG7bGT$hX zy@#qMxK6(nw90P3tNkL6A+Zwg*~<188Q1KXfcKgNqOCZ8;KSIyMmdLcl-)}q5Iv%;+JzO4Z%BI#w4qep=H79 zTtDTC=A*_lRMVgL|3gjL^HDNV-CLfWP!Xi`5Y&EpRc|H$gqYd$8N?UNX%$InYsd9a z-!X{*5z}*+q#2#_=6UU~BXt)s?&I!=wL$Zy#lW!e)e?-W^7R0N_x{Ol0rJ=mI|P^W zANstq&>Z1{$Hl|9my1&DE3xoz+ES2WRw*f(J9q%-qk)~h-30>T_FM4VIeLBQNKX43 ziHTw=vwq~^vJNG9xd!Y_)U9Oc(rO z)So6}(+(quoQD$}aj_`_57HCxT8%;OF?E}2eXP)?&46eFjcu0Y|4V!Nc|?fN`EqLY zVI7szC%>T$*EQOF4T2PbgnhBuB8)ixzL+1SjOAUBnaltP5@yaf+$yk>RZ~ofBsZ`} zO&e|@S~T^;`jEh{^E)n4jDX|E*X3hLYCcS)jEdrw@1ewtVYzgrbn-EP{f?`%PQv!|F5f$sAu}y7H&l)eL4)Cpz;K0`W-lWvak_!wLhYYgzCX*ho@qt-@D~#djj}?YycknGx9YNyGvxnoc1dr2C4w@{GQRheS1Pa@NBE!8Q>y-bzn0Uvp$3 zN(NUI|F`(u zG%^vjh*mlkKv`kIl|hy_c2SS4n8>pHywqs8WpU^ytzh0e_o>ZU2tO)}iB~&>pw& zSE?>!Tz)H(1fxE0=(IaWE`|q11{o{&v$rpT4QL)GpWBC(Q-^53%YpX)YOGPFdM$>O zC10go3AC7CeV{GPV|ZDGkGj00g9`_g8isPxUDZD)lv}107(4`&v^00)~pmaO=$H5nL4-2HAxd zT6~OXjiJ^aS1A$d<2o81?It*GfOHWU>PGvWuVC#a2)93ShG|oNwE4zZ_}fE2!b)D! zG?wWUYw2)ABDr#%O@vjtgPZ)gl16L8On>UfwHy6&_G>=g7nhTUh>A8E0JY_5s_J3K4Lb>3u%P4+4aff%2< ziN=@O*aJWkRs|ndL8AJH3S0P=5AVS1W&w-Bo0|0McuF^~7`p51KEvmCk*yWK?-^z{ zQqJ!wv(|ehRv}?&IZ@ly>cvJ;*N3APrKi;~HRok6gU@KvCk_)+n9qX-VywrNP@hS< z{J(t<%X^OGk1UDvIK_qW8-*=U5nCKtAwnKGTsTAdY?V&0V$SLB8ro6-7fx#OyMxYb zWc?#L`H&g2=19i5i^IqpHlJoA^TWte5t7thpHNoVr=P^J03#BM zHV3m0*Y+%w_)4D)>g;jU47~eFh6!v}ULPYki^{Zzt7WAw{#V_4B4wSqsayqZ<}+%` zPKSvGkAQ67w2q=MRy^i8dOOXCCxe*La;qdL1aySGz)3jT0c;PFqRzVo6Y7aVh z?fMRY!T`QxU-+xMaQo=8Scg;uJNA00iI##aH<=Vmok!yiNja`vsn{gR4v7Dczn2_j zlJC!8A8dDE;Dx4Qx@xn?2JR*({3mgj*4PD-?dKOqr_$S2A(n}nY~%czIJ4?uYm04i zM8(xJ7aj&w+4-zxX1rP7lCziwkhS~jj}i#kdp92EXmRMPF$Lqj@j<$f;cW4AibS(f zn7Z+$SdO~emiZQh)KK*T`c)fLcXE@#InyN;51Li5<~6m3lhXvYsVG!w1zk?nd+aWI z5;SvCb0LAindQCyqFAU8JxeMjLO~P&Eb5Q;J)vfVb&7Moqv%FRE(*HqOu#>;CLdkD zfjD-jCk8;C3k8g=Qe+&r4pqxNF9HCO;Og$aZY-Z%FFfrX68u4?Rsu;ZCYG_=Ogd4Q zS2W2{!?qeqUo&>KkIxwyr=g#D8{95QIiu}RQ!Gj0&^US3-zIsA29V>+u7zUy%W7~R z7cdM|zj!#xnFW`x0y_wa(W>J?rN51+@#~de07J%+RHL1uH+T(*qRZ@W;{;1${NrRb znr!q0u^YMb8WQkv<=c#g8jLf$*cHaM#liaw8fIzL0kHg?r?sIZ#006$Goq5rsc&^6PfGJn=`{^)`nmp;67jO5zOEPE3Vgb?-2S}3jH8lvu)MS zGh`0!>~INV2u(~7OOlic6fG+>`&*x_Do7)>9s^ct1x2J7wO?pfZBq#zPbFJ*q!oMv2X-yT=}L zr8M`E5=ZU2rEMOcL8g>Qve2uu58CT*XDvoat~UQxH{NLZP83|v@*U`@7i1!AoC zr2Oqs(_*5R#nO=ah_t~ox@d7-PN}jYKW*T8z(IjV5VLXOX{uxqC69Q2-(?lQz*o~1 zHL}NOLuj#HtES1T2Elh;GN^ zGqB>#dg}4S1bOTmy;GB|vG}y1;fkL%?AwPvYF6MfM&-VNn@4=kJh$4l)8}ok+zEF# z^?>}|RQT+$zy1#-wCBH`I;T~F$AOAc3Jr(|qx%wsg`cygg-5W{0p?k!())CO6j z{J02a++Rc~6-zzGHOLm+$J9!)>?OsZ*P+EEZBJ7qxxFB2f)hzsquN`agro8%%T_0H z}*wUqfisE5eeGN0*^{ei67Ne6 zT~(QyC0A~QaNc*Im%!%wcS))dc=!3yoF(#Ox3s>zNpaOR2|v~XGH*_eovRbB%B#(6 zmS#YmBD8&U-Ni2$K8S{IkcK+@AalK*vt| zHN^3!B5k;sb6d)2S{8xR<&J^Z3N0vZa}kO3SUP26da$oxMfHz(rifh2>=H|F-u2R-Frd4Z)q}P_!JE&By(RTJ4pDM0 zoAW)X^bc&;g*3S`c{j?vhYWKzP>uMv1o>OStG{lY;U}}-7;8v&SELvT6S*H9;{g%H|==%4dE*MTjJsvxz*LK!XP!WFPCmPA4uD zYMy8Rt7UKxhFumx=Ik$B>~l(35xQ_q)pV4pvYA5jOn-6a{VZ6acl{dDNUe6su?Q>j zF}AA61KGO|tw^fv%r^Jm1Q&715S_Bq&klC*&^0A0RuwHNodSEWs=3N zMr~FNC%hF^7+KFT&-|GCD~BEqf|uN1v7Mn+;`qxI!3> znng6h4}iWDyUzG%Rhe2(VnXwkqZ0Z?7NT-;fLd;;+pbH+QC&(dT`n*E?(+NfZ`Xwk z43gFFiP&z`_RH7Tw?&8TUlqB4>jxVzNo!ukqtdI;4<0VOBL_^T5XnZyY(W{MwZDB-2S6F^B;-F99BpvTruIeDi+0lNCljgGICf$haXM z#bsCH%r430ZwCTGkk!K+Lt4;I_-9;f#45`y{sP&VRU>I(zNn04R4~36$_}wsS{bx1 z3ykh#%ZzlV5R`K0rwoXalyk#bG*{2-M}^nRHnq6c4L4MOO%ycG{1A}~W;&HHF@p`< z{j)jqw5^!hY9{}Aus=$M{%6AF!<6*Nrrc9)`zk_%pImT0v@*tNo&4ue&ThBsIbrw()CA#=sAQ)t4Js zs~DlHL-*wpFm%_wCsUwtW6!v@;Uv29L3A%w)Elta7O74B0A$*5?yX_gne7AW9qv=3|sHUJ?>iiCl;YRtseGWg9J z+u8iu67XPgm_AdkF!$8_$!xvXzH?I0*(qP!LjwyeOZXIBtKmtC9=6}th`hm}W?9Pr z#oa0TTIyIiuQz^MVDV?!>HuSXA~?O;l&{j-4I4CMl_4qJbJ3$%eXKrPoawRHM%^+n zj)Cp7DFA5PNQCTaSMz#foE!KBsO05VjntmQ+(4+BbdUqVbUtAq6JSB(%@1Yi$y&ai(v^9o7zFS-w$loTrGjlx%%AkQe zE2;9ETf5-#3376YrR+&SPP(XO@+rdix1!>-4dE!xj{=Ch5XGj3z_Ah)F@0}Hw(}Eo zX_Tufokq{bdsv)8H$^}z?2qrpethGKIJ&XJW1paz;qs-*?lx^)hOy$Mci~=_MjRCH2b3JhWJ8CUM%!sB{UD;uuKx z_XmgAMIuNZ#lN+dB2SN0wQRPK15}Q%=*2JktC7?%)Ic}b3s$|u(GqaJZGNmJW`10Y zpm(b5w65J9)`!40sE-%t8UohG7)c0KyZ}kHOXhf+(x9k9eaoJ*72j{{{l9$z zitnbE0Y}d#0Y^(@GN+T(wHCceK);Z_I_Z*_*Ufvg@ntge}d7p4E%1I6Wk(BngN6pPO2rn8b^2HS7%=kCK2O7a zforT0f{zM7iNPu6IQeUk#jNQ$XoISMBP|f0UeF)VXl7tbsRxe`LJl_3bPCLBf9?al zdXnvvlpbJO%=Us$?4&pqrCrZV13mOP=38_YfYlbM5a;enfrC`l-|>C zgfObT#sKQ(xmXkQlRb&vk^FJ1pJ_5S_Y;sO34B2k6=Kz}PR$PBZW_})GBen&{6T&@ zog)drz+^OFfh6#{vm>2qn>!PBBaFL}C&fj&#Oob{T57*IPWI-K_OBNYFLqV;Rq9zW zsBZxS7)3${Cj>p)y$|{HgS9o;(?aJIQLkaGyvGl{CtngmXS~=H?k~h*REBv)p z2%Ei0bN^Tg6i2u)*Ul&&c@rM`3N9JON}-RZ9_VyL&oT3!zm6;wC0LqSD>`S%@AiCu z*1q!P99~mF*ba*y@cZllIYMYB3tXQlJnK55Cqxg;lJ$BzQPP}*7#-++kAn134)i+# z;s~!I!8Q6*L$L1IP9nfKA7IB!$;&-%3b2qDuZMp!WG}L=#xjyLJLU>imcc_RWfnSB zepwkQ6AZ41?L450oYwcncf6?|RA42dE_xEzBxsfjUqa+by&np21w>#p|02w&D6LC% zf&-m*I^3LxBS^HGg=(mv&(J1QHPeSPRE$;0_%;@qF1cT?3yza@pb?j$<_C&y45OZS z1STwxjBa#wwvj!bcm(stZ)ix)PMLHB<)xehJpVISKzlrOm(cEbQf|0L|2jSuf36t} ztk7DynXZ1@vfxgZ^6&qeQ8Q={A-D-Qa}S8W@P{#}8D+0dpb>t8~?L0`w!`kyZ zr6Y)e?@O z&m_llonf3DzMUG-m2^Jj9uEn|h}y1tw)fsiNWG(fU=t^`ExXoUAWViZ;$f;&km_Ez z$S6))T?WaY9<>;o_GJPuKAu}?S9|+HAfE-EP@)^`cu;oq<$%V2L+YB}?3x_a7>cEP zu%oBT0-kI@Zm3?A$XRqvw~ClA^@hl!OUbMJ*4o{Dko5xv$v|f@GuO1lHmTojtoL5N zjFWkd>4g;d=nH1uQ9V$&*nK~6Vk?q)_?ND=!awwulo0RqQ8&r^ad{pfH9*{-Z|2Ue zh%HlNQgi~HZ3W$Oew!qLT!LZNq4;xc2xW0SBQs(V0W&mVf)^yy@MmVmVU0H>^<%pL zxs&Cs>DFf~XcGoHj6mj(D?5L&ZX*keqbd;;_%T^-j5+;z7T5EJ?(N%m+!iAZgm7${ z+<~W6Ab^WRRzXt$>n8hzd*-uf$)9}(6v+2uNOHgSt5XPfOj~PtZ7}iho$=q7qIp)j z$=^x=N7FNN;8(APA)UK|5{xA%8Emh^x3~!`O4g!{F7wFo0zmVZ5YxBdv1-MzAs23#c!8lXX$P@y`{x{%~Stt_6Gu0M1t)8gfPs- z5(G&Guwi`d`Ii@5Oy@t13{Ux+W3ehVbeC0_=fCyqcQNXZ12r?)tQWhTrqsZa3Yx!u z6%5%h@R#wFp>ZVGMB+87mSX{cs_!czu}h(*+UcjDZZTSaE}5nmaS%+RW@2>=!u`Vs4z#;ykqexeM@jc zNjZcz2VaOAOkcwEab#W}jI5fLeZKOqG1&Ep$9*9A??*E}e!-rV1chicW~(Y1a>)w7 zdsBV+8QbFim5Yy| z`&26lNA%jFDPEsczlip$y5A0hhU->9{T7YrsGKCUW&OOG?p}V^y*dYemA%yhRi2=LgaYXE*a8MP)+2Od-3f~aulOmAD|GA3kq%oNSfXXcFhdkP z;NW)mHG9pZm53vBDvUx{uel+D- zx{zJw(ye?rI;?D&)(8>G{Rcr$$y)~}m;_ii_@+W;Xh9WyN+&oW}>F@+7{ zpZt2U15tdz!_w73^ba1jKOb4^uPE3x13DvU@$a{Iz-ufLU?gm;n0qN}3D`Ja3+5e* z>HHH-3ZE4S0zd+qSnANG(`+Grbx|Ha{xc>e+ED00_s#mbxjT2r3UEg(IULbN7uRJ`NO~1$h{a{4aPgNq~+0_ z+E33}1K|HKn{iN-D7hD3yfh=Bn`f`O*)U9Cf_(haat%~*xK|#7;fc)pTCc6>kTOtx z8DCgKn8P^u4VtRTRhkDuCnxhK!ot0b;K)^J{l0mMe6s)w8uTP+0sWc=1hj)mQctRV zAHD0tID}`SR1zfbkB1|1wVTmPV594rt8N-3I%HKmZl`M5vLOmISfgU;Pnz-KCn%IW z?~)?fzdED)yZWcsz~1dQM9eAD8FQ63<3orM6bmXD)ij1p+ylNwys?)Y`!otzc`>jO ztu#D#p0cqzHYV`(Ri=gz+VE*9I?q&%jI4gv#^sv>I#iDt4vjIWb1+0V)M!Ugi()qA zDp4omh;1qoL@OvyiHy;FvkFfn03boV|mc z$S32g0igq4cG40>5kU#F?{s!{PVEbJq@+`kah zVCV9I4Prf*(V~90)OL)KWCtyd))28HJWx?Mz_v!f zxH857RLWwLiw2GQ#A-Q1$%!pu9Y zIJOoMU(i)%Hn#k~septmVI{5+vDD9A^xKmp69o96<6K$|t}YL~lIElam+v zkKQP&r3dn;bv$RDI;MX-%i;UD{8h!BECfg%XOz;HLb+kqQ%FFMsmH>q%6)(=Q9mH^ z$O|B0^^}@+UwN`g3c1~Bj#W@}w&VxY`a3Svy`YQoL?$79={Ex zy7VC=;b(hi;#ScSvMBV}SRs3S8`#h%J?=5y8HGsmI@Bu1?%B04Ld#95BC;M1Fvj8s z6eHG}!dS$mpdV{I!xqjNqI0+29;mA4=1zs@ojCy%fR|`w-Rwz)n~pO_1yrWAj{)7Q zSbe0nkF3R1#LPkQ>@QvB+e&@c*~>g;prINnq-5^NSc-40cYQ1SoplPGx2a?Vp<@r1 zCqxbn;%f`GVMIo4tsq$~eFmptr@_hjzFXSw&iLoSyuUSU|GdaFy8|fziJq+EVk59d z18fk5aP#!8?Nc}q*IWrowV~ z*wF<-VP-r!G_66I;J1k5S-Zf%VpohZ&)*V z#0P{%JEojQ*d-i?xs~vEgr+FKjV&(gFf&1pP7*piU)t$?4m$7Ho{ul!lX&sT9nFd; z>4?Gd;A+36t;Q6&mESTj(ToETC>~8|M=;YdTOmpUk_Az9@z14#7UE+-2=iu1I*8H5 zx^EGHE6CZPh+bvss7W3}v_}9dQfC`PuL>)=Pym|ApPe4+v4iv^DCVf9_rDSog=Hl| z)MQWK-CP-{x=bbOrtAJ741{niy!A+JM)awcDL-Ps-xtw;6$YKWN+AF>2g7x~hju05 z0l)#60`wD)^VhUl5HKdIVDxY^2iLO=Es>q51!zKH3*15St{!Jw+bAfFjka#@uBOg` z;K(eHJPaw!*l3q~B*7(o>Z*N!&xmsyU?1s^o_=$q^29gkhcey{4QXLD)Sf|wWLH@) z6_nWlsGLfVH0Ynr0`1D}mS6?L*VRd+)e-N>?4@hQ(x@tIdvY_`JWysHVeHz2cX!$J z>)q<$$Nc~>supB4!wnH57JzLoT4MryUCnfv04}YL0}8V-YQ;Xd$LvG#!rj{0#}y{q zX=6_;KGs+9%`g!BxIfkZaGDp2lI6_65{S%{sZ=+4WiU=} zwfL}xoT}{x?PGhCrb^vV_j3k)#@|jN2e?>hCoS{*35eGx3JFK9ik(H`t9Ag{DT^3z zCwl~b?Y+BnLB!|yDu&VRE>YoySOn^DH2|Hs!*Pys11Ck^5>jGB6{as1B`C9v(`ubi zLJ`B*j||ky)7}?$Az5`zof=G|F2b~0-bi+3G4y|eWSF-5$RkkyyUEyxb&n8NGaKVV z5~WeMZwFO@&#?-bU$j~lNwQA%-(p4omr;-QZ-Cyn=E3ssA_DzIH*Ma2DY0&m z^+AW*1{Sw&#|NE9v!$tj17#t+I&s&{t{uUpr#XP+(>sa9ayK=fy%hIc#Psdl4m9#e zC+n{>{Hzz}=jsp@LnrB*`jh%Ys-KgFtVb|cJ{6v-KWRilofo3V%CrTpnxKHbuMS5Z zLF*CE1Dz<*`<6Ii8V(wsd}bno2+qBFOOp`r#ok_(6u9-Yq47`fLZ>wTrJu`+TeYqX zCY)6WBHz%~T3hJAy`<{o4c9dAy~^)~?rREA9?;fLRJ{g@KcKV|(PrD?h3txUK%b6Y z6~S`0NL1&4E&Sm!I)6HP>N}ts_wdP8foV-!@iw7)m061c$QHW7#l*dR4G`2*&l3G` zOq7hd5$(_$IAz0DiDje1{~tB)D5%T{MA9M;OzveXp#+1535-Vcq;G<39{Cttl0EEaev4 zViZYcSP4GbNh8Yj6D=JsA;e0>`f$%fzPA8#`z7cvynLrf`4Y;=%8~FWYo$< ziZOGfPH;U29IVAhQ5mx46ofeQ6RymH|93VTp+iDei-lgZ0TBqU-iJNQ3u$KkTWM~& z)+hzM*~~At-e~%4dpnhpKPaE(!!_?t3>6>&mMk&aWMQMMACue!=h1uoIUpW870uwrgcWwG59BFb|A zRHglF?ko*h+j~GsJn)h&QNOoKenb?f(W6rgKfu=Dv5hcH{H24g<^lx-j%Cq_07ODl zY2^rlrFs?5$sQq=*1(0cHP`VSn-W3~D6T)$HcE44o}VB5^>XG@dig4J&d(=bZB02MlK!4NWD~MwC$3Uba{qX{FlkN?vva!J*o6{ zmAxuZ^TV7W(V6tBJvIi+P{rs@>X@FgykGOD^|9=N4KsN*H6{hE@BT+7Z$?l;}=1Jse375F94vbLdwa)O%qDYr) zNOjFk?T3iAC~%mJXwhh}1si5~YSsY+JihPSVu!*n3{7Zhb;vFL`ozy3dBbCyS=8 z(yHaVg;gD65SnCH+vrYe^Ds}3MW%X$7Kz|0Ul}XxYVy2 z8d^M;4uyhk+tLeLyo;?aQ{WFP_sp$~yE=4yJ$_?ATVH)Ra`pr}zWz8|@^a9f_SnIpA_{I9(>O_zc zs2(IO8^s;Y+eD}QQ!M^oW`Vj+DQ;PfY)gsTn^2BH!9lQwCTGq4DIs-H5W*|#D^!WT zrMq7WIicmNIS>yf%?>2SUimIFD~!k6%v9ozMSae}^f%Hw=*q_86H~rfE20OujY@fRF(MKI5)C-H35FoTk2 zFV&kHuIcMLy1{6g$^)c4@~0^e&dW$6K8_tt)D!AB`^z2vIVLpa*Q#43Vgh}%JrxRsLAEEt9YdcsE%>>5<7oztb&G;U;5K5Zk+#Xi_(r!7Q9Y1y zC#rzIfJ0P-Ffg|@LsiEto$}4mAPlV`kmnsZfslijoLjhAK)0UNp#6$J?lTY zpyyo*NUf~G@&e7~x^L^6`a;K=14s>9&Sc~WvH$1PFAMspOH0I7p|vZ?{fH`2Y!@C> zJ}AOx_4CK&VbmfCPJ|$Yz5=QBE~I}%Dla>MH|;VQ>IbGWD~b$S4?pI&W;<~AgDecAoDk>tZEsd#eGc%4u_x5z~bCujacXoUn83kb02%g zocg-7Xtc)2ooq{&BMaZj1BvWMyK+0;+y~N?o#$yK)jkmeHs3>zUyT}LwtHj)s#&8t zjHERzJcojuezC9qfp~M8k&=!evFV1(Rr|_DG?SJSq`Y3&wc*d~4fd-T(0qT#aa(b? z$G~QiC)Y*P>h(cw|4!4{3T^fe=^{0Ji{R_q`nz<*`n((yix~3w$tFCmafUj~MVljO zI|^%a`?bYlmC~*D!OhN1<%;{H^1F$Y!4H_{P?h!Q?oB=)u3WF3d#1(t zE_R=5!(oP2m!@dniYnak{qyxKA#AUF*sd4CS8?n3uSBCj+f#ZZLoY_L58X?vXMzE2 zM$S;b@*3M=CQ@l;gsv6m@OM+<`qNkbqRQLnBtT z52lnG{V`OWj2gaQ6DDco&0Og+)LvM>Jz*^1*X7EHBgCgnAn=M@IC}C8NcJa zC1i@yGB^$Rk+Gmxq5<)XoD9_W<~pj!1HqB?#3%*5zt#P6JrPua*O_>`#XcL0p0fyC zNm!;w41VXNFQ;kH`nl4;$5z-xWSqw&U4kF2JEyJu8E*kZuju=rh(?FF*V0aat zR`7`bknQG&aXLgfd^>7jFbff+Sq7Qd3E8NpGa#OOysCmQ=Dp-c%Y)3M8Apg@G))$q zqkmFPbuV$SvL2My=Q)FuP`={cC&MPHdGj5xe4|~!s;44j66A^Ri4n~LzN)q9cDQ`{ zOF4G>_w;gZO!5p>X}JgmS9j$pUl1cpNze3pe60$BPtctshesx6ZDYLyOyd1rQK@%} zAD1UCaBLBHcUnp+k}7bBf1#~QhAby@qrQVHDxf?-i3x~6-w4cY$#HkC#|C6VVK&NN z_F`jW+5M@C=a#5~6wKKfOO*syd^W>udHsbCk&bZ*2PR+EFf-PkD|C#c>Z<5iT27kU zg;0GPxt3?E6@i0g#ms_8TRzDXa>403&+yubfQoIOoO2cRH_78^? zqSvLo2g`;}Y~yN&PB!MAFy0QlwBd?Sa?|z~qk;u+#ICZjdS!fKG!yTt;b7UEpAF%q zhO#c=35M23(@mcxuSm^DOpp$oqY$`#QQB}VSbDwQPjIk43aJd012e!0XYMhoKochZ z%wfM9Y`h4u;MvQ97$#Ss~kQL!wlKoP`&jOz*RDPFJBYp zRKXgW8&^m{a^X1WW0;wVN>=9DC|xjxu>d1d>>!!F&)V9d8b(3dOtUvvbbd=5oS&Rl zk1JNtct@z78IQo)&fQXv0mW{CO2bKFv&B0^4Nr>eD0ulBs ziQ&(oFg$jJ6r)Kfub+z!-*|U>&>-UhF zw~B5Hrg;A;B483Z=A5lb+&42Wgbjw@!vbU9sS($T9~Dkc;-|kYrI9$VE$WAQKYn%jDFeO_4jUN}?JSV=$;h{#puK#qpFO)5TO) zMeaA4J+lQp?POA0_8va~DlzZIEGhiS){w=qH@c#niW9y~$rZG%GM@29?Y zn`U{*qp~Ui=?S@w47l!g)0gj9V^z^feQP0=l{Z?ohHDZ0>5fTahi{zpUrL{(6NFMq z8mON-iEA-QdaQy60*laNQJf6rK}?+aOJ|sL0ixjnm973u*0X$AyN_xDAWdIu=znen74A%#z$Jeb)$~Al~=(f zamS?!n4eh!QxU0}Vgfb4$^e>G3z?^7oCvPr;j*~yt{VxVSZ(& z@=pK%>+-TNVTQElw!CAKWS@djz+%5F@>H>|5pH^_Tjghl0}cF!DoDX3_}dhIVZuNgR*+n17SgYC6Nj#Pd#;auV@mf$G3$vuPB?zstZ)5`1o`$FK6#g70ZT+B z4x>ZI1d56fkrT^uT`QnW(}+;ZfPc|hiv%?eQOq+183+RD+<6clvFVmIWd;DSp0ymj zi%}o#csG6hOj=nScu{7#tGs`H2j0zUS^WQ+gxF}G*xuL9h)8uKJRlAavGPH!Wins) zy|g};3Ws^5b}`%Es3x zAPnDa2Q{J_e}jACqVX0@wf3*@8+h;b)+5*TX&@Rw_n{NY*XHw%z||#^(HKYvHC=Gx zy{{1Zx4D(kn317Eb&4=GkblT<;!^Oqe6ghHw_R-{?uz+|AV$ISwdsb63EJV(H;QJr zCu2=xeg;%XeCBasTs;&-@2^8BB8cxix`%} z&JsurEjBQhH;YG0!p;ydpf2pdtDOWp+;Ye#7$RtER|f4(^;xD;3BI0L)KM9z9n<(Q z8Lb=UO5P{cQ_0=~m3XsNhUM$#O?Gxj^=PJ|=>aJ`!r3A+k)k~!+4|498y0RE^I%T2 zmZI3rP$Ubb9I5i<8@;O7*O@?H@utW%T2IN%L1w@`aQ<4df9%QT`kKK?Ly&O^o@8B z(F(I%JPl7E=v1BVs&eR|ULB)w1yGK%1itS?RrdWOUX$d=tUe;A+q@5tt!3tmq!$Wp zyrlW!S0#D+!ge>LY8u_3OSJ%y53!TGg~2UPWeT~Vs?-rp-f3g}1qtOYaf-t)mJ}rU zvYEmZnvv}Zq>_W~$ge|2Bf$w5qFAg93R}axbF)$WvNC3k!zkUiwL{zQ#gX)P0xPhVA}kXy|VILOhDIH*_P|ohNrWo&{HYS(rX(L zJBsb0p4&3rCM5cU%Ge+FXW?tMk7{UE1PvQtTIU%1*ACmwWLgSv*AzA{PnIEN$X$@+ ztM+V{Ew2wILh??s?Kc4%TxA5><5H&ri7}Jp1NnRpJ$sqYG6_?Tw9v1pIM^d{*=8Po z(TGm>yGEF^C2P77yd4arS~qm;$|bCEth?@1I{}e~Ig1_;vpT#6hU6c$H^dR3vu@B9 zkAz-U>|;5aW7KxouZp_4BuHP7&@1JQ1r%HR2P}8k?Ir-F;>{Y6zhmpP?~R0C z5wZ9w+DIu`PZ6rJ`3U8bHsR<4*cOhLF9+O*3Zr}BCuvkEdH-YB067&#X|WQrUe>L0 z30e8nIJ*u`q15BIo@dOWZZK53qC;$a!M@9tOVln59OZJ;msyZTjbOX>3M>our1^rc zX*dX2n;I#@?^qrU_|i`i;cyYCCe?xeSbt`H8QLtZk=j~cxplYYMYV!P^XYY%KDIa8 z`OohbxVSmoV)S8r;G6&r>JhpiulGR%CsKB~UwxS&eAHEbVR1 zgh)b$xR(!tkIr_>1J8{E(M$NpxWd-DlLl(-#1z){ICxe@DZ9#=S1JdeT4cK-IHTK} zjr2kauJP|ZtN@sMc1nubnNIR+D${$Gch+u=)KP5R`V|d{EZg#WQANX5htKS8nQowZ zrN!tX!4C~b3Kz2Xih*7^SNGW7j32q;t``*8HUKD~kgLF+11LHo);!B~g3leBnG)_u zRrB&jk&LE!y5jj?`Q3H7=(s&>RRsT^kX&Dn(x3H($^4j%XONgAg4c)ev?Sy~q8_qh zJr+{;Z&Zfqjsjk7Qm%EDCQUc?S7?4BpaO`m1+b0%eZTMVe^wMgY=5A}L@~U&4Zeel z{{iy#y9OxKlKLrM9MvL@?84v@0;QOZxq|D)YpbiJU5kHh9-~wk0WJ`|^bdDiX)}M9 zjm%pf2ndP|3|!v-AKnh>yslG|Q^1pleQ7P;)~agrKMneghyRPJiJajN&^1a^-sXsz z)H)GhYX45xo%S|4oi*N~pa51Po`U?YUA=mG(Jb0v@cD{#-%LF}vtC*Xoxr%=z@^0_ z0=>rCtdGcuyi*-z3GUz<+4b)=-QO)Y`Ny084QLU(soFUy4_s>HCZs7?QV`uy1KFKx z%`+6wbSkMOQua2@6acPq7@6uVv^vQj-7rK3;q~xg<5Q+fS*YlL&oWUbERbuj)6Lqb zDc-EZ>~@!J(X%YUUE{lIwEypMhZEpyXX}0dmrA$WP*|Tj50Ow|bLx6_UUSFV37p_u z(N;xerCs!!R!#1f8zbNqwGt_7LU-_n^q+~&m8;PW!Ue+si5ow2HS&jg=$kR83EqnNe ztU$WIhB1tqG`;R7!7KZem!W`Hk&%7!=acZJUA3F;58xex?kfBCcMEfSg`Qoq$x^+Y z1y>$*5=md>9$Q%o)}|bhfm%lt?Dt{G%`s*B5R*CgTt-thDuqzE0V#u4=bf!FfqC4( za2NtVW5zhWR$xVIqHzD@F4jl}JA(|8zXR_CG+viKC952f0|Q&U40TAQ+BU)y9kcWG zEAoJYmDDAzq!XFpdw_1;eUoWHRZeD;MGV-UxCZQ5e>4(T#%q_`a^xY!E_+OF#n8qdy1RfOoli{u@f|jB zo+dx&W>E;DnZenIz{#f812_CLJOl8V>?s52MvkjD2$1+tvAoL-wCV6D=muOc0>H|i zEt0g($v`A(CPwb{!YZ@=grombmf5S(vxwmZvH#9NJ-o0RqH?lDaUS+)Q>Onb6YVvF zt)mOJMlG+QYG(muQaZ3d@9biP>;8QQ1O|D$B`FH96TE-jh^2ta^=#d<=JK222XlAZ z!VGZ%5#hcb|D$JhTVvrqt*6qAFu8^^$mpFq@s>r2B3_5br_8PwG}z_dMj(DWYi%Xl zk*ok8i}{~@DP0RyYhvw`dLRA%YQ00}j1!_PZAvsvsnd94NOpWk_Ob z1p=IYGLLAIq*1)>6q792^l|FbAyV?RaZWn9(b4-hAeZq@|8meMQ*-FrgJfP1HC#Po zPe4b%h=OCD(xD(M+07!}w5nk7(9{^qixFW)pNy*(H6TQ}b9>@oikm5D>v+&i+2#4} zI=tl?70Y(K4RbGM8LuawS3NF^%9Q}B#wqXJn8Q(6fEsYtk?HQrS}=C@ZI@)f+KUUr zUu7(GUrZD&uSfh9|8V9F^(;-Ix=AU9A|zr$F(huaRQy0xA~cr=rWSA-EnI`%Ql9pagnRSDEjn;ls&lH$lq~d zXfd^$mL~8d#b~rY89w7}lnt~WfncU`!Ck95bmY&OPPX?CCF6cQp^h=GN>)=H!SWc) z4qz&yBF+++F+;O8MFj^0KQR2V=H7K)oJmN&s{$@6nerc3aOHhaX4sZ-sra6TDBbhc zf*e(MBAdGXL7d$HH_2Je4Du5?cQKl_JWZVq;UDkkuv!q7R(5VIho;@958P%R*Wv&NX8 zfZm>KI{*3%_i^7$nV#PZYTT3zDB(uWuBqa&`U#lbL8IYdLk39cxBw_jld=aaxkB-S zMxA;#&+&G5+=z1!z67qe2;_4E(t_V R;!FK`Qt*}_z8p`#iX|XosKEmb=cssoN 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�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

    3=6(s;{9Jt8ToUpFFn2~E;*vVqZH>ipe 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 %QBttSRVpGvyRiKEe^U~+ zje)Y;neirzzHNm?HyR^g0`(5E2a4Dmj;58BV}vO&IB_!q?wYa`Q6G~T;PO@uvt44G7-=I7JU#auV5j!UH~z790< zDaLSso#}w)jOzaZl|SzoUo%6-bva8b7G zplb=J!KEpnCe@^NhvQzmtaOE8K?5kT&VrA;0`H-tSCNK~AVCOTMI`|7Z40kjQ{ zN|)Wtn>s>3MN7s;uLlGyjNrw*5BRIxNKGug3?qm7c+J#RG{fWsCVBP`Gwyt>{vpy}e5LVR!T|A?IpyZN);`zGgr1iVQq;(P z88e#zlkePs7PsiN*V<7z;cm$naSwpEYJBL3qZ2pg5Av-3#(gBCDa+-8u)|Lvre9Gm zOoFQmWlfFST0vppVUrq`*{6IQ;H%Ug>Bp6N;A73N0{$4oM;2ipz6c?x&ekj+KQqz1 zO_=RK0!i13-Q*IKA!SKfyH!;5vOpC^SG>f4x+(Bhk5|AhOA;wwIW2PZ$eB?r zinw}YnG5KR9p&s;u zJc{zfWc|^W*n8-AKJkvgVCb?d*Mr4eHP;2)+T~7XhF|qwtMx5)a_>O7OEk-YngPUE zZ#{T(g5F+JGbFf6E$R3V_rgOf=~r(h7vF16fAGc(CIzl?5?of4uSU?0E5-p@N3SOb8QbZ~vqiuC;%Q8lslL31htn%uU0#^8TRij)$mdTdvZjKD*XYzo=Wt%0)HY zwMtR!!QWCW`u0#3-IppnUCT15+Fc7VmZqFunB&L>kUYg0vC4M!YrCu(q;#i#7==5a z|Fx>akr~QZA<~nJ@^s_2@Fd_@3mg1%GIKEn*FCLKE0(_v?coSWd}RCzOeL^zEP&f< zQ7)Ll?#}k_oHuOLIpiX(|C>eWB=|#0Alwc50iJrxQWQZe%ZW0IetfW(@2VTpZzwKT z%GP_(7Ks8;E|w0^n-XTslh%kh z;K3!wgbJXS%Csg{uN229YuIat)ST3U;jgS2XxgWTzQipKzDjAI9FBuG5897DW6VY7 z>LNY)eL4u%?IM{~W57Qpey`e3Ay`y3r_tkn0*V3`PE~a^Sw;`4<%^h@QOpsWf)H-C-l)zo@L(DmM$8(2kdB#vmgWvL7s zq}xnP8)(S!m%S_H7;K=sYIp8fH!NtcFIe6L1l{`LZ5D zbQocm+&&g?UpJWYdXiJ>iz$JWOs%2O*E{OqhBVPr<(tK99ww$Iit2zzwzto)1|>+) zK;g5YUQ{7dsEY(&&zSYf2gz`xQ&1*P;^mSt8gEs7eEI}F4K_A8s~YupgGi9E3Jb&J zFdF;o#=*Joz%%XZywZX*(xh(IdUOXGU6DUc8@L-#L-?SPrmY30!o(RFHPK{AphGf9 z5t1889NDr-jLXXLS+)GBPS-vEkpNt2H?2b9Y52QIS10AGvsUWjHlw}p&|^3~%XQme z7?hpr|w9@8V?mS|H6U)~iC;^+J2?@oRZPQ&XF6asK)139?3(=GPeIcSUB zGfhhIJ?sPKGIvI}B^T+V_{fZPCnnO~TzHH}gO!Qe|96-HV@RTq#?&Xf3byovgTfOh ztY@8*jHdFf6K3cm65@YHDdnOE<{`$7o{~)4&gV9)nHbwLbFkc@bo8Vt-_NsG1+{cqX zRTM#yNob=JziZ4qptvkzXW&>ANxiT}1tS3J*0R&`hX~uB7pE*$Mj_|`wbF;bg0(Jv zrAcS3WzsV!8H0snQ3Ov=E%?{tDPuwjv+!oCXkAEp$+@IOBQA?29xn@dr;OY4pGoGe z67U$%AV|C~V|OO~k|x*%hS~^{@$5q!Bg#q<4v^g`D_yO#EL7L)Bn>RX7(7A-JU`{# z1FAvcDV?Ka?|f&IfzLRJW%h|=_>bZbM)A75U{+o*;_nCAGoVPKVg4R_WFQG-FFXcg z#0Z-5ynEWBhI~e`xgPqk!9;CeLgft9^qL-Fja}@AqQQ^t3iI=%g)96oxn{=fA{-3z zL5E`=CJ)TcfK7EFVgKvf$oszMoH$rYj-Ra*XzIfrW)MVo9@Znn1?I>?^n!!MN-)j> zd?(82Sk-Mk3ILSdlR#jh z2C}23Xit?-a!kbb8wdSgi*?HE_3q_niT^$9;37!#>A-23JEj|XkCJg)HUD@vAYsZ~ zG4V0wSLfU6p4LEL((kCU{OL;67R&J>lkEE$6hnmn=oq~cXH$YHbEx`0F(&UTXd(oa znNMge9oJDmYJl8`AeBh&vzwSWH{|=#{|!rFl;X9lc5t&4fV{cx479qVAM{w@Q5M|? zQcKSL{j`NU7l;!&_qpMFWkr$bdNEYitP*m9xxFhb&o8b5qMo&B#F@syDdrl2 z4iaQNR@IY3`}vZEUIH!hK_pj&#(ECM(|m*mesqkbX;(|lzVY&f!Zs@NEqFzk^!R8; zCaY$bQbiQc4$w6=Lzqaa(}~j%-I!A%L^7)Rn+j8!&5KvxK;R0R26fGfZH#TlFX;KF zvm+oOG3I!ZuU^Ibql^<1Z%@mff6!h}#}7z+-N-zVaib2{JavgrT79$w^-%LZLtr3l z(M?b=&^{{(SQ6l8rsq-wp!P*a7L@=gTr(H6HM@c(QTgN$WRA!Ox1*f@P7s$nqdob@ zsozQFLqx6=l?-E-BTQ}5q+R14>R#oMW)N!NYVfjc!sTryD3AIyl7pLaN{JsWE8+qO zmOZ3BSmISQcG!w>FTyre;BbLrUI)6Utl)w2Wvt$C$FOIuaA1vVVT36QP8OAAa08>O z=Q3Tnpq(T>X0KMCET<@3R>s)$uV)G5gF_w~!EysRU}mb9p#yAehX(F|C}32uwLTXL zV=${N;D~Ye_XdjhU7u^l=Me>Df_7+n>`*A|6sjb>M(h_=3)2RXu^{DLmcp>4+f+(LvjpTVZhpX=Yf#GpY znJf7DGJ9B#N)AlN-DKC7_E2;VEyJ(D)v|No2Sa!T-Kpo`p#4{*;9o)Mydv|xX^3DA z2?cEC#nv)sUppT)hBIxjfU-pD$izjK0)c2RlKY5`uHpH1QG1;+WA6Pe{^#uRUKfQV zc+B;0csY&J-z)pqoP4Qek(Fp_w@~&m{KS8@D2#JshQruJe!p@;M=pjkVeAJ1A2K*VSpo+y8$ z15ZLIUU5x!XmWTSgvZU+P=(w`@VV}Y{Qjv$9`6yrQo`{-nr$x2up!k-{St@g{aYDo z^}m^m3?nQzaTS2$=tvr=aH)Py4W4-LrSiD~uR`TQBki)>7LH;Rcr^fkS-ahvq@_hLh+Dvs0jbTTNE}5=&ss zCg~)ylT>(~BV?7y#K|X;6?~zg!@g`_jgxt{VR~h0{!#dg;ss@F>DAtLVfP+Jb zKRE_&7*r&+P;OQ8cQ7iB>C@^v5S2UU<}(JD2DuO3LGM0o3?-lx38X)}K_Jl7MZ;)4 zdRt+rXbz(aOi?~DBL`{;dgim*RK8zeg@(WcbwJFT?c50Ce5;F)&P8tSnsE>opSUG6 zzqQ07eul3Tij*E3*5*S%zi0u)sP|V{MB1lwk@^;IgCfJ&o$$mYY3Gw(zTUKp%z{#K zbczEm??(xr`^S|L3C27)sYxTgOhl%MxT>-J-ly!u>=O& zif=lr^!o_^RrKfowL3T;0u~iLAP0lP?Q=K$%b=4L?TeG7RN8#|L)C`C zxgrA2$ctv9S$oggu--S#Lb$eKo541oue37yvkGy$#f`QXdJE^(zhZ9n4mE!^u5DQ- z9yh3yBIVtZS+6OjQMh#5ihj#`^fBO$@0zqgAwl+k!X}`t@OGKvWLIG~my;gnE;}a7_?GPIhOgT)56jit z2q}ja%v;2Uy#)*Fi=kc5eFL4r+gEbRE97$F&ims0TLK57!YtYX-NA|DGEIpj!rbC3 zcY2H@JGEOO4OUXVxvWiVh)|0+>mWG@!-uU`b6gCrV=`a|}CHh{=uP;-CcMfCpbH$`HP8Wkp4Lf&4H*(sBZy@naFeq3>boLj7 z3stOqw*je|K5yf`fsEbJx`@JbB2WLv#m5`-VkWK$1i1d9LnbEOt{nb|{4H|*h%jL3 zk{E+KV`ReVY>^LkR_x#Qd2Lfk!QDtmWvlZ+=Y49Mqz!GB)Z9Gs8_lUu-8S!Q?m5t? z$%E_hs0h840hn(n11~95N^1p3pPU@8G-7xjIn;L{9TL+3nR4_LG0bh`)rahzF?lp7 zRE9+wgzF+|Y5|+f6k|np+kV#CnR0*rl)J7sp21WNB!hbW%FcG3dbbD;Wso zBynoMOOx#h#fo@G*Q&wkoq=3OIEV=2yLc|YY?00xo*GBRhPY)g9g3nYngDsZR0h|wOtjtQ?Oy{HN9i>nTY9v z>gyAX7QBc_S$oyb^XC1BPVyTr2#Z@aBj?Lc8VvbLTG?U>xO`bvz~C9nPf+qXD; zbU}<#HI>VU7RwhB>EMHx1j(`0jX8xWCy8e>YZM8!Pe;e~CH3VzU;?>E=dk?)y+xc_ z@JGrKdv!goKNBS86z0-OMd}bi&I(QIKD>#$vH^3Fzy-gf4_G$(xcA}D)mwj5>DuCX z+j;&ATqC>j8?9ulQAxxeOUmf8ew|*HI8|;tP|S`*XFiJ~gF*pTu=MK{tSN0)f@q&= z-?>NT6P}N<(tlS9rv$+|g;mhjr0Bjt0y(~zW$|%{w8ydx0ozCdOmlVS^Mv5dXF8(r z%(>^|;AjhA^5Jx4nN4sfJgIp74?3MnF@SpT8So|S2^UkG5-fBi_!1~rTTZ@SPn(IF5uFblJf)=dv`J93PyaMioTv6Spg(X7AX290bQxBk zXkVJh4JCWr&fE-Im|k(%a@BNXX0ixU0;J;U(~5#qz!4mO^Cx)EWXTkTI0>=UTe?e# zSN_=wug6JTr4N8x!h%^5T%x6e+qyU$*Hc{IsF?ru@&1LtwvQ>zGu|uu2~Nj&jXB3w z`=@d0Z)g!AqTy}>hM7|jF-ZLcexll0$p8^cVlDFXH&aIe5`2;Q2w(WsX15cSLwM5~ zqmyb~1Ct=Fizji2e;XMb97)~c>;8!kbGM18nk7WTiAbkeu26+}%zS{pH^?kM=%)on z_bE$5${6jn?c_5uH9R$VCU?5L_MlYsxPU1WMM8&IPO@A{;Bf1;QHfZ2ra!S1#lL-` zeO@2T#=sC5n(3lcrbP0MZSbw~Mqi{zsO7J?!^AoxnHnH$uMsDPa;y&g*2Rl$obsFT zLRHUnIB?M>iPZ}dvm*@h%Y!VCW!{Z2TYrPm`5!vo#t`Kf({_nG7w_z5EL6%lj$ z{a4uM>w2QC>QLaRRJud3XPAy|QZ>HbGb@rB+?Wlt@f{O4w@tD|y&K+#6) zPhtc)%!xw?a|2|3Ttx{dLW8v!rlxJZceI*~|JDKr)~x&J=}VGg4I$+`)Z3LURDA$w zJ5(=C$MxW0CI!Bh{UfJ`LN(HZOP{IWVg~_{iZ@X9>;ASMNr8R6qlOLcnoA5-zcI#1 ztAr%Mk;HIOD|q=TY_<8g}AtURP0u;PuKYAO#L*!79NmG+*0 zYBz+~WN+FCty-I$&9!};z<-`i?%6DCzf8suFfF+%D3{HT1+>fW?-K)qrV|js>nH~q0;UVb6U^EM$}FTNiq}yg%uSYZ)M{uzV8PD%dr;?d*VfUEFiQ@&O); z~y?j z7i>VZ!Sj9Y)f5o`N*Oe(VL}%)E-=TNc_F*!_6voa4nI>?<}zzQqojBHfNWBD+pn6~ zxdf+`Wiga8=BA**mW;Q}U6x4lvR-ta4fd((bA83B+G43IijI@EXxS_a)H^jgb-vb8 zxL4>!1E-RpV|Bq+kW6W5)By^*P;_5%NWmCP-i>e++2$PR4gxfjBVk;%CYQXLkRY)g zJ)$tt?QgWFi2lb!;faoz3Ps6sL{=A=r(HN2%AXW=CqthL}_9V>AQ(mQ)-zy|hP9%KNUmBmT^u!LRVF^aKV%>&6^IADzW7WeT< zVo^a+1$bDM>pa7dCgAi-AWVY`j*G=+U(CKqh&>Z*ej5_>JtcH!A^0FZaM>A>eI2&R zc8z#WVMW{t$lf9{h&vR|Dyxz3d|?4JBd<@_hUPA=O_&c89+7>1)bu|o>lqx$h4^VR zZ}i5*sMkw_5*kAAiXJ#5V)P~Ovp7dL5i@dzJSYp^fKGwz@W`h1aixLX9@$e)t6qc@ zi~68Nu3r(ZlwN+ayC&1$?l>js6!*6gHbd0~Jy)}Z>Oz6y!gakcAj z!^4U6ZxbH>?%AY??1gQ7zs1mlozyTx_N^gAVd!Pl2C1sQC)oEQ;|K(Rfr;=@XZHL5t) zbcIi|vt*t&ge&17XDhT{WkIOWa$seKSW77;v#u}>8~zQAfcXy>wxy-E3m7wJvq@;I zrPVbMUMLamq<4Jt&0tUS^rw3Z*NE>CG9{1y+ElL8KMtq+Tm6$22#L(3%r_>q>Fn9K9?%D%} zpi*k^`d+gXrD+Vx_l*(xDPuzr>uZyBopJ}|~}E{_tg8h7U7d_GwcxYz|j#|!&CwbXM%J)!NFGOnfq zJ64#bGJZl;FXN2Zk`Z_abhYTDkK~GNTJ45CaZv1tkaH!*PSF5Sg$7C4yIaO_WtWH0 zROPwZrR=mV3sw`{9;|JyX$AH9+&bt<<{8BTN+zMZ_o|fYBzqwZN=C^JTvs8DQVP(v z6*m=0g5>=U(gV{xpz{k(Uw4uC;v~|Ga9s+E@@i-rVsQ!NT=&-4J{CUh`_F-e{Eq~= zggm^~8VgcYVSc}butsU|qY2F3QD1JlTWMjta5Ga0jer4~xvrd(5Am%5GPCt{u%6Mh zvnY7WW8R}`trJ7_lt71Uif;_0pBYm&6YTlaz23&vnd*H)Y~8XJ=9O5>y}JKD^_(;p zp|}pa1@4Iaq*u}NUkv*P!YK<=3`lYKz{?4668YP>wqM%ZI+gB(J2$l+-}^%vG%Pm> z4=wS+UrXK!+x6ZH*1`t>1f9(ldUHQ$F_P32&_Ha#>btpy{GANLF9In2d)an8f&l@X zmV~iS6Xg$PGFXM-jV^t46!ktg$+xXRk_rM2-?&)L=4jP(>0?X(R_nUMWI4 zBN`z5Eus-$0Dat`LgtP4C%u7hQ2;ay>UI(aMM(>jsFu_bFbK_bkkSVI$zmw${x6rp z??ZGLN^xWWL6@ek`<4;FR@ar|)w|oR@)%0?3|3mP^Jn&whlHjY^>N!8>bF3+&7x$d zsA#ip^A7>^DZ?K(3?TW(3p0y+R08bpiyrVs*v=--Ab&`CS)A?PjRRdl z;z=PT9dqpU9~04aq`mn$4A_L#Mw9Bh&PRd$yXblu@sP1&=H^Nnwuq6^6CY(rzfpDH zGa9TVCmP(GI-J&OF(AD~=Xg#PKJX0wP1ALFO|^9Qmnc?Q=Rc8*|AdlQjZwi^y+D+p z)YVOE8Ux{4yK^a;c34L1=dW3vIM-*iUm&{bvQupF+( zQF?UXFJ;<8dBws7+gfeZjLjJl$iM>^p{kiTKXxE{_;(JDUE`YWwaGq6s?+!CV7WT1 zDu<66@3pFT%y}#Cd5(cdkV+`2Smx0u2K?aa* zX(VBAZO2`GoyKnuQvH#m>=1vQXjk~}0q>-|^SsdQZhbx0Af3;C)uGjnv?1F(aZobF zWDV62I>Zs3IE#mXbxVy>Eh^5&bHDVE?fvOUBbSyawg0QeqSG|q(`it?O>l1pj#(w9 zK2@G|RP^x)b}}BqHHW7&w951mRJsmSR_L8Jra(06JS&VrigS96(wcP0l&yC68Di|6 zhrqqXzAO6BJ~xUZORZh+l`8nj2Nf~4Sn=~` zf(_z}{Dr*6P?yITT-Fm5gFgAV6oU;wpy-C1yD&rUzoDZJ<7g!&s|s7EaH$d5aZT9p zOm^ACW3PW$J{ z-cS4){hopm*frD_6295>S+$giCjEFVoLVV=XrUk7 zhZj30%#XL7f^&hFb7M*%y;Uv<`(}6$L8lxLVy}QTKd}lPYeOR?j!Nm@o{;E#P!XyJ z`{lyv_Fm32qol(ixFok^>S}S=zM{nw(I(J*i{-CI^Dtcx1Zlt4AB>_r>sRaN!LXy@ z*O|^dVQKjnLC{Yltla)9>px-D6>39mJ*^r1G1?#E$HqFhp!&DPrlkQsa5S9V8f+M6 z%pV3qXA8SQc+E<-AO?Fz1L~nzGlzSwg!)9G?GDBv66SWN0(y4WBW`uS`G(TS<>uXu zROZrmu-W&}_$reQsyyLfhKHHwiW__J;-jb7-;5VQdghj^8M`q`Lv{G9A@9xzv|B@=T1a!)ga?GHX_Qx&qJyO)k%`>5H~ww@Q758eM;AfTh!;I=#V(u zqxr`os{0m(yj$WI{v*fxdp;tI2Yzt!4L_ zatwV^pjCG$pGI`TF}0GnGl`-nEGG`eVO4u55d-cSrPq3WWu+lU0;XJ8ssA}C812Mr z2QyyaE7l~1lupY0z`H(-;?$D)(`@w)}Iky30=7qNS-zEi__Zvwb$&gAnpLgiBa6eAqi&S&+L(mBs#Qy{$mET@1bDbMRG5* zdCr;Cax?xSeCEQrBz$Q!Qe06CCL@AjGB{;jn>P2n8)3CuP`~E~@)MHK zKF67`|QJLy#-!1?l;j#^3q|iYB%Br4QNlGSu0s#wc+a0tlJ;C zMuIs)5M80C(!)$9D5so5bHN*u=E%zmssI3sq5X^iahr)ps? z#CF@<(wG-~e==l#SPq`895o}Rr&k3MApB{iqci&*!4Tu7XhKfzTe&26V0?cE7-s>Z zkju+0Std1E?RZ#8Ma6*(w_X0hB!zSQW4r^X5ug7Uf-O4IxcR>f4s_ z5{IV6~)4eYrfmG?%95v#}ZnWZiPPS1xL%8Wok#6U3hXz2n6Hxm}FZ6T}q+oOQL z9|(D)xkv0$-bk)`qs1ukuxy&*;2p9=!&UyUjYG^}u4B+xjGS67v^b>8+R54wuSXPR zw}xRbIne(PUxbgkaexx;0zK890Q`wf{dN`zhLTkyIbVPt4x;cZAK^J;$pc7P47{u| zwE+C-5J-zy)*>@;OY)T9K^7Dz5Jo^{9WY~of`qu#_`Pab)=(F(jF<^^5>9{pDmkRS z8WFg2CzYYgW;qHIBfB{1va(WIA8uu%U6)@v|xE_3J9V{+1klaP!8$+ zs*>k(BkM~oYOiVA07F2$zl9F!wBhKs)6%N$$&dI~pG}g3I$|hVR>;YEY_|lRCO;tJ zq+)}5;$JW+yPVFtV{SLNw0ZE3e2DJjAxm15TQF}+`s*sW%&`aaSlMLfKG-lZtjcQ- zg~pP}07&6;P=|%lS3vJlq68t02B1lRjrTRG1E^!q%=XdMuwKd`Y~Cp=opwsdr98M^#i`n z2?xr5%DU(`sC;glUeWuc`ZV6O)uF!JPe^uSdRmAK`KJw4Vpx7w?Pem4yI(1;eEC57 z>xQ6vp8G0s!J6c|F4zj5pa0Pwqh{k~(P0oFG_(8t#sagACtDc3W8DV+zoWp=+rOuU ze}FJq&41eI()v<>KGK?u;`Ja!K4GGJcG@NeV#3DG64bcFi5mTabBU9}4dlpuZ4dUc zdhr)W)bsx1VLCK4*aO44nk@JJ(a8}L^_Nh>DCN{!B{lRr2c!4n;fL@cDE9BTCLytR zDut}9*5b;Yqz#+^EX`Ohp%CnI{a1oyQK3-p4Q?AcVQ#R`XsMtI3b+ekWC%yzGa7M#Gtko(|5}&Y3kEsTDi_(4n;zBKa92k9p)}%h z#F9}AJUKjxDTrcK93JGFG&#rV|4 z3Y&KuNKjokTK~}q2^S_wp&n&%Gl6|xio2_43S3H=y5$Oi;A%m?vF$|()My1-MlB4$ zbJ}H*XVQvMb2z&wCW3Si<~KRQ`a3PZarvZjHw zr80lT5O0uFuOk9kKFhr&aLQ>0;oEzKsM)b-ABQ^Zg!NmY$63U`GRa_w-oi+U%cxQepzF z+5vCNicG!HWC|I3L@$xhJIs3!yt~E4OH1{r6nOvF-l664FoFZaNDDm3GJEVZ%WhOx z%Sumq?Lr^#CmpV#e93_-8XggOJ8K1V#+CzKd&3uXB4>vFbRr8v4`SAK_Sxa7vuY8{ zQiWn}dwF9!n>lVl4LRgp@4|lhj#?7g zf8wdTltvk>{zi-mKUVdQ=NWv7xtEp-a7ARhe)p%S4I$NV^Bn_W^rp=FM=v14^#H!G zbW6pH>%qgY8VW#blZ9(wgyrVoex=E(=^eczwYq>ltWT!arfc^5eJ%+&%gA1FaMR_R z7B=k{Wqh}JoEm$ku4qIYnc!*vFPP3!;fR+)rsW=;ch2f;Fb2I#9|2#v2^~{tW`559 zF*dD{;*45sM!?*=kD4jLM2ec*ww@Uzq%X$FsgwjM zS^*g220xrL8WYgGcB%dPV$)F={q@WsuM`sPnlc&Yw}*dm19FH)Jlc)Yl~0B?xZ4<( z^vuCd+c%-E0Cw>MoDB^rFTY~!oZ1yPec*rbD+(T=>CTQ|q6NPI#K9bB8Dl5)b_Dn* z@-`X7CUj|rU8SfkQUT^Zpo6q_88G09@JX+)3d)HZEMCA@J%Jr2ca=%06G< z2XkT1%Ddi+(x{3+V6_4$ow`UIs+wA;Con9+YrYyc-E({;cnDZDD_In=Y%o`Sytj1P z;A574@pu^cV$q(orDQqaJTd=K6d_#r^fR_HeB`k4;+`lNU|wrF$*0$KAza3m4m@je z>B38VRFo7p(8wXs^gA+{Is!X1+jjKM=;3{kR;D}8Np@Kr;P6CaLOod|{WgqO-C8Id zIZDHJF}WK>A~WHmu63V(dSAx;3XCDo?qip7m$*J6 z@n8qpvrCKWuR$bJ?pdrjziMUzTU(@dposrr z4<&H!?qCDYsja(S8RiKUQw7-yq9h)!nkyI|b7%H#RCIT@l)t$YgY0yuvHa;$F6}b4DQ0K0Sr=XGq885B>CY?BEvX5#6OQYs zn|1w@COQP6xdheIp_bKx^^sJCt!d3i_OparotE6g^6gwmvW+*gkR9C5~O~CR$uw&h$1yq-J`gy%aRy+ACD~2@ghbN&!+o zkG|o%zjj{bs@P9|sYTEF&Tsj|tyFpyLO0HBH>oK|e*M%5oHJfng<)zUA|5OoBID*; z(wdd2Plhr}BbO;_FSmtUJv7^XZHr*DqsqbUu4% z%lZ`1nwZ{M#G>O?gkgs}I{=L7A9HnAALs!Xm8DowYOh!D1_sAqL=iLkI#_QobP7Pd z<>ev;vfwKzVH)|;t=IpGNgiGCG=!)Z&ka(x8(--f$wXrE1 zr-}#sH`c|qd83CUt?UCNd_s}Np2*Wv$HDBtSiREyIs2*O-S5%_2#2l-_iZ}Lc)0{o zJQt0s2XY!Z{mxr%rCgRIs;8tqrIbx>pODDz4a9 zj}`#V@v2QeKt0EG797x!7!6okN3q$oIX}TQe&&wj$W3fBqWh1mrct7&JhIn%G03Lr zZ^ShbFS-oloU9KZEH37aoYn|d`AO$Q2NyfSp=whoD@Marh&xN-TXsTIT?Ef=MnO!5 z`W6-NyyQ@cl+~+{#!3}f*&znE&!{c*Ld1d1#F6=?CU5jmxiu;Ob2!H!6^Bv00qaFw z4gz^xRM4=580edbk%grck~XFrLE7uZlh#`lozB`Qtw-H&Wiy`Xd8Xlj2A@wW9MLh; zg~C*xI)5|6=DcGUS+j;3m}neVMdkpLd6`VTPGwK8x>|)aT|E0fseFe4Hqqt90KG?& zkLzJ5BK;tzf|?$)4FVnN%`k@6MkDdf%us(R#M9RauAm&K2mFivOOPEYDj44{aC@|C zGwCYFLc``r0(W6xC^L6Pz4HoHe!T(}j0^+r^&Od9uEIph-DV!;A@ru8=YoF~3HH=i z85O!F~el6|6duI}C0u&itH5L=rO0xh-koB2fpAEh$7l4S1X0wK;FJSbI?HRlPYcH>bh4wjU*QpW3 zlruUD!Hk*wmmBWMa0S<1Mw`*dj=1r=M|+FY?m$LXmLmZc(p-lwT8+>>zSH#o6A`O( zP?Xq|CXjniaHWyX4zX0qCh4OJ7KQTPJS7*Vu7A7bLZUx+TIAUZu+%zF8*7Tuy(o)L z2n)g18A;o(XD)v;)Z61K9~vgQ$+W~Og!jX&fY1%aK!wrn6zPm1xK|wKzKLD5H#u%( z3E0=z7v{h^l$heX0wdNAs|$OCN7<5CTkO+a6pBA?^AP155Xr<4!KfBLN~HS;782of zgyySx@#l~#mrjkTReM)zc^@;C7^?RDPL<-En2V|#WE_4IyW-zKB-Yu0aW95dx-isJ zscE?5Gdj|URbXq-oI$Yzdve@X-i_qn<6)B@M6gG!GD*a3 z@G3~1*v~}FzhDE;MWZg@td-4$G(f3Ns>nY+X(AqcBM(VuzUjer75+cCMY)+9xk(wdVe6^+-JVz`7m~l<&fX)NUr>U?FkKPfOxl9SjG%0pw zgu*4CaXM_U|F^frc$GN3#aCyadyEmpe7sl9gF`nqOWz>JwHCRb%2jXy`Q!_zk>#2X z4xrgDI+7zU9=ffq7P(QD**9>~vfRoOWFbIly@icwKBk{zSMPsA7HPxP^Sq zQQk|}DkI|t15{vL4>y?w#S?CRzUF7iYp@u)eY|SPfjtN}P;zZHh8}P2tc*4kkK@F2 zPYqIshRugl9g&ZM{GNXTovY|!vq=+oCp3jcL~U~~I-DpxS$?PnkciyjLw%BBd7@>6>QgJhjugNa8q|7A#>LLZ2kTPC#*2laNTh za1$S>r_yI=T8Km%*0AzIi`6&pLNth7`%l5lO>V3Gh;NyYd1b@L`_Fcax8RdjayXEc zn+?^F`OU%;gAN33JF9g61DEDQMNmEM4Fw}+7Z{2aULFD~R5(3rtU;5(#tcLu4P*FXvZomg0$Q65~r&y>f1v5Lk*Yuo!8SG+g zxB5sj=*t1vGqZv(lRyx;lm#2}F`D?*ILbY{G9Ob6w*{GDBJJ9;SIVmZNyD#Bk!LB-5pGv)bqwxEn18?dS<*u8sxZ1mZ2_>Y%?76?E^U?B z_KFfnt^;|JX3n&Qz=Di#_fGYD&;WM$+ioI2DfhYUAw{L^6U;ofNJe`Ci!P@B|e4zX)~T zy}AOx6UyWsc)ej>Ng`3yD-UFGO5+X8-pT5ad)=`^1h>y5XUQ(JjUYBP2Hh3ifNeLw zG&%@CxJ0&1seSXdnzG?;I6Wglvjc2J_0bB!SCR6bV!wDgPCKhE{1ilMRlQ%vRV_lK z$iRu++@ae3+r3rUAqzA`?DL8o?^n7I-6|^3!W=et08GeXEf=FDp7d&GxO|nbgdSFw z6uFk&fkA+&>aobSR4*oG!gTdRn9C!6;}T2RNSyV%iV8a%*Ns8g5%^~y2wScWotkRt z5gClxyW6)HqfZ|aoN`7U$MRIZL>y(L^xZXp!K~lM6(DvPg-^?YKZe0-dsMaF%M6`km!7pLZ1!HS8f-1K@jsNL?aSTP1CLCyY>sOv z=zcrItv>X7*S7}}I(*GgZ_w>V4Asw12ZuvdgU;SNfHic7L4EABfT8OxlZ6wA zdDDBeD6BCb6zaMv!>EO136B@Bo@n@QPGAA_Izbd9LpdZlaY~p6(=z;^JaFV8z6q<( z_=jT@%{{h2nut*#xyQN%pOb-2fAyhI>IcLFG6_D`M&YlEZ$aK3L}mdvziJvKA|WKF z@m)F#5%-h;Q{265*lCJ>D;96f>*sFh*#^Zsb`#K+J`H6+aGRXj&UUn7%4u$rExiNp zdMvv#D;;AmA8TBOy3TcV9jhSrZ7$J)g(o+XVtGw8T!oSfv9}~U#%|ZC^aCQC(eu>v zYxk%7xGci@Gg~MH-P#z@Upt(=ymak?;vL>@`nV6a`d&oKNksU|f_gIH}*ioBHhpf-CaR!!jpikCl^KmHap*h_o^<7?D5M*Kz@<-1b{XPuyY2wR$3JP z&hSmG*RUJyrVX7&Av)MQ$;`Cy zh?3V`(J4A(xJbbbObyWlNa(vm29CY^#%5qv!BnpjQ<4iB#QKPQ(q@e*fj_el6IJ5O$VO! zpck!x%51VWZAk{i0|f$HHR!fuEAF7qt-%ka-4gFxvrGElPLDqJL&9E&pFf*hiV*U~ zZcWC8%U(x7e}dp7>k?_LSeU6ff1fkD1D)6-ms=NBzl1z(7Mp)f|72keNZ1b%|NKY0 z%Fg8hfsAS<5QY>vmZsPuNkw(M=o$D(Gr9C`DoieM1xd6&KpGm7Babe^K=;wABzn{x z%0RZTTUoXCXHhuCX~hz}lkT^r z0A^H@H99#X|4ROcb1je|v0g;oTObA9pL^_?gc(FlQz<1Jqsx-0gbsg{35_YU&+Z}Z z9R21=71UuTq#3*iUkA`lLKiAgzOO#A=wn2_9YQTk9I=m_(ny6HSzh50GN9Nj?_s$V z#p2j%avzt6c&xm?K;Gb;(!B%!8k7amVKLKa1bBH7|W1l;N3XzN|;28|I?#Tt?W@A=pENl~i%Wdp-Tz9#Q z2fXt}EbCgsGrgr{3GSxTj;x77y8ua4FG51W?LD!_6^wU*XIDfz2c;h7ssZ@P?a)Vl z8kVg3Q8cB|e{81&cpE-#w8jIG(cRBq^J~?|`5S0?E(`~?1Ur@%!syX2>{Ap?MS;Ds z;t_p>jL%floPd4~!`ul?V0@9`Q$Jm_r zwRv6mg4nVWdAZue{<^G!eS2fg-mxCG}p6u*cp zi5Sd4@o1GfBsb)ize0ivo>N$j2Ubu|DPngE6jzBJTJwiF4>#Dz${As#_fglb?V{~O zsvFTIpI@aDZWZ#fm7G1*78K9Jak{GQgt`lS<@#Tb;(=g_prH@dbh82MuT_9VdHGlq;K*0g1Ey zDdb}Rs&=1C`}ymq_W{XfdeF=}U|MoPjy{h2X*}iTbN4{@!|k&6o8S6EuaC#@D!;A( z8r7T%-`V9$Ls}m(jxJTMg}V-}7X{Md@_Y0{yx-l)&aT7hP$)%ajg;u;xgLm5Qt6Pk zy-+<)uILb5I{BpEN~?j`kIASKIkCec`=tQa*;>Vag3J(gYO zeaj8%gLoG=4B|uFW%*N!Tt=HC?skd8h2vLW&vb`!z&9(iS_a+_ZLB3n{3Mx+Ck!D7 ze;2W}++Z{o+9hpmO|Lk)P4$0NrF3qiC73=6iR5quGKoq&%?UGnJr2 zd=j+Bu?I+bJ7V08f}}8JSCvcdB5FL1pa`Bzl5OpxZ4?2vG^r6fG|zawEyV!+xK1ew zTR)i$U|T5E5CfTVsG`RFEK7*PGhC>CeCI8?o%R(_GC%c{78rcU)W+(A@AhF;mhA4_ z{CW{t=rs^WRf5%F+O$-^kNR`-e$)6us_Rq{e0+7+?~SQCU+~HnWbZQXUZqHlJsXR8 ztU{Cs-@@-}TaAo~bj97L_qoWNN2=W~5I)5-dg2V}!PD5vZ$m646p7CZOQM9@?(}af zw(aBqEL0BWpb`T~6T#Y)-7G1rv9!eL+Mo7y3MSr?0seQrB=z-sHc96Z)ez&i4a(x~ zWGaJ6%sv}5_9v-_xUu0PtC zCAy$^#(B}2bs83bOGfsPAzHp6iASpgnz&&b-@<68@pa|rj__!nU}D@o=Nl|CXvSH| ztKu`Z=l{?T3t76H=}XbzT_cZ+%T&(VO7ghCD0V__%D5(tNjmaHHI4ceHvwSkf&Tmw z*fhBU+Fpr!m5vBlC0e?KD3TJYx=Ed&cQ6sf;fMB-+KQjiy+0W{Hy}-Tbn25Thko)O zE2M}|(Y}?W(Q274CJ0rUO$KAFLKEJICZmSMcLZOmQV&=|ZE887V4w$cg6X;J9P2?( zC$%YkgrML8tSQ~4SFtgMLe2*Th?WF>YIEvP$BEX{a_YzrEt>dfxa7s}D&0MB0x9Jd zZC0YjyAnJ!ty)oIcUxlL?duD0H8{10bFp4f>EKTXd#q-2Ar%B?`cZndu|L%j7K7H_ zKr6h_@33veR)d~$pHgrRs$EBFH+NJss$5=2AAciQ>hTRAU6#pPSRf^HDtF(;Mn|1y zx4<%b*p4qRm^5-Mp>Kdq!4}*rE%PDEOevgvX}Or*NsJ46@8R@eaHfl{Qzn-T%lW&a z^nX3PEQjP|h>?Q-6F{V)Py4M>7+>=y7(B?<3Sh?Wg$(-uyzTG6TEm}wK9ut@cq8h$ zqT$cJ+&sr&sx^Zd$--Jv*>8sRm(cahyN2!{3s%#mm?+xDyRC8vl-C%z=KAxocQc<| z?(K605&JQ6fOW5NZev<#Z!NCgl!MrPdy$Y#Ww}JH6jNB+H@ea#oBQJzc%_%VW*tO$S?3~Ug zInZiK6MQ8Y8dRAP_4#Z;CBV zKNzheR`tPHpB&Ub82Bgz7~C#M6~neQ&L@z`M_v7J~4={%jLWQRbhXl z)~l4Na2w|NCcBq4P-F=rXjf!p<2WgcM6B?+eojUsDf_A@azM1LN7f>$5j2b%ypi3` zmHE3gomj$Np_Dl4L}smymHH%JZP#m6tf0=pLXkkP@0S;uI1%MVI5l%{_;DL>L?(A) zlwA+hbN%Qr2s%-DrLn@%U?V6WOHk|=V@ejJ;bHZw8ayM9V++}_BXBv>{hfyo872;z-dt;c$?bs9JTiNVbKgEEOFp|I(${JlK>6*H z>NWtuS^@MH%irn#R?K{wpIV;s4au6D`k0B$pR(lSF%e$~@#EL48)~HQ4R#H1Rvw zi5$?93sau*L784x0yQp}t9)W~kH#ujyk}JtK|BSeK>1~CZiM@I@oZ*O50iD^=ng5G zv_N04o2-Q8zO1Y2vOa&cea^dC%cMA=E@rxhWac_nk`8d1&ca4@?`0QF~K$1zd`I6i=IE5P$mN zjR|3rDEK+L;!1Nz@_vZmQn=xFj?F&dTsptqP6LD=G5ts9n0>H86f6m{kFNb7!*X(F zF^$o-*4A0^-TDUPYV~&F31Aue73ck|4DEPIwJu5wSyTfZOwcaya6Df(Sal56*2y8Q z?04v8M0#n4x@Moa1TEaUcUjU;fsdq(NXqHJ#fCGp7ENJM2x1bDN4@6`PL#s*F^p?$ zp#p|pJBRIbV3Ibb+KUFCwb05`aw-;xc|OeEXYpeG&wuy)u<1Cz2M7F}Edjbxc)GU) zx%oQr?0x}^%IZ`+HyP2z5=c}C+H%K&+g@yKVa4}&)oRHFl6D)_5{#DL6Vm{exXcRWcli8I=5mFm&4{yf4{x0St z5m069@w2`Kj0~rr{ciMZ#F*>uRgbvBiVxcF{M?|pG*5xM(osNm*$6xy^F-3r75q~x zO;*Nu+dM%jQQdrOhppBOF@ammTulC(U3@>Hi73*zVyX3V@xEGlPkKutoO(M}(d4C}zpeV4=~QZP zKy-+7^Wj>)xyFjQje1^=sVj$xW=%Q(B#{^=NoPlx8c_&1# z23)APU#xxeI;^A4Q5dS!b2JGn6brM9Th&kjN5^#z=|_P0vHQwg3&qy;`GEEK#hDvN z=;FKh681y@M*NPliy*(!%29c;QBp=?uFHobeUOJA1Lw8yoWMGpFKCGLm&endelWj% z9K7SljLmC)ZATyP0M88}s>Kj8@e2Tmx5u=$@6(Uuhp!9w(9 z@1%E5Ba`+u4>{}6GyI&m4&=;chRh|x+>brmyxOQ;xns+tST zP)fE$YbbQ{%Tf-TP$&NJM2L?;U{}RL8`)PbjoMsCw;P&aiPCc+ShEbX%*O-eo`#!9$|d&Nf3+fn&m&)I+)DcZ;QfJh<*OVx~>#6n4BP31`jvjGd76y7pFy2k>m=tS zxcl{6z4gYKQ+N>KeKP<)T|dF92;a_emS15Ez%*<~D2But&vOQWUWYFzVF~g$r?SJB zB`+^6z1F`Qc;X#8KI!h3FCZI(q#Q$mq%xUO!QRS5W)Z9Esuz`Ms5&NKcud@1<8)JY zeI2sxDMWTW5`(7eBzYZ>%9R$un%l180s=BH9%!j%_s<}%K*1*6%F0Nd-45aTfX-^d zszkxrG2uCJV!vyaAWG+Tmfxa-PvtK_!&IEn5lRYi`!Ydl^&VY7a5>(cI`YK?P@Qqa zFw;bF1GrgjmU3plIocgi{DCIBEly?*#1wFqa{{&sGg6q!GEuq@rjxYl8ZkeXiO4bu z6G?UXYic77d0JOQc+Uul0?I>4mYUsTH@;z=kBkG$pLQQHdwYdXg_=UrB@5i+w#_v@ zRWcQ?Vtw45ae6`@B*-M9l|y?^Un{jPt-{Tj{CN0?S`) z0V@X!IT;QyvcA{nC9&s)JgjR<=l8Ymp!-VrUaprmQJG8}gno5}a&}^z%d`iOZ7IYx z{0Ee=djMB=`SHf}dL?iaCE1|=KJEpSa7M64j2&+95lPQIZ4fjcR$wy5R&G7$zv zYbMEkFnCMWi3oBSAmj{i9207L(_;ll%XA-5CdWpIm;|eUVoLCA^HDSHjPf&}U(3a; z-nGGN?WZvUm71h-ZfH5n!+sPr(cOX=ThGFYlw?yjrwH%R?y0%>xUtr2|+JhpA70xOBQ ziJM^S^wKn!hMVM;vJFGuZG)7_lR5j33f3(nn?_0~yQ!8XpocvHl^J0uh;%96cg!y{ z>!r$P&FN{b^pr=xf+fCtoN=CR{T*R$zezaF9}DrFU~Je+$YSy8+8-zH7;oF!3+5g7 zsogvoY|zDffWLkoy?d8p9g1VAzZ%@5nt`;Z<^Aq*UKLYi&srp+7U1p~&u`;Md*q@W zK#p6$I%6k~QLxXLm^^2A2t+N7nZTlg)ucQL1$l=)hx|!Ia06C9^@01`UTzeNB4}Q- zAn-4@yO8Sq5{(SNSFR^W-2HoH^KWZe^ zB%FJV#@ZRQ?v;7_-=%!-ngCXEiJfbMi>QTz>*~wH zomME50`tYiuD}~9Mfg` zJQSMet2Yjj61BVlGwzv*Y;253L|XIw{X32REv!3U6ukcd@)$vXlDqsO+p!R5&KKqoeJoj+Qd?sZ$_)iY?=cr33_s<=#l5DEdRkvJqrHs^*$H?Cj!8SP=EtS0|V61=MY93+F?@{{CMa_=M{RTpO1N? zHo?5M)RpvPHZ!33pfWY`8R<97G3=1ifCH=cdn8h@X_Yv=*-F3Io95-sdRy3{j-_QZ zR<#OTqek{T@6%x<%c&Vo*f5AJUVHd{+`_>$C4yktlv!^qW5xHK1|#)k;2T10G599p zBRU@vNe$!=Z!^lP853Wpi_Uz)seDo~LM?^LclBb-wqo!aF_Zi?M>vvAkFmzvXCW9w z@qxMRo~xInTuy=Mp{3DG(RIl5FWi&u&N#(*R{k&oxjsg$Y*iDPd6|`k+UR3x(K%{z zxtQ=5Ry?(kHdwlb4`7woxf1Z-&J^Zo-~i2O{?`Lxr*Cze@OnnGjt(Y1^8@w3Fb?a9 zVIa-z1^dn-3+v!%2o}Q2OdgJyGu77&zJbqGQJox3sJU#5da2$0-mb1r`O_yA2Bx>L zvU{voMSH16UPHIqCPia>Ty{(hIAIU{k~l(N2w?N3m_oO2`l*2ac={np)>lR{#urJ$_`{uWq;lS@%Gzm`%8=Kwj#3P_xi#)+=yco@i>eZBXgI0p!UuQRyg=#97-SQRo{VSNyVzBc zHHqZOwZ$3fGrcyRCNe>8Ze^e=4;A%GvG!wqzr4HokT$xjFPmaG(D=AeS>N#7^90J@ z<7nkE{<_lSN1*^%*j=UFt>i+zLDt^lXX%%_R3}bTXTO#pvwgUbVw2?>mg=$40hS_K zLcP%di9zhnzQCT1eR7USpm6U74j-6;x%@Ywt+F@4auqR8-yp@S)rr!(IL_t+^cCZL zDQE+#qq4hY3a;5X34dwxLxrkT8}w$fM!4GZ`GyTuD&;t9{H5JHatPU}f^0J8LeUI) zTdu2zGqL;m-LwA5vei5vxTZ2wQ?m@VyjL+P&Mo5c;n5{s03^9{7D90DRkdAZJe{#a z3I8-#CDB~b9R#dx1L52I+-bu#R^8mVRpv*NzaVkbt569>i_~Z^-w5@MxZ* zglbUrvX|PVaR(03MSo_eJD_h+$&(N_QU?;|y4}-(YmmnU=T^p61rgLrfGsZN$pIS& zSEoKR4jM`XGSzZ3JPhiC(oF64GfRvTcfS)?W*v=^pXP(aGb82}D(lCy3-eKStQ)r=^5Mc#ibb+l_XEz*Ta zVe1};U6e2wvAJ8HZvq{gHnsb_S;b5>MzGlVGNJrJad}&0FGHSNru6%f z-9;Pe7hdOC6Vbdz3X{Wb^YO=y7j$9C(kzPJav* zhtIV{h81PKYme^KK`tnOEiS3gQAHEO*h+EJy_Ss^jY1vn zF|TKV#@ExoD)sg6;x(;YO{%h?$Edp!LgX{=xiIS4O_5$nLIKn_N=)%Y2y|!?EdAlH-@advPT{V z2cxc*{Wt*!^Zk(|C!lweUB<_o3AH}R$(z2YWnC45jE;qlOx4Dt86-VLV)ge3`d@uw zP4-XR`rK`>8hSv1Tb#WxXk?utX&_>*raqI(O7;b7&pG78QaZ2fF-z1Lw8G4cO*Y%J{)R zB?a!;x>V!!(s^4{xDgK$?p+C*LC~4>#)TSO@VC``>So6@MIH#NIzJywJ=2}k@|ea_ z2MGd4IxTf)Uh2fFhQwqX#ley+|4_DX)3l3+l*eBqn;cqDbZXXs8r2AZBSG>Qs5Mu7_}QP00uNx5O>ObxIDW0WvE{i^#+`G zitmqobiepxJRCJV1*658q1Of+sz=(?TC?$&6R?xV+g0d3O1t>&R<7bFG%_H_%8k zBRUqy{_5X)H6NaK8#o@s92p?K%a#ZB9eHsHWR8;m}71 zkr?b!i3Pp(ua(w-3$qo{NeINYoRzFSkqh~D-s+L_=YEQE3E{&6Ly$J_BC%EB`>y|i zy-Bf9gTR2D+-7E;UI>&dXhL7)l{3(!SOg@~|{-ue(^ zM>3lT{aEEmzWyVO0gvyd(?Ek#D04l;bEP*jKTokJn~n6E>Bm!(LzPiwlA##~!leny zb>#8x;#_;OYt*i8I^>2FStY&$E?A!&&DYUQ2ySs8AL2N4s;RlN4p5$byn_bJ}kdr~v4R!DsW)~~W@Sv_O??%G=V%Ast6uel8l={r#ctoJjP7Cb zrU|kvEdI`klN;99x(2&oS1hmB3Ak|kv zX7zzviy_-XEZCpC z9!Na@>q(qqp2jm@f%0?RJ5YG=8y~`gM+Ri}b0V;of=lYSD32pI=zZuyUh|)cwbCcrw%jt(=jEF?JL^Tl~o*ERMg@y^ zdpOCeYvo#4rW_{la3)IxqTd}l%wi*_u|Rsi4j(&AaVucQe#lEt~=qf7DC{# zH7g@AM3#8KUt_#87?dSa;qkgnO){(Cuhx8QV1?XP_FZn*=gwxhD?!IsM@aHr^&6IX zEcSWaowH`XHlN8Bm)Ofaw%>hQE>1GA0TUR7p{0DqBVI>*y4r-sTlr|LE?OhdLl1IA z=g47Q&J7?`$awDQB@jWlYjDHoIewjwbtN{lMi|n<%M}BZyHA^bj33|2G z5tShs{=IuhoafEsgf9>gxLOd|rQoSbg8+Ih9uDs&O_)|CKquaJe@~7zQQuDPO4Ozc z21bNwTx9Q38mlIsA9HmNrQwQAfS)#wdV5|*xKq3u zvhMkTQ6SAmU0K|Jp|>19ZTAb)J~q)aFfyDy z5;Qb?+N<>Rq73kV#(pfHSzQNXHJ(&Cwdvc{{vcYcpj-;@9fQ>=An9t$;`3%bY;XV!U&?2BX(9y!W=iZ$EQiw`)EG@3Zp zX_Z*D-M6#m+id){PByiFGL2cg_0^XpYKO;fdB*9nklFQFgEZDkEkm#39f%5qI8oF~ zvM2Q&^=#eyhk`b{!w)J;x9G)7H`;PW!7*&)N?$LGN-)7Up3|YUuTM*9)p zRnyjC-t9Kb;*exz@i877T+YyTib>-K9#D80KZ=ljC);LhKLx3HrPugmmKr(XLND#B zw)6LsIE?7;;m3{~ef(?S7A7fpyd9(y#KW_sTdx~JdK7Erf`jC;sb}tXY=_5#<~z#P z=JNrXrpgjKJ$8mGhiKugTzqyAA#XmzV*SRPez@eIXB#N z^Fm2sEO^tzAc>T1DPgwFYDp})??E#$9c^GtMsBl`3%|sXvzSiEGYy04n(~IvWYuph z-$WgfaQ)!u_Va4`teHX@RdFwEB9`I9h@h7 zIQCevbc;PVQg?|yDV(AKi)ZS& zz2@HZ&JxgICyGp4H+ViV26HdRNpCVt&Dw;K5e-uQK2=R;0a^|ZBy%Wd#_&fbH?HK1 z4Xa3jd|63jy&>9HN_|kZ+}eN*t|it!GiCv$jVgZ3@Cc@3zN9Ms2;JI%9d5?|`3O1L zi*<2peUQZSDyXv*XJhfvS2p69{dSXC_1BsXqjqz)^T47z)CekVsX8~gqq!A;;+{8M z{s^}?cLO%FwT!V*fJyOH_TO03{kIFJx{8K%dc_=8ezmD3W1Mg)N@k0BJ;@l18L_VIy}-X(^FSsI8d1+aofOpF4ew4Ih_Wggf2>g34G zkqRl}hzf+FPC&>2G4+Z*{bngFCSkXnQla8degk!w^s z6XBDyNwEJ5ya_JXsa@hpM3;r1eskEdA%zmKa1mrhHoH@H?ks62ObJDOK47*OGlUHa%RNPtmCNu zJoF{zG7U@MJ_9;hwH|C=d&6ENYCSVztUy$gms|Ss;NVkVcq5)4PiBZFALsQH6NwuL zU~8!^mol}cO)hcyQR4NlnkAP1s1ZZo2p*lNj2AO@AzR%_l9Y+}K1m>-$7jXYWPR&{ z4;QChpB?b$H{YNY8GQD>;(IqwpM|93WMUsB`f!E2dGvO%NTH--=?~qSphIjDzgZ7g zz^s4GdDK#@02_2X4|&D9eY?mvW}B%fD3@6WYvp7UUrlw^hwBc4^HGnAE_Z6{2?mEc zn8*I?0uUf!o>=Vg)7e*Zk#cvgx1Q&oPc4UBMisdsCVEm*{1b4ds>fWQRAbcfLuyFq zJ=j+qfqQ}-78WrD12cnKdL;5JKF*Zq%(WZTTFqxrV4l`~p8s0N7v=tHOxNY830bJ2 zw2<_%7SGv!_&UqiGfirc5WSfc#o&xr$ARv*0;_8q!opW~&25Q?-S2R+p(g2{s{-GD5B`aB z?M$C(VROo^b)Dnl!_%UNh{d8Cdz|BgZLz>R@L#sNyRbl=^SU>=tpfp66GS+5dM6>*k@)~s-y4q$Q#&ShsCM|0x1B6kNpc&Q zCN*FjeRB5N@4;d!tB%lk^U^@gk%+V(3?`w$(#n$}nYpiHv8}+p^KL~NhQaBuwG4Y% ziP&4@am(|KZX?uiuy{Q229?YDU8Fh&vc1u2s{3{e8IMKd6ln|5l&cDr#%Xm@IQg_< zD*aXYnJ=t@kUT?KlsV$^$=MszejqHWFX#|+ckC#$05DE+m1Qs>bWu-@P!9z_ET(Mv zrBro_54C`jvGbOqm>;Zn$i@J#2nN;3F({mK7q7|AO>R9NiaWQ*m@9V!YC#Pa+Dc@~ zuja>aPlz1>0ZA1&&to_c^CzoltE{Xqy+whDuvzqt)*V-TaO}BVe>E#^`(z&R``Csf z|9NCuT|Q*51=5zLPpsy_R}Fgw8gmVIEZ9K=`iJ{;FY-5!4v8Li>#Vj_8Lrw(U(kXa z8`YM^U7PH_!^8$#kC8S1f)LWC@#j`)%`~Jb^3FlW8Jx2tX(1gF*OT@71tduTc!^YVR6Es;ael-ep{o9qd?92`r(bo+6QjyX) z|C3*l8hp&}*X;Kw7`1Q3+7MEepQ6=Vx*(TUdw^+h?m8?gv52L>6k2p#}SJ&A}YC2-?ih@Df-^(~~HZ8T<7n~%xp=696D2C0s0Sqz(3 z`T9NRFt##}Oay$}7CmyHDf~YY1{0jfM_D#p$9PW&jj%miP&pX;l)0V;`;Ff01unJ7@zFd6+fougNrv+@FeqBqtKef2bu#;{{!`YYg zl3h&Qo#XUoLJn%W1e4Y{9&C{6#V88<0*Y)wT9t(v3_xEgGKOJik5HDMNc$7ljLUW( zU|Fu}LE|NYhei3^i+I4Q^1JzWr9%P z%%{dxUj)kP+=%ekSs!r=!Bm3?UbCk{J{Z|W0vBH|FJ^3vk zkFQA@MjienF@tZ&^O{~`R<|?*LIU~9%kG4Ame&TCNdch=r6rnxcD_9|qi()vy0k=P zJHlgRFC~TTOqa6mF`+7pKAYq+d!EgG6|onu6{3`e0{l8#S12XPb07$+xFIFwydbftPHpPDuC7Rdz4a!C?tXv$524Hi3z|c2zuIluH4?a$$8F zP&`G|X)lr80yPG&T^j$oWSQISC{@Wy{x-SE3g14PG;rh7ZE#$_cn+Flrw08#BUe@$ zI)c8W6o;TdlMJ3s#0RXX4~$Wz<0xOe3xlR!smC+r50H#W37?Z1sSMl=zjUx4Pdtqu zsSK1k!U?>k{*j_o3w~?y%2JPoMLWgv4+t2_?@D;Avo$!KF#gd}JnTF3Sa^o!Vp)tw zE*(k?byy%6mWR{`ZC8y}^7uljnyUXbn1#Sy^}z5W#6o2F&Zh zKeNL1A}-V_Z$66_HUCjLY%oA~S)Dovnix9;Ef`Q|onSad)Db`l$&~~)&?mvl?)z(n z5763^kUj(HxG>bEABSnS=KVw=iE6F}uH##`7NME?MC)r)VU{(vg5~D=QVH`kp(q9B zNh16=TokctfR}cf6nyPkJ$#<8dBo5kY@PePKBb8c&}{gF_3rT+IN+=m9OA(+79q=u z&FYJHa9z8Gmt?|ItscfiV(zT2xqC3NU@GNFKD2!crYk~LH>E;6on@Nevozke<#m1?2ALDmoiDl>47Ps{!AKN0Z+s~K5_!Np)u>4UTbFVEI6e~gd zhv=QIK1;>cmo6U58UGMuv;9EMw{D~L0bK?vw3-0`yKC9kUJ;YO(hZo4&B08e$F1^dz};)uOmc!IZi z2HucTL;JNg6!`Hy+H*f9pe{TfYoOi96V<^DBy7AlgNZz`hkF-73^g&KD?J$AD0-{mFl zOBf?Hw?;pQct+QU_wBc(%mx+J_%@(9!shK*GOyesea8h%RM+h5uA((KCfhM)#4Qmd z;LlEtlSm~n^h3{u@$vz8LpzVRe!G${PerG`A;$oD%yd8sGo{ol`h?!ou!HVpo_&Y9 z`Z4RNRq%fy3XR56xesTAVpLJ00M@8q_Ht zE20J*h9gv-M?YV1RJSO70bBhz-(`QX{JS$PwGeJ%=IpVIimu4t*<)E+0GU%9WO<|vcwIfK!vOzTm%&#)D;AK^eH?!u zUjU&K?i+y3?}4O8N7?9lOPkoh?BVOgi^IVEYi^-sz6;4c>s2QI^jJ1UB9NS}ZzG(W zdv7YXOfqQV@CyS;i1n7=Ki1x8>~!g@PFTtX5k#gn8~?tmT*^lJ5dzIfcK6O+mqh60 z=&MV6y zL7x54-^a>z8SzY+M3Ktsm=U4DJ?ucx_fxYAnY7~)F539n+=}OKkSU5f9AOMK2t&`G z3Q6x}(d~jycD(OGAlCig7zPDMEws#zHNS}qz-Qfpzc!$@PWAhNS|ejh<-ZTJIN;-V zS{FID8(7>tVX)WdUj|^%1}UVIlJ*aGjj;}hx&^#^+sssp`Rivg8va@NmVycNtLyN^Y^XcQp=!uVLkq(KY5RN6)r0?k zI6lhJQ9t0jFGp^pJT4z)*!wcl$6u(@T*_J=0)s2b^`(bUqnDVW#&kL+4mocn?RU4;A)%Sr}V2EHrqTHN4!rmsc^2bkBp&cXR@rxz1JiU3+iEc1tw7v@mO!_xbwi@@h6&X} z*Wn}tYh0duM-DH!(`sNY@vFuxMS2@uXSES=$S-coZ*u4Y&yVNMn!FONJxQ3r!{hR> zdfmh_QN;!C67AN(6D#2hYcY0%@`~M|Wk+P?yu5>Epn`yqlAwlwFq@q{1uOgZ3ADbH z0!(vhF{1Vbi;|3;-Quca{_0NPWf2cXl z_ZJap6BEJap1RHT2KzJR-4kpO?&*irF`7SYe=v1#p)5I8^0(5id0m`3s-xErx}hIW zD~bTSjH&rpZ?;Hvi|0u+q{q#79=(w5%P0Y4L1*Nq6gyMy>A@SuMf<7hc>gKmJYcJ~8QB6Y= zpgFU0Zij9M8n78?jHd~DTynUEH}M5O8mLz4zht)o?quG*?_`G^BTvzEhS+)XeCB`e zmj&%Z`i`b4!-fFfW&AI`Z7h7}y!Vz$!+B#6qE9?;Az!+QUIZV@emV4ScGH^{T=zO6 z$(BBPuPb@=r|2pI$7zIP7$d6ZSVS_M+Ea-Yb*t4CXHqMBym$!O!TGK zu66eV0NCyV64;EMs@qKfK;Yy!YGm1(;z7Rtn_kR%T{rM zy+@81@x^yGjmE=~Iw?Aiw~^(<17S^IG-*bWkR|=S5cGV=C^=!RjDU_fZfFJHaZuC4&!{_ULK>qO-J3(7oWFS;bUd;f1T8w;B0 z6yOa7HIsq2CKx=e6neR^aIBVcZa)bg>AG6-fUI zwI3hZjWj7@C$O+iG{&BO%ySZKoRlPEQ-?YX{7-2V>ZP}H&e6l#dy@&rB;vymc-`d= z+s&{QNLa;@5~9zBR4K9Dv~ts>@Ue+y*%JDq#b9q z2VCAT4wlSU6@15n5}l>xBq}6P*eHfVMTVNKc%(qNCL1?+Q$nxr%Y^ME^V1s@3@C6f zZALeM8%2bSU*% zs0=w+9r!D5aMC6@ehp{`myq`BZlJ74KrJCckf13|UG;)q8m4T^-6%95NDo_=p zna}49N@f-x!PIEiXIWOm7(4JEo@0rGa0f}JIWeat@xD{+K0%1!62ptXaXD^B1of1X zoOZqJ`|l#?8B?ql)Kbu1r70YqcY zC#Y6HBwl#{jX+)EOf`soNs+6@{&3ks^0s!|AF_H`o|BSfGk6Nj#5k2^xu5%R&c`OaVlpEPMIYBV9%cad!+t3`QxWFXaA`5ygeoUyrlj-DA^;t%Gw@u_ohk z>cuqcc7?(}UVr^lp$Di1cv4yr(!KC?yZ(E7vmb^OY_?OI9Ss9SBEa`q4<(Xvsw#0o zZ?{990T-q^{j|29u@PVUX7G|~;JVSD60PxQMy3KR@Qz@QTKf)$wN3QqJ`a6NY5BNJ zfk#QIPJ`83m5#>`jTaN&FH4#R1fK_4cCV4nJ>DNjvbu^bjV_9f% zRU2|RD5j2j>37+s-I?z}8CO55NAI=0I8%nH2px9*4$8#FHQ6ilC3MP~<(1Ck6sqL> zEH*w}srv;;b(|nsG}P6MmGh%lOt%3S+P<*}Exz+i+=DW)?-TA=WB0fX4aoNmEMrU; z0u)(BnR|$<&Jo~^R$O;NrrmHzdvu_ND6@u;EMmK-Pu^?c#Z_j zZRSlnQR&p=jj{W$dXpLq3794w7;=M->344ka?0cM@9Hk$#7iWUX#~dm7bON9u#vdk z?F#6jtyyuk1lK?*=uq)Un~iLX2$ToMrh;|a_Igh~8=v|k8#>*VHD2*4wg-|Vj7(oL zsQXC$1c{P_OZsTmOwmLxILvFQh3ZjT_r`^6*Vz+zPC|gz`+n-D+_2_Wn-ZS-kd2>( zM3z}iMy~7g3)p)ER1U)_r*b#4>}E|Iuo2*EFV6P`PctZi=TO3pi*-kQxUAOUif> zs>Uf0q|@i^{$$rrRk!G{>7-*y1vRHQD#CjB|a@r}(W2x4Ry8wVP zSobwL&PWd0IwKo#n7VPQ8IHp02s8YaxkKw@ARW6)6-T?%(&sM2RpUVB*{90iXeuA_vjW;!v11tX|4-P$ag-k$rz81dK5)`7M2qMFo zYtEQpoWBpTnPor;kcIH3olm1I{S}-&M~i_X#1=c{_@5S4co0@aLl-1|P9mm!%!!$5 zRpb4QW9f$&$i4#g9wp^Fn%Tu(Ls~0D)Qq}j=bgb+)E^a?n4Wy)I~7a*{J5uVdKza2 zcEzo5wyuKVbF*tbMW6}IfmbEC9Gjg7@EyQIAj6ad&%c(4PP|`j1SsK0NG9#@I*2C-v@4?=ER(b zo7k&-uCkO5)1jf6010+^Qt7E;bU{2JIyTSpKRcnCDlo)h(?H(1@0_#cFv#A6EJ=K~ zqdfc$fsz0I+y$nUBD07aSl2t_*g0AhZ|ln{r97}9-RVwzOn#f^NgtOC>{xnW+BIjY z=0M6=s}fGDIh}J(hluZX+r9n8hjFRCgi^@VPeY8GA2gPW5p|%C=i#c=Km3W_HRIdE zYK+>F$|7(iBfL{+nBA{p%}hQF0;y$(cHC3LH=VKuD#96=ehKbA!BR9uMC@|?12Lwr z+hhe&kx$qQ7GL}dx}cd9oxW5z>b!jOorK>1lwj3KwV!pg?Xhui$X@Ol&!!V%S-B<` zHZ0x#heS#0D!wa`n>K{I~+xyoXxfx@Ng5h zQP-}qu>Nh7C^MDyMChKDc@4jqEOn%+50~Q5q$z{XFAk~gtH0qHl2*p-OW?G9#_SoZ zoy^=$NSe0`ov3Tg9h7wzm=_>$A(DxYp%!zD=_3pPnyxGe8Mh4J9<^74ZtSIC&2T*z z!RGo!(TV8HeKBdk2B%7sSav+ zPLO@z=+|K|OoAOA7Z*06jba*(#*#p~sb?_xT@5u1*$JWZNu$mpUx0*D z(@0-D^6R|nMk=wlJ_K9eDGW~XwAv=I?C@zF<&5Y)r~)M(q~6C;l`F^;Q8LMbL#7?K zKpAh+>9Qbej{Y;~5LgS@>%B|wE>U)p*Wzx4w+`7=M*p0R_FUpg%KPv2LVYa2YeWXd zaN|&gTH@gmSkTfmQSgYhE#={;3PY7qrfByN@%=yoA8Zt5%hI6w{IEcx zPINfsT(-*i>7Gkh|N08Kdiu9O29^5x#WQ>NRTN7E+*Ljq)SFn+LraC8K*}~ zfVK#B^)ts%{ReofI0jMH9M&r)Zj%H`dx(JoL9~)6H3_}DxhgeIKb|59eG4^y!*PYj za(*17TE7|z(MkFH6#Af3!082^^yY_(onfVspI{<{QBqe1$y9HRWTX{2=%y+d6{fl1 z6cBevEHCiLNyi3HN{nZ+>F zavLx>Qfu)wdLt|c&`Ue8!oXg9lZ?kuD;n0ub5KvK;2?a6^pO^MZuKFS@&x&7jRmWw z{!ddSFU^Qp9$(!IE5i+H#h-AkS3JUA;dBFzv5a@~-CP1-l`jLic}!-VdAH}v z16R_um;0Ei#Dh+raLaw+zKH56t;Un6EFw2v%Q|K#cZ*y2Ad6i}Q|<)xH0Limh;{!w z!#F>&!>-B-HaAQCKTVPGbRFJ;MhPw6yERB?rjIW_~ z*@CbIKXXz5AzHenQ5zT$V|9#~(ydmG-76dYFcK9q0jHxb_Eq!52|fC4m%3GQ()kQR z9i8~vi7IqSpOB*jYI7tHBpH`JrYd?Sn7BEbzBWVf%a_nOg!DcVGxIF}xZD+tUz!15%O|r!>tSuQk*k!`Q!utJ zdJIG3le>gBWqn1p@e-GPX7;o@fx-to17SYdH0}2I{W=Y+ECG_D?o$>~yelgGetHzm z2s24}P|qNpU*UBXS`1QvLM`6F3}2oITYh#Vv1b!zP_Oxr_De_?;{OVQ^F!)9#JdF$ zdPKCTyJaILKpPkMvwsZ8cU0e&I>$6hGiZ&s!qR&xs25`K=IBRCHQ(!IhMz(n9^lwj zpV>CfD)%$P4z?h08W#Or5T7~uCg5D$V;)#~rWAz^!;VnhviZ1e&D=m(g&dp{8-J@M ze?4qhdOjQ$NyXM;6HRy7hu2-27W??~tToJvIV#cyNbyz9KbGBC=edmaXsd&~q?4ef zX>>~`bpGy0y`~b`tOXDr_5C?cv<9CJ>f=$QHt&U%kA1ALF6-VObt?J3L+~Mss~O> zbEqdV1gn>JnWdNyiutcakBVvb(rHlM(F_fyElq8zV@}6b43FK=DpYkMK04{oD91SD z;IXy)K00-nSg@aZuqFFbVoEZ=eD^PSTs`yt&yIiWTTDagh z4I;7{Q}ov4f7R|g8@^oH2wtm{ik4lkq5*iHcERdMBSEq0lFv0=lhkUF;U#0k-^@vT*(N7cl?o-#}+WioiH3>nF#va zgH~J`KWfA8{{|ozexFita$)=Q&u3}oG&0EL0iZVf zb#?juHjQvD)Qe_DAQiwb{m2qvP%#$(^}eMupMHJE__`AVPh@gwQGHJ!HKLY{F5W#0 zlntl{623Y!?{4dGd5d5Tm=@!Vwpoqys=7^dm_>*vSH&g(gQg8l7%)XaGx39IR6EYnHhs4Z17^`2r^ z=OTo>gkgBQI4niNOIzttVQ=ZfvC*C(diMGll?M2DOFp%f-nM6e>rF(%>5YsE=G;qy zhMEoq%=YJr5@zQ$PQ0zY_Q+H-4o3TWqQ}67-1QZZvx6la*Koq--${J9dN&2-^)BFQ zgf_I=wPO`>AVYO@xQXDshzxvDhIxMl$}N=EJ2V53_F0*$Q8M}znu`PP(o~_J)@UBG z7jk=bH|&N}Wf3LRFyIRy-wgQjM4Z*zlv}#m%8so9-xM>MiexV%fae6K*!#2Y8yx|^ zBxZ%RWp!^zbpUFR_@^Rv1;7KFRVw(ZD4|COSqTgKYl>5^bKoaO_%nLO$(!{BYzCw3 zVeD~B(33gxot48yZSO~5xEl`Um6p_NT-AsOBr|1;5K0W0E^JIl8P|5E{X^yzkvB!| z&$|D>wxCYfE6pbLY2Sl^EY62yS9 za%ln2*M!wzdGx`hhb(h{&9ABe9&`N4nPSGNGM{pqwI?N7n|t8uboF0nAhmMUn-UU+ zs%m}~TR&&n^t~IRo~;3a-UN~x5>cMvmAj@YB27VFNqDPlYhJD(PoDm-LOoO?fUaaQ zvmA!8=icw&v|cr_-(csAx;)zB`2;Yk#>rC8d*L}=n*FwjDrwwEaF>XvZ$t-PmJuSB zC>?cLLhJ9u@FjM`PTP~En`aFzo^qc9!Q+{A>YIlDNZ_|nGse?fGtVdtwm{?Ta9ief z4~&5wkBE;VwL9su)yKbaEQ{lqfF#j5a7PmC-Cl&rlaIiM_Zwu$bHuaYPVo z1bZ#d_DQJhnQlhSvlN|lP8V3t`jvE>g=7aOifA+*k5=GjQ9cJ{7SMT(yL6U--v2xdmq_x(OdV`y z?qOF68@NPYr2#!i<4?iL>psT&Z%i1&TPCa;B6_Rsu?5@r9;+8zox((u9>REGAL9F5 zjT2}c9Cn%~M7UnZ^5p(f@L9#LT!qj9X1e{1-OyPsEEHHR^S)M8>pW%c!?E-rH7(mc z6vm~i%_SIU@==poKENZqa65Ugf{T?3houetz&-lQe6MPt+z+cM6cQ-B4V&3;5_%4# z{~+x5EIEIwDtn_tx5uCmW#>C*!vP234HF(cAxPv4x4@y5j_t*=2>CRs_m+?mgCS&x zF1k^^-7f6RCPBU6$5?+%7O;Fr+iga0Fn&LcmR@SY9>$a$n@EeAv`~?%C%O)kYeqo8 zb7_XxoQpXLp^%fjhqVWkpYK+|#^f9en6VxE$xNqAq9qDJwNhgZM)Y7Yzm3c5{%@ix z)tu&)X|* z!Kb@O+`H4$M3UxM=RSC-sz~Xx3hc>O_k)G%t_;&-EceH3X8qj@*KJRh6oy8G`xSg`^llRX%D~0;0~25 z=!TZB8CMm1jm{5}3v>2t3gw3=nQgMy+d;>!TrjAU2h&39OgV;=`qh>{9eqVw7k!r+ zHs5Lpx0E)&h4r#ztH;#&Dr_vW$#78C9|ZH{#<)_P$UR>lsb470*eG9+O5xy{8vh{- zmr*>mTj>;zmo5_d>7@Y+ajTagg7y_eDR6*vSMYqO@^sNwL;j+v5|L0^x#42y&1x6N z+a0ho#so~}`Xptv%xo5yjP?ahGRy8>No>0gI>$tc%rce(#jE%F(yvBcQPtyV}@P&LaYUo&~m24S#yLi`lK2!hF_G=Nm{E%1%9 z3pI|!tAHHi&4V#gTYH%AUKiC)!Fb&`yk5(RSgko2SA`0qdl*Noa$4>1g1CE7u5*Fv z32+TEyLioE(@41fgr((EWL00Nack!5owtU>G%n)is&`S`YExddUf&)AxO= zip%=SlkXytlozAke@*Xv!p!S`HX0hK9qNVwFAWRFZ&PLCGh;kv;kyW8*Cksq@DJ$o zu6sodsnD66J$DXq%bQhJCQ!R_LW9tqHyhYr`#Bwi20Zuj<8MU&A{+J~Xr-?4vJ1J+GkZh=#b(&rm1{M@CDUvHH<({8 zz>B7<7saL{S$K1{!12y4oUJvs65(#5giwM<$1{M*X?b{COXpbOvH?-&KG~1+CVn(R zcC)6$5OL5RM9^W+De9Znr*9-!_W1QE6;i|IyJ;U`*?&k>!^5pKgos37wD&zs{)Cdx(13A%SQHUQ8Du# zi6VS)7s86UsYQUIpw<|Va5@2)?NCQ*mr^q1g(d7Y?!LCB#MJfSdCyNxrlj@nBdbFn zK`YOb{)H=nUHlyKMdu0WZ7s5&Tg1^RA~T%60w#(*%dd9x5rltwF1AVKF3aBRWxUKD zz!ubYuaMwXD~@}Z5Arr_|8CmFdJS#?AH|iBmM^f3dpHm@*lVmU2KGdJ44e+ zvEr|B=|3->U1Y3>hLwYw+;y*~9yP{9zH4L26UA+N_u;g}Kq8cYYQRPUiE}7*y3Rx7 zJ#4+tZ@`e16~!b1zh%$=k?9+8xh2{P*w&&V7lmjebV$2b4PDCibY4`jrH~AUMxBX2 z1q+A^a?&B@y;n!#cH@+*UoBTCC74$N#HQvtc|~?0)6*^VJKA=_+^L@ZqJP;{d&+0yzLz-?Wx_Up#32gDvZLCSYrlsd}bN^^4h zY9WEjRE*KapUs&kmi+K_lIcPO)mF&nOC+As2rR*sa->Lj0ai;IR9v&E4z8^_*41s{ z!y|}XsJAz#*7}s(_2*5k7B{(KFFOhsc}4>0SgtwVumDg(M{Ezss>MdqI3sAjpW&?R z%9dJJ2EfgKV$=k$Yv@|Vd<>w*<>)f;I->Pz-=vFJnZ~7k&Dxso=arKu7dXAtHqj8yekv>{H{kH~+LdYiX^not=M{YRm!Bs?)(wd&q~$T;4X|$8fD<1c1|h zT<>wOpu*-R>A?5a0O%333@hL{Gs~+W`;!tZCwM|jOXz_q_6Xr9;wPtEa*;D%^5IAk zqDOk{m^YW){65_Wm3s}I8HY-F*o*I-mVS-ew@36v1XXGq$wHyN7ytBq0`RbChrW!r zNNsdhXmXIG;!i$er&S4lH?L!8seqj4p96?HC&-M5MZ8XV%Hv1iTVT4mEhEPRa-#!? z&i)s1d)zgm1%!j)4*B4E9tUDkyWP(Vd{$hnyI?my`g(_O#c-YcnU+QGw9?U0Btyq6 zdex2kv1|vrt9@6!NrC~yY zgrvI&|6NPfn|m5RFc_y_RHCCHL|PX4nGg?8It%Hn8BXU_n}t@3y&X*60x-u88CnsIW5PZL*0TQW~G~Hj)2dnBk=!g%>qM3w3$lg!P#c zkb-_VQ<9er`l|(rxa%@jR)z5!4svFu)nF%D$phtmzNfVZyopBsthX@qdUS|*K~hie zwGfAp*>lQ-UJg1$E`{voj)3BQEp9Q{S`m}}piAGNsmd$VJ!KG3&kz z0~0OhLYue`{dp{0JX^J0mkXO$>@XwUP3QYkgY?qr+pd&1{Lo7rZQL;WTA8oF-J=p$ z$J6QuH=z$AJNnnOtti}Fgk66!I$;;Jv}%2hjV*{!&Cp3^IrIC8rY{D=lN#Vx#NpGw zg8h%XZ0~~vk#oHalAy{L)R?B$dM1m92t~B=49(W3vV$!`wkcJ4Xp)d3msabcsb8jx z?|qqwkkcCmt~xD%5d;x_myKuu&PFxtXOU!j6Q<0H!mZU7ipq+FxRWc7~!m$%)dTfbVosHqBNF z1zS!YO;V(2>)sZlHV8asTZnu>(PXf7|74ei^oT#9F{3<(vK$vvf1p?4sYJ2ea&`}w z(*w<90qq!A5Mlrs^aD9S3hYvsI-99L;c?KKOreJ*t5s?+W0ayA%s&%=Clyzs=?bGC z&-&_aYU5A$Ij~oXmm9_;cf_JjU#>N!Tu@Dm_aX>{!$<=aL9zG>4YFGE%s37QyZD1x z-AHvM#h$A7%iM(rb(G+3e;7-N-wLq_VZ9~{83kSbqOyb1KTV(}2I_+l%t7FRUN zPmiMn!%=RV`+F=QdhpbPl!#Fb5xUEbWgjuWYWoUJW_D%=oOsHK|aMQYUi*X`X=WmT))%I%ZX7-tKNDV3V7tpW&!JnSYDMq?B^1Vtet3&tmavEG7s321zE8 zZjU;3&_@(Nf~uJyL9c5>c`C6D$4P|I5@eQL(s(KIb3GWCw6WfBjI4V)3tzBCW>$V< zBy_?|MSju7QB)yzW^7_NEowHzZ}%`ZHi)ijE$4(qErXRYc)__?Cr4jUGQdcyN=IfA zHTqB52E||CG@7x4XU_plX?3Dt&Lx}xq^)XfR6gs?^=hoQI8kM%;(iSCHygxJJ02Pw znmk2Aj-lRM;~oZJd38XDc!d%~2<0_3M5Zsznowx48^=amcxX)Jw_OBLQmFDAlmYsn3o2jY8kZ*oqr*ho8e`nuMxIwiBVAmEAH?5vsdF%^$-Z17DQ@Yh_^nQiX| z(1zyk)g2EJjAwRU7Uy^V?JN{O_@9xb68a-s-g|&%z1>m6L4jS)Lf{|G6Q$*<@k&Q6Wr%M#|4KBp;Xia`85R{|CZH0a9NFt ze4r?%t{FM7vR{ouW06OF0!TW1mZkxHn|UHAmwV%TReHc%tD_ezhkBf@4Nzy+P_!PP zrX`Y-Ig=5Sy9RcM?PRRgnJ4+%s3Gcxc9LuKPZek$>OiZLI8%%q)Q#)v|A2fK#t!KU z9rly#GyyEj%IX24q8w5t9~JGN@sqP_xT5x3&KV&LJ+xB!;d#tCLLOzLM-`0>JgA0G zNPa4R-NlRN@YaWZdPDBuG9YnDeT)vaEtBKpd-$8ou+_a10f#yx_9ZR{z_WiH=Cey| zDg2ob4$C1`i-9}aVK(O11Xc0~1Q;*{CsH-OH{+g1fMjyia+0a=qY9whS*{)lEtl{P zqG^ta+l+O596rByutJ#7xR@*9Y>(VV=Dh%WT;oKW^ZxJK?;@~?=TgLueRc_ROesjC zPZE6(zz`nvT}tepPIuc+73yxXZ1^XD8zR1gLoc!(-IU1|z0H#%%Yo5S8!GtgkOHoj z3o}29Qy%%^+9Kl-5W}uYruemQzxJG<%R*3x?-S9avX4Yk-QiN)w#aVMMV4O*Ew>m1$P+JczR5qeSDK3OKisSp;M0iNYn<;VWLvvnG!}wz0i1HdF+W7 zM&ivFFscbbAs0g-5eALBAeWg_4mKCgU zLQG87#uTgxxD9FoKeT6#2z4~~R4|2m*Np}-a%eR;c#8R&=xlwXi}&9GDbOxGy~)QJ z<-{{CXd`?}X!R4y+(9(5F%a)064@v=stwxl$hlG6gAeFVJVqNF${ktuxKKr3M-iiP zCn|VBh;U=78aN?C=-1v8@bdxw(NK56sTU;J zkuX;wTLH$;HtxgjTV#lAEwtcXYjSm)h^PwrFAnsG+5p&xtOe6G5y!yw4zT~r3xfxj z!UD#wZt9hN@ANcoFAEoS!g`aPL!6=!V7p%dkJz}-1S{4%yu1E)K5qKUGyt_s$b{N( zC2DH6PzUUmek?9CoIJIiGs3`t&hfo=oCs0-^|?Dr1GQfN#8zKAe54!PIeH9#2l+^; z(nDx3kPNg}&Ao}g=a8jqk#5c)%W}w0+e->#3WFFPOmFSm;lTltG$CP=%6lXzRcUBE z+2LQAKWkByOMQ7O<`er0HOtw!I$i`k{Jng3KNCrz-8#MZiuWPj$0a)cdVd>4=`PZr z&@nvAK`E%ZedI_a1c}FL_s8~He@Nl!)402jTz9$oAMBtCv`r|5|3%)%mXB^}Z#I4# z<&-KunD|wCj)_X<+2;UZ++$Q%Wf2J+{&Y|lWvi_8azb{`wh)P#<%UyY`oR3hVgJg$ zAN!h$q&6~!m(;?ylnJ(m?q-l~&q~7Sgz8MD6Ld_|Lo9%X_@k8FShQ#YRT`ST^>ONY zmBucvI&6y+{r4+nG!dZN3l^JM!5ebR0bC|C4?{>SsGFs^r{UVV7Y|72m>?AaE@Lyx zsEZO#W0dTt!`3x9Ew@t_w;KHzHJ_qe4rEO`6UDdXvr2&NX}skX@S&#-lM0&FYt%m5 z$3&U6AK2H@61=8aMw6s!Xx~f5P0G#5QyW5Y{Hc!}AvbwRvn0^*gvB3c$gCi?;~Wq@ zl<1!s_y8kSKn#0T&awjPhq4qc^}E-?4H%L+Bgyo2C?dLt4vf>a}hLWQRc{NRCjy7yAzZNyRX4 zx*2ujyI%Kk&QT~rQ}Xt~T(0L$!6j9sh9Hl_m1QY;d%IZiQiLx{xj%Y8q%gJJK`5fh9 z7uvU(9|r56`lC-%US7`gI@}JcPRV)W>F)0B?sKaf8qtHX_a&$?92fw=@$p)-*3-wG ztD=)DGbE-vU!WxWrmlNYOo zy{wk{%LqRko{^^fK?(L2KRYCd&)VKE8|pi$#6=oGsCF4RkRJ3w^7e*Lz1f#(oF6d} zGLazSMEVg$XfxP;3kOZN_}JTkiWW2|TWP+AXd9D6i?4B{o`E@wo<5zC&SYT);9$0- zXg}mGsefwr6f^EfOK!IDVQVylKr@FN!`Rxuv4M;hUx=yD?E6YA4i4sLNwnAzhIIb7 z_T8WlrHFm91k{5R+E4gUs42SwXPGYDX%$-FEoUZ)Ua)jdC4Gu-CpS0jkO!8MshwCJ znkP_~LHayQk7<$u7HR9$F0@}QHpy5Q@^hhek*kQYl&mx$iLf=Su052!{OB3-13?%X z?S!g@?!`Xf;R|cnFA}?Yh<`?Hrtt=>%vKK=EC`4gS`0i3=KO#pi zWLpbf!u49f4gV>PB>L-K%%#~P>HxE;G{&rB+dD}$${O!a{v68T^mZtUaalp@g#aE_ z$1<42K1o!L4MI1^@*;sIoF709%sB1lM}=L0&)hECPBReuugtMw&k#0P`y6@u2rrti zDv3`Q2b%d#`on|S13YPNoGn75n((w*p{OTT1U+Nf5xW@wFg2o3ILOwKh-liDAHEz0 zXP^7$BAocD2kv!1D-k0sE^VUkz&LOxRd9f|BO$9i=jmV*3JV{?qAg^$O|T{y^rzN8 zwf92Mx+|xS^#acos$J?+ImIJ}s$Dsl1j?cIrG2l9%-VMAm8Ol__LeNKtg4uG*6=2Z zVz(!S(@KI3-DtKcozsDc?lop%iw#BGE$^s?{~s8=p&aNwwLGgR8B7<`cwO8yEa0MM zeKh%+0!6q4Mp|01iT$5_Bq4@}ti|FXs|J~oOjv5uvf3)U(|DjSHi&0$C=t~sTUlr; z0Sh7c5-xa-Nq*&pALDXAaNNIea^JpJ_0915 zcZ-wmFVfO{%7_%&WYTg&)GPBJW5y3f1B;ZfnxjI4OwUv!A~VaJ7N`?(M7ShY#C3^{ zAf^b1y=I-!bxwDyz*p{Us+Oeq>+c}y_M!i9{R+}M2yyh7@OQlt`|ETA z;%iTPO^^0Zy0n%T>qNyML}EA{ubqTRkVB}l9Mk(4mN zj1y+!**KJ9o1NH(#baOOX{By*=u_LK_GEb5d$Hg;Qbaa|h)I^a{BIbmXR13#l%_YV zTxSGXMY?4CjJ$zSNaeGeB&7J+aA;z+tQuT$*2!DbmmHC6?pu~eic@_WpetSb<>Kfn z7vi!*d8AZo`6o96i7^AJ4K4R&(wds(%wM*Pl6ugH+BX-vkB+wr%E$}k zA!63|bnDh0-UOZ|Ez2?BIz24J8C-g*zLRy`#*4T{;{6EJNq2g8PlW#RF;yDTTtH1c zEK*0r@6eLAj}o0){O(>(K-2iuKIm!#Xs|f5MZcYgD?YyQE(tkhu}k!;&1ONy0}`XP zm%u}RjeU@10fc25lxRE2ULOm|5v%&e&1|#IKJ^R8Ju%80*}i2gmfKKF0uB3+OQ3UI zaU0b;NalkOIHW#lJ9p|Zsc2yB{;Z>khe|RoHWqf^4)-LA`M{bVr;@njf*^LJru84w z8Dcltx2BukPCDeB7%4ZoJmAfE%XDmp>+BI~-{~f+JdV0Ir^;_HpJ!Bo<|^u8eG5fu zg7x(~9@@t{MFY?;PzT3}quBUL#6(jWRaQYifFd@|@|WLYMg2L9GUr^9Ks-DMGJdr3 zY4d{R?tp{zx_(?UCf~@y6^rGw9%}9lT&l@;vI5>2OE4;f)Kn7Oxcz$v-8;u=%lN3} zNVGv~{C*uSM7*V;GN9F8aBC7v!Om@n?etQRxF$0F4< z2$`9C^@5-FR9bb}lDeq4oT~xDUHEeNcV&VA7mIem<1g}c87}Q zpDXd?WQ%OQV@~enb{h150k9sxBfn>j^&+4Dmkpp9)@NE!4!%qrd1c<7M141&X*}Nk z*yx{m42Rl>@TK+bk;lHVo1ILi$Og!YQZqP|uTPLmj*dzCqHB~%VaD&dd4mbb)U-$V zR3iu{Lm}|F3DbElwhgP|TY9=5!hGEFP{u{8NT6hCrOb&krH#63p7c_jtjS59mfWQ&4{|PZYL_h4*Gl`(F3Rk`O>svvSWwC(r_T!b;K((29|nr(H?`i)x;v zfPtqsc2@D2$~fX*bX85N++e_FmC)G)7QpG9V#BA55iuYu&|xtzR8VELeZX|p86hz~ z8PyVj-==NcY3(%IYkxn1n75e3W z&kN^>P^%TR;lN~tnbUC3o8Z^(hM3~m)3Zn#+sQC)uZLeF$c z35Fv1^@ZT4+Z7c|9^>M`J&upM8vL8{tu- z(@Tpi)NGASV9ldS27)rtk{3aP+Ws42>|rFkZYR16$emjjUm>(XgofCYeTTe|P2h5j9jrf;jk2hs`UcyAtbQn;n8FS>@Tcc8AOoMql2vrLbz zO3O7A9PiX#zpfd4or48lpkvA%NTx^Dtl{5Qr?$|Akgs*nnVq>H1a2}RL9dvXr<2RN zp4!Qp)x}N#D5!e$2R<*}mJi!LoxI%YhL4P!dExt!tvJ~&g>Buj3#lY}uFg@feOB0T z;^KqIRFw=S&o9U8_KT6ZXkI-(T3`ubItW>o1^k3W(!V#e*!G}qt&p~ zx)(|X=)$BZru<`8c)6*SU6@m89ITGNd;&xfp;H8h6_}J$N9*9yRT+n~2VKYP{m|_$ z(pjUOzL9N&-ZHE zK^?32X#?uPk7?Cmh_;t^YsYENZ;!I2QlY1f&~u9lOix0`Vm-rWM@S~W?bgqh|Sr}C=Y4urC` zDqMlmX!au|4Rlp;bDP>o7$hYIuWclO$ex&kL0kf4MG0{UdV%;U!*1|-TT{4yAc1gg zX9byX+gzA}ta0Av1bM3APTCm}gv+`BYhMzpf|%HAlynsyIxzyDMOC{5^F*AEOOzES zSr9dmEd-bz%QAq=sg(m9fBl0b7u|q3yfKCCQiggw3OrG5?q6sMYN59mne)*I2kW(JrlYqmQ1ogpw8rl9i3|Liz3Xx=;XGl7U&y`r=GD7(LK zGfT>JU$LoPw-IK&;gk{n# zWzO#L0#`4MG_gYh4iE7}KHUxzOgC|t@C37QL{4+$HNK2dxm)%oN=|fcbAq!@Z?cZ z#Lm{iKB>Zg{#E00Eq+s)uw$9DdQC7~^wCm8E)9^YWgsN=e9s+8c2LF)>&CRbPz+b< z1#bg$BLt-Jml&gNoB>#HUXXzzh5dQ1ELXDP&}1iuvsN) zb*)XNRb0aX%&!9-5)p@p1QvGKR9pF$XpPDDJERMoW01moi)W%;Q2BkB8IXyY~QDx5S6XJr;FJgpF6;SdE@|%Fe1QxeT%)i}OFD z{2q#eZDQ~XIiwA;*wR5fGbtW#eb1Cnk8K0~`pK(Lt1>PE@GZS~1=RH}uvp?63=Xb*m`s#I&L0wv{esSG`OAIHT(5uV0lJTb3Egk*8UslnjGYx*ODdD$?*`=I?+JCLjHDfAM77SJ14E3XZ-xocO zyGk(mH);1+lKKv9=y|h-85ml0m@3}$rUH*r+})SH%Y7~ZFGp=2_z&^!ei6rJR|lU{t<-67jU9h6&W-0ANi>v7w$yn~b&8k{Hz*;0u- zJzTvRSRb3czaUjiWo~;SFR=F5_@}}k$H_PSuK@{c`GUDQg&rW*wiE)H%a0CJuCKUq z;Nz%7vU3_I9LeKy_v71j&nL|H0i5Bg8l2UBWra(xn%eg!>mRRMMZtyx1@nNA1eghN zK3@Abl-V*2O7c$NY#HxH+uUVxe3HkU zvC3Qp3p8d@h`r#!B_sFH+Xl=szXeK}D7Cje&ah4ufy*}Q9c41Nlw*n>6D)6ywXV+Zf$OJ&3{F;$IHN3;YBBz0syDhbGh&5#f&Q|7EdEA{@b* z3kUA_q-me=h%_i@+RnX?j_4n-(2=-oSQpLM(uNKdAdcc8wX9E2A?VAWs>(Wi8v(zs zVJ@AIExtQVP3v-j>z%~-JRk5m6vplJK^N$Qd6)Pk7zl61B9^c~%{OPFnSq3Zazga* zU_(i>Y_T%xsP}wi2!k<_EoE)j3&Rtvm8my>hL!$;$;eUL>bi#6&N^!1_t+0cTDn7o z3(K?;VmyxVqW<)SbVxU{XCpX?1BF5;0Udfd+b&>AN&;EK`k`=IohO&IHAWE#Ta{!R zCNpnfScbJ4<05>N(7qNFq#M&eiHUh7{Om<)8@RyElY<1jPsbAM9X79Zxmq9|&}&!m zZ6(@~n9IMuGcH}`6@dO$WkC{TKm|}C_K7_7=}?d`Oo|tkn~Yais|AM5qc;SuMkMno ztJQ%^=@2a%hZ{S-4t`fP2lV71C$4@;i)l5`#)(%;dN5ZUzzSA|WDhV^cy3q|Jb6$l zm15mQ{`JL!dpB)>kHIg@w zmRX9K(+Znkr@q!cH$9ON)a7r}Hm4-T23T9jC2V)p!_bXVurR&+|p7q&a?9V+6Mis7@s2MxVf&-%0v`xtr=1$+4 zc#pLg>1G;;uHh#JN`+~-7Q4DHqmMfD?6v>1&72Kx=;{oDl%to%y6}>BwpT9_&^M8C zUrf%KB+weWl7$b7Z;_Becg?@3ow7?H^u}4Fst>CDqdd{#5b(!cpr8lIp>Ep}-(aHp1ZIc~Z1wyS0wVwy#dXh--rspv3z^MT$2% zio2)FGtL8Y^v@C+%1V<-ZhXY{@E&Ji*kgFXt~l8H2to-Y|7Dl&<+dd{3aY{Ue`T>R zwH)}e`;+#)-I6f%36{Mg&aggTK&H`N#^4h>=EnD_Av?|hTFMz|GzidytLBFVzXMJh^gn#PH#1PS463WBs!)S)Ceb;h{DhP0_Podp)uwcdRc_=I;F z6_6`CfZuG%Cm<+aV5%mFK&$I>PeR59eMoQV<_>@-)NV>2aKA8prC#8IsrYw``n z3-wB>^+8w0`3Eh)?@S@~;9vTc?>mpnz;AEtS4hy}1WV>PFH?tWsJtkfSN~5LBghCs zLJaBKfjG0|c0s{Z{y->|IXXlPq^HF@D2cgtgA0GQ$1O8p{8NgY0VG30@k%iiE`=QC zt{EsCaF?oy2La=Q2mhdHqp~rYlz00=aF%OZpfBMO(=Yn9Rl&^~);9$n7)dP>R7sZS zw>J}&Mv>vxw2BIRG|@$6HF*$sC3s9BA1tQio+-~1HL3Y#d>swd0AjX`GZ41f-ahFI z3m%ap_#nP8YTM}&uNvl!I6G*L!=nUGGvzXduEeh8x*9w44RqO~^N2E}>L4v5*_z}` z?g-l;emJfQaN8Ge^OdIY1NA@m{=TbmM*%8KV8ektXWJw_ZE11vRzNS%W1aT$`i*) zOOSC9LD*?iPsF%B-1fTSFhpZ4JUAN0qhhSNlMAt9V}OyVTo!2f>a z#VME-Ev1l|ABy{Y%eO;^p#nBRB^lL<8SiQPQ({`$h2uH%AwM3TRRC+H4s3|&5FxJ< z(9R(B7+%L{B1v);gbe8kJ`yx2-5Mb99ABL`j)k5f`6f_rb(!v3a+YeUVUVFkKbefl?^l%Os~evEjF8yu8+YCyLc zSO5s3G}U%B&KNLMYxnr-5zxM#qwXt!{jzXv6ho6PVn+XPM=m#mXlSj0o~awCK3^=3 ze|X&n!J(HRAbh^l66>YE2VOug3iU_^z|WMzwkEgD-R_!vS&;Y`s3@Rc|j5Gc7AN1mD~j;8NQuJN9Wf0 z^FxsO455!8coP8s7ZK^Q9(e{6iys9oW$K03v1FtUyiXX>L_f(_;T2CH-uQDdl979_ z4Ui4lSxy(*H|=5+3cj+~;t+jI78g*xBzow-^orD^=l|;aGoWLM2``EJY+ADV*OGfh zur^H9nLdkApNL`DxSQ6PK6Q0+cMT+z&@FSDAMp7}I+jHYn$u0d9;bY9XQT_p=&2f0 z=O|P(=_{)m>JXx37U-g$)UrIU*`7(tcvmq!s7lx78Ats2VdBku5PY$nR&2x8+wr#w z{;3@GO^4zu^nkY1ZTKelT6g7J9}aLi{bG0DzBl2Sn)erJztU4sO-i&Hd0ZFYULvg@ zb@hS2Be^E$q+r1MVu9cK3p{jlVhs`4=FEV=l(rdAarbbKzZyD)Ti$2foVNPw zu8g?kUTO^T*iPRbNI~zK&EKE2rz5l8!+o)10HmRt?=r^DIdDR-8^dWXT~48kz+2Zy zAHhK|koRp-YO>FeGUVxzfzLMiV)ZYVjO$&vHfrEkUNZmO82bR-!21@?=YT*Uy1WQdtF z;XXLzlv09VdSyczm4I0h$HF(esl7|N1+v7#Q6W9R%r1^kpcki?WsZ%3)`={X48NJ~^6m+f=EZDuri) zJt--XV>Qifj`QlZz3DT_==4Hr^wgAab~)qUs!I{`m>Awdo1!9;mcmSi&+Y!URaF=zMEW&wvR~}qQAaN~c>h8u_3wxk;fW5L+6x~+ z*{$>4_mt}VC|nd7aN?fPHUl%CP13tMnMk0faj-hzn-z=0 zaw9awL~%2w*ky^y1717v{9Jkjcs(vE$HX7^39Fl`Ay=YKTREVko7)+X)lnGn8w_!+ zDfI(MTb(vWO;kWX*X|o7YD_+RdZ7I!kPAAPP8Fk;9_XV|pI48r{A8q4DVN9P*62wR z1HOXp&$V1e5EW#Np!TXbq8CKhBp&K#H(PaAHi}1eHfF)V*{9F_x@gTc%on1(ff;^! z2EEA$Lp>&hfzijqj~4Bk%#KP36(9iBH57*L$R!Uu`#E^}z((T-R4U%EM!51Wgvh1A zyJ~w)c_gn{uXBPFIixh@V5gpGSlMQ@R_r^4scf?xV{ zWcy)t8o3LE@YYixPSCQW!A!*+lWk6M18s&!bDC6B2boy79IM}+o`ldzIWr@=Y!QPq zwECW{8Km59{v#Zw(cOhG=>BZVCxv35w9A|h2X`V})X7M;Q;5t9yCP!A5EO|$%$t3M z0T7~U~0eg0nq7JiO5kUtB~a5k>s?8lqz ziq_8%{I>Kk@oamq|GM<0zL*0i5p4xS3s#VM&!Kz`KfJ>PPV88BkJb~jGsurraxF3- zpgOmr%2FF909@!gG=%WzM!@U$+gBEMVAvls^Q)4?k?!^Z;*tDUbWTPKil4_WlANey z_w8HCi55%eu>XTpVNxtcN9&+0j@Gpm<^qpROA1D$<&OT5JV#KcU` z*N>%ojI?T<-_u({4zhus-t^$fBKm2Peg{K>aqb;hE6Kt!R`e5ML;7Q=I?30u9Z(-y^M+|NZu|~I$#M{V%e2#jRiR*NyFd(rlN8RMp7xuLhP5G zPRziOr@idx(-R5J{?JD(b3Ej9_$zHS))C@+eD<2Pya$TTh-g5qV-k%R>)>xu{k&OK zN}{lkPo)QSRi&PS(y4kiO9+$Y z+u9ow!k*Q}BKYttim!rmes~O#-ko;Ogl3z-mIw6C%B9|(EWe2NJ;pj$<$GT2fmO6S z`Tg$T8-=V!5UtI^GK5~;xK%C>xy~9_AXDQ@g}6tg=Ec<3Hf^*LT5^a_9Bx^2aSAA?-(i>iU*@ose>oo9Lr0F{U~}H zgAi&BEw+X3=4(w!Lv(*Bn-7PwdBpYJqTWzGC`qh(_Pk4^77w=%?{N``E#p&zzZ6># z17qUBu;azIh&x>5{{OwFH{|$)ceJX#%1w9oRsh)km&0=opGehemEU7POt{bt&M(rD z^3zg?V<*Rf7gRt^WR~LEWU-$sB+`JFoH*Bs)2LGGcCJE%fpw)?=ACGEnu|b)&sgpT z8HdKI#&Fb1^aha^I6FClLvVt_3!z1_H$O8$EgAijcCYG&oLx8zQ%f7c5f|CAA~;uZ z+a?2D><&=nuBC9+>%p^@f&o8HwFSkC(ODx)E=~d(+=|6uQydqa_UpGKV60<1~!lz%Pv4tD}SWOL^yJztxL7rAbct# z%Jrj=;*ELqHPCTIaiGY%!YPx)M9ZYD5fv_MOW+(>jlqN$rK1SoVx`EO z%ZvBefCnmZss+DN_sI)vMe^Lzrv6ed=&8(5rG!tc9Fs`%%AQngszi3J8bK|R?hIvd z2Fc(Agbr;~#icf!MYhHvV>Jj)kNQ)Vw+dwS=bq_Kw~Fhp{|hkm5BC^*rs{5CXWSmzX5s?B zYxo}%epGZh+HKIhI3ebj)N~O6P5Qh5G{}xG4{(0)qvu#QZwy$i9Alx zFWkufW@~Thmp$laCHLqizXsJl>w|9$@IJU?RkuMbG4N2#Qzep zH)|fEWpwR`mBR6N4m2e4E2s#2wYNpv$Jg?&PW{tU>#Cms15xLVe_HO}LJR*u*76a! z%ICW&3aWv2nj}a&DBKQju$$UL>Z=Dvo@Mdt``H+(aiBjw;9ABWuViNM3|enp7hjpO zLtZHqWc5l-7J)=pHT`?Dio4z}?52)BdB=O$+gs-WNhFBw-UaolvIel!b{Tz;t~vzq z&_`mQ-Lc-_>g9jXH;>WXn~`Wg9LQt6SS0dau!$xH(VKLu9lCX-SMj9E?Zr9u$F9}f z$Y6X}#e|4c4v{;*(z6aFsfBb{ zwP(Ny7%vDFwj}x(bHHO8t^{nxq%3%1MBvP(-Au}{gl*C`rdi~9xnNj-((S2bW@(oL ze-c|1z-4{bn)fBb^(Q9~KI0sI>+tX!%>|-U^SH;?Y-px05<*cB4eH`0oB&*J1zn?ex%J6w*Q(h6keu=XJN+Ce%KuK0E0a-vQ;3AnW{2P zcbSrvolw-Kby41sOiQDTER<-feH>7!n1NDSan7j2iV()ds0>LgY8h1ih8)zAPTc4Q z`tlIMpg(~l;&q2kZ=cx0OWL99Shz8cBz31V#FA}e@~H)Y!a(5?!xp$tg0*WfCTy2K zI8Fe0gOS1tXLOeQXq$`J{lFTF&A_1QmW5ih3=2JD0ic2z4Fmgi>U|*NuBol3!7jsu zj(>ouwCNjt>b#%M^@*d-U8vF&(CMDEE>EpQ>VBDaMHzFIwAl*gB-t2A05)H_ zp4lTeWHOY?G_#e6ZW&}U@UUYXzWb;QL@&Jy7=<=Sd_bCzQFI5W2OHSc6Hn$Pw0V7u zobB{n=-*agGuRC-(`R|X+wp*Hb*F-;c-vg_i$ORF{F4_Y{d}Xuz?@W}l1&)So;;4o z-*G|cMoXV%#)e5f4oyXLDxh0z#Cw)Ie@PX@G~?wwXv7{C^j1txd712*@ILm`a;NKL z$tUHh$X?pX^T*tKqG1_{{9P-Civ>}G@j!TT8@8_04sIWkgPcTE6A2apX$F7M|F-h`GE~mjF=EydO`jRo_U3w=l0FOXw8Jfbo7cL6D)>66b zxDEqCW#$Ww?dq2ED7_CjOT$W~kfGeM@Z}h(+Qs}9CI<*BI{pAf!Q91tLV1N*eI&)e z&}J=GBKXK-*FdBldv8iQiZ}d3+)Kwf)e~t)LJt8|+m;eq1ySRb4fxZdyj)Zw7WIa0 zFG&J&G)8B|c@+HY&W>r1G5|Xt z+&L}g8^x#J1$8{;jR0sS52tS&nn>-)ogB~e2tE8q)XLcU#k$_wQKFY%7sL2DgIB3n zb4ejp3THbK%WMp8rp1hE?^zzZT~zW-pqK`IH$nckL{ljcB|%UId%a;EhQlhdh!u(y zNI2&@dSP#jr4vnzRw!wpa(^U34LB~w+uXrf!av{ke!0fRbI;M_a!gsoOu;cQv`EG} zWh)s{J?cs86+3$zy;6+yI;?h7;XKEaZBnk8W8bhYTM*+~xfB;q9;1ym7#@#A;{hkx z&KA$&1oQO@CXqv{PJ#t!%zNz05mT1SwcgEI@UlsqfvN+`D=doPwm%kjy=n@EOUWWr zfwbVMxg%FZ;gaC&M&XUG_Nf{*lo6RHWViGL3aR_>jTkl<_I{FND+bOslqY8bZw~Q@-^J&58DnwR;jI+40LXHbUNu&H zH7%EvJ{mOk`@b^BFrfNIZ4%yBK=|9?0z$5RM728W5QMdl>Y2uIK>oG3v@Y|hllcEk zkl;-E;F!c8fxceFWm|MJx#38^;;2YW zz>!aQvkZ)ejQ}7sLhV|e=Bo(B zY-YDfoDTq&y&&jp6w@Q$vH{s8k<;h|Rhf=aQXs|mt)O*r#|tqv7xMANLy2L# za;Zc+fkS@L<9n$WKO9BDL!#?BNytw@E?l`m?NOLm^o6^y^D(OZ?M;bSprx(>7~L5%P}HH7AmdDuPeH6L-wkyw1Lp+L<3 zEcXo~pJEh{fyYK~1~D+!6Hby~%4D;V&C4{B(naoltww3pR>6t%2^x(_REhhZs4vqP zl;wj`D_-DIy4dhlKtMdejj;}JHe>#d4`{)54#+(`yHdBR2{IyWLiLtOhH=gY z;B`>zrtBgnu47dNIT3P*0K$f3HC0<)t!xIw0>4M($L(JWRHls$LJnw)!74ncw2(g= z)(+k6bKfB}b$ldcP|~A)Ed0&w#;5Uy8eWdj*H|Z^YU2+NCo?*;WT+bG_od`7r_m;Z zuzbFtktaE2Uz~RBWVWt1NvoJrA7t9wLlyHukgF99LjtvaTQw`Hyu>c?Vp)BjqLR_r zkfa53`2vQ{{~nx7b$||^Y|IL7=eXlVE??c1F3I{;hJk!6xeXnh!O)UJ^21+Xuuc&N z(E?Td2L8DLWx@qLQRK$I(DVdKv_3A`ce%!n7@9y}LeA|Z1O_N%bz5>)Z~N7XY+~ni zkOT_MwZy#E`(HUZh&T1I1>>21xXLJxlsr)<5yWMY+OypZx7AYQ5ZMo{5!*~4pI`49 z17(LhA-+>eThAN=A}!~DS?^=HiC$yx=^d?m%tS%&_SZHL3dGt;!qz}HJW=8#%9HR} zw#fSoL*AjZ&b)BsYmspK>>vbWB9d8|NfKHls}+|QFH*NmSGg5%YtNn^s=Cp#z1sKi zOv6I?g$c95nIA^ILtS@qlNk831y8iUvAaxM_P6kry2Lx#+Al8-1j+Uzt4rIHQ#&yZ zg@*U$3TJtq!0d{O&+fz5ev9$@3E8{T^{i^KDFnNKQY>+-E^7ktDu5n2dC4&^drx^x zC`r<(P%}Q)c>@gKR8U)3=4E0CuNn19#tADw$uKN1cZ2_aS@Xb6OmJaGnrB0E;?LPS0K6BRRa#;rUK}`Q94`2NEYUxu!+ipE?FnD-;j~b5V=cU?fR+ z?q@GU{lLXgWp%`t_i13%PK+^LEPgpHzp}}^ zadi`YbE@De?-G61r(SlQ0URfn^?x9T8Y-g|6vYi2fV+BgYft*RmJ~g@rg-rT&ZsSp z4xQ2XI!fnqGK0TS_{>{Z3HBaQn*kKMF^b_6_F#u;DTD$lFSwI!<=E|FfdY22{h{|G z6hyxLeAv_#4NHwd*kXV2CXvmwfVnn;l7uS_%tdQOxz3auDw}C zgO~4BED{b_)THcu05w-$saO6|780XLLvsF}s@*`}Q^If4$hVuOBP7Sf*4z0bbSfPs zUa)IbN1;vM<28N8f)j)-*f7k8oSXExx%^n6!>2$v^7GS6M3nnIRZUH(WCdUI#UgE; zpVk4ocKYe7&^O7=v~7+r;xu0}H_vs%c94iWov6muXFej1fDhO6I``aQ?p@SXqmk-t zV0QDz0Q3u7cwf|V=~>D>Fm47`qS7>3ZvOF2-ktHoYg}w%V;5ZYWzPYot^z*~FyiUZ z@>M8x2Aq?GKq{*JeV5cX0LR7x7bHxRQr4r-Qj~0usKS~6A5Fd=bkhL%xAo(`(jQG_J)E18ys)UMxn zSdsLtb&$^g-C7+o06##$zayEVDfW}>>Rx#@RQ)(E5QsdH@GZ+N(#WUPcFi`wtO zo|NzFSooFf4wN?ycFrMahTCB>s15rH8ibKfdAr)N9EsfO=v+zAtwX_%{C;kY1OP5p zyt{w6N|?zhW!T-;&aqju+mhl0RZI!6Bf3X%z337--pC&N&~w;kwf5!J!imdQ)N7&g zY&W3rBO++o#wTfHjvRXw{n8*-@D)fdJ5oi0X-WxLCV6LbwSI?lRkhl~?d~vb+i`&i z0Q-(g3RVJi@N#x%s_~3fVe$p>Lx)E-XgDuBDCE?^ zAZrt%^HX9mmC5nhG0rX@|9oaBl@q*BW8eZz|BrkB_(?}v4OaO80`ke-P#d09HAQ}` zd4M@fGyMdg}u=uZ@GU2Ghw=y@1gM$&FrHM2qh2 zFr1aR|7!P^dOR94oVnBh0U6fOL-c8iefvauZ76)8>Ak*vPh);*Rp?Ac74Z=G*A+17 zOH>Pacq0GAZjh@;&GcXsZ+G)>pYf=^_Z^WU8})BNLG}f44J8S~&kbvcn3qaK>~U!H zr{xtu6YGti&2aYDj_ni??q13u)^;2^6-<>&ky-nRx)Xc+t0n%3{ly=4IRR>pTX&(1 zdWYtcw)lYKJ$?_wf`cUhNl=E7RM^Spwi1=%Qep>&<0aW@#p-l4w4XH zq5~!@9H_8#YwQ5&j1F!PBgDjN{KR$q;7eE&yvtf?K^TJYy02<#RT6k?vyT_sg_r28 zJw);6i^(Ay3gD{j*a&=YsS?p@_mBH!$|rQozFQySX(0D#q`lO~<8VZbAgRM0@MC@= z@@vOwLhyN-u@q=@nRF zskFj=la>QIQZ5}ymfsFs^!kl}fo9`iX#`;d{4tr6hV4=55M-9U%^CE#I%Wcx(XXzo zPMfCFD2ilId1e$GCvZGNWbTfz-ihh5M#X^_;GpR8M=npA8abpf!`#av@uglsnygz~ z@2h@O;|-Ln7>INqa6*;Yb&g|qN?^&J+5Z_do6eec`z(kO6yP~!${YLF@yt)K*wD_v z8$z7a3fT#J;_O+9(W8kC?&Z3jmBq=RGdPPshEn>pyRRq3zggahV14+XH--FH)pdb< zFu<>t!1l=)MOj8NOcxYt-^tWtk-%Rc(a`D~0Ee$($wOgfzN_Il=wU+xEpH+iwXQVd zsst@r%r!^4x&_`D{Nls!Fz?DU|GIJF4~c&i>Bd;0+x;ehojj8dwFy!h>tx&dD#V3W z+=3P-cU%t0IjLpB#`ogZ)E0oq@DwaPF1RE~{@-qZN;8Vd8K;}_MvOTrO6ArG&ckO? zVltUQxg`~&waDy+BoB0*7Sn`zZ4F*Huv(X%D}!vPnF7Bz+|!k3yz26n&-Q-0BCJ>9 z0&^z^TmqSA^`~q-uOJWV2)SsiZ0#>+6vf2)O^T(!a2_XJw+F8}O)vih9^!x(o< zVy~Db(XDDqfdJSU5@yUs#)cqA ztOHIh5kN@=D-mg)EWhqpeRQAI3{Y&TTvh^_OW6EQ?;rum8_piqs2HJd>Cak zJaMGuoBdNvcA>S=458ijI*Hs@{QuAMTZ$(IJ%iy~tmM2E-!w~~N8c8$U*gmz9Gk}usbTE{_*)lY%>TZn#7 z(?9(&QMN`tsy;3h^OKFLPQFx!z;r-epQ!;7D9+I3DrkRoy!~I|t0Jv~C@S)%f0nbj z1lbe~4sJiR&Yk}ght(-U2*%;3C>qvjFvJVzn*!2aA`!%C#p6~e{$y#)%7z-*ZcUJv zybD8d&Joqc3iAtu61Ku$V{30}L?!Y#OJKSRh~86s@HDjv@+5(5K9<~zvc2{amPpnz zjJ8*X6)m{tMW_X`Z0yky&-g^hVLbbCr`MCkLH|L%Gl0+raXM|ZsAhAPO^LcPB9 zdhG7MEYyVyU3xU_$irE#sDbU^jOLw9kSc1*cl?>JyZPY6<+Z+}kVnXhf4wo77&4*= z-ZhP#5bq%%6^@UYXJ-QXO42C5@+0*Am?C~i>N|+>4Q)ZEMO@}L$}${a0=009W>XSu z0$Ms4HC|o$y&EWoPU;jAAS03=p8>3rS;EnW*K^J)SlaRVEnou&sC5)}FXRSoL;B$< zQlzXaA|@$E5t56YoGE;98c936qX3TjvJ@L`7;-n#yBIN_iF--24Fzh+=ehvQ*+}7! z^e5cb>ZD>MkkIbvs}AmGv$l(z4Pk|4N!5_@Hpm3Z?;iaWgItGWOCNL%T!Uh6bkh(p zH?)n3!*E!!0uB4SSSY8stA?>-Uo0-}(%0wK(|g^l=}rd+Ud+hg{sS}jLD%P-SE{0I z%X|L55ll#fsefy~JCX0Xr$GBjLoEmCWQo+j*+yj@zK+7K*B-T`BwwdAz$W#k=G=57 z+alMmq_Q`W1N&!Z?$^MMD4WMsV+s;L&wn~0roCtP0;ls3qXmLl&=Wg1`XdR=v#Try zrb8^BJf?*Q*H13ISf(V~lgP>y#kuD8uN^uMW$wc!zaviN_6jV>a2Zm+>YMGtsf9dn zWSoc0Zw1Rx?k27g7Sv85T{)u9;k%S6dgj%W>X$qF=a3OY-n>i8kRV#BU~7kGIaQzm z%2>f;FtKxX)OVRQ2pHSIA7rK3qIo=1!0cUtO}4qh^%w|OrYKH-oBd%&7{9{Ai#?3( zW&?B#JOu`)o3Wx#l1ooeE48JDu|z}cXu4p8MyK+S-9+IB2G#%A8~CFS-E&xikiUa+YatW92!a?SeRRP7#@I^AlZ zsBbfBq!5Wt6m(@reI8E9A-x^?MeAr6(cMr6Q;?}yj7?U zj`L~lfpRz-RBLBKFJq#DyV#=vC0H^y2$-aY-n6;&1 zGYNTj!&(WLNKb-nI6r_C%%#BJJ$G!mto_%h)9vuT3J~>I{H!9RNNrY5jLx{d1Ex+o zEMDL4tlWg^Og7>vIaN#KVauBHVsH|OG#tkmoqcw%L}9Vu6)= zrg?TijI^U9Z}o-inZiT!WY)#mWTHuA@y-l)Rl{cjvwyv%>NQKs2EMo$X$UXTKQ~Lg1 ziH81t_!w~H0-nVs0;c3=-GwDz?dQ$eO+C3i1>3~U3OKI&n;dZ&HB3t8{J>m{QThfI z*zYx@%FckP>SJ_EKbu180aB^Ko+afWY{-b9{oLTfuSW93ABEr~(TNVmQ#us3xJrh^ zXIGoJ{81X)O-Uz0bv7IVH72EB4Y~~)nQotkd+4CnbLpBdcc>G&?@`V}AV2YgF?}}c ztY9kGr4~I`_=2u zw#hEGv7xg%wBJ)pec>95M18CWYseU5&w0yg&+({J!r!k8iE1g^&PvQ6`A^fS6(Eq0 zLLfk;v1pxipt6%}r!X+Rcy;;(%6DcYkw1-2Z8V<6{h=o(3`ce?0QcQYGdhm9b;M|V zH0M9YG!T8a;E5ZT8m;tbuj<3AR)aIuo-BVcNlwfx5exwW_uR$EYBkUJ>U2%Da)?`@ouAt{cz%9&rr$T&B9spJVKn1n6?Y!VlAm zPSQQjI6*04GL~MZ_Yd03H#f+#wpJiO2XjvLzEwpaj-~cg{_Ee<+k?W%Rx;Zyvu_ue zjO>mxroSiL(=z35nFptT0~E6fxi9kTgd$nb_x*3>Xm0dj-$VOHW{x9braqZO&k2w8ls~}|o25vsDB(T)oC`W)x zV}strjn`PBsLq@o_11!QxX6s*R@JT1v5*Ay$~jm+Y|o=uGDvOzWkF`LIfh0MA8 z*eyg}6;XA{QJ$pr9%f~TZ$z2cWuTbg0E-N0}sW!U0vHTB5`pa0{YnV%-JKR?qic~(DVRERO*UaC9- ze#tBI+c>5lenIpNp%Z2uuVd^@cNKkAM*m%^HOnLTnfHI);tm|?xJ?Y+F}SHq#@JFc zqs3(dqRCv&GSdE-<;*8iHBM|lwR2`Cp1&kPx-0QUbv*k~LB&mUA+my~)#JbFy%Cqy z4MqRi`aD*Vn0CAN2()G9U`c61(`(|CRKXB6p1MkSi2JanA6Kzm>GI=ImlSEEOotk2#;`wy^euW2oQRU-sxIs$K^isZa%0>L0ZcW+a;i-ZM7LncoTB$4 zUq8|ZV*T$$uWnc&b$2h^CJnz$t%9V}H!QEAIFmQsYf^s>d!D^|26??W-ovo3P1q=* zph2;_X!p-^gW6iuy!5Uu74rw{;~dPS z`Vi!%UdAGBJSvqfyP;M=vs)RU2j0j=SS8^WRK)aidCUT;2r6(@(qcxREZ5eBqc+^9 zYFkXJ4w<7_WS9m(Qghx-+ys#h6QaF%TyfYe7f+g0Uk3*%wmrNx7yjJD2@Z$6OuJH3 zy!S80mQjl3P`aLv8MB>KiHN}X(G$v(G!LL!8IBGR0eZ^BdBgnZb8{YLRi~f#>sy;SJi)ICSq$HB> zKeMK7*5o~O8L9eeN{rolqd)C6IVeSn>N@G2cfh7crFc~^U1_rp zwic8=$KG>oW7PwWp5=!-uAh7 z164$eW?79Zl^z5uq8-_9oFZ3Lq1P^}5J!a+L`+%T8cdaaW;EI(?&N@HhnQ89>8M9{cVqmJHD{-3@IR zl>z&iCBO$+HjS;kkQFKvBp=(bLl>!q8FARH$~}E|L}}knE0cL$9(f)J269m{LGjQ? zB6L#4X@2y$k`-}6t3*J9i8LL>_}Y3rOpizf_3!W>{*o#Jt1g`717I5$4Cr9J45{_J zDS4`Vk~+>$2xQl@OEEIi{T=5Q5+4( zOrn|fy~i)d33*-f$X4$2tr(H@7mz%~ zo^pin-7w7M9mNBYuP5J6X@~@`omw#5Z$uV{zVk=H7+ZRXCO?*@yQ>1)u#vOz??k^> z>qxO}x`OmLV;cxAZ~#K+>;Tb~FSSZC*N8+QMR)hH{GKm!4@h@b5o3;JFK(xQKEhu^ zl*oX}G$b*^W&e7g?NRuy+c)z@AnbFR87yda?Yj}SNwX)}a2e@#u~PgX3jaCN0F~2p zb`T0gpYXUG(PUg%hBAlEGGw1DD)9WD80{D`0`zMPddpY(snSWa86G|F5ZAw?(C zTiw^u;|~(>Lwju4^nmXVH!SauX{j){qFH0@(8faOnO6+{7XQ$)w|g|#gz1`-B8RUR z&c%x#?bmc1cz+#qSGT8!03k6HCfZ{3R~CYFtO#ohvEPCIA9d zR?N>i(b!ev|4xj=1Og8{faP-Y((@MIy(#dD%Ua*RF;G5b-rvhdu^@;(<%o5>wdlV^ zl^iTR_w6{4rFG)Fa=Wv3p3{Fe&Bevm@!*gh&BO6Yi1t0Sb{?Sc5??c2EpCK}h8a0G zAE4~>zUs`1%g5$;Y2t*l#f~6N+{;&T@%DSyGd>Cp^nKRMi$P7Fw4=>}OO}VM%6L%f zC5sQPaMs^mJqtOB%0+$!pC&WuNs4}o zWO3+cvL1O-)W@|_;>-$R9%`b28o8u~g2N zsE~|!jK+8iv#~f-@XdlR=?M-q%`D2RMkbR%4OWE*FZ3=CW!4L;%;pu6?3!`;^>E;z zwCX=#nRJfpJD;a1l>lZzNBIg@T}BC-(2gA$&xv~v23}agd;31JqhK5g6?UH756ooq zJ+(dGZGmB5>eF$6yVM5Wyr}$g^+%x50pDx|YvE?Ek4l9|? zph<|(NRFqB6{BGJ>nK3v$l?&78Rw#QPdTr^!G5-7j(NSPY-2p^4a4UM|LZSt_?XED ziJEmI<#}F27*nmb#ORS zuoT7xs3s7Ogijf36&~9iZwcf{n-v6%U@WX`Q7sdHUui}kZu2fw#bhSf#aQ;s=wD?3 z*09T=z&$J|p=r|Y5xvN&1H%noMG>aC_2?*HJ_>Zxhtf@q`NvjkIw?u`<4e#>O-t29 z#%WdSTSzK|(TMeaCoVVTdzZP+n@9H!MCglTcze_Q*iL!|HR)OYO~;VQOe(vu_JJ9x z!!B*3j`$0;tWLZy$#`7u%(h{_qzW#}eLq!zoH4|?H&zDPvBUv$M96b2w?a5gT38((@wm55p4 zhz=wUjYmjFycGq`id*!zuotS2uQ1S(8A6lEx+SUhIfRHvZqfz=uVW%;_syOQ6+I#J zQ4_+E{_PYu57BQ-kdzVbe9oyL6(5r1$6dFT$}I(&hy8t&zb-F&{NVh< zhIu$ygG(FFnEmURT80hcRxPP4DDQ!j)gd{b4D>QmQO;-9;&RhBPMMIALo+)uEOeGz zoHvu9%x{Z4(bcBP^bSNJuZ#2{QJDMwFTaqi%44;ssXaN}H8t zE=T1IQ$K&2ZX3pD;Ocl++o5$}!!-v`iTUnLFX29O)B3>88rF*!;9PjIK^J`9A@puf zoEX3=LH-tQ;v`9gYrP`LT2@MfGB!N_bM8C5nECJ+y%Fmvt=0(lol_cSd46NDX~YwN zf^h;%+679`+c}>+j-Ui(OT^KS3cyGy#gnBgELAaiycK?2Zbwk;zJLSDA9RQ)b?s(Y-DUTp)R z<)9GQpn1GOAJcd0sk%OWWQa~_-`&}>VZMxHl#y^V$m7-ZrUm~~ZGk;h`lXy0K(OCw zfe`nUmKt2j6RL=2uOf~m5Nr9+!JLyXOoaEwnc4UoDHXS@sLAMN(>^b8YLxnr-l6hf z)e_NHhj2*iI(6;G|2F~)LG5h$T%+NR7LY3Zce>Kbj^u2LOWM-P3d1nk5}VRG3fSns zS(cjXbZPFkP9)&zf0F}Gt>I!+VL#gucFsNOsAg-5C;XdzZclO?l=et*=g9lzA>AL6 z6(xVCPT#X{x7l>GG`bUw+}w{!t}mqtCgrXrVR6`!2!fbfd1a+SCXynkAO)=_fX}Ib z-~8d*za*v`@hKWf?hWxD21r6J2|E6X4DMK?`NJ(+wzKY8N{-PXKf`1vy4~u5INRoR zbnP1KUn6DMYjN}7Dw-ZLI@*cC<1R{!v>=nrJ4ljj8RG(PDZ3(I;By5o013@tgk(=mSnrDBUisD5n=;`)%g)C4TMd&okSBiHl4Wm#< zdj>WD+Q<{nm--7&SZLzy$Oh*M1N2+yuU%%DQ%a+TrEW5&)ugqwwR!H28Am>O|BU0* zk4R!)kDd;YPnqBw^$Nf_?3!f6>Az9DZi)m2ETcM?i~gP{4RoAy8#C80b=bu|p)H;> zQHVA5IXc7={-XmVdqMJ%lkoy*!@$^(pOp=EV~9UVet>8Chl0+CD7dt1E|Jgv@`@$hv+2qw>tl_!PQLGHH^6!uvnj#!~+URS2kuoOJC zFc!&4n?KxQ82V6UhRlQQ8VD}eR0i?UCM`7vG(+3rIp#*^&(@TiXq@P?Odd4iPMzI* z8q9*wxVUwf7Iuisdm6rM@!&zlYen-$%z0bX(9g}R1R^4_hSWzk`%Kwb^{yXYqIEK; zMMQ}%7bM~oW-%L)FooP&x}ngA!SUZAcQNWPVclOdXFiiOye zno79l0fUuBYR&y1ZpV(*VOzXidpV}_j-&g$NV|Dm^4NblD!#{y!z#oF6}K=J)Me5f zHhu}`qfIPY0UvrnDXd{)OAc$61AuYCD7CW}cnVqeZthX&0+vy#xgNpZ@5-cm7J^uV zt#6PU6VyElxt^Jh3ppjdx_Ggn8ZgWWa#83%$4`|{SF=nlzQ!BpV0^!@ zD$8KY;h*u5SSUggrhd2UQ@26ViJ7T`5z40^Ac8+)d;02}Py3#?jzjzn*|4xW z6gDfG8Pmu(L?>j=ZRvrd#qfE=wLienrI8Cg(Scu)9Sln=_lq=stc4 zB~gMDRRKS-`(Sh4DZ(8hg?-sPWD$HlgKcVdyZ=C{S{90;Uq+G&XHF9=NchGp5}&Mh z)%JjRAPSLR0I2_BkgD+vf8urGzzlvo7tGu*O|@|=t1F^w{~MR+cwCG0LWigLHF38DzmqvRmAI1bNp zYCU{@HLI}TLw-`iDf^o+dvZ$?r#f&zZsk9XXl#}{q_!Gi-k0bqElo+%R2+nJzAClA zs~ucOw>rP`DtRE!cE>hy1XN)sBm0pM1zxhe(p*8ZE!a)RzeTb7hs7(Jv>_FTsvTo^ zB{U0T@%@?UKFiNmy`a_T3Jmg) z8|=!-bEZVDO@4H_g5xC})%3P#OEmjZj+aez0s;N_k%oy)m-J0>BGy2z&HsdU;S3Z> zsi`RZ(Y1xI83JKnJG0B)zU@n(0Z?M)g1+$u#n}C5mf=iRMsD@R9YfnsaGwUms5Xx{ z_$MQfgNxF5QwV8B`H*BAJA9UpCZ64) z$}+?=_t7_tA+S3qrAJ43?TE$OmrF!N-EfS5G%yo|8 zzN6hRCsBh`^Hv)-5Vuf?k3%boO+bF(xx>uC*T$;L4g6FOKD@wM>tv&3V};{tZ!|w(qq47f?@Lj zu)0YDK6xH+hvT@7&v(9BxF=Om95@j2@su|EM@V~_^=eR(yncr?QWR(@9tsHGau!Z` zF!2km*wxja?5qtWPSE)kjl1~2+Ow)lCaG8(3*{4FdR1$oqw4g>Qs&ir>05o_P?b!J zTw&CU_gI#gh+B$ZzNE#hvITqxHsp&%u>&+n&XqYkr{$|u6yJa(z7ZVKEd4TV#(_8| zy}Ko9$0B%m$DN+opA9%0d-hK;06qN7PF_}*3F>Z?Vf20}fy;@v@|(1E*iz1QHHWF@ ziclcoRjIQU?#`fjDp?-COv?RUPEa+I{o5XkT4L|@^U03lpO%4fG+&}tpiP*s8kpGB zIi?*Z&W9#)WiF$~wShdfi}f}iruh+zPO*bMZTlLN-ABBjP^Qxx1{SfA#BK#fddstz zJ;U;Ij4_iA6<;Q4dz`T6LzBp)&*uPVucrA^TFw}-r-Hx^&T=BfjHuHFSCL|S=VpTD z=&u4Lk$)a;#P(U8n~DPX55FnKdw@yd+18={Gw8eh?jd5CkmDV7rcyAHtq9kXO)dp^ zr`nrrwDnraK~l#3Zf75s~UYLQ>d7#|K1j<(--RTD zC!u$&743xWk1<4)d&faXI_Z%ziFoA7{A%>-cFP;Eny@UdH;~_vBA{Sd_^2-5B8blK z6_XlbBXM-^e2|dA7$1{I>vxU^jR=UU#4;?AR>#dwrPe$-0Qss+N}+0Z_-GqUo~fe` zcXxqPVRIHOP!%=(XkuDHIP*#Y2t^27<{C<%$ST&eVc<4RUzr+?CJR6TUS5G_ZSE!% z{&Ee{LBHR%J33p28J8*5BB)C1%XhW)kn#{Noc5}sq~7d8F**$#lkM*InP{3OhU(yl zU|t%!I-AW^&ZwCb=txxjnmXQ>MKFPG8}!o;PajP&lO{El7u8V4g8O9so(gxzsC!)) z((5prIWX{zu4EaULt?nbo7>*EksUHJ$H2CpaZ)i9`rC+7)n?EXsH*>ae@dDv1ndh0 zrsB3fi3Fo_6A3PGA^ydk|0H0cP_DV6-qvADlwZq>l~C4+u7HBNzsKM$603?l*D0f2 zInI!B<9)3^EZi8Bdhi!*=ZM!O5JI!!2m~n%d%QdQ7{=~nJU5TYkt8I_7MZ7$`Uekk z&}9Pb`M18=-0V+d?wvK@oOF%I6@4jrB`XQ8Tdvvp&p~FM!9rZ)SE7KpIpE(gGv17`(<1dt1MtyAYJvh- z>Nzi^&U*-*G3r_}r8zca+3f?|C;r+kCU)iFjV(w1xQUS(A@G=7NV032NkyM^RV(Dk zPMsVB10o^zR1s-}NmfDP)1Li7XSHvnrfR&Ba=ViXA}PH~L(ecZ*kB;VzZz||Fszs- zhRBC-1+;)*7uV;sf7L@J{8+O8LnSJES{_L}4DF#&tCZ| zeKZ-rW^nl2IV+k!9A(Os0lg!G(cV~F5CImQ`}xe4 za!)?jqYvK!EjV*Ejjh>CoT*n&-ZKR;|ki;dDEM3qU@bx%ta;MVn7RuWF_JU z#i195%(Anfo}XA_p`>I8!-26ludaCBfXzdNUIf$BMkD&_3v=2KB)P$jv{W!~h*wnv z!9d`B(gh(~wKQ|j>#zT&4e6RbFiy-ZLLly`=wz9byp&_O^aLQ}UGv;|w3e~Z4P{$(MxAgE-p?Y4#RWge>VO0cj87$ z1rSwdO5~6~&J!57}-_n7U2DtvDPfQjQn=)H;835KxtxYWu+uA1k9TqA}nu zLF#WDqA!%Z4y~YhP~6gACTcWwF@9&Lz}meL1q02NaurGC`hDezZ|kX>-bE(lssO^x z@51I5?QqfMgMYQk33fmjZr%EKXtJfpUVNOH&9tb_53$NyNC_+OJ~y?JjxFZIC zl$5`uAKdz+>MCS@7Of>`P&Cz1L?SlzvXFD!x{e6ta}Eg&XuZES63=`}S& zr_^NM@H;xT2lHI<+g*tDyp6iYjzsGLnqD<}R4e0Q%4D2*Fl^8l6+0Ws-8e{;Mv@#m z-1~}@jCU$c9-V4bWYLrhefXU9Pu@ZQ`4H#N=jH(>MMKByP5Qo9F z*=jNfq`ox@&hA|=PmX3<;!RV-d^~S|V+`dw!ETxUJsx3KZ>v7lljsn91;( zyl%6YtXVPr!iL!yuvnaEG;rzD3dlXuIapj-M7GzCD9bY==Z4Cc*i*Xo=@#WGMWT44 z;5Qzs4by_|@_%2%S6pB!+946tuBDQ{8XQ2RrzMgzyaXIB32rIy6sRH|$4aFMTh-QM z6&4+utE5?LQlHgIEjsHLBel=U^cg>dR+*gqX~w-@5YqDg!Xo^Hp}WTS_{5iD>zXGC zA=4Uf4cAd2b5$MAse-nhc5ccTC-!CJ zb}e))UQ@vGxOq(yB&UqFASGuTof~lV2*KjYGO{u)wzxXo>yhDfGZhjXIVb<4Gp`+n z;&U|+z$wx}?D*kkYTS3oRN>c2`&wInJa*=g*!a!slTCD(f4NL>l-!~#MP)(`P@F@TK~@~Ta?Wrv~gcjU@fX*L#Hs} z3m{E3aX+F+t&|APz>|~>SJdm%RduF@7_7tTb@AN63c^APT@~6sX#i!Ty8s9Sq{pd% zxJ1_qg4vZO@qO&V>f1l~7#mmu!PIvIMA$Misn8a_li&f`M@)&CW;L+5PJkjG zZoAEH9xMznxDvR1fd8Ne@=^B3-~-89z6kp)pxK)Zbn7-Mjw3O*<6dUJ@lk58RwGwG z!T&Sw9AbfNa}>8<5k0lwyUn@U{=~6k!D6WmJ~-3MPmXyGQL$y4a$Du6pIpD2I|mJ% z1JY#-WgN0Mhf}iUsrj6i?2qE73**R%O?r8LP{?;S&2k;AGnF1wp}g{ENKSV;kMbXy zw9rdT?KpRX-syFSAG1#q?lBgna|+x@h8CP~DmlxEe}ZE35c1wGM#@&affctIwvygy z7*fQNQQ0s;1HaMs9-15uVGENW<4phDCy9HwB_%9|a@rZ@0 zm#pQ&Hz2{f*n6i@oQ}{IF!2_wK-c%x@CM8>i@F7f80c~YC?PQIEA!9IdmvnSUO)(( z)RoumLZX)zwWDV==H0yoS6(#Y7@B&htR{rUvsEJIK6cdtn{AXV3h%{V%G07&ObEdZ zq@y&;9hG5E>bPYau5KV^DSs1^n%6en|N zmju8VViPiL-pgrb0uDCUxZb4j_=Cx70<|pP`BNxWRs9#IlL9gUr|26f`$Jq^kBT!P z&2@w)m5K!$2d*U2r1?L#=OC7^TubE;&4wMzFjH+lQ_1sGEkXD zq&ACpgK$rqzwo)-rFcmFV?I?RQlTt*RV0IGP{-HAadeyrbjF0FgNCzf?(*B7`)1C0tr< zfY|A~iJ%9*5cn_n0>k??M3WxC#C295PW`M5nr)Z`jFrgNLKE| z7H+;zMIM{#KYhDe`(C8ob0n#&sLFkzt~ckG)}?D0imV6C9XsFGDOFA1pPL&QsSZWE zkNIFV_|W;Z@Q2#D{~^yXIHZ|VT_L(>1Qkaip#&AhvVEZb z9dDWH5WUN25}nemnO?4|hLm!g>sRJgj#+Y3rmz*mneN@;$Rnvvl0!;&gweM%P!}MK z9z`1u<`7A)QcVd?4Pr(rH|^bKhNLg61NgTY^|93Rl?LHpq!i}#))>8Zt1aN^4VeH8_oAOb6(j>PG-{cQ%b$w4zK27ZF>5d=hg;Pv_?Z*o2?>Q6|umv^+Q^vpk7s zO#b++)3YItZPe>;*Fg6Pr`85+&{D^WwN@%jJ|f^EZ*Mt%*2Kn7^SB#JIGtKVGR0ebtce4ZaShaM zs|G~JtM)y|kQz^(?PpyKWdp5Hv-Ni(fzPPJQ#QY54έMHO0#QN{JTiYf}M3dhh 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 diff --git a/tests/Zend/Service/WindowsAzure/Management/_files/ServiceConfiguration.cscfg b/tests/Zend/Service/WindowsAzure/Management/_files/ServiceConfiguration.cscfg deleted file mode 100644 index 0581302678..0000000000 --- a/tests/Zend/Service/WindowsAzure/Management/_files/ServiceConfiguration.cscfg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Service/WindowsAzure/Management/_files/management.cer b/tests/Zend/Service/WindowsAzure/Management/_files/management.cer deleted file mode 100644 index 3301b989c9a67007c5eca366d3e66cdf2fbaedc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmV;l1WWrcf&{QIf&!SJ0|Eg80uV0`qmJI^_Nh!QI!@;dD&H^-1_>&LNQUY-n$DbTEPfA}|dG2`Yw2hW8Bt0RaU71A+n%05F0A z3Ic)x0RWTAd?W4Ozy5+)VvMOIK6O1#!c@C)TqMVlQ}`AoG%@O-KM$2J5pH~5A%hT!hcVjQ$Q0pLsD z@WaeFJ-A_)B8e) zOeEhWw*Cf+b!Ze<^yOqZHiS;d8G>!!;V5|>CNmzUAWGl*+NawHM}6jByp}-JvAVlI z@}|9RDUAf(G8b+CJH>xZV*v&mbNh5L%%lF|-Aqy1bZzUJ#Q%Rp!>Aj2dw{wb!UY_T zch_;Q!ueAl7oTjNXL?bpsyrR6>3TonD+Z?_X{Dv5?SGg!GnYbf7Y$w|JTRr zO-YtGkH3ma*mPa=U<#7gs`XO*hML_6DVUKGfYC_iRF>xfW8RL$SFv_`pQ*thgM@hZTIsWTUD z``m4c6f5HBM)HDHt*t_i8Rh&*K&r=@#~VDdqR?oqEl!-`Dje1ol29&tKPiV12o-y+t zaYpGZ)>dm-xaWmYYOG&K zkt+?${@fMN0uWqljbQYB1PL{#0%+8%<`qbtCk#Yb1@x z4NQ3!&|-q;;kWJrS;`#|q&Ykl+J~JxFg)J);QFceF{I1p7D#;4uxv$2dI{WY)JUj8 S?|CcCJCI-4?38fC-Q7m0Q7p{> diff --git a/tests/Zend/Service/WindowsAzure/Management/_files/management.pem b/tests/Zend/Service/WindowsAzure/Management/_files/management.pem deleted file mode 100644 index b44137ce26..0000000000 --- a/tests/Zend/Service/WindowsAzure/Management/_files/management.pem +++ /dev/null @@ -1,89 +0,0 @@ -Bag Attributes - localKeyID: 01 00 00 00 - friendlyName: 5e456e5a-c311-4409-bd07-1adfa82301b5 - Microsoft CSP Name: Microsoft Enhanced Cryptographic Provider v1.0 -Key Attributes - X509v3 Key Usage: 10 ------BEGIN RSA PRIVATE KEY----- -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 ------END RSA PRIVATE KEY----- -Bag Attributes - localKeyID: 01 00 00 00 -subject=/CN=localhost -issuer=/CN=localhost ------BEGIN CERTIFICATE----- -MIIEsDCCApigAwIBAgIQLw+jjt7n9qlMLTpO5wwq3zANBgkqhkiG9w0BAQUFADAU -MRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMTEwMjIxMDgwMDAwWhcNNDkwMjI4MDgw -MDAwWjAUMRIwEAYDVQQDEwlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCTynwj7d+//oJYYoypJD51VSYG9MaWgX7RyyFma4WAWOKcAN67 -QLXa68eXSzvslXeA56vsnUzVXnP16WtFi/AL5VJFmx1V+Uy1RfB8qf7HNgQxN/iG -NYbg7s9iHLQ8AeBL3/DDzHIzHpa+lszuWY3ze0XeCeaMhPifqYR64aH9E9AVv4KK -OgQh69EpQekery9p9gJlzmO35EYgBkv4/kghyfa8gAi8blPsZDHQV2BairHZYsiM -axReJTzUu59ne6JrRmFTee+cYFwOIGViyYPhtFgV8QqSDEezI49UCEPxe+wJSK6A -9t5P/HcB/UjaXmMFRgjS/DbfJB2RZ4l9cwY1mK4JotdmsXTqNJwzwvnnUGKEo6m2 -hbCw7pbUkvXOMNPdgwxHd1I2/Zv5OxFRq5b7SsZlRuaqYV5vbfa/F8tBUK4Qc6Le -xEYsMk8mwlY9vbzqlya4a/2nnMmQslOm8y9lqWbT+0KHTCTfJbb+Bop1aBRX9OVk -OTaETsgZgm3f4Sh5HSYzHqYgSt/62qfbCEd95l+8lkDUsbq7P/KmvW4pjQTdMhdt -/zvFf01jAQYbc/t0Mcyj/uLdTFHadG3rmsT/f0TDqBt6e4C6GcIFHI5313GuwvlT -HxefbJ5nelGqqjwdrOl6P+IrBqchaaWlpe1/mDgzl0JxFw1eJeTcICF0aQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4ICAQBP7wUanld723a7Xe6qrjK64btrqveiKF4WNdm1 -fT7/MnhqedwClMEqZj9H6EuD60Jsv19yrwGHTG0dFeJe/ek+UPmW2CIs24YfO2BM -4ZXNmjjnr5dwjbyzo1I52gYMfNpbeGMyRZcixhL6gHsXU43FOq1BYRPgc4y1+dji -yLl/eVHqECcTTUmWOI+/ikrYdF30YAqS16r1UvyGmt0HKZiiyW7/ryOWo/G0ChHc -zn3JzKySpIyMZj47lhQljgFVjmhcvGf+stVmQ2P4ijfy6hgbrig/ZkHriFBDVM3f -t7RGuWXYt/Q78SrAiqkzF2773G2KFCvi6EbyglWtrUKOGeX8SUCqx5rHGzyyotBo -rS1OnOIqHNYVklAuez8ph1mVBMdaQDEzvgsu3R/6jQ7M45F4+RSmxFXhLHFgma1f -S738Dq3WOK1JlsJAY0HdaQ6Co0w6njHzHnFG6SzWRIRHQDoWJ9i2aXglhO8XEA+t -3IUwuC7WE43qUaegH1NvlgzsHgwwuOeFUWqsX0iRKw3L/twWAn5d90sMY8ZV2c2H -yQFpEGrqMnneo4hj32ow2Ez+VG4vG01munUj9LFrJI3IDUx5FtBigufht+4CWcod -EaQ5PBXah507MDze+OD6qfcxpMvmFkh807BsRUp6Cdxs1EioQu95K8w7kF/Y7JRw -xN3dRg== ------END CERTIFICATE----- diff --git a/tests/Zend/Service/WindowsAzure/Management/_files/management.pfx b/tests/Zend/Service/WindowsAzure/Management/_files/management.pfx deleted file mode 100644 index 29df5385a75e85c9976ce00a2945d91bbf846493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4146 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 diff --git a/tests/Zend/Service/WindowsAzure/QueueStorageTest.php b/tests/Zend/Service/WindowsAzure/QueueStorageTest.php deleted file mode 100644 index 5a7788bba7..0000000000 --- a/tests/Zend/Service/WindowsAzure/QueueStorageTest.php +++ /dev/null @@ -1,393 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteQueue(TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Queue(TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Queue(TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_PREFIX . self::$uniqId; - } - - /** - * Test queue exists - */ - public function testQueueExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName1 = $this->generateName(); - $queueName2 = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName1); - $storageClient->createQueue($queueName2); - - $result = $storageClient->queueExists($queueName1); - $this->assertTrue($result); - - $result = $storageClient->queueExists(md5(time())); - $this->assertFalse($result); - } - } - - /** - * Test create queue - */ - public function testCreateQueue() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $result = $storageClient->createQueue($queueName); - $this->assertEquals($queueName, $result->Name); - } - } - - /** - * Test create queue if not exists - */ - public function testCreateQueueIfNotExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $result = $storageClient->queueExists($queueName); - $this->assertFalse($result); - - $storageClient->createQueueIfNotExists($queueName); - - $result = $storageClient->queueExists($queueName); - $this->assertTrue($result); - - $storageClient->createQueueIfNotExists($queueName); - } - } - - /** - * Test set queue metadata - */ - public function testSetQueueMetadata() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - - $storageClient->setQueueMetadata($queueName, array( - 'createdby' => 'PHPAzure', - )); - - $metadata = $storageClient->getQueueMetadata($queueName); - $this->assertEquals('PHPAzure', $metadata['createdby']); - } - } - - /** - * Test get queue - */ - public function testGetQueue() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - - $queue = $storageClient->getQueue($queueName); - $this->assertEquals($queueName, $queue->Name); - $this->assertEquals(0, $queue->ApproximateMessageCount); - } - } - - /** - * Test list queues - */ - public function testListQueues() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName1 = 'testlist1'; - $queueName2 = 'testlist2'; - $queueName3 = 'testlist3'; - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName1); - $storageClient->createQueue($queueName2); - $storageClient->createQueue($queueName3); - $result1 = $storageClient->listQueues('testlist'); - $result2 = $storageClient->listQueues('testlist', 1); - - // cleanup first - $storageClient->deleteQueue($queueName1); - $storageClient->deleteQueue($queueName2); - $storageClient->deleteQueue($queueName3); - - $this->assertEquals(3, count($result1)); - $this->assertEquals($queueName2, $result1[1]->Name); - - $this->assertEquals(1, count($result2)); - } - } - - /** - * Test list queues with metadata - */ - public function testListQueuesWithMetadata() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName, array( - 'createdby' => 'PHPAzure', - 'ownedby' => 'PHPAzure', - )); - - $result = $storageClient->listQueues($queueName, null, null, 'metadata'); - - $this->assertEquals('PHPAzure', $result[0]->Metadata['createdby']); - $this->assertEquals('PHPAzure', $result[0]->Metadata['ownedby']); - } - } - - /** - * Test put message - */ - public function testPutMessage() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message', 120); - - sleep(5); // wait for the message to appear in the queue... - - $messages = $storageClient->getMessages($queueName); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Test message', $messages[0]->MessageText); - } - } - - /** - * Test get messages - */ - public function testGetMessages() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message 1', 120); - $storageClient->putMessage($queueName, 'Test message 2', 120); - $storageClient->putMessage($queueName, 'Test message 3', 120); - $storageClient->putMessage($queueName, 'Test message 4', 120); - - sleep(5); // wait for the messages to appear in the queue... - - $messages1 = $storageClient->getMessages($queueName, 2); - $messages2 = $storageClient->getMessages($queueName, 2); - $messages3 = $storageClient->getMessages($queueName); - - $this->assertEquals(2, count($messages1)); - $this->assertEquals(2, count($messages2)); - $this->assertEquals(0, count($messages3)); - } - } - - /** - * Test peek messages - */ - public function testPeekMessages() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message 1', 120); - $storageClient->putMessage($queueName, 'Test message 2', 120); - $storageClient->putMessage($queueName, 'Test message 3', 120); - $storageClient->putMessage($queueName, 'Test message 4', 120); - - sleep(5); // wait for the messages to appear in the queue... - - $messages1 = $storageClient->peekMessages($queueName, 4); - $hasMessages = $storageClient->hasMessages($queueName); - $messages2 = $storageClient->getMessages($queueName, 4); - - $this->assertEquals(4, count($messages1)); - $this->assertTrue($hasMessages); - $this->assertEquals(4, count($messages2)); - } - } - - /** - * Test dequeuecount - */ - public function testDequeueCount() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message 1', 120); - - sleep(5); // wait for the message to appear in the queue... - - $expectedDequeueCount = 3; - for ($i = 0; $i < $expectedDequeueCount - 1; $i++) { - $storageClient->getMessages($queueName, 1, 1); - sleep(3); - } - - $messages = $storageClient->getMessages($queueName, 1); - - $this->assertEquals($expectedDequeueCount, $messages[0]->DequeueCount); - } - } - - /** - * Test clear messages - */ - public function testClearMessages() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message 1', 120); - $storageClient->putMessage($queueName, 'Test message 2', 120); - $storageClient->putMessage($queueName, 'Test message 3', 120); - $storageClient->putMessage($queueName, 'Test message 4', 120); - - sleep(5); // wait for the messages to appear in the queue... - - $messages1 = $storageClient->peekMessages($queueName, 4); - $storageClient->clearMessages($queueName); - - sleep(5); // wait for the GC... - - $messages2 = $storageClient->peekMessages($queueName, 4); - - $this->assertEquals(4, count($messages1)); - $this->assertEquals(0, count($messages2)); - } - } - - /** - * Test delete message - */ - public function testDeleteMessage() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_QUEUE_RUNTESTS) { - $queueName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createQueue($queueName); - $storageClient->putMessage($queueName, 'Test message 1', 120); - $storageClient->putMessage($queueName, 'Test message 2', 120); - $storageClient->putMessage($queueName, 'Test message 3', 120); - $storageClient->putMessage($queueName, 'Test message 4', 120); - - sleep(5); // wait for the messages to appear in the queue... - - $messages1 = $storageClient->getMessages($queueName, 2, 10); - foreach ($messages1 as $message) - { - $storageClient->deleteMessage($queueName, $message); - } - - sleep(5); // wait for the GC... - - $messages2 = $storageClient->getMessages($queueName, 4); - - $this->assertEquals(2, count($messages1)); - $this->assertEquals(2, count($messages2)); - } - } -} - -// Call Zend_Service_WindowsAzure_QueueStorageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_QueueStorageTest::main") { - Zend_Service_WindowsAzure_QueueStorageTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/RetryPolicyTest.php b/tests/Zend/Service/WindowsAzure/RetryPolicyTest.php deleted file mode 100644 index b26f336615..0000000000 --- a/tests/Zend/Service/WindowsAzure/RetryPolicyTest.php +++ /dev/null @@ -1,118 +0,0 @@ -_executedRetries = 0; - $policy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::noRetry(); - $retries = $policy->execute( - array($this, '_countRetries') - ); - $this->assertEquals(1, $retries); - } - - /** - * Test retry policy - retryN - */ - public function testRetryN() - { - $this->_executedRetries = 0; - $this->_exceptionCount = 9; - - $policy = Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 100); - $retries = $policy->execute( - array($this, '_countRetriesAndThrowExceptions') - ); - $this->assertEquals(10, $retries); - } - - /** - * Helper function, counting retries - */ - public function _countRetries() - { - return ++$this->_executedRetries; - } - - /** - * Helper function, counting retries and generating number of exceptions - */ - public function _countRetriesAndThrowExceptions() - { - ++$this->_executedRetries; - if ($this->_exceptionCount-- > 0) { - throw new Exception("Exception thrown."); - } - return $this->_executedRetries; - } -} - -// Call Zend_Service_WindowsAzure_RetryPolicyTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_RetryPolicyTest::main") { - Zend_Service_WindowsAzure_RetryPolicyTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/SessionHandlerTest.php b/tests/Zend/Service/WindowsAzure/SessionHandlerTest.php deleted file mode 100644 index 22dde0dbb8..0000000000 --- a/tests/Zend/Service/WindowsAzure/SessionHandlerTest.php +++ /dev/null @@ -1,234 +0,0 @@ -markTestSkipped('This test case requires TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS to be enabled in TestConfiguration.php'); - } - } - - /** - * Test teardown - */ - protected function tearDown() - { - if ($this->status == PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED) { - return; - } - $storageClient = $this->createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_TABLENAME_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected function createSessionHandler($storageInstance, $tableName) - { - $sessionHandler = new Zend_Service_WindowsAzure_SessionHandler( - $storageInstance, - $tableName - ); - return $sessionHandler; - } - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_TABLENAME_PREFIX . self::$uniqId; - } - - /** - * Test register - */ - public function testRegister() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $result = $sessionHandler->register(); - - $this->assertTrue($result); - } - - /** - * Test open - */ - public function testOpen() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $result = $sessionHandler->open(); - - $this->assertTrue($result); - - $verifyResult = $storageClient->listTables(); - $this->assertEquals($tableName, $verifyResult[0]->Name); - } - - /** - * Test close - */ - public function testClose() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - $result = $sessionHandler->close(); - - $this->assertTrue($result); - } - - /** - * Test read - */ - public function testRead() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - $result = unserialize( $sessionHandler->read($sessionId) ); - - $this->assertEquals('PHPAzure', $result); - } - - /** - * Test write - */ - public function testWrite() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(1, count($verifyResult)); - } - } - - /** - * Test destroy - */ - public function testDestroy() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - $result = $sessionHandler->destroy($sessionId); - $this->assertTrue($result); - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($verifyResult)); - } - - /** - * Test gc - */ - public function testGc() - { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - sleep(1); // let time() tick - - $result = $sessionHandler->gc(0); - $this->assertTrue($result); - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($verifyResult)); - } - - protected function session_id() - { - return md5(self::$uniqId); - } -} - diff --git a/tests/Zend/Service/WindowsAzure/StorageTest.php b/tests/Zend/Service/WindowsAzure/StorageTest.php deleted file mode 100644 index 2095588ec2..0000000000 --- a/tests/Zend/Service/WindowsAzure/StorageTest.php +++ /dev/null @@ -1,74 +0,0 @@ -assertEquals('http://127.0.0.1:10000/devstoreaccount1', $storage->getBaseUrl()); - } - - /** - * Test constructor for production - */ - public function testConstructorForProduction() - { - $storage = new Zend_Service_WindowsAzure_Storage(Zend_Service_WindowsAzure_Storage::URL_CLOUD_BLOB, 'testing', ''); - $this->assertEquals('http://testing.blob.core.windows.net', $storage->getBaseUrl()); - } -} - -// Call Zend_Service_WindowsAzure_StorageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_StorageTest::main") { - Zend_Service_WindowsAzure_StorageTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/TableEntityQueryTest.php b/tests/Zend/Service/WindowsAzure/TableEntityQueryTest.php deleted file mode 100644 index 5dedb022fc..0000000000 --- a/tests/Zend/Service/WindowsAzure/TableEntityQueryTest.php +++ /dev/null @@ -1,188 +0,0 @@ -select() - ->from('MyTable'); - - $this->assertEquals('MyTable()', $target->__toString()); - } - - /** - * Test partition key query - */ - public function testPartitionKeyQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->wherePartitionKey('test'); - - $this->assertEquals('MyTable(PartitionKey=\'test\')', $target->__toString()); - } - - /** - * Test row key query - */ - public function testRowKeyQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->whereRowKey('test'); - - $this->assertEquals('MyTable(RowKey=\'test\')', $target->__toString()); - } - - /** - * Test identifier query - */ - public function testIdentifierQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->wherePartitionKey('test') - ->whereRowKey('123'); - - $this->assertEquals('MyTable(PartitionKey=\'test\', RowKey=\'123\')', $target->__toString()); - } - - /** - * Test top records query - */ - public function testTopQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->top(10); - - $this->assertEquals('MyTable()?$top=10', $target->__toString()); - } - - /** - * Test order by query - */ - public function testOrderByQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->orderBy('Name', 'asc'); - - $this->assertEquals('MyTable()?$orderby=Name asc', $target->__toString()); - } - - /** - * Test order by multiple query - */ - public function testOrderByMultipleQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->orderBy('Name', 'asc') - ->orderBy('Visible', 'desc'); - - $this->assertEquals('MyTable()?$orderby=Name asc,Visible desc', $target->__toString()); - } - - /** - * Test where query - */ - public function testWhereQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->where('Name eq ?', 'Maarten'); - - $this->assertEquals('MyTable()?$filter=Name eq \'Maarten\'', $target->__toString()); - } - - /** - * Test where array query - */ - public function testWhereArrayQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->where('Name eq ? or Name eq ?', array('Maarten', 'Vijay')); - - $this->assertEquals('MyTable()?$filter=Name eq \'Maarten\' or Name eq \'Vijay\'', $target->__toString()); - } - - /** - * Test where multiple query - */ - public function testWhereMultipleQuery() - { - $target = new Zend_Service_WindowsAzure_Storage_TableEntityQuery(); - $target->select() - ->from('MyTable') - ->where('Name eq ?', 'Maarten') - ->andWhere('Visible eq true'); - - $this->assertEquals('MyTable()?$filter=Name eq \'Maarten\' and Visible eq true', $target->__toString()); - } -} - -// Call Zend_Service_WindowsAzure_TableEntityQueryTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableEntityQueryTest::main") { - Zend_Service_WindowsAzure_TableEntityQueryTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/TableEntityTest.php b/tests/Zend/Service/WindowsAzure/TableEntityTest.php deleted file mode 100644 index e326f8df4e..0000000000 --- a/tests/Zend/Service/WindowsAzure/TableEntityTest.php +++ /dev/null @@ -1,154 +0,0 @@ -assertEquals('partition1', $target->getPartitionKey()); - $this->assertEquals('000001', $target->getRowKey()); - } - - /** - * Test get Azure values - */ - public function testGetAzureValues() - { - $target = new TSETTest_TestEntity('partition1', '000001'); - $result = $target->getAzureValues(); - - $this->assertEquals('Name', $result[0]->Name); - $this->assertEquals(null, $result[0]->Value); - - $this->assertEquals('Age', $result[1]->Name); - $this->assertEquals('Edm.Int64', $result[1]->Type); - - $this->assertEquals('Visible', $result[2]->Name); - $this->assertEquals(false, $result[2]->Value); - - $this->assertEquals('partition1', $result[3]->Value); - $this->assertEquals('000001', $result[4]->Value); - } - - /** - * Test set Azure values - */ - public function testSetAzureValuesSuccess() - { - $values = array( - 'PartitionKey' => 'partition1', - 'RowKey' => '000001', - 'Name' => 'Maarten', - 'Age' => 25, - 'Visible' => true - ); - - $target = new TSETTest_TestEntity(); - $target->setAzureValues($values); - - $this->assertEquals('partition1', $target->getPartitionKey()); - $this->assertEquals('000001', $target->getRowKey()); - $this->assertEquals('Maarten', $target->FullName); - $this->assertEquals(25, $target->Age); - $this->assertEquals(true, $target->Visible); - } - - /** - * Test set Azure values - */ - public function testSetAzureValuesFailure() - { - $values = array( - 'PartitionKey' => 'partition1', - 'RowKey' => '000001' - ); - - $exceptionRaised = false; - $target = new TSETTest_TestEntity(); - try - { - $target->setAzureValues($values, true); - } - catch (Exception $ex) { - $exceptionRaised = true; - } - - $this->assertTrue($exceptionRaised); - } -} - -/** - * Test entity - */ -class TSETTest_TestEntity extends Zend_Service_WindowsAzure_Storage_TableEntity -{ - /** - * @azure Name - */ - public $FullName; - - /** - * @azure Age Edm.Int64 - */ - public $Age; - - /** - * @azure Visible Edm.Boolean - */ - public $Visible = false; -} - -// Call Zend_Service_WindowsAzure_TableEntityTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableEntityTest::main") { - Zend_Service_WindowsAzure_TableEntityTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/TableSessionHandlerTest.php b/tests/Zend/Service/WindowsAzure/TableSessionHandlerTest.php deleted file mode 100644 index 36ec051e91..0000000000 --- a/tests/Zend/Service/WindowsAzure/TableSessionHandlerTest.php +++ /dev/null @@ -1,292 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_TABLENAME_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected function createSessionHandler($storageInstance, $tableName) - { - $sessionHandler = new Zend_Service_WindowsAzure_SessionHandler( - $storageInstance, - $tableName - ); - return $sessionHandler; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_TABLENAME_PREFIX . self::$uniqId; - } - - /** - * Test register - */ - public function testRegister() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $result = $sessionHandler->register(); - - $this->assertTrue($result); - } - } - - /** - * Test open - */ - public function testOpen() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $result = $sessionHandler->open(); - - $this->assertTrue($result); - - - $verifyResult = $storageClient->listTables(); - $this->assertEquals($tableName, $verifyResult[0]->Name); - } - } - - /** - * Test close - */ - public function testClose() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - $result = $sessionHandler->close(); - - $this->assertTrue($result); - } - } - - /** - * Test read - */ - public function testRead() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - $result = unserialize( $sessionHandler->read($sessionId) ); - - $this->assertEquals('PHPAzure', $result); - } - } - - /** - * Test write - */ - public function testWrite() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(1, count($verifyResult)); - } - } - - /** - * Test write large - */ - public function testWriteLarge() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - - $sessionData = ''; - for ($i = 0; $i < Zend_Service_WindowsAzure_SessionHandler::MAX_TS_PROPERTY_SIZE; $i++) { - $sessionData .= 'a'; - } - $sessionData = serialize( $sessionData ); - - $exceptionThrown = false; - try { - $sessionHandler->write($sessionId, $sessionData); - } catch (Exception $ex) { - $exceptionThrown = true; - } - - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test destroy - */ - public function testDestroy() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - $result = $sessionHandler->destroy($sessionId); - $this->assertTrue($result); - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($verifyResult)); - } - } - - /** - * Test gc - */ - public function testGc() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_SESSIONHANDLER_RUNTESTS) { - $storageClient = $this->createStorageInstance(); - $tableName = $this->generateName(); - $sessionHandler = $this->createSessionHandler($storageClient, $tableName); - $sessionHandler->open(); - - $sessionId = $this->session_id(); - $sessionData = serialize( 'PHPAzure' ); - $sessionHandler->write($sessionId, $sessionData); - - sleep(1); // let time() tick - - $result = $sessionHandler->gc(0); - $this->assertTrue($result); - - $verifyResult = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($verifyResult)); - } - } - - protected function session_id() - { - return md5(self::$uniqId); - } -} - -// Call Zend_Service_WindowsAzure_TableSessionHandlerTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableSessionHandlerTest::main") { - Zend_Service_WindowsAzure_TableSessionHandlerTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/TableStorageTest.php b/tests/Zend/Service/WindowsAzure/TableStorageTest.php deleted file mode 100644 index 4b761adeb7..0000000000 --- a/tests/Zend/Service/WindowsAzure/TableStorageTest.php +++ /dev/null @@ -1,933 +0,0 @@ -createStorageInstance(); - for ($i = 1; $i <= self::$uniqId; $i++) - { - try { $storageClient->deleteTable(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . $i); } catch (Exception $e) { } - } - } - - protected function createStorageInstance() - { - $storageClient = null; - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNONPROD) { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_PROD, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_PROD, false, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } else { - $storageClient = new Zend_Service_WindowsAzure_Storage_Table(TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_HOST_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_ACCOUNT_DEV, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_KEY_DEV, true, Zend_Service_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250)); - } - - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY) { - $storageClient->setProxy(TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_USEPROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_PORT, TESTS_ZEND_SERVICE_WINDOWSAZURE_STORAGE_PROXY_CREDENTIALS); - } - - return $storageClient; - } - - protected static $uniqId = 0; - - protected function generateName() - { - self::$uniqId++; - return TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_TABLENAME_PREFIX . self::$uniqId; - } - - /** - * Test create table - */ - public function testCreateTable() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $result = $storageClient->createTable($tableName); - $this->assertEquals($tableName, $result->Name); - - $result = $storageClient->listTables(); - $this->assertEquals(1, count($result)); - $this->assertEquals($tableName, $result[0]->Name); - } - } - - /** - * Test create table if not exists - */ - public function testCreateTableIfNotExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $result = $storageClient->tableExists($tableName); - $this->assertFalse($result); - - $storageClient->createTableIfNotExists($tableName); - - $result = $storageClient->tableExists($tableName); - $this->assertTrue($result); - - $storageClient->createTableIfNotExists($tableName); - } - } - - /** - * Test table exists - */ - public function testTableExists() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName1 = $this->generateName(); - $tableName2 = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $storageClient->createTable($tableName1); - $storageClient->createTable($tableName2); - - $result = $storageClient->tableExists($tableName2); - $this->assertTrue($result); - - $result = $storageClient->tableExists(md5(time())); - $this->assertFalse($result); - } - } - - /** - * Test list tables - */ - public function testListTables() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName1 = $this->generateName(); - $tableName2 = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $storageClient->createTable($tableName1); - $storageClient->createTable($tableName2); - - $result = $storageClient->listTables(); - $this->assertEquals(2, count($result)); - $this->assertEquals($tableName1, $result[0]->Name); - $this->assertEquals($tableName2, $result[1]->Name); - } - } - - /** - * Test delete table - */ - public function testDeleteTable() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - - $storageClient->createTable($tableName); - $storageClient->deleteTable($tableName); - - $result = $storageClient->listTables(); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test insert entity - */ - public function testInsertEntity() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $result = $storageClient->insertEntity($tableName, $entity); - - $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp()); - $this->assertNotEquals('', $result->getEtag()); - $this->assertEquals($entity, $result); - } - } - - /** - * Test insert entity, with XML in content. This should not break the XML sent to Windows Azure. - */ - public function testInsertEntity_Security_HtmlSpecialChars() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - $entity->FullName = 'XML '; // this should work without breaking the XML - - $result = $storageClient->insertEntity($tableName, $entity); - - $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp()); - $this->assertNotEquals('', $result->getEtag()); - $this->assertEquals($entity, $result); - } - } - - /** - * Test delete entity, not taking etag into account - */ - public function testDeleteEntity_NoEtag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $result = $storageClient->insertEntity($tableName, $entity); - - $this->assertEquals($entity, $result); - - $storageClient->deleteEntity($tableName, $entity); - } - } - - /** - * Test delete entity, taking etag into account - */ - public function testDeleteEntity_Etag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $result = $storageClient->insertEntity($tableName, $entity); - - $this->assertEquals($entity, $result); - - // Set "old" etag - $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"'); - - $exceptionThrown = false; - try { - $storageClient->deleteEntity($tableName, $entity, true); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test retrieve entity by id - */ - public function testRetrieveEntityById() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity'); - $this->assertEquals($entity, $result); - } - } - - /** - * Test retrieve entity by id, havind less properties than the original entity. - * Related to issue: http://phpazure.codeplex.com/workitem/5021 - */ - public function testRetrieveEntityById_DifferentProperties() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - - $storageClient->setThrowExceptionOnMissingData(false); - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity2'); - $this->assertEquals($entity->FullName, $result->FullName); - } - } - - /** - * Test retrieve entity by id (> 256 key characters) - */ - public function testRetrieveEntityById_Large() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - $entity->setPartitionKey(str_repeat('a', 200)); - $entity->setRowKey(str_repeat('a', 200)); - - $storageClient->insertEntity($tableName, $entity); - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity'); - $this->assertEquals($entity, $result); - } - } - - /** - * Test retrieve entity by id, DynamicTableEntity - */ - public function testRetrieveEntityById_DynamicTableEntity() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey()); - $this->assertEquals($entity->FullName, $result->Name); - $this->assertTrue($result instanceof Zend_Service_WindowsAzure_Storage_DynamicTableEntity); - } - } - - /** - * Test update entity, not taking etag into account - */ - public function testUpdateEntity_NoEtag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - $entity->Age = 0; - - $result = $storageClient->updateEntity($tableName, $entity); - - $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp()); - $this->assertNotEquals('', $result->getEtag()); - $this->assertEquals(0, $result->Age); - $this->assertEquals($entity, $result); - } - } - - /** - * Test update entity, taking etag into account - */ - public function testUpdateEntity_Etag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - $entity->Age = 0; - - // Set "old" etag - $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"'); - - $exceptionThrown = false; - try { - $storageClient->updateEntity($tableName, $entity, true); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test merge entity, not taking etag into account - */ - public function testMergeEntity_NoEtag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - - $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey()); - $dynamicEntity->Myproperty = 10; - $dynamicEntity->Otherproperty = "Test"; - $dynamicEntity->Age = 0; - - $storageClient->mergeEntity($tableName, $dynamicEntity, false, array('Myproperty', 'Otherproperty')); // only update 'Myproperty' and 'Otherproperty' - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey()); - - $this->assertNotEquals('0001-01-01T00:00:00', $result->getTimestamp()); - $this->assertNotEquals('', $result->getEtag()); - $this->assertNotEquals(0, $result->Age); - $this->assertEquals($entity->FullName, $result->Name); - $this->assertEquals($dynamicEntity->Myproperty, $result->Myproperty); - $this->assertEquals($dynamicEntity->Otherproperty, $result->Otherproperty); - } - } - - /** - * Test merge entity, taking etag into account - */ - public function testMergeEntity_Etag() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - - $storageClient->insertEntity($tableName, $entity); - - $dynamicEntity = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($entity->getPartitionKey(), $entity->getRowKey()); - $dynamicEntity->Myproperty = 10; - $dynamicEntity->Otherproperty = "Test"; - $dynamicEntity->Age = 0; - - // Set "old" etag - $entity->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"'); - - $exceptionThrown = false; - try { - $storageClient->mergeEntity($tableName, $dynamicEntity, true); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test retrieve entities, all - */ - public function testRetrieveEntities_All() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(20); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities($tableName, 'TSTest_TestEntity'); - $this->assertEquals(20, count($result)); - } - } - - /** - * Test retrieve entities, all, DynamicTableEntity - */ - public function testRetrieveEntities_All_DynamicTableEntity() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(20); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities($tableName); - $this->assertEquals(20, count($result)); - - foreach ($result as $item) - { - $this->assertTrue($item instanceof Zend_Service_WindowsAzure_Storage_DynamicTableEntity); - } - } - } - - /** - * Test retrieve entities, filtered - */ - public function testRetrieveEntities_Filtered() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(5); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities($tableName, 'PartitionKey eq \'' . $entities[0]->getPartitionKey() . '\' and RowKey eq \'' . $entities[0]->getRowKey() . '\'', 'TSTest_TestEntity'); - $this->assertEquals(1, count($result)); - } - } - - /** - * Test retrieve entities, fluent interface - */ - public function testRetrieveEntities_Fluent1() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities( - $storageClient->select() - ->from($tableName) - ->where('Name eq ?', $entities[0]->FullName) - ->andWhere('RowKey eq ?', $entities[0]->getRowKey()), - 'TSTest_TestEntity' - ); - - $this->assertEquals(1, count($result)); - $this->assertEquals($entities[0], $result[0]); - } - } - - /** - * Test retrieve entities, fluent interface - */ - public function testRetrieveEntities_Fluent2() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities( - $storageClient->select() - ->from($tableName) - ->where('Name eq ?', $entities[0]->FullName) - ->andWhere('PartitionKey eq ?', $entities[0]->getPartitionKey()), - 'TSTest_TestEntity' - ); - - $this->assertEquals(1, count($result)); - $this->assertEquals($entities[0], $result[0]); - } - } - - /** - * Test retrieve entities, fluent interface, top specification - */ - public function testRetrieveEntities_Fluent_Top() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $result = $storageClient->retrieveEntities( - $storageClient->select()->top(4) - ->from($tableName), - 'TSTest_TestEntity' - ); - - $this->assertEquals(4, count($result)); - } - } - - /** - * Test batch commit, success - */ - public function testBatchCommit_Success() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(20); - $entities1 = array_slice($entities, 0, 10); - $entities2 = array_slice($entities, 10, 10); - - // Insert entities - foreach ($entities1 as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - // Start batch - $batch = $storageClient->startBatch(); - $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch); - - // Insert entities in batch - foreach ($entities2 as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - // Delete entities - foreach ($entities1 as $entity) - { - $storageClient->deleteEntity($tableName, $entity); - } - - // Commit - $batch->commit(); - - // Verify - $result = $storageClient->retrieveEntities($tableName); - $this->assertEquals(10, count($result)); - } - } - - /** - * Test batch rollback, success - */ - public function testBatchRollback_Success() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - - // Start batch - $batch = $storageClient->startBatch(); - $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch); - - // Insert entities in batch - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - // Rollback - $batch->rollback(); - - // Verify - $result = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test batch commit, fail updates - */ - public function testBatchCommit_FailUpdates() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - foreach ($entities as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - // Make some entity updates with "old" etags - $entities[0]->Age = 0; - $entities[0]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"'); - $entities[1]->Age = 0; - $entities[1]->setEtag('W/"datetime\'2009-05-27T12%3A15%3A15.3321531Z\'"'); - $entities[2]->Age = 0; - - // Start batch - $batch = $storageClient->startBatch(); - $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch); - - // Update entities in batch - $storageClient->updateEntity($tableName, $entities[0], true); - $storageClient->updateEntity($tableName, $entities[1], true); - $storageClient->updateEntity($tableName, $entities[2], true); - - // Commit - $exceptionThrown = false; - try { - $batch->commit(); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - } - } - - /** - * Test batch commit, fail partition - */ - public function testBatchCommit_FailPartition() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(10); - - // Start batch - $batch = $storageClient->startBatch(); - $this->assertTrue($batch instanceof Zend_Service_WindowsAzure_Storage_Batch); - - // Insert entities in batch - foreach ($entities as $entity) - { - $entity->setPartitionKey('partition' . rand(1, 9)); - $storageClient->insertEntity($tableName, $entity); - } - - // Commit - $exceptionThrown = false; - try { - $batch->commit(); - } catch (Exception $ex) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown); - - // Verify - $result = $storageClient->retrieveEntities($tableName); - $this->assertEquals(0, count($result)); - } - } - - /** - * Test continuation tokens - */ - public function testContinuationTokens() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $numberOfEntities = 2500; - $numberOfEntitiesPerBatch = 100; - $entities = $this->_generateEntities($numberOfEntities); - - // Insert test data - for ($i = 0; $i < $numberOfEntities; $i+=$numberOfEntitiesPerBatch) { - $batch = $storageClient->startBatch(); - - $entitiesTemp = array_slice($entities, $i, $numberOfEntitiesPerBatch); - foreach ($entitiesTemp as $entity) - { - $storageClient->insertEntity($tableName, $entity); - } - - $batch->commit(); - } - - // Verify - $result = $storageClient->retrieveEntities($tableName); - $this->assertEquals(2500, count($result)); - - $result = $storageClient->retrieveEntities( - $storageClient->select() - ->from($tableName) - ->where('Age ne 0') - ); - $this->assertEquals(2500, count($result)); - } - } - - /** - * Test retrieve entity by id - curly brackets - */ - public function testRetrieveEntityByIdCurlyBrackets() - { - if (TESTS_ZEND_SERVICE_WINDOWSAZURE_TABLE_RUNTESTS) { - $tableName = $this->generateName(); - $storageClient = $this->createStorageInstance(); - $storageClient->createTable($tableName); - - $entities = $this->_generateEntities(1); - $entity = $entities[0]; - $entity->setRowKey('-1305521559_{47418E06-58CC-40CA-AE7E-F2B0BD5FD885}'); - - $storageClient->insertEntity($tableName, $entity); - - $result = $storageClient->retrieveEntityById($tableName, $entity->getPartitionKey(), $entity->getRowKey(), 'TSTest_TestEntity'); - $this->assertEquals($entity, $result); - } - } - - /** - * Generate entities - * - * @param int $amount Number of entities to generate - * @return array Array of TSTest_TestEntity - */ - protected function _generateEntities($amount = 1) - { - $returnValue = array(); - - for ($i = 0; $i < $amount; $i++) - { - $entity = new TSTest_TestEntity('partition1', 'row' . ($i + 1)); - $entity->FullName = md5(uniqid(rand(), true)); - $entity->Age = rand(1, 130); - $entity->Visible = rand(1,2) == 1; - $entity->DateInService = new DateTime('now', new DateTimeZone('UTC')); - - $returnValue[] = $entity; - } - - return $returnValue; - } -} - -/** - * Test Zend_Service_WindowsAzure_Storage_TableEntity class - */ -class TSTest_TestEntity extends Zend_Service_WindowsAzure_Storage_TableEntity -{ - /** - * @azure Name - */ - public $FullName; - - /** - * @azure Age Edm.Int64 - */ - public $Age; - - /** - * @azure Visible Edm.Boolean - */ - public $Visible = false; - - /** - * @azure DateInService Edm.DateTime - */ - public $DateInService; -} - -/** - * Test Zend_Service_WindowsAzure_Storage_TableEntity class - */ -class TSTest_TestEntity2 extends Zend_Service_WindowsAzure_Storage_TableEntity -{ - /** - * @azure Name - */ - public $FullName; -} - -// Call Zend_Service_WindowsAzure_TableStorageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Service_WindowsAzure_TableStorageTest::main") { - Zend_Service_WindowsAzure_TableStorageTest::main(); -} diff --git a/tests/Zend/Service/WindowsAzure/_files/WindowsAzure.gif b/tests/Zend/Service/WindowsAzure/_files/WindowsAzure.gif deleted file mode 100644 index 2e9d8c9be0efbfe8700202493802207aba3ec3d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4171 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 diff --git a/tests/Zend/Service/Yahoo/AllTests.php b/tests/Zend/Service/Yahoo/AllTests.php deleted file mode 100644 index aedf7bedd6..0000000000 --- a/tests/Zend/Service/Yahoo/AllTests.php +++ /dev/null @@ -1,75 +0,0 @@ -addTestSuite('Zend_Service_Yahoo_OfflineTest'); - - if (defined('TESTS_ZEND_SERVICE_YAHOO_ONLINE_ENABLED') && - constant('TESTS_ZEND_SERVICE_YAHOO_ONLINE_ENABLED') !== false) { - $suite->addTestSuite('Zend_Service_Yahoo_OnlineTest'); - } else { - $suite->addTestSuite('Zend_Service_Yahoo_OnlineTest_Skip'); - } - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Service_Yahoo_AllTests::main') { - Zend_Service_Yahoo_AllTests::main(); -} diff --git a/tests/Zend/Service/Yahoo/OfflineTest.php b/tests/Zend/Service/Yahoo/OfflineTest.php deleted file mode 100644 index 29da25675c..0000000000 --- a/tests/Zend/Service/Yahoo/OfflineTest.php +++ /dev/null @@ -1,552 +0,0 @@ -_yahoo = new Zend_Service_Yahoo(constant('TESTS_ZEND_SERVICE_YAHOO_ONLINE_APPID')); - - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_httpClientAdapterTest = new Zend_Http_Client_Adapter_Test(); - } - - /** - * Ensures that Zend_Service_Yahoo_ResultSet::current() throws an exception - * - * @return void - */ - public function testResultSetCurrentException() - { - $domDocument = new DOMDocument(); - $domDocument->appendChild($domDocument->createElement('ResultSet')); - - $resultSet = new Zend_Service_Yahoo_OfflineTest_ResultSet($domDocument); - - try { - $resultSet->current(); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('implemented by child', $e->getMessage()); - } - } - - /** - * Ensures that inlinkDataSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testInlinkDataSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->inlinkDataSearch('http://framework.zend.com/', array('results' => 101)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that inlinkDataSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testInlinkDataSearchExceptionStartInvalid() - { - try { - $this->_yahoo->inlinkDataSearch('http://framework.zend.com/', array('start' => 1001)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that inlinkDataSearch() throws an exception when the omit_inlinks option is invalid - * - * @return void - */ - public function testInlinkDataSearchExceptionOmitLinksInvalid() - { - try { - $this->_yahoo->inlinkDataSearch('http://framework.zend.com/', array('omit_inlinks' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'omit_inlinks'", $e->getMessage()); - } - } - - /** - * Ensures that imageSearch() throws an exception when the type option is invalid - * - * @return void - */ - public function testImageSearchExceptionTypeInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('type' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'type'", $e->getMessage()); - } - } - - /** - * Ensures that imageSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testImageSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('results' => 500)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that imageSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testImageSearchExceptionStartInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('start' => 1001)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that imageSearch() throws an exception when the format option is invalid - * - * @return void - */ - public function testImageSearchExceptionFormatInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('format' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'format'", $e->getMessage()); - } - } - - /** - * Ensures that imageSearch() throws an exception when the coloration option is invalid - * - * @return void - */ - public function testImageSearchExceptionColorationInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('coloration' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'coloration'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testLocalSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->localSearch('php', array('results' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testLocalSearchExceptionStartInvalid() - { - try { - $this->_yahoo->localSearch('php', array('start' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the longitude option is invalid - * - * @return void - */ - public function testLocalSearchExceptionLongitudeInvalid() - { - try { - $this->_yahoo->localSearch('php', array('longitude' => -91)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'longitude'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the latitude option is invalid - * - * @return void - */ - public function testLocalSearchExceptionLatitudeInvalid() - { - try { - $this->_yahoo->localSearch('php', array('latitude' => -181)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'latitude'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the zip option is invalid - * - * @return void - */ - public function testLocalSearchExceptionZipInvalid() - { - try { - $this->_yahoo->localSearch('php', array('zip' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'zip'", $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when location data are missing - * - * @return void - */ - public function testLocalSearchExceptionLocationMissing() - { - try { - $this->_yahoo->localSearch('php'); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('Location data', $e->getMessage()); - } - } - - /** - * Ensures that localSearch() throws an exception when the sort option is invalid - * - * @return void - */ - public function testLocalSearchExceptionSortInvalid() - { - try { - $this->_yahoo->localSearch('php', array('location' => '95014', 'sort' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'sort'", $e->getMessage()); - } - } - - /** - * Ensures that newsSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testNewsSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->newsSearch('php', array('results' => 51)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that newsSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testNewsSearchExceptionStartInvalid() - { - try { - $this->_yahoo->newsSearch('php', array('start' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that newsSearch() throws an exception when the language option is invalid - * - * @return void - */ - public function testNewsSearchExceptionLanguageInvalid() - { - try { - $this->_yahoo->newsSearch('php', array('language' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('selected language', $e->getMessage()); - } - } - - /** - * Ensures that pageDataSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testPageDataSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->pageDataSearch('http://framework.zend.com/', array('results' => 101)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that pageDataSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testPageDataSearchExceptionStartInvalid() - { - try { - $this->_yahoo->pageDataSearch('http://framework.zend.com/', array('start' => 1001)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that videoSearch() throws an exception when the type option is invalid - * - * @return void - */ - public function testVideoSearchExceptionTypeInvalid() - { - try { - $this->_yahoo->videoSearch('php', array('type' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'type'", $e->getMessage()); - } - } - - /** - * Ensures that videoSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testVideoSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->videoSearch('php', array('results' => 500)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that videoSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testVideoSearchExceptionStartInvalid() - { - try { - $this->_yahoo->videoSearch('php', array('start' => 1001)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that videoSearch() throws an exception when the format option is invalid - * - * @return void - */ - public function testVideoSearchExceptionFormatInvalid() - { - try { - $this->_yahoo->videoSearch('php', array('format' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'format'", $e->getMessage()); - } - } - - /** - * Ensures that webSearch() throws an exception when the results option is invalid - * - * @return void - */ - public function testWebSearchExceptionResultsInvalid() - { - try { - $this->_yahoo->webSearch('php', array('results' => 101)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'results'", $e->getMessage()); - } - } - - /** - * Ensures that webSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testWebSearchExceptionStartInvalid() - { - try { - $this->_yahoo->webSearch('php', array('start' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'start'", $e->getMessage()); - } - } - - /** - * Ensures that webSearch() throws an exception when the start option is invalid - * - * @return void - */ - public function testWebSearchExceptionOptionInvalid() - { - try { - $this->_yahoo->webSearch('php', array('oops' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('parameters are invalid', $e->getMessage()); - } - } - - /** - * Ensures that webSearch() throws an exception when the type option is invalid - * - * @return void - */ - public function testWebSearchExceptionTypeInvalid() - { - try { - $this->_yahoo->webSearch('php', array('type' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains("option 'type'", $e->getMessage()); - } - } - - /** - * WebResult should check if the result has a Cache section or not - * - * @group ZF-3636 - */ - public function testWebResultCache(){ - // create empty result eg. without cache section - $domDoc = new DOMDocument(); - $element = $domDoc->createElement('Result'); - // this should not result in errors - $webResult = new Zend_Service_Yahoo_WebResult($element); - } -} - - -class Zend_Service_Yahoo_OfflineTest_ResultSet extends Zend_Service_Yahoo_ResultSet -{ - protected $_namespace = ''; -} diff --git a/tests/Zend/Service/Yahoo/OnlineTest.php b/tests/Zend/Service/Yahoo/OnlineTest.php deleted file mode 100644 index 4b8cf1fcaf..0000000000 --- a/tests/Zend/Service/Yahoo/OnlineTest.php +++ /dev/null @@ -1,384 +0,0 @@ -_yahoo = new Zend_Service_Yahoo(constant('TESTS_ZEND_SERVICE_YAHOO_ONLINE_APPID')); - - $this->_httpClientAdapterSocket = new Zend_Http_Client_Adapter_Socket(); - - $this->_yahoo->getRestClient() - ->getHttpClient() - ->setAdapter($this->_httpClientAdapterSocket); - } - - /** - * Ensures that inlinkDataSearch() works as expected given 'http://framework.zend.com/' as a query - * - * @return void - */ - public function testInlinkDataSearchPhp() - { - $inlinkDataResultSet = $this->_yahoo->inlinkDataSearch('http://framework.zend.com/'); - - $this->assertTrue($inlinkDataResultSet instanceof Zend_Service_Yahoo_InlinkDataResultSet); - $this->assertTrue($inlinkDataResultSet->totalResultsAvailable > 10); - $this->assertEquals(50, $inlinkDataResultSet->totalResultsReturned); - $this->assertEquals(50, $inlinkDataResultSet->totalResults()); - $this->assertEquals(1, $inlinkDataResultSet->firstResultPosition); - $this->assertEquals(0, $inlinkDataResultSet->key()); - - try { - $inlinkDataResultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - foreach ($inlinkDataResultSet as $inlinkDataResult) { - $this->assertTrue($inlinkDataResult instanceof Zend_Service_Yahoo_InlinkDataResult); - } - - $this->assertEquals(50, $inlinkDataResultSet->key()); - $inlinkDataResultSet->seek(0); - $this->assertEquals(0, $inlinkDataResultSet->key()); - } - - /** - * Ensures that imageSearch() works as expected given 'php' as a query - * - * @return void - */ - public function testImageSearchPhp() - { - $imageResultSet = $this->_yahoo->imageSearch('php'); - - $this->assertTrue($imageResultSet instanceof Zend_Service_Yahoo_ImageResultSet); - $this->assertTrue($imageResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $imageResultSet->totalResultsReturned); - $this->assertEquals(10, $imageResultSet->totalResults()); - $this->assertEquals(1, $imageResultSet->firstResultPosition); - $this->assertEquals(0, $imageResultSet->key()); - - try { - $imageResultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - foreach ($imageResultSet as $imageResult) { - $this->assertTrue($imageResult instanceof Zend_Service_Yahoo_ImageResult); - } - - $this->assertEquals(10, $imageResultSet->key()); - $imageResultSet->seek(0); - $this->assertEquals(0, $imageResultSet->key()); - } - - /** - * Ensures that imageSearch() throws an exception when the adult_ok option is invalid - * - * @return void - */ - public function testImageSearchExceptionAdultOkInvalid() - { - try { - $this->_yahoo->imageSearch('php', array('adult_ok' => -1)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('error occurred sending request', $e->getMessage()); - } - } - - /** - * Ensures that localSearch() works as expected when searching for restaurants in ZIP 95014 - * - * @return void - */ - public function testLocalSearchRestaurants() - { - $localResultSet = $this->_yahoo->localSearch('restaurants', array('zip' => '95014')); - - $this->assertTrue($localResultSet instanceof Zend_Service_Yahoo_LocalResultSet); - - $this->assertTrue($localResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $localResultSet->totalResultsReturned); - $this->assertEquals(10, $localResultSet->totalResults()); - $this->assertEquals(1, $localResultSet->firstResultPosition); - - foreach ($localResultSet as $localResult) { - $this->assertTrue($localResult instanceof Zend_Service_Yahoo_LocalResult); - } - } - - /** - * Ensures that localSearch() throws an exception when the radius option is invalid - * - * @return void - */ - public function testLocalSearchExceptionRadiusInvalid() - { - try { - $this->_yahoo->localSearch('php', array('zip' => '95014', 'radius' => -1)); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('error occurred sending request', $e->getMessage()); - } - } - - /** - * Ensures that newsSearch() works as expected when searching for 'php' - * - * @return void - */ - public function testNewsSearchPhp() - { - $newsResultSet = $this->_yahoo->newsSearch('php'); - - $this->assertTrue($newsResultSet instanceof Zend_Service_Yahoo_NewsResultSet); - - $this->assertTrue($newsResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $newsResultSet->totalResultsReturned); - $this->assertEquals(10, $newsResultSet->totalResults()); - $this->assertEquals(1, $newsResultSet->firstResultPosition); - - foreach ($newsResultSet as $newsResult) { - $this->assertTrue($newsResult instanceof Zend_Service_Yahoo_NewsResult); - } - } - - /** - * Ensures that pageDataSearch() works as expected given 'http://framework.zend.com/' as a query - * - * @return void - */ - public function testPageDataSearchPhp() - { - $pageDataResultSet = $this->_yahoo->pageDataSearch('http://framework.zend.com/'); - - $this->assertTrue($pageDataResultSet instanceof Zend_Service_Yahoo_PageDataResultSet); - $this->assertTrue($pageDataResultSet->totalResultsAvailable > 10); - $this->assertEquals(50, $pageDataResultSet->totalResultsReturned); - $this->assertEquals(50, $pageDataResultSet->totalResults()); - $this->assertEquals(1, $pageDataResultSet->firstResultPosition); - $this->assertEquals(0, $pageDataResultSet->key()); - - try { - $pageDataResultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - foreach ($pageDataResultSet as $pageDataResult) { - $this->assertTrue($pageDataResult instanceof Zend_Service_Yahoo_PageDataResult); - } - - $this->assertEquals(50, $pageDataResultSet->key()); - $pageDataResultSet->seek(0); - $this->assertEquals(0, $pageDataResultSet->key()); - } - - /** - * Ensures that videoSearch() works as expected given 'php' as a query - * - * @return void - */ - public function testVideoSearchPhp() - { - $videoResultSet = $this->_yahoo->videoSearch('php'); - - $this->assertTrue($videoResultSet instanceof Zend_Service_Yahoo_VideoResultSet); - $this->assertTrue($videoResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $videoResultSet->totalResultsReturned); - $this->assertEquals(10, $videoResultSet->totalResults()); - $this->assertEquals(1, $videoResultSet->firstResultPosition); - $this->assertEquals(0, $videoResultSet->key()); - - try { - $videoResultSet->seek(-1); - $this->fail('Expected OutOfBoundsException not thrown'); - } catch (OutOfBoundsException $e) { - $this->assertContains('Illegal index', $e->getMessage()); - } - - foreach ($videoResultSet as $videoResult) { - $this->assertTrue($videoResult instanceof Zend_Service_Yahoo_VideoResult); - } - - $this->assertEquals(10, $videoResultSet->key()); - $videoResultSet->seek(0); - $this->assertEquals(0, $videoResultSet->key()); - } - - /** - * Ensures that webSearch() works as expected when searching for 'php' - * - * @return void - */ - public function testWebSearchPhp() - { - $webResultSet = $this->_yahoo->webSearch('php'); - - $this->assertTrue($webResultSet instanceof Zend_Service_Yahoo_WebResultSet); - - $this->assertTrue($webResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $webResultSet->totalResultsReturned); - $this->assertEquals(10, $webResultSet->totalResults()); - $this->assertEquals(1, $webResultSet->firstResultPosition); - - foreach ($webResultSet as $webResult) { - $this->assertTrue($webResult instanceof Zend_Service_Yahoo_WebResult); - } - } - - /** - * Ensures that webSearch() throws an exception when the adult_ok option is invalid - * - * @return void - */ - public function testWebSearchExceptionAdultOkInvalid() - { - try { - $this->_yahoo->webSearch('php', array('adult_ok' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('error occurred sending request', $e->getMessage()); - } - } - - /** - * Ensures that webSearch() throws an exception when the similar_ok option is invalid - * - * @return void - */ - public function testWebSearchExceptionSimilarOkInvalid() - { - try { - $this->_yahoo->webSearch('php', array('similar_ok' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - } catch (Zend_Service_Exception $e) { - $this->assertContains('error occurred sending request', $e->getMessage()); - } - } - - /** - * Check support for the region option and ensure that it throws an exception - * for unsupported regions - * - * @group ZF-3222 - * @return void - */ - public function testWebSearchRegion() - { - $this->_yahoo->webSearch('php', array('region' => 'nl')); - try { - $this->_yahoo->webSearch('php', array('region' => 'oops')); - $this->fail('Expected Zend_Service_Exception not thrown'); - }catch (Zend_Service_Exception $e) { - $this->assertContains("Invalid value for option 'region': oops", $e->getMessage()); - } - } - - /** - * Ensures that webSearch() works as expected when searching for 'php' - * - * @see ZF-2358 - */ - public function testWebSearchForSite() - { - $webResultSet = $this->_yahoo->webSearch('php', array('site' => 'www.php.net')); - - $this->assertTrue($webResultSet instanceof Zend_Service_Yahoo_WebResultSet); - - $this->assertTrue($webResultSet->totalResultsAvailable > 10); - $this->assertEquals(10, $webResultSet->totalResultsReturned); - $this->assertEquals(10, $webResultSet->totalResults()); - $this->assertEquals(1, $webResultSet->firstResultPosition); - - foreach ($webResultSet as $webResult) { - $this->assertTrue($webResult instanceof Zend_Service_Yahoo_WebResult); - } - } -} - -/** - * @category Zend - * @package Zend_Service_Yahoo - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Service - * @group Zend_Service_Yahoo - */ -class Zend_Service_Yahoo_OnlineTest_Skip extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Service_Yahoo online tests not enabled with an APPID in TestConfiguration.php'); - } - - public function testNothing() - { - } -} From a4db4c53e8ad4a0be166fe0fa6bcbb744a06c9e4 Mon Sep 17 00:00:00 2001 From: Joan He Date: Thu, 5 Apr 2018 12:28:43 -0500 Subject: [PATCH 03/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Captcha --- library/Zend/Captcha/Adapter.php | 76 ---- library/Zend/Captcha/Base.php | 176 -------- library/Zend/Captcha/Dumb.php | 75 ---- library/Zend/Captcha/Exception.php | 37 -- library/Zend/Captcha/Figlet.php | 84 ---- library/Zend/Captcha/Image.php | 625 --------------------------- library/Zend/Captcha/ReCaptcha.php | 280 ------------ library/Zend/Captcha/Word.php | 424 ------------------ tests/Zend/Captcha/AllTests.php | 62 --- tests/Zend/Captcha/DumbTest.php | 171 -------- tests/Zend/Captcha/FigletTest.php | 363 ---------------- tests/Zend/Captcha/ImageTest.php | 412 ------------------ tests/Zend/Captcha/ReCaptchaTest.php | 254 ----------- 13 files changed, 3039 deletions(-) delete mode 100644 library/Zend/Captcha/Adapter.php delete mode 100644 library/Zend/Captcha/Base.php delete mode 100644 library/Zend/Captcha/Dumb.php delete mode 100755 library/Zend/Captcha/Exception.php delete mode 100644 library/Zend/Captcha/Figlet.php delete mode 100644 library/Zend/Captcha/Image.php delete mode 100644 library/Zend/Captcha/ReCaptcha.php delete mode 100644 library/Zend/Captcha/Word.php delete mode 100644 tests/Zend/Captcha/AllTests.php delete mode 100644 tests/Zend/Captcha/DumbTest.php delete mode 100644 tests/Zend/Captcha/FigletTest.php delete mode 100644 tests/Zend/Captcha/ImageTest.php delete mode 100644 tests/Zend/Captcha/ReCaptchaTest.php diff --git a/library/Zend/Captcha/Adapter.php b/library/Zend/Captcha/Adapter.php deleted file mode 100644 index 70835f9fde..0000000000 --- a/library/Zend/Captcha/Adapter.php +++ /dev/null @@ -1,76 +0,0 @@ -_name; - } - - /** - * Set name - * - * @param string $name - * @return Zend_Captcha_Adapter - */ - public function setName($name) - { - $this->_name = $name; - return $this; - } - - /** - * Constructor - * - * @param array|Zend_Config $options - */ - public function __construct($options = null) - { - // Set options - if (is_array($options)) { - $this->setOptions($options); - } else if ($options instanceof Zend_Config) { - $this->setConfig($options); - } - } - - /** - * Set single option for the object - * - * @param string $key - * @param string $value - * @return Zend_Form_Element - */ - public function setOption($key, $value) - { - if (in_array(strtolower($key), $this->_skipOptions)) { - return $this; - } - - $method = 'set' . ucfirst ($key); - if (method_exists ($this, $method)) { - // Setter exists; use it - $this->$method ($value); - $this->_options[$key] = $value; - } elseif (property_exists($this, $key)) { - // Assume it's metadata - $this->$key = $value; - $this->_options[$key] = $value; - } - return $this; - } - - /** - * Set object state from options array - * - * @param array $options - * @return Zend_Form_Element - */ - public function setOptions($options = null) - { - foreach ($options as $key => $value) { - $this->setOption($key, $value); - } - return $this; - } - - /** - * Retrieve options representing object state - * - * @return array - */ - public function getOptions() - { - return $this->_options; - } - - /** - * Set object state from config object - * - * @param Zend_Config $config - * @return Zend_Captcha_Base - */ - public function setConfig(Zend_Config $config) - { - return $this->setOptions($config->toArray()); - } - - /** - * Get optional decorator - * - * By default, return null, indicating no extra decorator needed. - * - * @return null - */ - public function getDecorator() - { - return null; - } -} diff --git a/library/Zend/Captcha/Dumb.php b/library/Zend/Captcha/Dumb.php deleted file mode 100644 index 803f15e3d5..0000000000 --- a/library/Zend/Captcha/Dumb.php +++ /dev/null @@ -1,75 +0,0 @@ -_label = $label; - } - - /** - * Retrieve the label for the CAPTCHA - * @return string - */ - public function getLabel() - { - return $this->_label; - } - /** - * Render the captcha - * - * @param Zend_View_Interface $view - * @param mixed $element - * @return string - */ - public function render(Zend_View_Interface $view = null, $element = null) - { - return $this->getLabel() . ': ' - . strrev($this->getWord()) - . ''; - } -} diff --git a/library/Zend/Captcha/Exception.php b/library/Zend/Captcha/Exception.php deleted file mode 100755 index 71d7555883..0000000000 --- a/library/Zend/Captcha/Exception.php +++ /dev/null @@ -1,37 +0,0 @@ -_figlet = new Zend_Text_Figlet($options); - } - - /** - * Generate new captcha - * - * @return string - */ - public function generate() - { - $this->_useNumbers = false; - return parent::generate(); - } - - /** - * Display the captcha - * - * @param Zend_View_Interface $view - * @param mixed $element - * @return string - */ - public function render(Zend_View_Interface $view = null, $element = null) - { - return '

    '
    -             . $this->_figlet->render($this->getWord())
    -             . "
    \n"; - } -} diff --git a/library/Zend/Captcha/Image.php b/library/Zend/Captcha/Image.php deleted file mode 100644 index 542d56926b..0000000000 --- a/library/Zend/Captcha/Image.php +++ /dev/null @@ -1,625 +0,0 @@ -_imgAlt; - } - /** - * @return string - */ - public function getStartImage () - { - return $this->_startImage; - } - /** - * @return int - */ - public function getDotNoiseLevel () - { - return $this->_dotNoiseLevel; - } - /** - * @return int - */ - public function getLineNoiseLevel () - { - return $this->_lineNoiseLevel; - } - /** - * Get captcha expiration - * - * @return int - */ - public function getExpiration() - { - return $this->_expiration; - } - - /** - * Get garbage collection frequency - * - * @return int - */ - public function getGcFreq() - { - return $this->_gcFreq; - } - /** - * Get font to use when generating captcha - * - * @return string - */ - public function getFont() - { - return $this->_font; - } - - /** - * Get font size - * - * @return int - */ - public function getFontSize() - { - return $this->_fsize; - } - - /** - * Get captcha image height - * - * @return int - */ - public function getHeight() - { - return $this->_height; - } - - /** - * Get captcha image directory - * - * @return string - */ - public function getImgDir() - { - return $this->_imgDir; - } - /** - * Get captcha image base URL - * - * @return string - */ - public function getImgUrl() - { - return $this->_imgUrl; - } - /** - * Get captcha image file suffix - * - * @return string - */ - public function getSuffix() - { - return $this->_suffix; - } - /** - * Get captcha image width - * - * @return int - */ - public function getWidth() - { - return $this->_width; - } - - /** - * Set start image - * - * @param string $startImage - * @return Zend_Captcha_Image - */ - public function setStartImage ($startImage) - { - $this->_startImage = $startImage; - return $this; - } - - /** - * Set dot noise level - * - * @param int $dotNoiseLevel - * @return Zend_Captcha_Image - */ - public function setDotNoiseLevel ($dotNoiseLevel) - { - $this->_dotNoiseLevel = $dotNoiseLevel; - return $this; - } - - /** - * Set line noise level - * - * @param int $lineNoiseLevel - * @return Zend_Captcha_Image - */ - public function setLineNoiseLevel ($lineNoiseLevel) - { - $this->_lineNoiseLevel = $lineNoiseLevel; - return $this; - } - - /** - * Set captcha expiration - * - * @param int $expiration - * @return Zend_Captcha_Image - */ - public function setExpiration($expiration) - { - $this->_expiration = $expiration; - return $this; - } - - /** - * Set garbage collection frequency - * - * @param int $gcFreq - * @return Zend_Captcha_Image - */ - public function setGcFreq($gcFreq) - { - $this->_gcFreq = $gcFreq; - return $this; - } - - /** - * Set captcha font - * - * @param string $font - * @return Zend_Captcha_Image - */ - public function setFont($font) - { - $this->_font = $font; - return $this; - } - - /** - * Set captcha font size - * - * @param int $fsize - * @return Zend_Captcha_Image - */ - public function setFontSize($fsize) - { - $this->_fsize = $fsize; - return $this; - } - - /** - * Set captcha image height - * - * @param int $height - * @return Zend_Captcha_Image - */ - public function setHeight($height) - { - $this->_height = $height; - return $this; - } - - /** - * Set captcha image storage directory - * - * @param string $imgDir - * @return Zend_Captcha_Image - */ - public function setImgDir($imgDir) - { - $this->_imgDir = rtrim($imgDir, "/\\") . '/'; - return $this; - } - - /** - * Set captcha image base URL - * - * @param string $imgUrl - * @return Zend_Captcha_Image - */ - public function setImgUrl($imgUrl) - { - $this->_imgUrl = rtrim($imgUrl, "/\\") . '/'; - return $this; - } - - /** - * Set image alternative text - * - * @param string $imgAlt - * @return Zend_Captcha_Image - */ - public function setImgAlt ($imgAlt) - { - $this->_imgAlt = $imgAlt; - return $this; - } - - /** - * Set captch image filename suffix - * - * @param string $suffix - * @return Zend_Captcha_Image - */ - public function setSuffix($suffix) - { - $this->_suffix = $suffix; - return $this; - } - - /** - * Set captcha image width - * - * @param int $width - * @return Zend_Captcha_Image - */ - public function setWidth($width) - { - $this->_width = $width; - return $this; - } - - /** - * Generate random frequency - * - * @return float - */ - protected function _randomFreq() - { - return mt_rand(700000, 1000000) / 15000000; - } - - /** - * Generate random phase - * - * @return float - */ - protected function _randomPhase() - { - // random phase from 0 to pi - return mt_rand(0, 3141592) / 1000000; - } - - /** - * Generate random character size - * - * @return int - */ - protected function _randomSize() - { - return mt_rand(300, 700) / 100; - } - - /** - * Generate captcha - * - * @return string captcha ID - */ - public function generate() - { - $id = parent::generate(); - $tries = 5; - // If there's already such file, try creating a new ID - while($tries-- && file_exists($this->getImgDir() . $id . $this->getSuffix())) { - $id = $this->_generateRandomId(); - $this->_setId($id); - } - $this->_generateImage($id, $this->getWord()); - - if (mt_rand(1, $this->getGcFreq()) == 1) { - $this->_gc(); - } - return $id; - } - - /** - * Generate image captcha - * - * Override this function if you want different image generator - * Wave transform from http://www.captcha.ru/captchas/multiwave/ - * - * @param string $id Captcha ID - * @param string $word Captcha word - * @throws Zend_Captcha_Exception - */ - protected function _generateImage($id, $word) - { - if (!extension_loaded("gd")) { - #require_once 'Zend/Captcha/Exception.php'; - throw new Zend_Captcha_Exception("Image CAPTCHA requires GD extension"); - } - - if (!function_exists("imagepng")) { - #require_once 'Zend/Captcha/Exception.php'; - throw new Zend_Captcha_Exception("Image CAPTCHA requires PNG support"); - } - - if (!function_exists("imageftbbox")) { - #require_once 'Zend/Captcha/Exception.php'; - throw new Zend_Captcha_Exception("Image CAPTCHA requires FT fonts support"); - } - - $font = $this->getFont(); - - if (empty($font)) { - #require_once 'Zend/Captcha/Exception.php'; - throw new Zend_Captcha_Exception("Image CAPTCHA requires font"); - } - - $w = $this->getWidth(); - $h = $this->getHeight(); - $fsize = $this->getFontSize(); - - $img_file = $this->getImgDir() . $id . $this->getSuffix(); - if(empty($this->_startImage)) { - $img = imagecreatetruecolor($w, $h); - } else { - $img = imagecreatefrompng($this->_startImage); - if(!$img) { - #require_once 'Zend/Captcha/Exception.php'; - throw new Zend_Captcha_Exception("Can not load start image"); - } - $w = imagesx($img); - $h = imagesy($img); - } - $text_color = imagecolorallocate($img, 0, 0, 0); - $bg_color = imagecolorallocate($img, 255, 255, 255); - imagefilledrectangle($img, 0, 0, $w-1, $h-1, $bg_color); - $textbox = imageftbbox($fsize, 0, $font, $word); - $x = ($w - ($textbox[2] - $textbox[0])) / 2; - $y = ($h - ($textbox[7] - $textbox[1])) / 2; - imagefttext($img, $fsize, 0, $x, $y, $text_color, $font, $word); - - // generate noise - for ($i=0; $i<$this->_dotNoiseLevel; $i++) { - imagefilledellipse($img, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); - } - for($i=0; $i<$this->_lineNoiseLevel; $i++) { - imageline($img, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); - } - - // transformed image - $img2 = imagecreatetruecolor($w, $h); - $bg_color = imagecolorallocate($img2, 255, 255, 255); - imagefilledrectangle($img2, 0, 0, $w-1, $h-1, $bg_color); - // apply wave transforms - $freq1 = $this->_randomFreq(); - $freq2 = $this->_randomFreq(); - $freq3 = $this->_randomFreq(); - $freq4 = $this->_randomFreq(); - - $ph1 = $this->_randomPhase(); - $ph2 = $this->_randomPhase(); - $ph3 = $this->_randomPhase(); - $ph4 = $this->_randomPhase(); - - $szx = $this->_randomSize(); - $szy = $this->_randomSize(); - - for ($x = 0; $x < $w; $x++) { - for ($y = 0; $y < $h; $y++) { - $sx = $x + (sin($x*$freq1 + $ph1) + sin($y*$freq3 + $ph3)) * $szx; - $sy = $y + (sin($x*$freq2 + $ph2) + sin($y*$freq4 + $ph4)) * $szy; - - if ($sx < 0 || $sy < 0 || $sx >= $w - 1 || $sy >= $h - 1) { - continue; - } else { - $color = (imagecolorat($img, $sx, $sy) >> 16) & 0xFF; - $color_x = (imagecolorat($img, $sx + 1, $sy) >> 16) & 0xFF; - $color_y = (imagecolorat($img, $sx, $sy + 1) >> 16) & 0xFF; - $color_xy = (imagecolorat($img, $sx + 1, $sy + 1) >> 16) & 0xFF; - } - if ($color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) { - // ignore background - continue; - } elseif ($color == 0 && $color_x == 0 && $color_y == 0 && $color_xy == 0) { - // transfer inside of the image as-is - $newcolor = 0; - } else { - // do antialiasing for border items - $frac_x = $sx-floor($sx); - $frac_y = $sy-floor($sy); - $frac_x1 = 1-$frac_x; - $frac_y1 = 1-$frac_y; - - $newcolor = $color * $frac_x1 * $frac_y1 - + $color_x * $frac_x * $frac_y1 - + $color_y * $frac_x1 * $frac_y - + $color_xy * $frac_x * $frac_y; - } - imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newcolor, $newcolor, $newcolor)); - } - } - - // generate noise - for ($i=0; $i<$this->_dotNoiseLevel; $i++) { - imagefilledellipse($img2, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); - } - for ($i=0; $i<$this->_lineNoiseLevel; $i++) { - imageline($img2, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); - } - - imagepng($img2, $img_file); - imagedestroy($img); - imagedestroy($img2); - } - - /** - * Remove old files from image directory - */ - protected function _gc() - { - $expire = time() - $this->getExpiration(); - $imgdir = $this->getImgDir(); - if(!$imgdir || strlen($imgdir) < 2) { - // safety guard - return; - } - $suffixLength = strlen($this->_suffix); - foreach (new DirectoryIterator($imgdir) as $file) { - if (!$file->isDot() && !$file->isDir()) { - if (file_exists($file->getPathname()) && $file->getMTime() < $expire) { - // only deletes files ending with $this->_suffix - if (substr($file->getFilename(), -($suffixLength)) == $this->_suffix) { - unlink($file->getPathname()); - } - } - } - } - } - - /** - * Display the captcha - * - * @param Zend_View_Interface $view - * @param mixed $element - * @return string - */ - public function render(Zend_View_Interface $view = null, $element = null) - { - $endTag = ' />'; - if (($view instanceof Zend_View_Abstract) && !$view->doctype()->isXhtml()) { - $endTag = '>'; - } - return '' . $this->getImgAlt()
-             . ' 'Missing captcha fields', - self::ERR_CAPTCHA => 'Failed to validate captcha', - self::BAD_CAPTCHA => 'Captcha value is wrong: %value%', - ); - - /** - * Retrieve ReCaptcha Private key - * - * @return string - */ - public function getPrivkey() - { - return $this->getService()->getPrivateKey(); - } - - /** - * Retrieve ReCaptcha Public key - * - * @return string - */ - public function getPubkey() - { - return $this->getService()->getPublicKey(); - } - - /** - * Set ReCaptcha Private key - * - * @param string $privkey - * @return Zend_Captcha_ReCaptcha - */ - public function setPrivkey($privkey) - { - $this->getService()->setPrivateKey($privkey); - return $this; - } - - /** - * Set ReCaptcha public key - * - * @param string $pubkey - * @return Zend_Captcha_ReCaptcha - */ - public function setPubkey($pubkey) - { - $this->getService()->setPublicKey($pubkey); - return $this; - } - - /** - * Constructor - * - * @param array|Zend_Config $options - */ - public function __construct($options = null) - { - $this->setService(new Zend_Service_ReCaptcha()); - $this->_serviceParams = $this->getService()->getParams(); - $this->_serviceOptions = $this->getService()->getOptions(); - - parent::__construct($options); - - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } - if (!empty($options)) { - $this->setOptions($options); - } - } - - /** - * Set service object - * - * @param Zend_Service_ReCaptcha $service - * @return Zend_Captcha_ReCaptcha - */ - public function setService(Zend_Service_ReCaptcha $service) - { - $this->_service = $service; - return $this; - } - - /** - * Retrieve ReCaptcha service object - * - * @return Zend_Service_ReCaptcha - */ - public function getService() - { - return $this->_service; - } - - /** - * Set option - * - * If option is a service parameter, proxies to the service. The same - * goes for any service options (distinct from service params) - * - * @param string $key - * @param mixed $value - * @return Zend_Captcha_ReCaptcha - */ - public function setOption($key, $value) - { - $service = $this->getService(); - if (isset($this->_serviceParams[$key])) { - $service->setParam($key, $value); - return $this; - } - if (isset($this->_serviceOptions[$key])) { - $service->setOption($key, $value); - return $this; - } - return parent::setOption($key, $value); - } - - /** - * Generate captcha - * - * @see Zend_Form_Captcha_Adapter::generate() - * @return string - */ - public function generate() - { - return ""; - } - - /** - * Validate captcha - * - * @see Zend_Validate_Interface::isValid() - * @param mixed $value - * @param array|null $context - * @return boolean - */ - public function isValid($value, $context = null) - { - if (!is_array($value) && !is_array($context)) { - $this->_error(self::MISSING_VALUE); - return false; - } - - if (!is_array($value) && is_array($context)) { - $value = $context; - } - - if (empty($value[$this->_CHALLENGE]) || empty($value[$this->_RESPONSE])) { - $this->_error(self::MISSING_VALUE); - return false; - } - - $service = $this->getService(); - - $res = $service->verify($value[$this->_CHALLENGE], $value[$this->_RESPONSE]); - - if (!$res) { - $this->_error(self::ERR_CAPTCHA); - return false; - } - - if (!$res->isValid()) { - $this->_error(self::BAD_CAPTCHA, $res->getErrorCode()); - $service->setParam('error', $res->getErrorCode()); - return false; - } - - return true; - } - - /** - * Render captcha - * - * @param Zend_View_Interface $view - * @param mixed $element - * @return string - */ - public function render(Zend_View_Interface $view = null, $element = null) - { - $name = null; - if ($element instanceof Zend_Form_Element) { - $name = $element->getBelongsTo(); - } - return $this->getService()->getHTML($name); - } - - /** - * Get captcha decorator - * - * @return string - */ - public function getDecorator() - { - return "Captcha_ReCaptcha"; - } -} diff --git a/library/Zend/Captcha/Word.php b/library/Zend/Captcha/Word.php deleted file mode 100644 index 528bcc2eac..0000000000 --- a/library/Zend/Captcha/Word.php +++ /dev/null @@ -1,424 +0,0 @@ - 'Empty captcha value', - self::MISSING_ID => 'Captcha ID field is missing', - self::BAD_CAPTCHA => 'Captcha value is wrong', - ); - - /** - * Length of the word to generate - * - * @var integer - */ - protected $_wordlen = 8; - - /** - * Retrieve session class to utilize - * - * @return string - */ - public function getSessionClass() - { - return $this->_sessionClass; - } - - /** - * Set session class for persistence - * - * @param string $_sessionClass - * @return Zend_Captcha_Word - */ - public function setSessionClass($_sessionClass) - { - $this->_sessionClass = $_sessionClass; - return $this; - } - - /** - * Retrieve word length to use when genrating captcha - * - * @return integer - */ - public function getWordlen() - { - return $this->_wordlen; - } - - /** - * Set word length of captcha - * - * @param integer $wordlen - * @return Zend_Captcha_Word - */ - public function setWordlen($wordlen) - { - $this->_wordlen = $wordlen; - return $this; - } - - /** - * Retrieve captcha ID - * - * @return string - */ - public function getId() - { - if (null === $this->_id) { - $this->_setId($this->_generateRandomId()); - } - return $this->_id; - } - - /** - * Set captcha identifier - * - * @param string $id - * @return Zend_Captcha_Word - */ - protected function _setId($id) - { - $this->_id = $id; - return $this; - } - - /** - * Set timeout for session token - * - * @param int $ttl - * @return Zend_Captcha_Word - */ - public function setTimeout($ttl) - { - $this->_timeout = (int) $ttl; - return $this; - } - - /** - * Get session token timeout - * - * @return int - */ - public function getTimeout() - { - return $this->_timeout; - } - - /** - * Sets if session should be preserved on generate() - * - * @param bool $keepSession Should session be kept on generate()? - * @return Zend_Captcha_Word - */ - public function setKeepSession($keepSession) - { - $this->_keepSession = $keepSession; - return $this; - } - - /** - * Numbers should be included in the pattern? - * - * @return bool - */ - public function getUseNumbers() - { - return $this->_useNumbers; - } - - /** - * Set if numbers should be included in the pattern - * - * @param bool $_useNumbers numbers should be included in the pattern? - * @return Zend_Captcha_Word - */ - public function setUseNumbers($_useNumbers) - { - $this->_useNumbers = $_useNumbers; - return $this; - } - - /** - * Get session object - * - * @return Zend_Session_Namespace - */ - public function getSession() - { - if (!isset($this->_session) || (null === $this->_session)) { - $id = $this->getId(); - if (!class_exists($this->_sessionClass)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($this->_sessionClass); - } - $this->_session = new $this->_sessionClass('Zend_Form_Captcha_' . $id); - $this->_session->setExpirationHops(1, null, true); - $this->_session->setExpirationSeconds($this->getTimeout()); - } - return $this->_session; - } - - /** - * Set session namespace object - * - * @param Zend_Session_Namespace $session - * @return Zend_Captcha_Word - */ - public function setSession(Zend_Session_Namespace $session) - { - $this->_session = $session; - if ($session) { - $this->_keepSession = true; - } - return $this; - } - - /** - * Get captcha word - * - * @return string - */ - public function getWord() - { - if (empty($this->_word)) { - $session = $this->getSession(); - $this->_word = $session->word; - } - return $this->_word; - } - - /** - * Set captcha word - * - * @param string $word - * @return Zend_Captcha_Word - */ - protected function _setWord($word) - { - $session = $this->getSession(); - $session->word = $word; - $this->_word = $word; - return $this; - } - - /** - * Generate new random word - * - * @return string - */ - protected function _generateWord() - { - $word = ''; - $wordLen = $this->getWordLen(); - $vowels = $this->_useNumbers ? self::$VN : self::$V; - $consonants = $this->_useNumbers ? self::$CN : self::$C; - - $totIndexCon = count($consonants) - 1; - $totIndexVow = count($vowels) - 1; - for ($i=0; $i < $wordLen; $i = $i + 2) { - // generate word with mix of vowels and consonants - $consonant = $consonants[Zend_Crypt_Math::randInteger(0, $totIndexCon, true)]; - $vowel = $vowels[Zend_Crypt_Math::randInteger(0, $totIndexVow, true)]; - $word .= $consonant . $vowel; - } - - if (strlen($word) > $wordLen) { - $word = substr($word, 0, $wordLen); - } - - return $word; - } - - /** - * Generate new session ID and new word - * - * @return string session ID - */ - public function generate() - { - if (!$this->_keepSession) { - $this->_session = null; - } - $id = $this->_generateRandomId(); - $this->_setId($id); - $word = $this->_generateWord(); - $this->_setWord($word); - return $id; - } - - protected function _generateRandomId() - { - return md5(Zend_Crypt_Math::randBytes(32)); - } - - /** - * Validate the word - * - * @see Zend_Validate_Interface::isValid() - * @param mixed $value - * @param array|null $context - * @return boolean - */ - public function isValid($value, $context = null) - { - if (!is_array($value) && !is_array($context)) { - $this->_error(self::MISSING_VALUE); - return false; - } - if (!is_array($value) && is_array($context)) { - $value = $context; - } - - $name = $this->getName(); - - if (isset($value[$name])) { - $value = $value[$name]; - } - - if (!isset($value['input'])) { - $this->_error(self::MISSING_VALUE); - return false; - } - $input = strtolower($value['input']); - $this->_setValue($input); - - if (!isset($value['id'])) { - $this->_error(self::MISSING_ID); - return false; - } - - $this->_id = $value['id']; - if ($input !== $this->getWord()) { - $this->_error(self::BAD_CAPTCHA); - return false; - } - - return true; - } - - /** - * Get captcha decorator - * - * @return string - */ - public function getDecorator() - { - return "Captcha_Word"; - } -} diff --git a/tests/Zend/Captcha/AllTests.php b/tests/Zend/Captcha/AllTests.php deleted file mode 100644 index cff2d9f266..0000000000 --- a/tests/Zend/Captcha/AllTests.php +++ /dev/null @@ -1,62 +0,0 @@ -addTestSuite('Zend_Captcha_DumbTest'); - $suite->addTestSuite('Zend_Captcha_FigletTest'); - $suite->addTestSuite('Zend_Captcha_ImageTest'); - $suite->addTestSuite('Zend_Captcha_ReCaptchaTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Captcha_AllTests::main') { - Zend_Captcha_AllTests::main(); -} diff --git a/tests/Zend/Captcha/DumbTest.php b/tests/Zend/Captcha/DumbTest.php deleted file mode 100644 index 31cc3a4929..0000000000 --- a/tests/Zend/Captcha/DumbTest.php +++ /dev/null @@ -1,171 +0,0 @@ -word)) { - unset($this->word); - } - - $this->element = new Zend_Form_Element_Captcha( - 'captchaD', - array( - 'captcha' => array( - 'Dumb', - 'sessionClass' => 'Zend_Captcha_DumbTest_SessionContainer' - ) - ) - ); - $this->captcha = $this->element->getCaptcha(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testRendersWordInReverse() - { - $id = $this->captcha->generate('test'); - $word = $this->captcha->getWord(); - $html = $this->captcha->render(new Zend_View); - $this->assertContains(strrev($word), $html); - $this->assertNotContains($word, $html); - } - - /** - * @group ZF-11522 - */ - public function testDefaultLabelIsUsedWhenNoAlternateLabelSet() - { - $this->assertEquals('Please type this word backwards', $this->captcha->getLabel()); - } - - /** - * @group ZF-11522 - */ - public function testChangeLabelViaSetterMethod() - { - $this->captcha->setLabel('Testing'); - $this->assertEquals('Testing', $this->captcha->getLabel()); - } - - /** - * @group ZF-11522 - */ - public function testRendersLabelUsingProvidedValue() - { - $this->captcha->setLabel('Testing 123'); - - $id = $this->captcha->generate('test'); - $html = $this->captcha->render(new Zend_View); - $this->assertContains('Testing 123', $html); - } -} - -class Zend_Captcha_DumbTest_SessionContainer -{ - protected static $_word; - - public function __get($name) - { - if ('word' == $name) { - return self::$_word; - } - - return null; - } - - public function __set($name, $value) - { - if ('word' == $name) { - self::$_word = $value; - } else { - $this->$name = $value; - } - } - - public function __isset($name) - { - if (('word' == $name) && (null !== self::$_word)) { - return true; - } - - return false; - } - - public function __call($method, $args) - { - switch ($method) { - case 'setExpirationHops': - case 'setExpirationSeconds': - $this->$method = array_shift($args); - break; - default: - } - } -} - -// Call Zend_Captcha_DumbTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Captcha_DumbTest::main") { - Zend_Captcha_DumbTest::main(); -} diff --git a/tests/Zend/Captcha/FigletTest.php b/tests/Zend/Captcha/FigletTest.php deleted file mode 100644 index ab0306e163..0000000000 --- a/tests/Zend/Captcha/FigletTest.php +++ /dev/null @@ -1,363 +0,0 @@ -word)) { - unset($this->word); - } - - $this->element = new Zend_Form_Element_Captcha( - 'captchaF', - array( - 'captcha' => array( - 'Figlet', - 'sessionClass' => 'Zend_Captcha_FigletTest_SessionContainer' - ) - ) - ); - $this->captcha = $this->element->getCaptcha(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testCaptchaAdapterCreated() - { - $this->assertTrue($this->element->getCaptcha() instanceof Zend_Captcha_Adapter); - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testCaptchaIsRendered() - { - $html = $this->element->render($this->getView()); - $this->assertContains($this->element->getName(), $html); - } - - public function testCaptchaHasIdAndInput() - { - $html = $this->element->render($this->getView()); - $expect = sprintf('type="hidden" name="%s\[id\]" value="%s"', $this->element->getName(), $this->captcha->getId()); - $this->assertRegexp("/]*?$expect/", $html, $html); - $expect = sprintf('type="text" name="%s\[input\]"', $this->element->getName()); - $this->assertRegexp("/]*?$expect/", $html, $html); - } - - /* - * @group ZF-8268 - */ - public function testLabelIdIsCorrect() - { - require_once 'Zend/Form.php'; - $form = new Zend_Form(); - $form->setElementsBelongTo('comment'); - $this->element->setLabel("My Captcha"); - $form->addElement($this->element); - $html = $form->render($this->getView()); - $expect = sprintf('for="comment-%s-input"', $this->element->getName()); - $this->assertRegexp("/

  • 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

    ', - 'markupListItemStart' => '
    ', - 'markupListStart' => '
    ', - ); - $this->decorator->setOptions($options); - foreach ($options as $key => $value) { - if ($key == 'ignoreSubForms') { - $this->assertTrue($this->decorator->ignoreSubForms()); - } else { - $method = 'get' . ucfirst($key); - $this->assertEquals($value, $this->decorator->$method()); - } - } - } - - public function testMarkupOptionsShouldBeUsedWhenRendering() - { - $options = array( - 'ignoreSubForms' => true, - 'markupElementLabelEnd' => '', - 'markupElementLabelStart' => '', - 'markupListEnd' => '', - 'markupListItemEnd' => '

    ', - 'markupListItemStart' => '

    ', - 'markupListStart' => '

    ', - ); - $this->setupForm(); - $this->decorator->setOptions($options); - $markup = $this->decorator->render(''); - foreach ($options as $key => $value) { - if ($key == 'ignoreSubForms') { - $this->assertNotContains('Sub ', $markup); - } else { - $this->assertContains($value, $markup); - } - } - } - - public function testRenderIsArrayForm() - { - $this->setupForm(); - $this->form->setName('foo') - ->setIsArray(true); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertContains($content, $test); - foreach ($this->form->getMessages() as $name => $messages) { - while (($message = current($messages))) { - if (is_string($message)) { - $this->assertContains($message, $test, var_export($messages, 1)); - } - if (false === next($messages) && is_array(prev($messages))) { - $messages = current($messages); - } - } - } - } - - public function testCustomFormErrors() - { - $this->setupForm(); - $this->form->addDecorator($this->decorator) - ->addError('form-badness'); - $html = $this->form->render(); - $this->assertContains('form-badness', $html); - - $this->decorator->setOnlyCustomFormErrors(true); - $html = $this->form->render(); - $this->assertNotRegexp('/form-errors.*?Master Foo/', $html); - - $this->decorator->setShowCustomFormErrors(false); - $html = $this->form->render(); - $this->assertNotContains('form-badness', $html); - } - - - /** - * @dataProvider markupOptionMethodsProvider - */ - public function testMarkupOptionsMayBeMutated($property) - { - $setter = 'set' . $property; - $getter = 'get' . $property; - - $this->decorator->$setter('foo'); - if ($property == 'IgnoreSubForms') { - $this->assertTrue($this->decorator->ignoreSubForms()); - } else { - $this->assertEquals('foo', $this->decorator->$getter()); - } - } - - /** - * @group ZF-11151 - */ - public function testOptionShowCustomFormErrors() - { - $this->decorator - ->setOption('showCustomFormErrors', true); - - $this->assertTrue($this->decorator->getShowCustomFormErrors()); - } - - /** - * @group ZF-11225 - */ - public function testRenderingEscapesFormErrorsByDefault() - { - $this->setupForm(); - $this->form->addDecorator($this->decorator) - ->addError('form-badness'); - $html = $this->form->render(); - $this->assertContains('<strong>form-badness</strong>', $html); - } - - /** - * @group ZF-11225 - */ - public function testCanDisableEscapingFormErrors() - { - $this->setupForm(); - $this->form->addDecorator($this->decorator); - - // Set error message with html content - $this->form->addError('form-badness'); - - // Set element label with html content - $this->form->getElement('bar')->setLabel('Sub Bar: '); - - $this->form->getDecorator('FormErrors')->setEscape(false); - - $html = $this->form->render(); - $this->assertContains('
  • form-badness', $html); - $this->assertContains('
  • Sub Bar: ', $html); - } - - /** - * @group ZF-8713 - */ - public function testElementNameIsTranslated() - { - // Translator - $translator = new Zend_Translate( - 'array', - array( - 'Master Foo: ' => 'transleted label', - 'bar' => 'translated name', - ) - ); - - // Form - $this->setupForm(); - $this->form->setDecorators(array($this->decorator)); - $this->form->foo->setTranslator($translator); - $this->form->bar->setTranslator($translator); - - // Test - $html = $this->form->render(); - $this->assertContains( - '
  • transleted label
      ', - $html - ); - $this->assertContains( - '
    • translated name
        ', - $html - ); - } - - public function markupOptionMethodsProvider() - { - return array( - array('IgnoreSubForms'), - array('MarkupElementLabelEnd'), - array('MarkupElementLabelStart'), - array('MarkupListEnd'), - array('MarkupListItemEnd'), - array('MarkupListItemStart'), - array('MarkupListStart'), - ); - } -} - -// Call Zend_Form_Decorator_FormErrorsTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Decorator_FormErrorsTest::main") { - Zend_Form_Decorator_FormErrorsTest::main(); -} diff --git a/tests/Zend/Form/Decorator/FormTest.php b/tests/Zend/Form/Decorator/FormTest.php deleted file mode 100644 index 10f1e07800..0000000000 --- a/tests/Zend/Form/Decorator/FormTest.php +++ /dev/null @@ -1,140 +0,0 @@ -decorator = new Zend_Form_Decorator_Form(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testHelperIsFormByDefault() - { - $this->assertEquals('form', $this->decorator->getHelper()); - } - - public function testCanSetHelperWithOption() - { - $this->testHelperIsFormByDefault(); - $this->decorator->setOption('helper', 'formForm'); - $this->assertEquals('formForm', $this->decorator->getHelper()); - - require_once 'Zend/Form/DisplayGroup.php'; - require_once 'Zend/Loader/PluginLoader.php'; - $attribs = array( - 'enctype' => 'ascii', - 'charset' => 'us-ascii' - ); - $loader = new Zend_Loader_PluginLoader(array('Zend_Form_Decorator' => 'Zend/Form/Decorator/')); - $displayGroup = new Zend_Form_DisplayGroup('foo', $loader, array('attribs' => $attribs)); - $this->decorator->setElement($displayGroup); - $options = $this->decorator->getOptions(); - $this->assertTrue(isset($options['enctype'])); - $this->assertEquals($attribs['enctype'], $options['enctype']); - $this->assertTrue(isset($options['charset'])); - $this->assertEquals($attribs['charset'], $options['charset']); - } - - /** - * @group ZF-3643 - */ - public function testShouldPreferFormIdAttributeOverFormName() - { - $form = new Zend_Form(); - $form->setMethod('post') - ->setAction('/foo/bar') - ->setName('foobar') - ->setAttrib('id', 'bazbat') - ->setView($this->getView()); - $html = $form->render(); - $this->assertContains('id="bazbat"', $html, $html); - } - - public function testEmptyFormNameShouldNotRenderEmptyFormId() - { - $form = new Zend_Form(); - $form->setMethod('post') - ->setAction('/foo/bar') - ->setView($this->getView()); - $html = $form->render(); - $this->assertNotContains('id=""', $html, $html); - } -} - -// Call Zend_Form_Decorator_FormTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Decorator_FormTest::main") { - Zend_Form_Decorator_FormTest::main(); -} diff --git a/tests/Zend/Form/Decorator/HtmlTagTest.php b/tests/Zend/Form/Decorator/HtmlTagTest.php deleted file mode 100644 index 8d97f4c406..0000000000 --- a/tests/Zend/Form/Decorator/HtmlTagTest.php +++ /dev/null @@ -1,242 +0,0 @@ -decorator = new Zend_Form_Decorator_HtmlTag(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testNormalizeTagStripsNonAlphanumericCharactersAndLowersCase() - { - $tag = 'ab1-cd0EFG'; - $received = $this->decorator->normalizeTag($tag); - $this->assertEquals('ab1cd0efg', $received); - } - - public function testRendersOptionsAsHtmlAttribsByDefault() - { - $element = new Zend_Form_Element('foo'); - $options = array('tag' => 'div', 'class' => 'foobar', 'id' => 'foo'); - $this->decorator->setElement($element) - ->setOptions($options); - $html = $this->decorator->render(''); - foreach ($options as $key => $value) { - if ('tag' == $key) { - $this->assertContains('<' . $value, $html); - $this->assertContains('', $html); - } else { - $this->assertContains($key . '="' . $value . '"', $html); - } - } - } - - public function testDoesNotRenderAttribsWhenNoAttribsOptionSet() - { - $element = new Zend_Form_Element('foo'); - $options = array('tag' => 'div', 'class' => 'foobar', 'id' => 'foo', 'noAttribs' => true); - $this->decorator->setElement($element) - ->setOptions($options); - $html = $this->decorator->render(''); - foreach ($options as $key => $value) { - if ('tag' == $key) { - $this->assertContains('<' . $value, $html); - $this->assertContains('', $html); - } else { - $this->assertNotContains($key . '="' . (string) $value . '"', $html); - } - } - } - - public function testCanRenderOnlyOpeningTag() - { - $element = new Zend_Form_Element('foo'); - $options = array('tag' => 'div', 'class' => 'foobar', 'id' => 'foo', 'openOnly' => true); - $this->decorator->setElement($element) - ->setOptions($options); - $html = $this->decorator->render(''); - foreach ($options as $key => $value) { - if ('tag' == $key) { - $this->assertContains('<' . $value, $html); - $this->assertNotContains('', $html); - } elseif ('openOnly' == $key) { - $this->assertNotContains($key, $html); - } else { - $this->assertContains($key . '="' . (string) $value . '"', $html); - } - } - } - - public function testCanRenderOnlyClosingTag() - { - $element = new Zend_Form_Element('foo'); - $options = array('tag' => 'div', 'class' => 'foobar', 'id' => 'foo', 'closeOnly' => true); - $this->decorator->setElement($element) - ->setOptions($options); - $html = $this->decorator->render(''); - foreach ($options as $key => $value) { - if ('tag' == $key) { - $this->assertNotContains('<' . $value, $html); - $this->assertContains('', $html); - } else { - $this->assertNotContains($key . '="' . (string) $value . '"', $html); - } - } - } - - public function testArrayAttributesAreRenderedAsSpaceSeparatedLists() - { - $element = new Zend_Form_Element('foo'); - $options = array('tag' => 'div', 'class' => array('foobar', 'bazbat'), 'id' => 'foo'); - $this->decorator->setElement($element) - ->setOptions($options); - $html = $this->decorator->render(''); - $this->assertContains('class="foobar bazbat"', $html); - } - - public function testAppendPlacementWithCloseOnlyRendersClosingTagFollowingContent() - { - $options = array( - 'closeOnly' => true, - 'tag' => 'div', - 'placement' => 'append' - ); - $this->decorator->setOptions($options); - $html = $this->decorator->render('content'); - $this->assertRegexp('#(content).*?(
  • )#', $html, $html); - } - - public function testAppendPlacementWithOpenOnlyRendersOpeningTagFollowingContent() - { - $options = array( - 'openOnly' => true, - 'tag' => 'div', - 'placement' => 'append' - ); - $this->decorator->setOptions($options); - $html = $this->decorator->render('content'); - $this->assertRegexp('#(content).*?(
    )#', $html, $html); - } - - public function testPrependPlacementWithCloseOnlyRendersClosingTagBeforeContent() - { - $options = array( - 'closeOnly' => true, - 'tag' => 'div', - 'placement' => 'prepend' - ); - $this->decorator->setOptions($options); - $html = $this->decorator->render('content'); - $this->assertRegexp('#(
    ).*?(content)#', $html, $html); - } - - public function testPrependPlacementWithOpenOnlyRendersOpeningTagBeforeContent() - { - $options = array( - 'openOnly' => true, - 'tag' => 'div', - 'placement' => 'prepend' - ); - $this->decorator->setOptions($options); - $html = $this->decorator->render('content'); - $this->assertRegexp('#(
    ).*?(content)#', $html, $html); - } - - public function testTagIsInitiallyDiv() - { - $this->assertEquals('div', $this->decorator->getTag()); - } - - public function testCanSetTag() - { - $this->testTagIsInitiallyDiv(); - $this->decorator->setTag('dl'); - $this->assertEquals('dl', $this->decorator->getTag()); - } - - public function testCanSetTagViaOption() - { - $this->decorator->setOption('tag', 'dl'); - $this->assertEquals('dl', $this->decorator->getTag()); - } -} - -// Call Zend_Form_Decorator_HtmlTagTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Decorator_HtmlTagTest::main") { - Zend_Form_Decorator_HtmlTagTest::main(); -} diff --git a/tests/Zend/Form/Decorator/ImageTest.php b/tests/Zend/Form/Decorator/ImageTest.php deleted file mode 100644 index 6e363e40b8..0000000000 --- a/tests/Zend/Form/Decorator/ImageTest.php +++ /dev/null @@ -1,180 +0,0 @@ -decorator = new Zend_Form_Decorator_Image(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testPlacementInitiallyAppends() - { - $this->assertEquals(Zend_Form_Decorator_Abstract::APPEND, $this->decorator->getPlacement()); - } - - public function testRenderReturnsOriginalContentWhenNoViewPresentInElement() - { - $element = new Zend_Form_Element('foo'); - $this->decorator->setElement($element); - $content = 'test content'; - $this->assertSame($content, $this->decorator->render($content)); - } - - public function testTagInitiallyNull() - { - $this->assertNull($this->decorator->getTag()); - } - - public function testCanSetTag() - { - $this->testTagInitiallyNull(); - $this->decorator->setTag('div'); - $this->assertEquals('div', $this->decorator->getTag()); - } - - public function testCanSetTagViaOptions() - { - $this->testTagInitiallyNull(); - $this->decorator->setOption('tag', 'div'); - $this->assertEquals('div', $this->decorator->getTag()); - } - - public function testRendersXhtmlImageTag() - { - $element = new Zend_Form_Element_Image('foo'); - $element->setImage('foobar') - ->setView($this->getView()); - $this->decorator->setElement($element); - - $image = $this->decorator->render(''); - $this->assertContains('assertContains('src="foobar"', $image); - $this->assertContains('name="foo"', $image); - $this->assertContains('type="image"', $image); - } - - public function testCanRenderImageWithinAdditionalTag() - { - $element = new Zend_Form_Element_Image('foo'); - $element->setValue('foobar') - ->setView($this->getView()); - $this->decorator->setElement($element) - ->setOption('tag', 'div'); - - $image = $this->decorator->render(''); - $this->assertRegexp('#
    .*?]*>.*?
    #s', $image, $image); - } - - public function testCanPrependImageToContent() - { - $element = new Zend_Form_Element_Image('foo'); - $element->setValue('foobar') - ->setView($this->getView()); - $this->decorator->setElement($element) - ->setOption('placement', 'prepend'); - - $image = $this->decorator->render('content'); - $this->assertRegexp('#]*>.*?(content)#s', $image, $image); - } - - /** - * @group ZF-2714 - */ - public function testImageElementAttributesPassedWithDecoratorOptionsToViewHelper() - { - $element = new Zend_Form_Element_Image('foo'); - $element->setValue('foobar') - ->setAttrib('onClick', 'foo()') - ->setAttrib('id', 'foo-element') - ->setView($this->getView()); - $this->decorator->setElement($element) - ->setOption('class', 'imageclass'); - - $image = $this->decorator->render(''); - $this->assertContains('class="imageclass"', $image); - $this->assertContains('onClick="foo()"', $image); - $this->assertContains('id="foo-element"', $image); - } -} - -// Call Zend_Form_Decorator_ImageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Decorator_ImageTest::main") { - Zend_Form_Decorator_ImageTest::main(); -} diff --git a/tests/Zend/Form/Decorator/LabelTest.php b/tests/Zend/Form/Decorator/LabelTest.php deleted file mode 100644 index d9b65efe46..0000000000 --- a/tests/Zend/Form/Decorator/LabelTest.php +++ /dev/null @@ -1,436 +0,0 @@ -decorator = new Zend_Form_Decorator_Label(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testUsesPrependPlacementByDefault() - { - $this->assertEquals(Zend_Form_Decorator_Abstract::PREPEND, $this->decorator->getPlacement()); - } - - public function testRenderReturnsOriginalContentWhenNoViewPresentInElement() - { - $element = new Zend_Form_Element('foo'); - $this->decorator->setElement($element); - $content = 'test content'; - $this->assertSame($content, $this->decorator->render($content)); - } - - public function testRenderReturnsOriginalContentWhenNoLabelPresentInElement() - { - $element = new Zend_Form_Element('foo'); - $this->decorator->setElement($element); - $content = 'test content'; - $this->assertSame($content, $this->decorator->render($content)); - } - - public function testRenderUsesElementIdIfSet() - { - $element = new Zend_Form_Element('foo'); - $element->setAttrib('id', 'foobar') - ->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertContains('for="foobar"', $test); - } - - public function testRenderAddsOptionalClassForNonRequiredElements() - { - $element = new Zend_Form_Element('foo'); - $element->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertRegexp('/]*?class="[^"]*optional/', $test, $test); - - $element->class = "bar"; - $this->decorator->setOption('class', 'foo'); - $test = $this->decorator->render($content); - $this->assertNotRegexp('/]*?class="[^"]*bar/', $test, $test); - $this->assertRegexp('/]*?class="[^"]*foo/', $test, $test); - $this->assertRegexp('/]*?class="[^"]*optional/', $test, $test); - } - - public function testRenderAddsRequiredClassForRequiredElements() - { - $element = new Zend_Form_Element('foo'); - $element->setRequired(true) - ->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertRegexp('/]*?class="[^"]*required/', $test, $test); - - $element->class = "bar"; - $this->decorator->setOption('class', 'foo'); - $test = $this->decorator->render($content); - $this->assertNotRegexp('/]*?class="[^"]*bar/', $test, $test); - $this->assertRegexp('/]*?class="[^"]*foo/', $test, $test); - $this->assertRegexp('/]*?class="[^"]*required/', $test, $test); - } - - public function testRenderAppendsRequiredClassToClassProvidedInRequiredElement() - { - $element = new Zend_Form_Element('foo'); - $element->setRequired(true) - ->setView($this->getView()) - ->setLabel('My Label') - ->setAttrib('class', 'bazbat'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertRegexp('/]*?class="[^"]*required/', $test, $test); - $this->assertNotRegexp('/]*?class="[^"]*bazbat/', $test, $test); - } - - public function testRenderUtilizesOptionalSuffixesAndPrefixesWhenRequested() - { - $element = new Zend_Form_Element('foo'); - $element->setAttribs(array( - 'optionalPrefix' => '-opt-prefix-', - 'optionalSuffix' => '-opt-suffix-', - 'requiredPrefix' => '-req-prefix-', - 'requiredSuffix' => '-req-suffix-', - )) - ->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertNotContains('-req-prefix-', $test, $test); - $this->assertNotContains('-req-suffix-', $test, $test); - $this->assertContains('-opt-prefix-', $test, $test); - $this->assertContains('-opt-suffix-', $test, $test); - $this->assertRegexp('/-opt-prefix-[^-]*?My Label[^-]*-opt-suffix-/s', $test, $test); - } - - public function testRenderUtilizesRequiredSuffixesAndPrefixesWhenRequested() - { - $element = new Zend_Form_Element('foo'); - $element->setAttribs(array( - 'optionalPrefix' => '-opt-prefix-', - 'optionalSuffix' => '-opt-suffix-', - 'requiredPrefix' => '-req-prefix-', - 'requiredSuffix' => '-req-suffix-', - )) - ->setRequired(true) - ->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertNotContains('-opt-prefix-', $test, $test); - $this->assertNotContains('-opt-suffix-', $test, $test); - $this->assertContains('-req-prefix-', $test, $test); - $this->assertContains('-req-suffix-', $test, $test); - $this->assertRegexp('/-req-prefix-[^-]*?My Label[^-]*-req-suffix-/s', $test, $test); - } - - /** - * @group ZF-3538 - */ - public function testRenderShouldNotUtilizeElementClass() - { - $element = new Zend_Form_Element('foo'); - $element->setView($this->getView()) - ->setLabel('My Label') - ->setAttrib('class', 'foobar'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertNotRegexp('#]*(class="[^"]*foobar)[^"]*"#', $test, $test); - } - - public function testRenderRendersLabel() - { - $element = new Zend_Form_Element('foo'); - $element->setView($this->getView()) - ->setLabel('My Label'); - $this->decorator->setElement($element); - $content = 'test content'; - $test = $this->decorator->render($content); - $this->assertContains($content, $test); - $this->assertContains($element->getLabel(), $test); - $this->assertContains('
    $#s', $html, $html); - $this->assertContains('assertContains('"foo"', $html); - $this->assertContains('"bar"', $html); - } - - public function testToStringProxiesToRender() - { - $foo = new Zend_Form_Element_Text('foo'); - $bar = new Zend_Form_Element_Text('bar'); - - $this->group->addElements(array($foo, $bar)) - ->setView($this->getView()); - $html = $this->group->__toString(); - $this->assertRegexp('#^]*>&\#160;]*>$#s', $html, $html); - $this->assertContains('assertContains('"foo"', $html); - $this->assertContains('"bar"', $html); - } - - public function raiseDecoratorException($content, $element, $options) - { - throw new Exception('Raising exception in decorator callback'); - } - - public function handleDecoratorErrors($errno, $errstr, $errfile = '', $errline = 0, array $errcontext = array()) - { - $this->error = $errstr; - } - - public function testToStringRaisesErrorWhenExceptionCaught() - { - $this->group->setDecorators(array( - array( - 'decorator' => 'Callback', - 'options' => array('callback' => array($this, 'raiseDecoratorException')) - ), - )); - $origErrorHandler = set_error_handler(array($this, 'handleDecoratorErrors'), E_USER_WARNING); - - $text = $this->group->__toString(); - - restore_error_handler(); - - $this->assertTrue(empty($text)); - $this->assertTrue(isset($this->error)); - $this->assertEquals('Raising exception in decorator callback', $this->error); - } - - public function testNoTranslatorByDefault() - { - $this->assertNull($this->group->getTranslator()); - } - - public function testGetTranslatorRetrievesGlobalDefaultWhenAvailable() - { - $this->testNoTranslatorByDefault(); - $translator = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Form::setDefaultTranslator($translator); - $received = $this->group->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testTranslatorAccessorsWorks() - { - $translator = new Zend_Translate('array', array('foo' => 'bar')); - $this->group->setTranslator($translator); - $received = $this->group->getTranslator($translator); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testCanDisableTranslation() - { - $this->testGetTranslatorRetrievesGlobalDefaultWhenAvailable(); - $this->group->setDisableTranslator(true); - $this->assertNull($this->group->getTranslator()); - } - - // Iteration - - public function setupIteratorElements() - { - $foo = new Zend_Form_Element('foo'); - $bar = new Zend_Form_Element('bar'); - $baz = new Zend_Form_Element('baz'); - $this->group->addElements(array($foo, $bar, $baz)); - } - - public function testDisplayGroupIsIterableAndIteratesElements() - { - $this->setupIteratorElements(); - $expected = array('foo', 'bar', 'baz'); - $received = array(); - foreach ($this->group as $key => $element) { - $received[] = $key; - $this->assertTrue($element instanceof Zend_Form_Element); - } - $this->assertSame($expected, $received); - } - - public function testDisplayGroupIteratesElementsInExpectedOrder() - { - $this->setupIteratorElements(); - $test = new Zend_Form_Element('checkorder', array('order' => 1)); - $this->group->addElement($test); - $expected = array('foo', 'checkorder', 'bar', 'baz'); - $received = array(); - foreach ($this->group as $key => $element) { - $received[] = $key; - } - $this->assertSame($expected, $received); - } - - public function testDisplayGroupIteratesElementsInExpectedOrderWhenFirstElementHasNoOrderSpecified() - { - $a = new Zend_Form_Element('a',array('label'=>'a')); - $b = new Zend_Form_Element('b',array('label'=>'b', 'order' => 0)); - $c = new Zend_Form_Element('c',array('label'=>'c', 'order' => 1)); - $this->group->addElement($a) - ->addElement($b) - ->addElement($c) - ->setView($this->getView()); - $test = $this->group->render(); - $this->assertContains('name="a"', $test); - if (!preg_match_all('/(]+>)/', $test, $matches)) { - $this->fail('Expected markup not found'); - } - $order = array(); - foreach ($matches[1] as $element) { - if (preg_match('/name="(a|b|c)"/', $element, $m)) { - $order[] = $m[1]; - } - } - $this->assertSame(array('b', 'c', 'a'), $order); - } - - public function testRemovingElementsShouldNotRaiseExceptionsDuringIteration() - { - $this->setupIteratorElements(); - $bar = $this->group->getElement('bar'); - $this->group->removeElement('bar'); - - try { - foreach ($this->group as $item) { - } - } catch (Exception $e) { - $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); - } - } - - // Countable - - public function testCanCountDisplayGroup() - { - $this->setupIteratorElements(); - $this->assertEquals(3, count($this->group)); - } - - // Configuration - - public function getOptions() - { - $options = array( - 'name' => 'foo', - 'legend' => 'Display Group', - 'order' => 20, - 'class' => 'foobar' - ); - return $options; - } - - public function testCanSetObjectStateViaSetOptions() - { - $this->group->setOptions($this->getOptions()); - $this->assertEquals('foo', $this->group->getName()); - $this->assertEquals('Display Group', $this->group->getLegend()); - $this->assertEquals(20, $this->group->getOrder()); - $this->assertEquals('foobar', $this->group->getAttrib('class')); - } - - public function testSetOptionsOmitsAccessorsRequiringObjectsOrMultipleParams() - { - $options = $this->getOptions(); - $config = new Zend_Config($options); - $options['config'] = $config; - $options['options'] = $config->toArray(); - $options['pluginLoader'] = true; - $options['view'] = true; - $options['translator'] = true; - $options['attrib'] = true; - $this->group->setOptions($options); - } - - public function testSetOptionsSetsArrayOfStringDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array('label', 'form'); - $this->group->setOptions($options); - $this->assertFalse($this->group->getDecorator('group')); - - $decorator = $this->group->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $decorator = $this->group->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - } - - public function testSetOptionsSetsArrayOfArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array('label', array('id' => 'mylabel')), - array('form', array('id' => 'form')), - ); - $this->group->setOptions($options); - $this->assertFalse($this->group->getDecorator('group')); - - $decorator = $this->group->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->group->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $options = $decorator->getOptions(); - $this->assertEquals('form', $options['id']); - } - - public function testSetOptionsSetsArrayOfAssocArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array( - 'options' => array('id' => 'mylabel'), - 'decorator' => 'label', - ), - array( - 'options' => array('id' => 'form'), - 'decorator' => 'form', - ), - ); - $this->group->setOptions($options); - $this->assertFalse($this->group->getDecorator('group')); - - $decorator = $this->group->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->group->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $options = $decorator->getOptions(); - $this->assertEquals('form', $options['id']); - } - - public function testCanSetObjectStateViaSetConfig() - { - $config = new Zend_Config($this->getOptions()); - $this->group->setConfig($config); - $this->assertEquals('foo', $this->group->getName()); - $this->assertEquals('Display Group', $this->group->getLegend()); - $this->assertEquals(20, $this->group->getOrder()); - $this->assertEquals('foobar', $this->group->getAttrib('class')); - } - - public function testPassingConfigObjectToConstructorSetsObjectState() - { - $config = new Zend_Config($this->getOptions()); - $group = new Zend_Form_DisplayGroup('foo', $this->loader, $config); - $this->assertEquals('foo', $group->getName()); - $this->assertEquals('Display Group', $group->getLegend()); - $this->assertEquals(20, $group->getOrder()); - $this->assertEquals('foobar', $group->getAttrib('class')); - } - - public function testGetAttribReturnsNullForUndefinedAttribs() - { - $this->assertNull($this->group->getAttrib('bogus')); - } - - public function testCanAddMultipleAttribsSimultaneously() - { - $attribs = array( - 'foo' => 'fooval', - 'bar' => 'barval', - 'baz' => 'bazval' - ); - $this->group->addAttribs($attribs); - $this->assertEquals($attribs, $this->group->getAttribs()); - } - - public function testSetAttribsOverwritesPreviouslySetAttribs() - { - $this->testCanAddMultipleAttribsSimultaneously(); - $attribs = array( - 'foo' => 'valfoo', - 'bat' => 'batval' - ); - $this->group->setAttribs($attribs); - $this->assertEquals($attribs, $this->group->getAttribs()); - } - - public function testCanRemoveSingleAttrib() - { - $this->testCanAddMultipleAttribsSimultaneously(); - $this->group->removeAttrib('bar'); - $this->assertNull($this->group->getAttrib('bar')); - } - - public function testCanClearAllAttribs() - { - $this->testCanAddMultipleAttribsSimultaneously(); - $this->group->clearAttribs(); - $this->assertEquals(array(), $this->group->getAttribs()); - } - - // Extension - - public function testInitCalledBeforeLoadDecorators() - { - $group = new Zend_Form_DisplayGroupTest_DisplayGroup( - 'test', - $this->loader - ); - $decorators = $group->getDecorators(); - $this->assertTrue(empty($decorators)); - } - - /** - * @group ZF-3217 - */ - public function testGroupShouldOverloadToRenderDecorators() - { - $foo = new Zend_Form_Element_Text('foo'); - $bar = new Zend_Form_Element_Text('bar'); - $this->group->addElements(array($foo, $bar)); - - $this->group->setView($this->getView()); - $html = $this->group->renderFormElements(); - foreach ($this->group->getElements() as $element) { - $this->assertContains('id="' . $element->getFullyQualifiedName() . '"', $html, 'Received: ' . $html); - } - $this->assertNotContains('assertNotContains('group->renderFieldset('this is the content'); - $this->assertContains('assertContains('', $html); - $this->assertContains('this is the content', $html); - } - - /** - * @group ZF-3217 - * @expectedException Zend_Form_Exception - */ - public function testOverloadingToInvalidMethodsShouldThrowAnException() - { - $html = $this->group->bogusMethodCall(); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * Prove the fluent interface on Zend_Form::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->group, $this->group->loadDefaultDecorators()); - } - - /** - * @group ZF-7552 - */ - public function testAddDecoratorsKeepsNonNumericKeyNames() - { - $this->group->addDecorators(array(array(array('td' => 'HtmlTag'), - array('tag' => 'td')), - array(array('tr' => 'HtmlTag'), - array('tag' => 'tr')), - array('HtmlTag', array('tag' => 'baz')))); - $t1 = $this->group->getDecorators(); - $this->group->setDecorators($t1); - $t2 = $this->group->getDecorators(); - $this->assertEquals($t1, $t2); - } - - /** - * @group ZF-12375 - */ - public function testHasTranslatorWithDefaultValue() - { - $this->assertFalse($this->group->hasTranslator()); - } - - /** - * @group ZF-12375 - */ - public function testHasTranslatorWithTranslateObject() - { - $this->group->setTranslator( - new Zend_Translate( - array( - 'adapter' => 'array', - 'content' => array( - 'foo' => 'Foo', - ), - ) - ) - ); - $this->assertTrue($this->group->hasTranslator()); - } -} - -class Zend_Form_DisplayGroupTest_DisplayGroup extends Zend_Form_DisplayGroup -{ - public function init() - { - $this->setDisableLoadDefaultDecorators(true); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Form_DisplayGroupTest::main') { - Zend_Form_DisplayGroupTest::main(); -} diff --git a/tests/Zend/Form/Element/AllTests.php b/tests/Zend/Form/Element/AllTests.php deleted file mode 100644 index 9842bf156d..0000000000 --- a/tests/Zend/Form/Element/AllTests.php +++ /dev/null @@ -1,88 +0,0 @@ -addTestSuite('Zend_Form_Element_ButtonTest'); - $suite->addTestSuite('Zend_Form_Element_CaptchaTest'); - $suite->addTestSuite('Zend_Form_Element_CheckboxTest'); - $suite->addTestSuite('Zend_Form_Element_FileTest'); - $suite->addTestSuite('Zend_Form_Element_HashTest'); - $suite->addTestSuite('Zend_Form_Element_HiddenTest'); - $suite->addTestSuite('Zend_Form_Element_ImageTest'); - $suite->addTestSuite('Zend_Form_Element_MultiCheckboxTest'); - $suite->addTestSuite('Zend_Form_Element_MultiselectTest'); - $suite->addTestSuite('Zend_Form_Element_NoteTest'); - $suite->addTestSuite('Zend_Form_Element_PasswordTest'); - $suite->addTestSuite('Zend_Form_Element_RadioTest'); - $suite->addTestSuite('Zend_Form_Element_ResetTest'); - $suite->addTestSuite('Zend_Form_Element_SelectTest'); - $suite->addTestSuite('Zend_Form_Element_SubmitTest'); - $suite->addTestSuite('Zend_Form_Element_TextareaTest'); - $suite->addTestSuite('Zend_Form_Element_TextTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Form_Element_AllTests::main') { - Zend_Form_Element_AllTests::main(); -} diff --git a/tests/Zend/Form/Element/ButtonTest.php b/tests/Zend/Form/Element/ButtonTest.php deleted file mode 100644 index e9973f6eaf..0000000000 --- a/tests/Zend/Form/Element/ButtonTest.php +++ /dev/null @@ -1,210 +0,0 @@ -element = new Zend_Form_Element_Button('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - return $view; - } - - public function testButtonElementSubclassesSubmitElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Submit); - } - - public function testButtonElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testButtonElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testHelperAttributeSetToFormButtonByDefault() - { - $this->assertEquals('formButton', $this->element->getAttrib('helper')); - } - - public function testButtonElementUsesButtonHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formButton', $helper); - } - - public function testGetLabelReturnsTranslatedLabelIfTranslatorIsRegistered() - { - $translations = include dirname(__FILE__) . '/../_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $this->element->setTranslator($translate) - ->setLabel('submit'); - $test = $this->element->getLabel(); - $this->assertEquals($translations['submit'], $test); - } - - public function testTranslatedLabelIsRendered() - { - $this->_checkZf2794(); - - $this->testGetLabelReturnsTranslatedLabelIfTranslatorIsRegistered(); - $this->element->setView($this->getView()); - $decorator = $this->element->getDecorator('ViewHelper'); - $decorator->setElement($this->element); - $html = $decorator->render(''); - $this->assertRegexp('/<(input|button)[^>]*?>Submit Button/', $html, $html); - } - - /** - * @group ZF-3961 - */ - public function testValuePropertyShouldNotBeRendered() - { - $this->element->setLabel('Button Label') - ->setView($this->getView()); - $html = $this->element->render(); - $this->assertContains('Button Label', $html, $html); - $this->assertNotContains('value="', $html); - } - - public function testSetDefaultIgnoredToTrueWhenNotDefined() - { - $this->assertTrue($this->element->getIgnore()); - } - - /** - * @group ZF-5056 - */ - public function testValidateAlwaysReturnsTrue() - { - $this->element->setValue('foo'); - - $this->assertTrue($this->element->isValid('bar')); - } - - /** - * @group ZF-5056 - */ - public function testRenderingWithValueAfterValidation() - { - // Set element options - $this->element->setOptions( - array( - 'label' => 'Foo', - 'value' => 'bar', - 'decorators' => array( - 'ViewHelper', - ), - ) - ); - - // Validate - $this->element->isValid(null); - - $this->assertEquals( - PHP_EOL . '', - $this->element->render($this->getView()) - ); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_ButtonTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_ButtonTest::main") { - Zend_Form_Element_ButtonTest::main(); -} diff --git a/tests/Zend/Form/Element/CaptchaTest.php b/tests/Zend/Form/Element/CaptchaTest.php deleted file mode 100644 index 21adfab25f..0000000000 --- a/tests/Zend/Form/Element/CaptchaTest.php +++ /dev/null @@ -1,499 +0,0 @@ -element = new Zend_Form_Element_Captcha( - 'foo', - array( - 'captcha' => 'Dumb', - 'captchaOptions' => array( - 'sessionClass' => 'Zend_Form_Element_CaptchaTest_SessionContainer', - ), - ) - ); - } - - public function getCaptcha() - { - $captcha = new Zend_Captcha_Dumb(array( - 'sessionClass' => 'Zend_Form_Element_CaptchaTest_SessionContainer', - )); - return $captcha; - } - - /** - * @expectedException Zend_Form_Exception - */ - public function testConstructionShouldRequireCaptchaDetails() - { - $this->element = new Zend_Form_Element_Captcha('foo'); - } - - public function testShouldAllowSettingCaptcha() - { - $captcha = $this->getCaptcha(); - $this->assertNotSame($this->element->getCaptcha(), $captcha); - $this->element->setCaptcha($captcha); - $this->assertSame($captcha, $this->element->getCaptcha()); - } - - public function testShouldAllowAddingCaptchaPrefixPath() - { - $this->element->addPrefixPath('My_Captcha', 'My/Captcha/', 'captcha'); - $loader = $this->element->getPluginLoader('captcha'); - $paths = $loader->getPaths('My_Captcha'); - $this->assertTrue(is_array($paths)); - } - - public function testAddingNullPrefixPathShouldAddCaptchaPrefixPath() - { - $this->element->addPrefixPath('My', 'My'); - $loader = $this->element->getPluginLoader('captcha'); - $paths = $loader->getPaths('My_Captcha'); - $this->assertTrue(is_array($paths)); - } - - /** - * @group ZF-12161 - */ - public function testSettingCustomCaptchaAdapterPerConstructor() - { - $element = new Zend_Form_Element_Captcha( - 'foo', - array( - 'prefixPath' => array( - 'prefix' => 'Zend_Form_Element_CaptchaTest', - 'path' => dirname(__FILE__) . '/_files', - ), - 'captcha' => 'Foo', - ) - ); - - $this->assertTrue( - $element->getCaptcha() instanceof - Zend_Form_Element_CaptchaTest_Captcha_Foo - ); - } - - /** - * @see ZF-4038 - * @group ZF-4038 - */ - public function testCaptchaShouldRenderFullyQualifiedElementName() - { - require_once 'Zend/Form.php'; - require_once 'Zend/View.php'; - $form = new Zend_Form(); - $form->addElement($this->element) - ->setElementsBelongTo('bar'); - $html = $form->render(new Zend_View); - $this->assertContains('name="bar[foo', $html, $html); - $this->assertContains('id="bar-foo-', $html, $html); - $this->form = $form; - } - - /** - * @see ZF-4038 - * @group ZF-4038 - */ - public function testCaptchaShouldValidateUsingFullyQualifiedElementName() - { - $this->testCaptchaShouldRenderFullyQualifiedElementName(); - $word = $this->element->getCaptcha()->getWord(); - $id = $this->element->getCaptcha()->getId(); - $data = array( - 'bar' => array( - 'foo' => array( - 'id' => $id, - 'input' => $word, - ) - ) - ); - $valid = $this->form->isValid($data); - $this->assertTrue($valid, var_export($this->form->getMessages(), 1)); - } - - /** - * @group ZF-4822 - */ - public function testDefaultDecoratorsShouldIncludeErrorsDescriptionHtmlTagAndLabel() - { - $decorators = $this->element->getDecorators(); - $this->assertTrue(is_array($decorators)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_Errors', $decorators), 'Missing Errors decorator' . var_export(array_keys($decorators), 1)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_Description', $decorators), 'Missing Description decorator' . var_export(array_keys($decorators), 1)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_HtmlTag', $decorators), 'Missing HtmlTag decorator' . var_export(array_keys($decorators), 1)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_Label', $decorators), 'Missing Label decorator' . var_export(array_keys($decorators), 1)); - } - - /** - * @group ZF-5855 - */ - public function testHelperDoesNotShowUpInAttribs() - { - require_once 'Zend/View.php'; - $this->assertFalse(array_key_exists('helper', $this->element->getAttribs())); - } - - /** - * Prove the fluent interface on Zend_Form_Element_Captcha::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } - - /** - * @group ZF-11609 - */ - public function testDefaultDecoratorsBeforeAndAfterRendering() - { - /** - * Dumb captcha - */ - - // Before rendering - $decorators = array_keys($this->element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_HtmlTag', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - $this->element->render(); - - // After rendering - $decorators = array_keys($this->element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Captcha', - 'Zend_Form_Decorator_Captcha_Word', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_HtmlTag', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - /** - * ReCaptcha - */ - - // Reset element - $this->setUp(); - - $options = array( - 'privKey' => 'privateKey', - 'pubKey' => 'publicKey', - 'ssl' => true, - 'xhtml' => true, - ); - $this->element->setCaptcha(new Zend_Captcha_ReCaptcha($options)); - - // Before rendering - $decorators = array_keys($this->element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_HtmlTag', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - $this->element->render(); - - // After rendering - $decorators = array_keys($this->element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Captcha_ReCaptcha', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_HtmlTag', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - } - - /** - * @group ZF-11609 - */ - public function testDefaultDecoratorsBeforeAndAfterRenderingWhenDefaultDecoratorsAreDisabled() - { - $element = new Zend_Form_Element_Captcha( - 'foo', - array( - 'captcha' => 'Dumb', - 'captchaOptions' => array( - 'sessionClass' => 'Zend_Form_Element_CaptchaTest_SessionContainer', - ), - 'disableLoadDefaultDecorators' => true, - ) - ); - - // Before rendering - $decorators = $element->getDecorators(); - $this->assertTrue(empty($decorators)); - - $element->render(); - - // After rendering - $decorators = $element->getDecorators(); - $this->assertTrue(empty($decorators)); - } - - /** - * @group ZF-11609 - */ - public function testIndividualDecoratorsBeforeAndAfterRendering() - { - // Disable default decorators is true - $element = new Zend_Form_Element_Captcha( - 'foo', - array( - 'captcha' => 'Dumb', - 'captchaOptions' => array( - 'sessionClass' => 'Zend_Form_Element_CaptchaTest_SessionContainer', - ), - 'disableLoadDefaultDecorators' => true, - 'decorators' => array( - 'Description', - 'Errors', - 'Captcha_Word', - 'Captcha', - 'Label', - ), - ) - ); - - // Before rendering - $decorators = array_keys($element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Captcha_Word', - 'Zend_Form_Decorator_Captcha', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - $element->render(); - - // After rendering - $decorators = array_keys($element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Captcha_Word', - 'Zend_Form_Decorator_Captcha', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - // Disable default decorators is false - $element = new Zend_Form_Element_Captcha( - 'foo', - array( - 'captcha' => 'Dumb', - 'captchaOptions' => array( - 'sessionClass' => 'Zend_Form_Element_CaptchaTest_SessionContainer', - ), - 'decorators' => array( - 'Description', - 'Errors', - 'Captcha_Word', - 'Captcha', - 'Label', - ), - ) - ); - - // Before rendering - $decorators = array_keys($element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Captcha_Word', - 'Zend_Form_Decorator_Captcha', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - - $element->render(); - - // After rendering - $decorators = array_keys($element->getDecorators()); - $this->assertSame( - array( - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Captcha_Word', - 'Zend_Form_Decorator_Captcha', - 'Zend_Form_Decorator_Label', - ), - $decorators, - var_export($decorators, true) - ); - } - - /** - * @group ZF-12173 - */ - public function testShouldAllowAddingCaptchaPrefixPathWithBackslash() - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->markTestSkipped(__CLASS__ . '::' . __METHOD__ . ' requires PHP 5.3.0 or greater'); - return; - } - $this->element->addPrefixPath('My\Captcha', 'My/Captcha/', 'captcha'); - $loader = $this->element->getPluginLoader('captcha'); - $paths = $loader->getPaths('My\Captcha'); - $this->assertTrue(is_array($paths)); - } - - /** - * @group ZF-12173 - */ - public function testAddingCaptchaPrefixPathWithBackslash() - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->markTestSkipped(__CLASS__ . '::' . __METHOD__ . ' requires PHP 5.3.0 or greater'); - return; - } - $this->element->addPrefixPath('My\\', 'My/'); - $loader = $this->element->getPluginLoader('captcha'); - $paths = $loader->getPaths('My\Captcha'); - $this->assertTrue(is_array($paths)); - } -} - -/** - * @category Zend - * @package Zend_Form - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Form - */ -class Zend_Form_Element_CaptchaTest_SessionContainer -{ - protected static $_word; - - public function __get($name) - { - if ('word' == $name) { - return self::$_word; - } - - return null; - } - - public function __set($name, $value) - { - if ('word' == $name) { - self::$_word = $value; - } else { - $this->$name = $value; - } - } - - public function __isset($name) - { - if (('word' == $name) && (null !== self::$_word)) { - return true; - } - - return false; - } - - public function __call($method, $args) - { - switch ($method) { - case 'setExpirationHops': - case 'setExpirationSeconds': - $this->$method = array_shift($args); - break; - default: - } - } -} - -// Call Zend_Form_Element_CaptchaTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_CaptchaTest::main") { - Zend_Form_Element_CaptchaTest::main(); -} diff --git a/tests/Zend/Form/Element/CheckboxTest.php b/tests/Zend/Form/Element/CheckboxTest.php deleted file mode 100644 index 17c74537b9..0000000000 --- a/tests/Zend/Form/Element/CheckboxTest.php +++ /dev/null @@ -1,262 +0,0 @@ -element = new Zend_Form_Element_Checkbox('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - return new Zend_View(); - } - - public function testCheckboxElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testCheckboxElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testCheckboxElementUsesCheckboxHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formCheckbox', $helper); - } - - public function testCheckedFlagIsFalseByDefault() - { - $this->assertFalse($this->element->checked); - } - - public function testCheckedAttributeNotRenderedByDefault() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $html = $this->element->render($view); - $this->assertNotContains('checked="checked"', $html); - } - - public function testCheckedAttributeRenderedWhenCheckedFlagTrue() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $this->element->checked = true; - $html = $this->element->render($view); - $this->assertContains('checked="checked"', $html); - } - - public function testCheckedValueDefaultsToOne() - { - $this->assertEquals(1, $this->element->getCheckedValue()); - } - - public function testUncheckedValueDefaultsToZero() - { - $this->assertEquals(0, $this->element->getUncheckedValue()); - } - - public function testCanSetCheckedValue() - { - $this->testCheckedValueDefaultsToOne(); - $this->element->setCheckedValue('foo'); - $this->assertEquals('foo', $this->element->getCheckedValue()); - } - - public function testCanSetUncheckedValue() - { - $this->testUncheckedValueDefaultsToZero(); - $this->element->setUncheckedValue('foo'); - $this->assertEquals('foo', $this->element->getUncheckedValue()); - } - - public function testValueInitiallyUncheckedValue() - { - $this->assertEquals($this->element->getUncheckedValue(), $this->element->getValue()); - } - - public function testSettingValueToCheckedValueSetsWithEquivalentValue() - { - $this->testValueInitiallyUncheckedValue(); - $this->element->setValue($this->element->getCheckedValue()); - $this->assertEquals($this->element->getCheckedValue(), $this->element->getValue()); - } - - public function testSettingValueToAnythingOtherThanCheckedValueSetsAsUncheckedValue() - { - $this->testSettingValueToCheckedValueSetsWithEquivalentValue(); - $this->element->setValue('bogus'); - $this->assertEquals($this->element->getUncheckedValue(), $this->element->getValue()); - } - - public function testSettingCheckedFlagToTrueSetsValueToCheckedValue() - { - $this->testValueInitiallyUncheckedValue(); - $this->element->setChecked(true); - $this->assertEquals($this->element->getCheckedValue(), $this->element->getValue()); - } - - public function testSettingCheckedFlagToFalseSetsValueToUncheckedValue() - { - $this->testSettingCheckedFlagToTrueSetsValueToCheckedValue(); - $this->element->setChecked(false); - $this->assertEquals($this->element->getUncheckedValue(), $this->element->getValue()); - } - - public function testSettingValueToCheckedValueMarksElementAsChecked() - { - $this->testValueInitiallyUncheckedValue(); - $this->element->setValue($this->element->getCheckedValue()); - $this->assertTrue($this->element->checked); - } - - public function testSettingValueToUncheckedValueMarksElementAsNotChecked() - { - $this->testSettingValueToCheckedValueMarksElementAsChecked(); - $this->element->setValue($this->element->getUncheckedValue()); - $this->assertFalse($this->element->checked); - } - - public function testSetOptionsSetsInitialValueAccordingToCheckedAndUncheckedValues() - { - $options = array( - 'checkedValue' => 'foo', - 'uncheckedValue' => 'bar', - ); - - $element = new Zend_Form_Element_Checkbox('test', $options); - $this->assertEquals($options['uncheckedValue'], $element->getValue()); - } - - public function testSetOptionsSetsInitialValueAccordingToSubmittedValues() - { - $options = array( - 'test1' => array( - 'value' => 'foo', - 'checkedValue' => 'foo', - 'uncheckedValue' => 'bar', - ), - 'test2' => array( - 'value' => 'bar', - 'checkedValue' => 'foo', - 'uncheckedValue' => 'bar', - ), - ); - - foreach ($options as $current) { - $element = new Zend_Form_Element_Checkbox('test', $current); - $this->assertEquals($current['value'], $element->getValue()); - $this->assertEquals($current['checkedValue'], $element->getCheckedValue()); - $this->assertEquals($current['uncheckedValue'], $element->getUncheckedValue()); - } - } - - public function testCheckedValueAlwaysRenderedAsCheckboxValue() - { - $this->element->setValue($this->element->getUncheckedValue()); - $html = $this->element->render($this->getView()); - if (!preg_match_all('/(]+>)/', $html, $matches)) { - $this->fail('Unexpected generated HTML: ' . $html); - } - $this->assertEquals(2, count($matches[1])); - foreach ($matches[1] as $element) { - if (strstr($element, 'hidden')) { - $this->assertContains($this->element->getUncheckedValue(), $element); - } else { - $this->assertContains($this->element->getCheckedValue(), $element); - } - } - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_CheckboxTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_CheckboxTest::main") { - Zend_Form_Element_CheckboxTest::main(); -} diff --git a/tests/Zend/Form/Element/FileTest.php b/tests/Zend/Form/Element/FileTest.php deleted file mode 100644 index 84e2464e79..0000000000 --- a/tests/Zend/Form/Element/FileTest.php +++ /dev/null @@ -1,689 +0,0 @@ -element = new Zend_Form_Element_File('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testElementShouldProxyToParentForDecoratorPluginLoader() - { - $loader = $this->element->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Form_Decorator'); - $this->assertTrue(is_array($paths)); - - $loader = new Zend_Loader_PluginLoader; - $this->element->setPluginLoader($loader, 'decorator'); - $test = $this->element->getPluginLoader('decorator'); - $this->assertSame($loader, $test); - } - - public function testElementShouldProxyToParentWhenSettingDecoratorPrefixPaths() - { - $this->element->addPrefixPath('Foo_Decorator', 'Foo/Decorator/', 'decorator'); - $loader = $this->element->getPluginLoader('decorator'); - $paths = $loader->getPaths('Foo_Decorator'); - $this->assertTrue(is_array($paths)); - } - - public function testElementShouldAddToAllPluginLoadersWhenAddingNullPrefixPath() - { - $this->element->addPrefixPath('Foo', 'Foo'); - foreach (array('validate', 'filter', 'decorator', 'transfer_adapter') as $type) { - $loader = $this->element->getPluginLoader($type); - $string = str_replace('_', ' ', $type); - $string = ucwords($string); - $string = str_replace(' ', '_', $string); - $prefix = 'Foo_' . $string; - $paths = $loader->getPaths($prefix); - $this->assertTrue(is_array($paths), "Failed asserting paths found for prefix $prefix"); - } - } - - public function testElementShouldUseHttpTransferAdapterByDefault() - { - $adapter = $this->element->getTransferAdapter(); - $this->assertTrue($adapter instanceof Zend_File_Transfer_Adapter_Http); - } - - public function testElementShouldAllowSpecifyingAdapterUsingConcreteInstance() - { - $adapter = new Zend_Form_Element_FileTest_MockAdapter(); - $this->element->setTransferAdapter($adapter); - $test = $this->element->getTransferAdapter(); - $this->assertSame($adapter, $test); - } - - /** - * @expectedException Zend_Form_Element_Exception - */ - public function testElementShouldThrowExceptionWhenAddingAdapterOfInvalidType() - { - $this->element->setTransferAdapter(new stdClass); - } - - public function testShouldRegisterPluginLoaderWithFileTransferAdapterPathByDefault() - { - $loader = $this->element->getPluginLoader('transfer_adapter'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader_Interface); - $paths = $loader->getPaths('Zend_File_Transfer_Adapter'); - $this->assertTrue(is_array($paths)); - } - - public function testElementShouldAllowSpecifyingAdapterUsingPluginLoader() - { - $this->element->addPrefixPath('Zend_Form_Element_FileTest_Adapter', dirname(__FILE__) . '/_files/TransferAdapter', 'transfer_adapter'); - $this->element->setTransferAdapter('Foo'); - $test = $this->element->getTransferAdapter(); - $this->assertTrue($test instanceof Zend_Form_Element_FileTest_Adapter_Foo); - } - - public function testValidatorAccessAndMutationShouldProxyToAdapter() - { - $this->testElementShouldAllowSpecifyingAdapterUsingConcreteInstance(); - $this->element->addValidator('Count', false, 1) - ->addValidators(array( - 'Extension' => 'jpg', - new Zend_Validate_File_Upload(), - )); - $validators = $this->element->getValidators(); - $test = $this->element->getTransferAdapter()->getValidators(); - $this->assertEquals($validators, $test); - $this->assertTrue(is_array($test)); - $this->assertEquals(3, count($test)); - - $validator = $this->element->getValidator('count'); - $test = $this->element->getTransferAdapter()->getValidator('count'); - $this->assertNotNull($validator); - $this->assertSame($validator, $test); - - $this->element->removeValidator('Extension'); - $this->assertFalse($this->element->getTransferAdapter()->hasValidator('Extension')); - - $this->element->setValidators(array( - 'Upload', - array('validator' => 'Extension', 'options' => 'jpg'), - array('validator' => 'Count', 'options' => 1), - )); - $validators = $this->element->getValidators(); - $test = $this->element->getTransferAdapter()->getValidators(); - $this->assertSame($validators, $test); - $this->assertTrue(is_array($test)); - $this->assertEquals(3, count($test), var_export($test, 1)); - - $this->element->clearValidators(); - $validators = $this->element->getValidators(); - $this->assertTrue(is_array($validators)); - $this->assertEquals(0, count($validators)); - $test = $this->element->getTransferAdapter()->getValidators(); - $this->assertSame($validators, $test); - } - - public function testValidationShouldProxyToAdapter() - { - $this->markTestIncomplete('Unsure how to accurately test'); - - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter); - $this->element->addValidator('Regex', '/([a-z0-9]{13})$/i'); - $this->assertTrue($this->element->isValid('foo.jpg')); - } - - public function testDestinationMutatorsShouldProxyToTransferAdapter() - { - $adapter = new Zend_Form_Element_FileTest_MockAdapter(); - $this->element->setTransferAdapter($adapter); - - $this->element->setDestination(dirname(__FILE__)); - $this->assertEquals(dirname(__FILE__), $this->element->getDestination()); - $this->assertEquals(dirname(__FILE__), $this->element->getTransferAdapter()->getDestination('foo')); - } - - public function testSettingMultipleFiles() - { - $this->element->setMultiFile(3); - $this->assertEquals(3, $this->element->getMultiFile()); - } - - public function testFileInSubSubSubform() - { - $form = new Zend_Form(); - $element = new Zend_Form_Element_File('file1'); - $element2 = new Zend_Form_Element_File('file2'); - - $subform0 = new Zend_Form_SubForm(); - $subform0->addElement($element); - $subform0->addElement($element2); - $subform1 = new Zend_Form_SubForm(); - $subform1->addSubform($subform0, 'subform0'); - $subform2 = new Zend_Form_SubForm(); - $subform2->addSubform($subform1, 'subform1'); - $subform3 = new Zend_Form_SubForm(); - $subform3->addSubform($subform2, 'subform2'); - $form->addSubform($subform3, 'subform3'); - - $form->setView(new Zend_View()); - $output = (string) $form; - $this->assertContains('name="file1"', $output); - $this->assertContains('name="file2"', $output); - } - - public function testMultiFileInSubSubSubform() - { - $form = new Zend_Form(); - $element = new Zend_Form_Element_File('file'); - $element->setMultiFile(2); - - $subform0 = new Zend_Form_SubForm(); - $subform0->addElement($element); - $subform1 = new Zend_Form_SubForm(); - $subform1->addSubform($subform0, 'subform0'); - $subform2 = new Zend_Form_SubForm(); - $subform2->addSubform($subform1, 'subform1'); - $subform3 = new Zend_Form_SubForm(); - $subform3->addSubform($subform2, 'subform2'); - $form->addSubform($subform3, 'subform3'); - - $form->setView(new Zend_View()); - $output = (string) $form; - $this->assertContains('name="file[]"', $output); - $this->assertEquals(2, substr_count($output, 'file[]')); - } - - public function testMultiFileWithOneFile() - { - $form = new Zend_Form(); - $element = new Zend_Form_Element_File('file'); - $element->setMultiFile(1); - - $subform0 = new Zend_Form_SubForm(); - $subform0->addElement($element); - $subform1 = new Zend_Form_SubForm(); - $subform1->addSubform($subform0, 'subform0'); - $subform2 = new Zend_Form_SubForm(); - $subform2->addSubform($subform1, 'subform1'); - $subform3 = new Zend_Form_SubForm(); - $subform3->addSubform($subform2, 'subform2'); - $form->addSubform($subform3, 'subform3'); - - $form->setView(new Zend_View()); - $output = (string) $form; - $this->assertNotContains('name="file[]"', $output); - } - - public function testSettingMaxFileSize() - { - $max = $this->_convertIniToInteger(trim(ini_get('upload_max_filesize'))); - - $this->assertEquals(0, $this->element->getMaxFileSize()); - $this->element->setMaxFileSize($max); - $this->assertEquals($max, $this->element->getMaxFileSize()); - - $this->_errorOccurred = false; - set_error_handler(array($this, 'errorHandlerIgnore')); - $this->element->setMaxFileSize(999999999999); - if (!$this->_errorOccurred) { - $this->fail('INI exception expected'); - } - restore_error_handler(); - } - - public function testAutoGetPostMaxSize() - { - $this->element->setMaxFileSize(-1); - $this->assertNotEquals(-1, $this->element->getMaxFileSize()); - } - - public function testTranslatingValidatorErrors() - { - require_once 'Zend/Translate.php'; - $translate = new Zend_Translate('array', array('unused', 'foo' => 'bar'), 'en'); - $this->element->setTranslator($translate); - - $adapter = $this->element->getTranslator(); - $this->assertTrue($adapter instanceof Zend_Translate_Adapter_Array); - - $adapter = $this->element->getTransferAdapter(); - $adapter = $adapter->getTranslator(); - $this->assertTrue($adapter instanceof Zend_Translate_Adapter_Array); - - $this->assertFalse($this->element->translatorIsDisabled()); - $this->element->setDisableTranslator($translate); - $this->assertTrue($this->element->translatorIsDisabled()); - } - - public function testFileNameWithoutPath() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->element->setDestination(dirname(__FILE__)); - $this->assertEquals(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foo.jpg', $this->element->getFileName('foo', true)); - $this->assertEquals('foo.jpg', $this->element->getFileName('foo', false)); - } - - public function testEmptyFileName() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->element->setDestination(dirname(__FILE__)); - $this->assertEquals(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foo.jpg', $this->element->getFileName()); - } - - public function testIsReceived() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->assertEquals(false, $this->element->isReceived()); - } - - public function testIsUploaded() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->assertEquals(true, $this->element->isUploaded()); - } - - public function testIsFiltered() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->assertEquals(true, $this->element->isFiltered()); - } - - public function testDefaultDecorators() - { - $this->element->clearDecorators(); - $this->assertEquals(array(), $this->element->getDecorators()); - $this->element->setDisableLoadDefaultDecorators(true); - $this->element->loadDefaultDecorators(); - $this->assertEquals(array(), $this->element->getDecorators()); - $this->element->setDisableLoadDefaultDecorators(false); - $this->element->loadDefaultDecorators(); - $this->assertNotEquals(array(), $this->element->getDecorators()); - } - - public function testValueGetAndSet() - { - $this->element->setTransferAdapter(new Zend_Form_Element_FileTest_MockAdapter()); - $this->assertEquals(null, $this->element->getValue()); - $this->element->setValue('something'); - $this->assertEquals(null, $this->element->getValue()); - } - - public function testMarkerInterfaceForFileElement() - { - $this->element->setDecorators(array('ViewHelper')); - $this->assertEquals(1, count($this->element->getDecorators())); - - try { - $content = $this->element->render(new Zend_View()); - $this->fail(); - } catch (Zend_Form_Element_Exception $e) { - $this->assertContains('No file decorator found', $e->getMessage()); - } - } - - public function testFileSize() - { - $element = new Zend_Form_Element_File('baz'); - $adapter = new Zend_Form_Element_FileTest_MockAdapter(); - $element->setTransferAdapter($adapter); - - $this->assertEquals('1.14kB', $element->getFileSize('baz.text')); - $adapter->setOptions(array('useByteString' => false)); - $this->assertEquals(1172, $element->getFileSize('baz.text')); - } - - public function testMimeType() - { - $element = new Zend_Form_Element_File('baz'); - $adapter = new Zend_Form_Element_FileTest_MockAdapter(); - $element->setTransferAdapter($adapter); - - $this->assertEquals('text/plain', $element->getMimeType('baz.text')); - } - - public function testAddedErrorsAreDisplayed() - { - Zend_Form::setDefaultTranslator(null); - $element = new Zend_Form_Element_File('baz'); - $element->addError('TestError3'); - $adapter = new Zend_Form_Element_FileTest_MockAdapter(); - $element->setTransferAdapter($adapter); - - $this->assertTrue($element->hasErrors()); - $messages = $element->getMessages(); - $this->assertContains('TestError3', $messages); - } - - public function testGetTranslatorRetrievesGlobalDefaultWhenAvailable() - { - $this->assertNull($this->element->getTranslator()); - $translator = new Zend_Translate('array', array('foo' => 'bar')); - require_once 'Zend/Form.php'; - Zend_Form::setDefaultTranslator($translator); - $received = $this->element->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testDefaultDecoratorsContainDescription() - { - $element = new Zend_Form_Element_File('baz'); - $decorators = $element->getDecorator('Description'); - $this->assertTrue($decorators instanceof Zend_Form_Decorator_Description); - } - - private function _convertIniToInteger($setting) - { - if (!is_numeric($setting)) { - $type = strtoupper(substr($setting, -1)); - $setting = (integer) substr($setting, 0, -1); - - switch ($type) { - case 'M' : - $setting *= 1024; - break; - - case 'G' : - $setting *= 1024 * 1024; - break; - - default : - break; - } - } - - return (integer) $setting; - } - - /** - * Ignores a raised PHP error when in effect, but throws a flag to indicate an error occurred - * - * @param integer $errno - * @param string $errstr - * @param string $errfile - * @param integer $errline - * @param array $errcontext - * @return void - */ - public function errorHandlerIgnore($errno, $errstr, $errfile, $errline, array $errcontext) - { - $this->_errorOccurred = true; - } - - - /** - * Prove the fluent interface on Zend_Form_Element_File::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } - - /** - * @group ZF-12173 - */ - public function testElementShouldAllowAdapterWithBackslahes() - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->markTestSkipped( - __CLASS__ . '::' . __METHOD__ . ' requires PHP 5.3.0 or greater' - ); - return; - } - $this->element->addPrefixPath( - 'Zend\Form\Element\FileTest\Adapter', - dirname(__FILE__) . '/_files/TransferAdapter', - 'transfer_adapter' - ); - $this->element->setTransferAdapter('Bar'); - $test = $this->element->getTransferAdapter(); - - $expectedType = 'Zend\Form\Element\FileTest\Adapter\Bar'; - $this->assertTrue( - $test instanceof $expectedType - ); - } - - /** - * @group ZF-12210 - */ - public function testAutoInsertNotEmptyValidator() - { - $this->testElementShouldAllowSpecifyingAdapterUsingConcreteInstance(); - $this->element->setRequired(true); - - // Test before validation - $this->assertNull($this->element->getValidator('NotEmpty')); - - // Test after validation - $this->element->isValid('foo.jpg'); - - $this->assertTrue( - $this->element->getValidator('NotEmpty') instanceof Zend_Validate_NotEmpty - ); - } - - /** - * @group GH-247 - */ - public function testCallbackFunctionAtHtmlTag() - { - $this->assertEquals( - array( - 'callback' => array( - 'Zend_Form_Element_File', - 'resolveElementId', - ), - ), - $this->element->getDecorator('HtmlTag')->getOption('id') - ); - } - - /** - * @group GH-247 - */ - public function testDefaultDecoratorOrder() - { - $expected = array( - 'Zend_Form_Decorator_File', - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - 'Zend_Form_Decorator_HtmlTag', - 'Zend_Form_Decorator_Label', - ); - - $this->assertEquals( - $expected, - array_keys($this->element->getDecorators()) - ); - } -} - -class Zend_Form_Element_FileTest_MockAdapter extends Zend_File_Transfer_Adapter_Abstract -{ - public $received = false; - - public function __construct() - { - $testfile = dirname(__FILE__) . '/../../File/Transfer/Adapter/_files/test.txt'; - $this->_files = array( - 'foo' => array( - 'name' => 'foo.jpg', - 'type' => 'image/jpeg', - 'size' => 126976, - 'tmp_name' => '/tmp/489127ba5c89c', - 'options' => array('ignoreNoFile' => false, 'useByteString' => true), - 'validated' => false, - 'received' => false, - 'filtered' => false, - 'validators' => array(), - ), - 'bar' => array( - 'name' => 'bar.png', - 'type' => 'image/png', - 'size' => 91136, - 'tmp_name' => '/tmp/489128284b51f', - 'options' => array('ignoreNoFile' => false, 'useByteString' => true), - 'validated' => false, - 'received' => false, - 'filtered' => false, - 'validators' => array(), - ), - 'baz' => array( - 'name' => 'baz.text', - 'type' => 'text/plain', - 'size' => 1172, - 'tmp_name' => $testfile, - 'options' => array('ignoreNoFile' => false, 'useByteString' => true), - 'validated' => false, - 'received' => false, - 'filtered' => false, - 'validators' => array(), - ), - 'file_1_' => array( - 'name' => 'baz.text', - 'type' => 'text/plain', - 'size' => 1172, - 'tmp_name' => '/tmp/4891286cceff3', - 'options' => array('ignoreNoFile' => false, 'useByteString' => true), - 'validated' => false, - 'received' => false, - 'filtered' => false, - 'validators' => array(), - ), - 'file_2_' => array( - 'name' => 'baz.text', - 'type' => 'text/plain', - 'size' => 1172, - 'tmp_name' => '/tmp/4891286cceff3', - 'options' => array('ignoreNoFile' => false, 'useByteString' => true), - 'validated' => false, - 'received' => false, - 'filtered' => false, - 'validators' => array(), - ), - ); - } - - public function send($options = null) - { - return; - } - - public function receive($options = null) - { - $this->received = true; - return; - } - - public function isSent($file = null) - { - return false; - } - - public function isReceived($file = null) - { - return $this->received; - } - - public function isUploaded($files = null) - { - return true; - } - - public function isFiltered($files = null) - { - return true; - } - - public static function getProgress() - { - return; - } -} - -// Call Zend_Form_Element_FileTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_FileTest::main") { - Zend_Form_Element_FileTest::main(); -} diff --git a/tests/Zend/Form/Element/HashTest.php b/tests/Zend/Form/Element/HashTest.php deleted file mode 100644 index d255669b92..0000000000 --- a/tests/Zend/Form/Element/HashTest.php +++ /dev/null @@ -1,268 +0,0 @@ -hash)) { - unset($this->hash); - } - - $session = new Zend_Form_Element_HashTest_SessionContainer(); - $session->hash = null; - - $this->element = new Zend_Form_Element_Hash('foo', array( - 'session' => $session, - )); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testHashElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testHashElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testSaltPopulatedByDefault() - { - $salt = $this->element->getSalt(); - $this->assertFalse(empty($salt)); - } - - public function testCanSetSalt() - { - $salt = $this->element->getSalt(); - $this->element->setSalt('foobar'); - $this->assertNotEquals($salt, $this->element->getSalt()); - $this->assertEquals('foobar', $this->element->getSalt()); - } - - public function testTimeoutPopulatedByDefault() - { - $ttl = $this->element->getTimeout(); - $this->assertFalse(empty($ttl)); - $this->assertTrue(is_int($ttl)); - } - - public function testCanSetTimeout() - { - $ttl = $this->element->getTimeout(); - $this->element->setTimeout(3600); - $this->assertNotEquals($ttl, $this->element->getTimeout()); - $this->assertEquals(3600, $this->element->getTimeout()); - } - - public function testGetHashReturnsHashValue() - { - $hash = $this->element->getHash(); - $this->assertFalse(empty($hash)); - $this->assertTrue(is_string($hash)); - $this->hash = $hash; - } - - public function testGetHashSetsElementValueToHash() - { - $this->testGetHashReturnsHashValue(); - $this->assertEquals($this->hash, $this->element->getValue()); - } - - public function testHashIsMd5() - { - $this->testGetHashReturnsHashValue(); - $this->assertEquals(32, strlen($this->hash)); - $this->assertRegexp('/^[a-f0-9]{32}$/', $this->hash); - } - - public function testLabelIsNull() - { - $this->assertNull($this->element->getLabel()); - } - - public function testSessionNameContainsSaltAndName() - { - $sessionName = $this->element->getSessionName(); - $this->assertContains($this->element->getSalt(), $sessionName); - $this->assertContains($this->element->getName(), $sessionName); - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testValidatorTokenReceivesSessionHashWhenPresent() - { - $this->_checkZf2794(); - - $session = $this->element->getSession(); - $session->hash = $this->element->getHash(); - $element = new Zend_Form_Element_Hash('foo', array('session' => $session)); - $validator = $element->getValidator('Identical'); - $this->assertEquals($session->hash, $validator->getToken()); - } - - public function testRenderInitializesSessionHashToken() - { - $session = $this->element->getSession(); - $this->assertNull($session->hash); - $html = $this->element->render($this->getView()); - - $this->assertEquals($this->element->getHash(), $session->hash); - $this->assertEquals(1, $session->setExpirationHops); - $this->assertEquals($this->element->getTimeout(), $session->setExpirationSeconds); - } - - public function testHashTokenIsRendered() - { - $html = $this->element->render($this->getView()); - $this->assertContains($this->element->getHash(), $html); - } - - public function testHiddenInputRenderedByDefault() - { - $html = $this->element->render($this->getView()); - $this->assertRegexp('/]*?type="hidden"/', $html, $html); - } - - /** - * @group ZF-7404 - */ - public function testShouldRenderHashTokenIfRenderedThroughMagicCall() - { - $this->element->setView($this->getView()); - $html = $this->element->renderViewHelper(); - $this->assertContains($this->element->getHash(), $html, 'Html is: ' . $html); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -class Zend_Form_Element_HashTest_SessionContainer -{ - protected static $_hash; - - public function __get($name) - { - if ('hash' == $name) { - return self::$_hash; - } - - return null; - } - - public function __set($name, $value) - { - if ('hash' == $name) { - self::$_hash = $value; - } else { - $this->$name = $value; - } - } - - public function __isset($name) - { - if (('hash' == $name) && (null !== self::$_hash)) { - return true; - } - - return false; - } - - public function __call($method, $args) - { - switch ($method) { - case 'setExpirationHops': - case 'setExpirationSeconds': - $this->$method = array_shift($args); - break; - default: - } - } -} - -// Call Zend_Form_Element_HashTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_HashTest::main") { - Zend_Form_Element_HashTest::main(); -} diff --git a/tests/Zend/Form/Element/HiddenTest.php b/tests/Zend/Form/Element/HiddenTest.php deleted file mode 100644 index f4ef90bb37..0000000000 --- a/tests/Zend/Form/Element/HiddenTest.php +++ /dev/null @@ -1,113 +0,0 @@ -element = new Zend_Form_Element_Hidden('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testHiddenElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testHiddenElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testHiddenElementUsesHiddenHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formHidden', $helper); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_HiddenTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_HiddenTest::main") { - Zend_Form_Element_HiddenTest::main(); -} diff --git a/tests/Zend/Form/Element/ImageTest.php b/tests/Zend/Form/Element/ImageTest.php deleted file mode 100644 index 067e920321..0000000000 --- a/tests/Zend/Form/Element/ImageTest.php +++ /dev/null @@ -1,222 +0,0 @@ -element = new Zend_Form_Element_Image('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testImageElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testImageElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testImageElementUsesImageDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('Image'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Image); - } - - /** - * ZF-2717 - */ - public function testImageShouldSetHelperPropertyToFormImageByDefault() - { - $this->assertEquals('formImage', $this->element->helper); - } - - public function testImageSourceValueNullByDefault() - { - $this->assertNull($this->element->getImage()); - $this->assertNull($this->element->src); - } - - public function testCanSetImageSourceViaAccessors() - { - $this->element->setImage('foo.gif'); - $this->assertEquals('foo.gif', $this->element->getImage()); - $this->assertEquals('foo.gif', $this->element->src); - } - - public function testImageSourceUsedWhenRenderingImage() - { - $this->testCanSetImageSourceViaAccessors(); - $html = $this->element->render(new Zend_View()); - $this->assertContains('src="foo.gif"', $html); - } - - public function testHelperAttributeNotRenderedWhenRenderingImage() - { - $this->testCanSetImageSourceViaAccessors(); - $html = $this->element->render(new Zend_View()); - $this->assertNotContains('helper="', $html); - } - - public function testValueEmptyWhenRenderingImageByDefault() - { - $this->testCanSetImageSourceViaAccessors(); - $html = $this->element->render(new Zend_View()); - if (!strstr($html, 'value="')) { - return; - } - $this->assertContains('value=""', $html); - } - - public function testLabelUsedAsAltAttribute() - { - $this->element->setLabel('Foo Bar'); - $html = $this->element->render(new Zend_View()); - $this->assertRegexp('#]*alt="Foo Bar"#', $html); - } - - public function testImageValueRenderedAsElementValue() - { - $this->element->setImageValue('foo') - ->setImage('foo.gif'); - $html = $this->element->render(new Zend_View()); - $this->assertRegexp('#]*value="foo"#', $html, $html); - } - - public function testIsCheckedReturnsSetValueMatchesImageValue() - { - $this->assertFalse($this->element->isChecked()); - $this->element->setImageValue('foo'); - $this->assertFalse($this->element->isChecked()); - $this->element->setValue('foo'); - $this->assertTrue($this->element->isChecked()); - $this->element->setValue('bar'); - $this->assertFalse($this->element->isChecked()); - } - - /* - * Tests if title attribute (tooltip) is translated if the default decorators are loaded. - * These decorators should load the Tooltip decorator as the first decorator. - * @group ZF-6151 - */ - public function testTitleAttributeGetsTranslated() - { - $this->element->setAttrib('title', 'bar'); - $translator = new Zend_Translate_Adapter_Array(array("bar" => "baz"), 'de'); - $this->element->setTranslator($translator); - $html = $this->element->render(new Zend_View()); - $this->assertContains('title', $html); - $this->assertContains('baz', $html); - $this->assertNotContains('bar', $html); - } - - public function testTitleAttributeDoesNotGetTranslatedIfTranslatorIsDisabled() - { - $this->element->setAttrib('title', 'bar'); - $translator = new Zend_Translate_Adapter_Array(array("bar" => "baz"), 'de'); - $this->element->setTranslator($translator); - // now disable translator and see if that works - $this->element->setDisableTranslator(true); - $html = $this->element->render(new Zend_View()); - $this->assertContains('title', $html); - $this->assertContains('bar', $html); - $this->assertNotContains('baz', $html); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * Prove the fluent interface on Zend_Form_Element_Image::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } -} - -// Call Zend_Form_Element_ImageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_ImageTest::main") { - Zend_Form_Element_ImageTest::main(); -} diff --git a/tests/Zend/Form/Element/MultiCheckboxTest.php b/tests/Zend/Form/Element/MultiCheckboxTest.php deleted file mode 100644 index 0829336051..0000000000 --- a/tests/Zend/Form/Element/MultiCheckboxTest.php +++ /dev/null @@ -1,353 +0,0 @@ -element = new Zend_Form_Element_MultiCheckbox('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testMultiCheckboxElementSubclassesMultiElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Multi); - } - - public function testMultiCheckboxElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testMultiCheckboxElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testMultiCheckboxElementIsAnArrayByDefault() - { - $this->assertTrue($this->element->isArray()); - } - - public function testHelperAttributeSetToFormMultiCheckboxByDefault() - { - $this->assertEquals('formMultiCheckbox', $this->element->getAttrib('helper')); - } - - public function testMultiCheckboxElementUsesMultiCheckboxHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formMultiCheckbox', $helper); - } - - public function testCanDisableIndividualMultiCheckboxOptions() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - 'bat' => 'Bat', - 'test' => 'Test', - )) - ->setAttrib('disable', array('baz', 'test')); - $html = $this->element->render($this->getView()); - foreach (array('baz', 'test') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching disabled option for ' . $test); - } - $this->assertRegexp('/]*?(disabled="disabled")/', $m[1]); - } - foreach (array('foo', 'bar', 'bat') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching option for ' . $test); - } - $this->assertNotRegexp('/]*?(disabled="disabled")/', $m[1], var_export($m, 1)); - } - } - - public function testSpecifiedSeparatorIsUsedWhenRendering() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - 'bat' => 'Bat', - 'test' => 'Test', - )) - ->setSeparator('--FooBarFunSep--'); - $html = $this->element->render($this->getView()); - $this->assertContains($this->element->getSeparator(), $html); - $count = substr_count($html, $this->element->getSeparator()); - $this->assertEquals(4, $count); - } - - /** - * @group ZF-2830 - */ - public function testRenderingMulticheckboxCreatesCorrectArrayNotation() - { - $this->element->addMultiOption(1, 'A'); - $this->element->addMultiOption(2, 'B'); - $html = $this->element->render($this->getView()); - $this->assertContains('name="foo[]"', $html, $html); - $count = substr_count($html, 'name="foo[]"'); - $this->assertEquals(2, $count); - } - - /** - * @group ZF-2828 - */ - public function testCanPopulateCheckboxOptionsFromPostedData() - { - $form = new Zend_Form(array( - 'elements' => array( - '100_1' => array('MultiCheckbox', array( - 'multiOptions' => array( - '100_1_1' => 'Agriculture', - '100_1_2' => 'Automotive', - '100_1_12' => 'Chemical', - '100_1_13' => 'Communications', - ), - 'required' => true, - )), - ), - )); - $data = array( - '100_1' => array( - '100_1_1', - '100_1_2', - '100_1_12', - '100_1_13' - ), - ); - $form->populate($data); - $html = $form->render($this->getView()); - foreach ($form->getElement('100_1')->getMultiOptions() as $key => $value) { - if (!preg_match('#(]*' . $key . '[^>]*>)#', $html, $m)) { - $this->fail('Missing input for a given multi option: ' . $html); - } - $this->assertContains('checked="checked"', $m[1]); - } - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /**#+ - * @group ZF-3286 - */ - public function testShouldRegisterInArrayValidatorByDefault() - { - $this->assertTrue($this->element->registerInArrayValidator()); - } - - public function testShouldAllowSpecifyingWhetherOrNotToUseInArrayValidator() - { - $this->testShouldRegisterInArrayValidatorByDefault(); - $this->element->setRegisterInArrayValidator(false); - $this->assertFalse($this->element->registerInArrayValidator()); - $this->element->setRegisterInArrayValidator(true); - $this->assertTrue($this->element->registerInArrayValidator()); - } - - public function testInArrayValidatorShouldBeRegisteredAfterValidation() - { - $options = array( - 'foo' => 'Foo Value', - 'bar' => 'Bar Value', - 'baz' => 'Baz Value', - ); - $this->element->setMultiOptions($options); - $this->assertFalse($this->element->getValidator('InArray')); - $this->element->isValid('test'); - $validator = $this->element->getValidator('InArray'); - $this->assertTrue($validator instanceof Zend_Validate_InArray); - } - - public function testShouldNotValidateIfValueIsNotInArray() - { - $options = array( - 'foo' => 'Foo Value', - 'bar' => 'Bar Value', - 'baz' => 'Baz Value', - ); - $this->element->setMultiOptions($options); - $this->assertFalse($this->element->getValidator('InArray')); - $this->assertFalse($this->element->isValid('test')); - } - /**#@-*/ - - /** - * No assertion; just making sure no error occurs - * - * @group ZF-4915 - */ - public function testRetrievingErrorMessagesShouldNotResultInError() - { - $this->element->addMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - )) - ->addErrorMessage('%value% is invalid'); - $this->element->isValid(array('foo', 'bogus')); - $html = $this->element->render($this->getView()); - } - - /** - * @group ZF-11402 - */ - public function testValidateShouldNotAcceptEmptyArray() - { - $this->element->addMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - )); - $this->element->setRegisterInArrayValidator(true); - - $this->assertTrue($this->element->isValid(array('foo'))); - $this->assertTrue($this->element->isValid(array('foo','baz'))); - - $this->element->setAllowEmpty(true); - $this->assertTrue($this->element->isValid(array())); - - // Empty value + AllowEmpty=true = no error messages - $messages = $this->element->getMessages(); - $this->assertEquals(0, count($messages), 'Received unexpected error message(s)'); - - $this->element->setAllowEmpty(false); - $this->assertFalse($this->element->isValid(array())); - - // Empty value + AllowEmpty=false = notInArray error message - $messages = $this->element->getMessages(); - $this->assertTrue(is_array($messages), 'Expected error message'); - $this->assertArrayHasKey('notInArray', $messages, 'Expected \'notInArray\' error message'); - - $this->element->setRequired(true)->setAllowEmpty(false); - $this->assertFalse($this->element->isValid(array())); - - // Empty value + Required=true + AllowEmpty=false = isEmpty error message - $messages = $this->element->getMessages(); - $this->assertTrue(is_array($messages), 'Expected error message'); - $this->assertArrayHasKey('isEmpty', $messages, 'Expected \'isEmpty\' error message'); - } - - /** - * @group ZF-12059 - */ - public function testDisabledForAttribute() - { - $this->element->setLabel('Foo'); - - $expected = '
    ' - . PHP_EOL - . '
    ' - . PHP_EOL - . '
    '; - $this->assertSame($expected, $this->element->render($this->getView())); - } - - /** - * @group ZF-12059 - */ - public function testDisabledForAttributeWithoutLabelDecorator() - { - $this->element->setLabel('Foo')->removeDecorator('label'); - - $expected = '
    ' - . PHP_EOL - . '
    '; - $this->assertSame($expected, $this->element->render($this->getView())); - } -} - -// Call Zend_Form_Element_MultiCheckboxTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_MultiCheckboxTest::main") { - Zend_Form_Element_MultiCheckboxTest::main(); -} diff --git a/tests/Zend/Form/Element/MultiselectTest.php b/tests/Zend/Form/Element/MultiselectTest.php deleted file mode 100644 index db3bffc49f..0000000000 --- a/tests/Zend/Form/Element/MultiselectTest.php +++ /dev/null @@ -1,384 +0,0 @@ -element = new Zend_Form_Element_Multiselect('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper/'); - return $view; - } - - public function testMultiselectElementInstanceOfMultiElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Multi); - } - - public function testMultiselectElementInstanceOfXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testMultiselectElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testMultiselectElementIsAnArrayByDefault() - { - $this->assertTrue($this->element->isArray()); - } - - public function testMultiselectElementUsesSelectHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formSelect', $helper); - } - - public function testMultipleOptionSetByDefault() - { - $this->assertNotNull($this->element->multiple); - $this->assertEquals('multiple', $this->element->multiple); - } - - public function testHasDefaultSeparator() - { - $this->assertEquals('
    ', $this->element->getSeparator()); - } - - public function testCanSetSeparator() - { - $this->testHasDefaultSeparator(); - $this->element->setSeparator("\n"); - $this->assertEquals("\n", $this->element->getSeparator()); - } - - public function testMultiOptionsEmptyByDefault() - { - $options = $this->element->getMultiOptions(); - $this->assertTrue(is_array($options)); - $this->assertTrue(empty($options)); - } - - public function testCanSetMultiOptions() - { - $this->testMultiOptionsEmptyByDefault(); - $this->element->addMultiOption('foo', 'foovalue'); - $this->assertEquals('foovalue', $this->element->getMultiOption('foo')); - $this->element->setMultiOptions(array('bar' => 'barvalue', 'baz' => 'bazvalue')); - $this->assertEquals(array('bar' => 'barvalue', 'baz' => 'bazvalue'), $this->element->getMultiOptions()); - $this->element->addMultiOptions(array('bat' => 'batvalue', 'foo' => 'foovalue')); - $this->assertEquals(array('bar' => 'barvalue', 'baz' => 'bazvalue', 'bat' => 'batvalue', 'foo' => 'foovalue'), $this->element->getMultiOptions()); - $this->element->addMultiOption('test', 'testvalue'); - $this->assertEquals(array('bar' => 'barvalue', 'baz' => 'bazvalue', 'bat' => 'batvalue', 'foo' => 'foovalue', 'test' => 'testvalue'), $this->element->getMultiOptions()); - } - - /** - * @group ZF-2824 - */ - public function testCanSetMultiOptionsUsingAssocArraysWithKeyValueKeys() - { - $options = array( - array( - 'value' => '1', - 'key' => 'aa', - ), - array ( - 'key' => '2', - 'value' => 'xxxx', - ), - array ( - 'value' => '444', - 'key' => 'ssss', - ), - ); - $this->element->addMultiOptions($options); - $this->assertEquals($options[0]['value'], $this->element->getMultiOption('aa')); - $this->assertEquals($options[1]['value'], $this->element->getMultiOption(2)); - $this->assertEquals($options[2]['value'], $this->element->getMultiOption('ssss')); - } - - /** - * @group ZF-2824 - */ - public function testCanSetMultiOptionsUsingConfigWithKeyValueKeys() - { - require_once 'Zend/Config/Xml.php'; - $config = new Zend_Config_Xml(dirname(__FILE__) . '/../_files/config/multiOptions.xml', 'testing'); - $this->element->setMultiOptions($config->options->toArray()); - $this->assertEquals($config->options->first->value, $this->element->getMultiOption('aa')); - $this->assertEquals($config->options->second->value, $this->element->getMultiOption(2)); - $this->assertEquals($config->options->third->value, $this->element->getMultiOption('ssss')); - - require_once 'Zend/Config/Ini.php'; - $config = new Zend_Config_Ini(dirname(__FILE__) . '/../_files/config/multiOptions.ini', 'testing'); - $this->element->setMultiOptions($config->options->toArray()); - $this->assertEquals($config->options->first->value, $this->element->getMultiOption('aa')); - $this->assertEquals($config->options->second->value, $this->element->getMultiOption(2)); - $this->assertEquals($config->options->third->value, $this->element->getMultiOption('ssss')); - - } - - public function testCanRemoveMultiOption() - { - $this->testMultiOptionsEmptyByDefault(); - $this->element->addMultiOption('foo', 'foovalue'); - $this->assertEquals('foovalue', $this->element->getMultiOption('foo')); - $this->element->removeMultiOption('foo'); - $this->assertNull($this->element->getMultiOption('foo')); - } - - public function testOptionsAreRenderedInFinalMarkup() - { - $options = array( - 'foovalue' => 'Foo', - 'barvalue' => 'Bar' - ); - $this->element->addMultiOptions($options); - $html = $this->element->render($this->getView()); - foreach ($options as $value => $label) { - $this->assertRegexp('/]*>' . $label . '/s', $html, $html); - } - } - - public function testTranslatedOptionsAreRenderedInFinalMarkupWhenTranslatorPresent() - { - $translations = array( - 'ThisShouldNotShow' => 'Foo Value', - 'ThisShouldNeverShow' => 'Bar Value' - ); - require_once 'Zend/Translate.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $options = array( - 'foovalue' => 'ThisShouldNotShow', - 'barvalue' => 'ThisShouldNeverShow' - ); - - $this->element->setTranslator($translate) - ->addMultiOptions($options); - - $html = $this->element->render($this->getView()); - foreach ($options as $value => $label) { - $this->assertNotContains($label, $html, $html); - $this->assertRegexp('/]*>' . $translations[$label] . '/s', $html, $html); - } - } - - public function testOptionLabelsAreTranslatedWhenTranslateAdapterIsPresent() - { - $translations = include dirname(__FILE__) . '/../_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $options = array( - 'foovalue' => 'Foo', - 'barvalue' => 'Bar' - ); - $this->element->addMultiOptions($options) - ->setTranslator($translate); - $test = $this->element->getMultiOption('barvalue'); - $this->assertEquals($translations[$options['barvalue']], $test); - - $test = $this->element->getMultiOptions(); - foreach ($test as $key => $value) { - $this->assertEquals($translations[$options[$key]], $value); - } - } - - public function testOptionLabelsAreUntouchedIfTranslatonDoesNotExistInnTranslateAdapter() - { - $translations = include dirname(__FILE__) . '/../_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $options = array( - 'foovalue' => 'Foo', - 'barvalue' => 'Bar', - 'testing' => 'Test Value', - ); - $this->element->addMultiOptions($options) - ->setTranslator($translate); - $test = $this->element->getMultiOption('testing'); - $this->assertEquals($options['testing'], $test); - } - - public function testMultiselectIsArrayByDefault() - { - $this->assertTrue($this->element->isArray()); - } - - /** - * @group ZF-5568 - */ - public function testOptGroupTranslationsShouldWorkAfterPopulatingElement() - { - $translations = array( - 'ThisIsTheLabel' => 'Optgroup label', - 'ThisShouldNotShow' => 'Foo Value', - 'ThisShouldNeverShow' => 'Bar Value' - ); - require_once 'Zend/Translate.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $options = array( - 'ThisIsTheLabel' => array( - 'foovalue' => 'ThisShouldNotShow', - 'barvalue' => 'ThisShouldNeverShow', - ), - ); - - $this->element->setTranslator($translate) - ->addMultiOptions($options); - - $this->element->setValue('barValue'); - - $html = $this->element->render($this->getView()); - $this->assertContains($translations['ThisIsTheLabel'], $html, $html); - } - - /** - * @group ZF-5937 - */ - public function testAddMultiOptionShouldWorkAfterTranslatorIsDisabled() - { - $options = array( - 'foovalue' => 'Foo', - ); - $this->element->setDisableTranslator(true) - ->addMultiOptions($options); - $test = $this->element->getMultiOption('foovalue'); - $this->assertEquals($options['foovalue'], $test); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * @group ZF-11667 - */ - public function testSimilarErrorMessagesForMultiElementAreNotDuplicated() - { - $this->element->setConcatJustValuesInErrorMessage(true); - - // create element with 4 checkboxes - $this->element->setMultiOptions(array( - 'multiOptions' => array( - array('key' => 'a', 'value' => 'A'), - array('key' => 'b', 'value' => 'B'), - array('key' => 'c', 'value' => 'C'), - array('key' => 'd', 'value' => 'D'), - ) - )); - - // check 3 of them - $this->element->setValue(array('A', 'B', 'D')); - - // later on, fails some validation on submit - $this->element->addError('some error! %value%'); - - $this->assertEquals( - array('some error! A; B; D'), - $this->element->getMessages() - ); - } -} - -// Call Zend_Form_Element_MultiselectTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_MultiselectTest::main") { - Zend_Form_Element_MultiselectTest::main(); -} diff --git a/tests/Zend/Form/Element/NoteTest.php b/tests/Zend/Form/Element/NoteTest.php deleted file mode 100644 index 724c2b0d9b..0000000000 --- a/tests/Zend/Form/Element/NoteTest.php +++ /dev/null @@ -1,237 +0,0 @@ -element = new Zend_Form_Element_Note('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testNoteElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testNoteElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testNoteElementUsesNoteHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formNote', $helper); - } - - public function testNoteElementValidationIsAlwaysTrue() - { - // Solo - $this->assertTrue($this->element->isValid('foo')); - - // Set required - $this->element->setRequired(true); - $this->assertTrue($this->element->isValid('')); - // Reset - $this->element->setRequired(false); - - // Examining various validators - $validators = array( - array( - 'options' => array('Alnum'), - 'value' => 'aa11?? ', - ), - array( - 'options' => array('Alpha'), - 'value' => 'aabb11', - ), - array( - 'options' => array( - 'Between', - false, - array( - 'min' => 0, - 'max' => 10, - ) - ), - 'value' => '11', - ), - array( - 'options' => array('Date'), - 'value' => '10.10.2000', - ), - array( - 'options' => array('Digits'), - 'value' => '1122aa', - ), - array( - 'options' => array('EmailAddress'), - 'value' => 'foo', - ), - array( - 'options' => array('Float'), - 'value' => '10a01', - ), - array( - 'options' => array( - 'GreaterThan', - false, - array('min' => 10), - ), - 'value' => '9', - ), - array( - 'options' => array('Hex'), - 'value' => '123ABCDEFGH', - ), - array( - 'options' => array( - 'InArray', - false, - array( - 'key' => 'value', - 'otherkey' => 'othervalue', - ) - ), - 'value' => 'foo', - ), - array( - 'options' => array('Int'), - 'value' => '1234.5', - ), - array( - 'options' => array( - 'LessThan', - false, - array('max' => 10), - ), - 'value' => '11', - ), - array( - 'options' => array('NotEmpty'), - 'value' => '', - ), - array( - 'options' => array( - 'Regex', - false, - array('pattern' => '/^Test/'), - ), - 'value' => 'Pest', - ), - array( - 'options' => array( - 'StringLength', - false, - array( - 6, - 20, - ) - ), - 'value' => 'foo', - ), - ); - - foreach ($validators as $validator) { - // Add validator - $this->element->addValidators(array($validator['options'])); - - // Testing - $this->assertTrue($this->element->isValid($validator['value'])); - - // Remove validator - $this->element->removeValidator($validator['options'][0]); - } - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' - && version_compare(PHP_VERSION, '5.1.4', '=') - ) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_NoteTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_NoteTest::main") { - Zend_Form_Element_NoteTest::main(); -} diff --git a/tests/Zend/Form/Element/PasswordTest.php b/tests/Zend/Form/Element/PasswordTest.php deleted file mode 100644 index 8700de5578..0000000000 --- a/tests/Zend/Form/Element/PasswordTest.php +++ /dev/null @@ -1,181 +0,0 @@ -errors = array(); - $this->element = new Zend_Form_Element_Password('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testPasswordElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testPasswordElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testHelperAttributeSetToFormPasswordByDefault() - { - $this->assertEquals('formPassword', $this->element->getAttrib('helper')); - } - - public function testPasswordElementUsesPasswordHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formPassword', $helper); - } - - public function testPasswordValueMaskedByGetMessages() - { - $this->element->addValidators(array( - 'Alpha', - 'Alnum' - )); - $value = 'abc-123'; - $expect = '*******'; - $this->assertFalse($this->element->isValid($value)); - foreach ($this->element->getMessages() as $message) { - $this->assertNotContains($value, $message); - $this->assertContains($expect, $message, $message); - } - } - - public function handleErrors($errno, $errmsg, $errfile, $errline, $errcontext) - { - if (!isset($this->errors)) { - $this->errors = array(); - } - $this->errors[] = $errmsg; - } - - /** - * ZF-2656 - */ - public function testGetMessagesReturnsEmptyArrayWhenNoMessagesRegistered() - { - set_error_handler(array($this, 'handleErrors')); - $messages = $this->element->getMessages(); - restore_error_handler(); - $this->assertSame(array(), $messages); - $this->assertTrue(empty($this->errors)); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - public function testRenderPasswordAttributeShouldDefaultToFalse() - { - $this->assertFalse($this->element->renderPassword()); - } - - public function testShouldAllowSettingRenderPasswordFlag() - { - $this->testRenderPasswordAttributeShouldDefaultToFalse(); - $this->element->setRenderPassword(true); - $this->assertTrue($this->element->renderPassword()); - $this->element->setRenderPassword(false); - $this->assertFalse($this->element->renderPassword()); - } - - public function testShouldPassRenderPasswordAttributeToViewHelper() - { - $this->element->setValue('foobar') - ->setView(new Zend_View()); - $test = $this->element->render(); - $this->assertContains('value=""', $test); - - $this->element->setRenderPassword(true); - $test = $this->element->render(); - $this->assertContains('value="foobar"', $test); - } -} - -// Call Zend_Form_Element_PasswordTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_PasswordTest::main") { - Zend_Form_Element_PasswordTest::main(); -} diff --git a/tests/Zend/Form/Element/RadioTest.php b/tests/Zend/Form/Element/RadioTest.php deleted file mode 100644 index c55052e1ed..0000000000 --- a/tests/Zend/Form/Element/RadioTest.php +++ /dev/null @@ -1,270 +0,0 @@ -element = new Zend_Form_Element_Radio('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testRadioElementSubclassesMultiElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Multi); - } - - public function testRadioElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testRadioElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testRadioElementIsNotAnArrayByDefault() - { - $this->assertFalse($this->element->isArray()); - } - - public function testHelperAttributeSetToFormRadioByDefault() - { - $this->assertEquals('formRadio', $this->element->getAttrib('helper')); - } - - public function testRadioElementUsesRadioHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formRadio', $helper); - } - - public function testCanDisableIndividualRadioOptions() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - 'bat' => 'Bat', - 'test' => 'Test', - )) - ->setAttrib('disable', array('baz', 'test')); - $html = $this->element->render($this->getView()); - foreach (array('baz', 'test') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching disabled option for ' . $test); - } - $this->assertRegexp('/]*?(disabled="disabled")/', $m[1]); - } - foreach (array('foo', 'bar', 'bat') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching option for ' . $test); - } - $this->assertNotRegexp('/]*?(disabled="disabled")/', $m[1], var_export($m, 1)); - } - } - - public function testSpecifiedSeparatorIsUsedWhenRendering() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - 'bat' => 'Bat', - 'test' => 'Test', - )) - ->setSeparator('--FooBarFunSep--'); - $html = $this->element->render($this->getView()); - $this->assertContains($this->element->getSeparator(), $html); - $count = substr_count($html, $this->element->getSeparator()); - $this->assertEquals(4, $count); - } - - public function testRadioElementRendersDtDdWrapper() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz', - 'bat' => 'Bat', - 'test' => 'Test', - )); - $html = $this->element->render($this->getView()); - $this->assertRegexp('#]*>&\#160;.*?addElementPrefixPath('My_Decorator', dirname(__FILE__) . '/../_files/decorators/', 'decorator'); - - $form->addElement($this->element); - - $element = $form->getElement('foo'); - - $this->assertTrue( - $element->getDecorator('Label') instanceof My_Decorator_Label - ); - } - - /** - * @group ZF-6426 - */ - public function testRenderingShouldCreateLabelWithoutForAttribute() - { - $this->element->setMultiOptions(array( - 'foo' => 'Foo', - 'bar' => 'Bar', - )) - ->setLabel('Foo'); - $html = $this->element->render($this->getView()); - $this->assertNotContains('for="foo"', $html); - } - - /** - * @group ZF-11517 - */ - public function testCreationWithIndividualDecoratorsAsConstructorOptionsWithoutLabel() - { - $element = new Zend_Form_Element_Radio(array( - 'name' => 'foo', - 'multiOptions' => array( - 'bar' => 'Bar', - 'baz' => 'Baz', - ), - 'decorators' => array( - 'ViewHelper', - ), - )); - - $this->assertFalse($element->getDecorator('label')); - } - - /** - * @group ZF-11517 - */ - public function testRenderingWithIndividualDecoratorsAsConstructorOptionsWithoutLabel() - { - $element = new Zend_Form_Element_Radio(array( - 'name' => 'foo', - 'multiOptions' => array( - 'bar' => 'Bar', - 'baz' => 'Baz', - ), - 'decorators' => array( - 'ViewHelper', - ), - )); - - $html = $element->render($this->getView()); - $this->assertNotContains('
     
    ', $html); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * Prove the fluent interface on Zend_Form_Element_Radio::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } -} - -// Call Zend_Form_Element_RadioTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_RadioTest::main") { - Zend_Form_Element_RadioTest::main(); -} diff --git a/tests/Zend/Form/Element/ResetTest.php b/tests/Zend/Form/Element/ResetTest.php deleted file mode 100644 index 7c383d041c..0000000000 --- a/tests/Zend/Form/Element/ResetTest.php +++ /dev/null @@ -1,118 +0,0 @@ -element = new Zend_Form_Element_Reset('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testResetElementSubclassesSubmitElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Submit); - } - - public function testResetElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testResetElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testResetElementUsesResetHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formReset', $helper); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_ResetTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_ResetTest::main") { - Zend_Form_Element_ResetTest::main(); -} diff --git a/tests/Zend/Form/Element/SelectTest.php b/tests/Zend/Form/Element/SelectTest.php deleted file mode 100644 index 62d38c0378..0000000000 --- a/tests/Zend/Form/Element/SelectTest.php +++ /dev/null @@ -1,290 +0,0 @@ -element = new Zend_Form_Element_Select('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(array( - 'encoding' => 'UTF-8', - )); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper'); - return $view; - } - - public function testSelectElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testSelectElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testSelectElementIsNotAnArrayByDefault() - { - $this->assertFalse($this->element->isArray()); - } - - public function testSelectElementUsesSelectHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formSelect', $helper); - } - - public function testCanDisableIndividualSelectOptions() - { - $this->element->setMultiOptions(array( - 'foo' => 'foo', - 'bar' => array( - 'baz' => 'Baz', - 'bat' => 'Bat' - ), - 'test' => 'Test', - )) - ->setAttrib('disable', array('baz', 'test')); - $html = $this->element->render($this->getView()); - $this->assertNotRegexp('/]*?(disabled="disabled")/', $html, $html); - foreach (array('baz', 'test') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching disabled option for ' . $test); - } - $this->assertRegexp('/]*?(disabled="disabled")/', $m[1]); - } - foreach (array('foo', 'bat') as $test) { - if (!preg_match('/(]*?(value="' . $test . '")[^>]*>)/', $html, $m)) { - $this->fail('Unable to find matching option for ' . $test); - } - $this->assertNotRegexp('/]*?(disabled="disabled")/', $m[1], var_export($m, 1)); - } - } - - /** - * No explicit assertions; just checking for error conditions - * - * @group ZF-2847 - */ - public function testTranslationShouldNotRaiseWarningsWithNestedGroups() - { - require_once 'Zend/Translate.php'; - require_once 'Zend/View.php'; - $translate = new Zend_Translate('array', array('Select Test', 'Select Test Translated'), 'en'); - $this->element - ->setLabel('Select Test') - ->setMultiOptions(array( - 'Group 1' => array( - '1-1' => 'Hi 1-1', - '1-2' => 'Hi 1-2', - ), - 'Group 2' => array( - '2-1' => 'Hi 2-1', - '2-2' => 'Hi 2-2', - ), - )) - ->setTranslator($translate) - ->setView(new Zend_View()); - $html = $this->element->render(); - } - - /** - * @group ZF-3953 - */ - public function testUsingZeroAsValueShouldSelectAppropriateOption() - { - $this->element->setMultiOptions(array( - array('key' => '1', 'value' => 'Yes'), - array('key' => '0', 'value' => 'No'), - array('key' => 'somewhat', 'value' => 'Somewhat'), - )); - $this->element->setValue(0); - $html = $this->element->render($this->getView()); - - if (!preg_match('#(]*(?:value="somewhat")[^>]*>)#s', $html, $matches)) { - $this->fail('Could not find option: ' . $html); - } - $this->assertNotContains('selected', $matches[1]); - } - - /** - * @group ZF-4390 - */ - public function testEmptyOptionsShouldNotBeTranslated() - { - $translate = new Zend_Translate('array', array('unused', 'foo' => 'bar'), 'en'); - $this->element->setTranslator($translate); - $this->element->setMultiOptions(array( - array('key' => '', 'value' => ''), - array('key' => 'foo', 'value' => 'foo'), - )); - $this->element->setView($this->getView()); - $html = $this->element->render(); - $this->assertNotContains('unused', $html, $html); - $this->assertContains('bar', $html, $html); - } - - /** - * Test isValid() on select elements without optgroups. This - * ensures fixing ZF-3985 doesn't break existing functionality. - * - * @group ZF-3985 - */ - public function testIsValidWithPlainOptions() - { - // test both syntaxes for setting plain options - $this->element->setMultiOptions(array( - array('key' => '1', 'value' => 'Web Developer'), - '2' => 'Software Engineer', - )); - - $this->assertTrue($this->element->isValid('1')); - $this->assertTrue($this->element->isValid('2')); - $this->assertFalse($this->element->isValid('3')); - $this->assertFalse($this->element->isValid('Web Developer')); - } - - /** - * @group ZF-3985 - */ - public function testIsValidWithOptionGroups() - { - // test optgroup and both syntaxes for setting plain options - $this->element->setMultiOptions(array( - 'Technology' => array( - '1' => 'Web Developer', - '2' => 'Software Engineer', - ), - array('key' => '3', 'value' => 'Trainee'), - '4' => 'Intern', - )); - - $this->assertTrue($this->element->isValid('1')); - $this->assertTrue($this->element->isValid('3')); - $this->assertTrue($this->element->isValid('4')); - $this->assertFalse($this->element->isValid('5')); - $this->assertFalse($this->element->isValid('Technology')); - $this->assertFalse($this->element->isValid('Web Developer')); - } - - /** - * @group ZF-8342 - */ - public function testUsingPoundSymbolInOptionLabelShouldRenderCorrectly() - { - $this->element->addMultiOption('1', '£' . number_format(1)); - $html = $this->element->render($this->getView()); - $this->assertContains('>£', $html); - } - - /** - * @group ZF-8452 - */ - public function testRenderingAsArray() - { - $this->element->addMultiOption('bar', 'Bar') - ->setIsArray(true) - ->setDecorators(array('ViewHelper')); - - $actual = $this->element->render($this->getView()); - $expected = PHP_EOL - . ''; - - $this->assertSame($expected, $actual); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_SelectTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_SelectTest::main") { - Zend_Form_Element_SelectTest::main(); -} diff --git a/tests/Zend/Form/Element/SubmitTest.php b/tests/Zend/Form/Element/SubmitTest.php deleted file mode 100644 index 19f8dd005e..0000000000 --- a/tests/Zend/Form/Element/SubmitTest.php +++ /dev/null @@ -1,286 +0,0 @@ -element = new Zend_Form_Element_Submit('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function getView() - { - require_once 'Zend/View.php'; - $view = new Zend_View(); - $view->addHelperPath(dirname(__FILE__) . '/../../../../library/Zend/View/Helper/'); - return $view; - } - - public function testSubmitElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testSubmitElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testSubmitElementUsesViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - } - - public function testSubmitElementSpecifiesFormSubmitAsDefaultHelper() - { - $this->assertEquals('formSubmit', $this->element->helper); - } - - public function testGetLabelReturnsNameIfNoValuePresent() - { - $this->assertEquals($this->element->getName(), $this->element->getLabel()); - } - - public function testGetLabelReturnsTranslatedLabelIfTranslatorIsRegistered() - { - $translations = include dirname(__FILE__) . '/../_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $this->element->setTranslator($translate) - ->setLabel('submit'); - $test = $this->element->getLabel(); - $this->assertEquals($translations['submit'], $test); - } - - public function testTranslatedLabelIsRendered() - { - $this->_checkZf2794(); - - $this->testGetLabelReturnsTranslatedLabelIfTranslatorIsRegistered(); - $this->element->setView($this->getView()); - $decorator = $this->element->getDecorator('ViewHelper'); - $decorator->setElement($this->element); - $html = $decorator->render(''); - $this->assertRegexp('/<(input|button)[^>]*?value="Submit Button"/', $html); - } - - public function testConstructorSetsLabelToNameIfNoLabelProvided() - { - $submit = new Zend_Form_Element_Submit('foo'); - $this->assertEquals('foo', $submit->getName()); - $this->assertEquals('foo', $submit->getLabel()); - } - - public function testCanPassLabelAsParameterToConstructor() - { - $submit = new Zend_Form_Element_Submit('foo', 'Label'); - $this->assertEquals('Label', $submit->getLabel()); - } - - public function testLabelIsTranslatedWhenTranslationAvailable() - { - require_once 'Zend/Translate.php'; - $translations = array('Label' => 'This is the Submit Label'); - $translate = new Zend_Translate('array', $translations); - $submit = new Zend_Form_Element_Submit('foo', 'Label'); - $submit->setTranslator($translate); - $this->assertEquals($translations['Label'], $submit->getLabel()); - } - - public function testLabelWhichIsSetToNameIsTranslatedWhenTranslationAvailable() - { - require_once 'Zend/Translate.php'; - $translations = array('foo' => 'This is the Submit Label'); - $translate = new Zend_Translate('array', $translations); - $submit = new Zend_Form_Element_Submit('foo'); - $submit->setTranslator($translate); - $this->assertEquals($translations['foo'], $submit->getLabel()); - } - - /** - * @group ZF-8764 - */ - public function testLabelIsNotTranslatedTwice() - { - require_once 'Zend/Translate.php'; - $translations = array('firstLabel' => 'secondLabel', - 'secondLabel' => 'thirdLabel'); - $translate = new Zend_Translate('array', $translations); - $submit = new Zend_Form_Element_Submit('foo', 'firstLabel'); - $submit->setTranslator($translate); - $this->assertEquals($translations['firstLabel'], $submit->getLabel()); - } - - public function testIsCheckedReturnsFalseWhenNoValuePresent() - { - $this->assertFalse($this->element->isChecked()); - } - - public function testIsCheckedReturnsFalseWhenValuePresentButDoesNotMatchLabel() - { - $this->assertFalse($this->element->isChecked()); - $this->element->setValue('bar'); - $this->assertFalse($this->element->isChecked()); - } - - public function testIsCheckedReturnsTrueWhenValuePresentAndMatchesLabel() - { - $this->testIsCheckedReturnsFalseWhenNoValuePresent(); - $this->element->setValue('foo'); - $this->assertTrue($this->element->isChecked()); - } - - /** - * Tests that the isChecked method works as expected when using a translator. - * @group ZF-4073 - */ - public function testIsCheckedReturnsExpectedValueWhenUsingTranslator() - { - $translations = array('label' => 'translation'); - $translate = new Zend_Translate('array', $translations); - - $submit = new Zend_Form_Element_Submit('foo', 'label'); - $submit->setTranslator($translate); - $submit->setValue($translations['label']); - - $this->assertTrue($submit->isChecked()); - - $submit->setValue('label'); - $this->assertFalse($submit->isChecked()); - } - - /* - * Tests if title attribute (tooltip) is translated if the default decorators are loaded. - * These decorators should load the Tooltip decorator as the first decorator. - * @group ZF-6151 - */ - public function testTitleAttributeGetsTranslated() - { - $this->element->setAttrib('title', 'bar'); - $translator = new Zend_Translate_Adapter_Array(array("bar" => "baz"), 'de'); - $this->element->setTranslator($translator); - $html = $this->element->render(new Zend_View()); - $this->assertContains('title', $html); - $this->assertContains('baz', $html); - $this->assertNotContains('bar', $html); - } - - public function testTitleAttributeDoesNotGetTranslatedIfTranslatorIsDisabled() - { - $this->element->setAttrib('title', 'bar'); - $translator = new Zend_Translate_Adapter_Array(array("bar" => "baz"), 'de'); - $this->element->setTranslator($translator); - // now disable translator and see if that works - $this->element->setDisableTranslator(true); - $html = $this->element->render(new Zend_View()); - $this->assertContains('title', $html); - $this->assertContains('bar', $html); - $this->assertNotContains('baz', $html); - } - - public function testSetDefaultIgnoredToTrueWhenNotDefined() - { - $this->assertTrue($this->element->getIgnore()); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * Prove the fluent interface on Zend_Form_Element_Submit::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } -} - -// Call Zend_Form_Element_SubmitTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_SubmitTest::main") { - Zend_Form_Element_SubmitTest::main(); -} diff --git a/tests/Zend/Form/Element/TextTest.php b/tests/Zend/Form/Element/TextTest.php deleted file mode 100644 index 62f63a5d5c..0000000000 --- a/tests/Zend/Form/Element/TextTest.php +++ /dev/null @@ -1,113 +0,0 @@ -element = new Zend_Form_Element_Text('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testTextElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testTextElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testTextElementUsesTextHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formText', $helper); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_TextTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_TextTest::main") { - Zend_Form_Element_TextTest::main(); -} diff --git a/tests/Zend/Form/Element/TextareaTest.php b/tests/Zend/Form/Element/TextareaTest.php deleted file mode 100644 index b7fb233c5a..0000000000 --- a/tests/Zend/Form/Element/TextareaTest.php +++ /dev/null @@ -1,113 +0,0 @@ -element = new Zend_Form_Element_Textarea('foo'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testTextareaElementSubclassesXhtmlElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element_Xhtml); - } - - public function testTextareaElementInstanceOfBaseElement() - { - $this->assertTrue($this->element instanceof Zend_Form_Element); - } - - public function testTextareaElementUsesTextareaHelperInViewHelperDecoratorByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator->setElement($this->element); - $helper = $decorator->getHelper(); - $this->assertEquals('formTextarea', $helper); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } -} - -// Call Zend_Form_Element_TextareaTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Form_Element_TextareaTest::main") { - Zend_Form_Element_TextareaTest::main(); -} diff --git a/tests/Zend/Form/Element/_files/Captcha/Foo.php b/tests/Zend/Form/Element/_files/Captcha/Foo.php deleted file mode 100644 index 134f928b86..0000000000 --- a/tests/Zend/Form/Element/_files/Captcha/Foo.php +++ /dev/null @@ -1,33 +0,0 @@ -received = true; - return; - } - - public function isSent($file = null) - { - return false; - } - - public function isReceived($file = null) - { - return $this->received; - } - - public function isUploaded($files = null) - { - return true; - } - - public function isFiltered($files = null) - { - return true; - } - - public static function getProgress() - { - return; - } -} diff --git a/tests/Zend/Form/Element/_files/TransferAdapter/Foo.php b/tests/Zend/Form/Element/_files/TransferAdapter/Foo.php deleted file mode 100644 index ead0723e30..0000000000 --- a/tests/Zend/Form/Element/_files/TransferAdapter/Foo.php +++ /dev/null @@ -1,69 +0,0 @@ -received = true; - return; - } - - public function isSent($file = null) - { - return false; - } - - public function isReceived($file = null) - { - return $this->received; - } - - public function isUploaded($files = null) - { - return true; - } - - public function isFiltered($files = null) - { - return true; - } - - public static function getProgress() - { - return; - } -} diff --git a/tests/Zend/Form/Element/_files/filter/Foo.php b/tests/Zend/Form/Element/_files/filter/Foo.php deleted file mode 100644 index 7824a7be25..0000000000 --- a/tests/Zend/Form/Element/_files/filter/Foo.php +++ /dev/null @@ -1,36 +0,0 @@ -error)) { - unset($this->error); - } - - $this->element = new Zend_Form_Element('foo'); - Zend_Controller_Action_HelperBroker::resetHelpers(); - } - - public function tearDown() - { - } - - public function getView() - { - $view = new Zend_View(); - $libPath = dirname(__FILE__) . '/../../../library'; - $view->addHelperPath($libPath . '/Zend/View/Helper'); - return $view; - } - - public function testConstructorRequiresMinimallyElementName() - { - try { - $element = new Zend_Form_Element(1); - $this->fail('Zend_Form_Element constructor should not accept integer argument'); - } catch (Zend_Form_Exception $e) { - } - try { - $element = new Zend_Form_Element(true); - $this->fail('Zend_Form_Element constructor should not accept boolean argument'); - } catch (Zend_Form_Exception $e) { - } - - try { - $element = new Zend_Form_Element('foo'); - } catch (Exception $e) { - $this->fail('Zend_Form_Element constructor should accept String values'); - } - - $config = array('foo' => 'bar'); - try { - $element = new Zend_Form_Element($config); - $this->fail('Zend_Form_Element constructor requires array with name element'); - } catch (Zend_Form_Exception $e) { - } - - $config = array('name' => 'bar'); - try { - $element = new Zend_Form_Element($config); - } catch (Zend_Form_Exception $e) { - $this->fail('Zend_Form_Element constructor should accept array with name element'); - } - - $config = new Zend_Config(array('foo' => 'bar')); - try { - $element = new Zend_Form_Element($config); - $this->fail('Zend_Form_Element constructor requires Zend_Config object with name element'); - } catch (Zend_Form_Exception $e) { - } - - $config = new Zend_Config(array('name' => 'bar')); - try { - $element = new Zend_Form_Element($config); - } catch (Zend_Form_Exception $e) { - $this->fail('Zend_Form_Element constructor should accept Zend_Config with name element'); - } - } - - public function testNoTranslatorByDefault() - { - $this->assertNull($this->element->getTranslator()); - } - - public function testGetTranslatorRetrievesGlobalDefaultWhenAvailable() - { - $this->testNoTranslatorByDefault(); - $translator = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Form::setDefaultTranslator($translator); - $received = $this->element->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testTranslatorAccessorsWork() - { - $translator = new Zend_Translate('array', array('foo' => 'bar')); - $this->element->setTranslator($translator); - $received = $this->element->getTranslator($translator); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testCanDisableTranslation() - { - $this->testGetTranslatorRetrievesGlobalDefaultWhenAvailable(); - $this->element->setDisableTranslator(true); - $this->assertNull($this->element->getTranslator()); - } - - public function testSetNameNormalizesValueToContainOnlyValidVariableCharacters() - { - $this->element->setName('f%\o^&*)o\(%$b#@!.a}{;-,r'); - $this->assertEquals('foobar', $this->element->getName()); - - try { - $this->element->setName('%\^&*)\(%$#@!.}{;-,'); - $this->fail('Empty names should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid name provided', $e->getMessage()); - } - } - - public function testZeroIsAllowedAsElementName() - { - try { - $this->element->setName(0); - $this->assertSame('0', $this->element->getName()); - } catch (Zend_Form_Exception $e) { - $this->fail('Should allow zero as element name'); - } - } - - /** - * @group ZF-2851 - */ - public function testSetNameShouldNotAllowEmptyString() - { - foreach (array('', ' ', ' ') as $name) { - try { - $this->element->setName($name); - $this->fail('setName() should not allow empty string'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid name', $e->getMessage()); - } - } - } - - public function testElementValueInitiallyNull() - { - $this->assertNull($this->element->getValue()); - } - - public function testValueAccessorsWork() - { - $this->element->setValue('bar'); - $this->assertContains('bar', $this->element->getValue()); - } - - public function testGetValueFiltersValue() - { - $this->element->setValue('This 0 is 1 a-2-TEST') - ->addFilter('alnum') - ->addFilter('stringToUpper'); - $test = $this->element->getValue(); - $this->assertEquals('THIS0IS1A2TEST', $test); - } - - public function checkFilterValues($item, $key) - { - $this->assertRegexp('/^[A-Z]+$/', $item); - } - - public function testRetrievingArrayValueFiltersAllArrayValues() - { - $this->element->setValue(array( - 'foo', - array( - 'bar', - 'baz' - ), - 'bat' - )) - ->setIsArray(true) - ->addFilter('StringToUpper'); - $test = $this->element->getValue(); - $this->assertTrue(is_array($test)); - array_walk_recursive($test, array($this, 'checkFilterValues')); - } - - public function testRetrievingArrayValueDoesNotFilterAllValuesWhenNotIsArray() - { - $values = array( - 'foo', - array( - 'bar', - 'baz' - ), - 'bat' - ); - $this->element->setValue($values) - ->addFilter(new Zend_Form_ElementTest_ArrayFilter()); - $test = $this->element->getValue(); - $this->assertTrue(is_array($test)); - require_once 'Zend/Json.php'; - $test = Zend_Json::encode($test); - $this->assertNotContains('foo', $test); - foreach (array('bar', 'baz', 'bat') as $value) { - $this->assertContains($value, $test); - } - } - - public function testGetUnfilteredValueRetrievesOriginalValue() - { - $this->element->setValue('bar'); - $this->assertSame('bar', $this->element->getUnfilteredValue()); - } - - public function testLabelInitiallyNull() - { - $this->assertNull($this->element->getLabel()); - } - - public function testLabelAccessorsWork() - { - $this->element->setLabel('FooBar'); - $this->assertEquals('FooBar', $this->element->getLabel()); - } - - public function testOrderNullByDefault() - { - $this->assertNull($this->element->getOrder()); - } - - public function testCanSetOrder() - { - $this->testOrderNullByDefault(); - $this->element->setOrder(50); - $this->assertEquals(50, $this->element->getOrder()); - } - - public function testRequiredFlagFalseByDefault() - { - $this->assertFalse($this->element->isRequired()); - } - - public function testRequiredAcccessorsWork() - { - $this->assertFalse($this->element->isRequired()); - $this->element->setRequired(true); - $this->assertTrue($this->element->isRequired()); - } - - public function testIsValidInsertsNotEmptyValidatorWhenElementIsRequiredByDefault() - { - $this->_checkZf2794(); - - $this->element->setRequired(true); - $this->assertFalse($this->element->isValid('')); - $validator = $this->element->getValidator('NotEmpty'); - $this->assertTrue($validator instanceof Zend_Validate_NotEmpty); - $this->assertTrue($validator->zfBreakChainOnFailure); - } - - /** - * @group ZF-2862 - */ - public function testBreakChainOnFailureFlagsForExistingValidatorsRemainSetWhenNotEmptyValidatorAutoInserted() - { - $this->_checkZf2794(); - - $username = new Zend_Form_Element('username'); - $username->addValidator('stringLength', true, array(5, 20)) - ->addValidator('regex', true, array('/^[a-zA-Z0-9_]*$/')) - ->addFilter('StringToLower') - ->setRequired(true); - $form = new Zend_Form(array('elements' => array($username))); - $form->isValid(array('username' => '#')); - - $validator = $username->getValidator('stringLength'); - $this->assertTrue($validator->zfBreakChainOnFailure); - $validator = $username->getValidator('regex'); - $this->assertTrue($validator->zfBreakChainOnFailure); - } - - public function testAutoInsertNotEmptyValidatorFlagTrueByDefault() - { - $this->assertTrue($this->element->autoInsertNotEmptyValidator()); - } - - public function testCanSetAutoInsertNotEmptyValidatorFlag() - { - $this->testAutoInsertNotEmptyValidatorFlagTrueByDefault(); - $this->element->setAutoInsertNotEmptyValidator(false); - $this->assertFalse($this->element->autoInsertNotEmptyValidator()); - $this->element->setAutoInsertNotEmptyValidator(true); - $this->assertTrue($this->element->autoInsertNotEmptyValidator()); - } - - public function testIsValidDoesNotInsertNotEmptyValidatorWhenElementIsRequiredButAutoInsertNotEmptyValidatorFlagIsFalse() - { - $this->element->setAutoInsertNotEmptyValidator(false) - ->setRequired(true); - $this->assertTrue($this->element->isValid('')); - } - - public function testDescriptionInitiallyNull() - { - $this->assertNull($this->element->getDescription()); - } - - public function testCanSetDescription() - { - $this->testDescriptionInitiallyNull(); - $this->element->setDescription('element hint'); - $this->assertEquals('element hint', $this->element->getDescription()); - } - - public function testElementIsNotArrayByDefault() - { - $this->assertFalse($this->element->isArray()); - } - - public function testCanSetArrayFlag() - { - $this->testElementIsNotArrayByDefault(); - $this->element->setIsArray(true); - $this->assertTrue($this->element->isArray()); - $this->element->setIsArray(false); - $this->assertFalse($this->element->isArray()); - } - - public function testElementBelongsToNullByDefault() - { - $this->assertNull($this->element->getBelongsTo()); - } - - public function testCanSetArrayElementBelongsTo() - { - $this->testElementBelongsToNullByDefault(); - $this->element->setBelongsTo('foo'); - $this->assertEquals('foo', $this->element->getBelongsTo()); - } - - public function testArrayElementBelongsToNormalizedToValidVariableCharactersOnly() - { - $this->testElementBelongsToNullByDefault(); - $this->element->setBelongsTo('f%\o^&*)o\(%$b#@!.a}{;-,r'); - $this->assertEquals('foobar', $this->element->getBelongsTo()); - } - - public function testGetTypeReturnsCurrentElementClass() - { - $this->assertEquals('Zend_Form_Element', $this->element->getType()); - } - - public function testCanUseAccessorsToSetIndidualAttribs() - { - $this->element->setAttrib('foo', 'bar') - ->setAttrib('bar', 'baz') - ->setAttrib('baz', 'bat'); - - $this->assertEquals('bar', $this->element->getAttrib('foo')); - $this->assertEquals('baz', $this->element->getAttrib('bar')); - $this->assertEquals('bat', $this->element->getAttrib('baz')); - } - - public function testGetUndefinedAttribShouldReturnNull() - { - $this->assertNull($this->element->getAttrib('bogus')); - } - - public function testSetAttribThrowsExceptionsForKeysWithLeadingUnderscores() - { - try { - $this->element->setAttrib('_foo', 'bar'); - $this->fail('setAttrib() should throw an exception for invalid keys'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid attribute', $e->getMessage()); - } - } - - public function testPassingNullValueToSetAttribUnsetsAttrib() - { - $this->element->setAttrib('foo', 'bar'); - $this->assertEquals('bar', $this->element->getAttrib('foo')); - $this->element->setAttrib('foo', null); - $this->assertFalse(isset($this->element->foo)); - } - - public function testSetAttribsSetsMultipleAttribs() - { - $this->element->setAttribs(array( - 'foo' => 'bar', - 'bar' => 'baz', - 'baz' => 'bat' - )); - - $this->assertEquals('bar', $this->element->getAttrib('foo')); - $this->assertEquals('baz', $this->element->getAttrib('bar')); - $this->assertEquals('bat', $this->element->getAttrib('baz')); - } - - public function testGetAttribsRetrievesAllAttributes() - { - $attribs = array( - 'foo' => 'bar', - 'bar' => 'baz', - 'baz' => 'bat' - ); - $this->element->setAttribs($attribs); - - $received = $this->element->getAttribs(); - $this->assertEquals($attribs, $received); - } - - /** - * @group ZF-6061 - */ - public function testHelperDoesNotShowUpInAttribs() - { - $attribs = array( - 'foo' => 'bar', - 'bar' => 'baz', - 'baz' => 'bat' - ); - $this->element->setAttribs($attribs); - - $this->assertFalse(array_key_exists('helper', $this->element->getAttribs())); - } - - public function testPassingNullValuesToSetAttribsUnsetsAttribs() - { - $this->testSetAttribsSetsMultipleAttribs(); - $this->element->setAttribs(array('foo' => null)); - $this->assertNull($this->element->foo); - } - - public function testRetrievingOverloadedValuesThrowsExceptionWithInvalidKey() - { - try { - $name = $this->element->_name; - $this->fail('Overloading should not return protected or private members'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Cannot retrieve value for protected/private', $e->getMessage()); - } - } - - public function testCanSetAndRetrieveAttribsViaOverloading() - { - $this->element->foo = 'bar'; - $this->assertEquals('bar', $this->element->foo); - } - - public function testGetPluginLoaderRetrievesDefaultValidatorPluginLoader() - { - $loader = $this->element->getPluginLoader('validate'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader); - $paths = $loader->getPaths('Zend_Validate'); - $this->assertTrue(is_array($paths), var_export($loader, 1)); - $this->assertTrue(0 < count($paths)); - $this->assertContains('Validate', $paths[0]); - } - - public function testGetPluginLoaderRetrievesDefaultFilterPluginLoader() - { - $loader = $this->element->getPluginLoader('filter'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader); - $paths = $loader->getPaths('Zend_Filter'); - $this->assertTrue(is_array($paths)); - $this->assertTrue(0 < count($paths)); - $this->assertContains('Filter', $paths[0]); - } - - public function testGetPluginLoaderRetrievesDefaultDecoratorPluginLoader() - { - $loader = $this->element->getPluginLoader('decorator'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader); - $paths = $loader->getPaths('Zend_Form_Decorator'); - $this->assertTrue(is_array($paths)); - $this->assertTrue(0 < count($paths)); - $this->assertContains('Decorator', $paths[0]); - } - - public function testCanSetCustomValidatorPluginLoader() - { - $loader = new Zend_Loader_PluginLoader(); - $this->element->setPluginLoader($loader, 'validate'); - $test = $this->element->getPluginLoader('validate'); - $this->assertSame($loader, $test); - } - - public function testPassingInvalidTypeToSetPluginLoaderThrowsException() - { - $loader = new Zend_Loader_PluginLoader(); - try { - $this->element->setPluginLoader($loader, 'foo'); - $this->fail('Invalid loader type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testPassingInvalidTypeToGetPluginLoaderThrowsException() - { - try { - $this->element->getPluginLoader('foo'); - $this->fail('Invalid loader type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testCanSetCustomFilterPluginLoader() - { - $loader = new Zend_Loader_PluginLoader(); - $this->element->setPluginLoader($loader, 'filter'); - $test = $this->element->getPluginLoader('filter'); - $this->assertSame($loader, $test); - } - - public function testCanSetCustomDecoratorPluginLoader() - { - $loader = new Zend_Loader_PluginLoader(); - $this->element->setPluginLoader($loader, 'decorator'); - $test = $this->element->getPluginLoader('decorator'); - $this->assertSame($loader, $test); - } - - public function testPassingInvalidLoaderTypeToAddPrefixPathThrowsException() - { - try { - $this->element->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'foo'); - $this->fail('Invalid loader type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testCanAddValidatorPluginLoaderPrefixPath() - { - $loader = $this->element->getPluginLoader('validate'); - $this->element->addPrefixPath('Zend_Form', 'Zend/Form/', 'validate'); - $paths = $loader->getPaths('Zend_Form'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Form', $paths[0]); - } - - public function testAddingValidatorPluginLoaderPrefixPathDoesNotAffectOtherLoaders() - { - $validateLoader = $this->element->getPluginLoader('validate'); - $filterLoader = $this->element->getPluginLoader('filter'); - $decoratorLoader = $this->element->getPluginLoader('decorator'); - $this->element->addPrefixPath('Zend_Form', 'Zend/Form/', 'validate'); - $this->assertFalse($filterLoader->getPaths('Zend_Form')); - $this->assertFalse($decoratorLoader->getPaths('Zend_Form')); - } - - public function testCanAddFilterPluginLoaderPrefixPath() - { - $loader = $this->element->getPluginLoader('validate'); - $this->element->addPrefixPath('Zend_Form', 'Zend/Form/', 'validate'); - $paths = $loader->getPaths('Zend_Form'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Form', $paths[0]); - } - - public function testAddingFilterPluginLoaderPrefixPathDoesNotAffectOtherLoaders() - { - $filterLoader = $this->element->getPluginLoader('filter'); - $validateLoader = $this->element->getPluginLoader('validate'); - $decoratorLoader = $this->element->getPluginLoader('decorator'); - $this->element->addPrefixPath('Zend_Form', 'Zend/Form/', 'filter'); - $this->assertFalse($validateLoader->getPaths('Zend_Form')); - $this->assertFalse($decoratorLoader->getPaths('Zend_Form')); - } - - public function testCanAddDecoratorPluginLoaderPrefixPath() - { - $loader = $this->element->getPluginLoader('decorator'); - $this->element->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testAddingDecoratorrPluginLoaderPrefixPathDoesNotAffectOtherLoaders() - { - $decoratorLoader = $this->element->getPluginLoader('decorator'); - $filterLoader = $this->element->getPluginLoader('filter'); - $validateLoader = $this->element->getPluginLoader('validate'); - $this->element->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $this->assertFalse($validateLoader->getPaths('Zend_Foo')); - $this->assertFalse($filterLoader->getPaths('Zend_Foo')); - } - - public function testCanAddAllPluginLoaderPrefixPathsSimultaneously() - { - $validatorLoader = new Zend_Loader_PluginLoader(); - $filterLoader = new Zend_Loader_PluginLoader(); - $decoratorLoader = new Zend_Loader_PluginLoader(); - $this->element->setPluginLoader($validatorLoader, 'validate') - ->setPluginLoader($filterLoader, 'filter') - ->setPluginLoader($decoratorLoader, 'decorator') - ->addPrefixPath('Zend', 'Zend/'); - - $paths = $filterLoader->getPaths('Zend_Filter'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Filter', $paths[0]); - - $paths = $validatorLoader->getPaths('Zend_Validate'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Validate', $paths[0]); - - $paths = $decoratorLoader->getPaths('Zend_Decorator'); - $this->assertTrue(is_array($paths), var_export($paths, 1)); - $this->assertContains('Decorator', $paths[0]); - } - - public function testPassingInvalidValidatorToAddValidatorThrowsException() - { - try { - $this->element->addValidator(123); - $this->fail('Invalid validator should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid validator', $e->getMessage()); - } - } - - public function testCanAddSingleValidatorAsString() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getValidator('digits')); - - $this->element->addValidator('digits'); - $validator = $this->element->getValidator('digits'); - $this->assertTrue($validator instanceof Zend_Validate_Digits, var_export($validator, 1)); - $this->assertFalse($validator->zfBreakChainOnFailure); - } - - public function testCanNotRetrieveSingleValidatorRegisteredAsStringUsingClassName() - { - $this->assertFalse($this->element->getValidator('digits')); - - $this->element->addValidator('digits'); - $this->assertFalse($this->element->getValidator('Zend_Validate_Digits')); - } - - public function testCanAddSingleValidatorAsValidatorObject() - { - $this->assertFalse($this->element->getValidator('Zend_Validate_Digits')); - - require_once 'Zend/Validate/Digits.php'; - $validator = new Zend_Validate_Digits(); - $this->element->addValidator($validator); - $test = $this->element->getValidator('Zend_Validate_Digits'); - $this->assertSame($validator, $test); - $this->assertFalse($validator->zfBreakChainOnFailure); - } - - public function testOptionsAreCastToArrayWhenAddingValidator() - { - $this->_checkZf2794(); - - try { - $this->element->addValidator('Alnum', false, true); - } catch (Exception $e) { - $this->fail('Should be able to add non-array validator options'); - } - $validator = $this->element->getValidator('Alnum'); - $this->assertTrue($validator instanceof Zend_Validate_Alnum); - $this->assertTrue($validator->allowWhiteSpace); - } - - public function testCanRetrieveSingleValidatorRegisteredAsValidatorObjectUsingShortName() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getValidator('digits')); - - require_once 'Zend/Validate/Digits.php'; - $validator = new Zend_Validate_Digits(); - $this->element->addValidator($validator); - $test = $this->element->getValidator('digits'); - $this->assertSame($validator, $test); - $this->assertFalse($validator->zfBreakChainOnFailure); - } - - public function testRetrievingNamedValidatorShouldNotReorderValidators() - { - $this->element->addValidators(array( - 'NotEmpty', - 'Alnum', - 'Digits', - )); - - $validator = $this->element->getValidator('Alnum'); - $validators = $this->element->getValidators(); - $i = 0; - $order = array(); - - foreach (array_keys($validators) as $name) { - $order[$name] = $i; - ++$i; - } - $this->assertEquals(1, $order['Zend_Validate_Alnum'], var_export($order, 1)); - } - - - public function testCanAddMultipleValidators() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getValidator('Zend_Validate_Digits')); - $this->assertFalse($this->element->getValidator('Zend_Validate_Alnum')); - $this->element->addValidators(array('digits', 'alnum')); - $digits = $this->element->getValidator('digits'); - $this->assertTrue($digits instanceof Zend_Validate_Digits); - $alnum = $this->element->getValidator('alnum'); - $this->assertTrue($alnum instanceof Zend_Validate_Alnum); - } - - public function testRemovingUnregisteredValidatorReturnsObjectInstance() - { - $this->assertSame($this->element, $this->element->removeValidator('bogus')); - } - - public function testPassingMessagesOptionToAddValidatorSetsValidatorMessages() - { - $messageTemplates = array( - Zend_Validate_Digits::NOT_DIGITS => 'Value should only contain digits', - Zend_Validate_Digits::STRING_EMPTY => 'Value needs some digits', - ); - $this->element->setAllowEmpty(false) - ->addValidator('digits', false, array('messages' => $messageTemplates)); - - $this->element->isValid(''); - $messages = $this->element->getMessages(); - $found = false; - foreach ($messages as $key => $message) { - if ($key == Zend_Validate_Digits::STRING_EMPTY) { - $found = true; - break; - } - } - $this->assertTrue($found, 'Empty string message not found: ' . var_export($messages, 1)); - $this->assertEquals($messageTemplates[Zend_Validate_Digits::STRING_EMPTY], $message); - - $this->element->isValid('abc'); - $messages = $this->element->getMessages(); - $found = false; - foreach ($messages as $key => $message) { - if ($key == Zend_Validate_Digits::NOT_DIGITS) { - $found = true; - break; - } - } - $this->assertTrue($found, 'Not digits message not found'); - $this->assertEquals($messageTemplates[Zend_Validate_Digits::NOT_DIGITS], $message); - } - - public function testCanPassSingleMessageToValidatorToSetValidatorMessages() - { - $this->_checkZf2794(); - - $message = 'My custom empty message'; - $this->element->addValidator('notEmpty', false, array('messages' => $message)) - ->setRequired(true); - - $this->element->isValid(''); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals($message, current($messages)); - } - - public function testMessagesAreTranslatedForCurrentLocale() - { - $localeFile = dirname(__FILE__) . '/_files/locale/array.php'; - $translations = include($localeFile); - $translator = new Zend_Translate('array', $translations, 'en'); - $translator->setLocale('en'); - - $this->element->setAllowEmpty(false) - ->setTranslator($translator) - ->addValidator('digits'); - - $this->element->isValid(''); - $messages = $this->element->getMessages(); - $found = false; - foreach ($messages as $key => $message) { - if ($key == 'digitsStringEmpty') { - $found = true; - break; - } - } - $this->assertTrue($found, 'String Empty message not found: ' . var_export($messages, 1)); - $this->assertEquals($translations['stringEmpty'], $message); - - $this->element->isValid('abc'); - $messages = $this->element->getMessages(); - $found = false; - foreach ($messages as $key => $message) { - if ($key == 'notDigits') { - $found = true; - break; - } - } - $this->assertTrue($found, 'Not Digits message not found'); - $this->assertEquals($translations['notDigits'], $message); - } - - /**#@+ - * @group ZF-2988 - */ - public function testSettingErrorMessageShouldOverrideValidationErrorMessages() - { - $this->element->addValidator('Alpha'); - $this->element->addErrorMessage('Invalid value entered'); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Invalid value entered', array_shift($messages)); - } - - public function testCustomErrorMessagesShouldBeManagedInAStack() - { - $this->element->addValidator('Alpha'); - $this->element->addErrorMessage('Invalid value entered'); - $this->element->addErrorMessage('Really, it is not valid'); - $messages = $this->element->getErrorMessages(); - $this->assertEquals(2, count($messages)); - - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Invalid value entered', array_shift($messages)); - $this->assertEquals('Really, it is not valid', array_shift($messages)); - } - - public function testShouldAllowSettingMultipleErrorMessagesAtOnce() - { - $set1 = array('foo', 'bar', 'baz'); - $this->element->addErrorMessages($set1); - $this->assertSame($set1, $this->element->getErrorMessages()); - } - - public function testSetErrorMessagesShouldOverwriteMessages() - { - $set1 = array('foo', 'bar', 'baz'); - $set2 = array('bat', 'cat'); - $this->element->addErrorMessages($set1); - $this->assertSame($set1, $this->element->getErrorMessages()); - $this->element->setErrorMessages($set2); - $this->assertSame($set2, $this->element->getErrorMessages()); - } - - public function testCustomErrorMessageStackShouldBeClearable() - { - $this->testCustomErrorMessagesShouldBeManagedInAStack(); - $this->element->clearErrorMessages(); - $messages = $this->element->getErrorMessages(); - $this->assertTrue(empty($messages)); - } - - public function testCustomErrorMessagesShouldBeTranslated() - { - $translations = array( - 'foo' => 'Foo message', - ); - $translate = new Zend_Translate('array', $translations); - $this->element->setTranslator($translate) - ->addErrorMessage('foo') - ->addValidator('Alpha'); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Foo message', array_shift($messages)); - } - - public function testCustomErrorMessagesShouldAllowValueSubstitution() - { - $this->element->addErrorMessage('"%value%" is an invalid value') - ->addValidator('Alpha'); - $this->assertFalse($this->element->isValid(123)); - $this->assertTrue($this->element->hasErrors()); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('"123" is an invalid value', array_shift($messages)); - } - - public function testShouldAllowMarkingElementAsInvalid() - { - $this->element->setValue('foo'); - $this->element->addErrorMessage('Invalid value entered'); - $this->assertFalse($this->element->hasErrors()); - $this->element->markAsError(); - $this->assertTrue($this->element->hasErrors()); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Invalid value entered', array_shift($messages)); - } - - public function testShouldAllowPushingErrorsOntoErrorStackWithErrorMessages() - { - $this->element->setValue('foo'); - $this->assertFalse($this->element->hasErrors()); - $this->element->setErrors(array('Error 1', 'Error 2')) - ->addError('Error 3') - ->addErrors(array('Error 4', 'Error 5')); - $this->assertTrue($this->element->hasErrors()); - $messages = $this->element->getMessages(); - $this->assertEquals(5, count($messages)); - foreach (range(1, 5) as $id) { - $message = 'Error ' . $id; - $this->assertContains($message, $messages); - } - } - - public function testHasErrorsShouldIndicateStatusOfValidationErrors() - { - $this->element->setValue('foo'); - $this->assertFalse($this->element->hasErrors()); - $this->element->markAsError(); - $this->assertTrue($this->element->hasErrors()); - } - - /**#@-*/ - - public function testAddingErrorToArrayElementShouldLoopOverAllValues() - { - $this->element->setIsArray(true) - ->setValue(array('foo', 'bar', 'baz')) - ->addError('error with value %value%'); - $errors = $this->element->getMessages(); - require_once 'Zend/Json.php'; - $errors = Zend_Json::encode($errors); - foreach (array('foo', 'bar', 'baz') as $value) { - $message = 'error with value ' . $value; - $this->assertContains($message, $errors); - } - } - - /** ZF-2568 */ - public function testTranslatedMessagesCanContainVariableSubstitution() - { - $localeFile = dirname(__FILE__) . '/_files/locale/array.php'; - $translations = include($localeFile); - $translations['notDigits'] .= ' "%value%"'; - $translator = new Zend_Translate('array', $translations, 'en'); - $translator->setLocale('en'); - - $this->element->setAllowEmpty(false) - ->setTranslator($translator) - ->addValidator('digits'); - - $this->element->isValid('abc'); - $messages = $this->element->getMessages(); - $found = false; - foreach ($messages as $key => $message) { - if ($key == 'notDigits') { - $found = true; - break; - } - } - $this->assertTrue($found, 'String Empty message not found: ' . var_export($messages, 1)); - $this->assertContains(' "abc"', $message); - $this->assertContains('Translating the notDigits string', $message); - } - - public function testCanRemoveValidator() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getValidator('Zend_Validate_Digits')); - $this->element->addValidator('digits'); - $digits = $this->element->getValidator('digits'); - $this->assertTrue($digits instanceof Zend_Validate_Digits); - $this->element->removeValidator('digits'); - $this->assertFalse($this->element->getValidator('digits')); - } - - public function testCanClearAllValidators() - { - $this->_checkZf2794(); - - $this->testCanAddMultipleValidators(); - $validators = $this->element->getValidators(); - $this->element->clearValidators(); - $test = $this->element->getValidators(); - $this->assertNotEquals($validators, $test); - $this->assertTrue(empty($test)); - foreach (array_keys($validators) as $validator) { - $this->assertFalse($this->element->getValidator($validator)); - } - } - - public function testCanValidateElement() - { - $this->element->addValidator(new Zend_Validate_NotEmpty()) - ->addValidator(new Zend_Validate_EmailAddress()); - try { - $result = $this->element->isValid('matthew@zend.com'); - } catch (Exception $e) { - $this->fail('Validating an element should work'); - } - } - - public function testCanValidateArrayValue() - { - $this->element->setIsArray(true) - ->addValidator('InArray', false, array(array('foo', 'bar', 'baz', 'bat'))); - $this->assertTrue($this->element->isValid(array('foo', 'bat'))); - } - - public function testShouldAllowZeroAsNonEmptyValue() - { - $this->element->addValidator('between', false, array(1, 100)); - $this->assertFalse($this->element->isValid('0')); - } - - public function testIsValidPopulatesElementValue() - { - $this->testCanValidateElement(); - $this->assertEquals('matthew@zend.com', $this->element->getValue()); - } - - public function testErrorsPopulatedFollowingFailedIsValidCheck() - { - $this->element->addValidator(new Zend_Validate_NotEmpty()) - ->addValidator(new Zend_Validate_EmailAddress()); - - $result = $this->element->isValid('matthew'); - if ($result) { - $this->fail('Invalid data should fail validations'); - } - $errors = $this->element->getErrors(); - $this->assertTrue(is_array($errors)); - $this->assertTrue(0 < count($errors)); - } - - public function testMessagesPopulatedFollowingFailedIsValidCheck() - { - require_once 'Zend/Validate/NotEmpty.php'; - require_once 'Zend/Validate/EmailAddress.php'; - $this->element->addValidator(new Zend_Validate_NotEmpty()) - ->addValidator(new Zend_Validate_EmailAddress()); - - $result = $this->element->isValid('matthew'); - if ($result) { - $this->fail('Invalid data should fail validations'); - } - $messages = $this->element->getMessages(); - $this->assertTrue(is_array($messages)); - $this->assertTrue(0 < count($messages)); - } - - public function testOptionalElementDoesNotPerformValidationsOnEmptyValuesByDefault() - { - $this->element->addValidator(new Zend_Validate_EmailAddress()); - - $result = $this->element->isValid(''); - if (!$result) { - $this->fail('Empty data should not fail validations'); - } - $errors = $this->element->getErrors(); - $this->assertTrue(is_array($errors)); - $this->assertTrue(empty($errors)); - } - - public function testOptionalElementDoesPerformValidationsWhenAllowEmptyIsFalse() - { - $this->element->setAllowEmpty(false) - ->addValidator(new Zend_Validate_EmailAddress()); - - $result = $this->element->isValid(''); - if ($result) { - $this->fail('Empty data should fail validations when AllowEmpty is false'); - } - $errors = $this->element->getErrors(); - $this->assertTrue(is_array($errors)); - $this->assertTrue(0 < count($errors)); - } - - public function testAddingInvalidFilterTypeThrowsException() - { - try { - $this->element->addFilter(123); - $this->fail('Invalid filter type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid filter', $e->getMessage()); - } - } - - public function testCanAddSingleFilterAsString() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getFilter('digits')); - - $this->element->addFilter('digits'); - $filter = $this->element->getFilter('digits'); - $this->assertTrue($filter instanceof Zend_Filter_Digits); - } - - public function testCanNotRetrieveSingleFilterRegisteredAsStringUsingClassName() - { - $this->assertFalse($this->element->getFilter('digits')); - - $this->element->addFilter('digits'); - $this->assertFalse($this->element->getFilter('Zend_Filter_Digits')); - } - - public function testCanAddSingleFilterAsFilterObject() - { - $this->assertFalse($this->element->getFilter('Zend_Filter_Digits')); - - require_once 'Zend/Filter/Digits.php'; - $filter = new Zend_Filter_Digits(); - $this->element->addFilter($filter); - $test = $this->element->getFilter('Zend_Filter_Digits'); - $this->assertSame($filter, $test); - } - - public function testCanRetrieveSingleFilterRegisteredAsFilterObjectUsingShortName() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getFilter('digits')); - - require_once 'Zend/Filter/Digits.php'; - $filter = new Zend_Filter_Digits(); - $this->element->addFilter($filter); - $test = $this->element->getFilter('digits'); - } - - public function testRetrievingNamedFilterShouldNotReorderFilters() - { - $this->element->addFilters(array( - 'Alpha', - 'Alnum', - 'Digits', - )); - - $filter = $this->element->getFilter('Alnum'); - $filters = $this->element->getFilters(); - $i = 0; - $order = array(); - - foreach (array_keys($filters) as $name) { - $order[$name] = $i; - ++$i; - } - $this->assertEquals(1, $order['Zend_Filter_Alnum'], var_export($order, 1)); - } - - public function testOptionsAreCastToArrayWhenAddingFilter() - { - $this->_checkZf2794(); - - try { - $this->element->addFilter('Alnum', true); - } catch (Exception $e) { - $this->fail('Should be able to add non-array filter options'); - } - $filter = $this->element->getFilter('Alnum'); - $this->assertTrue($filter instanceof Zend_Filter_Alnum); - $this->assertTrue($filter->allowWhiteSpace); - } - - public function testShouldUseFilterConstructorOptionsAsPassedToAddFilter() - { - $this->element->addFilter('HtmlEntities', array(array('quotestyle' => ENT_QUOTES, 'charset' => 'UTF-8'))); - $filter = $this->element->getFilter('HtmlEntities'); - $this->assertTrue($filter instanceof Zend_Filter_HtmlEntities); - $this->assertEquals(ENT_QUOTES, $filter->getQuoteStyle()); - $this->assertEquals('UTF-8', $filter->getCharSet()); - } - - public function testCanAddMultipleFilters() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getFilter('Zend_Filter_Digits')); - $this->assertFalse($this->element->getFilter('Zend_Filter_Alnum')); - $this->element->addFilters(array('digits', 'alnum')); - $digits = $this->element->getFilter('digits'); - $this->assertTrue($digits instanceof Zend_Filter_Digits); - $alnum = $this->element->getFilter('alnum'); - $this->assertTrue($alnum instanceof Zend_Filter_Alnum); - } - - public function testRemovingUnregisteredFilterReturnsObjectInstance() - { - $this->assertSame($this->element, $this->element->removeFilter('bogus')); - } - - public function testCanRemoveFilter() - { - $this->_checkZf2794(); - - $this->assertFalse($this->element->getFilter('Zend_Filter_Digits')); - $this->element->addFilter('digits'); - $digits = $this->element->getFilter('digits'); - $this->assertTrue($digits instanceof Zend_Filter_Digits); - $this->element->removeFilter('digits'); - $this->assertFalse($this->element->getFilter('digits')); - } - - public function testCanClearAllFilters() - { - $this->_checkZf2794(); - - $this->testCanAddMultipleFilters(); - $filters = $this->element->getFilters(); - $this->element->clearFilters(); - $test = $this->element->getFilters(); - $this->assertNotEquals($filters, $test); - $this->assertTrue(empty($test)); - foreach (array_keys($filters) as $filter) { - $this->assertFalse($this->element->getFilter($filter)); - } - } - - public function testGetViewReturnsNullWithNoViewRenderer() - { - $this->assertNull($this->element->getView()); - } - - public function testGetViewReturnsViewRendererViewInstanceIfViewRendererActive() - { - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - $viewRenderer->initView(); - $view = $viewRenderer->view; - $test = $this->element->getView(); - $this->assertSame($view, $test); - } - - public function testCanSetView() - { - $view = new Zend_View(); - $this->assertNull($this->element->getView()); - $this->element->setView($view); - $received = $this->element->getView(); - $this->assertSame($view, $received); - } - - public function testViewHelperDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - } - - /** - * @group ZF-4822 - */ - public function testErrorsDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('errors'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Errors); - } - - /** - * @group ZF-4822 - */ - public function testDescriptionDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('description'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Description); - $options = $decorator->getOptions(); - $this->assertTrue(array_key_exists('tag', $options)); - $this->assertEquals('p', $options['tag']); - $this->assertTrue(array_key_exists('class', $options)); - $this->assertEquals('description', $options['class']); - } - - /** - * @group ZF-4822 - */ - public function testHtmlTagDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('HtmlTag'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_HtmlTag); - } - - /** - * @group ZF-4822 - */ - public function testLabelDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->element->getDecorator('Label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - } - - public function testCanDisableRegisteringDefaultDecoratorsDuringInitialization() - { - $element = new Zend_Form_Element('foo', array('disableLoadDefaultDecorators' => true)); - $decorators = $element->getDecorators(); - $this->assertEquals(array(), $decorators); - } - - public function testAddingInvalidDecoratorThrowsException() - { - try { - $this->element->addDecorator(123); - $this->fail('Invalid decorator type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid decorator', $e->getMessage()); - } - } - - public function testCanAddSingleDecoratorAsString() - { - $this->_checkZf2794(); - - $this->element->clearDecorators(); - $this->assertFalse($this->element->getDecorator('viewHelper')); - - $this->element->addDecorator('viewHelper'); - $decorator = $this->element->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - } - - public function testCanNotRetrieveSingleDecoratorRegisteredAsStringUsingClassName() - { - $this->assertFalse($this->element->getDecorator('Zend_Form_Decorator_ViewHelper')); - } - - public function testCanAddSingleDecoratorAsDecoratorObject() - { - $this->element->clearDecorators(); - $this->assertFalse($this->element->getDecorator('viewHelper')); - - $decorator = new Zend_Form_Decorator_ViewHelper; - $this->element->addDecorator($decorator); - $test = $this->element->getDecorator('Zend_Form_Decorator_ViewHelper'); - $this->assertSame($decorator, $test); - } - - /** - * @group ZF-3597 - */ - public function testAddingConcreteDecoratorShouldHonorOrder() - { - require_once dirname(__FILE__) . '/_files/decorators/TableRow.php'; - $decorator = new My_Decorator_TableRow(); - $this->element->setLabel('Foo') - ->setDescription('sample description') - ->clearDecorators() - ->addDecorators(array( - 'ViewHelper', - $decorator, - )); - $html = $this->element->render($this->getView()); - $this->assertRegexp('#Foo.*?]+>.*?sample description#s', $html, $html); - } - - public function testCanRetrieveSingleDecoratorRegisteredAsDecoratorObjectUsingShortName() - { - $this->_checkZf2794(); - - $this->element->clearDecorators(); - $this->assertFalse($this->element->getDecorator('viewHelper')); - - $decorator = new Zend_Form_Decorator_ViewHelper; - $this->element->addDecorator($decorator); - $test = $this->element->getDecorator('viewHelper'); - $this->assertSame($decorator, $test); - } - - public function testCanAddMultipleDecorators() - { - $this->_checkZf2794(); - - $this->element->clearDecorators(); - $this->assertFalse($this->element->getDecorator('viewHelper')); - - $testDecorator = new Zend_Form_ElementTest_Decorator; - $this->element->addDecorators(array( - 'ViewHelper', - $testDecorator - )); - - $viewHelper = $this->element->getDecorator('viewHelper'); - $this->assertTrue($viewHelper instanceof Zend_Form_Decorator_ViewHelper); - $decorator = $this->element->getDecorator('decorator'); - $this->assertSame($testDecorator, $decorator); - } - - public function testRemovingUnregisteredDecoratorReturnsObjectInstance() - { - $this->_checkZf2794(); - - $this->assertSame($this->element, $this->element->removeDecorator('bogus')); - } - - public function testCanRemoveDecorator() - { - $this->testViewHelperDecoratorRegisteredByDefault(); - $this->element->removeDecorator('viewHelper'); - $this->assertFalse($this->element->getDecorator('viewHelper')); - } - - /** - * @group ZF-3069 - */ - public function testRemovingNamedDecoratorsShouldWork() - { - $this->_checkZf2794(); - $this->element->setDecorators(array( - 'ViewHelper', - array(array('div' => 'HtmlTag'), array('tag' => 'div')), - array(array('div2' => 'HtmlTag'), array('tag' => 'div')), - )); - $decorators = $this->element->getDecorators(); - $this->assertTrue(array_key_exists('div', $decorators)); - $this->assertTrue(array_key_exists('div2', $decorators)); - $this->element->removeDecorator('div'); - $decorators = $this->element->getDecorators(); - $this->assertFalse(array_key_exists('div', $decorators)); - $this->assertTrue(array_key_exists('div2', $decorators)); - } - - public function testCanClearAllDecorators() - { - $this->testCanAddMultipleDecorators(); - $this->element->clearDecorators(); - $this->assertFalse($this->element->getDecorator('viewHelper')); - $this->assertFalse($this->element->getDecorator('decorator')); - } - - public function testCanAddDecoratorAliasesToAllowMultipleDecoratorsOfSameType() - { - $this->_checkZf2794(); - - $this->element->setDecorators(array( - array('HtmlTag', array('tag' => 'span')), - array('decorator' => array('FooBar' => 'HtmlTag'), 'options' => array('tag' => 'div')), - )); - $decorator = $this->element->getDecorator('FooBar'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_HtmlTag); - $this->assertEquals('div', $decorator->getOption('tag')); - - $decorator = $this->element->getDecorator('HtmlTag'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_HtmlTag); - $this->assertEquals('span', $decorator->getOption('tag')); - } - - public function testRetrievingNamedDecoratorShouldNotReorderDecorators() - { - $this->element->setDecorators(array( - 'ViewHelper', - 'Errors', - array(array('inner' => 'HtmlTag'), array('tag' => 'div', 'class' => 'element')), - 'Label', - array(array('outer' => 'HtmlTag'), array('tag' => 'div')), - )); - - $decorator = $this->element->getDecorator('inner'); - $decorators = $this->element->getDecorators(); - $i = 0; - $order = array(); - - foreach (array_keys($decorators) as $name) { - $order[$name] = $i; - ++$i; - } - $this->assertEquals(2, $order['inner'], var_export($order, 1)); - } - - /** - * @group ZF-3376 - */ - public function testSetDecoratorsShouldAcceptReturnOfGetDecorators() - { - $this->element->setDecorators(array( - 'ViewHelper', - 'Errors', - array('input' => 'HtmlTag', array('tag' => 'div', 'class' => 'input')), - 'Label', - array('element' => 'HtmlTag', array('tag' => 'div', 'class' => 'element')), - )); - $decorators = $this->element->getDecorators(); - $this->element->setDecorators($decorators); - $this->assertSame($decorators, $this->element->getDecorators()); - } - - public function testRenderElementReturnsMarkup() - { - $this->element->setName('foo'); - $html = $this->element->render($this->getView()); - $this->assertTrue(is_string($html)); - $this->assertFalse(empty($html)); - $this->assertContains('assertContains('"foo"', $html); - } - - public function testRenderElementRendersLabelWhenProvided() - { - $this->element->setView($this->getView()); - $this->element->setName('foo') - ->setLabel('Foo'); - $html = $this->element->render(); - $this->assertTrue(is_string($html)); - $this->assertFalse(empty($html)); - $this->assertContains('assertContains('Foo', $html); - $this->assertContains('', $html); - } - - public function testRenderElementRendersValueWhenProvided() - { - $this->element->setView($this->getView()); - $this->element->setName('foo') - ->setValue('bar'); - $html = $this->element->render(); - $this->assertTrue(is_string($html)); - $this->assertFalse(empty($html)); - $this->assertContains('assertContains('"foo"', $html); - $this->assertContains('"bar"', $html); - } - - public function testRenderElementRendersErrorsWhenProvided() - { - $this->_checkZf2794(); - - $this->element->setView($this->getView()) - ->setRequired(true) - ->setName('foo') - ->addValidator('NotEmpty'); - $this->element->isValid(''); - - $html = $this->element->render(); - $this->assertTrue(is_string($html)); - $this->assertFalse(empty($html)); - $this->assertContains('error', $html); - $this->assertRegexp('/empty/i', $html); - } - - public function testToStringProxiesToRender() - { - $this->element->setView($this->getView()); - $this->element->setName('foo'); - $html = $this->element->__toString(); - $this->assertTrue(is_string($html)); - $this->assertFalse(empty($html)); - $this->assertContains('assertContains('"foo"', $html); - } - - public function raiseDecoratorException($content, $element, $options) - { - throw new Exception('Raising exception in decorator callback'); - } - - public function handleDecoratorErrors($errno, $errstr, $errfile = '', $errline = 0, array $errcontext = array()) - { - $this->error = $errstr; - } - - public function testToStringRaisesErrorWhenExceptionCaught() - { - $this->element->setDecorators(array( - array( - 'decorator' => 'Callback', - 'options' => array('callback' => array($this, 'raiseDecoratorException')) - ), - )); - $origErrorHandler = set_error_handler(array($this, 'handleDecoratorErrors'), E_USER_WARNING); - - $text = $this->element->__toString(); - - restore_error_handler(); - - $this->assertTrue(empty($text)); - $this->assertTrue(isset($this->error)); - $this->assertEquals('Raising exception in decorator callback', $this->error); - } - - public function getOptions() - { - $options = array( - 'name' => 'changed', - 'value' => 'foo', - 'label' => 'bar', - 'order' => 50, - 'required' => false, - 'foo' => 'bar', - 'baz' => 'bat' - ); - return $options; - } - - public function testCanSetObjectStateViaSetOptions() - { - $options = $this->getOptions(); - $this->element->setOptions($options); - $this->assertEquals('changed', $this->element->getName()); - $this->assertEquals('foo', $this->element->getValue()); - $this->assertEquals('bar', $this->element->getLabel()); - $this->assertEquals(50, $this->element->getOrder()); - $this->assertFalse($this->element->isRequired()); - $this->assertEquals('bar', $this->element->foo); - $this->assertEquals('bat', $this->element->baz); - } - - public function testSetOptionsSkipsCallsToSetOptionsAndSetConfig() - { - $options = $this->getOptions(); - $config = new Zend_Config($options); - $options['config'] = $config; - $options['options'] = $config->toArray(); - $this->element->setOptions($options); - } - - public function testSetOptionsSkipsSettingAccessorsRequiringObjectsWhenNoObjectPresent() - { - $options = $this->getOptions(); - $options['translator'] = true; - $options['pluginLoader'] = true; - $options['view'] = true; - $this->element->setOptions($options); - } - - public function testSetOptionsSetsArrayOfStringValidators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['validators'] = array( - 'notEmpty', - 'digits' - ); - $this->element->setOptions($options); - $validator = $this->element->getValidator('notEmpty'); - $this->assertTrue($validator instanceof Zend_Validate_NotEmpty); - $validator = $this->element->getValidator('digits'); - $this->assertTrue($validator instanceof Zend_Validate_Digits); - } - - public function testSetOptionsSetsArrayOfArrayValidators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['validators'] = array( - array('notEmpty', true, array(Zend_Validate_NotEmpty::ALL)), - array('digits', true, array('bar')), - ); - $this->element->setOptions($options); - $validator = $this->element->getValidator('notEmpty'); - $this->assertTrue($validator instanceof Zend_Validate_NotEmpty); - $this->assertTrue($validator->zfBreakChainOnFailure); - $validator = $this->element->getValidator('digits'); - $this->assertTrue($validator instanceof Zend_Validate_Digits); - $this->assertTrue($validator->zfBreakChainOnFailure); - } - - public function testSetOptionsSetsArrayOfAssociativeArrayValidators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['validators'] = array( - array( - 'options' => array(Zend_Validate_NotEmpty::ALL), - 'breakChainOnFailure' => true, - 'validator' => 'notEmpty', - ), - array( - 'options' => array('bar'), - 'validator' => 'digits', - 'breakChainOnFailure' => true, - ), - ); - $this->element->setOptions($options); - $validator = $this->element->getValidator('notEmpty'); - $this->assertTrue($validator instanceof Zend_Validate_NotEmpty); - $this->assertTrue($validator->zfBreakChainOnFailure); - $validator = $this->element->getValidator('digits'); - $this->assertTrue($validator instanceof Zend_Validate_Digits); - $this->assertTrue($validator->zfBreakChainOnFailure); - } - - public function testSetOptionsSetsArrayOfStringFilters() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['filters'] = array('StringToUpper', 'Alpha'); - $this->element->setOptions($options); - $filter = $this->element->getFilter('StringToUpper'); - $this->assertTrue($filter instanceof Zend_Filter_StringToUpper); - $filter = $this->element->getFilter('Alpha'); - $this->assertTrue($filter instanceof Zend_Filter_Alpha); - } - - public function testSetOptionsSetsArrayOfArrayFilters() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['filters'] = array( - array('Digits', array('bar' => 'baz')), - array('Alpha', array('foo')), - ); - $this->element->setOptions($options); - $filter = $this->element->getFilter('Digits'); - $this->assertTrue($filter instanceof Zend_Filter_Digits); - $filter = $this->element->getFilter('Alpha'); - $this->assertTrue($filter instanceof Zend_Filter_Alpha); - } - - public function testSetOptionsSetsArrayOfAssociativeArrayFilters() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['filters'] = array( - array( - 'options' => array('baz'), - 'filter' => 'Digits' - ), - array( - 'options' => array('foo'), - 'filter' => 'Alpha', - ), - ); - $this->element->setOptions($options); - $filter = $this->element->getFilter('Digits'); - $this->assertTrue($filter instanceof Zend_Filter_Digits); - $filter = $this->element->getFilter('Alpha'); - $this->assertTrue($filter instanceof Zend_Filter_Alpha); - } - - public function testSetOptionsSetsArrayOfStringDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array('label', 'form'); - $this->element->setOptions($options); - $this->assertFalse($this->element->getDecorator('viewHelper')); - $this->assertFalse($this->element->getDecorator('errors')); - $decorator = $this->element->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $decorator = $this->element->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - } - - public function testSetOptionsSetsArrayOfArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array('label', array('id' => 'mylabel')), - array('form', array('id' => 'form')), - ); - $this->element->setOptions($options); - $this->assertFalse($this->element->getDecorator('viewHelper')); - $this->assertFalse($this->element->getDecorator('errors')); - - $decorator = $this->element->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->element->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $options = $decorator->getOptions(); - $this->assertEquals('form', $options['id']); - } - - public function testSetOptionsSetsArrayOfAssocArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array( - 'options' => array('id' => 'mylabel'), - 'decorator' => 'label', - ), - array( - 'options' => array('id' => 'form'), - 'decorator' => 'form', - ), - ); - $this->element->setOptions($options); - $this->assertFalse($this->element->getDecorator('viewHelper')); - $this->assertFalse($this->element->getDecorator('errors')); - - $decorator = $this->element->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->element->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $options = $decorator->getOptions(); - $this->assertEquals('form', $options['id']); - } - - public function testSetOptionsSetsGlobalPrefixPaths() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - 'prefix' => 'Zend_Foo', - 'path' => 'Zend/Foo/' - ); - $this->element->setOptions($options); - - foreach (array('validate', 'filter', 'decorator') as $type) { - $loader = $this->element->getPluginLoader($type); - $paths = $loader->getPaths('Zend_Foo_' . ucfirst($type)); - $this->assertTrue(is_array($paths), "Failed for type $type: " . var_export($paths, 1)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - } - - public function testSetOptionsSetsIndividualPrefixPathsFromKeyedArrays() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - 'filter' => array('prefix' => 'Zend_Foo', 'path' => 'Zend/Foo/') - ); - $this->element->setOptions($options); - - $loader = $this->element->getPluginLoader('filter'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testSetOptionsSetsIndividualPrefixPathsFromUnKeyedArrays() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - array('type' => 'decorator', 'prefix' => 'Zend_Foo', 'path' => 'Zend/Foo/') - ); - $this->element->setOptions($options); - - $loader = $this->element->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testCanSetObjectStateViaSetConfig() - { - $config = new Zend_Config($this->getOptions()); - $this->element->setConfig($config); - $this->assertEquals('changed', $this->element->getName()); - $this->assertEquals('foo', $this->element->getValue()); - $this->assertEquals('bar', $this->element->getLabel()); - $this->assertEquals(50, $this->element->getOrder()); - $this->assertFalse($this->element->isRequired()); - $this->assertEquals('bar', $this->element->foo); - $this->assertEquals('bat', $this->element->baz); - } - - public function testPassingConfigObjectToConstructorSetsObjectState() - { - $config = new Zend_Config($this->getOptions()); - $element = new Zend_Form_Element($config); - $this->assertEquals('changed', $element->getName()); - $this->assertEquals('foo', $element->getValue()); - $this->assertEquals('bar', $element->getLabel()); - $this->assertEquals(50, $element->getOrder()); - $this->assertFalse($element->isRequired()); - $this->assertEquals('bar', $element->foo); - $this->assertEquals('bat', $element->baz); - } - - public function testValueIsFilteredPriorToValidation() - { - $this->_checkZf2794(); - - $this->element->addFilter('StringTrim') - ->addValidator('StringLength', false, array(3, 8)); - $this->assertTrue($this->element->isValid(' foobar ')); - $this->assertEquals('foobar', $this->element->getValue()); - - $this->element->setFilters(array('StringTrim')) - ->setRequired(true) - ->setValidators(array('NotEmpty')); - $this->assertFalse($this->element->isValid(' ')); - } - - public function testTranslatedLabel() - { - $this->element->setLabel('FooBar'); - $translator = new Zend_Translate('array', array('FooBar' => 'BazBar')); - $this->element->setTranslator($translator); - $this->assertEquals('BazBar', $this->element->getLabel()); - } - - // Extensions - - public function testInitCalledBeforeLoadDecorators() - { - $element = new Zend_Form_ElementTest_Element('test'); - $decorators = $element->getDecorators(); - $this->assertTrue(empty($decorators)); - } - - /** - * @group ZF-3217 - */ - public function testElementShouldOverloadToRenderDecorators() - { - $this->element->setLabel('Foo Label') - ->setView($this->getView()); - $html = $this->element->renderViewHelper(); - $this->assertContains('assertContains('id="' . $this->element->getFullyQualifiedName() . '"', $html, 'Received: ' . $html); - $this->assertNotContains('assertNotContains('element->renderLabel('this is the content'); - $this->assertRegexp('#]*for="' . $this->element->getFullyQualifiedName() . '"[^>]*>Foo Label#', $html); - $this->assertContains('this is the content', $html); - $this->assertNotContains('element->bogusMethodCall(); - } - - /** - * @group ZF-5150 - */ - public function testMarkingAsErrorShouldCauseIsErrorToReturnFalse() - { - $this->element->setValue('foo'); - $this->element->markAsError(); - $this->assertFalse($this->element->isValid('foo')); - } - - /** - * @group ZF-4915 - */ - public function testElementShouldAllowSettingDefaultErrorMessageSeparator() - { - $this->element->setErrorMessageSeparator('|'); - $this->assertEquals('|', $this->element->getErrorMessageSeparator()); - } - - /** - * @group ZF-4915 - */ - public function testElementShouldUseSemicolonAndSpaceAsDefaultErrorMessageSeparator() - { - $this->assertEquals('; ', $this->element->getErrorMessageSeparator()); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * @ZF-8882 - */ - public function testErrorMessagesShouldNotBeTranslatedWhenTranslatorIsDisabled() - { - $translations = array( - 'foo' => 'Foo message', - ); - $translate = new Zend_Translate('array', $translations); - $this->element->setTranslator($translate) - ->addErrorMessage('foo') - ->addValidator('Alpha'); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Foo message', array_shift($messages)); - - $this->element->setDisableTranslator(true); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('foo', array_shift($messages)); - } - - /** - * @group ZF-9275 - */ - public function testElementDoesntOverrideDefaultValidatorTranslatorWithDefaultRegistryTranslator() - { - $registryTranslations = array('alphaInvalid' => 'Registry message'); - $registryTranslate = new Zend_Translate('array', $registryTranslations); - Zend_Registry::set('Zend_Translate', $registryTranslate); - - $validatorTranslations = array('alphaInvalid' => 'Validator message'); - $validatorTranslate = new Zend_Translate('array', $validatorTranslations); - Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); - - $elementTranslations = array('alphaInvalid' => 'Element message'); - $elementTranslate = new Zend_Translate('array', $elementTranslations); - - // the default validate translator should beat the registry one - $this->element->addValidator('Alpha'); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals('Validator message', $messages['alphaInvalid']); - } - - /** - * @group ZF-9275 - */ - public function testDefaultTranslatorDoesntOverrideElementTranslatorOnValdiation() - { - $registryTranslations = array('alphaInvalid' => 'Registry message'); - $registryTranslate = new Zend_Translate('array', $registryTranslations); - Zend_Registry::set('Zend_Translate', $registryTranslate); - - $validatorTranslations = array('alphaInvalid' => 'Validator message'); - $validatorTranslate = new Zend_Translate('array', $validatorTranslations); - Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); - - $elementTranslations = array('alphaInvalid' => 'Element message'); - $elementTranslate = new Zend_Translate('array', $elementTranslations); - - $this->element->addValidator('Alpha'); - $this->element->setTranslator($elementTranslate); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals('Element message', $messages['alphaInvalid']); - } - - /** - * @group ZF-9275 - */ - public function testValidatorsDefaultTranslatorDoesntOverrideFormsDefaultTranslator() - { - $formTranslations = array('alphaInvalid' => 'Form message'); - $formTranslate = new Zend_Translate('array', $formTranslations); - Zend_Form::setDefaultTranslator($formTranslate); - - $validatorTranslations = array('alphaInvalid' => 'Validator message'); - $validatorTranslate = new Zend_Translate('array', $validatorTranslations); - Zend_Validate_Abstract::setDefaultTranslator($validatorTranslate); - - // the default validate translator should beat the registry one - $this->element->addValidator('Alpha'); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals('Form message', $messages['alphaInvalid']); - } - - /** - * @group ZF-9275 - */ - public function testElementsTranslatorDoesntOverrideValidatorsDirectlyAttachedTranslator() - { - $elementTranslations = array('alphaInvalid' => 'Element message'); - $elementTranslate = new Zend_Translate('array', $elementTranslations); - - $validatorTranslations = array('alphaInvalid' => 'Direct validator message'); - $validatorTranslate = new Zend_Translate('array', $validatorTranslations); - - $validator = new Zend_Validate_Alpha(); - $validator->setTranslator($validatorTranslate); - $this->element->addValidator($validator); - $this->assertFalse($this->element->isValid(123)); - $messages = $this->element->getMessages(); - $this->assertEquals('Direct validator message', $messages['alphaInvalid']); - } - - /** - * Prove the fluent interface on Zend_Form::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->element, $this->element->loadDefaultDecorators()); - } - - /** - * @group ZF-7552 - */ - public function testAddDecoratorsKeepsNonNumericKeyNames() - { - $this->element->addDecorators(array(array(array('td' => 'HtmlTag'), - array('tag' => 'td')), - array(array('tr' => 'HtmlTag'), - array('tag' => 'tr')), - array('HtmlTag', array('tag' => 'baz')))); - $t1 = $this->element->getDecorators(); - $this->element->setDecorators($t1); - $t2 = $this->element->getDecorators(); - $this->assertEquals($t1, $t2); - } - - /** - * Check array notation for validators - */ - public function testValidatorsGivenArrayKeysOnValidation() - { - $username = new Zend_Form_Element('username'); - $username->addValidator('stringLength', true, array('min' => 5, 'max' => 20, 'ignore' => 'something')); - $form = new Zend_Form(array('elements' => array($username))); - $this->assertTrue($form->isValid(array('username' => 'abcde'))); - } - - /** - * @group ZF-6822 - */ - public function testValidatorByUsingStringNotation() - { - $this->_checkZf2794(); - - $username = new Zend_Form_Element('username'); - $username->addValidator('stringLength', true, array(5, 20)) - ->addValidator('regex', true, '/^[a-zA-Z0-9_]*$/') - ->addFilter('StringToLower') - ->setRequired(true); - $form = new Zend_Form(array('elements' => array($username))); - $form->isValid(array('username' => '#')); - - $validator = $username->getValidator('stringLength'); - $this->assertTrue($validator->zfBreakChainOnFailure); - $validator = $username->getValidator('regex'); - $this->assertTrue($validator->zfBreakChainOnFailure); - } - - /** - * @group ZF-12173 - */ - public function testCanAddPluginLoaderPrefixPathsWithBackslashes() - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->markTestSkipped(__CLASS__ . '::' . __METHOD__ . ' requires PHP 5.3.0 or greater'); - return; - } - $validatorLoader = new Zend_Loader_PluginLoader(); - $filterLoader = new Zend_Loader_PluginLoader(); - $decoratorLoader = new Zend_Loader_PluginLoader(); - $this->element->setPluginLoader($validatorLoader, 'validate') - ->setPluginLoader($filterLoader, 'filter') - ->setPluginLoader($decoratorLoader, 'decorator') - ->addPrefixPath('Zf\Foo', 'Zf/Foo'); - - $paths = $filterLoader->getPaths('Zf\Foo\Filter'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Filter', $paths[0]); - - $paths = $validatorLoader->getPaths('Zf\Foo\Validate'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Validate', $paths[0]); - - $paths = $decoratorLoader->getPaths('Zf\Foo\Decorator'); - $this->assertTrue(is_array($paths), var_export($paths, 1)); - $this->assertContains('Decorator', $paths[0]); - } - - /** - * @group ZF-12439 - */ - public function testSettingAnEmptyArrayValueGeneratesAValidErrorMessage() - { - $this->element->setValue(array()); - $this->element->addErrorMessage('Invalid value entered'); - $this->element->markAsError(); - $messages = $this->element->getMessages(); - $this->assertEquals('Invalid value entered', array_shift($messages)); - } -} - -class Zend_Form_ElementTest_Decorator extends Zend_Form_Decorator_Abstract -{ -} - -class Zend_Form_ElementTest_Element extends Zend_Form_Element -{ - public function init() - { - $this->setDisableLoadDefaultDecorators(true); - } -} - -class Zend_Form_ElementTest_ArrayFilter implements Zend_Filter_Interface -{ - public function filter($value) - { - $value = array_filter($value, array($this, '_filter')); - return $value; - } - - protected function _filter($value) - { - if (is_array($value)) { - return array_filter($value, array($this, '_filter')); - } - return (strstr($value, 'ba')); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Form_ElementTest::main') { - Zend_Form_ElementTest::main(); -} diff --git a/tests/Zend/Form/FormTest.php b/tests/Zend/Form/FormTest.php deleted file mode 100644 index 75fbeb65f0..0000000000 --- a/tests/Zend/Form/FormTest.php +++ /dev/null @@ -1,4911 +0,0 @@ -clearRegistry(); - Zend_Form::setDefaultTranslator(null); - - if (isset($this->error)) { - unset($this->error); - } - - Zend_Controller_Action_HelperBroker::resetHelpers(); - $this->form = new Zend_Form(); - } - - public function tearDown() - { - $this->clearRegistry(); - } - - public function testZendFormImplementsZendValidateInterface() - { - $this->assertTrue($this->form instanceof Zend_Validate_Interface); - } - - // Configuration - - public function getOptions() - { - $options = array( - 'name' => 'foo', - 'class' => 'someform', - 'action' => '/foo/bar', - 'method' => 'put', - ); - return $options; - } - - public function testCanSetObjectStateViaSetOptions() - { - $options = $this->getOptions(); - $this->form->setOptions($options); - $this->assertEquals('foo', $this->form->getName()); - $this->assertEquals('someform', $this->form->getAttrib('class')); - $this->assertEquals('/foo/bar', $this->form->getAction()); - $this->assertEquals('put', $this->form->getMethod()); - } - - public function testCanSetObjectStateByPassingOptionsToConstructor() - { - $options = $this->getOptions(); - $form = new Zend_Form($options); - $this->assertEquals('foo', $form->getName()); - $this->assertEquals('someform', $form->getAttrib('class')); - $this->assertEquals('/foo/bar', $form->getAction()); - $this->assertEquals('put', $form->getMethod()); - } - - public function testSetOptionsSkipsCallsToSetOptionsAndSetConfig() - { - $options = $this->getOptions(); - $config = new Zend_Config($options); - $options['config'] = $config; - $options['options'] = $config->toArray(); - $this->form->setOptions($options); - } - - public function testSetOptionsSkipsSettingAccessorsRequiringObjectsWhenNonObjectPassed() - { - $options = $this->getOptions(); - $options['pluginLoader'] = true; - $options['view'] = true; - $options['translator'] = true; - $options['default'] = true; - $options['attrib'] = true; - $this->form->setOptions($options); - } - - public function testSetOptionsWithAttribsDoesNotOverwriteActionOrMethodOrName() - { - $attribs = $this->getOptions(); - unset($attribs['action'], $attribs['method']); - $options = array( - 'name' => 'MYFORM', - 'action' => '/bar/baz', - 'method' => 'GET', - 'attribs' => $attribs, - ); - $form = new Zend_Form($options); - $this->assertEquals($options['name'], $form->getName()); - $this->assertEquals($options['action'], $form->getAction()); - $this->assertEquals(strtolower($options['method']), strtolower($form->getMethod())); - } - - public function getElementOptions() - { - $elements = array( - 'foo' => 'text', - array('text', 'bar', array('class' => 'foobar')), - array( - 'options' => array('class' => 'barbaz'), - 'type' => 'text', - 'name' => 'baz', - ), - 'bat' => array( - 'options' => array('class' => 'bazbat'), - 'type' => 'text', - ), - 'lol' => array( - 'text', - array('class' => 'lolcat'), - ) - ); - return $elements; - } - - public function testSetOptionsSetsElements() - { - $options = $this->getOptions(); - $options['elements'] = $this->getElementOptions(); - $this->form->setOptions($options); - - $this->assertTrue(isset($this->form->foo)); - $this->assertTrue($this->form->foo instanceof Zend_Form_Element_Text); - - $this->assertTrue(isset($this->form->bar)); - $this->assertTrue($this->form->bar instanceof Zend_Form_Element_Text); - $this->assertEquals('foobar', $this->form->bar->class); - - $this->assertTrue(isset($this->form->baz)); - $this->assertTrue($this->form->baz instanceof Zend_Form_Element_Text); - $this->assertEquals('barbaz', $this->form->baz->class); - - $this->assertTrue(isset($this->form->bat)); - $this->assertTrue($this->form->bat instanceof Zend_Form_Element_Text); - $this->assertEquals('bazbat', $this->form->bat->class); - - $this->assertTrue(isset($this->form->lol)); - $this->assertTrue($this->form->lol instanceof Zend_Form_Element_Text); - $this->assertEquals('lolcat', $this->form->lol->class); - } - - public function testSetOptionsSetsDefaultValues() - { - $options = $this->getOptions(); - $options['defaults'] = array( - 'bar' => 'barvalue', - 'bat' => 'batvalue', - ); - $options['elements'] = $this->getElementOptions(); - $this->form->setOptions($options); - - $this->assertEquals('barvalue', $this->form->bar->getValue()); - $this->assertEquals('batvalue', $this->form->bat->getValue()); - } - - public function testSetOptionsSetsArrayOfStringDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array('label', 'errors'); - $this->form->setOptions($options); - $this->assertFalse($this->form->getDecorator('form')); - - $decorator = $this->form->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $decorator = $this->form->getDecorator('errors'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Errors); - } - - public function testSetOptionsSetsArrayOfArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array('label', array('id' => 'mylabel')), - array('errors', array('id' => 'errors')), - ); - $this->form->setOptions($options); - $this->assertFalse($this->form->getDecorator('form')); - - $decorator = $this->form->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->form->getDecorator('errors'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Errors); - $options = $decorator->getOptions(); - $this->assertEquals('errors', $options['id']); - } - - public function testSetOptionsSetsArrayOfAssocArrayDecorators() - { - $this->_checkZf2794(); - - $options = $this->getOptions(); - $options['decorators'] = array( - array( - 'options' => array('id' => 'mylabel'), - 'decorator' => 'label', - ), - array( - 'options' => array('id' => 'errors'), - 'decorator' => 'errors', - ), - ); - $this->form->setOptions($options); - $this->assertFalse($this->form->getDecorator('form')); - - $decorator = $this->form->getDecorator('label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $options = $decorator->getOptions(); - $this->assertEquals('mylabel', $options['id']); - - $decorator = $this->form->getDecorator('errors'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Errors); - $options = $decorator->getOptions(); - $this->assertEquals('errors', $options['id']); - } - - public function testSetOptionsSetsGlobalPrefixPaths() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - 'prefix' => 'Zend_Foo', - 'path' => 'Zend/Foo/' - ); - $this->form->setOptions($options); - - foreach (array('element', 'decorator') as $type) { - $loader = $this->form->getPluginLoader($type); - $paths = $loader->getPaths('Zend_Foo_' . ucfirst($type)); - $this->assertTrue(is_array($paths), "Failed for type $type: " . var_export($paths, 1)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - } - - public function testSetOptionsSetsIndividualPrefixPathsFromKeyedArrays() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - 'element' => array('prefix' => 'Zend_Foo', 'path' => 'Zend/Foo/') - ); - $this->form->setOptions($options); - - $loader = $this->form->getPluginLoader('element'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testSetOptionsSetsIndividualPrefixPathsFromUnKeyedArrays() - { - $options = $this->getOptions(); - $options['prefixPath'] = array( - array('type' => 'decorator', 'prefix' => 'Zend_Foo', 'path' => 'Zend/Foo/') - ); - $this->form->setOptions($options); - - $loader = $this->form->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testSetOptionsSetsDisplayGroups() - { - $options = $this->getOptions(); - $options['displayGroups'] = array( - 'barbat' => array(array('bar', 'bat'), array('order' => 20)), - array(array('foo', 'baz'), 'foobaz', array('order' => 10)), - array( - 'name' => 'ghiabc', - 'elements' => array('ghi', 'abc'), - 'options' => array('order' => 15), - ), - ); - $options['elements'] = array( - 'foo' => 'text', - 'bar' => 'text', - 'baz' => 'text', - 'bat' => 'text', - 'abc' => 'text', - 'ghi' => 'text', - 'jkl' => 'text', - 'mno' => 'text', - ); - $this->form->setOptions($options); - - $this->assertTrue(isset($this->form->barbat)); - $elements = $this->form->barbat->getElements(); - $expected = array('bar', 'bat'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(20, $this->form->barbat->getOrder()); - - $this->assertTrue(isset($this->form->foobaz)); - $elements = $this->form->foobaz->getElements(); - $expected = array('foo', 'baz'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(10, $this->form->foobaz->getOrder()); - - $this->assertTrue(isset($this->form->ghiabc)); - $elements = $this->form->ghiabc->getElements(); - $expected = array('ghi', 'abc'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(15, $this->form->ghiabc->getOrder()); - } - - /** - * @group ZF-3250 - */ - public function testDisplayGroupOrderInConfigShouldNotMatter() - { - require_once 'Zend/Config/Xml.php'; - $config = new Zend_Config_Xml(dirname(__FILE__) . '/_files/config/zf3250.xml', 'sitearea', true); - $form = new Zend_Form($config->test); - // no assertions needed; throws error if order matters - } - - /** - * @group ZF-3112 - */ - public function testSetOptionsShouldCreateDisplayGroupsLast() - { - $options = array(); - $options['displayGroups'] = array( - 'barbat' => array(array('bar', 'bat'), array('order' => 20)), - array(array('foo', 'baz'), 'foobaz', array('order' => 10)), - array( - 'name' => 'ghiabc', - 'elements' => array('ghi', 'abc'), - 'options' => array('order' => 15), - ), - ); - $options = array_merge($options, $this->getOptions()); - $options['elements'] = array( - 'foo' => 'text', - 'bar' => 'text', - 'baz' => 'text', - 'bat' => 'text', - 'abc' => 'text', - 'ghi' => 'text', - 'jkl' => 'text', - 'mno' => 'text', - ); - $this->form = new Zend_Form($options); - - $this->assertTrue(isset($this->form->barbat)); - $elements = $this->form->barbat->getElements(); - $expected = array('bar', 'bat'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(20, $this->form->barbat->getOrder()); - - $this->assertTrue(isset($this->form->foobaz)); - $elements = $this->form->foobaz->getElements(); - $expected = array('foo', 'baz'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(10, $this->form->foobaz->getOrder()); - - $this->assertTrue(isset($this->form->ghiabc)); - $elements = $this->form->ghiabc->getElements(); - $expected = array('ghi', 'abc'); - $this->assertEquals($expected, array_keys($elements)); - $this->assertEquals(15, $this->form->ghiabc->getOrder()); - } - - public function testSetConfigSetsObjectState() - { - $config = new Zend_Config($this->getOptions()); - $this->form->setConfig($config); - $this->assertEquals('foo', $this->form->getName()); - $this->assertEquals('someform', $this->form->getAttrib('class')); - $this->assertEquals('/foo/bar', $this->form->getAction()); - $this->assertEquals('put', $this->form->getMethod()); - } - - public function testCanSetObjectStateByPassingConfigObjectToConstructor() - { - $config = new Zend_Config($this->getOptions()); - $form = new Zend_Form($config); - $this->assertEquals('foo', $form->getName()); - $this->assertEquals('someform', $form->getAttrib('class')); - $this->assertEquals('/foo/bar', $form->getAction()); - $this->assertEquals('put', $form->getMethod()); - } - - - // Attribs: - - public function testAttribsArrayInitiallyEmpty() - { - $attribs = $this->form->getAttribs(); - $this->assertTrue(is_array($attribs)); - $this->assertTrue(empty($attribs)); - } - - public function testRetrievingUndefinedAttribReturnsNull() - { - $this->assertNull($this->form->getAttrib('foo')); - } - - public function testCanAddAndRetrieveSingleAttribs() - { - $this->testRetrievingUndefinedAttribReturnsNull(); - $this->form->setAttrib('foo', 'bar'); - $this->assertEquals('bar', $this->form->getAttrib('foo')); - } - - public function testCanAddAndRetrieveMultipleAttribs() - { - $this->form->setAttrib('foo', 'bar'); - $this->assertEquals('bar', $this->form->getAttrib('foo')); - $this->form->addAttribs(array( - 'bar' => 'baz', - 'baz' => 'bat', - 'bat' => 'foo' - )); - $test = $this->form->getAttribs(); - $attribs = array( - 'foo' => 'bar', - 'bar' => 'baz', - 'baz' => 'bat', - 'bat' => 'foo' - ); - $this->assertSame($attribs, $test); - } - - public function testSetAttribsOverwritesExistingAttribs() - { - $this->testCanAddAndRetrieveMultipleAttribs(); - $array = array('bogus' => 'value', 'not' => 'real'); - $this->form->setAttribs($array); - $this->assertSame($array, $this->form->getAttribs()); - } - - public function testCanRemoveSingleAttrib() - { - $this->testCanAddAndRetrieveSingleAttribs(); - $this->assertTrue($this->form->removeAttrib('foo')); - $this->assertNull($this->form->getAttrib('foo')); - } - - public function testRemoveAttribReturnsFalseIfAttribDoesNotExist() - { - $this->assertFalse($this->form->removeAttrib('foo')); - } - - public function testCanClearAllAttribs() - { - $this->testCanAddAndRetrieveMultipleAttribs(); - $this->form->clearAttribs(); - $attribs = $this->form->getAttribs(); - $this->assertTrue(is_array($attribs)); - $this->assertTrue(empty($attribs)); - } - - public function testNameIsInitiallyNull() - { - $this->assertNull($this->form->getName()); - } - - public function testCanSetName() - { - $this->testNameIsInitiallyNull(); - $this->form->setName('foo'); - $this->assertEquals('foo', $this->form->getName()); - } - - public function testZeroAsNameIsAllowed() - { - try { - $this->form->setName(0); - $this->assertEquals(0, $this->form->getName()); - } catch (Zend_Form_Exception $e) { - $this->fail('Should allow zero as form name'); - } - } - - public function testSetNameNormalizesValueToContainOnlyValidVariableCharacters() - { - $this->form->setName('f%\o^&*)o\(%$b#@!.a}{;-,r'); - $this->assertEquals('foobar', $this->form->getName()); - - try { - $this->form->setName('%\^&*)\(%$#@!.}{;-,'); - $this->fail('Empty names should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid name provided', $e->getMessage()); - } - } - - public function testActionDefaultsToEmptyString() - { - $this->assertSame('', $this->form->getAction()); - } - - public function testCanSetAction() - { - $this->testActionDefaultsToEmptyString(); - $this->form->setAction('/foo/bar'); - $this->assertEquals('/foo/bar', $this->form->getAction()); - } - - /** - * @group ZF-7067 - */ - public function testCanSetActionWithGetParams() - { - $this->testActionDefaultsToEmptyString(); - $this->form->setAction('/foo.php?bar') - ->setView(new Zend_View); - $html = $this->form->render(); - - $this->assertContains('action="/foo.php?bar"', $html); - $this->assertEquals('/foo.php?bar', $this->form->getAction()); - } - - public function testMethodDefaultsToPost() - { - $this->assertEquals('post', $this->form->getMethod()); - } - - public function testCanSetMethod() - { - $this->testMethodDefaultsToPost(); - $this->form->setMethod('get'); - $this->assertEquals('get', $this->form->getMethod()); - } - - public function testMethodLimitedToGetPostPutAndDelete() - { - foreach (array('get', 'post', 'put', 'delete') as $method) { - $this->form->setMethod($method); - $this->assertEquals($method, $this->form->getMethod()); - } - try { - $this->form->setMethod('bogus'); - $this->fail('Invalid method type should throw exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('invalid', $e->getMessage()); - } - } - - public function testEnctypeDefaultsToUrlEncoded() - { - $this->assertEquals(Zend_Form::ENCTYPE_URLENCODED, $this->form->getEnctype()); - } - - public function testCanSetEnctype() - { - $this->testEnctypeDefaultsToUrlEncoded(); - $this->form->setEnctype(Zend_Form::ENCTYPE_MULTIPART); - $this->assertEquals(Zend_Form::ENCTYPE_MULTIPART, $this->form->getEnctype()); - } - - public function testLegendInitiallyNull() - { - $this->assertNull($this->form->getLegend()); - } - - public function testCanSetLegend() - { - $this->testLegendInitiallyNull(); - $legend = "This is a legend"; - $this->form->setLegend($legend); - $this->assertEquals($legend, $this->form->getLegend()); - } - - public function testDescriptionInitiallyNull() - { - $this->assertNull($this->form->getDescription()); - } - - public function testCanSetDescription() - { - $this->testDescriptionInitiallyNull(); - $description = "This is a description"; - $this->form->setDescription($description); - $this->assertEquals($description, $this->form->getDescription()); - } - - // Plugin loaders - - public function testGetPluginLoaderRetrievesDefaultDecoratorPluginLoader() - { - $loader = $this->form->getPluginLoader('decorator'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader); - $paths = $loader->getPaths('Zend_Form_Decorator'); - $this->assertTrue(is_array($paths), var_export($loader, 1)); - $this->assertTrue(0 < count($paths)); - $this->assertContains('Form', $paths[0]); - $this->assertContains('Decorator', $paths[0]); - } - - public function testPassingInvalidTypeToSetPluginLoaderThrowsException() - { - $loader = new Zend_Loader_PluginLoader(); - try { - $this->form->setPluginLoader($loader, 'foo'); - $this->fail('Invalid plugin loader type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testPassingInvalidTypeToGetPluginLoaderThrowsException() - { - try { - $this->form->getPluginLoader('foo'); - $this->fail('Invalid plugin loader type should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testCanSetCustomDecoratorPluginLoader() - { - $loader = new Zend_Loader_PluginLoader(); - $this->form->setPluginLoader($loader, 'decorator'); - $test = $this->form->getPluginLoader('decorator'); - $this->assertSame($loader, $test); - } - - public function testPassingInvalidTypeToAddPrefixPathThrowsException() - { - try { - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'foo'); - $this->fail('Passing invalid loader type to addPrefixPath() should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Invalid type', $e->getMessage()); - } - } - - public function testCanAddDecoratorPluginLoaderPrefixPath() - { - $loader = $this->form->getPluginLoader('decorator'); - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testUpdatedDecoratorPrefixPathUsedForNewElements() - { - $loader = $this->form->getPluginLoader('decorator'); - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $foo = new Zend_Form_Element_Text('foo'); - $this->form->addElement($foo); - $loader = $foo->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - - $this->form->addElement('text', 'bar'); - $bar = $this->form->bar; - $loader = $bar->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testUpdatedDecoratorPrefixPathUsedForNewDisplayGroups() - { - $loader = $this->form->getPluginLoader('decorator'); - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $this->setupElements(); - $foo = $this->form->foo; - $loader = $foo->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testUpdatedPrefixPathUsedForNewSubForms() - { - $loader = $this->form->getPluginLoader('decorator'); - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $this->setupSubForm(); - $loader = $this->form->sub->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testGetPluginLoaderRetrievesDefaultElementPluginLoader() - { - $loader = $this->form->getPluginLoader('element'); - $this->assertTrue($loader instanceof Zend_Loader_PluginLoader); - $paths = $loader->getPaths('Zend_Form_Element'); - $this->assertTrue(is_array($paths), var_export($loader, 1)); - $this->assertTrue(0 < count($paths)); - $this->assertContains('Form', $paths[0]); - $this->assertContains('Element', $paths[0]); - } - - public function testCanSetCustomDecoratorElementLoader() - { - $loader = new Zend_Loader_PluginLoader(); - $this->form->setPluginLoader($loader, 'element'); - $test = $this->form->getPluginLoader('element'); - $this->assertSame($loader, $test); - } - - public function testCanAddElementPluginLoaderPrefixPath() - { - $loader = $this->form->getPluginLoader('element'); - $this->form->addPrefixPath('Zend_Foo', 'Zend/Foo/', 'element'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertTrue(is_array($paths)); - $this->assertContains('Foo', $paths[0]); - } - - public function testAddAllPluginLoaderPrefixPathsSimultaneously() - { - $decoratorLoader = new Zend_Loader_PluginLoader(); - $elementLoader = new Zend_Loader_PluginLoader(); - $this->form->setPluginLoader($decoratorLoader, 'decorator') - ->setPluginLoader($elementLoader, 'element') - ->addPrefixPath('Zend', 'Zend/'); - - $paths = $decoratorLoader->getPaths('Zend_Decorator'); - $this->assertTrue(is_array($paths), var_export($paths, 1)); - $this->assertContains('Decorator', $paths[0]); - - $paths = $elementLoader->getPaths('Zend_Element'); - $this->assertTrue(is_array($paths), var_export($paths, 1)); - $this->assertContains('Element', $paths[0]); - } - - // Elements: - - public function testCanAddAndRetrieveSingleElements() - { - $element = new Zend_Form_Element('foo'); - $this->form->addElement($element); - $this->assertSame($element, $this->form->getElement('foo')); - } - - public function testGetElementReturnsNullForUnregisteredElement() - { - $this->assertNull($this->form->getElement('foo')); - } - - public function testCanAddAndRetrieveSingleElementsByStringType() - { - $this->form->addElement('text', 'foo'); - $element = $this->form->getElement('foo'); - $this->assertTrue($element instanceof Zend_Form_Element); - $this->assertTrue($element instanceof Zend_Form_Element_Text); - $this->assertEquals('foo', $element->getName()); - } - - public function testAddElementAsStringElementThrowsExceptionWhenNoNameProvided() - { - try { - $this->form->addElement('text'); - $this->fail('Should not be able to specify string element type without name'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('must have', $e->getMessage()); - } - } - - public function testCreateElementReturnsNewElement() - { - $element = $this->form->createElement('text', 'foo'); - $this->assertTrue($element instanceof Zend_Form_Element); - } - - public function testCreateElementDoesNotAttachElementToForm() - { - $element = $this->form->createElement('text', 'foo'); - $this->assertTrue($element instanceof Zend_Form_Element); - $this->assertNull($this->form->foo); - } - - public function testCanAddAndRetrieveMultipleElements() - { - $this->form->addElements(array( - 'foo' => 'text', - array('text', 'bar'), - array('text', 'baz', array('foo' => 'bar')), - new Zend_Form_Element_Text('bat'), - )); - $elements = $this->form->getElements(); - $names = array('foo', 'bar', 'baz', 'bat'); - $this->assertEquals($names, array_keys($elements)); - $foo = $elements['foo']; - $this->assertTrue($foo instanceof Zend_Form_Element_Text); - $bar = $elements['bar']; - $this->assertTrue($bar instanceof Zend_Form_Element_Text); - $baz = $elements['baz']; - $this->assertTrue($baz instanceof Zend_Form_Element_Text); - $this->assertEquals('bar', $baz->foo, var_export($baz->getAttribs(), 1)); - $bat = $elements['bat']; - $this->assertTrue($bat instanceof Zend_Form_Element_Text); - } - - public function testSetElementsOverwritesExistingElements() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->setElements(array( - 'bogus' => 'text' - )); - $elements = $this->form->getElements(); - $names = array('bogus'); - $this->assertEquals($names, array_keys($elements)); - } - - public function testCanRemoveSingleElement() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->assertTrue($this->form->removeElement('bar')); - $this->assertNull($this->form->getElement('bar')); - } - - public function testRemoveElementReturnsFalseWhenElementNotRegistered() - { - $this->assertFalse($this->form->removeElement('bogus')); - } - - public function testCanClearAllElements() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->clearElements(); - $elements = $this->form->getElements(); - $this->assertTrue(is_array($elements)); - $this->assertTrue(empty($elements)); - } - - public function testGetValueReturnsNullForUndefinedElements() - { - $this->assertNull($this->form->getValue('foo')); - } - - public function testCanSetElementDefaultValues() - { - $this->testCanAddAndRetrieveMultipleElements(); - $values = array( - 'foo' => 'foovalue', - 'bar' => 'barvalue', - 'baz' => 'bazvalue', - 'bat' => 'batvalue' - ); - $this->form->setDefaults($values); - $elements = $this->form->getElements(); - foreach (array_keys($values) as $name) { - $this->assertEquals($name . 'value', $elements[$name]->getValue(), var_export($elements[$name], 1)); - } - } - - public function testSettingElementDefaultsDoesNotSetElementValuesToNullIfNotInDefaultsArray() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->baz->setValue('testing'); - $this->form->bar->setValue('testing'); - $values = array( - 'foo' => 'foovalue', - 'bat' => 'batvalue' - ); - $this->form->setDefaults($values); - $this->assertEquals('foovalue', $this->form->foo->getValue()); - $this->assertEquals('batvalue', $this->form->bat->getValue()); - $this->assertNotNull($this->form->baz->getValue()); - $this->assertNotNull($this->form->bar->getValue()); - } - - public function testCanRetrieveSingleElementValue() - { - $this->form->addElement('text', 'foo', array('value' => 'foovalue')); - $this->assertEquals('foovalue', $this->form->getValue('foo')); - } - - public function testCanRetrieveAllElementValues() - { - $this->testCanAddAndRetrieveMultipleElements(); - $values = array( - 'foo' => 'foovalue', - 'bar' => 'barvalue', - 'baz' => 'bazvalue', - 'bat' => 'batvalue' - ); - $this->form->setDefaults($values); - $test = $this->form->getValues(); - $elements = $this->form->getElements(); - foreach (array_keys($values) as $name) { - $this->assertEquals($values[$name], $test[$name]); - } - } - - public function testRetrievingAllElementValuesSkipsThoseFlaggedAsIgnore() - { - $this->form->addElements(array( - 'foo' => 'text', - 'bar' => 'text', - 'baz' => 'text' - )); - $this->form->setDefaults(array( - 'foo' => 'Foo Value', - 'bar' => 'Bar Value', - 'baz' => 'Baz Value', - )); - $this->form->bar->setIgnore(true); - $test = $this->form->getValues(); - $this->assertFalse(array_key_exists('bar', $test)); - $this->assertTrue(array_key_exists('foo', $test)); - $this->assertTrue(array_key_exists('baz', $test)); - } - - public function testCanRetrieveSingleUnfilteredElementValue() - { - $foo = new Zend_Form_Element_Text('foo'); - $foo->addFilter('StringToUpper') - ->setValue('foovalue'); - $this->form->addElement($foo); - $this->assertEquals('FOOVALUE', $this->form->getValue('foo')); - $this->assertEquals('foovalue', $this->form->getUnfilteredValue('foo')); - } - - public function testCanRetrieveAllUnfilteredElementValues() - { - $foo = new Zend_Form_Element_Text('foo'); - $foo->addFilter('StringToUpper') - ->setValue('foovalue'); - $bar = new Zend_Form_Element_Text('bar'); - $bar->addFilter('StringToUpper') - ->setValue('barvalue'); - $this->form->addElements(array($foo, $bar)); - $values = $this->form->getValues(); - $unfiltered = $this->form->getUnfilteredValues(); - foreach (array('foo', 'bar') as $key) { - $value = $key . 'value'; - $this->assertEquals(strtoupper($value), $values[$key]); - $this->assertEquals($value, $unfiltered[$key]); - } - } - - public function testOverloadingElements() - { - $this->form->addElement('text', 'foo'); - $this->assertTrue(isset($this->form->foo)); - $element = $this->form->foo; - $this->assertTrue($element instanceof Zend_Form_Element); - unset($this->form->foo); - $this->assertFalse(isset($this->form->foo)); - - $bar = new Zend_Form_Element_Text('bar'); - $this->form->bar = $bar; - $this->assertTrue(isset($this->form->bar)); - $element = $this->form->bar; - $this->assertSame($bar, $element); - } - - public function testOverloadingGetReturnsNullForUndefinedFormItems() - { - $this->assertNull($this->form->bogus); - } - - public function testOverloadingSetThrowsExceptionForInvalidTypes() - { - try { - $this->form->foo = true; - $this->fail('Overloading should not allow scalars'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Only form elements and groups may be overloaded', $e->getMessage()); - } - - try { - $this->form->foo = new Zend_Config(array()); - $this->fail('Overloading should not allow arbitrary object types'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('Only form elements and groups may be overloaded', $e->getMessage()); - $this->assertContains('Zend_Config', $e->getMessage()); - } - } - - public function testFormIsNotAnArrayByDefault() - { - $this->assertFalse($this->form->isArray()); - } - - public function testCanSetArrayFlag() - { - $this->testFormIsNotAnArrayByDefault(); - $this->form->setIsArray(true); - $this->assertTrue($this->form->isArray()); - $this->form->setIsArray(false); - $this->assertFalse($this->form->isArray()); - } - - public function testElementsBelongToReturnsFormNameWhenFormIsArray() - { - $this->form->setName('foo') - ->setIsArray(true); - $this->assertEquals('foo', $this->form->getElementsBelongTo()); - } - - public function testElementsInitiallyBelongToNoArrays() - { - $this->assertNull($this->form->getElementsBelongTo()); - } - - public function testCanSetArrayToWhichElementsBelong() - { - $this->testElementsInitiallyBelongToNoArrays(); - $this->form->setElementsBelongTo('foo'); - $this->assertEquals('foo', $this->form->getElementsBelongTo()); - } - - public function testSettingArrayToWhichElementsBelongSetsArrayFlag() - { - $this->testFormIsNotAnArrayByDefault(); - $this->testCanSetArrayToWhichElementsBelong(); - $this->assertTrue($this->form->isArray()); - } - - public function testArrayToWhichElementsBelongCanConsistOfValidVariableCharsOnly() - { - $this->testElementsInitiallyBelongToNoArrays(); - $this->form->setElementsBelongTo('f%\o^&*)o\(%$b#@!.a}{;-,r'); - $this->assertEquals('foobar', $this->form->getElementsBelongTo()); - } - - public function testSettingArrayToWhichElementsBelongEmptyClearsIt() - { - $this->testCanSetArrayToWhichElementsBelong(); - $this->form->setElementsBelongTo(''); - $this->assertNull($this->form->getElementsBelongTo()); - } - - public function testSettingArrayToWhichElementsBelongEmptySetsArrayFlagToFalse() - { - $this->testSettingArrayToWhichElementsBelongEmptyClearsIt(); - $this->assertFalse($this->form->isArray()); - } - - /** - * @group ZF-6741 - */ - public function testUseIdForDdTagByDefault() - { - $this->form->addSubForm(new Zend_Form_SubForm(), 'bar') - ->bar->addElement('text', 'foo'); - - $html = $this->form->setView($this->getView())->render(); - $this->assertRegexp('//', $html); - } - - public function testUseIdForDtTagByDefault() - { - $this->form->addSubForm(new Zend_Form_SubForm(), 'bar') - ->bar->addElement('text', 'foo'); - - $html = $this->form->setView($this->getView())->render(); - $this->assertRegexp('//', $html); - } - - /** - * @group ZF-3146 - */ - public function testSetElementsBelongToShouldApplyToBothExistingAndFutureElements() - { - $this->form->addElement('text', 'testBelongsTo'); - $this->form->setElementsBelongTo('foo'); - $this->assertEquals('foo', $this->form->testBelongsTo->getBelongsTo(), 'Failed determining testBelongsTo belongs to array'); - $this->setupElements(); - foreach ($this->form->getElements() as $element) { - $message = sprintf('Failed determining element "%s" belongs to foo', $element->getName()); - $this->assertEquals('foo', $element->getBelongsTo(), $message); - } - } - - /** - * @group ZF-3742 - */ - public function testElementsInDisplayGroupsShouldInheritFormElementsBelongToSetting() - { - $subForm = new Zend_Form_SubForm(); - $subForm->addElements(array( - new Zend_Form_Element_Text('foo'), - new Zend_Form_Element_Text('bar'), - new Zend_Form_Element_Text('baz'), - new Zend_Form_Element_Text('bat'), - )) - ->addDisplayGroup(array('bar', 'baz'), 'barbaz'); - $this->form->addSubForm($subForm, 'sub') - ->setElementsBelongTo('myform') - ->setView(new Zend_View); - $html = $this->form->render(); - foreach (array('foo', 'bar', 'baz', 'bat') as $test) { - $this->assertContains('id="myform-sub-' . $test . '"', $html); - $this->assertContains('name="myform[sub][' . $test . ']"', $html); - } - } - - public function testIsValidWithOneLevelElementsBelongTo() - { - $this->form->addElement('text', 'test')->test - ->addValidator('Identical', false, array('Test Value')); - $this->form->setElementsBelongTo('foo'); - - $data = array( - 'foo' => array( - 'test' => 'Test Value', - ), - ); - - $this->assertTrue($this->form->isValid($data)); - } - - public function testIsValidWithMultiLevelElementsBelongTo() - { - $this->form->addElement('text', 'test')->test - ->addValidator('Identical', false, array('Test Value')); - $this->form->setElementsBelongTo('foo[bar][zot]'); - - $data = array( - 'foo' => array( - 'bar' => array( - 'zot' => array( - 'test' => 'Test Value', - ), - ), - ), - ); - - $this->assertTrue($this->form->isValid($data)); - } - - // Sub forms - - public function testCanAddAndRetrieveSingleSubForm() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $this->form->addSubForm($subForm, 'page1'); - $test = $this->form->getSubForm('page1'); - $this->assertSame($subForm, $test); - } - - public function testAddingSubFormSetsSubFormName() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $this->form->addSubForm($subForm, 'page1'); - $this->assertEquals('page1', $subForm->getName()); - } - - public function testAddingSubFormResetsBelongsToWithDifferentSubFormName() - { - $subForm = new Zend_Form_SubForm; - $subForm->setName('quo') - ->addElement('text', 'foo'); - $this->form->addSubForm($subForm, 'bar'); - $this->assertEquals('bar', $subForm->foo->getBelongsTo()); - } - - - public function testGetSubFormReturnsNullForUnregisteredSubForm() - { - $this->assertNull($this->form->getSubForm('foo')); - } - - public function testCanAddAndRetrieveMultipleSubForms() - { - $page1 = new Zend_Form_SubForm(); - $page2 = new Zend_Form_SubForm(); - $page3 = new Zend_Form_SubForm(); - $this->form->addSubForms(array( - 'page1' => $page1, - array($page2, 'page2'), - array($page3, 'page3', 3) - )); - $subforms = $this->form->getSubForms(); - $keys = array('page1', 'page2', 'page3'); - $this->assertEquals($keys, array_keys($subforms)); - $this->assertSame($page1, $subforms['page1']); - $this->assertSame($page2, $subforms['page2']); - $this->assertSame($page3, $subforms['page3']); - } - - public function testSetSubFormsOverwritesExistingSubForms() - { - $this->testCanAddAndRetrieveMultipleSubForms(); - $foo = new Zend_Form_SubForm(); - $this->form->setSubForms(array('foo' => $foo)); - $subforms = $this->form->getSubForms(); - $keys = array('foo'); - $this->assertEquals($keys, array_keys($subforms)); - $this->assertSame($foo, $subforms['foo']); - } - - public function testCanRemoveSingleSubForm() - { - $this->testCanAddAndRetrieveMultipleSubForms(); - $this->assertTrue($this->form->removeSubForm('page2')); - $this->assertNull($this->form->getSubForm('page2')); - } - - public function testRemoveSubFormReturnsFalseForNonexistantSubForm() - { - $this->assertFalse($this->form->removeSubForm('foo')); - } - - public function testCanClearAllSubForms() - { - $this->testCanAddAndRetrieveMultipleSubForms(); - $this->form->clearSubForms(); - $subforms = $this->form->getSubForms(); - $this->assertTrue(is_array($subforms)); - $this->assertTrue(empty($subforms)); - } - - public function testOverloadingSubForms() - { - $foo = new Zend_Form_SubForm; - $this->form->addSubForm($foo, 'foo'); - $this->assertTrue(isset($this->form->foo)); - $subform = $this->form->foo; - $this->assertSame($foo, $subform); - unset($this->form->foo); - $this->assertFalse(isset($this->form->foo)); - - $bar = new Zend_Form_SubForm(); - $this->form->bar = $bar; - $this->assertTrue(isset($this->form->bar)); - $subform = $this->form->bar; - $this->assertSame($bar, $subform); - } - - public function testCanSetDefaultsForSubFormElementsFromForm() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $this->form->addSubForm($subForm, 'page1'); - - $data = array('foo' => 'foo value', 'bar' => 'bar value'); - $this->form->setDefaults($data); - $this->assertEquals($data['foo'], $subForm->foo->getValue()); - $this->assertEquals($data['bar'], $subForm->bar->getValue()); - } - - public function testCanSetDefaultsForSubFormElementsFromFormWithArray() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $this->form->addSubForm($subForm, 'page1'); - - $data = array( 'page1' => array( - 'foo' => 'foo value', - 'bar' => 'bar value' - )); - $this->form->setDefaults($data); - $this->assertEquals($data['page1']['foo'], $subForm->foo->getValue()); - $this->assertEquals($data['page1']['bar'], $subForm->bar->getValue()); - } - - public function testGetValuesReturnsSubFormValues() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $subForm->foo->setValue('foo value'); - $subForm->bar->setValue('bar value'); - $this->form->addSubForm($subForm, 'page1'); - - $values = $this->form->getValues(); - $this->assertTrue(isset($values['page1'])); - $this->assertTrue(isset($values['page1']['foo'])); - $this->assertTrue(isset($values['page1']['bar'])); - $this->assertEquals($subForm->foo->getValue(), $values['page1']['foo']); - $this->assertEquals($subForm->bar->getValue(), $values['page1']['bar']); - } - - public function testGetValuesReturnsSubFormValuesFromArrayToWhichElementsBelong() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')) - ->setElementsBelongTo('subform'); - $subForm->foo->setValue('foo value'); - $subForm->bar->setValue('bar value'); - $this->form->addSubForm($subForm, 'page1'); - - $values = $this->form->getValues(); - $this->assertTrue(isset($values['subform']), var_export($values, 1)); - $this->assertTrue(isset($values['subform']['foo'])); - $this->assertTrue(isset($values['subform']['bar'])); - $this->assertEquals($subForm->foo->getValue(), $values['subform']['foo']); - $this->assertEquals($subForm->bar->getValue(), $values['subform']['bar']); - } - - public function testGetValuesReturnsNestedSubFormValuesFromArraysToWhichElementsBelong() - { - $form = new Zend_Form(); - $form->setElementsBelongTo('foobar'); - - $form->addElement('text', 'firstName') - ->getElement('firstName') - ->setRequired(true); - - $form->addElement('text', 'lastName') - ->getElement('lastName') - ->setRequired(true); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('baz[quux]'); - $subForm->addElement('text', 'email') - ->getElement('email')->setRequired(true); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->setElementsBelongTo('bat'); - $subSubForm->addElement('checkbox', 'home') - ->getElement('home')->setRequired(true); - - $subForm->addSubForm($subSubForm, 'subSub'); - - $form->addSubForm($subForm, 'sub') - ->addElement('submit', 'save', array('value' => 'submit', 'ignore' => true)); - - - $data = array('foobar' => array( - 'firstName' => 'Mabel', - 'lastName' => 'Cow', - 'baz' => array( - 'quux' => array( - 'email' => 'mabel@cow.org', - 'bat' => array( - 'home' => 1, - ) - ), - ) - )); - $this->assertTrue($form->isValid($data)); - - $values = $form->getValues(); - $this->assertEquals($data, $values); - } - - public function testGetValueCanReturnSubFormValues() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $subForm->foo->setValue('foo value'); - $subForm->bar->setValue('bar value'); - $this->form->addSubForm($subForm, 'page1'); - - $values = $this->form->getValue('page1'); - $this->assertTrue(isset($values['foo']), var_export($values, 1)); - $this->assertTrue(isset($values['bar'])); - $this->assertEquals($subForm->foo->getValue(), $values['foo']); - $this->assertEquals($subForm->bar->getValue(), $values['bar']); - } - - public function testGetValueCanReturnSubFormValuesFromArrayToWhichElementsBelong() - { - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')) - ->setElementsBelongTo('subform'); - $subForm->foo->setValue('foo value'); - $subForm->bar->setValue('bar value'); - $this->form->addSubForm($subForm, 'page1'); - - $values = $this->form->getValue('subform'); - $this->assertTrue(isset($values['foo']), var_export($values, 1)); - $this->assertTrue(isset($values['bar'])); - $this->assertEquals($subForm->foo->getValue(), $values['foo']); - $this->assertEquals($subForm->bar->getValue(), $values['bar']); - } - - public function testIsValidCanValidateSubFormsWithArbitraryElementsBelong() - { - $subForm = new Zend_Form_SubForm(); - $subForm->addElement('text', 'test')->test - ->setRequired(true)->addValidator('Identical', false, array('Test Value')); - $this->form->addSubForm($subForm, 'sub'); - - $this->form->setElementsBelongTo('foo[bar]'); - $subForm->setElementsBelongTo('my[subform]'); - - $data = array( - 'foo' => array( - 'bar' => array( - 'my' => array( - 'subform' => array( - 'test' => 'Test Value', - ), - ), - ), - ), - ); - - $this->assertTrue($this->form->isValid($data)); - } - - public function testIsValidCanValidateNestedSubFormsWithArbitraryElementsBelong() - { - $subForm = new Zend_Form_SubForm(); - $subForm->addElement('text', 'test1')->test1 - ->setRequired(true)->addValidator('Identical', false, array('Test1 Value')); - $this->form->addSubForm($subForm, 'sub'); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->addElement('text', 'test2')->test2 - ->setRequired(true)->addValidator('Identical', false, array('Test2 Value')); - $subForm->addSubForm($subSubForm, 'subSub'); - - $this->form->setElementsBelongTo('form[first]'); - // Notice we skipped subForm, to mix manual and auto elementsBelongTo. - $subSubForm->setElementsBelongTo('subsubform[first]'); - - $data = array( - 'form' => array( - 'first' => array( - 'sub' => array( - 'test1' => 'Test1 Value', - - 'subsubform' => array( - 'first' => array( - 'test2' => 'Test2 Value', - ), - ), - ), - ), - ), - ); - - $this->assertTrue($this->form->isValid($data)); - } - - /** - * @group ZF-9679 - */ - public function testIsValidDiscardsValidatedValues() - { - $this->form->addElement('text', 'foo'); - $this->form->addSubForm(new Zend_Form_SubForm(), 'bar') - ->bar->addElement('text', 'foo') - ->foo->setAllowEmpty(true) - ->addValidator('Identical', true, ''); - - $this->assertTrue($this->form->isValid(array('foo' => 'foo Value'))); - } - - /** - * @group ZF-9666 - */ - public function testSetDefaultsDiscardsPopulatedValues() - { - $this->form->addElement('text', 'foo'); - $this->form->addSubForm(new Zend_Form_SubForm(), 'bar') - ->bar->addElement('text', 'foo'); - - $this->form->populate(array('foo' => 'foo Value')); - $html = $this->form->setView($this->getView()) - ->render(); - $this->assertEquals(1, preg_match_all('/foo Value/', $html, $matches)); - } - - public function _setup9350() - { - $this->form->addSubForm(new Zend_Form_SubForm(), 'foo') - ->foo->setElementsBelongTo('foo[foo]') // foo[foo] - ->addSubForm(new Zend_Form_SubForm(), 'foo') // foo[foo][foo] - ->foo->setIsArray(false) - ->addElement('text', 'foo') // foo[foo][foo][foo] - ->foo->addValidator('Identical', - false, - array('foo Value')); - - $this->form->foo->addSubForm(new Zend_Form_SubForm(), 'baz') // foo[foo][baz] - ->baz->setIsArray(false) - ->addSubForm(new Zend_Form_SubForm(), 'baz') - ->baz->setElementsBelongTo('baz[baz]') // foo[foo][baz][baz][baz] - ->addElement('text', 'baz') // foo[foo][baz][baz][baz][baz] - ->baz->addValidator('Identical', - false, - array('baz Value')); - - // This is appending a different named SubForm and setting - // elementsBelongTo to a !isArray() Subform name from same level - $this->form->foo->addSubForm(new Zend_Form_SubForm(), 'quo') - ->quo->setElementsBelongTo('foo') // foo[foo][foo] !!!! - ->addElement('text', 'quo') // foo[foo][foo][quo] - ->quo->addValidator('Identical', - false, - array('quo Value')); - - // This is setting elementsBelongTo point into the middle of - // a chain of another SubForms elementsBelongTo - $this->form->addSubForm(new Zend_Form_SubForm(), 'duh') - ->duh->setElementsBelongTo('foo[zoo]') // foo[zoo] !!!! - ->addElement('text', 'zoo') // foo[zoo][zoo] - ->zoo->addValidator('Identical', - false, - array('zoo Value')); - - // This is !isArray SubForms Name equal to the last segment - // of another SubForms elementsBelongTo - $this->form->addSubForm(new Zend_Form_SubForm(), 'iek') - ->iek->setElementsBelongTo('foo') // foo !!!! - ->addSubForm(new Zend_Form_SubForm(), 'zoo') // foo[zoo] !!!! - ->zoo->setIsArray(false) - ->addElement('text', 'iek') // foo[zoo][iek] - ->iek->addValidator('Identical', - false, - array('iek Value')); - - $data = array('valid' => array('foo' => - array('foo' => - array('foo' => - array('foo' => 'foo Value', - 'quo' => 'quo Value'), - 'baz' => - array('baz' => - array('baz' => - array('baz' => 'baz Value')))), - 'zoo' => - array('zoo' => 'zoo Value', - 'iek' => 'iek Value'))), - 'invalid' => array('foo' => - array('foo' => - array('foo' => - array('foo' => 'foo Invalid', - 'quo' => 'quo Value'), - 'baz' => - array('baz' => - array('baz' => - array('baz' => 'baz Value')))), - 'zoo' => - array('zoo' => 'zoo Value', - 'iek' => 'iek Invalid'))), - 'partial' => array('foo' => - array('foo' => - array('baz' => - array('baz' => - array('baz' => - array('baz' => 'baz Value'))), - 'foo' => - array('quo' => 'quo Value')), - 'zoo' => - array('zoo' => 'zoo Value')))); - return $data; - } - - public function testIsValidEqualSubFormAndElementName() - { - $data = $this->_setup9350(); - $this->assertTrue($this->form->isValid($data['valid'])); - } - - public function testIsValidPartialEqualSubFormAndElementName() - { - $data = $this->_setup9350(); - $this->assertTrue($this->form->isValidPartial($data['partial'])); - } - - public function testPopulateWithElementsBelongTo() - { - $data = $this->_setup9350(); - - $this->form->setView($this->getView())->populate($data['valid']); - $html = $this->form->render(); - - $this->assertRegexp('/value=.foo Value./', $html); - $this->assertRegexp('/value=.baz Value./', $html); - $this->assertRegexp('/value=.quo Value./', $html); - $this->assertRegexp('/value=.zoo Value./', $html); - $this->assertRegexp('/value=.iek Value./', $html); - } - - public function testGetValidValuesWithElementsBelongTo() - { - $data = $this->_setup9350(); - $this->assertSame($this->form->getValidValues($data['invalid']), $data['partial']); - } - - public function testGetErrorsWithElementsBelongTo() - { - $data = $this->_setup9350(); - $this->form->isValid($data['invalid']); - $errors = $this->form->getErrors(); - - $this->assertTrue(isset($errors['foo']['foo']['foo']['foo'])); - $this->assertTrue(isset($errors['foo']['zoo']['iek'])); - } - - public function testGetValuesWithElementsBelongTo() - { - $data = $this->_setup9350(); - $this->form->populate($data['valid']); - $this->assertSame($this->form->getValues(), $data['valid']); - } - - public function testGetMessagesWithElementsBelongTo() - { - $data = $this->_setup9350(); - $this->form->isValid($data['invalid']); - $msgs = $this->form->getMessages(); - $this->assertTrue(isset($msgs['foo']['foo']['foo']['foo'])); - $this->assertTrue(isset($msgs['foo']['zoo']['iek'])); - } - - public function _setup9401() - { - $sub0 = 0; - $this->form->addSubForm(new Zend_Form_SubForm(), $sub0) - ->$sub0->setElementsBelongTo('f[2]') - ->addElement('text', 'foo') - ->foo->addValidator('Identical', - false, - array('foo Value')); - - $this->form->$sub0->addSubForm(new Zend_Form_SubForm(), $sub0) - ->$sub0->addElement('text', 'quo') - ->quo->addValidator('Identical', - false, - array('quo Value')); - - $data = array('valid' => array('f' => - array(2 => - array('foo' => 'foo Value', - 0 => - array('quo' => 'quo Value')))), - 'invalid' => array('f' => - array(2 => - array('foo' => 'foo Invalid', - 0 => - array('quo' => 'quo Value')))), - 'partial' => array('f' => - array(2 => - array(0 => - array('quo' => 'quo Value'))))); - return $data; - } - - public function testGetErrorsNumericalSubForms() - { - $data = $this->_setup9401(); - $this->form->isValid($data['invalid']); - $err = $this->form->getErrors(); - $this->assertTrue(is_array($err['f'][2]['foo']) && !empty($err['f'][2]['foo'])); - } - - public function testGetMessagesNumericalSubForms() - { - $data = $this->_setup9401(); - $this->form->isValid($data['invalid']); - $msg = $this->form->getMessages(); - $this->assertTrue(is_array($msg['f'][2]['foo']) && !empty($msg['f'][2]['foo'])); - } - - public function testGetValuesNumericalSubForms() - { - $data = $this->_setup9401(); - $this->form->populate($data['valid']); - $this->assertEquals($this->form->getValues(), $data['valid']); - } - - public function testGetValidValuesNumericalSubForms() - { - $data = $this->_setup9401(); - $this->assertEquals($this->form->getValidValues($data['invalid']), $data['partial']); - } - - public function _setup9607() - { - $this->form->addElement('text', 'foo') - ->foo->setBelongsTo('bar[quo]') - ->setRequired(true) - ->addValidator('Identical', - false, - 'foo Value'); - - $this->form->addElement('text', 'quo') - ->quo->setBelongsTo('bar[quo]') - ->addValidator('Identical', - false, - 'quo Value'); - - $data = array('valid' => array('bar' => - array('quo' => - array('foo' => 'foo Value', - 'quo' => 'quo Value'))), - 'invalid' => array('bar' => - array('quo' => - array('foo' => 'foo Invalid', - 'quo' => 'quo Value'))), - 'partial' => array('bar' => - array('quo' => - array('quo' => 'quo Value')))); - return $data; - } - - public function testIsValidWithBelongsTo() - { - $data = $this->_setup9607(); - $this->assertTrue($this->form->isValid($data['valid'])); - } - - public function testIsValidPartialWithBelongsTo() - { - $data = $this->_setup9607(); - $this->assertTrue($this->form->isValidPartial($data['valid'])); - $this->assertSame('foo Value', $this->form->foo->getValue()); - } - - public function testPopulateWithBelongsTo() - { - $data = $this->_setup9607(); - $this->form->populate($data['valid']); - $this->assertSame('foo Value', $this->form->foo->getValue()); - } - - public function testGetValuesWithBelongsTo() - { - $data = $this->_setup9607(); - $this->form->populate($data['valid']); - $this->assertSame($data['valid'], $this->form->getValues()); - } - - public function testGetValidValuesWithBelongsTo() - { - $data = $this->_setup9607(); - $this->assertSame($data['partial'], $this->form->getValidValues($data['invalid'])); - } - - public function testZF9788_NumericArrayIndex() - { - $s = 2; - $e = 4; - $this->form->setName('f') - ->setIsArray(true) - ->addElement('text', (string)$e) - ->$e->setRequired(true); - $this->form->addSubForm(new Zend_Form_SubForm(), $s) - ->$s->addElement('text', (string)$e) - ->$e->setRequired(true); - - $valid = array('f' => array($e => 1, - $s => array($e => 1))); - - $this->form->populate($valid); - - $this->assertEquals($valid, $this->form->getValues()); - - $vv = $this->form->getValidValues(array('f' => array($e => 1, - $s => array($e => 1)))); - $this->assertEquals($valid, $vv); - - $this->form->isValid(array()); - - $err = $this->form->getErrors(); - $msg = $this->form->getMessages(); - - $this->assertTrue(is_array($err['f'][$e]) && is_array($err['f'][$s][$e])); - $this->assertTrue(is_array($msg['f'][$e]) && is_array($msg['f'][$s][$e])); - } - - // Display groups - - public function testCanAddAndRetrieveSingleDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->addDisplayGroup(array('bar', 'bat'), 'barbat'); - $group = $this->form->getDisplayGroup('barbat'); - $this->assertTrue($group instanceof Zend_Form_DisplayGroup); - $elements = $group->getElements(); - $expected = array('bar' => $this->form->bar, 'bat' => $this->form->bat); - $this->assertEquals($expected, $elements); - } - - public function testDisplayGroupsMustContainAtLeastOneElement() - { - try { - $this->form->addDisplayGroup(array(), 'foo'); - $this->fail('Empty display group should raise exception'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('No valid elements', $e->getMessage()); - } - } - - public function testCanAddAndRetrieveMultipleDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->addDisplayGroups(array( - array(array('bar', 'bat'), 'barbat'), - 'foobaz' => array('baz', 'foo') - )); - $groups = $this->form->getDisplayGroups(); - $expected = array( - 'barbat' => array('bar' => $this->form->bar, 'bat' => $this->form->bat), - 'foobaz' => array('baz' => $this->form->baz, 'foo' => $this->form->foo), - ); - foreach ($groups as $group) { - $this->assertTrue($group instanceof Zend_Form_DisplayGroup); - } - $this->assertEquals($expected['barbat'], $groups['barbat']->getElements()); - $this->assertEquals($expected['foobaz'], $groups['foobaz']->getElements()); - } - - public function testSetDisplayGroupsOverwritesExistingDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleDisplayGroups(); - $this->form->setDisplayGroups(array('foobar' => array('bar', 'foo'))); - $groups = $this->form->getDisplayGroups(); - $expected = array('bar' => $this->form->bar, 'foo' => $this->form->foo); - $this->assertEquals(1, count($groups)); - $this->assertTrue(isset($groups['foobar'])); - $this->assertEquals($expected, $groups['foobar']->getElements()); - } - - public function testCanRemoveSingleDisplayGroup() - { - $this->testCanAddAndRetrieveMultipleDisplayGroups(); - $this->assertTrue($this->form->removeDisplayGroup('barbat')); - $this->assertNull($this->form->getDisplayGroup('barbat')); - } - - public function testRemoveDisplayGroupReturnsFalseForNonexistantGroup() - { - $this->assertFalse($this->form->removeDisplayGroup('bogus')); - } - - public function testCanClearAllDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleDisplayGroups(); - $this->form->clearDisplayGroups(); - $groups = $this->form->getDisplayGroups(); - $this->assertTrue(is_array($groups)); - $this->assertTrue(empty($groups)); - } - - public function testOverloadingDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->addDisplayGroup(array('foo', 'bar'), 'foobar'); - $this->assertTrue(isset($this->form->foobar)); - $group = $this->form->foobar; - $expected = array('foo' => $this->form->foo, 'bar' => $this->form->bar); - $this->assertEquals($expected, $group->getElements()); - unset($this->form->foobar); - $this->assertFalse(isset($this->form->foobar)); - - $this->form->barbaz = array('bar', 'baz'); - $this->assertTrue(isset($this->form->barbaz)); - $group = $this->form->barbaz; - $expected = array('bar' => $this->form->bar, 'baz' => $this->form->baz); - $this->assertSame($expected, $group->getElements()); - } - - public function testDefaultDisplayGroupClassExists() - { - $this->assertEquals('Zend_Form_DisplayGroup', $this->form->getDefaultDisplayGroupClass()); - } - - public function testCanSetDefaultDisplayGroupClass() - { - $this->testDefaultDisplayGroupClassExists(); - $this->form->setDefaultDisplayGroupClass('Zend_Form_FormTest_DisplayGroup'); - $this->assertEquals('Zend_Form_FormTest_DisplayGroup', $this->form->getDefaultDisplayGroupClass()); - } - - public function testDefaultDisplayGroupClassUsedForNewDisplayGroups() - { - $this->form->setDefaultDisplayGroupClass('Zend_Form_FormTest_DisplayGroup'); - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'bar'), 'foobar'); - $displayGroup = $this->form->getDisplayGroup('foobar'); - $this->assertTrue($displayGroup instanceof Zend_Form_FormTest_DisplayGroup); - } - - public function testCanPassDisplayGroupClassWhenAddingDisplayGroup() - { - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'bar'), 'foobar', array('displayGroupClass' => 'Zend_Form_FormTest_DisplayGroup')); - $this->assertTrue($this->form->foobar instanceof Zend_Form_FormTest_DisplayGroup); - } - - /** - * @group ZF-3254 - */ - public function testAddingDisplayGroupShouldPassOptions() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->addDisplayGroup(array('bar', 'bat'), 'barbat', array('disableLoadDefaultDecorators' => true)); - $group = $this->form->getDisplayGroup('barbat'); - $this->assertTrue($group instanceof Zend_Form_DisplayGroup); - $decorators = $group->getDecorators(); - $this->assertTrue(is_array($decorators)); - $this->assertTrue(empty($decorators)); - } - - // Processing - - public function testPopulateProxiesToSetDefaults() - { - $this->testCanAddAndRetrieveMultipleElements(); - $values = array( - 'foo' => 'foovalue', - 'bar' => 'barvalue', - 'baz' => 'bazvalue', - 'bat' => 'batvalue' - ); - $this->form->populate($values); - $test = $this->form->getValues(); - $elements = $this->form->getElements(); - foreach (array_keys($values) as $name) { - $this->assertEquals($values[$name], $test[$name]); - } - } - - public function setupElements() - { - $foo = new Zend_Form_Element_Text('foo'); - $foo->addValidator('NotEmpty') - ->addValidator('Alpha'); - $bar = new Zend_Form_Element_Text('bar'); - $bar->addValidator('NotEmpty') - ->addValidator('Digits'); - $baz = new Zend_Form_Element_Text('baz'); - $baz->addValidator('NotEmpty') - ->addValidator('Alnum'); - $this->form->addElements(array($foo, $bar, $baz)); - $this->elementValues = array( - 'foo' => 'fooBarBAZ', - 'bar' => '123456789', - 'baz' => 'foo123BAR', - ); - } - - public function testIsValidShouldThrowExceptionWithNonArrayArgument() - { - try { - $this->form->isValid(true); - $this->fail('isValid() should raise exception with non-array argument'); - } catch (Zend_Form_Exception $e) { - $this->assertContains('expects an array', $e->getMessage()); - } - } - - public function testCanValidateFullFormContainingOnlyElements() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->assertTrue($this->form->isValid($this->elementValues)); - $values = array( - 'foo' => '12345', - 'bar' => 'abc', - 'baz' => 'abc-123' - ); - $this->assertFalse($this->form->isValid($values)); - - $validator = $this->form->foo->getValidator('alpha'); - $this->assertEquals('12345', $validator->value); - - $validator = $this->form->bar->getValidator('digits'); - $this->assertEquals('abc', $validator->value); - - $validator = $this->form->baz->getValidator('alnum'); - $this->assertEquals('abc-123', $validator->value); - } - - public function testValidationTakesElementRequiredFlagsIntoAccount() - { - $this->_checkZf2794(); - - $this->setupElements(); - - $this->assertTrue($this->form->isValid(array())); - - $this->form->getElement('foo')->setRequired(true); - $this->assertTrue($this->form->isValid(array( - 'foo' => 'abc', - 'baz' => 'abc123' - ))); - $this->assertFalse($this->form->isValid(array( - 'baz' => 'abc123' - ))); - } - - public function testCanValidatePartialFormContainingOnlyElements() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->form->getElement('foo')->setRequired(true); - $this->form->getElement('bar')->setRequired(true); - $this->form->getElement('baz')->setRequired(true); - $this->assertTrue($this->form->isValidPartial(array( - 'foo' => 'abc', - 'baz' => 'abc123' - ))); - $this->assertFalse($this->form->isValidPartial(array( - 'foo' => '123', - 'baz' => 'abc-123' - ))); - } - - public function setupSubForm() - { - $subForm = new Zend_Form_SubForm(); - $foo = new Zend_Form_Element_Text('subfoo'); - $foo->addValidators(array('NotEmpty', 'Alpha'))->setRequired(true); - $bar = new Zend_Form_Element_Text('subbar'); - $bar->addValidators(array('NotEmpty', 'Digits')); - $baz = new Zend_Form_Element_Text('subbaz'); - $baz->addValidators(array('NotEmpty', 'Alnum'))->setRequired(true); - $subForm->addElements(array($foo, $bar, $baz)); - $this->form->addSubForm($subForm, 'sub'); - } - - public function testFullDataArrayUsedToValidateSubFormByDefault() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->setupSubForm(); - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subfoo' => 'abcdef', - 'subbar' => '123456', - 'subbaz' => '123abc', - ); - $this->assertTrue($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subfoo' => '123', - 'subbar' => 'abc', - 'subbaz' => '123-abc', - ); - $this->assertFalse($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subfoo' => 'abc', - 'subbaz' => '123abc', - ); - $this->assertTrue($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subbar' => '123', - 'subbaz' => '123abc', - ); - $this->assertFalse($this->form->isValid($data)); - } - - public function testDataKeyWithSameNameAsSubFormIsUsedForValidatingSubForm() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->setupSubForm(); - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'sub' => array( - 'subfoo' => 'abcdef', - 'subbar' => '123456', - 'subbaz' => '123abc', - ), - ); - $this->assertTrue($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'sub' => array( - 'subfoo' => '123', - 'subbar' => 'abc', - 'subbaz' => '123-abc', - ) - ); - $this->assertFalse($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'sub' => array( - 'subfoo' => 'abc', - 'subbaz' => '123abc', - ) - ); - $this->assertTrue($this->form->isValid($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'sub' => array( - 'subbar' => '123', - 'subbaz' => '123abc', - ) - ); - $this->assertFalse($this->form->isValid($data)); - } - - public function testCanValidateNestedFormsWithElementsBelongingToArrays() - { - $form = new Zend_Form(); - $form->setElementsBelongTo('foobar'); - - $form->addElement('text', 'firstName') - ->getElement('firstName') - ->setRequired(true); - - $form->addElement('text', 'lastName') - ->getElement('lastName') - ->setRequired(true); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('baz'); - $subForm->addElement('text', 'email') - ->getElement('email')->setRequired(true); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->setElementsBelongTo('bat'); - $subSubForm->addElement('checkbox', 'home') - ->getElement('home')->setRequired(true); - - $subForm->addSubForm($subSubForm, 'subSub'); - - $form->addSubForm($subForm, 'sub') - ->addElement('submit', 'save', array('value' => 'submit')); - - - $data = array('foobar' => array( - 'firstName' => 'Mabel', - 'lastName' => 'Cow', - 'baz' => array( - 'email' => 'mabel@cow.org', - 'bat' => array( - 'home' => 1, - ) - ) - )); - $this->assertTrue($form->isValid($data)); - $this->assertEquals('Mabel', $form->firstName->getValue()); - $this->assertEquals('Cow', $form->lastName->getValue()); - $this->assertEquals('mabel@cow.org', $form->sub->email->getValue()); - $this->assertEquals(1, $form->sub->subSub->home->getValue()); - } - - public function testCanValidatePartialFormContainingSubForms() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->setupSubForm(); - - $data = array( - 'subfoo' => 'abcdef', - 'subbar' => '123456', - ); - $this->assertTrue($this->form->isValidPartial($data)); - - $data = array( - 'foo' => 'abcdef', - 'baz' => '123abc', - 'sub' => array( - 'subbar' => '123', - ) - ); - $this->assertTrue($this->form->isValidPartial($data)); - - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'sub' => array( - 'subfoo' => '123', - ) - ); - $this->assertFalse($this->form->isValidPartial($data)); - } - - public function testCanValidatePartialNestedFormsWithElementsBelongingToArrays() - { - $this->_checkZf2794(); - - $form = new Zend_Form(); - $form->setElementsBelongTo('foobar'); - - $form->addElement('text', 'firstName') - ->getElement('firstName') - ->setRequired(false); - - $form->addElement('text', 'lastName') - ->getElement('lastName') - ->setRequired(true); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('baz'); - $subForm->addElement('text', 'email') - ->getElement('email') - ->setRequired(true) - ->addValidator('NotEmpty'); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->setElementsBelongTo('bat'); - $subSubForm->addElement('checkbox', 'home') - ->getElement('home') - ->setRequired(true) - ->addValidator('InArray', false, array(array('1'))); - - $subForm->addSubForm($subSubForm, 'subSub'); - - $form->addSubForm($subForm, 'sub') - ->addElement('submit', 'save', array('value' => 'submit')); - - - $data = array('foobar' => array( - 'lastName' => 'Cow', - )); - $this->assertTrue($form->isValidPartial($data)); - $this->assertEquals('Cow', $form->lastName->getValue()); - $firstName = $form->firstName->getValue(); - $email = $form->sub->email->getValue(); - $home = $form->sub->subSub->home->getValue(); - $this->assertTrue(empty($firstName)); - $this->assertTrue(empty($email)); - $this->assertTrue(empty($home)); - - $form->sub->subSub->home->addValidator('StringLength', false, array(4, 6)); - $data['foobar']['baz'] = array('bat' => array('home' => 'ab')); - - $this->assertFalse($form->isValidPartial($data), var_export($data, 1)); - $this->assertEquals('0', $form->sub->subSub->home->getValue()); - $messages = $form->getMessages(); - $this->assertFalse(empty($messages)); - $this->assertTrue(isset($messages['foobar']['baz']['bat']['home']), var_export($messages, 1)); - $this->assertTrue(isset($messages['foobar']['baz']['bat']['home']['notInArray']), var_export($messages, 1)); - } - - public function testCanValidatePartialNestedFormsWithMultiLevelElementsBelongingToArrays() - { - $this->_checkZf2794(); - - $form = new Zend_Form(); - $form->setElementsBelongTo('foo[bar]'); - - $form->addElement('text', 'firstName') - ->getElement('firstName') - ->setRequired(false); - - $form->addElement('text', 'lastName') - ->getElement('lastName') - ->setRequired(true); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('baz'); - $subForm->addElement('text', 'email') - ->getElement('email') - ->setRequired(true) - ->addValidator('NotEmpty'); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->setElementsBelongTo('bat[quux]'); - $subSubForm->addElement('checkbox', 'home') - ->getElement('home') - ->setRequired(true) - ->addValidator('InArray', false, array(array('1'))); - - $subForm->addSubForm($subSubForm, 'subSub'); - - $form->addSubForm($subForm, 'sub') - ->addElement('submit', 'save', array('value' => 'submit')); - - - $data = array('foo' => array( - 'bar' => array( - 'lastName' => 'Cow', - ), - )); - $this->assertTrue($form->isValidPartial($data)); - $this->assertEquals('Cow', $form->lastName->getValue()); - $firstName = $form->firstName->getValue(); - $email = $form->sub->email->getValue(); - $home = $form->sub->subSub->home->getValue(); - $this->assertTrue(empty($firstName)); - $this->assertTrue(empty($email)); - $this->assertTrue(empty($home)); - - $form->sub->subSub->home->addValidator('StringLength', false, array(4, 6)); - $data['foo']['bar']['baz'] = array('bat' => array('quux' => array('home' => 'ab'))); - - $this->assertFalse($form->isValidPartial($data), var_export($data, 1)); - $this->assertEquals('0', $form->sub->subSub->home->getValue()); - } - - public function testCanGetMessagesOfNestedFormsWithMultiLevelElementsBelongingToArrays() - { - $this->_checkZf2794(); - - $form = new Zend_Form(); - $form->setElementsBelongTo('foo[bar]'); - - $form->addElement('text', 'firstName') - ->getElement('firstName') - ->setRequired(false); - - $form->addElement('text', 'lastName') - ->getElement('lastName') - ->setRequired(true); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('baz'); - $subForm->addElement('text', 'email') - ->getElement('email') - ->setRequired(true) - ->addValidator('NotEmpty'); - - $subSubForm = new Zend_Form_SubForm(); - $subSubForm->setElementsBelongTo('bat[quux]'); - $subSubForm->addElement('checkbox', 'home') - ->getElement('home') - ->setRequired(true) - ->addValidator('InArray', false, array(array('1'))); - - $subForm->addSubForm($subSubForm, 'subSub'); - - $form->addSubForm($subForm, 'sub') - ->addElement('submit', 'save', array('value' => 'submit')); - - - $data = array('foo' => array( - 'bar' => array( - 'lastName' => 'Cow', - ), - )); - - - $form->sub->subSub->home->addValidator('StringLength', false, array(4, 6)); - $data['foo']['bar']['baz'] = array('bat' => array('quux' => array('home' => 'ab'))); - - $form->isValidPartial($data); - - $messages = $form->getMessages(); - $this->assertFalse(empty($messages)); - $this->assertTrue(isset($messages['foo']['bar']['baz']['bat']['quux']['home']), var_export($messages, 1)); - $this->assertTrue(isset($messages['foo']['bar']['baz']['bat']['quux']['home']['notInArray']), var_export($messages, 1)); - } - - public function testValidatingFormWithDisplayGroupsDoesSameAsWithout() - { - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz'); - $this->assertTrue($this->form->isValid($this->elementValues)); - $this->assertFalse($this->form->isValid(array( - 'foo' => '123', - 'bar' => 'abc', - 'baz' => 'abc-123' - ))); - } - - public function testValidatePartialFormWithDisplayGroupsDoesSameAsWithout() - { - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz'); - $this->assertTrue($this->form->isValid(array( - 'foo' => 'abc', - 'baz' => 'abc123' - ))); - $this->assertFalse($this->form->isValid(array( - 'foo' => '123', - 'baz' => 'abc-123' - ))); - } - - public function testProcessAjaxReturnsJsonTrueForValidForm() - { - $this->setupElements(); - $return = $this->form->processAjax($this->elementValues); - $this->assertTrue(Zend_Json::decode($return)); - } - - public function testProcessAjaxReturnsJsonTrueForValidPartialForm() - { - $this->setupElements(); - $data = array('foo' => 'abcdef', 'baz' => 'abc123'); - $return = $this->form->processAjax($data); - $this->assertTrue(Zend_Json::decode($return)); - } - - public function testProcessAjaxReturnsJsonWithAllErrorMessagesForInvalidForm() - { - $this->setupElements(); - $data = array('foo' => '123456', 'bar' => 'abcdef', 'baz' => 'abc-123'); - $return = Zend_Json::decode($this->form->processAjax($data)); - $this->assertTrue(is_array($return)); - $this->assertEquals(array_keys($data), array_keys($return)); - } - - public function testProcessAjaxReturnsJsonWithAllErrorMessagesForInvalidPartialForm() - { - $this->setupElements(); - $data = array('baz' => 'abc-123'); - $return = Zend_Json::decode($this->form->processAjax($data)); - $this->assertTrue(is_array($return)); - $this->assertEquals(array_keys($data), array_keys($return), var_export($return, 1)); - } - - public function testPersistDataStoresDataInSession() - { - $this->markTestIncomplete('Zend_Form does not implement session storage at this time'); - } - - public function testCanCheckIfErrorsAreRegistered() - { - $this->assertFalse($this->form->hasErrors()); - $this->testCanValidateFullFormContainingOnlyElements(); - $this->assertTrue($this->form->hasErrors()); - } - - /** - * @group ZF-9914 - */ - public function testDeprecatedIsErrorsProxiesToHasErrors() - { - $this->testCanValidateFullFormContainingOnlyElements(); - $this->assertEquals($this->form->isErrors(), $this->form->hasErrors()); - } - - public function testCanRetrieveErrorCodesFromAllElementsAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testCanValidateFullFormContainingOnlyElements(); - $codes = $this->form->getErrors(); - $keys = array('foo', 'bar', 'baz'); - $this->assertEquals($keys, array_keys($codes)); - } - - public function testCanRetrieveErrorCodesFromSingleElementAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testCanValidateFullFormContainingOnlyElements(); - $codes = $this->form->getErrors(); - $keys = array('foo', 'bar', 'baz'); - $errors = $this->form->getErrors('foo'); - $foo = $this->form->foo; - $this->assertEquals($foo->getErrors(), $errors); - } - - public function testCanRetrieveErrorMessagesFromAllElementsAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testCanValidateFullFormContainingOnlyElements(); - $codes = $this->form->getMessages(); - $keys = array('foo', 'bar', 'baz'); - $this->assertEquals($keys, array_keys($codes)); - } - - public function testCanRetrieveErrorMessagesFromSingleElementAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testCanValidateFullFormContainingOnlyElements(); - $codes = $this->form->getMessages(); - $keys = array('foo', 'bar', 'baz'); - $messages = $this->form->getMessages('foo'); - $foo = $this->form->foo; - $this->assertEquals($foo->getMessages(), $messages); - } - - public function testErrorCodesFromSubFormReturnedInSeparateArray() - { - $this->_checkZf2794(); - - $this->testFullDataArrayUsedToValidateSubFormByDefault(); - $codes = $this->form->getErrors(); - $this->assertTrue(array_key_exists('sub', $codes)); - $this->assertTrue(is_array($codes['sub'])); - $keys = array('subfoo', 'subbar', 'subbaz'); - $this->assertEquals($keys, array_keys($codes['sub'])); - } - - public function testCanRetrieveErrorCodesFromSingleSubFormAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testFullDataArrayUsedToValidateSubFormByDefault(); - $codes = $this->form->getErrors('sub'); - $this->assertTrue(is_array($codes)); - $this->assertFalse(empty($codes)); - $keys = array('subfoo', 'subbar', 'subbaz'); - $this->assertEquals($keys, array_keys($codes)); - } - - public function testGetErrorsHonorsElementsBelongTo() - { - $this->_checkZf2794(); - - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('foo[bar]'); - $subForm->addElement('text', 'test')->test - ->setRequired(true); - - $this->form->addSubForm($subForm, 'sub'); - - $data = array('foo' => array( - 'bar' => array( - 'test' => '', - ), - )); - - $this->form->isValid($data); - $codes = $this->form->getErrors(); - $this->assertFalse(empty($codes['foo']['bar']['test'])); - } - - public function testErrorMessagesFromSubFormReturnedInSeparateArray() - { - $this->_checkZf2794(); - - $this->testFullDataArrayUsedToValidateSubFormByDefault(); - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subfoo' => '123', - 'subbar' => 'abc', - 'subbaz' => '123-abc', - ); - $this->assertFalse($this->form->isValid($data)); - - $codes = $this->form->getMessages(); - $this->assertTrue(array_key_exists('sub', $codes)); - $this->assertTrue(is_array($codes['sub'])); - $keys = array('subfoo', 'subbar', 'subbaz'); - $this->assertEquals($keys, array_keys($codes['sub'])); - } - - public function testCanRetrieveErrorMessagesFromSingleSubFormAfterFailedValidation() - { - $this->_checkZf2794(); - - $this->testFullDataArrayUsedToValidateSubFormByDefault(); - $data = array( - 'foo' => 'abcdef', - 'bar' => '123456', - 'baz' => '123abc', - 'subfoo' => '123', - 'subbar' => 'abc', - 'subbaz' => '123-abc', - ); - - $this->assertFalse($this->form->isValid($data)); - $codes = $this->form->getMessages('sub'); - $this->assertTrue(is_array($codes)); - $this->assertFalse(empty($codes)); - $keys = array('subfoo', 'subbar', 'subbaz'); - $this->assertEquals($keys, array_keys($codes), var_export($codes, 1)); - } - - public function testErrorMessagesAreLocalizedWhenTranslateAdapterPresent() - { - $this->_checkZf2794(); - - $translations = include dirname(__FILE__) . '/_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $this->form->addElements(array( - 'foo' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('NotEmpty') - ) - ), - 'bar' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('Digits') - ) - ), - )) - ->setTranslator($translate); - - $data = array( - 'foo' => '', - 'bar' => 'abc', - ); - if ($this->form->isValid($data)) { - $this->fail('Form should not validate'); - } - - $messages = $this->form->getMessages(); - $this->assertTrue(isset($messages['foo'])); - $this->assertTrue(isset($messages['bar'])); - - foreach ($messages['foo'] as $key => $message) { - if (array_key_exists($key, $translations)) { - $this->assertEquals($translations[$key], $message); - } else { - $this->fail('Translation for ' . $key . ' does not exist?'); - } - } - foreach ($messages['bar'] as $key => $message) { - if (array_key_exists($key, $translations)) { - $this->assertEquals($translations[$key], $message); - } else { - $this->fail('Translation for ' . $key . ' does not exist?'); - } - } - } - - public function testErrorMessagesFromPartialValidationAreLocalizedWhenTranslateAdapterPresent() - { - $this->_checkZf2794(); - - $translations = include dirname(__FILE__) . '/_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $this->form->addElements(array( - 'foo' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('NotEmpty') - ) - ), - 'bar' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('Digits') - ) - ), - )) - ->setTranslator($translate); - - $data = array( - 'foo' => '', - ); - if ($this->form->isValidPartial($data)) { - $this->fail('Form should not validate'); - } - - $messages = $this->form->getMessages(); - $this->assertTrue(isset($messages['foo'])); - $this->assertFalse(isset($messages['bar'])); - - foreach ($messages['foo'] as $key => $message) { - if (array_key_exists($key, $translations)) { - $this->assertEquals($translations[$key], $message); - } else { - $this->fail('Translation for ' . $key . ' does not exist?'); - } - } - } - - public function testErrorMessagesFromProcessAjaxAreLocalizedWhenTranslateAdapterPresent() - { - $this->_checkZf2794(); - - $translations = include dirname(__FILE__) . '/_files/locale/array.php'; - $translate = new Zend_Translate('array', $translations, 'en'); - $translate->setLocale('en'); - - $this->form->addElements(array( - 'foo' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('NotEmpty') - ) - ), - 'bar' => array( - 'type' => 'text', - 'options' => array( - 'required' => true, - 'validators' => array('Digits') - ) - ), - )) - ->setTranslator($translate); - - $data = array( - 'foo' => '', - ); - $return = $this->form->processAjax($data); - $messages = Zend_Json::decode($return); - $this->assertTrue(is_array($messages)); - - $this->assertTrue(isset($messages['foo'])); - $this->assertFalse(isset($messages['bar'])); - - foreach ($messages['foo'] as $key => $message) { - if (array_key_exists($key, $translations)) { - $this->assertEquals($translations[$key], $message); - } else { - $this->fail('Translation for ' . $key . ' does not exist?'); - } - } - } - - /** - * @Group ZF-9697 - */ - public function _setup9697() - { - $callback = create_function('$value, $options', - 'return (isset($options["bar"]["quo"]["foo"]) && - "foo Value" === $options["bar"]["quo"]["foo"]);'); - - $this->form->addElement('text', 'foo') - ->foo->setBelongsTo('bar[quo]'); - - $this->form->addElement('text', 'quo') - ->quo->setBelongsTo('bar[quo]') - ->addValidator('Callback', - false, - $callback); - - return array('bar' => array('quo' => array('foo' => 'foo Value', - 'quo' => 'quo Value'))); - } - - public function testIsValidKeepsContext() - { - $data = $this->_setup9697(); - $this->assertTrue($this->form->isValid($data)); - } - - public function testIsValidPartialKeepsContext() - { - $data = $this->_setup9697(); - $this->assertTrue($this->form->isValidPartial($data)); - } - - public function testGetValidValuesKeepsContext() - { - $data = $this->_setup9697(); - $this->assertSame($data, $this->form->getValidValues($data)); - } - - /** - * @group ZF-2988 - */ - public function testSettingErrorMessageShouldOverrideValidationErrorMessages() - { - $this->form->addElement('text', 'foo', array('validators' => array('Alpha'))); - $this->form->addErrorMessage('Invalid values entered'); - $this->assertFalse($this->form->isValid(array('foo' => 123))); - $messages = $this->form->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Invalid values entered', array_shift($messages)); - } - - public function testCustomErrorMessagesShouldBeManagedInAStack() - { - $this->form->addElement('text', 'foo', array('validators' => array('Alpha'))); - $this->form->addErrorMessage('Invalid values entered'); - $this->form->addErrorMessage('Really, they are not valid'); - $messages = $this->form->getErrorMessages(); - $this->assertEquals(2, count($messages)); - - $this->assertFalse($this->form->isValid(array('foo' => 123))); - $messages = $this->form->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Invalid values entered', array_shift($messages)); - $this->assertEquals('Really, they are not valid', array_shift($messages)); - } - - public function testShouldAllowSettingMultipleErrorMessagesAtOnce() - { - $set1 = array('foo', 'bar', 'baz'); - $this->form->addErrorMessages($set1); - $this->assertSame($set1, $this->form->getErrorMessages()); - } - - public function testSetErrorMessagesShouldOverwriteMessages() - { - $set1 = array('foo', 'bar', 'baz'); - $set2 = array('bat', 'cat'); - $this->form->addErrorMessages($set1); - $this->assertSame($set1, $this->form->getErrorMessages()); - $this->form->setErrorMessages($set2); - $this->assertSame($set2, $this->form->getErrorMessages()); - } - - public function testCustomErrorMessageStackShouldBeClearable() - { - $this->testCustomErrorMessagesShouldBeManagedInAStack(); - $this->form->clearErrorMessages(); - $messages = $this->form->getErrorMessages(); - $this->assertTrue(empty($messages)); - } - - public function testCustomErrorMessagesShouldBeTranslated() - { - $translations = array( - 'foo' => 'Foo message', - ); - $translate = new Zend_Translate('array', $translations); - $this->form->addElement('text', 'foo', array('validators' => array('Alpha'))); - $this->form->setTranslator($translate) - ->addErrorMessage('foo'); - $this->assertFalse($this->form->isValid(array('foo' => 123))); - $messages = $this->form->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Foo message', array_shift($messages)); - } - - public function testShouldAllowMarkingFormAsInvalid() - { - $this->form->addErrorMessage('Invalid values entered'); - $this->assertFalse($this->form->hasErrors()); - $this->form->markAsError(); - $this->assertTrue($this->form->hasErrors()); - $messages = $this->form->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Invalid values entered', array_shift($messages)); - } - - public function testShouldAllowPushingErrorsOntoErrorStackWithErrorMessages() - { - $this->assertFalse($this->form->hasErrors()); - $this->form->setErrors(array('Error 1', 'Error 2')) - ->addError('Error 3') - ->addErrors(array('Error 4', 'Error 5')); - $this->assertTrue($this->form->hasErrors()); - $messages = $this->form->getMessages(); - $this->assertEquals(5, count($messages)); - foreach (range(1, 5) as $id) { - $message = 'Error ' . $id; - $this->assertContains($message, $messages); - } - } - - /**#@-*/ - - // View object - - public function getView() - { - $view = new Zend_View(); - return $view; - } - - public function testGetViewRetrievesFromViewRendererByDefault() - { - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - $viewRenderer->initView(); - $view = $viewRenderer->view; - $test = $this->form->getView(); - $this->assertSame($view, $test); - } - - public function testGetViewReturnsNullWhenNoViewRegisteredWithViewRenderer() - { - $this->assertNull($this->form->getView()); - } - - public function testCanSetView() - { - $view = new Zend_View(); - $this->assertNull($this->form->getView()); - $this->form->setView($view); - $received = $this->form->getView(); - $this->assertSame($view, $received); - } - - // Decorators - - public function testFormDecoratorRegisteredByDefault() - { - $this->_checkZf2794(); - - $decorator = $this->form->getDecorator('form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - } - - public function testCanDisableRegisteringFormDecoratorsDuringInitialization() - { - $form = new Zend_Form(array('disableLoadDefaultDecorators' => true)); - $decorators = $form->getDecorators(); - $this->assertEquals(array(), $decorators); - } - - public function testCanAddSingleDecoratorAsString() - { - $this->_checkZf2794(); - - $this->form->clearDecorators(); - $this->assertFalse($this->form->getDecorator('viewHelper')); - - $this->form->addDecorator('viewHelper'); - $decorator = $this->form->getDecorator('viewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - } - - public function testNotCanRetrieveSingleDecoratorRegisteredAsStringUsingClassName() - { - $this->assertFalse($this->form->getDecorator('Zend_Form_Decorator_Form')); - } - - public function testCanAddSingleDecoratorAsDecoratorObject() - { - $this->form->clearDecorators(); - $this->assertFalse($this->form->getDecorator('viewHelper')); - - $decorator = new Zend_Form_Decorator_ViewHelper; - $this->form->addDecorator($decorator); - $test = $this->form->getDecorator('Zend_Form_Decorator_ViewHelper'); - $this->assertSame($decorator, $test); - } - - public function testCanRetrieveSingleDecoratorRegisteredAsDecoratorObjectUsingShortName() - { - $this->_checkZf2794(); - - $this->form->clearDecorators(); - $this->assertFalse($this->form->getDecorator('viewHelper')); - - $decorator = new Zend_Form_Decorator_ViewHelper; - $this->form->addDecorator($decorator); - $test = $this->form->getDecorator('viewHelper'); - $this->assertSame($decorator, $test); - } - - public function testCanAddMultipleDecorators() - { - $this->_checkZf2794(); - - $this->form->clearDecorators(); - $this->assertFalse($this->form->getDecorator('viewHelper')); - - $testDecorator = new Zend_Form_Decorator_Errors; - $this->form->addDecorators(array( - 'ViewHelper', - $testDecorator - )); - - $viewHelper = $this->form->getDecorator('viewHelper'); - $this->assertTrue($viewHelper instanceof Zend_Form_Decorator_ViewHelper); - $decorator = $this->form->getDecorator('errors'); - $this->assertSame($testDecorator, $decorator); - } - - public function testRemoveDecoratorReturnsFalseForUnregisteredDecorators() - { - $this->_checkZf2794(); - - $this->assertFalse($this->form->removeDecorator('foobar')); - } - - public function testCanRemoveDecorator() - { - $this->_checkZf2794(); - - $this->testFormDecoratorRegisteredByDefault(); - $this->form->removeDecorator('form'); - $this->assertFalse($this->form->getDecorator('form')); - } - - /** - * @group ZF-3069 - */ - public function testRemovingNamedDecoratorShouldWork() - { - $this->_checkZf2794(); - $this->form->setDecorators(array( - 'FormElements', - array(array('div' => 'HtmlTag'), array('tag' => 'div')), - array(array('fieldset' => 'HtmlTag'), array('tag' => 'fieldset')), - )); - $decorators = $this->form->getDecorators(); - $this->assertTrue(array_key_exists('div', $decorators)); - $this->assertTrue(array_key_exists('fieldset', $decorators)); - $this->form->removeDecorator('div'); - $decorators = $this->form->getDecorators(); - $this->assertFalse(array_key_exists('div', $decorators)); - $this->assertTrue(array_key_exists('fieldset', $decorators)); - } - - public function testCanClearAllDecorators() - { - $this->_checkZf2794(); - - $this->testCanAddMultipleDecorators(); - $this->form->clearDecorators(); - $this->assertFalse($this->form->getDecorator('viewHelper')); - $this->assertFalse($this->form->getDecorator('fieldset')); - } - - public function testCanAddDecoratorAliasesToAllowMultipleDecoratorsOfSameType() - { - $this->_checkZf2794(); - - $this->form->setDecorators(array( - array('HtmlTag', array('tag' => 'div')), - array('decorator' => array('FooBar' => 'HtmlTag'), 'options' => array('tag' => 'dd')), - )); - $decorator = $this->form->getDecorator('FooBar'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_HtmlTag); - $this->assertEquals('dd', $decorator->getOption('tag')); - - $decorator = $this->form->getDecorator('HtmlTag'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_HtmlTag); - $this->assertEquals('div', $decorator->getOption('tag')); - } - - public function testRetrievingNamedDecoratorShouldNotReorderDecorators() - { - $this->form->setDecorators(array( - 'FormElements', - array(array('div' => 'HtmlTag'), array('tag' => 'div')), - array(array('fieldset' => 'HtmlTag'), array('tag' => 'fieldset')), - 'Form', - )); - - $decorator = $this->form->getDecorator('fieldset'); - $decorators = $this->form->getDecorators(); - $i = 0; - $order = array(); - - foreach (array_keys($decorators) as $name) { - $order[$name] = $i; - ++$i; - } - $this->assertEquals(2, $order['fieldset'], var_export($order, 1)); - } - - // Rendering - - public function checkMarkup($html) - { - $this->assertFalse(empty($html)); - $this->assertContains('assertRegexp('/]+action="' . $this->form->getAction() . '"/', $html); - $this->assertRegexp('/]+method="' . $this->form->getMethod() . '"/i', $html); - $this->assertRegexp('#]+enctype="application/x-www-form-urlencoded"#', $html); - $this->assertContains('', $html); - } - - public function testRenderReturnsMarkup() - { - $this->setupElements(); - $html = $this->form->render($this->getView()); - $this->checkMarkup($html); - } - - public function testRenderReturnsMarkupRepresentingAllElements() - { - $this->testRenderReturnsMarkup(); - $html = $this->form->render(); - foreach ($this->form->getElements() as $key => $element) { - $this->assertFalse(empty($key)); - $this->assertFalse(is_numeric($key)); - $this->assertContains('assertRegexp('/setupElements(); - $this->setupSubForm(); - $this->form->setView($this->getView()); - $html = $this->form->render(); - $this->assertRegexp('/
    assertContains('
    ', $html); - foreach ($this->form->sub as $key => $item) { - $this->assertFalse(empty($key)); - $this->assertFalse(is_numeric($key)); - $this->assertContains('assertRegexp($pattern, $html, 'Pattern: ' . $pattern . "\nHTML:\n" . $html); - } - } - - public function testRenderReturnsMarkupContainingDisplayGroups() - { - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz', array('legend' => 'Display Group')); - $this->form->setView($this->getView()); - $html = $this->html = $this->form->render(); - $this->assertRegexp('/
    assertContains('
    ', $html); - $this->assertRegexp('#Display Group#', $html, $html); - $dom = new DOMDocument(); - $dom->loadHTML($html); - $fieldsets = $dom->getElementsByTagName('fieldset'); - $this->assertTrue(0 < $fieldsets->length); - $fieldset = $fieldsets->item(0); - $nodes = $fieldset->childNodes; - $this->assertNotNull($nodes); - for ($i = 0; $i < $nodes->length; ++$i) { - $node = $nodes->item($i); - if ('input' != $node->nodeName) { - continue; - } - $this->assertTrue($node->hasAttribute('name')); - $nameNode = $node->getAttributeNode('name'); - switch ($i) { - case 0: - $this->assertEquals('foo', $nameNode->nodeValue); - break; - case 1: - $this->assertEquals('baz', $nameNode->nodeValue); - break; - default: - $this->fail('There should only be two input nodes in this display group: ' . $html); - } - } - } - - public function testRenderDoesNotRepeatElementsInDisplayGroups() - { - $this->testRenderReturnsMarkupContainingDisplayGroups(); - if (!preg_match_all('#]+name="foo"#', $this->html, $matches)) { - $this->fail("Should find foo element in rendered form"); - } - $this->assertEquals(1, count($matches)); - $this->assertEquals(1, count($matches[0])); - } - - public function testElementsRenderAsArrayMembersWhenElementsBelongToAnArray() - { - $this->setupElements(); - $this->form->setElementsBelongTo('anArray'); - $html = $this->form->render($this->getView()); - $this->assertContains('name="anArray[foo]"', $html); - $this->assertContains('name="anArray[bar]"', $html); - $this->assertContains('name="anArray[baz]"', $html); - $this->assertContains('id="anArray-foo"', $html); - $this->assertContains('id="anArray-bar"', $html); - $this->assertContains('id="anArray-baz"', $html); - } - - public function testElementsRenderAsSubArrayMembersWhenElementsBelongToASubArray() - { - $this->setupElements(); - $this->form->setElementsBelongTo('data[foo]'); - $html = $this->form->render($this->getView()); - $this->assertContains('name="data[foo][foo]"', $html); - $this->assertContains('name="data[foo][bar]"', $html); - $this->assertContains('name="data[foo][baz]"', $html); - $this->assertContains('id="data-foo-foo"', $html); - $this->assertContains('id="data-foo-bar"', $html); - $this->assertContains('id="data-foo-baz"', $html); - } - - public function testElementsRenderAsArrayMembersWhenRenderAsArrayToggled() - { - $this->setupElements(); - $this->form->setName('data') - ->setIsArray(true); - $html = $this->form->render($this->getView()); - $this->assertContains('name="data[foo]"', $html); - $this->assertContains('name="data[bar]"', $html); - $this->assertContains('name="data[baz]"', $html); - $this->assertContains('id="data-foo"', $html); - $this->assertContains('id="data-bar"', $html); - $this->assertContains('id="data-baz"', $html); - } - - public function testElementsRenderAsMembersOfSubFormsWithElementsBelongTo() - { - $this->form->setName('data') - ->setIsArray(true); - $subForm = new Zend_Form_SubForm(); - $subForm->setElementsBelongTo('billing[info]'); - $subForm->addElement('text', 'name'); - $subForm->addElement('text', 'number'); - $this->form->addSubForm($subForm, 'sub'); - - $html = $this->form->render($this->getView()); - $this->assertContains('name="data[billing][info][name]', $html); - $this->assertContains('name="data[billing][info][number]', $html); - $this->assertContains('id="data-billing-info-name"', $html); - $this->assertContains('id="data-billing-info-number"', $html); - } - - public function testToStringProxiesToRender() - { - $this->setupElements(); - $this->form->setView($this->getView()); - $html = $this->form->__toString(); - $this->checkMarkup($html); - } - - public function raiseDecoratorException($content, $element, $options) - { - throw new Exception('Raising exception in decorator callback'); - } - - public function handleDecoratorErrors($errno, $errstr, $errfile = '', $errline = 0, array $errcontext = array()) - { - $this->error = $errstr; - } - - public function testToStringRaisesErrorWhenExceptionCaught() - { - $this->form->setDecorators(array( - array( - 'decorator' => 'Callback', - 'options' => array('callback' => array($this, 'raiseDecoratorException')) - ), - )); - $origErrorHandler = set_error_handler(array($this, 'handleDecoratorErrors'), E_USER_WARNING); - - $text = $this->form->__toString(); - - restore_error_handler(); - - $this->assertTrue(empty($text)); - $this->assertTrue(isset($this->error)); - $this->assertContains('Raising exception in decorator callback', $this->error); - } - - /** - * ZF-2718 - */ - public function testHiddenElementsGroupedWhenRendered() - { - $this->markTestIncomplete('Scheduling for future release'); - $this->form->addElements(array( - array('type' => 'hidden', 'name' => 'first', 'options' => array('value' => 'first value')), - array('type' => 'text', 'name' => 'testone'), - array('type' => 'hidden', 'name' => 'second', 'options' => array('value' => 'second value')), - array('type' => 'text', 'name' => 'testtwo'), - array('type' => 'hidden', 'name' => 'third', 'options' => array('value' => 'third value')), - array('type' => 'text', 'name' => 'testthree'), - )); - $html = $this->form->render($this->getView()); - if (!preg_match('#(assertRegexp('#assertNull($this->form->getTranslator()); - } - - public function testCanSetTranslator() - { - require_once 'Zend/Translate/Adapter/Array.php'; - $translator = new Zend_Translate('array', array('foo' => 'bar')); - $this->form->setTranslator($translator); - $received = $this->form->getTranslator($translator); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testCanSetDefaultGlobalTranslator() - { - $this->assertNull($this->form->getTranslator()); - $translator = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Form::setDefaultTranslator($translator); - - $received = Zend_Form::getDefaultTranslator(); - $this->assertSame($translator->getAdapter(), $received); - - $received = $this->form->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - - $form = new Zend_Form(); - $received = $form->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testLocalTranslatorPreferredOverDefaultGlobalTranslator() - { - $this->assertNull($this->form->getTranslator()); - $translatorDefault = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Form::setDefaultTranslator($translatorDefault); - - $received = $this->form->getTranslator(); - $this->assertSame($translatorDefault->getAdapter(), $received); - - $translator = new Zend_Translate('array', array('foo' => 'bar')); - $this->form->setTranslator($translator); - $received = $this->form->getTranslator(); - $this->assertNotSame($translatorDefault->getAdapter(), $received); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testTranslatorFromRegistryUsedWhenNoneRegistered() - { - $this->assertNull($this->form->getTranslator()); - $translator = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Registry::set('Zend_Translate', $translator); - - $received = Zend_Form::getDefaultTranslator(); - $this->assertSame($translator->getAdapter(), $received); - - $received = $this->form->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - - $form = new Zend_Form(); - $received = $form->getTranslator(); - $this->assertSame($translator->getAdapter(), $received); - } - - public function testCanDisableTranslation() - { - $this->testCanSetDefaultGlobalTranslator(); - $this->form->setDisableTranslator(true); - $this->assertNull($this->form->getTranslator()); - } - - // Iteration - - public function testFormObjectIsIterableAndIteratesElements() - { - $this->setupElements(); - $expected = array('foo', 'bar', 'baz'); - $received = array(); - foreach ($this->form as $key => $value) { - $received[] = $key; - } - $this->assertSame($expected, $received); - } - - public function testFormObjectIteratesElementsInExpectedOrder() - { - $this->setupElements(); - $this->form->addElement('text', 'checkorder', array('order' => 2)); - $expected = array('foo', 'bar', 'checkorder', 'baz'); - $received = array(); - foreach ($this->form as $key => $value) { - $received[] = $key; - $this->assertTrue($value instanceof Zend_Form_Element); - } - $this->assertSame($expected, $received); - } - - public function testFormObjectIteratesElementsInExpectedOrderWhenAllElementsHaveOrder() - { - $this->form->addElement('submit', 'submit')->submit->setLabel('Submit')->setOrder(30); - $this->form->addElement('text', 'name')->name->setLabel('Name')->setOrder(10); - $this->form->addElement('text', 'email')->email->setLabel('E-mail')->setOrder(20); - - $expected = array('name', 'email', 'submit'); - $received = array(); - foreach ($this->form as $key => $value) { - $received[] = $key; - $this->assertTrue($value instanceof Zend_Form_Element); - } - $this->assertSame($expected, $received); - } - - public function testFormObjectIteratesElementsInExpectedOrderWhenFirstElementHasNoOrderSpecified() - { - $this->form->addElement(new Zend_Form_Element('a',array('label'=>'a'))) - ->addElement(new Zend_Form_Element('b',array('label'=>'b', 'order' => 0))) - ->addElement(new Zend_Form_Element('c',array('label'=>'c', 'order' => 1))) - ->setView($this->getView()); - $test = $this->form->render(); - $this->assertContains('name="a"', $test); - if (!preg_match_all('/(]+>)/', $test, $matches)) { - $this->fail('Expected markup not found'); - } - $order = array(); - foreach ($matches[1] as $element) { - if (preg_match('/name="(a|b|c)"/', $element, $m)) { - $order[] = $m[1]; - } - } - $this->assertSame(array('b', 'c', 'a'), $order); - } - - public function testFormObjectIteratesElementsAndSubforms() - { - $this->setupElements(); - $this->setupSubForm(); - $expected = array('foo', 'bar', 'baz', 'sub'); - $received = array(); - foreach ($this->form as $key => $value) { - $received[] = $key; - $this->assertTrue(($value instanceof Zend_Form_Element) - or ($value instanceof Zend_Form_SubForm)); - } - $this->assertSame($expected, $received); - } - - public function testFormObjectIteratesDisplayGroupsButSkipsDisplayGroupElements() - { - $this->setupElements(); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz'); - $expected = array('bar', 'foobaz'); - $received = array(); - foreach ($this->form as $key => $value) { - $received[] = $key; - $this->assertTrue(($value instanceof Zend_Form_Element) - or ($value instanceof Zend_Form_DisplayGroup)); - } - $this->assertSame($expected, $received); - } - - public function testRemovingFormItemsShouldNotRaiseExceptionsDuringIteration() - { - $this->setupElements(); - $bar = $this->form->bar; - $this->form->removeElement('bar'); - - try { - foreach ($this->form as $item) { - } - } catch (Exception $e) { - $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); - } - - $this->form->addElement($bar); - $this->form->addDisplayGroup(array('baz', 'bar'), 'bazbar'); - $this->form->removeDisplayGroup('bazbar'); - - try { - foreach ($this->form as $item) { - } - } catch (Exception $e) { - $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); - } - - $subForm = new Zend_Form_SubForm; - $subForm->addElements(array('foo' => 'text', 'bar' => 'text')); - $this->form->addSubForm($subForm, 'page1'); - $this->form->removeSubForm('page1'); - - try { - foreach ($this->form as $item) { - } - } catch (Exception $e) { - $this->fail('Exceptions should not be raised by iterator when elements are removed; error message: ' . $e->getMessage()); - } - } - - public function testClearingAttachedItemsShouldNotCauseIterationToRaiseExceptions() - { - $form = new Zend_Form(); - $form->addElements(array( - 'username' => 'text', - 'password' => 'text', - )); - $form->clearElements(); - - try { - foreach ($form as $item) { - } - } catch (Zend_Form_Exception $e) { - $message = "Clearing elements prior to iteration should not cause iteration to fail;\n" - . $e->getMessage(); - $this->fail($message); - } - - $form->addElements(array( - 'username' => 'text', - 'password' => 'text', - )) - ->addDisplayGroup(array('username', 'password'), 'login'); - $form->clearDisplayGroups(); - - try { - foreach ($form as $item) { - } - } catch (Zend_Form_Exception $e) { - $message = "Clearing display groups prior to iteration should not cause iteration to fail;\n" - . $e->getMessage(); - $this->fail($message); - } - - $subForm = new Zend_Form_SubForm(); - $form->addSubForm($subForm, 'foo'); - $form->clearSubForms(); - - try { - foreach ($form as $item) { - } - } catch (Zend_Form_Exception $e) { - $message = "Clearing sub forms prior to iteration should not cause iteration to fail;\n" - . $e->getMessage(); - $this->fail($message); - } - } - - // Countable - - public function testCanCountFormObject() - { - $this->setupElements(); - $this->assertEquals(3, count($this->form)); - } - - public function testCountingFormObjectCountsSubForms() - { - $this->setupElements(); - $this->setupSubForm(); - $this->assertEquals(4, count($this->form)); - } - - public function testCountingFormCountsDisplayGroupsButOmitsElementsInDisplayGroups() - { - $this->testCountingFormObjectCountsSubForms(); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz'); - $this->assertEquals(3, count($this->form)); - } - - // Element decorators and plugin paths - - public function testCanSetAllElementDecoratorsAtOnce() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->form->setElementDecorators(array( - array('ViewHelper'), - array('Label'), - array('Fieldset'), - )); - foreach ($this->form->getElements() as $element) { - $this->assertFalse($element->getDecorator('Errors')); - $this->assertFalse($element->getDecorator('HtmlTag')); - $decorator = $element->getDecorator('ViewHelper'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_ViewHelper); - $decorator = $element->getDecorator('Label'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Label); - $decorator = $element->getDecorator('Fieldset'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Fieldset); - } - } - - /** - * @group ZF-3597 - */ - public function testSettingElementDecoratorsWithConcreteDecoratorShouldHonorOrder() - { - $this->form->setDecorators(array( - 'FormElements', - array('HtmlTag', array('tag' => 'table')), - 'Form', - )); - $this->form->addElementPrefixPath('My_Decorator', dirname(__FILE__) . '/_files/decorators/', 'decorator'); - $this->form->addElement('text', 'test', array( - 'label' => 'Foo', - 'description' => 'sample description', - )); - - require_once dirname(__FILE__) . '/_files/decorators/TableRow.php'; - $decorator = new My_Decorator_TableRow(); - $this->form->setElementDecorators(array( - 'ViewHelper', - $decorator, - )); - $html = $this->form->render($this->getView()); - $this->assertRegexp('#Foo.*?]+>.*?sample description#s', $html, $html); - } - - /** - * @group ZF-3228 - */ - public function testShouldAllowSpecifyingSpecificElementsToDecorate() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->form->setElementDecorators( - array( - 'Description', - 'Form', - 'Fieldset', - ), - array( - 'bar', - ) - ); - - $element = $this->form->bar; - $this->assertFalse($element->getDecorator('ViewHelper')); - $this->assertFalse($element->getDecorator('Errors')); - $this->assertFalse($element->getDecorator('Label')); - $this->assertFalse($element->getDecorator('HtmlTag')); - $decorator = $element->getDecorator('Description'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Description); - $decorator = $element->getDecorator('Form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $decorator = $element->getDecorator('Fieldset'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Fieldset); - - foreach (array('foo', 'baz') as $name) { - $element = $this->form->$name; - $this->assertFalse($element->getDecorator('Form')); - $this->assertFalse($element->getDecorator('Fieldset')); - } - } - - public function testShouldAllowSpecifyingListOfElementsNotToDecorate() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->form->setElementDecorators( - array( - 'Description', - 'Form', - 'Fieldset', - ), - array( - 'foo', - 'baz', - ), - false - ); - - $element = $this->form->bar; - $this->assertFalse($element->getDecorator('ViewHelper')); - $this->assertFalse($element->getDecorator('Errors')); - $this->assertFalse($element->getDecorator('Label')); - $this->assertFalse($element->getDecorator('HtmlTag')); - $decorator = $element->getDecorator('Description'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Description); - $decorator = $element->getDecorator('Form'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Form); - $decorator = $element->getDecorator('Fieldset'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Fieldset); - - foreach (array('foo', 'baz') as $name) { - $element = $this->form->$name; - $this->assertFalse($element->getDecorator('Form')); - $this->assertFalse($element->getDecorator('Fieldset')); - } - } - /**#@-*/ - - public function testCanSetAllElementFiltersAtOnce() - { - $this->_checkZf2794(); - - $this->setupElements(); - $this->form->setElementFilters(array( - 'Alnum', - 'StringToLower' - )); - foreach ($this->form->getElements() as $element) { - $filter = $element->getFilter('Alnum'); - $this->assertTrue($filter instanceof Zend_Filter_Alnum); - $filter = $element->getFilter('StringToLower'); - $this->assertTrue($filter instanceof Zend_Filter_StringToLower); - } - } - - public function testCanSetGlobalElementPrefixPath() - { - $this->setupElements(); - $this->form->addElementPrefixPath('Zend_Foo', 'Zend/Foo/'); - $this->form->addElement('text', 'prefixTest'); - foreach ($this->form->getElements() as $element) { - $loader = $element->getPluginLoader('validate'); - $paths = $loader->getPaths('Zend_Foo_Validate'); - $this->assertFalse(empty($paths), $element->getName() . ':' . var_export($loader->getPaths(), 1)); - $this->assertContains('Foo', $paths[0]); - $this->assertContains('Validate', $paths[0]); - - $paths = $element->getPluginLoader('filter')->getPaths('Zend_Foo_Filter'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertContains('Filter', $paths[0]); - - $paths = $element->getPluginLoader('decorator')->getPaths('Zend_Foo_Decorator'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertContains('Decorator', $paths[0]); - } - } - - public function testCustomGlobalElementPrefixPathUsedInNewlyCreatedElements() - { - $this->_checkZf2794(); - - $this->form->addElementPrefixPath('My_Decorator', dirname(__FILE__) . '/_files/decorators', 'decorator'); - $this->form->addElement('text', 'prefixTest'); - $element = $this->form->prefixTest; - $label = $element->getDecorator('Label'); - $this->assertTrue($label instanceof My_Decorator_Label, get_class($label)); - } - - /** - * @group ZF-3093 - */ - public function testSettingElementPrefixPathPropagatesToAttachedSubForms() - { - $subForm = new Zend_Form_SubForm(); - $subForm->addElement('text', 'foo'); - $this->form->addSubForm($subForm, 'subForm'); - $this->form->addElementPrefixPath('Zend_Foo', 'Zend/Foo/'); - $loader = $this->form->subForm->foo->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo_Decorator'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertContains('Decorator', $paths[0]); - } - - public function testCanSetElementValidatorPrefixPath() - { - $this->setupElements(); - $this->form->addElementPrefixPath('Zend_Foo', 'Zend/Foo/', 'validate'); - $this->form->addElement('text', 'prefixTest'); - foreach ($this->form->getElements() as $element) { - $loader = $element->getPluginLoader('validate'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertNotContains('Validate', $paths[0]); - } - } - - public function testCanSetElementFilterPrefixPath() - { - $this->setupElements(); - $this->form->addElementPrefixPath('Zend_Foo', 'Zend/Foo/', 'filter'); - $this->form->addElement('text', 'prefixTest'); - foreach ($this->form->getElements() as $element) { - $loader = $element->getPluginLoader('filter'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertNotContains('Filter', $paths[0]); - } - } - - public function testCanSetElementDecoratorPrefixPath() - { - $this->setupElements(); - $this->form->addElementPrefixPath('Zend_Foo', 'Zend/Foo/', 'decorator'); - $this->form->addElement('text', 'prefixTest'); - foreach ($this->form->getElements() as $element) { - $loader = $element->getPluginLoader('decorator'); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - $this->assertNotContains('Decorator', $paths[0]); - } - } - - // Display Group decorators and plugin paths - - public function setupDisplayGroups() - { - $this->testCanAddAndRetrieveMultipleElements(); - $this->form->addElements(array( - 'test1' => 'text', - 'test2' => 'text', - 'test3' => 'text', - 'test4' => 'text' - )); - $this->form->addDisplayGroup(array('bar', 'bat'), 'barbat'); - $this->form->addDisplayGroup(array('foo', 'baz'), 'foobaz'); - } - - public function testCanSetAllDisplayGroupDecoratorsAtOnce() - { - $this->_checkZf2794(); - - $this->setupDisplayGroups(); - $this->form->setDisplayGroupDecorators(array( - array('Callback', array('callback' => 'strip_tags')), - )); - foreach ($this->form->getDisplayGroups() as $element) { - $this->assertFalse($element->getDecorator('FormElements')); - $this->assertFalse($element->getDecorator('HtmlTag')); - $this->assertFalse($element->getDecorator('Fieldset')); - $this->assertFalse($element->getDecorator('DtDdWrapper')); - - $decorator = $element->getDecorator('Callback'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Callback); - } - } - - public function testCanSetDisplayGroupPrefixPath() - { - $this->setupDisplayGroups(); - $this->form->addDisplayGroupPrefixPath('Zend_Foo', 'Zend/Foo/'); - $this->form->addDisplayGroup(array('test1', 'test2'), 'testgroup'); - foreach ($this->form->getDisplayGroups() as $group) { - $loader = $group->getPluginLoader(); - $paths = $loader->getPaths('Zend_Foo'); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - } - - /** - * @group ZF-3213 - */ - public function testShouldAllowSettingDisplayGroupPrefixPathViaConfigOptions() - { - require_once 'Zend/Config/Ini.php'; - $config = new Zend_Config_Ini(dirname(__FILE__) . '/_files/config/zf3213.ini', 'form'); - $form = new Zend_Form($config); - $dg = $form->foofoo; - $paths = $dg->getPluginLoader()->getPaths('My_Decorator'); - $this->assertTrue($paths !== false); - } - - // Subform decorators - - public function testCanSetAllSubFormDecoratorsAtOnce() - { - $this->_checkZf2794(); - - $this->setupSubForm(); - $this->form->setSubFormDecorators(array( - array('Callback', array('callback' => 'strip_tags')), - )); - foreach ($this->form->getSubForms() as $subForm) { - $this->assertFalse($subForm->getDecorator('FormElements')); - $this->assertFalse($subForm->getDecorator('HtmlTag')); - $this->assertFalse($subForm->getDecorator('Fieldset')); - $this->assertFalse($subForm->getDecorator('DtDdWrapper')); - - $decorator = $subForm->getDecorator('Callback'); - $this->assertTrue($decorator instanceof Zend_Form_Decorator_Callback); - } - } - - // Extension - - public function testInitCalledPriorToLoadingDefaultDecorators() - { - $form = new Zend_Form_FormTest_FormExtension(); - $decorators = $form->getDecorators(); - $this->assertTrue(empty($decorators)); - } - - // Clone - - /** - * @group ZF-3819 - */ - public function testCloningShouldCloneAllChildren() - { - $form = new Zend_Form(); - $foo = new Zend_Form_SubForm(array( - 'name' => 'foo', - 'elements' => array( - 'one' => 'text', - 'two' => 'text', - ), - )); - $form->addElement('text', 'bar') - ->addElement('text', 'baz') - ->addElement('text', 'bat') - ->addDisplayGroup(array('bar', 'bat'), 'barbat') - ->addSubForm($foo, 'foo'); - $bar = $form->bar; - $baz = $form->baz; - $bat = $form->bat; - $barbat = $form->barbat; - - $cloned = clone $form; - $this->assertNotSame($foo, $cloned->foo); - $this->assertNotSame($bar, $cloned->bar); - $this->assertNotSame($baz, $cloned->baz); - $this->assertNotSame($bat, $cloned->bat); - $this->assertNotSame($barbat, $cloned->getDisplayGroup('barbat')); - $this->assertNotSame($foo->one, $cloned->foo->one); - $this->assertNotSame($foo->two, $cloned->foo->two); - } - - // Reset - - /** - * @group ZF-3227 - */ - public function testFormsShouldAllowResetting() - { - $form = new Zend_Form(); - $foo = new Zend_Form_SubForm(array( - 'name' => 'foo', - 'elements' => array( - 'one' => 'text', - 'two' => 'text', - ), - )); - $form->addElement('text', 'bar') - ->addElement('text', 'baz') - ->addElement('text', 'bat') - ->addDisplayGroup(array('bar', 'bat'), 'barbat') - ->addSubForm($foo, 'foo'); - $values = array( - 'bar' => 'Bar Value', - 'baz' => 'Baz Value', - 'bat' => 'Bat Value', - 'foo' => array( - 'one' => 'One Value', - 'two' => 'Two Value', - ), - ); - $form->populate($values); - $test = $form->getValues(); - $this->assertEquals($values, $test); - $form->reset(); - $test = $form->getValues(); - $this->assertNotEquals($values, $test); - $this->assertEquals(0, array_sum($test)); - } - - /** - * @group ZF-3217 - */ - public function testFormShouldOverloadToRenderDecorators() - { - $this->setupElements(); - $this->form->setView($this->getView()); - $html = $this->form->renderFormElements(); - foreach ($this->form->getElements() as $element) { - $this->assertContains('id="' . $element->getFullyQualifiedName() . '"', $html, 'Received: ' . $html); - } - $this->assertNotContains('assertNotContains('form->renderForm('this is the content'); - $this->assertContains('assertContains('', $html); - $this->assertContains('this is the content', $html); - } - - /** - * @group ZF-3217 - * @expectedException Zend_Form_Exception - */ - public function testOverloadingToInvalidMethodsShouldThrowAnException() - { - $html = $this->form->bogusMethodCall(); - } - - /** - * @group ZF-2950 - */ - public function testDtDdElementsWithLabelGetUniqueId() - { - $form = new Zend_Form(); - $form->setView($this->getView()); - - $fooElement = new Zend_Form_Element_Text('foo'); - $fooElement->setLabel('Foo'); - - $form->addElement($fooElement); - - $html = $form->render(); - - $this->assertContains('
    ', $html); - $this->assertContains('
    ', $html); - } - - /** - * @group ZF-2950 - */ - public function testDtDdElementsWithoutLabelGetUniqueId() - { - $form = new Zend_Form(); - $form->setView($this->getView()) - ->addElement(new Zend_Form_Element_Text('foo')); - - $html = $form->render(); - - $this->assertContains('
     
    ', $html); - $this->assertContains('
    ', $html); - } - - /** - * @group ZF-2950 - */ - public function testSubFormGetsUniqueIdWithName() - { - $form = new Zend_Form(); - $form->setView($this->getView()) - ->setName('testform') - ->addSubForm(new Zend_Form_SubForm(), 'testform'); - - $html = $form->render(); - - $this->assertContains('
     
    ', $html); - $this->assertContains('
    ', $html); - } - - /** - * @group ZF-5370 - */ - public function testEnctypeDefaultsToMultipartWhenFileElementIsAttachedToForm() - { - $file = new Zend_Form_Element_File('txt'); - $this->form->addElement($file); - - $html = $this->form->render($this->getView()); - $this->assertFalse(empty($html)); - $this->assertRegexp('#]+enctype="multipart/form-data"#', $html); - } - - /** - * @group ZF-5370 - */ - public function testEnctypeDefaultsToMultipartWhenFileElementIsAttachedToSubForm() - { - $subForm = new Zend_Form_SubForm(); - $subForm->addElement('file', 'txt'); - $this->form->addSubForm($subForm, 'page1') - ->setView(new Zend_View); - $html = $this->form->render(); - - $this->assertContains('id="txt"', $html); - $this->assertContains('name="txt"', $html); - $this->assertRegexp('#]+enctype="multipart/form-data"#', $html, $html); - } - - /** - * @group ZF-5370 - */ - public function testEnctypeDefaultsToMultipartWhenFileElementIsAttachedToDisplayGroup() - { - $this->form->addElement('file', 'txt') - ->addDisplayGroup(array('txt'), 'txtdisplay') - ->setView(new Zend_View); - $html = $this->form->render(); - - $this->assertContains('id="txt"', $html); - $this->assertContains('name="txt"', $html); - $this->assertRegexp('#]+enctype="multipart/form-data"#', $html, $html); - } - - /** - * @group ZF-6070 - */ - public function testIndividualElementDecoratorsShouldOverrideGlobalElementDecorators() - { - $this->form->setOptions(array( - 'elementDecorators' => array( - 'ViewHelper', - 'Label', - ), - 'elements' => array( - 'foo' => array( - 'type' => 'text', - 'options' => array( - 'decorators' => array( - 'Errors', - 'ViewHelper', - ), - ), - ), - ), - )); - $element = $this->form->getElement('foo'); - $expected = array('Zend_Form_Decorator_Errors', 'Zend_Form_Decorator_ViewHelper'); - $actual = array(); - foreach ($element->getDecorators() as $decorator) { - $actual[] = get_class($decorator); - } - $this->assertSame($expected, $actual); - } - - /** - * @group ZF-5150 - */ - public function testIsValidShouldFailIfAddErrorHasBeenCalled() - { - $this->form->addError('Error'); - $this->assertFalse($this->form->isValid(array())); - } - - /** - * @group ZF-8494 - */ - public function testGetValidValues() - { - $data = array('valid' => 1234, 'invalid' => 'invalid', 'noElement' => 'noElement'); - - require_once "Zend/Validate/Int.php"; - - $validElement = new Zend_Form_Element("valid"); - $validElement->addValidator(new Zend_Validate_Int()); - $this->form->addElement($validElement); - - $invalidElement = new Zend_Form_Element('invalid'); - $invalidElement->addValidator(new Zend_Validate_Int()); - $this->form->addElement($invalidElement); - - $this->assertEquals(array('valid' => 1234), $this->form->getValidValues($data)); - } - - /** - * @group ZF-8494 - */ - public function testGetValidSubFormValues() - { - $data = array('sub' => array('valid' => 1234, 'invalid' => 'invalid', 'noElement' => 'noElement')); - - require_once "Zend/Validate/Int.php"; - - $subForm = new Zend_Form_SubForm(); - $validElement = new Zend_Form_Element("valid"); - $validElement->addValidator(new Zend_Validate_Int()); - $subForm->addElement($validElement); - - $invalidElement = new Zend_Form_Element('invalid'); - $invalidElement->addValidator(new Zend_Validate_Int()); - $subForm->addElement($invalidElement); - - $this->form->addSubForm($subForm, 'sub'); - - $this->assertEquals(array('sub' => array('valid' => 1234)), $this->form->getValidValues($data)); - } - - /** - * @group ZF-9275 - */ - public function testElementTranslatorNotOverriddenbyGlobalTranslatorDuringValidation() - { - $translator = new Zend_Translate('array', array('foo' => 'bar')); - Zend_Registry::set('Zend_Translate', $translator); - - $this->form->addElement('text', 'foo'); - $this->form->isValid(array()); - - $received = $this->form->foo->hasTranslator(); - $this->assertSame(false, $received); - } - - /** - * @group ZF-9275 - */ - public function testZendValidateDefaultTranslatorOverridesZendTranslateDefaultTranslator() - { - $translate = new Zend_Translate('array', array('isEmpty' => 'translate')); - Zend_Registry::set('Zend_Translate', $translate); - - $translateValidate = new Zend_Translate('array', array('isEmpty' => 'validate')); - Zend_Validate_Abstract::setDefaultTranslator($translateValidate); - - $this->form->addElement('text', 'foo', array('required'=>1)); - $this->form->isValid(array()); - - $this->assertSame(array('isEmpty' => 'validate'), $this->form->foo->getMessages()); - } - - /** - * @group ZF-9494 - */ - public function testElementTranslatorNotOveriddenbyFormTranslator() - { - $translations = array( - 'isEmpty' => 'Element message', - ); - $translate = new Zend_Translate('array', $translations); - $this->form->addElement('text', 'foo', array('required'=>true, 'translator'=>$translate)); - $this->assertFalse($this->form->isValid(array('foo'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - - $this->assertFalse($this->form->isValidPartial(array('foo'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - } - - /** - * @group ZF-9364 - */ - public function testElementTranslatorPreferredOverFormTranslator() - { - $formTanslations = array( - 'isEmpty' => 'Form message', - ); - $elementTanslations = array( - 'isEmpty' => 'Element message', - ); - $formTranslate = new Zend_Translate('array', $formTanslations); - $elementTranslate = new Zend_Translate('array', $elementTanslations); - $this->form->setTranslator($formTranslate); - $this->form->addElement('text', 'foo', array('required'=>true, 'translator'=>$elementTranslate)); - $this->form->addElement('text', 'bar', array('required'=>true)); - - $this->assertFalse($this->form->isValid(array('foo'=>'', 'bar'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - $this->assertEquals('Form message', $messages['bar']['isEmpty']); - - $this->assertFalse($this->form->isValidPartial(array('foo'=>'', 'bar'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - $this->assertEquals('Form message', $messages['bar']['isEmpty']); - } - - /** - * @group ZF-9364 - */ - public function testElementTranslatorPreferredOverDefaultTranslator() - { - $defaultTranslations = array( - 'isEmpty' => 'Default message', - ); - $formTranslations = array( - 'isEmpty' => 'Form message', - ); - $elementTranslations = array( - 'isEmpty' => 'Element message', - ); - $defaultTranslate = new Zend_Translate('array', $defaultTranslations); - $formTranslate = new Zend_Translate('array', $formTranslations); - $elementTranslate = new Zend_Translate('array', $elementTranslations); - - Zend_Registry::set('Zend_Translate', $defaultTranslate); - $this->form->setTranslator($formTranslate); - $this->form->addElement('text', 'foo', array('required'=>true, 'translator'=>$elementTranslate)); - $this->form->addElement('text', 'bar', array('required'=>true)); - - $this->assertFalse($this->form->isValid(array('foo'=>'', 'bar'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - $this->assertEquals('Form message', $messages['bar']['isEmpty']); - - $this->assertFalse($this->form->isValidPartial(array('foo'=>'', 'bar'=>''))); - $messages = $this->form->getMessages(); - $this->assertEquals(2, count($messages)); - $this->assertEquals('Element message', $messages['foo']['isEmpty']); - $this->assertEquals('Form message', $messages['bar']['isEmpty']); - } - - /** - * @group ZF-9540 - */ - public function testSubFormTranslatorPreferredOverDefaultTranslator() - { - $defaultTranslations = array('isEmpty' => 'Default message'); - $subformTranslations = array('isEmpty' => 'SubForm message'); - - $defaultTranslate = new Zend_Translate('array', $defaultTranslations); - $subformTranslate = new Zend_Translate('array', $subformTranslations); - - Zend_Registry::set('Zend_Translate', $defaultTranslate); - $this->form->addSubForm(new Zend_Form_SubForm(), 'subform'); - $this->form->subform->setTranslator($subformTranslate); - $this->form->subform->addElement('text', 'foo', array('required'=>true)); - - $this->assertFalse($this->form->isValid(array('subform' => array('foo'=>'')))); - $messages = $this->form->getMessages(); - $this->assertEquals('SubForm message', $messages['subform']['foo']['isEmpty']); - - $this->assertFalse($this->form->isValidPartial(array('subform' => array('foo'=>'')))); - $messages = $this->form->getMessages(); - $this->assertEquals('SubForm message', $messages['subform']['foo']['isEmpty']); - } - - /** - * @group ZF-12375 - */ - public function testElementTranslatorNotOveriddenbyFormTranslatorDuringRendering() - { - // Set translator for form - $this->form->setTranslator( - new Zend_Translate( - 'array', - array( - 'labelText' => 'Foo', - ) - ) - ); - - // Add element with his own translator - $this->form->addElement( - 'text', - 'foo', - array( - 'label' => 'labelText', - 'translator' => new Zend_Translate( - 'array', - array( - 'labelText' => 'Bar', - ) - ), - 'decorators' => array( - 'Label', - ), - ) - ); - - $this->form->setDecorators(array('FormElements')); - - // Test - $this->assertSame( - PHP_EOL . '' . PHP_EOL, - $this->form->render(new Zend_View()) - ); - } - - public function testNameAttributeOutputForXhtml() - { - // Create form - $form = new Zend_Form(); - $form->setName('foo'); - $form->setMethod(Zend_Form::METHOD_GET); - $form->removeDecorator('HtmlTag'); - - // Set doctype - $this->getView()->getHelper('doctype')->doctype( - Zend_View_Helper_Doctype::XHTML1_STRICT - ); - - $expected = '
    ' - . PHP_EOL - . '
    '; - - $this->assertSame( - $expected, - $form->render($this->getView()) - ); - } - - /** - * @group ZF-5613 - */ - public function testAddSubFormsPerConfig() - { - // Create form - $form = new Zend_Form( - array( - 'subForms' => array( - array( - 'form' => array( - 'elements' => array( - 'foo' => array( - 'text', - array( - 'label' => 'Foo', - 'decorators' => array( - 'ViewHelper', - 'Label', - ), - ), - ), - ), - 'id' => 'subform1', - 'decorators' => array( - 'FormElements', - ), - ), - 'name' => 'subform1', - 'order' => 2, - ), - array( - 'form' => array( - 'elements' => array( - 'bar' => array( - 'text', - array( - 'label' => 'Bar', - 'decorators' => array( - 'ViewHelper', - 'Label', - ), - ), - ), - ), - 'id' => 'subform2', - 'decorators' => array( - 'FormElements', - ), - ), - 'name' => 'subform2', - 'order' => 1, - ), - ), - ) - ); - $form->removeDecorator('HtmlTag'); - - // Tests - $subForms = $form->getSubForms(); - $subForm1 = current($subForms); - $subForm2 = next($subForms); - - $this->assertSame( - array( - 'subform1', - 'subform2', - ), - array( - $subForm1->getName(), - $subForm2->getName(), - ) - ); - - $expected = '
    ' - . PHP_EOL - . PHP_EOL - . '' - . PHP_EOL - . PHP_EOL - . '' - . PHP_EOL - . PHP_EOL - . '' - . PHP_EOL - . PHP_EOL - . '' - . '
    '; - - $this->assertSame($expected, $form->render($this->getView())); - } - - /** - * Used by test methods susceptible to ZF-2794, marks a test as incomplete - * - * @link http://framework.zend.com/issues/browse/ZF-2794 - * @return void - */ - protected function _checkZf2794() - { - if (strtolower(substr(PHP_OS, 0, 3)) == 'win' && version_compare(PHP_VERSION, '5.1.4', '=')) { - $this->markTestIncomplete('Error occurs for PHP 5.1.4 on Windows'); - } - } - - /** - * Prove the fluent interface on Zend_Form::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->form, $this->form->loadDefaultDecorators()); - } - - /** - * @group ZF-7552 - */ - public function testAddDecoratorsKeepsNonNumericKeyNames() - { - $this->form->addDecorators(array(array(array('td' => 'HtmlTag'), - array('tag' => 'td')), - array(array('tr' => 'HtmlTag'), - array('tag' => 'tr')), - array('HtmlTag', array('tag' => 'baz')))); - $t1 = $this->form->getDecorators(); - $this->form->setDecorators($t1); - $t2 = $this->form->getDecorators(); - $this->assertEquals($t1, $t2); - } - - /** - * @group ZF-10411 - */ - public function testAddingElementToDisplayGroupManuallyShouldPreventRenderingByForm() - { - $form = new Zend_Form_FormTest_AddToDisplayGroup(); - $html = $form->render($this->getView()); - $this->assertEquals(1, substr_count($html, 'Customer Type'), $html); - } - - /** - * @group ZF-10491 - * @group ZF-10734 - * @group ZF-10731 - */ - public function testAddElementToDisplayGroupByElementInstance() - { - $element = new Zend_Form_Element_Text('foo'); - $elementTwo = new Zend_Form_Element_Text('baz-----'); - - $this->form->addElements(array($element, $elementTwo)); - $this->form->addDisplayGroup(array($element, $elementTwo), 'bar'); - - $displayGroup = $this->form->getDisplayGroup('bar'); - $this->assertNotNull($displayGroup->getElement('foo')); - $this->assertNotNull($displayGroup->getElement('baz')); - - // clear display groups and elements - $this->form->clearDisplayGroups() - ->clearElements(); - - $this->form->addDisplayGroup(array($element, $elementTwo), 'bar'); - $displayGroup = $this->form->getDisplayGroup('bar'); - $this->assertNotNull($displayGroup->getElement('foo')); - $this->assertNotNull($displayGroup->getElement('baz')); - } - - /** - * @group ZF-10149 - */ - public function testIfViewIsSetInTime() - { - try { - $form = new Zend_Form(array('view' => new MyTestView())); - $this->assertTrue($form->getView() instanceof MyTestView); - - $form = new Zend_Form(array('view' => new StdClass())); - $this->assertNull($form->getView()); - - $result = $form->render(); - } - catch (Zend_Form_Exception $e) { - $this->fail('Setting a view object using the options array should not throw an exception'); - } - $this->assertNotEquals($result,''); - } - - /** - * @group ZF-11088 - */ - public function testAddErrorOnElementMakesFormInvalidAndReturnsCustomError() - { - $element = new Zend_Form_Element_Text('foo'); - $errorString = 'This element made a booboo'; - $element->addError($errorString); - $errorMessages = $element->getErrorMessages(); - $this->assertSame(1, count($errorMessages)); - $this->assertSame($errorString, $errorMessages[0]); - - $element2 = new Zend_Form_Element_Text('bar'); - $this->form->addElement($element2); - $this->form->getElement('bar')->addError($errorString); - $errorMessages2 = $this->form->getElement('bar')->getErrorMessages(); - $this->assertSame(1, count($errorMessages2)); - $this->assertSame($errorString, $errorMessages2[0]); - } - - /** - * @group ZF-10865 - * @expectedException Zend_Form_Exception - */ - public function testExceptionThrownWhenAddElementsIsGivenNullValue() - { - $form = new Zend_Form(); - $form->addElement(null); - } - - /** - * @group ZF-11729 - */ - public function testDashSeparatedElementsInDisplayGroupsShouldNotRenderOutsideDisplayGroup() - { - $form = new Zend_Form(); - $form->addElement('text', 'random-element-name', array( - 'label' => 'This is weird', - 'value' => 'think its a bug', - )); - $form->addDisplayGroup(array('random-element-name'), 'foobar', array( - 'legend' => 'foobar', - )); - $html = $form->render($this->getView()); - $count = substr_count($html, 'randomelementname-element'); - $this->assertEquals(1, $count, $html); - } - - /** - * @group ZF-11831 - */ - public function testElementsOfSubFormReceiveCorrectDefaultTranslator() - { - // Global default translator - $trDefault = new Zend_Translate(array( - 'adapter' => 'array', - 'content' => array( - Zend_Validate_NotEmpty::IS_EMPTY => 'Default' - ), - 'locale' => 'en' - )); - Zend_Registry::set('Zend_Translate', $trDefault); - - // Translator to use for elements - $trElement = new Zend_Translate(array( - 'adapter' => 'array', - 'content' => array( - Zend_Validate_NotEmpty::IS_EMPTY =>'Element' - ), - 'locale' => 'en' - )); - Zend_Validate_Abstract::setDefaultTranslator($trElement); - - // Change the form's translator - $form = new Zend_Form(); - $form->addElement(new Zend_Form_Element_Text('foo', array( - 'required' => true, - 'validators' => array('NotEmpty') - ))); - - // Create a subform with it's own validator - $sf1 = new Zend_Form_SubForm(); - $sf1->addElement(new Zend_Form_Element_Text('foosub', array( - 'required' => true, - 'validators' => array('NotEmpty') - ))); - $form->addSubForm($sf1, 'Test1'); - - $form->isValid(array()); - - $messages = $form->getMessages(); - $this->assertEquals( - 'Element', - @$messages['foo'][Zend_Validate_NotEmpty::IS_EMPTY], - 'Form element received wrong validator' - ); - $this->assertEquals( - 'Element', - @$messages['Test1']['foosub'][Zend_Validate_NotEmpty::IS_EMPTY], - 'SubForm element received wrong validator' - ); - } - - /** - * @group ZF-12173 - */ - public function testAddingPrefixPathsWithBackslashWillLoadNamespacedPlugins() - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->markTestSkipped(__CLASS__ . '::' . __METHOD__ . ' requires PHP 5.3.0 or greater'); - return; - } - $form = new Zend_Form(); - $form->addPrefixPath('Zf\Foo', 'Zf/Foo'); - foreach (array('element', 'decorator') as $type) { - $loader = $form->getPluginLoader($type); - $paths = $loader->getPaths('Zf\Foo\\' . ucfirst($type)); - $this->assertTrue(is_array($paths), "Failed for type $type: " . var_export($paths, 1)); - $this->assertFalse(empty($paths)); - $this->assertContains('Foo', $paths[0]); - } - } - - /** - * @group ZF-8942 - */ - public function testCreateElementIncludesElementDecorators() - { - // Init form - $form = new Zend_Form(); - $form->setElementDecorators( - array( - new Zend_Form_Decorator_ViewHelper(), - new Zend_Form_Decorator_Label(), - ) - ); - $element = $form->createElement('text', 'foo'); - - // Test - $expected = array( - 'Zend_Form_Decorator_ViewHelper', - 'Zend_Form_Decorator_Label', - ); - - $actual = array(); - foreach ($element->getDecorators() as $decorator) { - $actual[] = get_class($decorator); - } - - $this->assertEquals($expected, $actual); - } - - /** - * @group ZF-12387 - */ - public function testAddElementAsObjectWithDecoratorsShouldNotLoseDecorators() - { - // Init form - $form = new Zend_Form(); - $form->setElementDecorators( - array( - new Zend_Form_Decorator_ViewHelper(), - new Zend_Form_Decorator_Label(), - ) - ); - - $element = new Zend_Form_Element_Text('foo'); - $element->setDecorators(array('Errors', 'Description')); - $form->addElement($element); - - // Test - $expected = array( - 'Zend_Form_Decorator_Errors', - 'Zend_Form_Decorator_Description', - ); - - $actual = array(); - foreach ($form->getElement('foo')->getDecorators() as $decorator) { - $actual[] = get_class($decorator); - } - - $this->assertEquals($expected, $actual); - } - - /** - * @group ZF-12387 - */ - public function testAddElementAsObjectGetsElementDecoratorsIfNoneIsExplicitlySet() - { - // Init form - $form = new Zend_Form(); - $form->setElementDecorators( - array( - new Zend_Form_Decorator_ViewHelper(), - new Zend_Form_Decorator_Label(), - ) - ); - - // Add element - $element = new Zend_Form_Element_Text( - 'foo', - array('disableLoadDefaultDecorators' => true) - ); - $form->addElement($element); - - // Test - $expected = array( - 'Zend_Form_Decorator_ViewHelper', - 'Zend_Form_Decorator_Label', - ); - - $actual = array(); - foreach ($form->getElement('foo')->getDecorators() as $decorator) { - $actual[] = get_class($decorator); - } - - $this->assertEquals($expected, $actual); - } - - /** - * @group GH-319 - */ - public function testHasErrorsMethodShouldCheckAlsoElements() - { - // Init form - $form = new Zend_Form(); - $element = new Zend_Form_Element_Text('foo'); - $form->addElement($element); - - $element->markAsError(); - - // Test form - $this->assertTrue($form->hasErrors()); - $this->assertFalse($form->isValid(array('foo' => 1))); - - // Test element - $this->assertTrue($element->hasErrors()); - $this->assertFalse($element->isValid(1)); - } - - /** - * @group GH-319 - */ - public function testHasErrorsMethodShouldCheckAlsoSubForms() - { - // Init form - $form = new Zend_Form(); - $subForm = new Zend_Form_SubForm(); - $element = new Zend_Form_Element_Text('foo'); - $subForm->addElement($element); - $form->addSubForm($subForm, 'subForm'); - - $element->markAsError(); - - // Test form - $this->assertTrue($form->hasErrors()); - $this->assertFalse($form->isValid(array('foo' => 1))); - - // Test element - $this->assertTrue($element->hasErrors()); - $this->assertFalse($element->isValid(1)); - } -} - -class Zend_Form_FormTest_DisplayGroup extends Zend_Form_DisplayGroup -{ -} - -class Zend_Form_FormTest_FormExtension extends Zend_Form -{ - public function init() - { - $this->setDisableLoadDefaultDecorators(true); - } -} - -class Zend_Form_FormTest_WithDisplayGroup extends Zend_Form -{ - public function init() - { - $this->addElement('text', 'el1', array( - 'label' => 'Title', - 'required' => true, - )); - $this->addDisplayGroup(array('el1'), 'group1', array( - 'legend' => 'legend 1', - )); - } -} - -class Zend_Form_FormTest_AddToDisplayGroup extends Zend_Form_FormTest_WithDisplayGroup -{ - public function init() - { - parent::init(); - $element = new Zend_Form_Element_Text('el2', array( - 'label' => 'Customer Type', - )); - - $this->addElement($element); - $this->group1->addElement($element); - } -} - -class MyTestView extends Zend_View -{ - -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Form_FormTest::main') { - Zend_Form_FormTest::main(); -} diff --git a/tests/Zend/Form/SubFormTest.php b/tests/Zend/Form/SubFormTest.php deleted file mode 100644 index f7b1287821..0000000000 --- a/tests/Zend/Form/SubFormTest.php +++ /dev/null @@ -1,172 +0,0 @@ -form = new Zend_Form_SubForm(); - } - - public function tearDown() - { - } - - // General - public function testSubFormUtilizesDefaultDecorators() - { - $decorators = $this->form->getDecorators(); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_FormElements', $decorators)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_HtmlTag', $decorators)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_Fieldset', $decorators)); - $this->assertTrue(array_key_exists('Zend_Form_Decorator_DtDdWrapper', $decorators)); - - $htmlTag = $decorators['Zend_Form_Decorator_HtmlTag']; - $tag = $htmlTag->getOption('tag'); - $this->assertEquals('dl', $tag); - } - - public function testSubFormIsArrayByDefault() - { - $this->assertTrue($this->form->isArray()); - } - - public function testElementsBelongToSubFormNameByDefault() - { - $this->testSubFormIsArrayByDefault(); - $this->form->setName('foo'); - $this->assertEquals($this->form->getName(), $this->form->getElementsBelongTo()); - } - - // Extensions - - public function testInitCalledBeforeLoadDecorators() - { - $form = new Zend_Form_SubFormTest_SubForm(); - $decorators = $form->getDecorators(); - $this->assertTrue(empty($decorators)); - } - - // Bugfixes - - /** - * @group ZF-2883 - */ - public function testDisplayGroupsShouldInheritSubFormNamespace() - { - $this->form->addElement('text', 'foo') - ->addElement('text', 'bar') - ->addDisplayGroup(array('foo', 'bar'), 'foobar'); - - $form = new Zend_Form(); - $form->addSubForm($this->form, 'attributes'); - $html = $form->render(new Zend_View()); - - $this->assertContains('name="attributes[foo]"', $html); - $this->assertContains('name="attributes[bar]"', $html); - } - - /** - * @group ZF-3272 - */ - public function testRenderedSubFormDtShouldContainNoBreakSpace() - { - $subForm = new Zend_Form_SubForm(array( - 'elements' => array( - 'foo' => 'text', - 'bar' => 'text', - ), - )); - $form = new Zend_Form(); - $form->addSubForm($subForm, 'foobar') - ->setView(new Zend_View); - $html = $form->render(); - $this->assertContains('> ', $html ); - } - - /** - * Prove the fluent interface on Zend_Form_Subform::loadDefaultDecorators - * - * @link http://framework.zend.com/issues/browse/ZF-9913 - * @return void - */ - public function testFluentInterfaceOnLoadDefaultDecorators() - { - $this->assertSame($this->form, $this->form->loadDefaultDecorators()); - } - /** - * @see ZF-11504 - */ - public function testSubFormWithNumericName() - { - $subForm = new Zend_Form_SubForm(array( - 'elements' => array( - 'foo' => 'text', - 'bar' => 'text', - ), - )); - $form = new Zend_Form(); - $form->addSubForm($subForm, 0); - $form->addSubForm($subForm, 234); - $form2 = clone $form; - $this->assertEquals($form2->getSubForm(234)->getName(),234); - $this->assertEquals($form2->getSubForm(0)->getName(),0); - } -} - -class Zend_Form_SubFormTest_SubForm extends Zend_Form_SubForm -{ - public function init() - { - $this->setDisableLoadDefaultDecorators(true); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Form_SubFormTest::main') { - Zend_Form_SubFormTest::main(); -} diff --git a/tests/Zend/Form/_files/config/multiOptions.ini b/tests/Zend/Form/_files/config/multiOptions.ini deleted file mode 100644 index 3459d39498..0000000000 --- a/tests/Zend/Form/_files/config/multiOptions.ini +++ /dev/null @@ -1,7 +0,0 @@ -[testing] -options.first.key = "aa" -options.first.value = 1 -options.second.value = "xxxx" -options.second.key = 2 -options.third.key = "ssss" -options.third.value = 444 diff --git a/tests/Zend/Form/_files/config/multiOptions.xml b/tests/Zend/Form/_files/config/multiOptions.xml deleted file mode 100644 index c0f87740aa..0000000000 --- a/tests/Zend/Form/_files/config/multiOptions.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - aa - 1 - - - xxxx - 2 - - - ssss - 444 - - - - diff --git a/tests/Zend/Form/_files/config/zf3213.ini b/tests/Zend/Form/_files/config/zf3213.ini deleted file mode 100644 index 052f008d9e..0000000000 --- a/tests/Zend/Form/_files/config/zf3213.ini +++ /dev/null @@ -1,7 +0,0 @@ -[form] -displayGroupPrefixPath.myname.prefix = "My_Decorator" -displayGroupPrefixPath.myname.path = "My/Decorator/" -elements.foo.type = "text" -elements.foo.name = "foo" -displayGroups.foofoo.elements[] = "foo" -displayGroups.foofoo.name= "foofoo" diff --git a/tests/Zend/Form/_files/config/zf3250.xml b/tests/Zend/Form/_files/config/zf3250.xml deleted file mode 100644 index 49fd06e97c..0000000000 --- a/tests/Zend/Form/_files/config/zf3250.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - ElementName1 - ElementName2 - - - login - - Form 1 - - - - - - text - ElementName1 - - - - - - text - ElementName2 - - - - - - text - ElementName3 - - - - - - text - ElementName4 - - - - - - Form 1 - post - - - diff --git a/tests/Zend/Form/_files/decorators/Label.php b/tests/Zend/Form/_files/decorators/Label.php deleted file mode 100644 index fcaec2237c..0000000000 --- a/tests/Zend/Form/_files/decorators/Label.php +++ /dev/null @@ -1,51 +0,0 @@ -getElement(); - return "{$e->getLabel()}{$content}{$e->getDescription()}"; - } - -} diff --git a/tests/Zend/Form/_files/locale/array.php b/tests/Zend/Form/_files/locale/array.php deleted file mode 100644 index 3231ed06e6..0000000000 --- a/tests/Zend/Form/_files/locale/array.php +++ /dev/null @@ -1,34 +0,0 @@ - 'Translating the notDigits string', - 'digitsStringEmpty' => 'Translating the stringEmpty string', - 'stringEmpty' => 'Translating the stringEmpty string', - 'isEmpty' => 'Translating the isEmpty string', - - 'submit' => 'Submit Button', - 'foovalue' => 'Foo Value', - 'barvalue' => 'Bar Value', - 'Foo' => 'Foo Translation', - 'Bar' => 'Bar Translation', -); diff --git a/tests/Zend/Form/_files/views/contentWrappingDecorator.phtml b/tests/Zend/Form/_files/views/contentWrappingDecorator.phtml deleted file mode 100644 index d83a25c226..0000000000 --- a/tests/Zend/Form/_files/views/contentWrappingDecorator.phtml +++ /dev/null @@ -1,3 +0,0 @@ -This text prefixes the content -content ?> -This text appends the content diff --git a/tests/Zend/Form/_files/views/decorator.phtml b/tests/Zend/Form/_files/views/decorator.phtml deleted file mode 100644 index d2acecd802..0000000000 --- a/tests/Zend/Form/_files/views/decorator.phtml +++ /dev/null @@ -1,8 +0,0 @@ -This is content from the view script - -getVars() as $key => $value): - if ($key == 'decorator') { - continue; - } - echo $key, ': ', $value, "\n"; -endforeach; ?> diff --git a/tests/Zend/Form/_files/views/decoratorCausesReplacement.phtml b/tests/Zend/Form/_files/views/decoratorCausesReplacement.phtml deleted file mode 100644 index af0fe68920..0000000000 --- a/tests/Zend/Form/_files/views/decoratorCausesReplacement.phtml +++ /dev/null @@ -1,4 +0,0 @@ -This text prefixes the content -content ?> -This text appends the content -decorator->setOption('placement', false) ?> diff --git a/tests/Zend/Form/_files/views/replacingDecorator.phtml b/tests/Zend/Form/_files/views/replacingDecorator.phtml deleted file mode 100644 index f6b3fba8be..0000000000 --- a/tests/Zend/Form/_files/views/replacingDecorator.phtml +++ /dev/null @@ -1 +0,0 @@ -This is content from the view script diff --git a/tests/Zend/Form/_files/views/withouthelperinattribs.phtml b/tests/Zend/Form/_files/views/withouthelperinattribs.phtml deleted file mode 100644 index 8d46713fbe..0000000000 --- a/tests/Zend/Form/_files/views/withouthelperinattribs.phtml +++ /dev/null @@ -1,7 +0,0 @@ -{$this->element->helper}( - $this->element->getName(), - null, - $this->element->getAttribs() -); \ No newline at end of file From 93a03d5570b6db73a7f7571c3afb857020151634 Mon Sep 17 00:00:00 2001 From: Joan He Date: Thu, 5 Apr 2018 12:37:09 -0500 Subject: [PATCH 08/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Layout --- library/Zend/Layout.php | 798 ------------------ .../Controller/Action/Helper/Layout.php | 186 ---- .../Zend/Layout/Controller/Plugin/Layout.php | 156 ---- library/Zend/Layout/Exception.php | 35 - tests/Zend/Layout/AllTests.php | 62 -- tests/Zend/Layout/FunctionalTest.php | 93 -- tests/Zend/Layout/HelperTest.php | 158 ---- tests/Zend/Layout/LayoutTest.php | 582 ------------- tests/Zend/Layout/PluginTest.php | 246 ------ .../Zend/Layout/_files/MinimalCustomView.php | 55 -- ...endLayoutFunctionalTestErrorController.php | 37 - ...ZendLayoutFunctionalTestTestController.php | 42 - .../functional-test-app/layouts/layout.phtml | 3 - .../error.phtml | 1 - .../index.phtml | 1 - .../layouts-basepath/helpers/FooBar.php | 38 - .../layouts-basepath/scripts/layout.phtml | 1 - .../layouts-basepath/scripts/layout2.phtml | 1 - tests/Zend/Layout/_files/layouts/layout.phtml | 3 - tests/Zend/Layout/_files/layouts/plugin.phtml | 3 - .../Layout/_files/layouts/test/layout.php | 26 - 21 files changed, 2527 deletions(-) delete mode 100644 library/Zend/Layout.php delete mode 100644 library/Zend/Layout/Controller/Action/Helper/Layout.php delete mode 100644 library/Zend/Layout/Controller/Plugin/Layout.php delete mode 100644 library/Zend/Layout/Exception.php delete mode 100644 tests/Zend/Layout/AllTests.php delete mode 100644 tests/Zend/Layout/FunctionalTest.php delete mode 100644 tests/Zend/Layout/HelperTest.php delete mode 100644 tests/Zend/Layout/LayoutTest.php delete mode 100644 tests/Zend/Layout/PluginTest.php delete mode 100644 tests/Zend/Layout/_files/MinimalCustomView.php delete mode 100644 tests/Zend/Layout/_files/functional-test-app/controllers/ZendLayoutFunctionalTestErrorController.php delete mode 100644 tests/Zend/Layout/_files/functional-test-app/controllers/ZendLayoutFunctionalTestTestController.php delete mode 100644 tests/Zend/Layout/_files/functional-test-app/layouts/layout.phtml delete mode 100644 tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-error/error.phtml delete mode 100644 tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-test/index.phtml delete mode 100644 tests/Zend/Layout/_files/layouts-basepath/helpers/FooBar.php delete mode 100644 tests/Zend/Layout/_files/layouts-basepath/scripts/layout.phtml delete mode 100644 tests/Zend/Layout/_files/layouts-basepath/scripts/layout2.phtml delete mode 100644 tests/Zend/Layout/_files/layouts/layout.phtml delete mode 100644 tests/Zend/Layout/_files/layouts/plugin.phtml delete mode 100644 tests/Zend/Layout/_files/layouts/test/layout.php diff --git a/library/Zend/Layout.php b/library/Zend/Layout.php deleted file mode 100644 index 5e8f04e9d5..0000000000 --- a/library/Zend/Layout.php +++ /dev/null @@ -1,798 +0,0 @@ -setLayoutPath($options); - } elseif (is_array($options)) { - $this->setOptions($options); - } elseif ($options instanceof Zend_Config) { - $this->setConfig($options); - } else { - #require_once 'Zend/Layout/Exception.php'; - throw new Zend_Layout_Exception('Invalid option provided to constructor'); - } - } - - $this->_initVarContainer(); - - if ($initMvc) { - $this->_setMvcEnabled(true); - $this->_initMvc(); - } else { - $this->_setMvcEnabled(false); - } - } - - /** - * Static method for initialization with MVC support - * - * @param string|array|Zend_Config $options - * @return Zend_Layout - */ - public static function startMvc($options = null) - { - if (null === self::$_mvcInstance) { - self::$_mvcInstance = new self($options, true); - } else { - if (is_string($options)) { - self::$_mvcInstance->setLayoutPath($options); - } elseif (is_array($options) || $options instanceof Zend_Config) { - self::$_mvcInstance->setOptions($options); - } - } - - return self::$_mvcInstance; - } - - /** - * Retrieve MVC instance of Zend_Layout object - * - * @return Zend_Layout|null - */ - public static function getMvcInstance() - { - return self::$_mvcInstance; - } - - /** - * Reset MVC instance - * - * Unregisters plugins and helpers, and destroys MVC layout instance. - * - * @return void - */ - public static function resetMvcInstance() - { - if (null !== self::$_mvcInstance) { - $layout = self::$_mvcInstance; - $pluginClass = $layout->getPluginClass(); - $front = Zend_Controller_Front::getInstance(); - if ($front->hasPlugin($pluginClass)) { - $front->unregisterPlugin($pluginClass); - } - - if (Zend_Controller_Action_HelperBroker::hasHelper('layout')) { - Zend_Controller_Action_HelperBroker::removeHelper('layout'); - } - - unset($layout); - self::$_mvcInstance = null; - } - } - - /** - * Set options en masse - * - * @param array|Zend_Config $options - * @return void - */ - public function setOptions($options) - { - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } elseif (!is_array($options)) { - #require_once 'Zend/Layout/Exception.php'; - throw new Zend_Layout_Exception('setOptions() expects either an array or a Zend_Config object'); - } - - foreach ($options as $key => $value) { - $method = 'set' . ucfirst($key); - if (method_exists($this, $method)) { - $this->$method($value); - } - } - } - - /** - * Initialize MVC integration - * - * @return void - */ - protected function _initMvc() - { - $this->_initPlugin(); - $this->_initHelper(); - } - - /** - * Initialize front controller plugin - * - * @return void - */ - protected function _initPlugin() - { - $pluginClass = $this->getPluginClass(); - #require_once 'Zend/Controller/Front.php'; - $front = Zend_Controller_Front::getInstance(); - if (!$front->hasPlugin($pluginClass)) { - if (!class_exists($pluginClass)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($pluginClass); - } - $front->registerPlugin( - // register to run last | BUT before the ErrorHandler (if its available) - new $pluginClass($this), - 99 - ); - } - } - - /** - * Initialize action helper - * - * @return void - */ - protected function _initHelper() - { - $helperClass = $this->getHelperClass(); - #require_once 'Zend/Controller/Action/HelperBroker.php'; - if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) { - if (!class_exists($helperClass)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($helperClass); - } - Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this)); - } - } - - /** - * Set options from a config object - * - * @param Zend_Config $config - * @return Zend_Layout - */ - public function setConfig(Zend_Config $config) - { - $this->setOptions($config->toArray()); - return $this; - } - - /** - * Initialize placeholder container for layout vars - * - * @return Zend_View_Helper_Placeholder_Container - */ - protected function _initVarContainer() - { - if (null === $this->_container) { - #require_once 'Zend/View/Helper/Placeholder/Registry.php'; - $this->_container = Zend_View_Helper_Placeholder_Registry::getRegistry()->getContainer(__CLASS__); - } - - return $this->_container; - } - - /** - * Set layout script to use - * - * Note: enables layout by default, can be disabled - * - * @param string $name - * @param boolean $enabled - * @return Zend_Layout - */ - public function setLayout($name, $enabled = true) - { - $this->_layout = (string) $name; - if ($enabled) { - $this->enableLayout(); - } - return $this; - } - - /** - * Get current layout script - * - * @return string - */ - public function getLayout() - { - return $this->_layout; - } - - /** - * Disable layout - * - * @return Zend_Layout - */ - public function disableLayout() - { - $this->_enabled = false; - return $this; - } - - /** - * Enable layout - * - * @return Zend_Layout - */ - public function enableLayout() - { - $this->_enabled = true; - return $this; - } - - /** - * Is layout enabled? - * - * @return bool - */ - public function isEnabled() - { - return $this->_enabled; - } - - - public function setViewBasePath($path, $prefix = 'Layout_View') - { - $this->_viewBasePath = $path; - $this->_viewBasePrefix = $prefix; - return $this; - } - - public function getViewBasePath() - { - return $this->_viewBasePath; - } - - public function setViewScriptPath($path) - { - $this->_viewScriptPath = $path; - return $this; - } - - public function getViewScriptPath() - { - return $this->_viewScriptPath; - } - - /** - * Set layout script path - * - * @param string $path - * @return Zend_Layout - */ - public function setLayoutPath($path) - { - return $this->setViewScriptPath($path); - } - - /** - * Get current layout script path - * - * @return string - */ - public function getLayoutPath() - { - return $this->getViewScriptPath(); - } - - /** - * Set content key - * - * Key in namespace container denoting default content - * - * @param string $contentKey - * @return Zend_Layout - */ - public function setContentKey($contentKey) - { - $this->_contentKey = (string) $contentKey; - return $this; - } - - /** - * Retrieve content key - * - * @return string - */ - public function getContentKey() - { - return $this->_contentKey; - } - - /** - * Set MVC enabled flag - * - * @param bool $mvcEnabled - * @return Zend_Layout - */ - protected function _setMvcEnabled($mvcEnabled) - { - $this->_mvcEnabled = ($mvcEnabled) ? true : false; - return $this; - } - - /** - * Retrieve MVC enabled flag - * - * @return bool - */ - public function getMvcEnabled() - { - return $this->_mvcEnabled; - } - - /** - * Set MVC Successful Action Only flag - * - * @param bool $successfulActionOnly - * @return Zend_Layout - */ - public function setMvcSuccessfulActionOnly($successfulActionOnly) - { - $this->_mvcSuccessfulActionOnly = ($successfulActionOnly) ? true : false; - return $this; - } - - /** - * Get MVC Successful Action Only Flag - * - * @return bool - */ - public function getMvcSuccessfulActionOnly() - { - return $this->_mvcSuccessfulActionOnly; - } - - /** - * Set view object - * - * @param Zend_View_Interface $view - * @return Zend_Layout - */ - public function setView(Zend_View_Interface $view) - { - $this->_view = $view; - return $this; - } - - /** - * Retrieve helper class - * - * @return string - */ - public function getHelperClass() - { - return $this->_helperClass; - } - - /** - * Set helper class - * - * @param string $helperClass - * @return Zend_Layout - */ - public function setHelperClass($helperClass) - { - $this->_helperClass = (string) $helperClass; - return $this; - } - - /** - * Retrieve plugin class - * - * @return string - */ - public function getPluginClass() - { - return $this->_pluginClass; - } - - /** - * Set plugin class - * - * @param string $pluginClass - * @return Zend_Layout - */ - public function setPluginClass($pluginClass) - { - $this->_pluginClass = (string) $pluginClass; - return $this; - } - - /** - * Get current view object - * - * If no view object currently set, retrieves it from the ViewRenderer. - * - * @todo Set inflector from view renderer at same time - * @return Zend_View_Interface - */ - public function getView() - { - if (null === $this->_view) { - #require_once 'Zend/Controller/Action/HelperBroker.php'; - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - if (null === $viewRenderer->view) { - $viewRenderer->initView(); - } - $this->setView($viewRenderer->view); - } - return $this->_view; - } - - /** - * Set layout view script suffix - * - * @param string $viewSuffix - * @return Zend_Layout - */ - public function setViewSuffix($viewSuffix) - { - $this->_viewSuffix = (string) $viewSuffix; - return $this; - } - - /** - * Retrieve layout view script suffix - * - * @return string - */ - public function getViewSuffix() - { - return $this->_viewSuffix; - } - - /** - * Retrieve inflector target - * - * @return string - */ - public function getInflectorTarget() - { - return $this->_inflectorTarget; - } - - /** - * Set inflector target - * - * @param string $inflectorTarget - * @return Zend_Layout - */ - public function setInflectorTarget($inflectorTarget) - { - $this->_inflectorTarget = (string) $inflectorTarget; - return $this; - } - - /** - * Set inflector to use when resolving layout names - * - * @param Zend_Filter_Inflector $inflector - * @return Zend_Layout - */ - public function setInflector(Zend_Filter_Inflector $inflector) - { - $this->_inflector = $inflector; - return $this; - } - - /** - * Retrieve inflector - * - * @return Zend_Filter_Inflector - */ - public function getInflector() - { - if (null === $this->_inflector) { - #require_once 'Zend/Filter/Inflector.php'; - $inflector = new Zend_Filter_Inflector(); - $inflector->setTargetReference($this->_inflectorTarget) - ->addRules(array(':script' => array('Word_CamelCaseToDash', 'StringToLower'))) - ->setStaticRuleReference('suffix', $this->_viewSuffix); - $this->setInflector($inflector); - } - - return $this->_inflector; - } - - /** - * Enable inflector - * - * @return Zend_Layout - */ - public function enableInflector() - { - $this->_inflectorEnabled = true; - return $this; - } - - /** - * Disable inflector - * - * @return Zend_Layout - */ - public function disableInflector() - { - $this->_inflectorEnabled = false; - return $this; - } - - /** - * Return status of inflector enabled flag - * - * @return bool - */ - public function inflectorEnabled() - { - return $this->_inflectorEnabled; - } - - /** - * Set layout variable - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $this->_container[$key] = $value; - } - - /** - * Get layout variable - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - if (isset($this->_container[$key])) { - return $this->_container[$key]; - } - - return null; - } - - /** - * Is a layout variable set? - * - * @param string $key - * @return bool - */ - public function __isset($key) - { - return (isset($this->_container[$key])); - } - - /** - * Unset a layout variable? - * - * @param string $key - * @return void - */ - public function __unset($key) - { - if (isset($this->_container[$key])) { - unset($this->_container[$key]); - } - } - - /** - * Assign one or more layout variables - * - * @param mixed $spec Assoc array or string key; if assoc array, sets each - * key as a layout variable - * @param mixed $value Value if $spec is a key - * @return Zend_Layout - * @throws Zend_Layout_Exception if non-array/string value passed to $spec - */ - public function assign($spec, $value = null) - { - if (is_array($spec)) { - $orig = $this->_container->getArrayCopy(); - $merged = array_merge($orig, $spec); - $this->_container->exchangeArray($merged); - return $this; - } - - if (is_string($spec)) { - $this->_container[$spec] = $value; - return $this; - } - - #require_once 'Zend/Layout/Exception.php'; - throw new Zend_Layout_Exception('Invalid values passed to assign()'); - } - - /** - * Render layout - * - * Sets internal script path as last path on script path stack, assigns - * layout variables to view, determines layout name using inflector, and - * renders layout view script. - * - * $name will be passed to the inflector as the key 'script'. - * - * @param mixed $name - * @return mixed - */ - public function render($name = null) - { - if (null === $name) { - $name = $this->getLayout(); - } - - if ($this->inflectorEnabled() && (null !== ($inflector = $this->getInflector()))) - { - $name = $this->_inflector->filter(array('script' => $name)); - } - - $view = $this->getView(); - - if (null !== ($path = $this->getViewScriptPath())) { - if (method_exists($view, 'addScriptPath')) { - $view->addScriptPath($path); - } else { - $view->setScriptPath($path); - } - } elseif (null !== ($path = $this->getViewBasePath())) { - $view->addBasePath($path, $this->_viewBasePrefix); - } - - return $view->render($name); - } -} diff --git a/library/Zend/Layout/Controller/Action/Helper/Layout.php b/library/Zend/Layout/Controller/Action/Helper/Layout.php deleted file mode 100644 index d9d11fc330..0000000000 --- a/library/Zend/Layout/Controller/Action/Helper/Layout.php +++ /dev/null @@ -1,186 +0,0 @@ -setLayoutInstance($layout); - } else { - /** - * @see Zend_Layout - */ - #require_once 'Zend/Layout.php'; - $layout = Zend_Layout::getMvcInstance(); - } - - if (null !== $layout) { - $pluginClass = $layout->getPluginClass(); - $front = $this->getFrontController(); - if ($front->hasPlugin($pluginClass)) { - $plugin = $front->getPlugin($pluginClass); - $plugin->setLayoutActionHelper($this); - } - } - } - - public function init() - { - $this->_isActionControllerSuccessful = false; - } - - /** - * Get front controller instance - * - * @return Zend_Controller_Front - */ - public function getFrontController() - { - if (null === $this->_frontController) { - /** - * @see Zend_Controller_Front - */ - #require_once 'Zend/Controller/Front.php'; - $this->_frontController = Zend_Controller_Front::getInstance(); - } - - return $this->_frontController; - } - - /** - * Get layout object - * - * @return Zend_Layout - */ - public function getLayoutInstance() - { - if (null === $this->_layout) { - /** - * @see Zend_Layout - */ - #require_once 'Zend/Layout.php'; - if (null === ($this->_layout = Zend_Layout::getMvcInstance())) { - $this->_layout = new Zend_Layout(); - } - } - - return $this->_layout; - } - - /** - * Set layout object - * - * @param Zend_Layout $layout - * @return Zend_Layout_Controller_Action_Helper_Layout - */ - public function setLayoutInstance(Zend_Layout $layout) - { - $this->_layout = $layout; - return $this; - } - - /** - * Mark Action Controller (according to this plugin) as Running successfully - * - * @return Zend_Layout_Controller_Action_Helper_Layout - */ - public function postDispatch() - { - $this->_isActionControllerSuccessful = true; - return $this; - } - - /** - * Did the previous action successfully complete? - * - * @return bool - */ - public function isActionControllerSuccessful() - { - return $this->_isActionControllerSuccessful; - } - - /** - * Strategy pattern; call object as method - * - * Returns layout object - * - * @return Zend_Layout - */ - public function direct() - { - return $this->getLayoutInstance(); - } - - /** - * Proxy method calls to layout object - * - * @param string $method - * @param array $args - * @return mixed - */ - public function __call($method, $args) - { - $layout = $this->getLayoutInstance(); - if (method_exists($layout, $method)) { - return call_user_func_array(array($layout, $method), $args); - } - - #require_once 'Zend/Layout/Exception.php'; - throw new Zend_Layout_Exception(sprintf("Invalid method '%s' called on layout action helper", $method)); - } -} diff --git a/library/Zend/Layout/Controller/Plugin/Layout.php b/library/Zend/Layout/Controller/Plugin/Layout.php deleted file mode 100644 index 08490d9105..0000000000 --- a/library/Zend/Layout/Controller/Plugin/Layout.php +++ /dev/null @@ -1,156 +0,0 @@ -setLayout($layout); - } - } - - /** - * Retrieve layout object - * - * @return Zend_Layout - */ - public function getLayout() - { - return $this->_layout; - } - - /** - * Set layout object - * - * @param Zend_Layout $layout - * @return Zend_Layout_Controller_Plugin_Layout - */ - public function setLayout(Zend_Layout $layout) - { - $this->_layout = $layout; - return $this; - } - - /** - * Set layout action helper - * - * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper - * @return Zend_Layout_Controller_Plugin_Layout - */ - public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper) - { - $this->_layoutActionHelper = $layoutActionHelper; - return $this; - } - - /** - * Retrieve layout action helper - * - * @return Zend_Layout_Controller_Action_Helper_Layout - */ - public function getLayoutActionHelper() - { - return $this->_layoutActionHelper; - } - - /** - * postDispatch() plugin hook -- render layout - * - * @param Zend_Controller_Request_Abstract $request - * @return void - */ - public function postDispatch(Zend_Controller_Request_Abstract $request) - { - $layout = $this->getLayout(); - $helper = $this->getLayoutActionHelper(); - - // Return early if forward detected - if (!$request->isDispatched() - || $this->getResponse()->isRedirect() - || ($layout->getMvcSuccessfulActionOnly() - && (!empty($helper) && !$helper->isActionControllerSuccessful()))) - { - return; - } - - // Return early if layout has been disabled - if (!$layout->isEnabled()) { - return; - } - - $response = $this->getResponse(); - $content = $response->getBody(true); - $contentKey = $layout->getContentKey(); - - if (isset($content['default'])) { - $content[$contentKey] = $content['default']; - } - if ('default' != $contentKey) { - unset($content['default']); - } - - $layout->assign($content); - - $fullContent = null; - $obStartLevel = ob_get_level(); - try { - $fullContent = $layout->render(); - $response->setBody($fullContent); - } catch (Exception $e) { - while (ob_get_level() > $obStartLevel) { - $fullContent .= ob_get_clean(); - } - $request->setParam('layoutFullContent', $fullContent); - $request->setParam('layoutContent', $layout->content); - $response->setBody(null); - throw $e; - } - - } -} diff --git a/library/Zend/Layout/Exception.php b/library/Zend/Layout/Exception.php deleted file mode 100644 index 4f0b6eb0f4..0000000000 --- a/library/Zend/Layout/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ -addTestSuite('Zend_Layout_LayoutTest'); - $suite->addTestSuite('Zend_Layout_HelperTest'); - $suite->addTestSuite('Zend_Layout_PluginTest'); - $suite->addTestSuite('Zend_Layout_FunctionalTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Layout_AllTests::main') { - Zend_Layout_AllTests::main(); -} diff --git a/tests/Zend/Layout/FunctionalTest.php b/tests/Zend/Layout/FunctionalTest.php deleted file mode 100644 index e96007a45d..0000000000 --- a/tests/Zend/Layout/FunctionalTest.php +++ /dev/null @@ -1,93 +0,0 @@ -bootstrap = array($this, 'appBootstrap'); - parent::setUp(); - } - - public function appBootstrap() - { - $this->frontController->setControllerDirectory(dirname(__FILE__) . '/_files/functional-test-app/controllers/'); - - // create an instance of the ErrorHandler so we can make sure it will point to our specially named ErrorController - $plugin = new Zend_Controller_Plugin_ErrorHandler(); - $plugin->setErrorHandlerController('zend-layout-functional-test-error') - ->setErrorHandlerAction('error'); - $this->frontController->registerPlugin($plugin, 100); - - Zend_Layout::startMvc(dirname(__FILE__) . '/_files/functional-test-app/layouts/'); - } - - public function testMissingViewScriptDoesNotDoubleRender() - { - // go to the test controller for this funcitonal test - $this->dispatch('/zend-layout-functional-test-test/missing-view-script'); - $this->assertEquals(trim($this->response->getBody()), "[DEFAULT_LAYOUT_START]\n(ErrorController::errorAction output)[DEFAULT_LAYOUT_END]"); - } - - public function testMissingViewScriptDoesDoubleRender() - { - Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-91, new Zend_Controller_Action_Helper_ViewRenderer()); - // go to the test controller for this funcitonal test - $this->dispatch('/zend-layout-functional-test-test/missing-view-script'); - $this->assertEquals(trim($this->response->getBody()), "[DEFAULT_LAYOUT_START]\n[DEFAULT_LAYOUT_START]\n[DEFAULT_LAYOUT_END]\n(ErrorController::errorAction output)[DEFAULT_LAYOUT_END]"); - } - -} - -// Call Zend_Layout_FunctionalTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Layout_FunctionalTest::main") { - Zend_Layout_FunctionalTest::main(); -} diff --git a/tests/Zend/Layout/HelperTest.php b/tests/Zend/Layout/HelperTest.php deleted file mode 100644 index 4b9a51ee2c..0000000000 --- a/tests/Zend/Layout/HelperTest.php +++ /dev/null @@ -1,158 +0,0 @@ -resetInstance(); - if (Zend_Controller_Action_HelperBroker::hasHelper('Layout')) { - Zend_Controller_Action_HelperBroker::removeHelper('Layout'); - } - if (Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) { - Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer'); - } - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - } - - public function testConstructorWithLayoutObject() - { - $layout = new Zend_Layout(); - $helper = new Zend_Layout_Controller_Action_Helper_Layout($layout); - $this->assertSame($layout, $helper->getLayoutInstance()); - } - - public function testGetLayoutCreatesLayoutObjectWhenNoPluginRegistered() - { - $helper = new Zend_Layout_Controller_Action_Helper_Layout(); - $layout = $helper->getLayoutInstance(); - $this->assertTrue($layout instanceof Zend_Layout); - } - - public function testGetLayoutInstancePullsMvcLayoutInstance() - { - $layout = Zend_Layout::startMvc(); - $helper = new Zend_Layout_Controller_Action_Helper_Layout(); - $this->assertSame($layout, $helper->getLayoutInstance()); - } - - public function testSetLayoutInstanceReplacesExistingLayoutObject() - { - $layout = Zend_Layout::startMvc(); - $helper = new Zend_Layout_Controller_Action_Helper_Layout(); - $this->assertSame($layout, $helper->getLayoutInstance()); - - $newLayout = new Zend_Layout(); - $this->assertNotSame($layout, $newLayout); - - $helper->setLayoutInstance($newLayout); - $this->assertSame($newLayout, $helper->getLayoutInstance()); - } - - public function testDirectFetchesLayoutObject() - { - $layout = Zend_Layout::startMvc(); - $helper = new Zend_Layout_Controller_Action_Helper_Layout(); - - $received = $helper->direct(); - $this->assertSame($layout, $received); - } - - public function testHelperProxiesToLayoutObjectMethods() - { - $layout = Zend_Layout::startMvc(); - $helper = new Zend_Layout_Controller_Action_Helper_Layout(); - - $helper->setOptions(array( - 'layout' => 'foo.phtml', - 'layoutPath' => dirname(__FILE__) . '/_files/layouts', - 'contentKey' => 'foo' - )); - $this->assertEquals('foo.phtml', $helper->getLayout()); - $this->assertEquals(dirname(__FILE__) . '/_files/layouts', $helper->getLayoutPath()); - $this->assertEquals('foo', $helper->getContentKey()); - } -} - -/** - * Zend_Layout extension to allow resetting MVC instance - */ -class Zend_Layout_HelperTest_Layout extends Zend_Layout -{ - public static function resetMvcInstance() - { - self::$_mvcInstance = null; - } -} - -// Call Zend_Layout_HelperTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Layout_HelperTest::main") { - Zend_Layout_HelperTest::main(); -} diff --git a/tests/Zend/Layout/LayoutTest.php b/tests/Zend/Layout/LayoutTest.php deleted file mode 100644 index e8bf056ac6..0000000000 --- a/tests/Zend/Layout/LayoutTest.php +++ /dev/null @@ -1,582 +0,0 @@ -resetInstance(); - if (Zend_Controller_Action_HelperBroker::hasHelper('Layout')) { - Zend_Controller_Action_HelperBroker::removeHelper('Layout'); - } - if (Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) { - Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer'); - } - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - Zend_Layout::resetMvcInstance(); - } - - public function testDefaultLayoutStatusAtInitialization() - { - $layout = new Zend_Layout(); - $this->assertEquals('layout', $layout->getLayout()); - $this->assertEquals('content', $layout->getContentKey()); - $this->assertTrue($layout->isEnabled()); - $this->assertTrue($layout->inflectorEnabled()); - $this->assertNull($layout->getLayoutPath()); - $this->assertFalse($layout->getMvcEnabled()); - } - - public function testDefaultLayoutStatusAtInitializationWhenInitMvcFlagPassed() - { - $layout = new Zend_Layout(null, true); - $this->assertEquals('layout', $layout->getLayout()); - $this->assertEquals('content', $layout->getContentKey()); - $this->assertTrue($layout->isEnabled()); - $this->assertTrue($layout->inflectorEnabled()); - $this->assertNull($layout->getLayoutPath()); - $this->assertTrue($layout->getMvcEnabled()); - } - - /** - * @return void - */ - public function testSetConfigModifiesAttributes() - { - $layout = new Zend_Layout(); - - require_once 'Zend/Config.php'; - $config = new Zend_Config(array( - 'layout' => 'foo', - 'contentKey' => 'foo', - 'layoutPath' => dirname(__FILE__), - 'mvcEnabled' => false, - )); - $layout->setConfig($config); - $this->assertEquals('foo', $layout->getLayout()); - $this->assertEquals('foo', $layout->getContentKey()); - $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath()); - $this->assertFalse($layout->getMvcEnabled()); - } - - /** - * @return void - */ - public function testSetOptionsWithConfigObjectModifiesAttributes() - { - $layout = new Zend_Layout(); - - require_once 'Zend/Config.php'; - $config = new Zend_Config(array( - 'layout' => 'foo', - 'contentKey' => 'foo', - 'layoutPath' => dirname(__FILE__), - 'mvcEnabled' => false, - )); - $layout->setOptions($config); - $this->assertEquals('foo', $layout->getLayout()); - $this->assertEquals('foo', $layout->getContentKey()); - $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath()); - $this->assertFalse($layout->getMvcEnabled()); - } - - /** - * @return void - */ - public function testLayoutAccessorsModifyAndRetrieveLayoutValue() - { - $layout = new Zend_Layout(); - $layout->setLayout('foo'); - $this->assertEquals('foo', $layout->getLayout()); - } - - /** - * @return void - */ - public function testSetLayoutEnablesLayouts() - { - $layout = new Zend_Layout(); - $layout->disableLayout(); - $this->assertFalse($layout->isEnabled()); - $layout->setLayout('foo'); - $this->assertTrue($layout->isEnabled()); - } - - /** - * @return void - */ - public function testDisableLayoutDisablesLayouts() - { - $layout = new Zend_Layout(); - $this->assertTrue($layout->isEnabled()); - $layout->disableLayout(); - $this->assertFalse($layout->isEnabled()); - } - - /** - * @return void - */ - public function testEnableLayoutEnablesLayouts() - { - $layout = new Zend_Layout(); - $this->assertTrue($layout->isEnabled()); - $layout->disableLayout(); - $this->assertFalse($layout->isEnabled()); - $layout->enableLayout(); - $this->assertTrue($layout->isEnabled()); - } - - /** - * @return void - */ - public function testLayoutPathAccessorsWork() - { - $layout = new Zend_Layout(); - $layout->setLayoutPath(dirname(__FILE__)); - $this->assertEquals(dirname(__FILE__), $layout->getLayoutPath()); - } - - /** - * @return void - */ - public function testContentKeyAccessorsWork() - { - $layout = new Zend_Layout(); - $layout->setContentKey('foo'); - $this->assertEquals('foo', $layout->getContentKey()); - } - - /** - * @return void - */ - public function testMvcEnabledFlagFalseAfterStandardInstantiation() - { - $layout = new Zend_Layout(); - $this->assertFalse($layout->getMvcEnabled()); - } - - /** - * @return void - */ - public function testMvcEnabledFlagTrueWhenInstantiatedViaStartMvcMethod() - { - $layout = Zend_Layout::startMvc(); - $this->assertTrue($layout->getMvcEnabled()); - } - - /** - * @return void - */ - public function testGetViewRetrievesViewWhenNoneSet() - { - $layout = new Zend_Layout(); - $view = $layout->getView(); - $this->assertTrue($view instanceof Zend_View_Interface); - } - - /** - * @return void - */ - public function testGetViewRetrievesViewFromViewRenderer() - { - $layout = new Zend_Layout(); - $view = $layout->getView(); - $vr = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - $this->assertSame($vr->view, $view); - } - - /** - * @return void - */ - public function testViewAccessorsAllowSettingView() - { - $layout = new Zend_Layout(); - $view = new Zend_View(); - $layout->setView($view); - $received = $layout->getView(); - $this->assertSame($view, $received); - } - - /** - * @return void - */ - public function testInflectorAccessorsWork() - { - $layout = new Zend_Layout(); - $inflector = new Zend_Filter_Inflector(); - $layout->setInflector($inflector); - $this->assertSame($inflector, $layout->getInflector()); - } - - /** - * @return void - */ - public function testPluginClassAccessorsSetState() - { - $layout = new Zend_Layout(); - $layout->setPluginClass('Foo_Bar'); - $this->assertEquals('Foo_Bar', $layout->getPluginClass()); - } - - /** - * @return void - */ - public function testPluginClassPassedToStartMvcIsUsed() - { - $layout = Zend_Layout::startMvc(array('pluginClass' => 'Zend_Layout_LayoutTest_Controller_Plugin_Layout')); - $this->assertTrue(Zend_Controller_Front::getInstance()->hasPlugin('Zend_Layout_LayoutTest_Controller_Plugin_Layout')); - } - - /** - * @return void - */ - public function testHelperClassAccessorsSetState() - { - $layout = new Zend_Layout(); - $layout->setHelperClass('Foo_Bar'); - $this->assertEquals('Foo_Bar', $layout->getHelperClass()); - } - - /** - * @return void - */ - public function testHelperClassPassedToStartMvcIsUsed() - { - $layout = Zend_Layout::startMvc(array('helperClass' => 'Zend_Layout_LayoutTest_Controller_Action_Helper_Layout')); - $this->assertTrue(Zend_Controller_Action_HelperBroker::hasHelper('layout')); - $helper = Zend_Controller_Action_HelperBroker::getStaticHelper('layout'); - $this->assertTrue($helper instanceof Zend_Layout_LayoutTest_Controller_Action_Helper_Layout); - } - - /** - * @return void - */ - public function testEnableInflector() - { - $layout = new Zend_Layout(); - $layout->disableInflector(); - $this->assertFalse($layout->inflectorEnabled()); - $layout->enableInflector(); - $this->assertTrue($layout->inflectorEnabled()); - } - - /** - * @return void - */ - public function testDisableInflector() - { - $layout = new Zend_Layout(); - $layout->disableInflector(); - $this->assertFalse($layout->inflectorEnabled()); - } - - /** - * @return void - */ - public function testOverloadingAccessorsWork() - { - $layout = new Zend_Layout(); - $layout->foo = 'bar'; - $this->assertTrue(isset($layout->foo)); - $this->assertEquals('bar', $layout->foo); - unset($layout->foo); - $this->assertFalse(isset($layout->foo)); - } - - /** - * @return void - */ - public function testAssignWithKeyValuePairPopulatesPropertyAccessibleViaOverloading() - { - $layout = new Zend_Layout(); - $layout->assign('foo', 'bar'); - $this->assertEquals('bar', $layout->foo); - } - - /** - * @return void - */ - public function testAssignWithArrayPopulatesPropertiesAccessibleViaOverloading() - { - $layout = new Zend_Layout(); - $layout->assign(array( - 'foo' => 'bar', - 'bar' => 'baz' - )); - $this->assertEquals('bar', $layout->foo); - $this->assertEquals('baz', $layout->bar); - } - - /** - * @return void - */ - public function testRenderWithNoInflection() - { - $layout = new Zend_Layout(); - $view = new Zend_View(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->disableInflector() - ->setLayout('layout.phtml') - ->setView($view); - $layout->message = 'Rendered layout'; - $received = $layout->render(); - $this->assertContains('Testing layouts:', $received); - $this->assertContains($layout->message, $received); - } - - public function testRenderWithDefaultInflection() - { - $layout = new Zend_Layout(); - $view = new Zend_View(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setView($view); - $layout->message = 'Rendered layout'; - $received = $layout->render(); - $this->assertContains('Testing layouts:', $received); - $this->assertContains($layout->message, $received); - } - - public function testRenderWithCustomInflection() - { - $layout = new Zend_Layout(); - $view = new Zend_View(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setView($view); - $inflector = $layout->getInflector(); - $inflector->setTarget('test/:script.:suffix') - ->setStaticRule('suffix', 'php'); - $layout->message = 'Rendered layout'; - $received = $layout->render(); - $this->assertContains('Testing layouts with custom inflection:', $received); - $this->assertContains($layout->message, $received); - } - - public function testGetMvcInstanceReturnsNullWhenStartMvcHasNotBeenCalled() - { - $this->assertNull(Zend_Layout::getMvcInstance()); - } - - public function testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled() - { - $layout = Zend_Layout::startMvc(); - $received = Zend_Layout::getMvcInstance(); - $this->assertSame($layout, $received); - } - - public function testSubsequentCallsToStartMvcWithOptionsSetState() - { - $layout = Zend_Layout::startMvc(); - $this->assertTrue($layout->getMvcSuccessfulActionOnly()); - $this->assertEquals('content', $layout->getContentKey()); - - Zend_Layout::startMvc(array( - 'mvcSuccessfulActionOnly' => false, - 'contentKey' => 'foobar' - )); - $this->assertFalse($layout->getMvcSuccessfulActionOnly()); - $this->assertEquals('foobar', $layout->getContentKey()); - } - - public function testGetViewSuffixRetrievesDefaultValue() - { - $layout = new Zend_Layout(); - $this->assertEquals('phtml', $layout->getViewSuffix()); - } - - public function testViewSuffixAccessorsWork() - { - $layout = new Zend_Layout(); - $layout->setViewSuffix('php'); - $this->assertEquals('php', $layout->getViewSuffix()); - } - - public function testSettingViewSuffixChangesInflectorSuffix() - { - $layout = new Zend_Layout(); - $inflector = $layout->getInflector(); - $rules = $inflector->getRules(); - $this->assertTrue(isset($rules['suffix'])); - $this->assertEquals($layout->getViewSuffix(), $rules['suffix']); - $layout->setViewSuffix('php'); - $this->assertEquals($layout->getViewSuffix(), $rules['suffix']); - } - - public function testGetInflectorTargetRetrievesDefaultValue() - { - $layout = new Zend_Layout(); - $this->assertEquals(':script.:suffix', $layout->getInflectorTarget()); - } - - public function testInflectorTargetAccessorsWork() - { - $layout = new Zend_Layout(); - $layout->setInflectorTarget(':script-foo.:suffix'); - $this->assertEquals(':script-foo.:suffix', $layout->getInflectorTarget()); - } - - public function testSettingInflectorTargetChangesInflectorSuffix() - { - $layout = new Zend_Layout(); - $inflector = $layout->getInflector(); - $target = $inflector->getTarget(); - $this->assertEquals($layout->getInflectorTarget(), $inflector->getTarget()); - $layout->setInflectorTarget('php'); - $this->assertEquals($layout->getInflectorTarget(), $inflector->getTarget()); - } - - public function testLayoutWithViewBasePath() - { - $layout = new Zend_Layout(array( - 'viewBasePath' => dirname(__FILE__) . '/_files/layouts-basepath/') - ); - $this->assertEquals('layout inside basePath', $layout->render()); - $layout->setLayout('layout2'); - $this->assertEquals('foobar-helper-output', $layout->render()); - } - - public function testResettingMvcInstanceUnregistersHelperAndPlugin() - { - $this->testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled(); - Zend_Layout::resetMvcInstance(); - $front = Zend_Controller_Front::getInstance(); - $this->assertFalse($front->hasPlugin('Zend_Layout_Controller_Plugin_Layout'), 'Plugin not unregistered'); - $this->assertFalse(Zend_Controller_Action_HelperBroker::hasHelper('Layout'), 'Helper not unregistered'); - } - - public function testResettingMvcInstanceRemovesMvcSingleton() - { - $this->testGetMvcInstanceReturnsLayoutInstanceWhenStartMvcHasBeenCalled(); - Zend_Layout::resetMvcInstance(); - $this->assertNull(Zend_Layout::getMvcInstance()); - } - - public function testMinimalViewObjectWorks() - { - require_once dirname(__FILE__) . '/_files/MinimalCustomView.php'; - $layout = new Zend_Layout(array( - 'view' => new Zend_Layout_Test_MinimalCustomView(), - 'ViewScriptPath' => 'some/path' - )); - $layout->render(); - } - - /** - * @group ZF-5152 - */ - public function testCallingStartMvcTwiceDoesntGenerateAnyUnexpectedBehavior() - { - Zend_Layout::startMvc('/some/path'); - $this->assertEquals(Zend_Layout::getMvcInstance()->getLayoutPath(),'/some/path'); - Zend_Layout::startMvc('/some/other/path'); - $this->assertEquals(Zend_Layout::getMvcInstance()->getLayoutPath(),'/some/other/path'); - $this->assertTrue(Zend_Layout::getMvcInstance()->isEnabled()); - } - - /** - * @group ZF-5891 - */ - public function testSetLayoutWithDisabledFlag() - { - $layout = new Zend_Layout(); - $layout->disableLayout(); - $layout->setLayout('foo', false); - $this->assertEquals('foo', $layout->getLayout()); - $this->assertFalse($layout->isEnabled()); - } -} - -/** - * Zend_Layout extension to allow resetting mvcInstance static member - */ -class Zend_Layout_LayoutTest_Override extends Zend_Layout -{ - public static function resetMvcInstance() - { - self::$_mvcInstance = null; - } -} - -class Zend_Layout_LayoutTest_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout -{ -} - -class Zend_Layout_LayoutTest_Controller_Action_Helper_Layout extends Zend_Layout_Controller_Action_Helper_Layout -{ -} - -// Call Zend_Layout_LayoutTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Layout_LayoutTest::main") { - Zend_Layout_LayoutTest::main(); -} diff --git a/tests/Zend/Layout/PluginTest.php b/tests/Zend/Layout/PluginTest.php deleted file mode 100644 index 50f64f7265..0000000000 --- a/tests/Zend/Layout/PluginTest.php +++ /dev/null @@ -1,246 +0,0 @@ -resetInstance(); - - Zend_Layout_PluginTest_Layout::resetMvcInstance(); - - if (Zend_Controller_Action_HelperBroker::hasHelper('Layout')) { - Zend_Controller_Action_HelperBroker::removeHelper('Layout'); - } - if (Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) { - Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer'); - } - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - Zend_Layout::resetMvcInstance(); - } - - public function testConstructorWithLayoutObject() - { - $layout = new Zend_Layout(array('mvcEnabled' => false)); - $plugin = new Zend_Layout_Controller_Plugin_Layout($layout); - $this->assertSame($layout, $plugin->getLayout()); - } - - public function testGetLayoutReturnsNullWithNoLayoutPresent() - { - $plugin = new Zend_Layout_Controller_Plugin_Layout(); - $this->assertNull($plugin->getLayout()); - } - - public function testLayoutAccessorsWork() - { - $plugin = new Zend_Layout_Controller_Plugin_Layout(); - $this->assertNull($plugin->getLayout()); - - $layout = new Zend_Layout(array('mvcEnabled' => false)); - $plugin->setlayout($layout); - $this->assertSame($layout, $plugin->getLayout()); - } - - public function testGetLayoutReturnsLayoutObjectWhenPulledFromPluginBroker() - { - $layout = Zend_Layout::startMvc(); - $front = Zend_Controller_Front::getInstance(); - $this->assertTrue($front->hasPlugin('Zend_Layout_Controller_Plugin_Layout')); - $plugin = $front->getPlugin('Zend_Layout_Controller_Plugin_Layout'); - $this->assertSame($layout, $plugin->getLayout()); - } - - public function testPostDispatchRendersLayout() - { - $front = Zend_Controller_Front::getInstance(); - $request = new Zend_Controller_Request_Simple(); - $response = new Zend_Controller_Response_Cli(); - - $request->setDispatched(true); - $response->setBody('Application content'); - $front->setRequest($request) - ->setResponse($response); - - $layout = Zend_Layout::startMvc(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setLayout('plugin.phtml') - ->disableInflector(); - - $helper = Zend_Controller_Action_HelperBroker::getStaticHelper('layout'); - $plugin = $front->getPlugin('Zend_Layout_Controller_Plugin_Layout'); - $plugin->setResponse($response); - - $helper->postDispatch(); - $plugin->postDispatch($request); - - $body = $response->getBody(); - $this->assertContains('Application content', $body, $body); - $this->assertContains('Site Layout', $body, $body); - } - - public function testPostDispatchDoesNotRenderLayoutWhenForwardDetected() - { - $front = Zend_Controller_Front::getInstance(); - $request = new Zend_Controller_Request_Simple(); - $response = new Zend_Controller_Response_Cli(); - - $request->setDispatched(false); - $response->setBody('Application content'); - $front->setRequest($request) - ->setResponse($response); - - $layout = Zend_Layout::startMvc(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setLayout('plugin.phtml') - ->disableInflector(); - - $plugin = $front->getPlugin('Zend_Layout_Controller_Plugin_Layout'); - $plugin->setResponse($response); - $plugin->postDispatch($request); - - $body = $response->getBody(); - $this->assertContains('Application content', $body); - $this->assertNotContains('Site Layout', $body); - } - - public function testPostDispatchDoesNotRenderLayoutWhenLayoutDisabled() - { - $front = Zend_Controller_Front::getInstance(); - $request = new Zend_Controller_Request_Simple(); - $response = new Zend_Controller_Response_Cli(); - - $request->setDispatched(true); - $response->setBody('Application content'); - $front->setRequest($request) - ->setResponse($response); - - $layout = Zend_Layout::startMvc(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setLayout('plugin.phtml') - ->disableInflector() - ->disableLayout(); - - $plugin = $front->getPlugin('Zend_Layout_Controller_Plugin_Layout'); - $plugin->setResponse($response); - $plugin->postDispatch($request); - - $body = $response->getBody(); - $this->assertContains('Application content', $body); - $this->assertNotContains('Site Layout', $body); - } - - /** - * @group ZF-8041 - */ - public function testPostDispatchDoesNotRenderLayoutWhenResponseRedirected() - { - $front = Zend_Controller_Front::getInstance(); - $request = new Zend_Controller_Request_Simple(); - $response = new Zend_Controller_Response_Cli(); - - $request->setDispatched(true); - $response->setHttpResponseCode(302); - $response->setBody('Application content'); - $front->setRequest($request) - ->setResponse($response); - - $layout = Zend_Layout::startMvc(); - $layout->setLayoutPath(dirname(__FILE__) . '/_files/layouts') - ->setLayout('plugin.phtml') - ->setMvcSuccessfulActionOnly(false) - ->disableInflector(); - - $plugin = $front->getPlugin('Zend_Layout_Controller_Plugin_Layout'); - $plugin->setResponse($response); - $plugin->postDispatch($request); - - $body = $response->getBody(); - $this->assertContains('Application content', $body); - $this->assertNotContains('Site Layout', $body); - } -} - -/** - * Zend_Layout extension to allow resetting MVC instance - */ -class Zend_Layout_PluginTest_Layout extends Zend_Layout -{ - public static function resetMvcInstance() - { - self::$_mvcInstance = null; - } -} - -// Call Zend_Layout_PluginTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Layout_PluginTest::main") { - Zend_Layout_PluginTest::main(); -} diff --git a/tests/Zend/Layout/_files/MinimalCustomView.php b/tests/Zend/Layout/_files/MinimalCustomView.php deleted file mode 100644 index 1d7d2bc7e3..0000000000 --- a/tests/Zend/Layout/_files/MinimalCustomView.php +++ /dev/null @@ -1,55 +0,0 @@ -layout()->content; ?> -[DEFAULT_LAYOUT_END] diff --git a/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-error/error.phtml b/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-error/error.phtml deleted file mode 100644 index 8df3812938..0000000000 --- a/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-error/error.phtml +++ /dev/null @@ -1 +0,0 @@ -(ErrorController::errorAction output) \ No newline at end of file diff --git a/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-test/index.phtml b/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-test/index.phtml deleted file mode 100644 index 32f95c0d12..0000000000 --- a/tests/Zend/Layout/_files/functional-test-app/views/scripts/zend-layout-functional-test-test/index.phtml +++ /dev/null @@ -1 +0,0 @@ -hi \ No newline at end of file diff --git a/tests/Zend/Layout/_files/layouts-basepath/helpers/FooBar.php b/tests/Zend/Layout/_files/layouts-basepath/helpers/FooBar.php deleted file mode 100644 index 8c55606a04..0000000000 --- a/tests/Zend/Layout/_files/layouts-basepath/helpers/FooBar.php +++ /dev/null @@ -1,38 +0,0 @@ -fooBar(); ?> diff --git a/tests/Zend/Layout/_files/layouts/layout.phtml b/tests/Zend/Layout/_files/layouts/layout.phtml deleted file mode 100644 index 1a7d03c69b..0000000000 --- a/tests/Zend/Layout/_files/layouts/layout.phtml +++ /dev/null @@ -1,3 +0,0 @@ -Testing layouts: -placeholder('Zend_Layout')->message ?> - diff --git a/tests/Zend/Layout/_files/layouts/plugin.phtml b/tests/Zend/Layout/_files/layouts/plugin.phtml deleted file mode 100644 index 6da92048e7..0000000000 --- a/tests/Zend/Layout/_files/layouts/plugin.phtml +++ /dev/null @@ -1,3 +0,0 @@ -Site Layout -placeholder('Zend_Layout')->content ?> - diff --git a/tests/Zend/Layout/_files/layouts/test/layout.php b/tests/Zend/Layout/_files/layouts/test/layout.php deleted file mode 100644 index 6ad1dcfd2c..0000000000 --- a/tests/Zend/Layout/_files/layouts/test/layout.php +++ /dev/null @@ -1,26 +0,0 @@ -Testing layouts with custom inflection: -placeholder('Zend_Layout')->message -?> - From 642f7926944ad3a8500f86e30e088d63d8db88f7 Mon Sep 17 00:00:00 2001 From: Joan He Date: Thu, 5 Apr 2018 12:44:24 -0500 Subject: [PATCH 09/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_View --- library/Zend/View.php | 160 --- library/Zend/View/Abstract.php | 1200 ----------------- library/Zend/View/Exception.php | 51 - library/Zend/View/Helper/Abstract.php | 64 - library/Zend/View/Helper/Action.php | 164 --- library/Zend/View/Helper/BaseUrl.php | 116 -- library/Zend/View/Helper/Currency.php | 120 -- library/Zend/View/Helper/Cycle.php | 225 ---- library/Zend/View/Helper/DeclareVars.php | 95 -- library/Zend/View/Helper/Doctype.php | 242 ---- library/Zend/View/Helper/Fieldset.php | 79 -- library/Zend/View/Helper/Form.php | 86 -- library/Zend/View/Helper/FormButton.php | 105 -- library/Zend/View/Helper/FormCheckbox.php | 164 --- library/Zend/View/Helper/FormElement.php | 204 --- library/Zend/View/Helper/FormErrors.php | 167 --- library/Zend/View/Helper/FormFile.php | 75 -- library/Zend/View/Helper/FormHidden.php | 66 - library/Zend/View/Helper/FormImage.php | 95 -- library/Zend/View/Helper/FormLabel.php | 72 - .../Zend/View/Helper/FormMultiCheckbox.php | 74 - library/Zend/View/Helper/FormNote.php | 61 - library/Zend/View/Helper/FormPassword.php | 89 -- library/Zend/View/Helper/FormRadio.php | 187 --- library/Zend/View/Helper/FormReset.php | 82 -- library/Zend/View/Helper/FormSelect.php | 200 --- library/Zend/View/Helper/FormSubmit.php | 81 -- library/Zend/View/Helper/FormText.php | 78 -- library/Zend/View/Helper/FormTextarea.php | 104 -- library/Zend/View/Helper/Gravatar.php | 363 ----- library/Zend/View/Helper/HeadLink.php | 478 ------- library/Zend/View/Helper/HeadMeta.php | 449 ------ library/Zend/View/Helper/HeadScript.php | 520 ------- library/Zend/View/Helper/HeadStyle.php | 433 ------ library/Zend/View/Helper/HeadTitle.php | 222 --- library/Zend/View/Helper/HtmlElement.php | 167 --- library/Zend/View/Helper/HtmlFlash.php | 60 - library/Zend/View/Helper/HtmlList.php | 90 -- library/Zend/View/Helper/HtmlObject.php | 80 -- library/Zend/View/Helper/HtmlPage.php | 75 -- library/Zend/View/Helper/HtmlQuicktime.php | 82 -- library/Zend/View/Helper/InlineScript.php | 61 - library/Zend/View/Helper/Interface.php | 46 - library/Zend/View/Helper/Json.php | 90 -- library/Zend/View/Helper/Layout.php | 81 -- library/Zend/View/Helper/Navigation.php | 350 ----- .../View/Helper/Navigation/Breadcrumbs.php | 331 ----- .../Zend/View/Helper/Navigation/Helper.php | 212 --- .../View/Helper/Navigation/HelperAbstract.php | 976 -------------- library/Zend/View/Helper/Navigation/Links.php | 783 ----------- library/Zend/View/Helper/Navigation/Menu.php | 1099 --------------- .../Zend/View/Helper/Navigation/Sitemap.php | 444 ------ .../Zend/View/Helper/PaginationControl.php | 145 -- library/Zend/View/Helper/Partial.php | 153 --- .../Zend/View/Helper/Partial/Exception.php | 39 - library/Zend/View/Helper/PartialLoop.php | 100 -- library/Zend/View/Helper/Placeholder.php | 87 -- .../View/Helper/Placeholder/Container.php | 36 - .../Helper/Placeholder/Container/Abstract.php | 385 ------ .../Placeholder/Container/Exception.php | 39 - .../Placeholder/Container/Standalone.php | 324 ----- .../Zend/View/Helper/Placeholder/Registry.php | 188 --- .../Helper/Placeholder/Registry/Exception.php | 39 - .../Zend/View/Helper/RenderToPlaceholder.php | 53 - library/Zend/View/Helper/ServerUrl.php | 148 -- library/Zend/View/Helper/Translate.php | 180 --- library/Zend/View/Helper/Url.php | 51 - library/Zend/View/Helper/UserAgent.php | 83 -- library/Zend/View/Interface.php | 137 -- library/Zend/View/Stream.php | 183 --- tests/Zend/AllTests.php | 8 - tests/Zend/View/AllTests.php | 56 - tests/Zend/View/Helper/ActionTest.php | 339 ----- tests/Zend/View/Helper/AllTests.php | 151 --- .../View/Helper/AttributeJsEscapingTest.php | 102 -- tests/Zend/View/Helper/BaseUrlTest.php | 212 --- tests/Zend/View/Helper/CurrencyTest.php | 200 --- tests/Zend/View/Helper/CycleTest.php | 169 --- tests/Zend/View/Helper/DeclareVarsTest.php | 117 -- tests/Zend/View/Helper/DoctypeTest.php | 224 --- tests/Zend/View/Helper/FieldsetTest.php | 119 -- tests/Zend/View/Helper/FormButtonTest.php | 139 -- tests/Zend/View/Helper/FormCheckboxTest.php | 351 ----- tests/Zend/View/Helper/FormErrorsTest.php | 198 --- tests/Zend/View/Helper/FormFileTest.php | 152 --- tests/Zend/View/Helper/FormImageTest.php | 125 -- tests/Zend/View/Helper/FormLabelTest.php | 148 -- .../View/Helper/FormMultiCheckboxTest.php | 156 --- tests/Zend/View/Helper/FormPasswordTest.php | 147 -- tests/Zend/View/Helper/FormRadioTest.php | 523 ------- tests/Zend/View/Helper/FormResetTest.php | 123 -- tests/Zend/View/Helper/FormSelectTest.php | 384 ------ tests/Zend/View/Helper/FormSubmitTest.php | 144 -- tests/Zend/View/Helper/FormTest.php | 186 --- tests/Zend/View/Helper/FormTextTest.php | 147 -- tests/Zend/View/Helper/FormTextareaTest.php | 105 -- tests/Zend/View/Helper/GravatarTest.php | 291 ---- tests/Zend/View/Helper/HeadLinkTest.php | 534 -------- tests/Zend/View/Helper/HeadMetaTest.php | 571 -------- tests/Zend/View/Helper/HeadScriptTest.php | 542 -------- tests/Zend/View/Helper/HeadStyleTest.php | 492 ------- tests/Zend/View/Helper/HeadTitleTest.php | 253 ---- tests/Zend/View/Helper/HtmlFlashTest.php | 92 -- tests/Zend/View/Helper/HtmlListTest.php | 262 ---- tests/Zend/View/Helper/HtmlObjectTest.php | 153 --- tests/Zend/View/Helper/HtmlPageTest.php | 94 -- tests/Zend/View/Helper/HtmlQuicktimeTest.php | 95 -- tests/Zend/View/Helper/InlineScriptTest.php | 121 -- tests/Zend/View/Helper/JsonTest.php | 200 --- tests/Zend/View/Helper/LayoutTest.php | 138 -- .../Zend/View/Helper/Navigation/AllTests.php | 70 - .../Helper/Navigation/BreadcrumbsTest.php | 297 ---- .../Zend/View/Helper/Navigation/LinksTest.php | 738 ---------- .../Zend/View/Helper/Navigation/MenuTest.php | 969 ------------- .../View/Helper/Navigation/NavigationTest.php | 463 ------- .../View/Helper/Navigation/SitemapTest.php | 317 ----- .../View/Helper/Navigation/TestAbstract.php | 199 --- .../Navigation/_files/expected/bc/acl.html | 1 - .../_files/expected/bc/default.html | 1 - .../_files/expected/bc/linklast.html | 1 - .../_files/expected/bc/maxdepth.html | 1 - .../_files/expected/bc/partial.html | 1 - .../_files/expected/bc/separator.html | 1 - .../_files/expected/bc/translated.html | 1 - .../_files/expected/menu/accesskey.html | 16 - .../Navigation/_files/expected/menu/acl.html | 65 - .../expected/menu/acl_role_interface.html | 62 - .../_files/expected/menu/acl_string.html | 62 - .../_files/expected/menu/bothdepts.html | 52 - .../Navigation/_files/expected/menu/css.html | 11 - .../_files/expected/menu/css_active.html | 11 - .../expected/menu/customhtmlattribs.html | 16 - .../_files/expected/menu/default1.html | 81 -- .../_files/expected/menu/default2.html | 11 - .../_files/expected/menu/expandbranch.html | 52 - .../menu/expandbranch_onlyactivebranch.html | 40 - .../_files/expected/menu/indent4.html | 81 -- .../_files/expected/menu/indent8.html | 81 -- .../_files/expected/menu/innerindent0.html | 81 -- .../_files/expected/menu/innerindent4.html | 81 -- .../_files/expected/menu/innerindent8.html | 81 -- .../_files/expected/menu/maxdepth.html | 44 - .../_files/expected/menu/mindepth.html | 60 - .../normalize-id-prefix-with-content.html | 16 - .../menu/normalize-id-prefix-with-null.html | 16 - .../normalize-id-prefix-without-content.html | 16 - .../expected/menu/onlyactivebranch.html | 31 - .../menu/onlyactivebranch_bothdepts.html | 21 - .../menu/onlyactivebranch_maxdepth.html | 26 - .../menu/onlyactivebranch_mindepth.html | 26 - .../menu/onlyactivebranch_noparents.html | 8 - .../expected/menu/onlyactivebranch_np_bd.html | 8 - .../menu/onlyactivebranch_np_bd2.html | 11 - .../expected/menu/parentclass_bothdepts.html | 52 - .../expected/menu/parentclass_custom.html | 81 -- ...arentclass_onlyactivebranch_bothdepts.html | 21 - .../expected/menu/parentclass_standard.html | 81 -- .../_files/expected/menu/partial.html | 2 - .../_files/expected/menu/translated.html | 81 -- .../expected/menu/without_whitespace.html | 1 - .../_files/expected/sitemap/acl.xml | 54 - .../_files/expected/sitemap/acl2.xml | 39 - .../_files/expected/sitemap/default1.xml | 66 - .../_files/expected/sitemap/default2.xml | 14 - .../_files/expected/sitemap/depth1.xml | 18 - .../_files/expected/sitemap/depth2.xml | 51 - .../_files/expected/sitemap/depth3.xml | 45 - .../_files/expected/sitemap/invalid.xml | 19 - .../_files/expected/sitemap/nodecl.xml | 13 - .../_files/expected/sitemap/serverurl1.xml | 66 - .../_files/expected/sitemap/serverurl2.xml | 66 - .../expected/sitemap/without_whitespace.xml | 2 - .../Helper/Navigation/_files/helpers/Menu.php | 39 - .../Navigation/_files/mvc/views/bc.phtml | 4 - .../Navigation/_files/mvc/views/menu.phtml | 13 - .../Helper/Navigation/_files/navigation.xml | 244 ---- .../View/Helper/PaginationControlTest.php | 220 --- tests/Zend/View/Helper/PartialLoopTest.php | 564 -------- tests/Zend/View/Helper/PartialTest.php | 297 ---- .../View/Helper/Placeholder/ContainerTest.php | 470 ------- .../View/Helper/Placeholder/RegistryTest.php | 242 ---- .../Placeholder/StandaloneContainerTest.php | 123 -- tests/Zend/View/Helper/PlaceholderTest.php | 144 -- .../View/Helper/RenderToPlaceholderTest.php | 59 - tests/Zend/View/Helper/ServerUrlTest.php | 177 --- tests/Zend/View/Helper/TranslateTest.php | 269 ---- tests/Zend/View/Helper/UrlTest.php | 97 -- tests/Zend/View/Helper/UserAgentTest.php | 109 -- .../controllers/ActionBarController.php | 38 - .../controllers/ActionFooController.php | 54 - .../views/scripts/action-bar/baz.phtml | 5 - .../views/scripts/action-foo/bar.phtml | 1 - .../views/scripts/action-foo/baz.phtml | 1 - .../views/scripts/partialActionCall.phtml | 2 - .../default/views/scripts/partialLoop.phtml | 2 - .../views/scripts/partialLoopCouter.phtml | 3 - .../views/scripts/partialLoopObject.phtml | 6 - .../default/views/scripts/partialObj.phtml | 11 - .../default/views/scripts/partialOne.phtml | 1 - .../default/views/scripts/partialThree.phtml | 2 - .../default/views/scripts/partialVars.phtml | 4 - .../modules/foo/controllers/BazController.php | 51 - .../modules/foo/controllers/FooController.php | 49 - .../foo/views/scripts/baz/bar-one.phtml | 2 - .../foo/views/scripts/baz/bar-three.phtml | 1 - .../foo/views/scripts/baz/bar-two.phtml | 2 - .../modules/foo/views/scripts/foo/bar.phtml | 1 - .../modules/foo/views/scripts/foo/nest.phtml | 4 - .../foo/views/scripts/foo/nested.phtml | 3 - .../foo/views/scripts/partialLoop.phtml | 2 - .../foo/views/scripts/partialTwo.phtml | 1 - .../scripts/rendertoplaceholderscript.phtml | 1 - .../_files/scripts/testPagination.phtml | 3 - tests/Zend/View/_stubs/FilterDir1/Foo.php | 39 - tests/Zend/View/_stubs/HelperDir1/Stub1.php | 39 - .../Zend/View/_stubs/HelperDir1/StubEmpty.php | 26 - .../Zend/View/_stubs/HelperDir2/Datetime.php | 39 - tests/Zend/View/_stubs/HelperDir2/Stub1.php | 39 - tests/Zend/View/_stubs/HelperDir2/Stub2.php | 47 - .../_stubs/scripts/LfiProtectionCheck.phtml | 3 - tests/Zend/View/_templates/test.phtml | 5 - tests/Zend/View/_templates/testParent.phtml | 10 - .../Zend/View/_templates/testStrictVars.phtml | 7 - .../View/_templates/testSubTemplate.phtml | 5 - tests/Zend/View/_templates/testZf995.phtml | 6 - tests/Zend/ViewTest.php | 1178 ---------------- 226 files changed, 32694 deletions(-) delete mode 100644 library/Zend/View.php delete mode 100644 library/Zend/View/Abstract.php delete mode 100644 library/Zend/View/Exception.php delete mode 100644 library/Zend/View/Helper/Abstract.php delete mode 100644 library/Zend/View/Helper/Action.php delete mode 100644 library/Zend/View/Helper/BaseUrl.php delete mode 100644 library/Zend/View/Helper/Currency.php delete mode 100644 library/Zend/View/Helper/Cycle.php delete mode 100644 library/Zend/View/Helper/DeclareVars.php delete mode 100644 library/Zend/View/Helper/Doctype.php delete mode 100644 library/Zend/View/Helper/Fieldset.php delete mode 100644 library/Zend/View/Helper/Form.php delete mode 100644 library/Zend/View/Helper/FormButton.php delete mode 100644 library/Zend/View/Helper/FormCheckbox.php delete mode 100644 library/Zend/View/Helper/FormElement.php delete mode 100644 library/Zend/View/Helper/FormErrors.php delete mode 100644 library/Zend/View/Helper/FormFile.php delete mode 100644 library/Zend/View/Helper/FormHidden.php delete mode 100644 library/Zend/View/Helper/FormImage.php delete mode 100644 library/Zend/View/Helper/FormLabel.php delete mode 100644 library/Zend/View/Helper/FormMultiCheckbox.php delete mode 100644 library/Zend/View/Helper/FormNote.php delete mode 100644 library/Zend/View/Helper/FormPassword.php delete mode 100644 library/Zend/View/Helper/FormRadio.php delete mode 100644 library/Zend/View/Helper/FormReset.php delete mode 100644 library/Zend/View/Helper/FormSelect.php delete mode 100644 library/Zend/View/Helper/FormSubmit.php delete mode 100644 library/Zend/View/Helper/FormText.php delete mode 100644 library/Zend/View/Helper/FormTextarea.php delete mode 100644 library/Zend/View/Helper/Gravatar.php delete mode 100644 library/Zend/View/Helper/HeadLink.php delete mode 100644 library/Zend/View/Helper/HeadMeta.php delete mode 100644 library/Zend/View/Helper/HeadScript.php delete mode 100644 library/Zend/View/Helper/HeadStyle.php delete mode 100644 library/Zend/View/Helper/HeadTitle.php delete mode 100644 library/Zend/View/Helper/HtmlElement.php delete mode 100644 library/Zend/View/Helper/HtmlFlash.php delete mode 100644 library/Zend/View/Helper/HtmlList.php delete mode 100644 library/Zend/View/Helper/HtmlObject.php delete mode 100644 library/Zend/View/Helper/HtmlPage.php delete mode 100644 library/Zend/View/Helper/HtmlQuicktime.php delete mode 100644 library/Zend/View/Helper/InlineScript.php delete mode 100644 library/Zend/View/Helper/Interface.php delete mode 100644 library/Zend/View/Helper/Json.php delete mode 100644 library/Zend/View/Helper/Layout.php delete mode 100644 library/Zend/View/Helper/Navigation.php delete mode 100644 library/Zend/View/Helper/Navigation/Breadcrumbs.php delete mode 100644 library/Zend/View/Helper/Navigation/Helper.php delete mode 100644 library/Zend/View/Helper/Navigation/HelperAbstract.php delete mode 100644 library/Zend/View/Helper/Navigation/Links.php delete mode 100644 library/Zend/View/Helper/Navigation/Menu.php delete mode 100644 library/Zend/View/Helper/Navigation/Sitemap.php delete mode 100644 library/Zend/View/Helper/PaginationControl.php delete mode 100644 library/Zend/View/Helper/Partial.php delete mode 100644 library/Zend/View/Helper/Partial/Exception.php delete mode 100644 library/Zend/View/Helper/PartialLoop.php delete mode 100644 library/Zend/View/Helper/Placeholder.php delete mode 100644 library/Zend/View/Helper/Placeholder/Container.php delete mode 100644 library/Zend/View/Helper/Placeholder/Container/Abstract.php delete mode 100644 library/Zend/View/Helper/Placeholder/Container/Exception.php delete mode 100644 library/Zend/View/Helper/Placeholder/Container/Standalone.php delete mode 100644 library/Zend/View/Helper/Placeholder/Registry.php delete mode 100644 library/Zend/View/Helper/Placeholder/Registry/Exception.php delete mode 100644 library/Zend/View/Helper/RenderToPlaceholder.php delete mode 100644 library/Zend/View/Helper/ServerUrl.php delete mode 100644 library/Zend/View/Helper/Translate.php delete mode 100644 library/Zend/View/Helper/Url.php delete mode 100644 library/Zend/View/Helper/UserAgent.php delete mode 100644 library/Zend/View/Interface.php delete mode 100644 library/Zend/View/Stream.php delete mode 100644 tests/Zend/View/AllTests.php delete mode 100644 tests/Zend/View/Helper/ActionTest.php delete mode 100644 tests/Zend/View/Helper/AllTests.php delete mode 100644 tests/Zend/View/Helper/AttributeJsEscapingTest.php delete mode 100644 tests/Zend/View/Helper/BaseUrlTest.php delete mode 100644 tests/Zend/View/Helper/CurrencyTest.php delete mode 100644 tests/Zend/View/Helper/CycleTest.php delete mode 100644 tests/Zend/View/Helper/DeclareVarsTest.php delete mode 100644 tests/Zend/View/Helper/DoctypeTest.php delete mode 100644 tests/Zend/View/Helper/FieldsetTest.php delete mode 100644 tests/Zend/View/Helper/FormButtonTest.php delete mode 100644 tests/Zend/View/Helper/FormCheckboxTest.php delete mode 100644 tests/Zend/View/Helper/FormErrorsTest.php delete mode 100644 tests/Zend/View/Helper/FormFileTest.php delete mode 100644 tests/Zend/View/Helper/FormImageTest.php delete mode 100644 tests/Zend/View/Helper/FormLabelTest.php delete mode 100644 tests/Zend/View/Helper/FormMultiCheckboxTest.php delete mode 100644 tests/Zend/View/Helper/FormPasswordTest.php delete mode 100644 tests/Zend/View/Helper/FormRadioTest.php delete mode 100644 tests/Zend/View/Helper/FormResetTest.php delete mode 100644 tests/Zend/View/Helper/FormSelectTest.php delete mode 100644 tests/Zend/View/Helper/FormSubmitTest.php delete mode 100644 tests/Zend/View/Helper/FormTest.php delete mode 100644 tests/Zend/View/Helper/FormTextTest.php delete mode 100644 tests/Zend/View/Helper/FormTextareaTest.php delete mode 100644 tests/Zend/View/Helper/GravatarTest.php delete mode 100644 tests/Zend/View/Helper/HeadLinkTest.php delete mode 100644 tests/Zend/View/Helper/HeadMetaTest.php delete mode 100644 tests/Zend/View/Helper/HeadScriptTest.php delete mode 100644 tests/Zend/View/Helper/HeadStyleTest.php delete mode 100644 tests/Zend/View/Helper/HeadTitleTest.php delete mode 100644 tests/Zend/View/Helper/HtmlFlashTest.php delete mode 100644 tests/Zend/View/Helper/HtmlListTest.php delete mode 100644 tests/Zend/View/Helper/HtmlObjectTest.php delete mode 100644 tests/Zend/View/Helper/HtmlPageTest.php delete mode 100644 tests/Zend/View/Helper/HtmlQuicktimeTest.php delete mode 100644 tests/Zend/View/Helper/InlineScriptTest.php delete mode 100644 tests/Zend/View/Helper/JsonTest.php delete mode 100644 tests/Zend/View/Helper/LayoutTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/AllTests.php delete mode 100644 tests/Zend/View/Helper/Navigation/BreadcrumbsTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/LinksTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/MenuTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/NavigationTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/SitemapTest.php delete mode 100644 tests/Zend/View/Helper/Navigation/TestAbstract.php delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/acl.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/default.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/linklast.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/maxdepth.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/partial.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/separator.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/bc/translated.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/accesskey.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/acl.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/acl_role_interface.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/acl_string.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/bothdepts.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/css.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/css_active.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/customhtmlattribs.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/default1.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/default2.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/expandbranch.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/expandbranch_onlyactivebranch.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/indent4.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/indent8.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/innerindent0.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/innerindent4.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/innerindent8.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/maxdepth.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/mindepth.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/normalize-id-prefix-with-content.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/normalize-id-prefix-with-null.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/normalize-id-prefix-without-content.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_bothdepts.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_maxdepth.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_mindepth.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_noparents.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_np_bd.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/onlyactivebranch_np_bd2.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/parentclass_bothdepts.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/parentclass_custom.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/parentclass_onlyactivebranch_bothdepts.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/parentclass_standard.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/partial.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/translated.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/menu/without_whitespace.html delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/acl.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/acl2.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/default1.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/default2.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/depth1.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/depth2.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/depth3.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/invalid.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/nodecl.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/serverurl1.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/serverurl2.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/expected/sitemap/without_whitespace.xml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/helpers/Menu.php delete mode 100644 tests/Zend/View/Helper/Navigation/_files/mvc/views/bc.phtml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/mvc/views/menu.phtml delete mode 100644 tests/Zend/View/Helper/Navigation/_files/navigation.xml delete mode 100644 tests/Zend/View/Helper/PaginationControlTest.php delete mode 100644 tests/Zend/View/Helper/PartialLoopTest.php delete mode 100644 tests/Zend/View/Helper/PartialTest.php delete mode 100644 tests/Zend/View/Helper/Placeholder/ContainerTest.php delete mode 100644 tests/Zend/View/Helper/Placeholder/RegistryTest.php delete mode 100644 tests/Zend/View/Helper/Placeholder/StandaloneContainerTest.php delete mode 100644 tests/Zend/View/Helper/PlaceholderTest.php delete mode 100644 tests/Zend/View/Helper/RenderToPlaceholderTest.php delete mode 100644 tests/Zend/View/Helper/ServerUrlTest.php delete mode 100644 tests/Zend/View/Helper/TranslateTest.php delete mode 100644 tests/Zend/View/Helper/UrlTest.php delete mode 100644 tests/Zend/View/Helper/UserAgentTest.php delete mode 100644 tests/Zend/View/Helper/_files/modules/default/controllers/ActionBarController.php delete mode 100644 tests/Zend/View/Helper/_files/modules/default/controllers/ActionFooController.php delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/action-bar/baz.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/action-foo/bar.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/action-foo/baz.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialActionCall.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialLoop.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialLoopCouter.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialLoopObject.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialObj.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialOne.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialThree.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/default/views/scripts/partialVars.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/controllers/BazController.php delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/controllers/FooController.php delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/baz/bar-one.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/baz/bar-three.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/baz/bar-two.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/foo/bar.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/foo/nest.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/foo/nested.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/partialLoop.phtml delete mode 100644 tests/Zend/View/Helper/_files/modules/foo/views/scripts/partialTwo.phtml delete mode 100644 tests/Zend/View/Helper/_files/scripts/rendertoplaceholderscript.phtml delete mode 100644 tests/Zend/View/Helper/_files/scripts/testPagination.phtml delete mode 100644 tests/Zend/View/_stubs/FilterDir1/Foo.php delete mode 100644 tests/Zend/View/_stubs/HelperDir1/Stub1.php delete mode 100644 tests/Zend/View/_stubs/HelperDir1/StubEmpty.php delete mode 100644 tests/Zend/View/_stubs/HelperDir2/Datetime.php delete mode 100644 tests/Zend/View/_stubs/HelperDir2/Stub1.php delete mode 100644 tests/Zend/View/_stubs/HelperDir2/Stub2.php delete mode 100644 tests/Zend/View/_stubs/scripts/LfiProtectionCheck.phtml delete mode 100644 tests/Zend/View/_templates/test.phtml delete mode 100644 tests/Zend/View/_templates/testParent.phtml delete mode 100644 tests/Zend/View/_templates/testStrictVars.phtml delete mode 100644 tests/Zend/View/_templates/testSubTemplate.phtml delete mode 100644 tests/Zend/View/_templates/testZf995.phtml delete mode 100644 tests/Zend/ViewTest.php diff --git a/library/Zend/View.php b/library/Zend/View.php deleted file mode 100644 index 25b4ba912f..0000000000 --- a/library/Zend/View.php +++ /dev/null @@ -1,160 +0,0 @@ -\n") - * @method string formNote($name, $value = null) - * @method string formPassword($name, $value = null, $attribs = null) - * @method string formRadio($name, $value = null, $attribs = null, $options = null, $listsep = "
    \n") - * @method string formReset($name = '', $value = 'Reset', $attribs = null) - * @method string formSelect($name, $value = null, $attribs = null, $options = null, $listsep = "
    \n") - * @method string formSubmit($name, $value = null, $attribs = null) - * @method string formText($name, $value = null, $attribs = null) - * @method string formTextarea($name, $value = null, $attribs = null) - * @method Zend_View_Helper_Gravatar gravatar($email = "", $options = array(), $attribs = array()) - * @method Zend_View_Helper_HeadLink headLink(array $attributes = null, $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) - * @method Zend_View_Helper_HeadMeta headMeta($content = null, $keyValue = null, $keyType = 'name', $modifiers = array(), $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) - * @method Zend_View_Helper_HeadScript headScript($mode = Zend_View_Helper_HeadScript::FILE, $spec = null, $placement = 'APPEND', array $attrs = array(), $type = 'text/javascript') - * @method Zend_View_Helper_HeadStyle headStyle($content = null, $placement = 'APPEND', $attributes = array()) - * @method Zend_View_Helper_HeadTitle headTitle($title = null, $setType = null) - * @method string htmlFlash($data, array $attribs = array(), array $params = array(), $content = null) - * @method string htmlList(array $items, $ordered = false, $attribs = false, $escape = true) - * @method string htmlObject($data, $type, array $attribs = array(), array $params = array(), $content = null) - * @method string htmlPage($data, array $attribs = array(), array $params = array(), $content = null) - * @method string htmlQuicktime($data, array $attribs = array(), array $params = array(), $content = null) - * @method Zend_View_Helper_InlineScript inlineScript($mode = Zend_View_Helper_HeadScript::FILE, $spec = null, $placement = 'APPEND', array $attrs = array(), $type = 'text/javascript') - * @method string|void json($data, $keepLayouts = false, $encodeData = true) - * @method Zend_View_Helper_Layout layout() - * @method Zend_View_Helper_Navigation navigation(Zend_Navigation_Container $container = null) - * @method string paginationControl(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null) - * @method string partial($name = null, $module = null, $model = null) - * @method string partialLoop($name = null, $module = null, $model = null) - * @method Zend_View_Helper_Placeholder_Container_Abstract placeholder($name) - * @method void renderToPlaceholder($script, $placeholder) - * @method string serverUrl($requestUri = null) - * @method string translate($messageid = null) - * @method string url(array $urlOptions = array(), $name = null, $reset = false, $encode = true) - * @method Zend_Http_UserAgent userAgent(Zend_Http_UserAgent $userAgent = null) - */ -class Zend_View extends Zend_View_Abstract -{ - /** - * Whether or not to use streams to mimic short tags - * @var bool - */ - private $_useViewStream = false; - - /** - * Whether or not to use stream wrapper if short_open_tag is false - * @var bool - */ - private $_useStreamWrapper = false; - - /** - * Constructor - * - * Register Zend_View_Stream stream wrapper if short tags are disabled. - * - * @param array $config - * @return void - */ - public function __construct($config = array()) - { - $this->_useViewStream = (bool) ini_get('short_open_tag') ? false : true; - if ($this->_useViewStream) { - if (!in_array('zend.view', stream_get_wrappers())) { - #require_once 'Zend/View/Stream.php'; - stream_wrapper_register('zend.view', 'Zend_View_Stream'); - } - } - - if (array_key_exists('useStreamWrapper', $config)) { - $this->setUseStreamWrapper($config['useStreamWrapper']); - } - - parent::__construct($config); - } - - /** - * Set flag indicating if stream wrapper should be used if short_open_tag is off - * - * @param bool $flag - * @return Zend_View - */ - public function setUseStreamWrapper($flag) - { - $this->_useStreamWrapper = (bool) $flag; - return $this; - } - - /** - * Should the stream wrapper be used if short_open_tag is off? - * - * @return bool - */ - public function useStreamWrapper() - { - return $this->_useStreamWrapper; - } - - /** - * Includes the view script in a scope with only public $this variables. - * - * @param string The view script to execute. - */ - protected function _run() - { - if ($this->_useViewStream && $this->useStreamWrapper()) { - include 'zend.view://' . func_get_arg(0); - } else { - include func_get_arg(0); - } - } -} diff --git a/library/Zend/View/Abstract.php b/library/Zend/View/Abstract.php deleted file mode 100644 index e36c0f8a17..0000000000 --- a/library/Zend/View/Abstract.php +++ /dev/null @@ -1,1200 +0,0 @@ - array(), - 'helper' => array(), - 'filter' => array(), - ); - - /** - * Script file name to execute - * - * @var string - */ - private $_file = null; - - /** - * Instances of helper objects. - * - * @var array - */ - private $_helper = array(); - - /** - * Map of helper => class pairs to help in determining helper class from - * name - * @var array - */ - private $_helperLoaded = array(); - - /** - * Map of helper => classfile pairs to aid in determining helper classfile - * @var array - */ - private $_helperLoadedDir = array(); - - /** - * Stack of Zend_View_Filter names to apply as filters. - * @var array - */ - private $_filter = array(); - - /** - * Stack of Zend_View_Filter objects that have been loaded - * @var array - */ - private $_filterClass = array(); - - /** - * Map of filter => class pairs to help in determining filter class from - * name - * @var array - */ - private $_filterLoaded = array(); - - /** - * Map of filter => classfile pairs to aid in determining filter classfile - * @var array - */ - private $_filterLoadedDir = array(); - - /** - * Callback for escaping. - * - * @var string - */ - private $_escape = 'htmlspecialchars'; - - /** - * Encoding to use in escaping mechanisms; defaults to utf-8 - * @var string - */ - private $_encoding = 'UTF-8'; - - /** - * Flag indicating whether or not LFI protection for rendering view scripts is enabled - * @var bool - */ - private $_lfiProtectionOn = true; - - /** - * Plugin loaders - * @var array - */ - private $_loaders = array(); - - /** - * Plugin types - * @var array - */ - private $_loaderTypes = array('filter', 'helper'); - - /** - * Strict variables flag; when on, undefined variables accessed in the view - * scripts will trigger notices - * @var boolean - */ - private $_strictVars = false; - - /** - * Constructor. - * - * @param array $config Configuration key-value pairs. - */ - public function __construct($config = array()) - { - // set inital paths and properties - $this->setScriptPath(null); - - // $this->setHelperPath(null); - $this->setFilterPath(null); - - // user-defined escaping callback - if (array_key_exists('escape', $config)) { - $this->setEscape($config['escape']); - } - - // encoding - if (array_key_exists('encoding', $config)) { - $this->setEncoding($config['encoding']); - } - - // base path - if (array_key_exists('basePath', $config)) { - $prefix = 'Zend_View'; - if (array_key_exists('basePathPrefix', $config)) { - $prefix = $config['basePathPrefix']; - } - $this->setBasePath($config['basePath'], $prefix); - } - - // user-defined view script path - if (array_key_exists('scriptPath', $config)) { - $this->addScriptPath($config['scriptPath']); - } - - // user-defined helper path - if (array_key_exists('helperPath', $config)) { - if (is_array($config['helperPath'])) { - foreach ($config['helperPath'] as $prefix => $path) { - $this->addHelperPath($path, $prefix); - } - } else { - $prefix = 'Zend_View_Helper'; - if (array_key_exists('helperPathPrefix', $config)) { - $prefix = $config['helperPathPrefix']; - } - $this->addHelperPath($config['helperPath'], $prefix); - } - } - - // user-defined filter path - if (array_key_exists('filterPath', $config)) { - if (is_array($config['filterPath'])) { - foreach ($config['filterPath'] as $prefix => $path) { - $this->addFilterPath($path, $prefix); - } - } else { - $prefix = 'Zend_View_Filter'; - if (array_key_exists('filterPathPrefix', $config)) { - $prefix = $config['filterPathPrefix']; - } - $this->addFilterPath($config['filterPath'], $prefix); - } - } - - // user-defined filters - if (array_key_exists('filter', $config)) { - $this->addFilter($config['filter']); - } - - // strict vars - if (array_key_exists('strictVars', $config)) { - $this->strictVars($config['strictVars']); - } - - // LFI protection flag - if (array_key_exists('lfiProtectionOn', $config)) { - $this->setLfiProtection($config['lfiProtectionOn']); - } - - if (array_key_exists('assign', $config) - && is_array($config['assign']) - ) { - foreach ($config['assign'] as $key => $value) { - $this->assign($key, $value); - } - } - - $this->init(); - } - - /** - * Return the template engine object - * - * Returns the object instance, as it is its own template engine - * - * @return Zend_View_Abstract - */ - public function getEngine() - { - return $this; - } - - /** - * Allow custom object initialization when extending Zend_View_Abstract or - * Zend_View - * - * Triggered by {@link __construct() the constructor} as its final action. - * - * @return void - */ - public function init() - { - } - - /** - * Prevent E_NOTICE for nonexistent values - * - * If {@link strictVars()} is on, raises a notice. - * - * @param string $key - * @return null - */ - public function __get($key) - { - if ($this->_strictVars) { - trigger_error('Key "' . $key . '" does not exist', E_USER_NOTICE); - } - - return null; - } - - /** - * Allows testing with empty() and isset() to work inside - * templates. - * - * @param string $key - * @return boolean - */ - public function __isset($key) - { - if ('_' != substr($key, 0, 1)) { - return isset($this->$key); - } - - return false; - } - - /** - * Directly assigns a variable to the view script. - * - * Checks first to ensure that the caller is not attempting to set a - * protected or private member (by checking for a prefixed underscore); if - * not, the public member is set; otherwise, an exception is raised. - * - * @param string $key The variable name. - * @param mixed $val The variable value. - * @return void - * @throws Zend_View_Exception if an attempt to set a private or protected - * member is detected - */ - public function __set($key, $val) - { - if ('_' != substr($key, 0, 1)) { - $this->$key = $val; - return; - } - - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Setting private or protected class members is not allowed'); - $e->setView($this); - throw $e; - } - - /** - * Allows unset() on object properties to work - * - * @param string $key - * @return void - */ - public function __unset($key) - { - if ('_' != substr($key, 0, 1) && isset($this->$key)) { - unset($this->$key); - } - } - - /** - * Accesses a helper object from within a script. - * - * If the helper class has a 'view' property, sets it with the current view - * object. - * - * @param string $name The helper name. - * @param array $args The parameters for the helper. - * @return string The result of the helper output. - */ - public function __call($name, $args) - { - // is the helper already loaded? - $helper = $this->getHelper($name); - - // call the helper method - return call_user_func_array( - array($helper, $name), - $args - ); - } - - /** - * Given a base path, sets the script, helper, and filter paths relative to it - * - * Assumes a directory structure of: - * - * basePath/ - * scripts/ - * helpers/ - * filters/ - * - * - * @param string $path - * @param string $prefix Prefix to use for helper and filter paths - * @return Zend_View_Abstract - */ - public function setBasePath($path, $classPrefix = 'Zend_View') - { - $path = rtrim($path, '/'); - $path = rtrim($path, '\\'); - $path .= DIRECTORY_SEPARATOR; - $classPrefix = rtrim($classPrefix, '_') . '_'; - $this->setScriptPath($path . 'scripts'); - $this->setHelperPath($path . 'helpers', $classPrefix . 'Helper'); - $this->setFilterPath($path . 'filters', $classPrefix . 'Filter'); - return $this; - } - - /** - * Given a base path, add script, helper, and filter paths relative to it - * - * Assumes a directory structure of: - * - * basePath/ - * scripts/ - * helpers/ - * filters/ - * - * - * @param string $path - * @param string $prefix Prefix to use for helper and filter paths - * @return Zend_View_Abstract - */ - public function addBasePath($path, $classPrefix = 'Zend_View') - { - $path = rtrim($path, '/'); - $path = rtrim($path, '\\'); - $path .= DIRECTORY_SEPARATOR; - $classPrefix = rtrim($classPrefix, '_') . '_'; - $this->addScriptPath($path . 'scripts'); - $this->addHelperPath($path . 'helpers', $classPrefix . 'Helper'); - $this->addFilterPath($path . 'filters', $classPrefix . 'Filter'); - return $this; - } - - /** - * Adds to the stack of view script paths in LIFO order. - * - * @param string|array The directory (-ies) to add. - * @return Zend_View_Abstract - */ - public function addScriptPath($path) - { - $this->_addPath('script', $path); - return $this; - } - - /** - * Resets the stack of view script paths. - * - * To clear all paths, use Zend_View::setScriptPath(null). - * - * @param string|array The directory (-ies) to set as the path. - * @return Zend_View_Abstract - */ - public function setScriptPath($path) - { - $this->_path['script'] = array(); - $this->_addPath('script', $path); - return $this; - } - - /** - * Return full path to a view script specified by $name - * - * @param string $name - * @return false|string False if script not found - * @throws Zend_View_Exception if no script directory set - */ - public function getScriptPath($name) - { - try { - $path = $this->_script($name); - return $path; - } catch (Zend_View_Exception $e) { - if (strstr($e->getMessage(), 'no view script directory set')) { - throw $e; - } - - return false; - } - } - - /** - * Returns an array of all currently set script paths - * - * @return array - */ - public function getScriptPaths() - { - return $this->_getPaths('script'); - } - - /** - * Set plugin loader for a particular plugin type - * - * @param Zend_Loader_PluginLoader $loader - * @param string $type - * @return Zend_View_Abstract - */ - public function setPluginLoader(Zend_Loader_PluginLoader $loader, $type) - { - $type = strtolower($type); - if (!in_array($type, $this->_loaderTypes)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Invalid plugin loader type "%s"', $type)); - $e->setView($this); - throw $e; - } - - $this->_loaders[$type] = $loader; - return $this; - } - - /** - * Retrieve plugin loader for a specific plugin type - * - * @param string $type - * @return Zend_Loader_PluginLoader - */ - public function getPluginLoader($type) - { - $type = strtolower($type); - if (!in_array($type, $this->_loaderTypes)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Invalid plugin loader type "%s"; cannot retrieve', $type)); - $e->setView($this); - throw $e; - } - - if (!array_key_exists($type, $this->_loaders)) { - $prefix = 'Zend_View_'; - $pathPrefix = 'Zend/View/'; - - $pType = ucfirst($type); - switch ($type) { - case 'filter': - case 'helper': - default: - $prefix .= $pType; - $pathPrefix .= $pType; - $loader = new Zend_Loader_PluginLoader(array( - $prefix => $pathPrefix - )); - $this->_loaders[$type] = $loader; - break; - } - } - return $this->_loaders[$type]; - } - - /** - * Adds to the stack of helper paths in LIFO order. - * - * @param string|array The directory (-ies) to add. - * @param string $classPrefix Class prefix to use with classes in this - * directory; defaults to Zend_View_Helper - * @return Zend_View_Abstract - */ - public function addHelperPath($path, $classPrefix = 'Zend_View_Helper_') - { - return $this->_addPluginPath('helper', $classPrefix, (array) $path); - } - - /** - * Resets the stack of helper paths. - * - * To clear all paths, use Zend_View::setHelperPath(null). - * - * @param string|array $path The directory (-ies) to set as the path. - * @param string $classPrefix The class prefix to apply to all elements in - * $path; defaults to Zend_View_Helper - * @return Zend_View_Abstract - */ - public function setHelperPath($path, $classPrefix = 'Zend_View_Helper_') - { - unset($this->_loaders['helper']); - return $this->addHelperPath($path, $classPrefix); - } - - /** - * Get full path to a helper class file specified by $name - * - * @param string $name - * @return string|false False on failure, path on success - */ - public function getHelperPath($name) - { - return $this->_getPluginPath('helper', $name); - } - - /** - * Returns an array of all currently set helper paths - * - * @return array - */ - public function getHelperPaths() - { - return $this->getPluginLoader('helper')->getPaths(); - } - - /** - * Registers a helper object, bypassing plugin loader - * - * @param Zend_View_Helper_Abstract|object $helper - * @param string $name - * @return Zend_View_Abstract - * @throws Zend_View_Exception - */ - public function registerHelper($helper, $name) - { - if (!is_object($helper)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('View helper must be an object'); - $e->setView($this); - throw $e; - } - - if (!$helper instanceof Zend_View_Interface) { - if (!method_exists($helper, $name)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception( - 'View helper must implement Zend_View_Interface or have a method matching the name provided' - ); - $e->setView($this); - throw $e; - } - } - - if (method_exists($helper, 'setView')) { - $helper->setView($this); - } - - $name = ucfirst($name); - $this->_helper[$name] = $helper; - return $this; - } - - /** - * Get a helper by name - * - * @param string $name - * @return object - */ - public function getHelper($name) - { - return $this->_getPlugin('helper', $name); - } - - /** - * Get array of all active helpers - * - * Only returns those that have already been instantiated. - * - * @return array - */ - public function getHelpers() - { - return $this->_helper; - } - - /** - * Adds to the stack of filter paths in LIFO order. - * - * @param string|array The directory (-ies) to add. - * @param string $classPrefix Class prefix to use with classes in this - * directory; defaults to Zend_View_Filter - * @return Zend_View_Abstract - */ - public function addFilterPath($path, $classPrefix = 'Zend_View_Filter_') - { - return $this->_addPluginPath('filter', $classPrefix, (array) $path); - } - - /** - * Resets the stack of filter paths. - * - * To clear all paths, use Zend_View::setFilterPath(null). - * - * @param string|array The directory (-ies) to set as the path. - * @param string $classPrefix The class prefix to apply to all elements in - * $path; defaults to Zend_View_Filter - * @return Zend_View_Abstract - */ - public function setFilterPath($path, $classPrefix = 'Zend_View_Filter_') - { - unset($this->_loaders['filter']); - return $this->addFilterPath($path, $classPrefix); - } - - /** - * Get full path to a filter class file specified by $name - * - * @param string $name - * @return string|false False on failure, path on success - */ - public function getFilterPath($name) - { - return $this->_getPluginPath('filter', $name); - } - - /** - * Get a filter object by name - * - * @param string $name - * @return object - */ - public function getFilter($name) - { - return $this->_getPlugin('filter', $name); - } - - /** - * Return array of all currently active filters - * - * Only returns those that have already been instantiated. - * - * @return array - */ - public function getFilters() - { - return $this->_filter; - } - - /** - * Returns an array of all currently set filter paths - * - * @return array - */ - public function getFilterPaths() - { - return $this->getPluginLoader('filter')->getPaths(); - } - - /** - * Return associative array of path types => paths - * - * @return array - */ - public function getAllPaths() - { - $paths = $this->_path; - $paths['helper'] = $this->getHelperPaths(); - $paths['filter'] = $this->getFilterPaths(); - return $paths; - } - - /** - * Add one or more filters to the stack in FIFO order. - * - * @param string|array One or more filters to add. - * @return Zend_View_Abstract - */ - public function addFilter($name) - { - foreach ((array) $name as $val) { - $this->_filter[] = $val; - } - return $this; - } - - /** - * Resets the filter stack. - * - * To clear all filters, use Zend_View::setFilter(null). - * - * @param string|array One or more filters to set. - * @return Zend_View_Abstract - */ - public function setFilter($name) - { - $this->_filter = array(); - $this->addFilter($name); - return $this; - } - - /** - * Sets the _escape() callback. - * - * @param mixed $spec The callback for _escape() to use. - * @return Zend_View_Abstract - */ - public function setEscape($spec) - { - $this->_escape = $spec; - return $this; - } - - /** - * Set LFI protection flag - * - * @param bool $flag - * @return Zend_View_Abstract - */ - public function setLfiProtection($flag) - { - $this->_lfiProtectionOn = (bool) $flag; - return $this; - } - - /** - * Return status of LFI protection flag - * - * @return bool - */ - public function isLfiProtectionOn() - { - return $this->_lfiProtectionOn; - } - - /** - * Assigns variables to the view script via differing strategies. - * - * Zend_View::assign('name', $value) assigns a variable called 'name' - * with the corresponding $value. - * - * Zend_View::assign($array) assigns the array keys as variable - * names (with the corresponding array values). - * - * @see __set() - * @param string|array The assignment strategy to use. - * @param mixed (Optional) If assigning a named variable, use this - * as the value. - * @return Zend_View_Abstract Fluent interface - * @throws Zend_View_Exception if $spec is neither a string nor an array, - * or if an attempt to set a private or protected member is detected - */ - public function assign($spec, $value = null) - { - // which strategy to use? - if (is_string($spec)) { - // assign by name and value - if ('_' == substr($spec, 0, 1)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Setting private or protected class members is not allowed'); - $e->setView($this); - throw $e; - } - $this->$spec = $value; - } elseif (is_array($spec)) { - // assign from associative array - $error = false; - foreach ($spec as $key => $val) { - if ('_' == substr($key, 0, 1)) { - $error = true; - break; - } - $this->$key = $val; - } - if ($error) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Setting private or protected class members is not allowed'); - $e->setView($this); - throw $e; - } - } else { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('assign() expects a string or array, received ' . gettype($spec)); - $e->setView($this); - throw $e; - } - - return $this; - } - - /** - * Return list of all assigned variables - * - * Returns all public properties of the object. Reflection is not used - * here as testing reflection properties for visibility is buggy. - * - * @return array - */ - public function getVars() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ('_' == substr($key, 0, 1)) { - unset($vars[$key]); - } - } - - return $vars; - } - - /** - * Clear all assigned variables - * - * Clears all variables assigned to Zend_View either via {@link assign()} or - * property overloading ({@link __set()}). - * - * @return void - */ - public function clearVars() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ('_' != substr($key, 0, 1)) { - unset($this->$key); - } - } - } - - /** - * Processes a view script and returns the output. - * - * @param string $name The script name to process. - * @return string The script output. - */ - public function render($name) - { - // find the script file name using the parent private method - $this->_file = $this->_script($name); - unset($name); // remove $name from local scope - - ob_start(); - $this->_run($this->_file); - - return $this->_filter(ob_get_clean()); // filter output - } - - /** - * Escapes a value for output in a view script. - * - * If escaping mechanism is one of htmlspecialchars or htmlentities, uses - * {@link $_encoding} setting. - * - * @param mixed $var The output to escape. - * @return mixed The escaped value. - */ - public function escape($var) - { - if (in_array($this->_escape, array('htmlspecialchars', 'htmlentities'))) { - return call_user_func($this->_escape, $var, ENT_COMPAT, $this->_encoding); - } - - if (1 == func_num_args()) { - return call_user_func($this->_escape, $var); - } - $args = func_get_args(); - return call_user_func_array($this->_escape, $args); - } - - /** - * Set encoding to use with htmlentities() and htmlspecialchars() - * - * @param string $encoding - * @return Zend_View_Abstract - */ - public function setEncoding($encoding) - { - $this->_encoding = $encoding; - return $this; - } - - /** - * Return current escape encoding - * - * @return string - */ - public function getEncoding() - { - return $this->_encoding; - } - - /** - * Enable or disable strict vars - * - * If strict variables are enabled, {@link __get()} will raise a notice - * when a variable is not defined. - * - * Use in conjunction with {@link Zend_View_Helper_DeclareVars the declareVars() helper} - * to enforce strict variable handling in your view scripts. - * - * @param boolean $flag - * @return Zend_View_Abstract - */ - public function strictVars($flag = true) - { - $this->_strictVars = ($flag) ? true : false; - - return $this; - } - - /** - * Finds a view script from the available directories. - * - * @param string $name The base name of the script. - * @return void - */ - protected function _script($name) - { - if ($this->isLfiProtectionOn() && preg_match('#\.\.[\\\/]#', $name)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Requested scripts may not include parent directory traversal ("../", "..\\" notation)'); - $e->setView($this); - throw $e; - } - - if (0 == count($this->_path['script'])) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('no view script directory set; unable to determine location for view script'); - $e->setView($this); - throw $e; - } - - foreach ($this->_path['script'] as $dir) { - if (is_readable($dir . $name)) { - return $dir . $name; - } - } - - #require_once 'Zend/View/Exception.php'; - $message = "script '$name' not found in path (" - . implode(PATH_SEPARATOR, $this->_path['script']) - . ")"; - $e = new Zend_View_Exception($message); - $e->setView($this); - throw $e; - } - - /** - * Applies the filter callback to a buffer. - * - * @param string $buffer The buffer contents. - * @return string The filtered buffer. - */ - private function _filter($buffer) - { - // loop through each filter class - foreach ($this->_filter as $name) { - // load and apply the filter class - $filter = $this->getFilter($name); - $buffer = call_user_func(array($filter, 'filter'), $buffer); - } - - // done! - return $buffer; - } - - /** - * Adds paths to the path stack in LIFO order. - * - * Zend_View::_addPath($type, 'dirname') adds one directory - * to the path stack. - * - * Zend_View::_addPath($type, $array) adds one directory for - * each array element value. - * - * In the case of filter and helper paths, $prefix should be used to - * specify what class prefix to use with the given path. - * - * @param string $type The path type ('script', 'helper', or 'filter'). - * @param string|array $path The path specification. - * @param string $prefix Class prefix to use with path (helpers and filters - * only) - * @return void - */ - private function _addPath($type, $path, $prefix = null) - { - foreach ((array) $path as $dir) { - // attempt to strip any possible separator and - // append the system directory separator - $dir = rtrim($dir, '/'); - $dir = rtrim($dir, '\\'); - $dir .= '/'; - - switch ($type) { - case 'script': - // add to the top of the stack. - array_unshift($this->_path[$type], $dir); - break; - case 'filter': - case 'helper': - default: - // add as array with prefix and dir keys - array_unshift($this->_path[$type], array('prefix' => $prefix, 'dir' => $dir)); - break; - } - } - } - - /** - * Resets the path stack for helpers and filters. - * - * @param string $type The path type ('helper' or 'filter'). - * @param string|array $path The directory (-ies) to set as the path. - * @param string $classPrefix Class prefix to apply to elements of $path - */ - private function _setPath($type, $path, $classPrefix = null) - { - $dir = DIRECTORY_SEPARATOR . ucfirst($type) . DIRECTORY_SEPARATOR; - - switch ($type) { - case 'script': - $this->_path[$type] = array(dirname(__FILE__) . $dir); - $this->_addPath($type, $path); - break; - case 'filter': - case 'helper': - default: - $this->_path[$type] = array(array( - 'prefix' => 'Zend_View_' . ucfirst($type) . '_', - 'dir' => dirname(__FILE__) . $dir - )); - $this->_addPath($type, $path, $classPrefix); - break; - } - } - - /** - * Return all paths for a given path type - * - * @param string $type The path type ('helper', 'filter', 'script') - * @return array - */ - private function _getPaths($type) - { - return $this->_path[$type]; - } - - /** - * Register helper class as loaded - * - * @param string $name - * @param string $class - * @param string $file path to class file - * @return void - */ - private function _setHelperClass($name, $class, $file) - { - $this->_helperLoadedDir[$name] = $file; - $this->_helperLoaded[$name] = $class; - } - - /** - * Register filter class as loaded - * - * @param string $name - * @param string $class - * @param string $file path to class file - * @return void - */ - private function _setFilterClass($name, $class, $file) - { - $this->_filterLoadedDir[$name] = $file; - $this->_filterLoaded[$name] = $class; - } - - /** - * Add a prefixPath for a plugin type - * - * @param string $type - * @param string $classPrefix - * @param array $paths - * @return Zend_View_Abstract - */ - private function _addPluginPath($type, $classPrefix, array $paths) - { - $loader = $this->getPluginLoader($type); - foreach ($paths as $path) { - $loader->addPrefixPath($classPrefix, $path); - } - return $this; - } - - /** - * Get a path to a given plugin class of a given type - * - * @param string $type - * @param string $name - * @return string|false - */ - private function _getPluginPath($type, $name) - { - $loader = $this->getPluginLoader($type); - if ($loader->isLoaded($name)) { - return $loader->getClassPath($name); - } - - try { - $loader->load($name); - return $loader->getClassPath($name); - } catch (Zend_Loader_Exception $e) { - return false; - } - } - - /** - * Retrieve a plugin object - * - * @param string $type - * @param string $name - * @return object - */ - private function _getPlugin($type, $name) - { - $name = ucfirst($name); - switch ($type) { - case 'filter': - $storeVar = '_filterClass'; - $store = $this->_filterClass; - break; - case 'helper': - $storeVar = '_helper'; - $store = $this->_helper; - break; - } - - if (!isset($store[$name])) { - $class = $this->getPluginLoader($type)->load($name); - $store[$name] = new $class(); - if (method_exists($store[$name], 'setView')) { - $store[$name]->setView($this); - } - } - - $this->$storeVar = $store; - return $store[$name]; - } - - /** - * Use to include the view script in a scope that only allows public - * members. - * - * @return mixed - */ - abstract protected function _run(); -} diff --git a/library/Zend/View/Exception.php b/library/Zend/View/Exception.php deleted file mode 100644 index e5eb47f921..0000000000 --- a/library/Zend/View/Exception.php +++ /dev/null @@ -1,51 +0,0 @@ -view = $view; - return $this; - } - - public function getView() - { - return $this->view; - } -} diff --git a/library/Zend/View/Helper/Abstract.php b/library/Zend/View/Helper/Abstract.php deleted file mode 100644 index 7e5c5d624b..0000000000 --- a/library/Zend/View/Helper/Abstract.php +++ /dev/null @@ -1,64 +0,0 @@ -view = $view; - return $this; - } - - /** - * Strategy pattern: currently unutilized - * - * @return void - */ - public function direct() - { - } -} diff --git a/library/Zend/View/Helper/Action.php b/library/Zend/View/Helper/Action.php deleted file mode 100644 index 6a99486d29..0000000000 --- a/library/Zend/View/Helper/Action.php +++ /dev/null @@ -1,164 +0,0 @@ -getControllerDirectory(); - if (empty($modules)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Action helper depends on valid front controller instance'); - $e->setView($this->view); - throw $e; - } - - $request = $front->getRequest(); - $response = $front->getResponse(); - - if (empty($request) || empty($response)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Action view helper requires both a registered request and response object in the front controller instance'); - $e->setView($this->view); - throw $e; - } - - $this->request = clone $request; - $this->response = clone $response; - $this->dispatcher = clone $front->getDispatcher(); - $this->defaultModule = $front->getDefaultModule(); - } - - /** - * Reset object states - * - * @return void - */ - public function resetObjects() - { - $params = $this->request->getUserParams(); - foreach (array_keys($params) as $key) { - $this->request->setParam($key, null); - } - - $this->response->clearBody(); - $this->response->clearHeaders() - ->clearRawHeaders(); - } - - /** - * Retrieve rendered contents of a controller action - * - * If the action results in a forward or redirect, returns empty string. - * - * @param string $action - * @param string $controller - * @param string $module Defaults to default module - * @param array $params - * @return string - */ - public function action($action, $controller, $module = null, array $params = array()) - { - $this->resetObjects(); - if (null === $module) { - $module = $this->defaultModule; - } - - // clone the view object to prevent over-writing of view variables - $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj); - - $this->request->setParams($params) - ->setModuleName($module) - ->setControllerName($controller) - ->setActionName($action) - ->setDispatched(true); - - $this->dispatcher->dispatch($this->request, $this->response); - - // reset the viewRenderer object to it's original state - Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj); - - - if (!$this->request->isDispatched() - || $this->response->isRedirect()) - { - // forwards and redirects render nothing - return ''; - } - - $return = $this->response->getBody(); - $this->resetObjects(); - return $return; - } - - /** - * Clone the current View - * - * @return Zend_View_Interface - */ - public function cloneView() - { - $view = clone $this->view; - $view->clearVars(); - return $view; - } -} diff --git a/library/Zend/View/Helper/BaseUrl.php b/library/Zend/View/Helper/BaseUrl.php deleted file mode 100644 index 845a0486a3..0000000000 --- a/library/Zend/View/Helper/BaseUrl.php +++ /dev/null @@ -1,116 +0,0 @@ -getBaseUrl(); - - // Remove trailing slashes - if (null !== $file) { - $file = '/' . ltrim($file, '/\\'); - } - - return $baseUrl . $file; - } - - /** - * Set BaseUrl - * - * @param string $base - * @return Zend_View_Helper_BaseUrl - */ - public function setBaseUrl($base) - { - $this->_baseUrl = rtrim($base, '/\\'); - return $this; - } - - /** - * Get BaseUrl - * - * @return string - */ - public function getBaseUrl() - { - if ($this->_baseUrl === null) { - /** @see Zend_Controller_Front */ - #require_once 'Zend/Controller/Front.php'; - $baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); - - // Remove scriptname, eg. index.php from baseUrl - $baseUrl = $this->_removeScriptName($baseUrl); - - $this->setBaseUrl($baseUrl); - } - - return $this->_baseUrl; - } - - /** - * Remove Script filename from baseurl - * - * @param string $url - * @return string - */ - protected function _removeScriptName($url) - { - if (!isset($_SERVER['SCRIPT_NAME'])) { - // We can't do much now can we? (Well, we could parse out by ".") - return $url; - } - - if (($pos = strripos($url, basename($_SERVER['SCRIPT_NAME']))) !== false) { - $url = substr($url, 0, $pos); - } - - return $url; - } -} diff --git a/library/Zend/View/Helper/Currency.php b/library/Zend/View/Helper/Currency.php deleted file mode 100644 index 9cec1d9841..0000000000 --- a/library/Zend/View/Helper/Currency.php +++ /dev/null @@ -1,120 +0,0 @@ -setCurrency($currency); - } - - /** - * Output a formatted currency - * - * @param integer|float $value Currency value to output - * @param string|Zend_Locale|array $currency OPTIONAL Currency to use for - * this call - * @return string Formatted currency - */ - public function currency($value = null, $currency = null) - { - if ($value === null) { - return $this; - } - - if (is_string($currency) || ($currency instanceof Zend_Locale)) { - #require_once 'Zend/Locale.php'; - if (Zend_Locale::isLocale($currency)) { - $currency = array('locale' => $currency); - } - } - - if (is_string($currency)) { - $currency = array('currency' => $currency); - } - - if (is_array($currency)) { - return $this->_currency->toCurrency($value, $currency); - } - - return $this->_currency->toCurrency($value); - } - - /** - * Sets a currency to use - * - * @param Zend_Currency|String|Zend_Locale $currency Currency to use - * @throws Zend_View_Exception When no or a false currency was set - * @return Zend_View_Helper_Currency - */ - public function setCurrency($currency = null) - { - if (!$currency instanceof Zend_Currency) { - #require_once 'Zend/Currency.php'; - $currency = new Zend_Currency($currency); - } - $this->_currency = $currency; - - return $this; - } - - /** - * Retrieve currency object - * - * @return Zend_Currency|null - */ - public function getCurrency() - { - return $this->_currency; - } -} diff --git a/library/Zend/View/Helper/Cycle.php b/library/Zend/View/Helper/Cycle.php deleted file mode 100644 index eb5fd5132b..0000000000 --- a/library/Zend/View/Helper/Cycle.php +++ /dev/null @@ -1,225 +0,0 @@ --1) ; - - /** - * Array of values - * - * @var array - */ - protected $_data = array(self::DEFAULT_NAME=>array()); - - /** - * Actual name of cycle - * - * @var string - */ - protected $_name = self::DEFAULT_NAME; - - /** - * Add elements to alternate - * - * @param array $data - * @param string $name - * @return Zend_View_Helper_Cycle - */ - public function cycle(array $data = array(), $name = self::DEFAULT_NAME) - { - if(!empty($data)) - $this->_data[$name] = $data; - - $this->setName($name); - return $this; - } - - /** - * Add elements to alternate - * - * @param array $data - * @param string $name - * @return Zend_View_Helper_Cycle - */ - public function assign(Array $data , $name = self::DEFAULT_NAME) - { - $this->setName($name); - $this->_data[$name] = $data; - $this->rewind(); - return $this; - } - - /** - * Sets actual name of cycle - * - * @param string $name - * @return Zend_View_Helper_Cycle - */ - public function setName($name = self::DEFAULT_NAME) - { - $this->_name = $name; - - if(!isset($this->_data[$this->_name])) - $this->_data[$this->_name] = array(); - - if(!isset($this->_pointers[$this->_name])) - $this->rewind(); - - return $this; - } - - /** - * Gets actual name of cycle - * - * @return string - */ - public function getName() - { - return $this->_name; - } - - - /** - * Return all elements - * - * @return array - */ - public function getAll() - { - return $this->_data[$this->_name]; - } - - /** - * Turn helper into string - * - * @return string - */ - public function toString() - { - return (string) $this->_data[$this->_name][$this->key()]; - } - - /** - * Cast to string - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - - /** - * Move to next value - * - * @return Zend_View_Helper_Cycle - */ - public function next() - { - $count = count($this->_data[$this->_name]); - if ($this->_pointers[$this->_name] == ($count - 1)) - $this->_pointers[$this->_name] = 0; - else - $this->_pointers[$this->_name] = ++$this->_pointers[$this->_name]; - return $this; - } - - /** - * Move to previous value - * - * @return Zend_View_Helper_Cycle - */ - public function prev() - { - $count = count($this->_data[$this->_name]); - if ($this->_pointers[$this->_name] <= 0) - $this->_pointers[$this->_name] = $count - 1; - else - $this->_pointers[$this->_name] = --$this->_pointers[$this->_name]; - return $this; - } - - /** - * Return iteration number - * - * @return int - */ - public function key() - { - if ($this->_pointers[$this->_name] < 0) - return 0; - else - return $this->_pointers[$this->_name]; - } - - /** - * Rewind pointer - * - * @return Zend_View_Helper_Cycle - */ - public function rewind() - { - $this->_pointers[$this->_name] = -1; - return $this; - } - - /** - * Check if element is valid - * - * @return bool - */ - public function valid() - { - return isset($this->_data[$this->_name][$this->key()]); - } - - /** - * Return current element - * - * @return mixed - */ - public function current() - { - return $this->_data[$this->_name][$this->key()]; - } -} diff --git a/library/Zend/View/Helper/DeclareVars.php b/library/Zend/View/Helper/DeclareVars.php deleted file mode 100644 index 330c40a5e9..0000000000 --- a/library/Zend/View/Helper/DeclareVars.php +++ /dev/null @@ -1,95 +0,0 @@ - - * $this->declareVars( - * 'varName1', - * 'varName2', - * array('varName3' => 'defaultValue', - * 'varName4' => array() - * ) - * ); - * - * - * @param string|array variable number of arguments, all string names of variables to test - * @return void - */ - public function declareVars() - { - $args = func_get_args(); - foreach($args as $key) { - if (is_array($key)) { - foreach ($key as $name => $value) { - $this->_declareVar($name, $value); - } - } else if (!isset($view->$key)) { - $this->_declareVar($key); - } - } - } - - /** - * Set a view variable - * - * Checks to see if a $key is set in the view object; if not, sets it to $value. - * - * @param string $key - * @param string $value Defaults to an empty string - * @return void - */ - protected function _declareVar($key, $value = '') - { - if (!isset($this->view->$key)) { - $this->view->$key = $value; - } - } -} diff --git a/library/Zend/View/Helper/Doctype.php b/library/Zend/View/Helper/Doctype.php deleted file mode 100644 index 854ba16efb..0000000000 --- a/library/Zend/View/Helper/Doctype.php +++ /dev/null @@ -1,242 +0,0 @@ -_regKey)) { - $this->_registry = new ArrayObject(array( - 'doctypes' => array( - self::XHTML11 => '', - self::XHTML1_STRICT => '', - self::XHTML1_TRANSITIONAL => '', - self::XHTML1_FRAMESET => '', - self::XHTML1_RDFA => '', - self::XHTML1_RDFA11 => '', - self::XHTML_BASIC1 => '', - self::XHTML5 => '', - self::HTML4_STRICT => '', - self::HTML4_LOOSE => '', - self::HTML4_FRAMESET => '', - self::HTML5 => '', - ) - )); - Zend_Registry::set($this->_regKey, $this->_registry); - $this->setDoctype($this->_defaultDoctype); - } else { - $this->_registry = Zend_Registry::get($this->_regKey); - } - } - - /** - * Set or retrieve doctype - * - * @param string $doctype - * @return Zend_View_Helper_Doctype - */ - public function doctype($doctype = null) - { - if (null !== $doctype) { - switch ($doctype) { - case self::XHTML11: - case self::XHTML1_STRICT: - case self::XHTML1_TRANSITIONAL: - case self::XHTML1_FRAMESET: - case self::XHTML_BASIC1: - case self::XHTML1_RDFA: - case self::XHTML1_RDFA11: - case self::XHTML5: - case self::HTML4_STRICT: - case self::HTML4_LOOSE: - case self::HTML4_FRAMESET: - case self::HTML5: - $this->setDoctype($doctype); - break; - default: - if (substr($doctype, 0, 9) != 'setView($this->view); - throw $e; - } - if (stristr($doctype, 'xhtml')) { - $type = self::CUSTOM_XHTML; - } else { - $type = self::CUSTOM; - } - $this->setDoctype($type); - $this->_registry['doctypes'][$type] = $doctype; - break; - } - } - - return $this; - } - - /** - * Set doctype - * - * @param string $doctype - * @return Zend_View_Helper_Doctype - */ - public function setDoctype($doctype) - { - $this->_registry['doctype'] = $doctype; - return $this; - } - - /** - * Retrieve doctype - * - * @return string - */ - public function getDoctype() - { - return $this->_registry['doctype']; - } - - /** - * Get doctype => string mappings - * - * @return array - */ - public function getDoctypes() - { - return $this->_registry['doctypes']; - } - - /** - * Is doctype XHTML? - * - * @return boolean - */ - public function isXhtml() - { - return (stristr($this->getDoctype(), 'xhtml') ? true : false); - } - - /** - * Is doctype strict? - * - * @return boolean - */ - public function isStrict() - { - switch ( $this->getDoctype() ) - { - case self::XHTML1_STRICT: - case self::XHTML11: - case self::HTML4_STRICT: - return true; - default: - return false; - } - } - - /** - * Is doctype HTML5? (HeadMeta uses this for validation) - * - * @return booleean - */ - public function isHtml5() { - return (stristr($this->doctype(), '') ? true : false); - } - - /** - * Is doctype RDFa? - * - * @return booleean - */ - public function isRdfa() { - return (stristr($this->getDoctype(), 'rdfa') ? true : false); - } - - /** - * String representation of doctype - * - * @return string - */ - public function __toString() - { - $doctypes = $this->getDoctypes(); - return $doctypes[$this->getDoctype()]; - } -} diff --git a/library/Zend/View/Helper/Fieldset.php b/library/Zend/View/Helper/Fieldset.php deleted file mode 100644 index 48ce9c6e86..0000000000 --- a/library/Zend/View/Helper/Fieldset.php +++ /dev/null @@ -1,79 +0,0 @@ -_getInfo($name, $content, $attribs); - extract($info); - - // get legend - $legend = ''; - if (isset($attribs['legend'])) { - $legendString = trim($attribs['legend']); - if (!empty($legendString)) { - $legend = '' - . (($escape) ? $this->view->escape($legendString) : $legendString) - . '' . PHP_EOL; - } - unset($attribs['legend']); - } - - // get id - if (!empty($id)) { - $id = ' id="' . $this->view->escape($id) . '"'; - } else { - $id = ''; - } - - // render fieldset - $xhtml = '_htmlAttribs($attribs) - . '>' - . $legend - . $content - . ''; - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/Form.php b/library/Zend/View/Helper/Form.php deleted file mode 100644 index d0910db734..0000000000 --- a/library/Zend/View/Helper/Form.php +++ /dev/null @@ -1,86 +0,0 @@ -_getInfo($name, $content, $attribs); - extract($info); - - if (!empty($id)) { - $id = ' id="' . $this->view->escape($id) . '"'; - } else { - $id = ''; - } - - if (array_key_exists('id', $attribs) && empty($attribs['id'])) { - unset($attribs['id']); - } - - if (!empty($name) && !($this->_isXhtml() && $this->_isStrictDoctype())) { - $name = ' name="' . $this->view->escape($name) . '"'; - } else { - $name = ''; - } - - if ($this->_isHtml5() && array_key_exists('action', $attribs) && !$attribs['action']) { - unset($attribs['action']); - } - - if ( array_key_exists('name', $attribs) && empty($attribs['id'])) { - unset($attribs['id']); - } - - $xhtml = '_htmlAttribs($attribs) - . '>'; - - if (false !== $content) { - $xhtml .= $content - . ''; - } - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormButton.php b/library/Zend/View/Helper/FormButton.php deleted file mode 100644 index 605aefbb30..0000000000 --- a/library/Zend/View/Helper/FormButton.php +++ /dev/null @@ -1,105 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, id, value, attribs, options, listsep, disable, escape - - // Get content - $content = ''; - if (isset($attribs['content'])) { - $content = $attribs['content']; - unset($attribs['content']); - } else { - $content = $value; - } - - // Ensure type is sane - $type = 'button'; - if (isset($attribs['type'])) { - $attribs['type'] = strtolower($attribs['type']); - if (in_array($attribs['type'], array('submit', 'reset', 'button'))) { - $type = $attribs['type']; - } - unset($attribs['type']); - } - - // build the element - if ($disable) { - $attribs['disabled'] = 'disabled'; - } - - $content = ($escape) ? $this->view->escape($content) : $content; - - $xhtml = 'view->escape($value) . '"'; - } - - // add attributes and close start tag - $xhtml .= $this->_htmlAttribs($attribs) . '>'; - - // add content and end tag - $xhtml .= $content . ''; - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormCheckbox.php b/library/Zend/View/Helper/FormCheckbox.php deleted file mode 100644 index c0392263e5..0000000000 --- a/library/Zend/View/Helper/FormCheckbox.php +++ /dev/null @@ -1,164 +0,0 @@ - '1', - 'uncheckedValue' => '0' - ); - - /** - * Generates a 'checkbox' element. - * - * @access public - * - * @param string|array $name If a string, the element name. If an - * array, all other parameters are ignored, and the array elements - * are extracted in place of added parameters. - * @param mixed $value The element value. - * @param array $attribs Attributes for the element tag. - * @return string The element XHTML. - */ - public function formCheckbox($name, $value = null, $attribs = null, array $checkedOptions = null) - { - $info = $this->_getInfo($name, $value, $attribs); - extract($info); // name, id, value, attribs, options, listsep, disable - - $checked = false; - if (isset($attribs['checked']) && $attribs['checked']) { - $checked = true; - unset($attribs['checked']); - } elseif (isset($attribs['checked'])) { - $checked = false; - unset($attribs['checked']); - } - - $checkedOptions = self::determineCheckboxInfo($value, $checked, $checkedOptions); - - // is the element disabled? - $disabled = ''; - if ($disable) { - $disabled = ' disabled="disabled"'; - } - - // build the element - $xhtml = ''; - if ((!$disable && !strstr($name, '[]')) - && (empty($attribs['disableHidden']) || !$attribs['disableHidden']) - ) { - $xhtml = $this->_hidden($name, $checkedOptions['uncheckedValue']); - } - - if (array_key_exists('disableHidden', $attribs)) { - unset($attribs['disableHidden']); - } - - $xhtml .= '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } - - /** - * Determine checkbox information - * - * @param string $value - * @param bool $checked - * @param array|null $checkedOptions - * @return array - */ - public static function determineCheckboxInfo($value, $checked, array $checkedOptions = null) - { - // Checked/unchecked values - $checkedValue = null; - $uncheckedValue = null; - if (is_array($checkedOptions)) { - if (array_key_exists('checkedValue', $checkedOptions)) { - $checkedValue = (string) $checkedOptions['checkedValue']; - unset($checkedOptions['checkedValue']); - } - if (array_key_exists('uncheckedValue', $checkedOptions)) { - $uncheckedValue = (string) $checkedOptions['uncheckedValue']; - unset($checkedOptions['uncheckedValue']); - } - if (null === $checkedValue) { - $checkedValue = (string) array_shift($checkedOptions); - } - if (null === $uncheckedValue) { - $uncheckedValue = (string) array_shift($checkedOptions); - } - } elseif ($value !== null) { - $uncheckedValue = self::$_defaultCheckedOptions['uncheckedValue']; - } else { - $checkedValue = self::$_defaultCheckedOptions['checkedValue']; - $uncheckedValue = self::$_defaultCheckedOptions['uncheckedValue']; - } - - // is the element checked? - $checkedString = ''; - if ($checked || ((string) $value === $checkedValue)) { - $checkedString = ' checked="checked"'; - $checked = true; - } else { - $checked = false; - } - - // Checked value should be value if no checked options provided - if ($checkedValue == null) { - $checkedValue = $value; - } - - return array( - 'checked' => $checked, - 'checkedString' => $checkedString, - 'checkedValue' => $checkedValue, - 'uncheckedValue' => $uncheckedValue, - ); - } -} diff --git a/library/Zend/View/Helper/FormElement.php b/library/Zend/View/Helper/FormElement.php deleted file mode 100644 index 980e345527..0000000000 --- a/library/Zend/View/Helper/FormElement.php +++ /dev/null @@ -1,204 +0,0 @@ -_translator; - } - - /** - * Set translator - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator - * @return Zend_View_Helper_FormElement - */ - public function setTranslator($translator = null) - { - if (null === $translator) { - $this->_translator = null; - } elseif ($translator instanceof Zend_Translate_Adapter) { - $this->_translator = $translator; - } elseif ($translator instanceof Zend_Translate) { - $this->_translator = $translator->getAdapter(); - } else { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid translator specified'); - $e->setView($this->view); - throw $e; - } - return $this; - } - - /** - * Converts parameter arguments to an element info array. - * - * E.g, formExample($name, $value, $attribs, $options, $listsep) is - * the same thing as formExample(array('name' => ...)). - * - * Note that you cannot pass a 'disable' param; you need to pass - * it as an 'attribs' key. - * - * @access protected - * - * @return array An element info array with keys for name, value, - * attribs, options, listsep, disable, and escape. - */ - protected function _getInfo($name, $value = null, $attribs = null, - $options = null, $listsep = null - ) { - // the baseline info. note that $name serves a dual purpose; - // if an array, it's an element info array that will override - // these baseline values. as such, ignore it for the 'name' - // if it's an array. - $info = array( - 'name' => is_array($name) ? '' : $name, - 'id' => is_array($name) ? '' : $name, - 'value' => $value, - 'attribs' => $attribs, - 'options' => $options, - 'listsep' => $listsep, - 'disable' => false, - 'escape' => true, - ); - - // override with named args - if (is_array($name)) { - // only set keys that are already in info - foreach ($info as $key => $val) { - if (isset($name[$key])) { - $info[$key] = $name[$key]; - } - } - - // If all helper options are passed as an array, attribs may have - // been as well - if (null === $attribs) { - $attribs = $info['attribs']; - } - } - - $attribs = (array)$attribs; - - // Normalize readonly tag - if (array_key_exists('readonly', $attribs)) { - $attribs['readonly'] = 'readonly'; - } - - // Disable attribute - if (array_key_exists('disable', $attribs)) { - if (is_scalar($attribs['disable'])) { - // disable the element - $info['disable'] = (bool)$attribs['disable']; - } else if (is_array($attribs['disable'])) { - $info['disable'] = $attribs['disable']; - } - } - - // Set ID for element - if (array_key_exists('id', $attribs)) { - $info['id'] = (string)$attribs['id']; - } else if ('' !== $info['name']) { - $info['id'] = trim(strtr($info['name'], - array('[' => '-', ']' => '')), '-'); - } - - // Remove NULL name attribute override - if (array_key_exists('name', $attribs) && is_null($attribs['name'])) { - unset($attribs['name']); - } - - // Override name in info if specified in attribs - if (array_key_exists('name', $attribs) && $attribs['name'] != $info['name']) { - $info['name'] = $attribs['name']; - } - - // Determine escaping from attributes - if (array_key_exists('escape', $attribs)) { - $info['escape'] = (bool)$attribs['escape']; - } - - // Determine listsetp from attributes - if (array_key_exists('listsep', $attribs)) { - $info['listsep'] = (string)$attribs['listsep']; - } - - // Remove attribs that might overwrite the other keys. We do this LAST - // because we needed the other attribs values earlier. - foreach ($info as $key => $val) { - if (array_key_exists($key, $attribs)) { - unset($attribs[$key]); - } - } - $info['attribs'] = $attribs; - - // done! - return $info; - } - - /** - * Creates a hidden element. - * - * We have this as a common method because other elements often - * need hidden elements for their operation. - * - * @access protected - * - * @param string $name The element name. - * @param string $value The element value. - * @param array $attribs Attributes for the element. - * - * @return string A hidden element. - */ - protected function _hidden($name, $value = null, $attribs = null) - { - return '_htmlAttribs($attribs) . $this->getClosingBracket(); - } -} diff --git a/library/Zend/View/Helper/FormErrors.php b/library/Zend/View/Helper/FormErrors.php deleted file mode 100644 index ecffa9f528..0000000000 --- a/library/Zend/View/Helper/FormErrors.php +++ /dev/null @@ -1,167 +0,0 @@ -'; - protected $_htmlElementStart = '
  • '; - protected $_htmlElementSeparator = '
  • '; - /**#@-*/ - - /** - * Render form errors - * - * @param string|array $errors Error(s) to render - * @param array $options - * @return string - */ - public function formErrors($errors, array $options = null) - { - $escape = true; - if (isset($options['escape'])) { - $escape = (bool) $options['escape']; - unset($options['escape']); - } - - if (empty($options['class'])) { - $options['class'] = 'errors'; - } - - if (isset($options['elementStart'])) { - $this->setElementStart($options['elementStart']); - } - if (isset($options['elementEnd'])) { - $this->setElementEnd($options['elementEnd']); - } - if (isset($options['elementSeparator'])) { - $this->setElementSeparator($options['elementSeparator']); - } - - $start = $this->getElementStart(); - if (strstr($start, '%s')) { - $attribs = $this->_htmlAttribs($options); - $start = sprintf($start, $attribs); - } - - if ($escape) { - foreach ($errors as $key => $error) { - $errors[$key] = $this->view->escape($error); - } - } - - $html = $start - . implode($this->getElementSeparator(), (array) $errors) - . $this->getElementEnd(); - - return $html; - } - - /** - * Set end string for displaying errors - * - * @param string $string - * @return Zend_View_Helper_FormErrors - */ - public function setElementEnd($string) - { - $this->_htmlElementEnd = (string) $string; - return $this; - } - - /** - * Retrieve end string for displaying errors - * - * @return string - */ - public function getElementEnd() - { - return $this->_htmlElementEnd; - } - - /** - * Set separator string for displaying errors - * - * @param string $string - * @return Zend_View_Helper_FormErrors - */ - public function setElementSeparator($string) - { - $this->_htmlElementSeparator = (string) $string; - return $this; - } - - /** - * Retrieve separator string for displaying errors - * - * @return string - */ - public function getElementSeparator() - { - return $this->_htmlElementSeparator; - } - - /** - * Set start string for displaying errors - * - * @param string $string - * @return Zend_View_Helper_FormErrors - */ - public function setElementStart($string) - { - $this->_htmlElementStart = (string) $string; - return $this; - } - - /** - * Retrieve start string for displaying errors - * - * @return string - */ - public function getElementStart() - { - return $this->_htmlElementStart; - } - -} diff --git a/library/Zend/View/Helper/FormFile.php b/library/Zend/View/Helper/FormFile.php deleted file mode 100644 index 84d43a0b6d..0000000000 --- a/library/Zend/View/Helper/FormFile.php +++ /dev/null @@ -1,75 +0,0 @@ -_getInfo($name, null, $attribs); - extract($info); // name, id, value, attribs, options, listsep, disable - - // is it disabled? - $disabled = ''; - if ($disable) { - $disabled = ' disabled="disabled"'; - } - - // build the element - $xhtml = '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormHidden.php b/library/Zend/View/Helper/FormHidden.php deleted file mode 100644 index 4a29f5aa95..0000000000 --- a/library/Zend/View/Helper/FormHidden.php +++ /dev/null @@ -1,66 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - if (isset($id)) { - if (isset($attribs) && is_array($attribs)) { - $attribs['id'] = $id; - } else { - $attribs = array('id' => $id); - } - } - return $this->_hidden($name, $value, $attribs); - } -} diff --git a/library/Zend/View/Helper/FormImage.php b/library/Zend/View/Helper/FormImage.php deleted file mode 100644 index 96e333728a..0000000000 --- a/library/Zend/View/Helper/FormImage.php +++ /dev/null @@ -1,95 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - - // Determine if we should use the value or the src attribute - if (isset($attribs['src'])) { - $src = ' src="' . $this->view->escape($attribs['src']) . '"'; - unset($attribs['src']); - } else { - $src = ' src="' . $this->view->escape($value) . '"'; - unset($value); - } - - // Do we have a value? - if (isset($value) && !empty($value)) { - $value = ' value="' . $this->view->escape($value) . '"'; - } else { - $value = ''; - } - - // Disabled? - $disabled = ''; - if ($disable) { - $disabled = ' disabled="disabled"'; - } - - // build the element - $xhtml = '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormLabel.php b/library/Zend/View/Helper/FormLabel.php deleted file mode 100644 index 96b7fad734..0000000000 --- a/library/Zend/View/Helper/FormLabel.php +++ /dev/null @@ -1,72 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable, escape - - // build the element - if ($disable) { - // disabled; display nothing - return ''; - } - - $value = ($escape) ? $this->view->escape($value) : $value; - $for = (empty($attribs['disableFor']) || !$attribs['disableFor']) - ? ' for="' . $this->view->escape($id) . '"' - : ''; - if (array_key_exists('disableFor', $attribs)) { - unset($attribs['disableFor']); - } - - // enabled; display label - $xhtml = '_htmlAttribs($attribs) - . '>' . $value . ''; - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormMultiCheckbox.php b/library/Zend/View/Helper/FormMultiCheckbox.php deleted file mode 100644 index 06aece2a9f..0000000000 --- a/library/Zend/View/Helper/FormMultiCheckbox.php +++ /dev/null @@ -1,74 +0,0 @@ -\n") - { - return $this->formRadio($name, $value, $attribs, $options, $listsep); - } -} diff --git a/library/Zend/View/Helper/FormNote.php b/library/Zend/View/Helper/FormNote.php deleted file mode 100644 index 8d4e187c96..0000000000 --- a/library/Zend/View/Helper/FormNote.php +++ /dev/null @@ -1,61 +0,0 @@ -_getInfo($name, $value); - extract($info); // name, value, attribs, options, listsep, disable - return $value; - } -} diff --git a/library/Zend/View/Helper/FormPassword.php b/library/Zend/View/Helper/FormPassword.php deleted file mode 100644 index f83ee3a5a7..0000000000 --- a/library/Zend/View/Helper/FormPassword.php +++ /dev/null @@ -1,89 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - - // is it disabled? - $disabled = ''; - if ($disable) { - // disabled - $disabled = ' disabled="disabled"'; - } - - // determine the XHTML value - $valueString = ' value=""'; - if (array_key_exists('renderPassword', $attribs)) { - if ($attribs['renderPassword']) { - $valueString = ' value="' . $this->view->escape($value) . '"'; - } - unset($attribs['renderPassword']); - } - - // render the element - $xhtml = '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } - -} diff --git a/library/Zend/View/Helper/FormRadio.php b/library/Zend/View/Helper/FormRadio.php deleted file mode 100644 index 95db8e3271..0000000000 --- a/library/Zend/View/Helper/FormRadio.php +++ /dev/null @@ -1,187 +0,0 @@ -\n") - { - - $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); - extract($info); // name, value, attribs, options, listsep, disable - - // retrieve attributes for labels (prefixed with 'label_' or 'label') - $label_attribs = array(); - foreach ($attribs as $key => $val) { - $tmp = false; - $keyLen = strlen($key); - if ((6 < $keyLen) && (substr($key, 0, 6) == 'label_')) { - $tmp = substr($key, 6); - } elseif ((5 < $keyLen) && (substr($key, 0, 5) == 'label')) { - $tmp = substr($key, 5); - } - - if ($tmp) { - // make sure first char is lowercase - $tmp[0] = strtolower($tmp[0]); - $label_attribs[$tmp] = $val; - unset($attribs[$key]); - } - } - - $labelPlacement = 'append'; - foreach ($label_attribs as $key => $val) { - switch (strtolower($key)) { - case 'placement': - unset($label_attribs[$key]); - $val = strtolower($val); - if (in_array($val, array('prepend', 'append'))) { - $labelPlacement = $val; - } - break; - } - } - - // the radio button values and labels - $options = (array) $options; - - // build the element - $xhtml = ''; - $list = array(); - - // should the name affect an array collection? - $name = $this->view->escape($name); - if ($this->_isArray && ('[]' != substr($name, -2))) { - $name .= '[]'; - } - - // ensure value is an array to allow matching multiple times - $value = (array) $value; - - // Set up the filter - Alnum + hyphen + underscore - #require_once 'Zend/Filter/PregReplace.php'; - $pattern = @preg_match('/\pL/u', 'a') - ? '/[^\p{L}\p{N}\-\_]/u' // Unicode - : '/[^a-zA-Z0-9\-\_]/'; // No Unicode - $filter = new Zend_Filter_PregReplace($pattern, ""); - - // add radio buttons to the list. - foreach ($options as $opt_value => $opt_label) { - - // Should the label be escaped? - if ($escape) { - $opt_label = $this->view->escape($opt_label); - } - - // is it disabled? - $disabled = ''; - if (true === $disable) { - $disabled = ' disabled="disabled"'; - } elseif (is_array($disable) && in_array($opt_value, $disable)) { - $disabled = ' disabled="disabled"'; - } - - // is it checked? - $checked = ''; - if (in_array($opt_value, $value)) { - $checked = ' checked="checked"'; - } - - // generate ID - $optId = $id . '-' . $filter->filter($opt_value); - - // Wrap the radios in labels - $radio = '_htmlAttribs($label_attribs) . '>' - . (('prepend' == $labelPlacement) ? $opt_label : '') - . '_htmlAttribs($attribs) - . $this->getClosingBracket() - . (('append' == $labelPlacement) ? $opt_label : '') - . ''; - - // add to the array of radio buttons - $list[] = $radio; - } - - // XHTML or HTML for standard list separator? - if (!$this->_isXhtml() && false !== strpos($listsep, '
    ')) { - $listsep = str_replace('
    ', '
    ', $listsep); - } - - // done! - $xhtml .= implode($listsep, $list); - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormReset.php b/library/Zend/View/Helper/FormReset.php deleted file mode 100644 index ff039cd420..0000000000 --- a/library/Zend/View/Helper/FormReset.php +++ /dev/null @@ -1,82 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - - // check if disabled - $disabled = ''; - if ($disable) { - $disabled = ' disabled="disabled"'; - } - - // Render button - $xhtml = 'view->escape($value) . '"'; - } - - // add attributes, close, and return - $xhtml .= $this->_htmlAttribs($attribs) . $this->getClosingBracket(); - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormSelect.php b/library/Zend/View/Helper/FormSelect.php deleted file mode 100644 index feae758826..0000000000 --- a/library/Zend/View/Helper/FormSelect.php +++ /dev/null @@ -1,200 +0,0 @@ -\n") - { - $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); - extract($info); // name, id, value, attribs, options, listsep, disable - - // force $value to array so we can compare multiple values to multiple - // options; also ensure it's a string for comparison purposes. - $value = array_map('strval', (array) $value); - - // check if element may have multiple values - $multiple = ''; - - if (substr($name, -2) == '[]') { - // multiple implied by the name - $multiple = ' multiple="multiple"'; - } - - if (isset($attribs['multiple'])) { - // Attribute set - if ($attribs['multiple']) { - // True attribute; set multiple attribute - $multiple = ' multiple="multiple"'; - - // Make sure name indicates multiple values are allowed - if (!empty($multiple) && (substr($name, -2) != '[]')) { - $name .= '[]'; - } - } else { - // False attribute; ensure attribute not set - $multiple = ''; - } - unset($attribs['multiple']); - } - - // handle the options classes - $optionClasses = array(); - if (isset($attribs['optionClasses'])) { - $optionClasses = $attribs['optionClasses']; - unset($attribs['optionClasses']); - } - - // now start building the XHTML. - $disabled = ''; - if (true === $disable) { - $disabled = ' disabled="disabled"'; - } - - // Build the surrounding select element first. - $xhtml = '_htmlAttribs($attribs) - . ">\n "; - - // build the list of options - $list = array(); - $translator = $this->getTranslator(); - foreach ((array) $options as $opt_value => $opt_label) { - if (is_array($opt_label)) { - $opt_disable = ''; - if (is_array($disable) && in_array($opt_value, $disable)) { - $opt_disable = ' disabled="disabled"'; - } - if (null !== $translator) { - $opt_value = $translator->translate($opt_value); - } - $opt_id = ' id="' . $this->view->escape($id) . '-optgroup-' - . $this->view->escape($opt_value) . '"'; - $list[] = ''; - foreach ($opt_label as $val => $lab) { - $list[] = $this->_build($val, $lab, $value, $disable, $optionClasses); - } - $list[] = ''; - } else { - $list[] = $this->_build($opt_value, $opt_label, $value, $disable, $optionClasses); - } - } - - // add the options to the xhtml and close the select - $xhtml .= implode("\n ", $list) . "\n"; - - return $xhtml; - } - - /** - * Builds the actual "; - - return $opt; - } - -} diff --git a/library/Zend/View/Helper/FormSubmit.php b/library/Zend/View/Helper/FormSubmit.php deleted file mode 100644 index b1a338f102..0000000000 --- a/library/Zend/View/Helper/FormSubmit.php +++ /dev/null @@ -1,81 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable, id - // check if disabled - $disabled = ''; - if ($disable) { - $disabled = ' disabled="disabled"'; - } - - if ($id) { - $id = ' id="' . $this->view->escape($id) . '"'; - } - - // Render the button. - $xhtml = '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormText.php b/library/Zend/View/Helper/FormText.php deleted file mode 100644 index d5a45a25bf..0000000000 --- a/library/Zend/View/Helper/FormText.php +++ /dev/null @@ -1,78 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - - // build the element - $disabled = ''; - if ($disable) { - // disabled - $disabled = ' disabled="disabled"'; - } - - $xhtml = '_htmlAttribs($attribs) - . $this->getClosingBracket(); - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/FormTextarea.php b/library/Zend/View/Helper/FormTextarea.php deleted file mode 100644 index 0b112b3651..0000000000 --- a/library/Zend/View/Helper/FormTextarea.php +++ /dev/null @@ -1,104 +0,0 @@ -_getInfo($name, $value, $attribs); - extract($info); // name, value, attribs, options, listsep, disable - - // is it disabled? - $disabled = ''; - if ($disable) { - // disabled. - $disabled = ' disabled="disabled"'; - } - - // Make sure that there are 'rows' and 'cols' values - // as required by the spec. noted by Orjan Persson. - if (empty($attribs['rows'])) { - $attribs['rows'] = (int) $this->rows; - } - if (empty($attribs['cols'])) { - $attribs['cols'] = (int) $this->cols; - } - - // build the element - $xhtml = ''; - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/Gravatar.php b/library/Zend/View/Helper/Gravatar.php deleted file mode 100644 index 85d7b565fa..0000000000 --- a/library/Zend/View/Helper/Gravatar.php +++ /dev/null @@ -1,363 +0,0 @@ - 80, - 'default_img' => self::DEFAULT_MM, - 'rating' => self::RATING_G, - 'secure' => null, - ); - - /** - * Email Adress - * - * @var string - */ - protected $_email; - - /** - * Attributes for HTML image tag - * - * @var array - */ - protected $_attribs; - - /** - * Returns an avatar from gravatar's service. - * - * $options may include the following: - * - 'img_size' int height of img to return - * - 'default_img' string img to return if email adress has not found - * - 'rating' string rating parameter for avatar - * - 'secure' bool load from the SSL or Non-SSL location - * - * @see http://pl.gravatar.com/site/implement/url - * @see http://pl.gravatar.com/site/implement/url More information about gravatar's service. - * @param string|null $email Email adress. - * @param null|array $options Options - * @param array $attribs Attributes for image tag (title, alt etc.) - * @return Zend_View_Helper_Gravatar - */ - public function gravatar($email = "", $options = array(), $attribs = array()) - { - $this->setEmail($email); - $this->setOptions($options); - $this->setAttribs($attribs); - return $this; - } - - /** - * Configure state - * - * @param array $options - * @return Zend_View_Helper_Gravatar - */ - public function setOptions(array $options) - { - foreach ($options as $key => $value) { - $method = 'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))); - if (method_exists($this, $method)) { - $this->{$method}($value); - } - } - return $this; - } - - /** - * Get img size - * - * @return int The img size - */ - public function getImgSize() - { - return $this->_options['img_size']; - } - - /** - * Set img size in pixels - * - * @param int $imgSize Size of img must be between 1 and 512 - * @return Zend_View_Helper_Gravatar - */ - public function setImgSize($imgSize) - { - $this->_options['img_size'] = (int) $imgSize; - return $this; - } - - /** - * Get default img - * - * @return string - */ - public function getDefaultImg() - { - return $this->_options['default_img']; - } - - /** - * Set default img - * - * Can be either an absolute URL to an image, or one of the DEFAULT_* constants - * - * @param string $defaultImg - * @link http://pl.gravatar.com/site/implement/url More information about default image. - * @return Zend_View_Helper_Gravatar - */ - public function setDefaultImg($defaultImg) - { - $this->_options['default_img'] = urlencode($defaultImg); - return $this; - } - - /** - * Set rating value - * - * Must be one of the RATING_* constants - * - * @param string $rating Value for rating. Allowed values are: g, px, r,x - * @link http://pl.gravatar.com/site/implement/url More information about rating. - * @throws Zend_View_Exception - */ - public function setRating($rating) - { - switch ($rating) { - case self::RATING_G: - case self::RATING_PG: - case self::RATING_R: - case self::RATING_X: - $this->_options['rating'] = $rating; - break; - default: - #require_once 'Zend/View/Exception.php'; - throw new Zend_View_Exception(sprintf( - 'The rating value "%s" is not allowed', - $rating - )); - } - return $this; - } - - /** - * Get rating value - * - * @return string - */ - public function getRating() - { - return $this->_options['rating']; - } - - /** - * Set email adress - * - * @param string $email - * @return Zend_View_Helper_Gravatar - */ - public function setEmail( $email ) - { - $this->_email = $email; - return $this; - } - - /** - * Get email adress - * - * @return string - */ - public function getEmail() - { - return $this->_email; - } - - /** - * Load from an SSL or No-SSL location? - * - * @param bool $flag - * @return Zend_View_Helper_Gravatar - */ - public function setSecure($flag) - { - $this->_options['secure'] = ($flag === null) ? null : (bool) $flag; - return $this; - } - - /** - * Get an SSL or a No-SSL location - * - * @return bool - */ - public function getSecure() - { - if ($this->_options['secure'] === null) { - return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'); - } - return $this->_options['secure']; - } - - /** - * Get attribs of image - * - * Warning! - * If you set src attrib, you get it, but this value will be overwritten in - * protected method _setSrcAttribForImg(). And finally your get other src - * value! - * - * @return array - */ - public function getAttribs() - { - return $this->_attribs; - } - - /** - * Set attribs for image tag - * - * Warning! You shouldn't set src attrib for image tag. - * This attrib is overwritten in protected method _setSrcAttribForImg(). - * This method(_setSrcAttribForImg) is called in public method getImgTag(). - - * @param array $attribs - * @return Zend_View_Helper_Gravatar - */ - public function setAttribs(array $attribs) - { - $this->_attribs = $attribs; - return $this; - } - - /** - * Get URL to gravatar's service. - * - * @return string URL - */ - protected function _getGravatarUrl() - { - return ($this->getSecure() === false) ? self::GRAVATAR_URL : self::GRAVATAR_URL_SECURE; - } - - /** - * Get avatar url (including size, rating and default image oprions) - * - * @return string - */ - protected function _getAvatarUrl() - { - $src = $this->_getGravatarUrl() - . '/' - . md5(strtolower(trim($this->getEmail()))) - . '?s=' - . $this->getImgSize() - . '&d=' - . $this->getDefaultImg() - . '&r=' - . $this->getRating(); - return $src; - } - - /** - * Set src attrib for image. - * - * You shouldn't set a own url value! - * It sets value, uses protected method _getAvatarUrl. - * - * If already exsist overwritten. - */ - protected function _setSrcAttribForImg() - { - $attribs = $this->getAttribs(); - $attribs['src'] = $this->_getAvatarUrl(); - $this->setAttribs($attribs); - } - - /** - * Return valid image tag - * - * @return string - */ - public function getImgTag() - { - $this->_setSrcAttribForImg(); - $html = '_htmlAttribs($this->getAttribs()) - . $this->getClosingBracket(); - - return $html; - } - - /** - * Return valid image tag - * - * @return string - */ - public function __toString() - { - return $this->getImgTag(); - - } -} diff --git a/library/Zend/View/Helper/HeadLink.php b/library/Zend/View/Helper/HeadLink.php deleted file mode 100644 index fd6e180111..0000000000 --- a/library/Zend/View/Helper/HeadLink.php +++ /dev/null @@ -1,478 +0,0 @@ -setSeparator(PHP_EOL); - } - - /** - * headLink() - View Helper Method - * - * Returns current object instance. Optionally, allows passing array of - * values to build link. - * - * @return Zend_View_Helper_HeadLink - */ - public function headLink(array $attributes = null, $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) - { - if (null !== $attributes) { - $item = $this->createData($attributes); - switch ($placement) { - case Zend_View_Helper_Placeholder_Container_Abstract::SET: - $this->set($item); - break; - case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: - $this->prepend($item); - break; - case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: - default: - $this->append($item); - break; - } - } - return $this; - } - - /** - * Overload method access - * - * Creates the following virtual methods: - * - appendStylesheet($href, $media, $conditionalStylesheet, $extras) - * - offsetSetStylesheet($index, $href, $media, $conditionalStylesheet, $extras) - * - prependStylesheet($href, $media, $conditionalStylesheet, $extras) - * - setStylesheet($href, $media, $conditionalStylesheet, $extras) - * - appendAlternate($href, $type, $title, $extras) - * - offsetSetAlternate($index, $href, $type, $title, $extras) - * - prependAlternate($href, $type, $title, $extras) - * - setAlternate($href, $type, $title, $extras) - * - * Items that may be added in the future: - * - Navigation? need to find docs on this - * - public function appendStart() - * - public function appendContents() - * - public function appendPrev() - * - public function appendNext() - * - public function appendIndex() - * - public function appendEnd() - * - public function appendGlossary() - * - public function appendAppendix() - * - public function appendHelp() - * - public function appendBookmark() - * - Other? - * - public function appendCopyright() - * - public function appendChapter() - * - public function appendSection() - * - public function appendSubsection() - * - * @param mixed $method - * @param mixed $args - * @return void - */ - public function __call($method, $args) - { - if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PStylesheet|Alternate)$/', $method, $matches)) { - $argc = count($args); - $action = $matches['action']; - $type = $matches['type']; - $index = null; - - if ('offsetSet' == $action) { - if (0 < $argc) { - $index = array_shift($args); - --$argc; - } - } - - if (1 > $argc) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('%s requires at least one argument', $method)); - $e->setView($this->view); - throw $e; - } - - if (is_array($args[0])) { - $item = $this->createData($args[0]); - } else { - $dataMethod = 'createData' . $type; - $item = $this->$dataMethod($args); - } - - if ($item) { - if ('offsetSet' == $action) { - $this->offsetSet($index, $item); - } else { - $this->$action($item); - } - } - - return $this; - } - - return parent::__call($method, $args); - } - - /** - * Check if value is valid - * - * @param mixed $value - * @return boolean - */ - protected function _isValid($value) - { - if (!$value instanceof stdClass) { - return false; - } - - $vars = get_object_vars($value); - $keys = array_keys($vars); - $intersection = array_intersect($this->_itemKeys, $keys); - if (empty($intersection)) { - return false; - } - - return true; - } - - /** - * append() - * - * @param array $value - * @return void - */ - public function append($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('append() expects a data token; please use one of the custom append*() methods'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->append($value); - } - - /** - * offsetSet() - * - * @param string|int $index - * @param array $value - * @return void - */ - public function offsetSet($index, $value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('offsetSet() expects a data token; please use one of the custom offsetSet*() methods'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->offsetSet($index, $value); - } - - /** - * prepend() - * - * @param array $value - * @return Zend_Layout_ViewHelper_HeadLink - */ - public function prepend($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('prepend() expects a data token; please use one of the custom prepend*() methods'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->prepend($value); - } - - /** - * set() - * - * @param array $value - * @return Zend_Layout_ViewHelper_HeadLink - */ - public function set($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('set() expects a data token; please use one of the custom set*() methods'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->set($value); - } - - - /** - * Create HTML link element from data item - * - * @param stdClass $item - * @return string - */ - public function itemToString(stdClass $item) - { - $attributes = (array) $item; - $link = '_itemKeys as $itemKey) { - if (isset($attributes[$itemKey])) { - if(is_array($attributes[$itemKey])) { - foreach($attributes[$itemKey] as $key => $value) { - $link .= sprintf('%s="%s" ', $key, ($this->_autoEscape) ? $this->_escape($value) : $value); - } - } else { - $link .= sprintf('%s="%s" ', $itemKey, ($this->_autoEscape) ? $this->_escape($attributes[$itemKey]) : $attributes[$itemKey]); - } - } - } - - if ($this->view instanceof Zend_View_Abstract) { - $link .= ($this->view->doctype()->isXhtml()) ? '/>' : '>'; - } else { - $link .= '/>'; - } - - if (($link == '') || ($link == '')) { - return ''; - } - - if (isset($attributes['conditionalStylesheet']) - && !empty($attributes['conditionalStylesheet']) - && is_string($attributes['conditionalStylesheet'])) - { - if (str_replace(' ', '', $attributes['conditionalStylesheet']) === '!IE') { - $link = '' . $link . ''; - } - - return $link; - } - - /** - * Render link elements as string - * - * @param string|int $indent - * @return string - */ - public function toString($indent = null) - { - $indent = (null !== $indent) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - $items = array(); - $this->getContainer()->ksort(); - foreach ($this as $item) { - $items[] = $this->itemToString($item); - } - - return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); - } - - /** - * Create data item for stack - * - * @param array $attributes - * @return stdClass - */ - public function createData(array $attributes) - { - $data = (object) $attributes; - return $data; - } - - /** - * Create item for stylesheet link item - * - * @param array $args - * @return stdClass|false Returns fals if stylesheet is a duplicate - */ - public function createDataStylesheet(array $args) - { - $rel = 'stylesheet'; - $type = 'text/css'; - $media = 'screen'; - $conditionalStylesheet = false; - $href = array_shift($args); - - if ($this->_isDuplicateStylesheet($href)) { - return false; - } - - if (0 < count($args)) { - $media = array_shift($args); - if(is_array($media)) { - $media = implode(',', $media); - } else { - $media = (string) $media; - } - } - if (0 < count($args)) { - $conditionalStylesheet = array_shift($args); - if(!empty($conditionalStylesheet) && is_string($conditionalStylesheet)) { - $conditionalStylesheet = (string) $conditionalStylesheet; - } else { - $conditionalStylesheet = null; - } - } - - if(0 < count($args) && is_array($args[0])) { - $extras = array_shift($args); - $extras = (array) $extras; - } - - $attributes = compact('rel', 'type', 'href', 'media', 'conditionalStylesheet', 'extras'); - return $this->createData($this->_applyExtras($attributes)); - } - - /** - * Is the linked stylesheet a duplicate? - * - * @param string $uri - * @return bool - */ - protected function _isDuplicateStylesheet($uri) - { - foreach ($this->getContainer() as $item) { - if (($item->rel == 'stylesheet') && ($item->href == $uri)) { - return true; - } - } - return false; - } - - /** - * Create item for alternate link item - * - * @param array $args - * @return stdClass - */ - public function createDataAlternate(array $args) - { - if (3 > count($args)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Alternate tags require 3 arguments; %s provided', count($args))); - $e->setView($this->view); - throw $e; - } - - $rel = 'alternate'; - $href = array_shift($args); - $type = array_shift($args); - $title = array_shift($args); - - if(0 < count($args) && is_array($args[0])) { - $extras = array_shift($args); - $extras = (array) $extras; - - if(isset($extras['media']) && is_array($extras['media'])) { - $extras['media'] = implode(',', $extras['media']); - } - } - - $href = (string) $href; - $type = (string) $type; - $title = (string) $title; - - $attributes = compact('rel', 'href', 'type', 'title', 'extras'); - return $this->createData($this->_applyExtras($attributes)); - } - - /** - * Apply any overrides specified in the 'extras' array - * @param array $attributes - * @return array - */ - protected function _applyExtras($attributes) - { - if (isset($attributes['extras'])) { - foreach ($attributes['extras'] as $eKey=>$eVal) { - if (isset($attributes[$eKey])) { - $attributes[$eKey] = $eVal; - unset($attributes['extras'][$eKey]); - } - } - } - return $attributes; - } -} diff --git a/library/Zend/View/Helper/HeadMeta.php b/library/Zend/View/Helper/HeadMeta.php deleted file mode 100644 index c589987a6b..0000000000 --- a/library/Zend/View/Helper/HeadMeta.php +++ /dev/null @@ -1,449 +0,0 @@ -setSeparator(PHP_EOL); - } - - /** - * Retrieve object instance; optionally add meta tag - * - * @param string $content - * @param string $keyValue - * @param string $keyType - * @param array $modifiers - * @param string $placement - * @return Zend_View_Helper_HeadMeta - */ - public function headMeta($content = null, $keyValue = null, $keyType = 'name', $modifiers = array(), $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) - { - if ((null !== $content) && (null !== $keyValue)) { - $item = $this->createData($keyType, $keyValue, $content, $modifiers); - $action = strtolower($placement); - switch ($action) { - case 'append': - case 'prepend': - case 'set': - $this->$action($item); - break; - default: - $this->append($item); - break; - } - } - - return $this; - } - - protected function _normalizeType($type) - { - switch ($type) { - case 'Name': - return 'name'; - case 'HttpEquiv': - return 'http-equiv'; - case 'Property': - return 'property'; - default: - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Invalid type "%s" passed to _normalizeType', $type)); - $e->setView($this->view); - throw $e; - } - } - - /** - * Overload method access - * - * Allows the following 'virtual' methods: - * - appendName($keyValue, $content, $modifiers = array()) - * - offsetGetName($index, $keyValue, $content, $modifers = array()) - * - prependName($keyValue, $content, $modifiers = array()) - * - setName($keyValue, $content, $modifiers = array()) - * - appendHttpEquiv($keyValue, $content, $modifiers = array()) - * - offsetGetHttpEquiv($index, $keyValue, $content, $modifers = array()) - * - prependHttpEquiv($keyValue, $content, $modifiers = array()) - * - setHttpEquiv($keyValue, $content, $modifiers = array()) - * - appendProperty($keyValue, $content, $modifiers = array()) - * - offsetGetProperty($index, $keyValue, $content, $modifiers = array()) - * - prependProperty($keyValue, $content, $modifiers = array()) - * - setProperty($keyValue, $content, $modifiers = array()) - * - * @param string $method - * @param array $args - * @return Zend_View_Helper_HeadMeta - */ - public function __call($method, $args) - { - if (preg_match('/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv|Property)$/', $method, $matches)) { - $action = $matches['action']; - $type = $this->_normalizeType($matches['type']); - $argc = count($args); - $index = null; - - if ('offsetSet' == $action) { - if (0 < $argc) { - $index = array_shift($args); - --$argc; - } - } - - if (2 > $argc) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Too few arguments provided; requires key value, and content'); - $e->setView($this->view); - throw $e; - } - - if (3 > $argc) { - $args[] = array(); - } - - $item = $this->createData($type, $args[0], $args[1], $args[2]); - - if ('offsetSet' == $action) { - return $this->offsetSet($index, $item); - } - - $this->$action($item); - return $this; - } - - return parent::__call($method, $args); - } - - /** - * Create an HTML5-style meta charset tag. Something like - * - * Not valid in a non-HTML5 doctype - * - * @param string $charset - * @return Zend_View_Helper_HeadMeta Provides a fluent interface - */ - public function setCharset($charset) - { - $item = new stdClass; - $item->type = 'charset'; - $item->charset = $charset; - $item->content = null; - $item->modifiers = array(); - $this->set($item); - return $this; - } - - /** - * Determine if item is valid - * - * @param mixed $item - * @return boolean - */ - protected function _isValid($item) - { - if ((!$item instanceof stdClass) - || !isset($item->type) - || !isset($item->modifiers)) - { - return false; - } - - $isHtml5 = is_null($this->view) ? false : $this->view->doctype()->isHtml5(); - - if (!isset($item->content) - && (! $isHtml5 || (! $isHtml5 && $item->type !== 'charset'))) { - return false; - } - - // is only supported with doctype RDFa - if ( !is_null($this->view) && !$this->view->doctype()->isRdfa() - && $item->type === 'property') { - return false; - } - - return true; - } - - /** - * Append - * - * @param string $value - * @return void - * @throws Zend_View_Exception - */ - public function append($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to append; please use appendMeta()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->append($value); - } - - /** - * OffsetSet - * - * @param string|int $index - * @param string $value - * @return void - * @throws Zend_View_Exception - */ - public function offsetSet($index, $value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetName() or offsetSetHttpEquiv()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->offsetSet($index, $value); - } - - /** - * OffsetUnset - * - * @param string|int $index - * @return void - * @throws Zend_View_Exception - */ - public function offsetUnset($index) - { - if (!in_array($index, $this->getContainer()->getKeys())) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid index passed to offsetUnset()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->offsetUnset($index); - } - - /** - * Prepend - * - * @param string $value - * @return void - * @throws Zend_View_Exception - */ - public function prepend($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to prepend; please use prependMeta()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->prepend($value); - } - - /** - * Set - * - * @param string $value - * @return void - * @throws Zend_View_Exception - */ - public function set($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to set; please use setMeta()'); - $e->setView($this->view); - throw $e; - } - - $container = $this->getContainer(); - foreach ($container->getArrayCopy() as $index => $item) { - if ($item->type == $value->type && $item->{$item->type} == $value->{$value->type}) { - $this->offsetUnset($index); - } - } - - return $this->append($value); - } - - /** - * Build meta HTML string - * - * @param string $type - * @param string $typeValue - * @param string $content - * @param array $modifiers - * @return string - */ - public function itemToString(stdClass $item) - { - if (!in_array($item->type, $this->_typeKeys)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Invalid type "%s" provided for meta', $item->type)); - $e->setView($this->view); - throw $e; - } - $type = $item->type; - - $modifiersString = ''; - foreach ($item->modifiers as $key => $value) { - if (!is_null($this->view) && $this->view->doctype()->isHtml5() - && $key == 'scheme') { - #require_once 'Zend/View/Exception.php'; - throw new Zend_View_Exception('Invalid modifier ' - . '"scheme" provided; not supported by HTML5'); - } - if (!in_array($key, $this->_modifierKeys)) { - continue; - } - $modifiersString .= $key . '="' . $this->_escape($value) . '" '; - } - - if ($this->view instanceof Zend_View_Abstract) { - if ($this->view->doctype()->isHtml5() - && $type == 'charset') { - $tpl = ($this->view->doctype()->isXhtml()) - ? '' - : ''; - } elseif ($this->view->doctype()->isXhtml()) { - $tpl = ''; - } else { - $tpl = ''; - } - } else { - $tpl = ''; - } - - $meta = sprintf( - $tpl, - $type, - $this->_escape($item->$type), - $this->_escape($item->content), - $modifiersString - ); - - if (isset($item->modifiers['conditional']) - && !empty($item->modifiers['conditional']) - && is_string($item->modifiers['conditional'])) - { - if (str_replace(' ', '', $item->modifiers['conditional']) === '!IE') { - $meta = '' . $meta . ''; - } - - return $meta; - } - - /** - * Render placeholder as string - * - * @param string|int $indent - * @return string - */ - public function toString($indent = null) - { - $indent = (null !== $indent) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - $items = array(); - $this->getContainer()->ksort(); - try { - foreach ($this as $item) { - $items[] = $this->itemToString($item); - } - } catch (Zend_View_Exception $e) { - trigger_error($e->getMessage(), E_USER_WARNING); - return ''; - } - return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); - } - - /** - * Create data item for inserting into stack - * - * @param string $type - * @param string $typeValue - * @param string $content - * @param array $modifiers - * @return stdClass - */ - public function createData($type, $typeValue, $content, array $modifiers) - { - $data = new stdClass; - $data->type = $type; - $data->$type = $typeValue; - $data->content = $content; - $data->modifiers = $modifiers; - return $data; - } -} diff --git a/library/Zend/View/Helper/HeadScript.php b/library/Zend/View/Helper/HeadScript.php deleted file mode 100644 index 83235a7f18..0000000000 --- a/library/Zend/View/Helper/HeadScript.php +++ /dev/null @@ -1,520 +0,0 @@ -setSeparator(PHP_EOL); - } - - /** - * Return headScript object - * - * Returns headScript helper object; optionally, allows specifying a script - * or script file to include. - * - * @param string $mode Script or file - * @param string $spec Script/url - * @param string $placement Append, prepend, or set - * @param array $attrs Array of script attributes - * @param string $type Script type and/or array of script attributes - * @return Zend_View_Helper_HeadScript - */ - public function headScript($mode = Zend_View_Helper_HeadScript::FILE, $spec = null, $placement = 'APPEND', array $attrs = array(), $type = 'text/javascript') - { - if ((null !== $spec) && is_string($spec)) { - $action = ucfirst(strtolower($mode)); - $placement = strtolower($placement); - switch ($placement) { - case 'set': - case 'prepend': - case 'append': - $action = $placement . $action; - break; - default: - $action = 'append' . $action; - break; - } - $this->$action($spec, $type, $attrs); - } - - return $this; - } - - /** - * Start capture action - * - * @param mixed $captureType - * @param string $typeOrAttrs - * @return void - */ - public function captureStart($captureType = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $type = 'text/javascript', $attrs = array()) - { - if ($this->_captureLock) { - #require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; - $e = new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headScript captures'); - $e->setView($this->view); - throw $e; - } - - $this->_captureLock = true; - $this->_captureType = $captureType; - $this->_captureScriptType = $type; - $this->_captureScriptAttrs = $attrs; - ob_start(); - } - - /** - * End capture action and store - * - * @return void - */ - public function captureEnd() - { - $content = ob_get_clean(); - $type = $this->_captureScriptType; - $attrs = $this->_captureScriptAttrs; - $this->_captureScriptType = null; - $this->_captureScriptAttrs = null; - $this->_captureLock = false; - - switch ($this->_captureType) { - case Zend_View_Helper_Placeholder_Container_Abstract::SET: - case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: - case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: - $action = strtolower($this->_captureType) . 'Script'; - break; - default: - $action = 'appendScript'; - break; - } - $this->$action($content, $type, $attrs); - } - - /** - * Overload method access - * - * Allows the following method calls: - * - appendFile($src, $type = 'text/javascript', $attrs = array()) - * - offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array()) - * - prependFile($src, $type = 'text/javascript', $attrs = array()) - * - setFile($src, $type = 'text/javascript', $attrs = array()) - * - appendScript($script, $type = 'text/javascript', $attrs = array()) - * - offsetSetScript($index, $src, $type = 'text/javascript', $attrs = array()) - * - prependScript($script, $type = 'text/javascript', $attrs = array()) - * - setScript($script, $type = 'text/javascript', $attrs = array()) - * - * @param string $method - * @param array $args - * @return Zend_View_Helper_HeadScript - * @throws Zend_View_Exception if too few arguments or invalid method - */ - public function __call($method, $args) - { - if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PFile|Script)$/', $method, $matches)) { - if (1 > count($args)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Method "%s" requires at least one argument', $method)); - $e->setView($this->view); - throw $e; - } - - $action = $matches['action']; - $mode = strtolower($matches['mode']); - $type = 'text/javascript'; - $attrs = array(); - - if ('offsetSet' == $action) { - $index = array_shift($args); - if (1 > count($args)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Method "%s" requires at least two arguments, an index and source', $method)); - $e->setView($this->view); - throw $e; - } - } - - $content = $args[0]; - - if (isset($args[1])) { - $type = (string) $args[1]; - } - if (isset($args[2])) { - $attrs = (array) $args[2]; - } - - switch ($mode) { - case 'script': - $item = $this->createData($type, $attrs, $content); - if ('offsetSet' == $action) { - $this->offsetSet($index, $item); - } else { - $this->$action($item); - } - break; - case 'file': - default: - if (!$this->_isDuplicate($content) || $action=='set') { - $attrs['src'] = $content; - $item = $this->createData($type, $attrs); - if ('offsetSet' == $action) { - $this->offsetSet($index, $item); - } else { - $this->$action($item); - } - } - break; - } - - return $this; - } - - return parent::__call($method, $args); - } - - /** - * Is the file specified a duplicate? - * - * @param string $file - * @return bool - */ - protected function _isDuplicate($file) - { - foreach ($this->getContainer() as $item) { - if (($item->source === null) - && array_key_exists('src', $item->attributes) - && ($file == $item->attributes['src'])) - { - return true; - } - } - return false; - } - - /** - * Is the script provided valid? - * - * @param mixed $value - * @param string $method - * @return bool - */ - protected function _isValid($value) - { - if ((!$value instanceof stdClass) - || !isset($value->type) - || (!isset($value->source) && !isset($value->attributes))) - { - return false; - } - - return true; - } - - /** - * Override append - * - * @param string $value - * @return void - */ - public function append($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid argument passed to append(); please use one of the helper methods, appendScript() or appendFile()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->append($value); - } - - /** - * Override prepend - * - * @param string $value - * @return void - */ - public function prepend($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid argument passed to prepend(); please use one of the helper methods, prependScript() or prependFile()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->prepend($value); - } - - /** - * Override set - * - * @param string $value - * @return void - */ - public function set($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid argument passed to set(); please use one of the helper methods, setScript() or setFile()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->set($value); - } - - /** - * Override offsetSet - * - * @param string|int $index - * @param mixed $value - * @return void - */ - public function offsetSet($index, $value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid argument passed to offsetSet(); please use one of the helper methods, offsetSetScript() or offsetSetFile()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->offsetSet($index, $value); - } - - /** - * Set flag indicating if arbitrary attributes are allowed - * - * @param bool $flag - * @return Zend_View_Helper_HeadScript - */ - public function setAllowArbitraryAttributes($flag) - { - $this->_arbitraryAttributes = (bool) $flag; - return $this; - } - - /** - * Are arbitrary attributes allowed? - * - * @return bool - */ - public function arbitraryAttributesAllowed() - { - return $this->_arbitraryAttributes; - } - - /** - * Create script HTML - * - * @param string $type - * @param array $attributes - * @param string $content - * @param string|int $indent - * @return string - */ - public function itemToString($item, $indent, $escapeStart, $escapeEnd) - { - $attrString = ''; - if (!empty($item->attributes)) { - foreach ($item->attributes as $key => $value) { - if ((!$this->arbitraryAttributesAllowed() && !in_array($key, $this->_optionalAttributes)) - || in_array($key, array('conditional', 'noescape'))) - { - continue; - } - if ('defer' == $key) { - $value = 'defer'; - } - $attrString .= sprintf(' %s="%s"', $key, ($this->_autoEscape) ? $this->_escape($value) : $value); - } - } - - $addScriptEscape = !(isset($item->attributes['noescape']) && filter_var($item->attributes['noescape'], FILTER_VALIDATE_BOOLEAN)); - - $type = ($this->_autoEscape) ? $this->_escape($item->type) : $item->type; - $html = ''; - - if (isset($item->attributes['conditional']) - && !empty($item->attributes['conditional']) - && is_string($item->attributes['conditional'])) - { - // inner wrap with comment end and start if !IE - if (str_replace(' ', '', $item->attributes['conditional']) === '!IE') { - $html = '' . $html . ''; - } else { - $html = $indent . $html; - } - - return $html; - } - - /** - * Retrieve string representation - * - * @param string|int $indent - * @return string - */ - public function toString($indent = null) - { - $indent = (null !== $indent) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - if ($this->view) { - $useCdata = $this->view->doctype()->isXhtml() ? true : false; - } else { - $useCdata = $this->useCdata ? true : false; - } - $escapeStart = ($useCdata) ? '//' : '//-->'; - - $items = array(); - $this->getContainer()->ksort(); - foreach ($this as $item) { - if (!$this->_isValid($item)) { - continue; - } - - $items[] = $this->itemToString($item, $indent, $escapeStart, $escapeEnd); - } - - $return = implode($this->getSeparator(), $items); - return $return; - } - - /** - * Create data item containing all necessary components of script - * - * @param string $type - * @param array $attributes - * @param string $content - * @return stdClass - */ - public function createData($type, array $attributes, $content = null) - { - $data = new stdClass(); - $data->type = $type; - $data->attributes = $attributes; - $data->source = $content; - return $data; - } -} diff --git a/library/Zend/View/Helper/HeadStyle.php b/library/Zend/View/Helper/HeadStyle.php deleted file mode 100644 index de54cf9763..0000000000 --- a/library/Zend/View/Helper/HeadStyle.php +++ /dev/null @@ -1,433 +0,0 @@ -setSeparator(PHP_EOL); - } - - /** - * Return headStyle object - * - * Returns headStyle helper object; optionally, allows specifying - * - * @param string $content Stylesheet contents - * @param string $placement Append, prepend, or set - * @param string|array $attributes Optional attributes to utilize - * @return Zend_View_Helper_HeadStyle - */ - public function headStyle($content = null, $placement = 'APPEND', $attributes = array()) - { - if ((null !== $content) && is_string($content)) { - switch (strtoupper($placement)) { - case 'SET': - $action = 'setStyle'; - break; - case 'PREPEND': - $action = 'prependStyle'; - break; - case 'APPEND': - default: - $action = 'appendStyle'; - break; - } - $this->$action($content, $attributes); - } - - return $this; - } - - /** - * Overload method calls - * - * Allows the following method calls: - * - appendStyle($content, $attributes = array()) - * - offsetSetStyle($index, $content, $attributes = array()) - * - prependStyle($content, $attributes = array()) - * - setStyle($content, $attributes = array()) - * - * @param string $method - * @param array $args - * @return void - * @throws Zend_View_Exception When no $content provided or invalid method - */ - public function __call($method, $args) - { - if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(Style)$/', $method, $matches)) { - $index = null; - $argc = count($args); - $action = $matches['action']; - - if ('offsetSet' == $action) { - if (0 < $argc) { - $index = array_shift($args); - --$argc; - } - } - - if (1 > $argc) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf('Method "%s" requires minimally content for the stylesheet', $method)); - $e->setView($this->view); - throw $e; - } - - $content = $args[0]; - $attrs = array(); - if (isset($args[1])) { - $attrs = (array) $args[1]; - } - - $item = $this->createData($content, $attrs); - - if ('offsetSet' == $action) { - $this->offsetSet($index, $item); - } else { - $this->$action($item); - } - - return $this; - } - - return parent::__call($method, $args); - } - - /** - * Determine if a value is a valid style tag - * - * @param mixed $value - * @param string $method - * @return boolean - */ - protected function _isValid($value) - { - if ((!$value instanceof stdClass) - || !isset($value->content) - || !isset($value->attributes)) - { - return false; - } - - return true; - } - - /** - * Override append to enforce style creation - * - * @param mixed $value - * @return void - */ - public function append($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to append; please use appendStyle()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->append($value); - } - - /** - * Override offsetSet to enforce style creation - * - * @param string|int $index - * @param mixed $value - * @return void - */ - public function offsetSet($index, $value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetStyle()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->offsetSet($index, $value); - } - - /** - * Override prepend to enforce style creation - * - * @param mixed $value - * @return void - */ - public function prepend($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to prepend; please use prependStyle()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->prepend($value); - } - - /** - * Override set to enforce style creation - * - * @param mixed $value - * @return void - */ - public function set($value) - { - if (!$this->_isValid($value)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Invalid value passed to set; please use setStyle()'); - $e->setView($this->view); - throw $e; - } - - return $this->getContainer()->set($value); - } - - /** - * Start capture action - * - * @param mixed $captureType - * @param string $typeOrAttrs - * @return void - */ - public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $attrs = null) - { - if ($this->_captureLock) { - #require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; - $e = new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headStyle captures'); - $e->setView($this->view); - throw $e; - } - - $this->_captureLock = true; - $this->_captureAttrs = $attrs; - $this->_captureType = $type; - ob_start(); - } - - /** - * End capture action and store - * - * @return void - */ - public function captureEnd() - { - $content = ob_get_clean(); - $attrs = $this->_captureAttrs; - $this->_captureAttrs = null; - $this->_captureLock = false; - - switch ($this->_captureType) { - case Zend_View_Helper_Placeholder_Container_Abstract::SET: - $this->setStyle($content, $attrs); - break; - case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: - $this->prependStyle($content, $attrs); - break; - case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: - default: - $this->appendStyle($content, $attrs); - break; - } - } - - /** - * Convert content and attributes into valid style tag - * - * @param stdClass $item Item to render - * @param string $indent Indentation to use - * @return string - */ - public function itemToString(stdClass $item, $indent) - { - $attrString = ''; - if (!empty($item->attributes)) { - $enc = 'UTF-8'; - if ($this->view instanceof Zend_View_Interface - && method_exists($this->view, 'getEncoding') - ) { - $enc = $this->view->getEncoding(); - } - foreach ($item->attributes as $key => $value) { - if (!in_array($key, $this->_optionalAttributes)) { - continue; - } - if ('media' == $key) { - if(false === strpos($value, ',')) { - if (!in_array($value, $this->_mediaTypes)) { - continue; - } - } else { - $media_types = explode(',', $value); - $value = ''; - foreach($media_types as $type) { - $type = trim($type); - if (!in_array($type, $this->_mediaTypes)) { - continue; - } - $value .= $type .','; - } - $value = substr($value, 0, -1); - } - } - $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value, ENT_COMPAT, $enc)); - } - } - - $escapeStart = $indent . ''. PHP_EOL; - if (isset($item->attributes['conditional']) - && !empty($item->attributes['conditional']) - && is_string($item->attributes['conditional']) - ) { - $escapeStart = null; - $escapeEnd = null; - } - - $html = ''; - - if (null == $escapeStart && null == $escapeEnd) { - if (str_replace(' ', '', $item->attributes['conditional']) === '!IE') { - $html = '' . $html . ''; - } - - return $html; - } - - /** - * Create string representation of placeholder - * - * @param string|int $indent - * @return string - */ - public function toString($indent = null) - { - $indent = (null !== $indent) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - $items = array(); - $this->getContainer()->ksort(); - foreach ($this as $item) { - if (!$this->_isValid($item)) { - continue; - } - $items[] = $this->itemToString($item, $indent); - } - - $return = $indent . implode($this->getSeparator() . $indent, $items); - $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); - return $return; - } - - /** - * Create data item for use in stack - * - * @param string $content - * @param array $attributes - * @return stdClass - */ - public function createData($content, array $attributes) - { - if (!isset($attributes['media'])) { - $attributes['media'] = 'screen'; - } else if(is_array($attributes['media'])) { - $attributes['media'] = implode(',', $attributes['media']); - } - - $data = new stdClass(); - $data->content = $content; - $data->attributes = $attributes; - - return $data; - } -} diff --git a/library/Zend/View/Helper/HeadTitle.php b/library/Zend/View/Helper/HeadTitle.php deleted file mode 100644 index 6c24ee91ba..0000000000 --- a/library/Zend/View/Helper/HeadTitle.php +++ /dev/null @@ -1,222 +0,0 @@ -getDefaultAttachOrder()) - ? Zend_View_Helper_Placeholder_Container_Abstract::APPEND - : $this->getDefaultAttachOrder(); - } - $title = (string) $title; - if ($title !== '') { - if ($setType == Zend_View_Helper_Placeholder_Container_Abstract::SET) { - $this->set($title); - } elseif ($setType == Zend_View_Helper_Placeholder_Container_Abstract::PREPEND) { - $this->prepend($title); - } else { - $this->append($title); - } - } - - return $this; - } - - /** - * Set a default order to add titles - * - * @param string $setType - */ - public function setDefaultAttachOrder($setType) - { - if (!in_array($setType, array( - Zend_View_Helper_Placeholder_Container_Abstract::APPEND, - Zend_View_Helper_Placeholder_Container_Abstract::SET, - Zend_View_Helper_Placeholder_Container_Abstract::PREPEND - ))) { - #require_once 'Zend/View/Exception.php'; - throw new Zend_View_Exception("You must use a valid attach order: 'PREPEND', 'APPEND' or 'SET'"); - } - - $this->_defaultAttachOrder = $setType; - return $this; - } - - /** - * Get the default attach order, if any. - * - * @return mixed - */ - public function getDefaultAttachOrder() - { - return $this->_defaultAttachOrder; - } - - /** - * Sets a translation Adapter for translation - * - * @param Zend_Translate|Zend_Translate_Adapter $translate - * @return Zend_View_Helper_HeadTitle - */ - public function setTranslator($translate) - { - if ($translate instanceof Zend_Translate_Adapter) { - $this->_translator = $translate; - } elseif ($translate instanceof Zend_Translate) { - $this->_translator = $translate->getAdapter(); - } else { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception("You must set an instance of Zend_Translate or Zend_Translate_Adapter"); - $e->setView($this->view); - throw $e; - } - return $this; - } - - /** - * Retrieve translation object - * - * If none is currently registered, attempts to pull it from the registry - * using the key 'Zend_Translate'. - * - * @return Zend_Translate_Adapter|null - */ - public function getTranslator() - { - if (null === $this->_translator) { - #require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Translate')) { - $this->setTranslator(Zend_Registry::get('Zend_Translate')); - } - } - return $this->_translator; - } - - /** - * Enables translation - * - * @return Zend_View_Helper_HeadTitle - */ - public function enableTranslation() - { - $this->_translate = true; - return $this; - } - - /** - * Disables translation - * - * @return Zend_View_Helper_HeadTitle - */ - public function disableTranslation() - { - $this->_translate = false; - return $this; - } - - /** - * Turn helper into string - * - * @param string|null $indent - * @param string|null $locale - * @return string - */ - public function toString($indent = null, $locale = null) - { - $indent = (null !== $indent) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - $items = array(); - - if($this->_translate && $translator = $this->getTranslator()) { - foreach ($this as $item) { - $items[] = $translator->translate($item, $locale); - } - } else { - foreach ($this as $item) { - $items[] = $item; - } - } - - $separator = $this->getSeparator(); - $output = ''; - if(($prefix = $this->getPrefix())) { - $output .= $prefix; - } - $output .= implode($separator, $items); - if(($postfix = $this->getPostfix())) { - $output .= $postfix; - } - - $output = ($this->_autoEscape) ? $this->_escape($output) : $output; - - return $indent . '' . $output . ''; - } -} diff --git a/library/Zend/View/Helper/HtmlElement.php b/library/Zend/View/Helper/HtmlElement.php deleted file mode 100644 index 394a23608e..0000000000 --- a/library/Zend/View/Helper/HtmlElement.php +++ /dev/null @@ -1,167 +0,0 @@ -_closingBracket) { - if ($this->_isXhtml()) { - $this->_closingBracket = ' />'; - } else { - $this->_closingBracket = '>'; - } - } - - return $this->_closingBracket; - } - - /** - * Is doctype XHTML? - * - * @return boolean - */ - protected function _isXhtml() - { - $doctype = $this->view->doctype(); - return $doctype->isXhtml(); - } - - /** - * Is doctype HTML5? - * - * @return boolean - */ - protected function _isHtml5() - { - $doctype = $this->view->doctype(); - return $doctype->isHtml5(); - } - - /** - * Is doctype strict? - * - * @return boolean - */ - protected function _isStrictDoctype() - { - $doctype = $this->view->doctype(); - return $doctype->isStrict(); - } - - /** - * Converts an associative array to a string of tag attributes. - * - * @access public - * - * @param array $attribs From this array, each key-value pair is - * converted to an attribute name and value. - * - * @return string The XHTML for the attributes. - */ - protected function _htmlAttribs($attribs) - { - $xhtml = ''; - foreach ((array) $attribs as $key => $val) { - $key = $this->view->escape($key); - - if (('on' == substr($key, 0, 2)) || ('constraints' == $key)) { - // Don't escape event attributes; _do_ substitute double quotes with singles - if (!is_scalar($val)) { - // non-scalar data should be cast to JSON first - #require_once 'Zend/Json.php'; - $val = Zend_Json::encode($val); - } - // Escape single quotes inside event attribute values. - // This will create html, where the attribute value has - // single quotes around it, and escaped single quotes or - // non-escaped double quotes inside of it - $val = str_replace('\'', ''', $val); - } else { - if (is_array($val)) { - $val = implode(' ', $val); - } - $val = $this->view->escape($val); - } - - if ('id' == $key) { - $val = $this->_normalizeId($val); - } - - if (strpos($val, '"') !== false) { - $xhtml .= " $key='$val'"; - } else { - $xhtml .= " $key=\"$val\""; - } - - } - return $xhtml; - } - - /** - * Normalize an ID - * - * @param string $value - * @return string - */ - protected function _normalizeId($value) - { - if (strstr($value, '[')) { - if ('[]' == substr($value, -2)) { - $value = substr($value, 0, strlen($value) - 2); - } - $value = trim($value, ']'); - $value = str_replace('][', '-', $value); - $value = str_replace('[', '-', $value); - } - return $value; - } -} diff --git a/library/Zend/View/Helper/HtmlFlash.php b/library/Zend/View/Helper/HtmlFlash.php deleted file mode 100644 index 9dc000c651..0000000000 --- a/library/Zend/View/Helper/HtmlFlash.php +++ /dev/null @@ -1,60 +0,0 @@ - $data, - 'quality' => 'high'), $params); - - return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); - } -} diff --git a/library/Zend/View/Helper/HtmlList.php b/library/Zend/View/Helper/HtmlList.php deleted file mode 100644 index 188a8f1fe4..0000000000 --- a/library/Zend/View/Helper/HtmlList.php +++ /dev/null @@ -1,90 +0,0 @@ -setView($this->view); - throw $e; - } - - $list = ''; - - foreach ($items as $item) { - if (!is_array($item)) { - if ($escape) { - $item = $this->view->escape($item); - } - $list .= '
  • ' . $item . '
  • ' . self::EOL; - } else { - if (6 < strlen($list)) { - $list = substr($list, 0, strlen($list) - 6) - . $this->htmlList($item, $ordered, $attribs, $escape) . '' . self::EOL; - } else { - $list .= '
  • ' . $this->htmlList($item, $ordered, $attribs, $escape) . '
  • ' . self::EOL; - } - } - } - - if ($attribs) { - $attribs = $this->_htmlAttribs($attribs); - } else { - $attribs = ''; - } - - $tag = 'ul'; - if ($ordered) { - $tag = 'ol'; - } - - return '<' . $tag . $attribs . '>' . self::EOL . $list . '' . self::EOL; - } -} diff --git a/library/Zend/View/Helper/HtmlObject.php b/library/Zend/View/Helper/HtmlObject.php deleted file mode 100644 index 732146fd4a..0000000000 --- a/library/Zend/View/Helper/HtmlObject.php +++ /dev/null @@ -1,80 +0,0 @@ - $data, - 'type' => $type), $attribs); - - // Params - $paramHtml = array(); - $closingBracket = $this->getClosingBracket(); - - foreach ($params as $param => $options) { - if (is_string($options)) { - $options = array('value' => $options); - } - - $options = array_merge(array('name' => $param), $options); - - $paramHtml[] = '_htmlAttribs($options) . $closingBracket; - } - - // Content - if (is_array($content)) { - $content = implode(self::EOL, $content); - } - - // Object header - $xhtml = '_htmlAttribs($attribs) . '>' . self::EOL - . implode(self::EOL, $paramHtml) . self::EOL - . ($content ? $content . self::EOL : '') - . ''; - - return $xhtml; - } -} diff --git a/library/Zend/View/Helper/HtmlPage.php b/library/Zend/View/Helper/HtmlPage.php deleted file mode 100644 index 9b14c83331..0000000000 --- a/library/Zend/View/Helper/HtmlPage.php +++ /dev/null @@ -1,75 +0,0 @@ - self::ATTRIB_CLASSID); - - /** - * Output a html object tag - * - * @param string $data The html url - * @param array $attribs Attribs for the object tag - * @param array $params Params for in the object tag - * @param string $content Alternative content - * @return string - */ - public function htmlPage($data, array $attribs = array(), array $params = array(), $content = null) - { - // Attrs - $attribs = array_merge($this->_attribs, $attribs); - - // Params - $params = array_merge(array('data' => $data), $params); - - return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); - } -} diff --git a/library/Zend/View/Helper/HtmlQuicktime.php b/library/Zend/View/Helper/HtmlQuicktime.php deleted file mode 100644 index db0789970e..0000000000 --- a/library/Zend/View/Helper/HtmlQuicktime.php +++ /dev/null @@ -1,82 +0,0 @@ - self::ATTRIB_CLASSID, - 'codebase' => self::ATTRIB_CODEBASE); - - /** - * Output a quicktime movie object tag - * - * @param string $data The quicktime file - * @param array $attribs Attribs for the object tag - * @param array $params Params for in the object tag - * @param string $content Alternative content - * @return string - */ - public function htmlQuicktime($data, array $attribs = array(), array $params = array(), $content = null) - { - // Attrs - $attribs = array_merge($this->_attribs, $attribs); - - // Params - $params = array_merge(array('src' => $data), $params); - - return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); - } -} diff --git a/library/Zend/View/Helper/InlineScript.php b/library/Zend/View/Helper/InlineScript.php deleted file mode 100644 index 863c5e4eec..0000000000 --- a/library/Zend/View/Helper/InlineScript.php +++ /dev/null @@ -1,61 +0,0 @@ -headScript($mode, $spec, $placement, $attrs, $type); - } -} diff --git a/library/Zend/View/Helper/Interface.php b/library/Zend/View/Helper/Interface.php deleted file mode 100644 index c7e761b2a5..0000000000 --- a/library/Zend/View/Helper/Interface.php +++ /dev/null @@ -1,46 +0,0 @@ -true|false - * this array can contains a 'keepLayout'=>true|false and/or 'encodeData'=>true|false - * that will not be passed to Zend_Json::encode method but will be used here - * @param bool $encodeData - * @return string|void - */ - public function json($data, $keepLayouts = false, $encodeData = true) - { - $options = array(); - if (is_array($keepLayouts)) { - $options = $keepLayouts; - - $keepLayouts = false; - if (array_key_exists('keepLayouts', $options)) { - $keepLayouts = $options['keepLayouts']; - unset($options['keepLayouts']); - } - - if (array_key_exists('encodeData', $options)) { - $encodeData = $options['encodeData']; - unset($options['encodeData']); - } - } - - if ($encodeData) { - $data = Zend_Json::encode($data, null, $options); - } - if (!$keepLayouts) { - #require_once 'Zend/Layout.php'; - $layout = Zend_Layout::getMvcInstance(); - if ($layout instanceof Zend_Layout) { - $layout->disableLayout(); - } - } - - $response = Zend_Controller_Front::getInstance()->getResponse(); - $response->setHeader('Content-Type', 'application/json', true); - return $data; - } -} diff --git a/library/Zend/View/Helper/Layout.php b/library/Zend/View/Helper/Layout.php deleted file mode 100644 index 7a95bbf971..0000000000 --- a/library/Zend/View/Helper/Layout.php +++ /dev/null @@ -1,81 +0,0 @@ -_layout) { - #require_once 'Zend/Layout.php'; - $this->_layout = Zend_Layout::getMvcInstance(); - if (null === $this->_layout) { - // Implicitly creates layout object - $this->_layout = new Zend_Layout(); - } - } - - return $this->_layout; - } - - /** - * Set layout object - * - * @param Zend_Layout $layout - * @return Zend_Layout_Controller_Action_Helper_Layout - */ - public function setLayout(Zend_Layout $layout) - { - $this->_layout = $layout; - return $this; - } - - /** - * Return layout object - * - * Usage: $this->layout()->setLayout('alternate'); - * - * @return Zend_Layout - */ - public function layout() - { - return $this->getLayout(); - } -} diff --git a/library/Zend/View/Helper/Navigation.php b/library/Zend/View/Helper/Navigation.php deleted file mode 100644 index ccafa1d4b4..0000000000 --- a/library/Zend/View/Helper/Navigation.php +++ /dev/null @@ -1,350 +0,0 @@ -setContainer($container); - } - - return $this; - } - - /** - * Magic overload: Proxy to other navigation helpers or the container - * - * Examples of usage from a view script or layout: - * - * // proxy to Menu helper and render container: - * echo $this->navigation()->menu(); - * - * // proxy to Breadcrumbs helper and set indentation: - * $this->navigation()->breadcrumbs()->setIndent(8); - * - * // proxy to container and find all pages with 'blog' route: - * $blogPages = $this->navigation()->findAllByRoute('blog'); - * - * - * @param string $method helper name or method name in - * container - * @param array $arguments [optional] arguments to pass - * @return mixed returns what the proxied call returns - * @throws Zend_View_Exception if proxying to a helper, and the - * helper is not an instance of the - * interface specified in - * {@link findHelper()} - * @throws Zend_Navigation_Exception if method does not exist in container - */ - public function __call($method, array $arguments = array()) - { - // check if call should proxy to another helper - if ($helper = $this->findHelper($method, false)) { - return call_user_func_array(array($helper, $method), $arguments); - } - - // default behaviour: proxy call to container - return parent::__call($method, $arguments); - } - - /** - * Returns the helper matching $proxy - * - * The helper must implement the interface - * {@link Zend_View_Helper_Navigation_Helper}. - * - * @param string $proxy helper name - * @param bool $strict [optional] whether - * exceptions should be - * thrown if something goes - * wrong. Default is true. - * @return Zend_View_Helper_Navigation_Helper helper instance - * @throws Zend_Loader_PluginLoader_Exception if $strict is true and - * helper cannot be found - * @throws Zend_View_Exception if $strict is true and - * helper does not implement - * the specified interface - */ - public function findHelper($proxy, $strict = true) - { - if (isset($this->_helpers[$proxy])) { - return $this->_helpers[$proxy]; - } - - if (!$this->view->getPluginLoader('helper')->getPaths(self::NS)) { - // Add navigation helper path at the beginning - $paths = $this->view->getHelperPaths(); - $this->view->setHelperPath(null); - - $this->view->addHelperPath( - str_replace('_', '/', self::NS), - self::NS); - - foreach ($paths as $ns => $path) { - $this->view->addHelperPath($path, $ns); - } - } - - if ($strict) { - $helper = $this->view->getHelper($proxy); - } else { - try { - $helper = $this->view->getHelper($proxy); - } catch (Zend_Loader_PluginLoader_Exception $e) { - return null; - } - } - - if (!$helper instanceof Zend_View_Helper_Navigation_Helper) { - if ($strict) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - 'Proxy helper "%s" is not an instance of ' . - 'Zend_View_Helper_Navigation_Helper', - get_class($helper))); - $e->setView($this->view); - throw $e; - } - - return null; - } - - $this->_inject($helper); - $this->_helpers[$proxy] = $helper; - - return $helper; - } - - /** - * Injects container, ACL, and translator to the given $helper if this - * helper is configured to do so - * - * @param Zend_View_Helper_Navigation_Helper $helper helper instance - * @return void - */ - protected function _inject(Zend_View_Helper_Navigation_Helper $helper) - { - if ($this->getInjectContainer() && !$helper->hasContainer()) { - $helper->setContainer($this->getContainer()); - } - - if ($this->getInjectAcl()) { - if (!$helper->hasAcl()) { - $helper->setAcl($this->getAcl()); - } - if (!$helper->hasRole()) { - $helper->setRole($this->getRole()); - } - } - - if ($this->getInjectTranslator() && !$helper->hasTranslator()) { - $helper->setTranslator($this->getTranslator()); - } - } - - // Accessors: - - /** - * Sets the default proxy to use in {@link render()} - * - * @param string $proxy default proxy - * @return Zend_View_Helper_Navigation fluent interface, returns self - */ - public function setDefaultProxy($proxy) - { - $this->_defaultProxy = (string) $proxy; - return $this; - } - - /** - * Returns the default proxy to use in {@link render()} - * - * @return string the default proxy to use in {@link render()} - */ - public function getDefaultProxy() - { - return $this->_defaultProxy; - } - - /** - * Sets whether container should be injected when proxying - * - * @param bool $injectContainer [optional] whether container should - * be injected when proxying. Default - * is true. - * @return Zend_View_Helper_Navigation fluent interface, returns self - */ - public function setInjectContainer($injectContainer = true) - { - $this->_injectContainer = (bool) $injectContainer; - return $this; - } - - /** - * Returns whether container should be injected when proxying - * - * @return bool whether container should be injected when proxying - */ - public function getInjectContainer() - { - return $this->_injectContainer; - } - - /** - * Sets whether ACL should be injected when proxying - * - * @param bool $injectAcl [optional] whether ACL should be - * injected when proxying. Default is - * true. - * @return Zend_View_Helper_Navigation fluent interface, returns self - */ - public function setInjectAcl($injectAcl = true) - { - $this->_injectAcl = (bool) $injectAcl; - return $this; - } - - /** - * Returns whether ACL should be injected when proxying - * - * @return bool whether ACL should be injected when proxying - */ - public function getInjectAcl() - { - return $this->_injectAcl; - } - - /** - * Sets whether translator should be injected when proxying - * - * @param bool $injectTranslator [optional] whether translator should - * be injected when proxying. Default - * is true. - * @return Zend_View_Helper_Navigation fluent interface, returns self - */ - public function setInjectTranslator($injectTranslator = true) - { - $this->_injectTranslator = (bool) $injectTranslator; - return $this; - } - - /** - * Returns whether translator should be injected when proxying - * - * @return bool whether translator should be injected when proxying - */ - public function getInjectTranslator() - { - return $this->_injectTranslator; - } - - // Zend_View_Helper_Navigation_Helper: - - /** - * Renders helper - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - * @throws Zend_Loader_PluginLoader_Exception if helper cannot be found - * @throws Zend_View_Exception if helper doesn't implement - * the interface specified in - * {@link findHelper()} - */ - public function render(Zend_Navigation_Container $container = null) - { - $helper = $this->findHelper($this->getDefaultProxy()); - return $helper->render($container); - } -} diff --git a/library/Zend/View/Helper/Navigation/Breadcrumbs.php b/library/Zend/View/Helper/Navigation/Breadcrumbs.php deleted file mode 100644 index 34ff118901..0000000000 --- a/library/Zend/View/Helper/Navigation/Breadcrumbs.php +++ /dev/null @@ -1,331 +0,0 @@ -setContainer($container); - } - - return $this; - } - - // Accessors: - - /** - * Sets breadcrumb separator - * - * @param string $separator separator string - * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, - * returns self - */ - public function setSeparator($separator) - { - if (is_string($separator)) { - $this->_separator = $separator; - } - - return $this; - } - - /** - * Returns breadcrumb separator - * - * @return string breadcrumb separator - */ - public function getSeparator() - { - return $this->_separator; - } - - /** - * Sets whether last page in breadcrumbs should be hyperlinked - * - * @param bool $linkLast whether last page should - * be hyperlinked - * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, - * returns self - */ - public function setLinkLast($linkLast) - { - $this->_linkLast = (bool) $linkLast; - return $this; - } - - /** - * Returns whether last page in breadcrumbs should be hyperlinked - * - * @return bool whether last page in breadcrumbs should be hyperlinked - */ - public function getLinkLast() - { - return $this->_linkLast; - } - - /** - * Sets which partial view script to use for rendering menu - * - * @param string|array $partial partial view script or - * null. If an array is - * given, it is expected to - * contain two values; - * the partial view script - * to use, and the module - * where the script can be - * found. - * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, - * returns self - */ - public function setPartial($partial) - { - if (null === $partial || is_string($partial) || is_array($partial)) { - $this->_partial = $partial; - } - - return $this; - } - - /** - * Returns partial view script to use for rendering menu - * - * @return string|array|null - */ - public function getPartial() - { - return $this->_partial; - } - - // Render methods: - - /** - * Renders breadcrumbs by chaining 'a' elements with the separator - * registered in the helper - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - */ - public function renderStraight(Zend_Navigation_Container $container = null) - { - if (null === $container) { - $container = $this->getContainer(); - } - - // find deepest active - if (!$active = $this->findActive($container)) { - return ''; - } - - $active = $active['page']; - - // put the deepest active page last in breadcrumbs - if ($this->getLinkLast()) { - $html = $this->htmlify($active); - } else { - $html = $active->getLabel(); - if ($this->getUseTranslator() && $t = $this->getTranslator()) { - $html = $t->translate($html); - } - $html = $this->view->escape($html); - } - - // walk back to root - while ($parent = $active->getParent()) { - if ($parent instanceof Zend_Navigation_Page) { - // prepend crumb to html - $html = $this->htmlify($parent) - . $this->getSeparator() - . $html; - } - - if ($parent === $container) { - // at the root of the given container - break; - } - - $active = $parent; - } - - return strlen($html) ? $this->getIndent() . $html : ''; - } - - /** - * Renders the given $container by invoking the partial view helper - * - * The container will simply be passed on as a model to the view script, - * so in the script it will be available in $this->container. - * - * @param Zend_Navigation_Container $container [optional] container to - * pass to view script. - * Default is to use the - * container registered in the - * helper. - * @param string|array $partial [optional] partial view - * script to use. Default is - * to use the partial - * registered in the helper. - * If an array is given, it is - * expected to contain two - * values; the partial view - * script to use, and the - * module where the script can - * be found. - * @return string helper output - */ - public function renderPartial(Zend_Navigation_Container $container = null, - $partial = null) - { - if (null === $container) { - $container = $this->getContainer(); - } - - if (null === $partial) { - $partial = $this->getPartial(); - } - - if (empty($partial)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception( - 'Unable to render menu: No partial view script provided' - ); - $e->setView($this->view); - throw $e; - } - - // put breadcrumb pages in model - $model = array('pages' => array()); - if ($active = $this->findActive($container)) { - $active = $active['page']; - $model['pages'][] = $active; - while ($parent = $active->getParent()) { - if ($parent instanceof Zend_Navigation_Page) { - $model['pages'][] = $parent; - } else { - break; - } - - if ($parent === $container) { - // break if at the root of the given container - break; - } - - $active = $parent; - } - $model['pages'] = array_reverse($model['pages']); - } - - if (is_array($partial)) { - if (count($partial) != 2) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception( - 'Unable to render menu: A view partial supplied as ' - . 'an array must contain two values: partial view ' - . 'script and module where script can be found' - ); - $e->setView($this->view); - throw $e; - } - - return $this->view->partial($partial[0], $partial[1], $model); - } - - return $this->view->partial($partial, null, $model); - } - - // Zend_View_Helper_Navigation_Helper: - - /** - * Renders helper - * - * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - */ - public function render(Zend_Navigation_Container $container = null) - { - if ($partial = $this->getPartial()) { - return $this->renderPartial($container, $partial); - } else { - return $this->renderStraight($container); - } - } -} diff --git a/library/Zend/View/Helper/Navigation/Helper.php b/library/Zend/View/Helper/Navigation/Helper.php deleted file mode 100644 index e7d5878160..0000000000 --- a/library/Zend/View/Helper/Navigation/Helper.php +++ /dev/null @@ -1,212 +0,0 @@ -_container = $container; - return $this; - } - - /** - * Returns the navigation container helper operates on by default - * - * Implements {@link Zend_View_Helper_Navigation_Interface::getContainer()}. - * - * If a helper is not explicitly set in this helper instance by calling - * {@link setContainer()} or by passing it through the helper entry point, - * this method will look in {@link Zend_Registry} for a container by using - * the key 'Zend_Navigation'. - * - * If no container is set, and nothing is found in Zend_Registry, a new - * container will be instantiated and stored in the helper. - * - * @return Zend_Navigation_Container navigation container - */ - public function getContainer() - { - if (null === $this->_container) { - // try to fetch from registry first - #require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Navigation')) { - $nav = Zend_Registry::get('Zend_Navigation'); - if ($nav instanceof Zend_Navigation_Container) { - return $this->_container = $nav; - } - } - - // nothing found in registry, create new container - #require_once 'Zend/Navigation.php'; - $this->_container = new Zend_Navigation(); - } - - return $this->_container; - } - - /** - * Sets the minimum depth a page must have to be included when rendering - * - * @param int $minDepth [optional] minimum - * depth. Default is - * null, which sets - * no minimum depth. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setMinDepth($minDepth = null) - { - if (null === $minDepth || is_int($minDepth)) { - $this->_minDepth = $minDepth; - } else { - $this->_minDepth = (int) $minDepth; - } - return $this; - } - - /** - * Returns minimum depth a page must have to be included when rendering - * - * @return int|null minimum depth or null - */ - public function getMinDepth() - { - if (!is_int($this->_minDepth) || $this->_minDepth < 0) { - return 0; - } - return $this->_minDepth; - } - - /** - * Sets the maximum depth a page can have to be included when rendering - * - * @param int $maxDepth [optional] maximum - * depth. Default is - * null, which sets no - * maximum depth. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setMaxDepth($maxDepth = null) - { - if (null === $maxDepth || is_int($maxDepth)) { - $this->_maxDepth = $maxDepth; - } else { - $this->_maxDepth = (int) $maxDepth; - } - return $this; - } - - /** - * Returns maximum depth a page can have to be included when rendering - * - * @return int|null maximum depth or null - */ - public function getMaxDepth() - { - return $this->_maxDepth; - } - - /** - * Set the indentation string for using in {@link render()}, optionally a - * number of spaces to indent with - * - * @param string|int $indent indentation string or - * number of spaces - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setIndent($indent) - { - $this->_indent = $this->_getWhitespace($indent); - return $this; - } - - /** - * Returns indentation (format output is respected) - * - * @return string indentation string or an empty string - */ - public function getIndent() - { - if (false === $this->getFormatOutput()) { - return ''; - } - - return $this->_indent; - } - - /** - * Returns the EOL character (format output is respected) - * - * @see self::EOL - * @see getFormatOutput() - * - * @return string standard EOL charater or an empty string - */ - public function getEOL() - { - if (false === $this->getFormatOutput()) { - return ''; - } - - return self::EOL; - } - - /** - * Sets whether HTML/XML output should be formatted - * - * @param bool $formatOutput [optional] whether output - * should be formatted. Default - * is true. - * - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function setFormatOutput($formatOutput = true) - { - $this->_formatOutput = (bool)$formatOutput; - - return $this; - } - - /** - * Returns whether HTML/XML output should be formatted - * - * @return bool whether HTML/XML output should be formatted - */ - public function getFormatOutput() - { - return $this->_formatOutput; - } - - /** - * Sets prefix for IDs when they are normalized - * - * @param string $prefix Prefix for IDs - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, returns self - */ - public function setPrefixForId($prefix) - { - if (is_string($prefix)) { - $this->_prefixForId = trim($prefix); - } - - return $this; - } - - /** - * Returns prefix for IDs when they are normalized - * - * @return string Prefix for - */ - public function getPrefixForId() - { - if (null === $this->_prefixForId) { - $prefix = get_class($this); - $this->_prefixForId = strtolower( - trim(substr($prefix, strrpos($prefix, '_')), '_') - ) . '-'; - } - - return $this->_prefixForId; - } - - /** - * Skip the current prefix for IDs when they are normalized - * - * @param bool $flag - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, returns self - */ - public function skipPrefixForId($flag = true) - { - $this->_skipPrefixForId = (bool) $flag; - return $this; - } - - /** - * Sets translator to use in helper - * - * Implements {@link Zend_View_Helper_Navigation_Helper::setTranslator()}. - * - * @param mixed $translator [optional] translator. - * Expects an object of - * type - * {@link Zend_Translate_Adapter} - * or {@link Zend_Translate}, - * or null. Default is - * null, which sets no - * translator. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setTranslator($translator = null) - { - if (null == $translator || - $translator instanceof Zend_Translate_Adapter) { - $this->_translator = $translator; - } elseif ($translator instanceof Zend_Translate) { - $this->_translator = $translator->getAdapter(); - } - - return $this; - } - - /** - * Returns translator used in helper - * - * Implements {@link Zend_View_Helper_Navigation_Helper::getTranslator()}. - * - * @return Zend_Translate_Adapter|null translator or null - */ - public function getTranslator() - { - if (null === $this->_translator) { - #require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Translate')) { - $this->setTranslator(Zend_Registry::get('Zend_Translate')); - } - } - - return $this->_translator; - } - - /** - * Sets ACL to use when iterating pages - * - * Implements {@link Zend_View_Helper_Navigation_Helper::setAcl()}. - * - * @param Zend_Acl $acl [optional] ACL object. - * Default is null. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setAcl(Zend_Acl $acl = null) - { - $this->_acl = $acl; - return $this; - } - - /** - * Returns ACL or null if it isn't set using {@link setAcl()} or - * {@link setDefaultAcl()} - * - * Implements {@link Zend_View_Helper_Navigation_Helper::getAcl()}. - * - * @return Zend_Acl|null ACL object or null - */ - public function getAcl() - { - if ($this->_acl === null && self::$_defaultAcl !== null) { - return self::$_defaultAcl; - } - - return $this->_acl; - } - - /** - * Sets ACL role(s) to use when iterating pages - * - * Implements {@link Zend_View_Helper_Navigation_Helper::setRole()}. - * - * @param mixed $role [optional] role to - * set. Expects a string, - * an instance of type - * {@link Zend_Acl_Role_Interface}, - * or null. Default is - * null, which will set - * no role. - * @throws Zend_View_Exception if $role is invalid - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setRole($role = null) - { - if (null === $role || is_string($role) || - $role instanceof Zend_Acl_Role_Interface) { - $this->_role = $role; - } else { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - '$role must be a string, null, or an instance of ' - . 'Zend_Acl_Role_Interface; %s given', - gettype($role) - )); - $e->setView($this->view); - throw $e; - } - - return $this; - } - - /** - * Returns ACL role to use when iterating pages, or null if it isn't set - * using {@link setRole()} or {@link setDefaultRole()} - * - * Implements {@link Zend_View_Helper_Navigation_Helper::getRole()}. - * - * @return string|Zend_Acl_Role_Interface|null role or null - */ - public function getRole() - { - if ($this->_role === null && self::$_defaultRole !== null) { - return self::$_defaultRole; - } - - return $this->_role; - } - - /** - * Sets whether ACL should be used - * - * Implements {@link Zend_View_Helper_Navigation_Helper::setUseAcl()}. - * - * @param bool $useAcl [optional] whether ACL - * should be used. - * Default is true. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setUseAcl($useAcl = true) - { - $this->_useAcl = (bool) $useAcl; - return $this; - } - - /** - * Returns whether ACL should be used - * - * Implements {@link Zend_View_Helper_Navigation_Helper::getUseAcl()}. - * - * @return bool whether ACL should be used - */ - public function getUseAcl() - { - return $this->_useAcl; - } - - /** - * Return renderInvisible flag - * - * @return bool - */ - public function getRenderInvisible() - { - return $this->_renderInvisible; - } - - /** - * Render invisible items? - * - * @param bool $renderInvisible [optional] boolean flag - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface - * returns self - */ - public function setRenderInvisible($renderInvisible = true) - { - $this->_renderInvisible = (bool) $renderInvisible; - return $this; - } - - /** - * Sets whether translator should be used - * - * Implements {@link Zend_View_Helper_Navigation_Helper::setUseTranslator()}. - * - * @param bool $useTranslator [optional] whether - * translator should be - * used. Default is true. - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setUseTranslator($useTranslator = true) - { - $this->_useTranslator = (bool) $useTranslator; - return $this; - } - - /** - * Returns whether translator should be used - * - * Implements {@link Zend_View_Helper_Navigation_Helper::getUseTranslator()}. - * - * @return bool whether translator should be used - */ - public function getUseTranslator() - { - return $this->_useTranslator; - } - - // Magic overloads: - - /** - * Magic overload: Proxy calls to the navigation container - * - * @param string $method method name in container - * @param array $arguments [optional] arguments to pass - * @return mixed returns what the container returns - * @throws Zend_Navigation_Exception if method does not exist in container - */ - public function __call($method, array $arguments = array()) - { - return call_user_func_array( - array($this->getContainer(), $method), - $arguments); - } - - /** - * Magic overload: Proxy to {@link render()}. - * - * This method will trigger an E_USER_ERROR if rendering the helper causes - * an exception to be thrown. - * - * Implements {@link Zend_View_Helper_Navigation_Helper::__toString()}. - * - * @return string - */ - public function __toString() - { - try { - return $this->render(); - } catch (Exception $e) { - $msg = get_class($e) . ': ' . $e->getMessage(); - trigger_error($msg, E_USER_ERROR); - return ''; - } - } - - // Public methods: - - /** - * Finds the deepest active page in the given container - * - * @param Zend_Navigation_Container $container container to search - * @param int|null $minDepth [optional] minimum depth - * required for page to be - * valid. Default is to use - * {@link getMinDepth()}. A - * null value means no minimum - * depth required. - * @param int|null $minDepth [optional] maximum depth - * a page can have to be - * valid. Default is to use - * {@link getMaxDepth()}. A - * null value means no maximum - * depth required. - * @return array an associative array with - * the values 'depth' and - * 'page', or an empty array - * if not found - */ - public function findActive(Zend_Navigation_Container $container, - $minDepth = null, - $maxDepth = -1) - { - if (!is_int($minDepth)) { - $minDepth = $this->getMinDepth(); - } - if ((!is_int($maxDepth) || $maxDepth < 0) && null !== $maxDepth) { - $maxDepth = $this->getMaxDepth(); - } - - $found = null; - $foundDepth = -1; - $iterator = new RecursiveIteratorIterator($container, - RecursiveIteratorIterator::CHILD_FIRST); - - foreach ($iterator as $page) { - $currDepth = $iterator->getDepth(); - if ($currDepth < $minDepth || !$this->accept($page)) { - // page is not accepted - continue; - } - - if ($page->isActive(false) && $currDepth > $foundDepth) { - // found an active page at a deeper level than before - $found = $page; - $foundDepth = $currDepth; - } - } - - if (is_int($maxDepth) && $foundDepth > $maxDepth) { - while ($foundDepth > $maxDepth) { - if (--$foundDepth < $minDepth) { - $found = null; - break; - } - - $found = $found->getParent(); - if (!$found instanceof Zend_Navigation_Page) { - $found = null; - break; - } - } - } - - if ($found) { - return array('page' => $found, 'depth' => $foundDepth); - } else { - return array(); - } - } - - /** - * Checks if the helper has a container - * - * Implements {@link Zend_View_Helper_Navigation_Helper::hasContainer()}. - * - * @return bool whether the helper has a container or not - */ - public function hasContainer() - { - return null !== $this->_container; - } - - /** - * Checks if the helper has an ACL instance - * - * Implements {@link Zend_View_Helper_Navigation_Helper::hasAcl()}. - * - * @return bool whether the helper has a an ACL instance or not - */ - public function hasAcl() - { - return null !== $this->_acl; - } - - /** - * Checks if the helper has an ACL role - * - * Implements {@link Zend_View_Helper_Navigation_Helper::hasRole()}. - * - * @return bool whether the helper has a an ACL role or not - */ - public function hasRole() - { - return null !== $this->_role; - } - - /** - * Checks if the helper has a translator - * - * Implements {@link Zend_View_Helper_Navigation_Helper::hasTranslator()}. - * - * @return bool whether the helper has a translator or not - */ - public function hasTranslator() - { - return null !== $this->_translator; - } - - /** - * Returns an HTML string containing an 'a' element for the given page - * - * @param Zend_Navigation_Page $page page to generate HTML for - * @return string HTML string for the given page - */ - public function htmlify(Zend_Navigation_Page $page) - { - // get label and title for translating - $label = $page->getLabel(); - $title = $page->getTitle(); - - if ($this->getUseTranslator() && $t = $this->getTranslator()) { - if (is_string($label) && !empty($label)) { - $label = $t->translate($label); - } - if (is_string($title) && !empty($title)) { - $title = $t->translate($title); - } - } - - // get attribs for anchor element - $attribs = array_merge( - array( - 'id' => $page->getId(), - 'title' => $title, - 'class' => $page->getClass(), - 'href' => $page->getHref(), - 'target' => $page->getTarget() - ), - $page->getCustomHtmlAttribs() - ); - - return '_htmlAttribs($attribs) . '>' - . $this->view->escape($label) - . ''; - } - - // Iterator filter methods: - - /** - * Determines whether a page should be accepted when iterating - * - * Rules: - * - If a page is not visible it is not accepted, unless RenderInvisible has - * been set to true. - * - If helper has no ACL, page is accepted - * - If helper has ACL, but no role, page is not accepted - * - If helper has ACL and role: - * - Page is accepted if it has no resource or privilege - * - Page is accepted if ACL allows page's resource or privilege - * - If page is accepted by the rules above and $recursive is true, the page - * will not be accepted if it is the descendant of a non-accepted page. - * - * @param Zend_Navigation_Page $page page to check - * @param bool $recursive [optional] if true, page will not - * be accepted if it is the - * descendant of a page that is not - * accepted. Default is true. - * @return bool whether page should be accepted - */ - public function accept(Zend_Navigation_Page $page, $recursive = true) - { - // accept by default - $accept = true; - - if (!$page->isVisible(false) && !$this->getRenderInvisible()) { - // don't accept invisible pages - $accept = false; - } elseif ($this->getUseAcl() && !$this->_acceptAcl($page)) { - // acl is not amused - $accept = false; - } - - if ($accept && $recursive) { - $parent = $page->getParent(); - if ($parent instanceof Zend_Navigation_Page) { - $accept = $this->accept($parent, true); - } - } - - return $accept; - } - - /** - * Determines whether a page should be accepted by ACL when iterating - * - * Rules: - * - If helper has no ACL, page is accepted - * - If page has a resource or privilege defined, page is accepted - * if the ACL allows access to it using the helper's role - * - If page has no resource or privilege, page is accepted - * - * @param Zend_Navigation_Page $page page to check - * @return bool whether page is accepted by ACL - */ - protected function _acceptAcl(Zend_Navigation_Page $page) - { - if (!$acl = $this->getAcl()) { - // no acl registered means don't use acl - return true; - } - - $role = $this->getRole(); - $resource = $page->getResource(); - $privilege = $page->getPrivilege(); - - if ($resource || $privilege) { - // determine using helper role and page resource/privilege - return $acl->isAllowed($role, $resource, $privilege); - } - - return true; - } - - // Util methods: - - /** - * Retrieve whitespace representation of $indent - * - * @param int|string $indent - * @return string - */ - protected function _getWhitespace($indent) - { - if (is_int($indent)) { - $indent = str_repeat(' ', $indent); - } - - return (string) $indent; - } - - /** - * Converts an associative array to a string of tag attributes. - * - * Overloads {@link Zend_View_Helper_HtmlElement::_htmlAttribs()}. - * - * @param array $attribs an array where each key-value pair is converted - * to an attribute name and value - * @return string an attribute string - */ - protected function _htmlAttribs($attribs) - { - // filter out null values and empty string values - foreach ($attribs as $key => $value) { - if ($value === null || (is_string($value) && !strlen($value))) { - unset($attribs[$key]); - } - } - - return parent::_htmlAttribs($attribs); - } - - /** - * Normalize an ID - * - * Extends {@link Zend_View_Helper_HtmlElement::_normalizeId()}. - * - * @param string $value ID - * @return string Normalized ID - */ - protected function _normalizeId($value) - { - if (false === $this->_skipPrefixForId) { - $prefix = $this->getPrefixForId(); - - if (strlen($prefix)) { - return $prefix . $value; - } - } - - return parent::_normalizeId($value); - } - - // Static methods: - - /** - * Sets default ACL to use if another ACL is not explicitly set - * - * @param Zend_Acl $acl [optional] ACL object. Default is null, which - * sets no ACL object. - * @return void - */ - public static function setDefaultAcl(Zend_Acl $acl = null) - { - self::$_defaultAcl = $acl; - } - - /** - * Sets default ACL role(s) to use when iterating pages if not explicitly - * set later with {@link setRole()} - * - * @param mixed $role [optional] role to set. Expects null, - * string, or an instance of - * {@link Zend_Acl_Role_Interface}. - * Default is null, which sets no default - * role. - * @throws Zend_View_Exception if role is invalid - * @return void - */ - public static function setDefaultRole($role = null) - { - if (null === $role || - is_string($role) || - $role instanceof Zend_Acl_Role_Interface) { - self::$_defaultRole = $role; - } else { - #require_once 'Zend/View/Exception.php'; - throw new Zend_View_Exception( - '$role must be null|string|Zend_Acl_Role_Interface' - ); - } - } -} diff --git a/library/Zend/View/Helper/Navigation/Links.php b/library/Zend/View/Helper/Navigation/Links.php deleted file mode 100644 index f3356692f4..0000000000 --- a/library/Zend/View/Helper/Navigation/Links.php +++ /dev/null @@ -1,783 +0,0 @@ - elements - * - * @category Zend - * @package Zend_View - * @subpackage Helper - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_View_Helper_Navigation_Links - extends Zend_View_Helper_Navigation_HelperAbstract -{ - /**#@+ - * Constants used for specifying which link types to find and render - * - * @var int - */ - const RENDER_ALTERNATE = 0x0001; - const RENDER_STYLESHEET = 0x0002; - const RENDER_START = 0x0004; - const RENDER_NEXT = 0x0008; - const RENDER_PREV = 0x0010; - const RENDER_CONTENTS = 0x0020; - const RENDER_INDEX = 0x0040; - const RENDER_GLOSSARY = 0x0080; - const RENDER_COPYRIGHT = 0x0100; - const RENDER_CHAPTER = 0x0200; - const RENDER_SECTION = 0x0400; - const RENDER_SUBSECTION = 0x0800; - const RENDER_APPENDIX = 0x1000; - const RENDER_HELP = 0x2000; - const RENDER_BOOKMARK = 0x4000; - const RENDER_CUSTOM = 0x8000; - const RENDER_ALL = 0xffff; - /**#@+**/ - - /** - * Maps render constants to W3C link types - * - * @var array - */ - protected static $_RELATIONS = array( - self::RENDER_ALTERNATE => 'alternate', - self::RENDER_STYLESHEET => 'stylesheet', - self::RENDER_START => 'start', - self::RENDER_NEXT => 'next', - self::RENDER_PREV => 'prev', - self::RENDER_CONTENTS => 'contents', - self::RENDER_INDEX => 'index', - self::RENDER_GLOSSARY => 'glossary', - self::RENDER_COPYRIGHT => 'copyright', - self::RENDER_CHAPTER => 'chapter', - self::RENDER_SECTION => 'section', - self::RENDER_SUBSECTION => 'subsection', - self::RENDER_APPENDIX => 'appendix', - self::RENDER_HELP => 'help', - self::RENDER_BOOKMARK => 'bookmark' - ); - - /** - * The helper's render flag - * - * @see render() - * @see setRenderFlag() - * @var int - */ - protected $_renderFlag = self::RENDER_ALL; - - /** - * Root container - * - * Used for preventing methods to traverse above the container given to - * the {@link render()} method. - * - * @see _findRoot() - * - * @var Zend_Navigation_Container - */ - protected $_root; - - /** - * View helper entry point: - * Retrieves helper and optionally sets container to operate on - * - * @param Zend_Navigation_Container $container [optional] container to - * operate on - * @return Zend_View_Helper_Navigation_Links fluent interface, returns - * self - */ - public function links(Zend_Navigation_Container $container = null) - { - if (null !== $container) { - $this->setContainer($container); - } - - return $this; - } - - /** - * Magic overload: Proxy calls to {@link findRelation()} or container - * - * Examples of finder calls: - * - * // METHOD // SAME AS - * $h->findRelNext($page); // $h->findRelation($page, 'rel', 'next') - * $h->findRevSection($page); // $h->findRelation($page, 'rev', 'section'); - * $h->findRelFoo($page); // $h->findRelation($page, 'rel', 'foo'); - * - * - * @param string $method method name - * @param array $arguments method arguments - * @throws Zend_Navigation_Exception if method does not exist in container - */ - public function __call($method, array $arguments = array()) - { - if (@preg_match('/find(Rel|Rev)(.+)/', $method, $match)) { - return $this->findRelation($arguments[0], - strtolower($match[1]), - strtolower($match[2])); - } - - return parent::__call($method, $arguments); - } - - // Accessors: - - /** - * Sets the helper's render flag - * - * The helper uses the bitwise '&' operator against the hex values of the - * render constants. This means that the flag can is "bitwised" value of - * the render constants. Examples: - * - * // render all links except glossary - * $flag = Zend_View_Helper_Navigation_Links:RENDER_ALL ^ - * Zend_View_Helper_Navigation_Links:RENDER_GLOSSARY; - * $helper->setRenderFlag($flag); - * - * // render only chapters and sections - * $flag = Zend_View_Helper_Navigation_Links:RENDER_CHAPTER | - * Zend_View_Helper_Navigation_Links:RENDER_SECTION; - * $helper->setRenderFlag($flag); - * - * // render only relations that are not native W3C relations - * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_CUSTOM); - * - * // render all relations (default) - * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_ALL); - * - * - * Note that custom relations can also be rendered directly using the - * {@link renderLink()} method. - * - * @param int $renderFlag render flag - * @return Zend_View_Helper_Navigation_Links fluent interface, returns self - */ - public function setRenderFlag($renderFlag) - { - $this->_renderFlag = (int) $renderFlag; - return $this; - } - - /** - * Returns the helper's render flag - * - * @return int render flag - */ - public function getRenderFlag() - { - return $this->_renderFlag; - } - - // Finder methods: - - /** - * Finds all relations (forward and reverse) for the given $page - * - * The form of the returned array: - * - * // $page denotes an instance of Zend_Navigation_Page - * $returned = array( - * 'rel' => array( - * 'alternate' => array($page, $page, $page), - * 'start' => array($page), - * 'next' => array($page), - * 'prev' => array($page), - * 'canonical' => array($page) - * ), - * 'rev' => array( - * 'section' => array($page) - * ) - * ); - * - * - * @param Zend_Navigation_Page $page page to find links for - * @return array related pages - */ - public function findAllRelations(Zend_Navigation_Page $page, - $flag = null) - { - if (!is_int($flag)) { - $flag = self::RENDER_ALL; - } - - $result = array('rel' => array(), 'rev' => array()); - $native = array_values(self::$_RELATIONS); - - foreach (array_keys($result) as $rel) { - $meth = 'getDefined' . ucfirst($rel); - $types = array_merge($native, array_diff($page->$meth(), $native)); - - foreach ($types as $type) { - if (!$relFlag = array_search($type, self::$_RELATIONS)) { - $relFlag = self::RENDER_CUSTOM; - } - if (!($flag & $relFlag)) { - continue; - } - if ($found = $this->findRelation($page, $rel, $type)) { - if (!is_array($found)) { - $found = array($found); - } - $result[$rel][$type] = $found; - } - } - } - - return $result; - } - - /** - * Finds relations of the given $rel=$type from $page - * - * This method will first look for relations in the page instance, then - * by searching the root container if nothing was found in the page. - * - * @param Zend_Navigation_Page $page page to find relations for - * @param string $rel relation, "rel" or "rev" - * @param string $type link type, e.g. 'start', 'next' - * @return Zend_Navigaiton_Page|array|null page(s), or null if not found - * @throws Zend_View_Exception if $rel is not "rel" or "rev" - */ - public function findRelation(Zend_Navigation_Page $page, $rel, $type) - { - if (!in_array($rel, array('rel', 'rev'))) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - 'Invalid argument: $rel must be "rel" or "rev"; "%s" given', - $rel)); - $e->setView($this->view); - throw $e; - } - - if (!$result = $this->_findFromProperty($page, $rel, $type)) { - $result = $this->_findFromSearch($page, $rel, $type); - } - - return $result; - } - - /** - * Finds relations of given $type for $page by checking if the - * relation is specified as a property of $page - * - * @param Zend_Navigation_Page $page page to find relations for - * @param string $rel relation, 'rel' or 'rev' - * @param string $type link type, e.g. 'start', 'next' - * @return Zend_Navigation_Page|array|null page(s), or null if not found - */ - protected function _findFromProperty(Zend_Navigation_Page $page, $rel, $type) - { - $method = 'get' . ucfirst($rel); - if ($result = $page->$method($type)) { - if ($result = $this->_convertToPages($result)) { - if (!is_array($result)) { - $result = array($result); - } - - foreach ($result as $key => $page) { - if (!$this->accept($page)) { - unset($result[$key]); - } - } - - return count($result) == 1 ? $result[0] : $result; - } - } - - return null; - } - - /** - * Finds relations of given $rel=$type for $page by using the helper to - * search for the relation in the root container - * - * @param Zend_Navigation_Page $page page to find relations for - * @param string $rel relation, 'rel' or 'rev' - * @param string $type link type, e.g. 'start', 'next', etc - * @return array|null array of pages, or null if not found - */ - protected function _findFromSearch(Zend_Navigation_Page $page, $rel, $type) - { - $found = null; - - $method = 'search' . ucfirst($rel) . ucfirst($type); - if (method_exists($this, $method)) { - $found = $this->$method($page); - } - - return $found; - } - - // Search methods: - - /** - * Searches the root container for the forward 'start' relation of the given - * $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to the first document in a collection of documents. This link type - * tells search engines which document is considered by the author to be the - * starting point of the collection. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|null page or null - */ - public function searchRelStart(Zend_Navigation_Page $page) - { - $found = $this->_findRoot($page); - if (!$found instanceof Zend_Navigation_Page) { - $found->rewind(); - $found = $found->current(); - } - - if ($found === $page || !$this->accept($found)) { - $found = null; - } - - return $found; - } - - /** - * Searches the root container for the forward 'next' relation of the given - * $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to the next document in a linear sequence of documents. User - * agents may choose to preload the "next" document, to reduce the perceived - * load time. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|null page(s) or null - */ - public function searchRelNext(Zend_Navigation_Page $page) - { - $found = null; - $break = false; - $iterator = new RecursiveIteratorIterator($this->_findRoot($page), - RecursiveIteratorIterator::SELF_FIRST); - foreach ($iterator as $intermediate) { - if ($intermediate === $page) { - // current page; break at next accepted page - $break = true; - continue; - } - - if ($break && $this->accept($intermediate)) { - $found = $intermediate; - break; - } - } - - return $found; - } - - /** - * Searches the root container for the forward 'prev' relation of the given - * $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to the previous document in an ordered series of documents. Some - * user agents also support the synonym "Previous". - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|null page or null - */ - public function searchRelPrev(Zend_Navigation_Page $page) - { - $found = null; - $prev = null; - $iterator = new RecursiveIteratorIterator( - $this->_findRoot($page), - RecursiveIteratorIterator::SELF_FIRST); - foreach ($iterator as $intermediate) { - if (!$this->accept($intermediate)) { - continue; - } - if ($intermediate === $page) { - $found = $prev; - break; - } - - $prev = $intermediate; - } - - return $found; - } - - /** - * Searches the root container for forward 'chapter' relations of the given - * $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to a document serving as a chapter in a collection of documents. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|array|null page(s) or null - */ - public function searchRelChapter(Zend_Navigation_Page $page) - { - $found = array(); - - // find first level of pages - $root = $this->_findRoot($page); - - // find start page(s) - $start = $this->findRelation($page, 'rel', 'start'); - if (!is_array($start)) { - $start = array($start); - } - - foreach ($root as $chapter) { - // exclude self and start page from chapters - if ($chapter !== $page && - !in_array($chapter, $start) && - $this->accept($chapter)) { - $found[] = $chapter; - } - } - - switch (count($found)) { - case 0: - return null; - case 1: - return $found[0]; - default: - return $found; - } - } - - /** - * Searches the root container for forward 'section' relations of the given - * $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to a document serving as a section in a collection of documents. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|array|null page(s) or null - */ - public function searchRelSection(Zend_Navigation_Page $page) - { - $found = array(); - - // check if given page has pages and is a chapter page - if ($page->hasPages() && $this->_findRoot($page)->hasPage($page)) { - foreach ($page as $section) { - if ($this->accept($section)) { - $found[] = $section; - } - } - } - - switch (count($found)) { - case 0: - return null; - case 1: - return $found[0]; - default: - return $found; - } - } - - /** - * Searches the root container for forward 'subsection' relations of the - * given $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to a document serving as a subsection in a collection of - * documents. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|array|null page(s) or null - */ - public function searchRelSubsection(Zend_Navigation_Page $page) - { - $found = array(); - - if ($page->hasPages()) { - // given page has child pages, loop chapters - foreach ($this->_findRoot($page) as $chapter) { - // is page a section? - if ($chapter->hasPage($page)) { - foreach ($page as $subsection) { - if ($this->accept($subsection)) { - $found[] = $subsection; - } - } - } - } - } - - switch (count($found)) { - case 0: - return null; - case 1: - return $found[0]; - default: - return $found; - } - } - - /** - * Searches the root container for the reverse 'section' relation of the - * given $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to a document serving as a section in a collection of documents. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|null page(s) or null - */ - public function searchRevSection(Zend_Navigation_Page $page) - { - $found = null; - - if ($parent = $page->getParent()) { - if ($parent instanceof Zend_Navigation_Page && - $this->_findRoot($page)->hasPage($parent)) { - $found = $parent; - } - } - - return $found; - } - - /** - * Searches the root container for the reverse 'section' relation of the - * given $page - * - * From {@link http://www.w3.org/TR/html4/types.html#type-links}: - * Refers to a document serving as a subsection in a collection of - * documents. - * - * @param Zend_Navigation_Page $page page to find relation for - * @return Zend_Navigation_Page|null page(s) or null - */ - public function searchRevSubsection(Zend_Navigation_Page $page) - { - $found = null; - - if ($parent = $page->getParent()) { - if ($parent instanceof Zend_Navigation_Page) { - $root = $this->_findRoot($page); - foreach ($root as $chapter) { - if ($chapter->hasPage($parent)) { - $found = $parent; - break; - } - } - } - } - - return $found; - } - - // Util methods: - - /** - * Returns the root container of the given page - * - * When rendering a container, the render method still store the given - * container as the root container, and unset it when done rendering. This - * makes sure finder methods will not traverse above the container given - * to the render method. - * - * @param Zend_Navigaiton_Page $page page to find root for - * @return Zend_Navigation_Container the root container of the given page - */ - protected function _findRoot(Zend_Navigation_Page $page) - { - if ($this->_root) { - return $this->_root; - } - - $root = $page; - - while ($parent = $page->getParent()) { - $root = $parent; - if ($parent instanceof Zend_Navigation_Page) { - $page = $parent; - } else { - break; - } - } - - return $root; - } - - /** - * Converts a $mixed value to an array of pages - * - * @param mixed $mixed mixed value to get page(s) from - * @param bool $recursive whether $value should be looped - * if it is an array or a config - * @return Zend_Navigation_Page|array|null empty if unable to convert - */ - protected function _convertToPages($mixed, $recursive = true) - { - if (is_object($mixed)) { - if ($mixed instanceof Zend_Navigation_Page) { - // value is a page instance; return directly - return $mixed; - } elseif ($mixed instanceof Zend_Navigation_Container) { - // value is a container; return pages in it - $pages = array(); - foreach ($mixed as $page) { - $pages[] = $page; - } - return $pages; - } elseif ($mixed instanceof Zend_Config) { - // convert config object to array and extract - return $this->_convertToPages($mixed->toArray(), $recursive); - } - } elseif (is_string($mixed)) { - // value is a string; make an URI page - return Zend_Navigation_Page::factory(array( - 'type' => 'uri', - 'uri' => $mixed - )); - } elseif (is_array($mixed) && !empty($mixed)) { - if ($recursive && is_numeric(key($mixed))) { - // first key is numeric; assume several pages - $pages = array(); - foreach ($mixed as $value) { - if ($value = $this->_convertToPages($value, false)) { - $pages[] = $value; - } - } - return $pages; - } else { - // pass array to factory directly - try { - $page = Zend_Navigation_Page::factory($mixed); - return $page; - } catch (Exception $e) { - } - } - } - - // nothing found - return null; - } - - // Render methods: - - /** - * Renders the given $page as a link element, with $attrib = $relation - * - * @param Zend_Navigation_Page $page the page to render the link for - * @param string $attrib the attribute to use for $type, - * either 'rel' or 'rev' - * @param string $relation relation type, muse be one of; - * alternate, appendix, bookmark, - * chapter, contents, copyright, - * glossary, help, home, index, next, - * prev, section, start, stylesheet, - * subsection - * @return string rendered link element - * @throws Zend_View_Exception if $attrib is invalid - */ - public function renderLink(Zend_Navigation_Page $page, $attrib, $relation) - { - if (!in_array($attrib, array('rel', 'rev'))) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - 'Invalid relation attribute "%s", must be "rel" or "rev"', - $attrib)); - $e->setView($this->view); - throw $e; - } - - if (!$href = $page->getHref()) { - return ''; - } - - // TODO: add more attribs - // http://www.w3.org/TR/html401/struct/links.html#h-12.2 - $attribs = array( - $attrib => $relation, - 'href' => $href, - 'title' => $page->getLabel() - ); - - return '_htmlAttribs($attribs) . - $this->getClosingBracket(); - } - - // Zend_View_Helper_Navigation_Helper: - - /** - * Renders helper - * - * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - */ - public function render(Zend_Navigation_Container $container = null) - { - if (null === $container) { - $container = $this->getContainer(); - } - - if ($active = $this->findActive($container)) { - $active = $active['page']; - } else { - // no active page - return ''; - } - - $output = ''; - $indent = $this->getIndent(); - $this->_root = $container; - - $result = $this->findAllRelations($active, $this->getRenderFlag()); - foreach ($result as $attrib => $types) { - foreach ($types as $relation => $pages) { - foreach ($pages as $page) { - if ($r = $this->renderLink($page, $attrib, $relation)) { - $output .= $indent . $r . $this->getEOL(); - } - } - } - } - - $this->_root = null; - - // return output (trim last newline by spec) - return strlen($output) ? rtrim($output, self::EOL) : ''; - } -} diff --git a/library/Zend/View/Helper/Navigation/Menu.php b/library/Zend/View/Helper/Navigation/Menu.php deleted file mode 100644 index 325dfc5604..0000000000 --- a/library/Zend/View/Helper/Navigation/Menu.php +++ /dev/null @@ -1,1099 +0,0 @@ -setContainer($container); - } - - return $this; - } - - // Accessors: - - /** - * Sets CSS class to use for the first 'ul' element when rendering - * - * @param string $ulClass CSS class to set - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setUlClass($ulClass) - { - if (is_string($ulClass)) { - $this->_ulClass = $ulClass; - } - - return $this; - } - - /** - * Returns CSS class to use for the first 'ul' element when rendering - * - * @return string CSS class - */ - public function getUlClass() - { - return $this->_ulClass; - } - - /** - * Sets unique identifier (id) to use for the first 'ul' element when - * rendering - * - * @param string|null $ulId Unique identifier (id) to set - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setUlId($ulId) - { - if (is_string($ulId)) { - $this->_ulId = $ulId; - } - - return $this; - } - - /** - * Returns unique identifier (id) to use for the first 'ul' element when - * rendering - * - * @return string|null Unique identifier (id); Default is 'null' - */ - public function getUlId() - { - return $this->_ulId; - } - - /** - * Sets CSS class to use for the active elements when rendering - * - * @param string $activeClass CSS class to set - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setActiveClass($activeClass) - { - if (is_string($activeClass)) { - $this->_activeClass = $activeClass; - } - - return $this; - } - - /** - * Returns CSS class to use for the active elements when rendering - * - * @return string CSS class - */ - public function getActiveClass() - { - return $this->_activeClass; - } - - /** - * Sets CSS class to use for the parent li elements when rendering - * - * @param string $parentClass CSS class to set to parents - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setParentClass($parentClass) - { - if (is_string($parentClass)) { - $this->_parentClass = $parentClass; - } - - return $this; - } - - /** - * Returns CSS class to use for the parent lie elements when rendering - * - * @return string CSS class - */ - public function getParentClass() - { - return $this->_parentClass; - } - - /** - * Enables/disables rendering of parent class to the li element - * - * @param bool $flag [optional] render with parent - * class. Default is true. - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setRenderParentClass($flag = true) - { - $this->_renderParentClass = (bool) $flag; - return $this; - } - - /** - * Returns flag indicating whether parent class should be rendered to the li - * element - * - * @return bool whether parent class should be rendered - */ - public function getRenderParentClass() - { - return $this->_renderParentClass; - } - - /** - * Sets a flag indicating whether only active branch should be rendered - * - * @param bool $flag [optional] render only active - * branch. Default is true. - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setOnlyActiveBranch($flag = true) - { - $this->_onlyActiveBranch = (bool) $flag; - return $this; - } - - /** - * Returns a flag indicating whether only active branch should be rendered - * - * By default, this value is false, meaning the entire menu will be - * be rendered. - * - * @return bool whether only active branch should be rendered - */ - public function getOnlyActiveBranch() - { - return $this->_onlyActiveBranch; - } - - /** - * Sets a flag indicating whether to expand all sibling nodes of the active branch - * - * @param bool $flag [optional] expand all siblings of - * nodes in the active branch. Default is true. - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setExpandSiblingNodesOfActiveBranch($flag = true) - { - $this->_expandSiblingNodesOfActiveBranch = (bool) $flag; - return $this; - } - - /** - * Returns a flag indicating whether to expand all sibling nodes of the active branch - * - * By default, this value is false, meaning the entire menu will be - * be rendered. - * - * @return bool whether siblings of nodes in the active branch should be expanded - */ - public function getExpandSiblingNodesOfActiveBranch() - { - return $this->_expandSiblingNodesOfActiveBranch; - } - - /** - * Enables/disables rendering of parents when only rendering active branch - * - * See {@link setOnlyActiveBranch()} for more information. - * - * @param bool $flag [optional] render parents when - * rendering active branch. - * Default is true. - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setRenderParents($flag = true) - { - $this->_renderParents = (bool) $flag; - return $this; - } - - /** - * Returns flag indicating whether parents should be rendered when rendering - * only the active branch - * - * By default, this value is true. - * - * @return bool whether parents should be rendered - */ - public function getRenderParents() - { - return $this->_renderParents; - } - - /** - * Sets which partial view script to use for rendering menu - * - * @param string|array $partial partial view script or null. If - * an array is given, it is - * expected to contain two values; - * the partial view script to use, - * and the module where the script - * can be found. - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function setPartial($partial) - { - if (null === $partial || is_string($partial) || is_array($partial)) { - $this->_partial = $partial; - } - - return $this; - } - - /** - * Returns partial view script to use for rendering menu - * - * @return string|array|null - */ - public function getPartial() - { - return $this->_partial; - } - - /** - * Adds CSS class from page to li element - * - * Before: - * - *
  • - * Bar - *
  • - *
    - * - * After: - * - *
  • - * Bar - *
  • - *
    - * - * @param bool $flag [optional] adds CSS class from - * page to li element - * - * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self - */ - public function addPageClassToLi($flag = true) - { - $this->_addPageClassToLi = (bool) $flag; - - return $this; - } - - /** - * Returns a flag indicating whether the CSS class from page to be added to - * li element - * - * @return bool - */ - public function getAddPageClassToLi() - { - return $this->_addPageClassToLi; - } - - /** - * Set the inner indentation string for using in {@link render()}, optionally - * a number of spaces to indent with - * - * @param string|int $indent indentation string or - * number of spaces - * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, - * returns self - */ - public function setInnerIndent($indent) - { - $this->_innerIndent = $this->_getWhitespace($indent); - - return $this; - } - - /** - * Returns inner indentation (format output is respected) - * - * @see getFormatOutput() - * - * @return string indentation string or an empty string - */ - public function getInnerIndent() - { - if (false === $this->getFormatOutput()) { - return ''; - } - - return $this->_innerIndent; - } - - // Public methods: - - /** - * Returns an HTML string containing an 'a' element for the given page if - * the page's href is not empty, and a 'span' element if it is empty - * - * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}. - * - * @param Zend_Navigation_Page $page page to generate HTML for - * @return string HTML string for the given page - */ - public function htmlify(Zend_Navigation_Page $page) - { - // get label and title for translating - $label = $page->getLabel(); - $title = $page->getTitle(); - - // translate label and title? - if ($this->getUseTranslator() && $t = $this->getTranslator()) { - if (is_string($label) && !empty($label)) { - $label = $t->translate($label); - } - if (is_string($title) && !empty($title)) { - $title = $t->translate($title); - } - } - - // get attribs for element - $attribs = array( - 'id' => $page->getId(), - 'title' => $title, - ); - - if (false === $this->getAddPageClassToLi()) { - $attribs['class'] = $page->getClass(); - } - - // does page have a href? - if ($href = $page->getHref()) { - $element = 'a'; - $attribs['href'] = $href; - $attribs['target'] = $page->getTarget(); - $attribs['accesskey'] = $page->getAccessKey(); - } else { - $element = 'span'; - } - - // Add custom HTML attributes - $attribs = array_merge($attribs, $page->getCustomHtmlAttribs()); - - return '<' . $element . $this->_htmlAttribs($attribs) . '>' - . $this->view->escape($label) - . ''; - } - - /** - * Normalizes given render options - * - * @param array $options [optional] options to normalize - * @return array normalized options - */ - protected function _normalizeOptions(array $options = array()) - { - // Ident - if (isset($options['indent'])) { - $options['indent'] = $this->_getWhitespace($options['indent']); - } else { - $options['indent'] = $this->getIndent(); - } - - // Inner ident - if (isset($options['innerIndent'])) { - $options['innerIndent'] = - $this->_getWhitespace($options['innerIndent']); - } else { - $options['innerIndent'] = $this->getInnerIndent(); - } - - // UL class - if (isset($options['ulClass']) && $options['ulClass'] !== null) { - $options['ulClass'] = (string) $options['ulClass']; - } else { - $options['ulClass'] = $this->getUlClass(); - } - - // UL id - if (isset($options['ulId']) && $options['ulId'] !== null) { - $options['ulId'] = (string) $options['ulId']; - } else { - $options['ulId'] = $this->getUlId(); - } - - // Active class - if (isset($options['activeClass']) && $options['activeClass'] !== null - ) { - $options['activeClass'] = (string) $options['activeClass']; - } else { - $options['activeClass'] = $this->getActiveClass(); - } - - // Parent class - if (isset($options['parentClass']) && $options['parentClass'] !== null) { - $options['parentClass'] = (string) $options['parentClass']; - } else { - $options['parentClass'] = $this->getParentClass(); - } - - // Minimum depth - if (array_key_exists('minDepth', $options)) { - if (null !== $options['minDepth']) { - $options['minDepth'] = (int) $options['minDepth']; - } - } else { - $options['minDepth'] = $this->getMinDepth(); - } - - if ($options['minDepth'] < 0 || $options['minDepth'] === null) { - $options['minDepth'] = 0; - } - - // Maximum depth - if (array_key_exists('maxDepth', $options)) { - if (null !== $options['maxDepth']) { - $options['maxDepth'] = (int) $options['maxDepth']; - } - } else { - $options['maxDepth'] = $this->getMaxDepth(); - } - - // Only active branch - if (!isset($options['onlyActiveBranch'])) { - $options['onlyActiveBranch'] = $this->getOnlyActiveBranch(); - } - - // Expand sibling nodes of active branch - if (!isset($options['expandSiblingNodesOfActiveBranch'])) { - $options['expandSiblingNodesOfActiveBranch'] = $this->getExpandSiblingNodesOfActiveBranch(); - } - - // Render parents? - if (!isset($options['renderParents'])) { - $options['renderParents'] = $this->getRenderParents(); - } - - // Render parent class? - if (!isset($options['renderParentClass'])) { - $options['renderParentClass'] = $this->getRenderParentClass(); - } - - // Add page CSS class to LI element - if (!isset($options['addPageClassToLi'])) { - $options['addPageClassToLi'] = $this->getAddPageClassToLi(); - } - - return $options; - } - - // Render methods: - - /** - * Renders the deepest active menu within [$minDepth, $maxDeth], (called - * from {@link renderMenu()}) - * - * @param Zend_Navigation_Container $container container to render - * @param string $ulClass CSS class for first UL - * @param string $indent initial indentation - * @param string $innerIndent inner indentation - * @param int|null $minDepth minimum depth - * @param int|null $maxDepth maximum depth - * @param string|null $ulId unique identifier (id) - * for first UL - * @param bool $addPageClassToLi adds CSS class from - * page to li element - * @param string|null $activeClass CSS class for active - * element - * @param string $parentClass CSS class for parent - * li's - * @param bool $renderParentClass Render parent class? - * @return string rendered menu (HTML) - */ - protected function _renderDeepestMenu(Zend_Navigation_Container $container, - $ulClass, - $indent, - $innerIndent, - $minDepth, - $maxDepth, - $ulId, - $addPageClassToLi, - $activeClass, - $parentClass, - $renderParentClass) - { - if (!$active = $this->findActive($container, $minDepth - 1, $maxDepth)) { - return ''; - } - - // special case if active page is one below minDepth - if ($active['depth'] < $minDepth) { - if (!$active['page']->hasPages()) { - return ''; - } - } else if (!$active['page']->hasPages()) { - // found pages has no children; render siblings - $active['page'] = $active['page']->getParent(); - } else if (is_int($maxDepth) && $active['depth'] + 1 > $maxDepth) { - // children are below max depth; render siblings - $active['page'] = $active['page']->getParent(); - } - - $attribs = array( - 'class' => $ulClass, - 'id' => $ulId, - ); - - // We don't need a prefix for the menu ID (backup) - $skipValue = $this->_skipPrefixForId; - $this->skipPrefixForId(); - - $html = $indent . '_htmlAttribs($attribs) - . '>' - . $this->getEOL(); - - // Reset prefix for IDs - $this->_skipPrefixForId = $skipValue; - - foreach ($active['page'] as $subPage) { - if (!$this->accept($subPage)) { - continue; - } - - $liClass = ''; - if ($subPage->isActive(true) && $addPageClassToLi) { - $liClass = $this->_htmlAttribs( - array('class' => $activeClass . ' ' . $subPage->getClass()) - ); - } else if ($subPage->isActive(true)) { - $liClass = $this->_htmlAttribs(array('class' => $activeClass)); - } else if ($addPageClassToLi) { - $liClass = $this->_htmlAttribs( - array('class' => $subPage->getClass()) - ); - } - $html .= $indent . $innerIndent . '' . $this->getEOL(); - $html .= $indent . str_repeat($innerIndent, 2) . $this->htmlify($subPage) - . $this->getEOL(); - $html .= $indent . $innerIndent . '' . $this->getEOL(); - } - - $html .= $indent . ''; - - return $html; - } - - /** - * Renders a normal menu (called from {@link renderMenu()}) - * - * @param Zend_Navigation_Container $container container to render - * @param string $ulClass CSS class for first UL - * @param string $indent initial indentation - * @param string $innerIndent inner indentation - * @param int|null $minDepth minimum depth - * @param int|null $maxDepth maximum depth - * @param bool $onlyActive render only active branch? - * @param bool $expandSibs render siblings of active - * branch nodes? - * @param string|null $ulId unique identifier (id) - * for first UL - * @param bool $addPageClassToLi adds CSS class from - * page to li element - * @param string|null $activeClass CSS class for active - * element - * @param string $parentClass CSS class for parent - * li's - * @param bool $renderParentClass Render parent class? - * @return string rendered menu (HTML) - */ - protected function _renderMenu(Zend_Navigation_Container $container, - $ulClass, - $indent, - $innerIndent, - $minDepth, - $maxDepth, - $onlyActive, - $expandSibs, - $ulId, - $addPageClassToLi, - $activeClass, - $parentClass, - $renderParentClass) - { - $html = ''; - - // find deepest active - if ($found = $this->findActive($container, $minDepth, $maxDepth)) { - $foundPage = $found['page']; - $foundDepth = $found['depth']; - } else { - $foundPage = null; - } - - // create iterator - $iterator = new RecursiveIteratorIterator($container, - RecursiveIteratorIterator::SELF_FIRST); - if (is_int($maxDepth)) { - $iterator->setMaxDepth($maxDepth); - } - - // iterate container - $prevDepth = -1; - foreach ($iterator as $page) { - $depth = $iterator->getDepth(); - $isActive = $page->isActive(true); - if ($depth < $minDepth || !$this->accept($page)) { - // page is below minDepth or not accepted by acl/visibilty - continue; - } else if ($expandSibs && $depth > $minDepth) { - // page is not active itself, but might be in the active branch - $accept = false; - if ($foundPage) { - if ($foundPage->hasPage($page)) { - // accept if page is a direct child of the active page - $accept = true; - } else if ($page->getParent()->isActive(true)) { - // page is a sibling of the active branch... - $accept = true; - } - } - if (!$isActive && !$accept) { - continue; - } - } else if ($onlyActive && !$isActive) { - // page is not active itself, but might be in the active branch - $accept = false; - if ($foundPage) { - if ($foundPage->hasPage($page)) { - // accept if page is a direct child of the active page - $accept = true; - } else if ($foundPage->getParent()->hasPage($page)) { - // page is a sibling of the active page... - if (!$foundPage->hasPages() || - is_int($maxDepth) && $foundDepth + 1 > $maxDepth) { - // accept if active page has no children, or the - // children are too deep to be rendered - $accept = true; - } - } - } - - if (!$accept) { - continue; - } - } - - // make sure indentation is correct - $depth -= $minDepth; - $myIndent = $indent . str_repeat($innerIndent, $depth * 2); - - if ($depth > $prevDepth) { - $attribs = array(); - - // start new ul tag - if (0 == $depth) { - $attribs = array( - 'class' => $ulClass, - 'id' => $ulId, - ); - } - - // We don't need a prefix for the menu ID (backup) - $skipValue = $this->_skipPrefixForId; - $this->skipPrefixForId(); - - $html .= $myIndent . '_htmlAttribs($attribs) - . '>' - . $this->getEOL(); - - // Reset prefix for IDs - $this->_skipPrefixForId = $skipValue; - } else if ($prevDepth > $depth) { - // close li/ul tags until we're at current depth - for ($i = $prevDepth; $i > $depth; $i--) { - $ind = $indent . str_repeat($innerIndent, $i * 2); - $html .= $ind . $innerIndent . '' . $this->getEOL(); - $html .= $ind . '' . $this->getEOL(); - } - // close previous li tag - $html .= $myIndent . $innerIndent . '' . $this->getEOL(); - } else { - // close previous li tag - $html .= $myIndent . $innerIndent . '' . $this->getEOL(); - } - - // render li tag and page - $liClasses = array(); - // Is page active? - if ($isActive) { - $liClasses[] = $activeClass; - } - // Add CSS class from page to LI? - if ($addPageClassToLi) { - $liClasses[] = $page->getClass(); - } - // Add CSS class for parents to LI? - if ($renderParentClass && $page->hasChildren()) { - // Check max depth - if ((is_int($maxDepth) && ($depth + 1 < $maxDepth)) - || !is_int($maxDepth) - ) { - $liClasses[] = $parentClass; - } - } - - $html .= $myIndent . $innerIndent . '_htmlAttribs(array('class' => implode(' ', $liClasses))) - . '>' . $this->getEOL() - . $myIndent . str_repeat($innerIndent, 2) - . $this->htmlify($page) - . $this->getEOL(); - - // store as previous depth for next iteration - $prevDepth = $depth; - } - - if ($html) { - // done iterating container; close open ul/li tags - for ($i = $prevDepth+1; $i > 0; $i--) { - $myIndent = $indent . str_repeat($innerIndent . $innerIndent, $i - 1); - $html .= $myIndent . $innerIndent . '' . $this->getEOL() - . $myIndent . '' . $this->getEOL(); - } - $html = rtrim($html, $this->getEOL()); - } - - return $html; - } - - /** - * Renders helper - * - * Renders a HTML 'ul' for the given $container. If $container is not given, - * the container registered in the helper will be used. - * - * Available $options: - * - * - * @param Zend_Navigation_Container $container [optional] container to - * create menu from. Default - * is to use the container - * retrieved from - * {@link getContainer()}. - * @param array $options [optional] options for - * controlling rendering - * @return string rendered menu - */ - public function renderMenu(Zend_Navigation_Container $container = null, - array $options = array()) - { - if (null === $container) { - $container = $this->getContainer(); - } - - $options = $this->_normalizeOptions($options); - - if ($options['onlyActiveBranch'] && !$options['renderParents']) { - $html = $this->_renderDeepestMenu( - $container, - $options['ulClass'], - $options['indent'], - $options['innerIndent'], - $options['minDepth'], - $options['maxDepth'], - $options['ulId'], - $options['addPageClassToLi'], - $options['activeClass'], - $options['parentClass'], - $options['renderParentClass'] - ); - } else { - $html = $this->_renderMenu( - $container, - $options['ulClass'], - $options['indent'], - $options['innerIndent'], - $options['minDepth'], - $options['maxDepth'], - $options['onlyActiveBranch'], - $options['expandSiblingNodesOfActiveBranch'], - $options['ulId'], - $options['addPageClassToLi'], - $options['activeClass'], - $options['parentClass'], - $options['renderParentClass'] - ); - } - - return $html; - } - - /** - * Renders the inner-most sub menu for the active page in the $container - * - * This is a convenience method which is equivalent to the following call: - * - * renderMenu($container, array( - * 'indent' => $indent, - * 'ulClass' => $ulClass, - * 'minDepth' => null, - * 'maxDepth' => null, - * 'onlyActiveBranch' => true, - * 'renderParents' => false - * )); - * - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to render - * the container registered in - * the helper. - * @param string|null $ulClass [optional] CSS class to - * use for UL element. Default - * is to use the value from - * {@link getUlClass()}. - * @param string|int $indent [optional] indentation as - * a string or number of - * spaces. Default is to use - * the value retrieved from - * {@link getIndent()}. - * @param string|null $ulId [optional] Unique identifier - * (id) use for UL element - * @param bool $addPageClassToLi adds CSS class from - * page to li element - * @param string|int $innerIndent [optional] inner - * indentation as a string - * or number of spaces. - * Default is to use the - * {@link getInnerIndent()}. - * @return string rendered content - */ - public function renderSubMenu(Zend_Navigation_Container $container = null, - $ulClass = null, - $indent = null, - $ulId = null, - $addPageClassToLi = false, - $innerIndent = null) - { - return $this->renderMenu($container, array( - 'indent' => $indent, - 'innerIndent' => $innerIndent, - 'ulClass' => $ulClass, - 'minDepth' => null, - 'maxDepth' => null, - 'onlyActiveBranch' => true, - 'renderParents' => false, - 'ulId' => $ulId, - 'addPageClassToLi' => $addPageClassToLi, - )); - } - - /** - * Renders the given $container by invoking the partial view helper - * - * The container will simply be passed on as a model to the view script - * as-is, and will be available in the partial script as 'container', e.g. - * echo 'Number of pages: ', count($this->container);. - * - * @param Zend_Navigation_Container $container [optional] container to - * pass to view script. Default - * is to use the container - * registered in the helper. - * @param string|array $partial [optional] partial view - * script to use. Default is to - * use the partial registered - * in the helper. If an array - * is given, it is expected to - * contain two values; the - * partial view script to use, - * and the module where the - * script can be found. - * @return string helper output - * - * @throws Zend_View_Exception When no partial script is set - */ - public function renderPartial(Zend_Navigation_Container $container = null, - $partial = null) - { - if (null === $container) { - $container = $this->getContainer(); - } - - if (null === $partial) { - $partial = $this->getPartial(); - } - - if (empty($partial)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception( - 'Unable to render menu: No partial view script provided' - ); - $e->setView($this->view); - throw $e; - } - - $model = array( - 'container' => $container - ); - - if (is_array($partial)) { - if (count($partial) != 2) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception( - 'Unable to render menu: A view partial supplied as ' - . 'an array must contain two values: partial view ' - . 'script and module where script can be found' - ); - $e->setView($this->view); - throw $e; - } - - return $this->view->partial($partial[0], $partial[1], $model); - } - - return $this->view->partial($partial, null, $model); - } - - // Zend_View_Helper_Navigation_Helper: - - /** - * Renders menu - * - * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. - * - * If a partial view is registered in the helper, the menu will be rendered - * using the given partial script. If no partial is registered, the menu - * will be rendered as an 'ul' element by the helper's internal method. - * - * @see renderPartial() - * @see renderMenu() - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - */ - public function render(Zend_Navigation_Container $container = null) - { - if ($partial = $this->getPartial()) { - return $this->renderPartial($container, $partial); - } else { - return $this->renderMenu($container); - } - } -} diff --git a/library/Zend/View/Helper/Navigation/Sitemap.php b/library/Zend/View/Helper/Navigation/Sitemap.php deleted file mode 100644 index c17fed9da2..0000000000 --- a/library/Zend/View/Helper/Navigation/Sitemap.php +++ /dev/null @@ -1,444 +0,0 @@ - tag - * - * @var string - */ - const SITEMAP_NS = 'http://www.sitemaps.org/schemas/sitemap/0.9'; - - /** - * Schema URL - * - * @var string - */ - const SITEMAP_XSD = 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'; - - /** - * Whether the XML declaration should be included in XML output - * - * @var bool - */ - protected $_useXmlDeclaration = true; - - /** - * Whether sitemap should be validated using Zend_Validate_Sitemap_* - * - * @var bool - */ - protected $_useSitemapValidators = true; - - /** - * Whether sitemap should be schema validated when generated - * - * @var bool - */ - protected $_useSchemaValidation = false; - - /** - * Server url - * - * @var string - */ - protected $_serverUrl; - - /** - * View helper entry point: - * Retrieves helper and optionally sets container to operate on - * - * @param Zend_Navigation_Container $container [optional] container to - * operate on - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function sitemap(Zend_Navigation_Container $container = null) - { - if (null !== $container) { - $this->setContainer($container); - } - - return $this; - } - - // Accessors: - - /** - * Sets whether the XML declaration should be used in output - * - * @param bool $useXmlDecl whether XML delcaration - * should be rendered - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function setUseXmlDeclaration($useXmlDecl) - { - $this->_useXmlDeclaration = (bool) $useXmlDecl; - return $this; - } - - /** - * Returns whether the XML declaration should be used in output - * - * @return bool whether the XML declaration should be used in output - */ - public function getUseXmlDeclaration() - { - return $this->_useXmlDeclaration; - } - - /** - * Sets whether sitemap should be validated using Zend_Validate_Sitemap_* - * - * @param bool $useSitemapValidators whether sitemap validators - * should be used - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function setUseSitemapValidators($useSitemapValidators) - { - $this->_useSitemapValidators = (bool) $useSitemapValidators; - return $this; - } - - /** - * Returns whether sitemap should be validated using Zend_Validate_Sitemap_* - * - * @return bool whether sitemap should be validated using validators - */ - public function getUseSitemapValidators() - { - return $this->_useSitemapValidators; - } - - /** - * Sets whether sitemap should be schema validated when generated - * - * @param bool $schemaValidation whether sitemap should - * validated using XSD Schema - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function setUseSchemaValidation($schemaValidation) - { - $this->_useSchemaValidation = (bool) $schemaValidation; - return $this; - } - - /** - * Returns true if sitemap should be schema validated when generated - * - * @return bool - */ - public function getUseSchemaValidation() - { - return $this->_useSchemaValidation; - } - - /** - * Sets server url (scheme and host-related stuff without request URI) - * - * E.g. http://www.example.com - * - * @param string $serverUrl server URL to set (only - * scheme and host) - * @throws Zend_Uri_Exception if invalid server URL - * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns - * self - */ - public function setServerUrl($serverUrl) - { - #require_once 'Zend/Uri.php'; - $uri = Zend_Uri::factory($serverUrl); - $uri->setFragment(''); - $uri->setPath(''); - $uri->setQuery(''); - - if ($uri->valid()) { - $this->_serverUrl = $uri->getUri(); - } else { - #require_once 'Zend/Uri/Exception.php'; - $e = new Zend_Uri_Exception(sprintf( - 'Invalid server URL: "%s"', - $serverUrl)); - $e->setView($this->view); - throw $e; - } - - return $this; - } - - /** - * Returns server URL - * - * @return string server URL - */ - public function getServerUrl() - { - if (!isset($this->_serverUrl)) { - $this->_serverUrl = $this->view->serverUrl(); - } - - return $this->_serverUrl; - } - - // Helper methods: - - /** - * Escapes string for XML usage - * - * @param string $string string to escape - * @return string escaped string - */ - protected function _xmlEscape($string) - { - $enc = 'UTF-8'; - if ($this->view instanceof Zend_View_Interface - && method_exists($this->view, 'getEncoding') - ) { - $enc = $this->view->getEncoding(); - } - - // do not encode existing HTML entities - return htmlspecialchars($string, ENT_QUOTES, $enc, false); - } - - // Public methods: - - /** - * Returns an escaped absolute URL for the given page - * - * @param Zend_Navigation_Page $page page to get URL from - * @return string - */ - public function url(Zend_Navigation_Page $page) - { - $href = $page->getHref(); - - if (!isset($href{0})) { - // no href - return ''; - } elseif ($href{0} == '/') { - // href is relative to root; use serverUrl helper - $url = $this->getServerUrl() . $href; - } elseif (preg_match('/^[a-z]+:/im', (string) $href)) { - // scheme is given in href; assume absolute URL already - $url = (string) $href; - } else { - // href is relative to current document; use url helpers - $url = $this->getServerUrl() - . rtrim($this->view->url(), '/') . '/' - . $href; - } - - return $this->_xmlEscape($url); - } - - /** - * Returns a DOMDocument containing the Sitemap XML for the given container - * - * @param Zend_Navigation_Container $container [optional] container to get - * breadcrumbs from, defaults - * to what is registered in the - * helper - * @return DOMDocument DOM representation of the - * container - * @throws Zend_View_Exception if schema validation is on - * and the sitemap is invalid - * according to the sitemap - * schema, or if sitemap - * validators are used and the - * loc element fails validation - */ - public function getDomSitemap(Zend_Navigation_Container $container = null) - { - if (null === $container) { - $container = $this->getContainer(); - } - - // check if we should validate using our own validators - if ($this->getUseSitemapValidators()) { - #require_once 'Zend/Validate/Sitemap/Changefreq.php'; - #require_once 'Zend/Validate/Sitemap/Lastmod.php'; - #require_once 'Zend/Validate/Sitemap/Loc.php'; - #require_once 'Zend/Validate/Sitemap/Priority.php'; - - // create validators - $locValidator = new Zend_Validate_Sitemap_Loc(); - $lastmodValidator = new Zend_Validate_Sitemap_Lastmod(); - $changefreqValidator = new Zend_Validate_Sitemap_Changefreq(); - $priorityValidator = new Zend_Validate_Sitemap_Priority(); - } - - // create document - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = $this->getFormatOutput(); - - // ...and urlset (root) element - $urlSet = $dom->createElementNS(self::SITEMAP_NS, 'urlset'); - $dom->appendChild($urlSet); - - // create iterator - $iterator = new RecursiveIteratorIterator($container, - RecursiveIteratorIterator::SELF_FIRST); - - $maxDepth = $this->getMaxDepth(); - if (is_int($maxDepth)) { - $iterator->setMaxDepth($maxDepth); - } - $minDepth = $this->getMinDepth(); - if (!is_int($minDepth) || $minDepth < 0) { - $minDepth = 0; - } - - // iterate container - foreach ($iterator as $page) { - if ($iterator->getDepth() < $minDepth || !$this->accept($page)) { - // page should not be included - continue; - } - - // get absolute url from page - if (!$url = $this->url($page)) { - // skip page if it has no url (rare case) - continue; - } - - // create url node for this page - $urlNode = $dom->createElementNS(self::SITEMAP_NS, 'url'); - $urlSet->appendChild($urlNode); - - if ($this->getUseSitemapValidators() && - !$locValidator->isValid($url)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - 'Encountered an invalid URL for Sitemap XML: "%s"', - $url)); - $e->setView($this->view); - throw $e; - } - - // put url in 'loc' element - $urlNode->appendChild($dom->createElementNS(self::SITEMAP_NS, - 'loc', $url)); - - // add 'lastmod' element if a valid lastmod is set in page - if (isset($page->lastmod)) { - $lastmod = strtotime((string) $page->lastmod); - - // prevent 1970-01-01... - if ($lastmod !== false) { - $lastmod = date('c', $lastmod); - } - - if (!$this->getUseSitemapValidators() || - $lastmodValidator->isValid($lastmod)) { - $urlNode->appendChild( - $dom->createElementNS(self::SITEMAP_NS, 'lastmod', - $lastmod) - ); - } - } - - // add 'changefreq' element if a valid changefreq is set in page - if (isset($page->changefreq)) { - $changefreq = $page->changefreq; - if (!$this->getUseSitemapValidators() || - $changefreqValidator->isValid($changefreq)) { - $urlNode->appendChild( - $dom->createElementNS(self::SITEMAP_NS, 'changefreq', - $changefreq) - ); - } - } - - // add 'priority' element if a valid priority is set in page - if (isset($page->priority)) { - $priority = $page->priority; - if (!$this->getUseSitemapValidators() || - $priorityValidator->isValid($priority)) { - $urlNode->appendChild( - $dom->createElementNS(self::SITEMAP_NS, 'priority', - $priority) - ); - } - } - } - - // validate using schema if specified - if ($this->getUseSchemaValidation()) { - if (!@$dom->schemaValidate(self::SITEMAP_XSD)) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception(sprintf( - 'Sitemap is invalid according to XML Schema at "%s"', - self::SITEMAP_XSD)); - $e->setView($this->view); - throw $e; - } - } - - return $dom; - } - - // Zend_View_Helper_Navigation_Helper: - - /** - * Renders helper - * - * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. - * - * @param Zend_Navigation_Container $container [optional] container to - * render. Default is to - * render the container - * registered in the helper. - * @return string helper output - */ - public function render(Zend_Navigation_Container $container = null) - { - $dom = $this->getDomSitemap($container); - - $xml = $this->getUseXmlDeclaration() ? - $dom->saveXML() : - $dom->saveXML($dom->documentElement); - - return rtrim($xml, self::EOL); - } -} diff --git a/library/Zend/View/Helper/PaginationControl.php b/library/Zend/View/Helper/PaginationControl.php deleted file mode 100644 index 728559622d..0000000000 --- a/library/Zend/View/Helper/PaginationControl.php +++ /dev/null @@ -1,145 +0,0 @@ -view = $view; - return $this; - } - - /** - * Sets the default view partial. - * - * @param string|array $partial View partial - */ - public static function setDefaultViewPartial($partial) - { - self::$_defaultViewPartial = $partial; - } - - /** - * Gets the default view partial - * - * @return string|array - */ - public static function getDefaultViewPartial() - { - return self::$_defaultViewPartial; - } - - /** - * Render the provided pages. This checks if $view->paginator is set and, - * if so, uses that. Also, if no scrolling style or partial are specified, - * the defaults will be used (if set). - * - * @param Zend_Paginator (Optional) $paginator - * @param string $scrollingStyle (Optional) Scrolling style - * @param string $partial (Optional) View partial - * @param array|string $params (Optional) params to pass to the partial - * @return string - * @throws Zend_View_Exception - */ - public function paginationControl(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null) - { - if ($paginator === null) { - if (isset($this->view->paginator) and $this->view->paginator !== null and $this->view->paginator instanceof Zend_Paginator) { - $paginator = $this->view->paginator; - } else { - /** - * @see Zend_View_Exception - */ - #require_once 'Zend/View/Exception.php'; - - $e = new Zend_View_Exception('No paginator instance provided or incorrect type'); - $e->setView($this->view); - throw $e; - } - } - - if ($partial === null) { - if (self::$_defaultViewPartial === null) { - /** - * @see Zend_View_Exception - */ - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('No view partial provided and no default set'); - $e->setView($this->view); - throw $e; - } - - $partial = self::$_defaultViewPartial; - } - - $pages = get_object_vars($paginator->getPages($scrollingStyle)); - - if ($params !== null) { - $pages = array_merge($pages, (array) $params); - } - - if (is_array($partial)) { - if (count($partial) != 2) { - /** - * @see Zend_View_Exception - */ - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('A view partial supplied as an array must contain two values: the filename and its module'); - $e->setView($this->view); - throw $e; - } - - if ($partial[1] !== null) { - return $this->view->partial($partial[0], $partial[1], $pages); - } - - $partial = $partial[0]; - } - - return $this->view->partial($partial, $pages); - } -} diff --git a/library/Zend/View/Helper/Partial.php b/library/Zend/View/Helper/Partial.php deleted file mode 100644 index 263c2a5ba3..0000000000 --- a/library/Zend/View/Helper/Partial.php +++ /dev/null @@ -1,153 +0,0 @@ -cloneView(); - if (isset($this->partialCounter)) { - $view->partialCounter = $this->partialCounter; - } - if (isset($this->partialTotalCount)) { - $view->partialTotalCount = $this->partialTotalCount; - } - - if ((null !== $module) && is_string($module)) { - #require_once 'Zend/Controller/Front.php'; - $moduleDir = Zend_Controller_Front::getInstance()->getControllerDirectory($module); - if (null === $moduleDir) { - #require_once 'Zend/View/Helper/Partial/Exception.php'; - $e = new Zend_View_Helper_Partial_Exception('Cannot render partial; module does not exist'); - $e->setView($this->view); - throw $e; - } - $viewsDir = dirname($moduleDir) . '/views'; - $view->addBasePath($viewsDir); - } elseif ((null == $model) && (null !== $module) - && (is_array($module) || is_object($module))) - { - $model = $module; - } - - if (!empty($model)) { - if (is_array($model)) { - $view->assign($model); - } elseif (is_object($model)) { - if (null !== ($objectKey = $this->getObjectKey())) { - $view->assign($objectKey, $model); - } elseif (method_exists($model, 'toArray')) { - $view->assign($model->toArray()); - } else { - $view->assign(get_object_vars($model)); - } - } - } - - return $view->render($name); - } - - /** - * Clone the current View - * - * @return Zend_View_Interface - */ - public function cloneView() - { - $view = clone $this->view; - $view->clearVars(); - return $view; - } - - /** - * Set object key - * - * @param string $key - * @return Zend_View_Helper_Partial - */ - public function setObjectKey($key) - { - if (null === $key) { - $this->_objectKey = null; - } else { - $this->_objectKey = (string) $key; - } - - return $this; - } - - /** - * Retrieve object key - * - * The objectKey is the variable to which an object in the iterator will be - * assigned. - * - * @return null|string - */ - public function getObjectKey() - { - return $this->_objectKey; - } -} diff --git a/library/Zend/View/Helper/Partial/Exception.php b/library/Zend/View/Helper/Partial/Exception.php deleted file mode 100644 index 3dc59ffe10..0000000000 --- a/library/Zend/View/Helper/Partial/Exception.php +++ /dev/null @@ -1,39 +0,0 @@ -setView($this->view); - throw $e; - } - - if (is_object($model) - && (!$model instanceof Traversable) - && method_exists($model, 'toArray') - ) { - $model = $model->toArray(); - } - - $content = ''; - // reset the counter if it's call again - $this->partialCounter = 0; - $this->partialTotalCount = count($model); - - foreach ($model as $item) { - // increment the counter variable - $this->partialCounter++; - - $content .= $this->partial($name, $module, $item); - } - - return $content; - } -} diff --git a/library/Zend/View/Helper/Placeholder.php b/library/Zend/View/Helper/Placeholder.php deleted file mode 100644 index c1ea21cd00..0000000000 --- a/library/Zend/View/Helper/Placeholder.php +++ /dev/null @@ -1,87 +0,0 @@ -_registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); - } - - - /** - * Placeholder helper - * - * @param string $name - * @return Zend_View_Helper_Placeholder_Container_Abstract - */ - public function placeholder($name) - { - $name = (string) $name; - return $this->_registry->getContainer($name); - } - - /** - * Retrieve the registry - * - * @return Zend_View_Helper_Placeholder_Registry - */ - public function getRegistry() - { - return $this->_registry; - } -} diff --git a/library/Zend/View/Helper/Placeholder/Container.php b/library/Zend/View/Helper/Placeholder/Container.php deleted file mode 100644 index b567053865..0000000000 --- a/library/Zend/View/Helper/Placeholder/Container.php +++ /dev/null @@ -1,36 +0,0 @@ -exchangeArray(array($value)); - } - - /** - * Prepend a value to the top of the container - * - * @param mixed $value - * @return void - */ - public function prepend($value) - { - $values = $this->getArrayCopy(); - array_unshift($values, $value); - $this->exchangeArray($values); - } - - /** - * Retrieve container value - * - * If single element registered, returns that element; otherwise, - * serializes to array. - * - * @return mixed - */ - public function getValue() - { - if (1 == count($this)) { - $keys = $this->getKeys(); - $key = array_shift($keys); - return $this[$key]; - } - - return $this->getArrayCopy(); - } - - /** - * Set prefix for __toString() serialization - * - * @param string $prefix - * @return Zend_View_Helper_Placeholder_Container - */ - public function setPrefix($prefix) - { - $this->_prefix = (string) $prefix; - return $this; - } - - /** - * Retrieve prefix - * - * @return string - */ - public function getPrefix() - { - return $this->_prefix; - } - - /** - * Set postfix for __toString() serialization - * - * @param string $postfix - * @return Zend_View_Helper_Placeholder_Container - */ - public function setPostfix($postfix) - { - $this->_postfix = (string) $postfix; - return $this; - } - - /** - * Retrieve postfix - * - * @return string - */ - public function getPostfix() - { - return $this->_postfix; - } - - /** - * Set separator for __toString() serialization - * - * Used to implode elements in container - * - * @param string $separator - * @return Zend_View_Helper_Placeholder_Container - */ - public function setSeparator($separator) - { - $this->_separator = (string) $separator; - return $this; - } - - /** - * Retrieve separator - * - * @return string - */ - public function getSeparator() - { - return $this->_separator; - } - - /** - * Set the indentation string for __toString() serialization, - * optionally, if a number is passed, it will be the number of spaces - * - * @param string|int $indent - * @return Zend_View_Helper_Placeholder_Container_Abstract - */ - public function setIndent($indent) - { - $this->_indent = $this->getWhitespace($indent); - return $this; - } - - /** - * Retrieve indentation - * - * @return string - */ - public function getIndent() - { - return $this->_indent; - } - - /** - * Retrieve whitespace representation of $indent - * - * @param int|string $indent - * @return string - */ - public function getWhitespace($indent) - { - if (is_int($indent)) { - $indent = str_repeat(' ', $indent); - } - - return (string) $indent; - } - - /** - * Start capturing content to push into placeholder - * - * @param int|string $type How to capture content into placeholder; append, prepend, or set - * @param null $key - * @throws Zend_View_Helper_Placeholder_Container_Exception - * @return void - */ - public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $key = null) - { - if ($this->_captureLock) { - #require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; - $e = new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest placeholder captures for the same placeholder'); - $e->setView($this->view); - throw $e; - } - - $this->_captureLock = true; - $this->_captureType = $type; - if ((null !== $key) && is_scalar($key)) { - $this->_captureKey = (string) $key; - } - ob_start(); - } - - /** - * End content capture - * - * @return void - */ - public function captureEnd() - { - $data = ob_get_clean(); - $key = null; - $this->_captureLock = false; - if (null !== $this->_captureKey) { - $key = $this->_captureKey; - } - switch ($this->_captureType) { - case self::SET: - if (null !== $key) { - $this[$key] = $data; - } else { - $this->exchangeArray(array($data)); - } - break; - case self::PREPEND: - if (null !== $key) { - $array = array($key => $data); - $values = $this->getArrayCopy(); - $final = $array + $values; - $this->exchangeArray($final); - } else { - $this->prepend($data); - } - break; - case self::APPEND: - default: - if (null !== $key) { - if (empty($this[$key])) { - $this[$key] = $data; - } else { - $this[$key] .= $data; - } - } else { - $this[$this->nextIndex()] = $data; - } - break; - } - } - - /** - * Get keys - * - * @return array - */ - public function getKeys() - { - $array = $this->getArrayCopy(); - return array_keys($array); - } - - /** - * Next Index - * - * as defined by the PHP manual - * @return int - */ - public function nextIndex() - { - $keys = $this->getKeys(); - if (0 == count($keys)) { - return 0; - } - - return $nextIndex = max($keys) + 1; - } - - /** - * Render the placeholder - * - * @param null $indent - * @return string - */ - public function toString($indent = null) - { - // Check items - if (0 === $this->count()) { - return ''; - } - - $indent = ($indent !== null) - ? $this->getWhitespace($indent) - : $this->getIndent(); - - $items = $this->getArrayCopy(); - $return = $indent - . $this->getPrefix() - . implode($this->getSeparator(), $items) - . $this->getPostfix(); - $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); - return $return; - } - - /** - * Serialize object to string - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } -} diff --git a/library/Zend/View/Helper/Placeholder/Container/Exception.php b/library/Zend/View/Helper/Placeholder/Container/Exception.php deleted file mode 100644 index 9435f95c1c..0000000000 --- a/library/Zend/View/Helper/Placeholder/Container/Exception.php +++ /dev/null @@ -1,39 +0,0 @@ -setRegistry(Zend_View_Helper_Placeholder_Registry::getRegistry()); - $this->setContainer($this->getRegistry()->getContainer($this->_regKey)); - } - - /** - * Retrieve registry - * - * @return Zend_View_Helper_Placeholder_Registry - */ - public function getRegistry() - { - return $this->_registry; - } - - /** - * Set registry object - * - * @param Zend_View_Helper_Placeholder_Registry $registry - * @return Zend_View_Helper_Placeholder_Container_Standalone - */ - public function setRegistry(Zend_View_Helper_Placeholder_Registry $registry) - { - $this->_registry = $registry; - return $this; - } - - /** - * Set whether or not auto escaping should be used - * - * @param bool $autoEscape whether or not to auto escape output - * @return Zend_View_Helper_Placeholder_Container_Standalone - */ - public function setAutoEscape($autoEscape = true) - { - $this->_autoEscape = ($autoEscape) ? true : false; - return $this; - } - - /** - * Return whether autoEscaping is enabled or disabled - * - * return bool - */ - public function getAutoEscape() - { - return $this->_autoEscape; - } - - /** - * Escape a string - * - * @param string $string - * @return string - */ - protected function _escape($string) - { - $enc = 'UTF-8'; - if ($this->view instanceof Zend_View_Interface - && method_exists($this->view, 'getEncoding') - ) { - $enc = $this->view->getEncoding(); - } - - return htmlspecialchars((string) $string, ENT_COMPAT, $enc); - } - - /** - * Set container on which to operate - * - * @param Zend_View_Helper_Placeholder_Container_Abstract $container - * @return Zend_View_Helper_Placeholder_Container_Standalone - */ - public function setContainer(Zend_View_Helper_Placeholder_Container_Abstract $container) - { - $this->_container = $container; - return $this; - } - - /** - * Retrieve placeholder container - * - * @return Zend_View_Helper_Placeholder_Container_Abstract - */ - public function getContainer() - { - return $this->_container; - } - - /** - * Overloading: set property value - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $container = $this->getContainer(); - $container[$key] = $value; - } - - /** - * Overloading: retrieve property - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - $container = $this->getContainer(); - if (isset($container[$key])) { - return $container[$key]; - } - - return null; - } - - /** - * Overloading: check if property is set - * - * @param string $key - * @return bool - */ - public function __isset($key) - { - $container = $this->getContainer(); - return isset($container[$key]); - } - - /** - * Overloading: unset property - * - * @param string $key - * @return void - */ - public function __unset($key) - { - $container = $this->getContainer(); - if (isset($container[$key])) { - unset($container[$key]); - } - } - - /** - * Overload - * - * Proxy to container methods - * - * @param string $method - * @param array $args - * @return mixed - */ - public function __call($method, $args) - { - $container = $this->getContainer(); - if (method_exists($container, $method)) { - $return = call_user_func_array(array($container, $method), $args); - if ($return === $container) { - // If the container is returned, we really want the current object - return $this; - } - return $return; - } - - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('Method "' . $method . '" does not exist'); - $e->setView($this->view); - throw $e; - } - - /** - * String representation - * - * @return string - */ - public function toString() - { - return $this->getContainer()->toString(); - } - - /** - * Cast to string representation - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - - /** - * Countable - * - * @return int - */ - public function count() - { - $container = $this->getContainer(); - return count($container); - } - - /** - * ArrayAccess: offsetExists - * - * @param string|int $offset - * @return bool - */ - public function offsetExists($offset) - { - return $this->getContainer()->offsetExists($offset); - } - - /** - * ArrayAccess: offsetGet - * - * @param string|int $offset - * @return mixed - */ - public function offsetGet($offset) - { - return $this->getContainer()->offsetGet($offset); - } - - /** - * ArrayAccess: offsetSet - * - * @param string|int $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset, $value) - { - return $this->getContainer()->offsetSet($offset, $value); - } - - /** - * ArrayAccess: offsetUnset - * - * @param string|int $offset - * @return void - */ - public function offsetUnset($offset) - { - return $this->getContainer()->offsetUnset($offset); - } - - /** - * IteratorAggregate: get Iterator - * - * @return Iterator - */ - public function getIterator() - { - return $this->getContainer()->getIterator(); - } -} diff --git a/library/Zend/View/Helper/Placeholder/Registry.php b/library/Zend/View/Helper/Placeholder/Registry.php deleted file mode 100644 index 6aab493d8d..0000000000 --- a/library/Zend/View/Helper/Placeholder/Registry.php +++ /dev/null @@ -1,188 +0,0 @@ -_items[$key] = new $this->_containerClass($value); - return $this->_items[$key]; - } - - /** - * Retrieve a placeholder container - * - * @param string $key - * @return Zend_View_Helper_Placeholder_Container_Abstract - */ - public function getContainer($key) - { - $key = (string) $key; - if (isset($this->_items[$key])) { - return $this->_items[$key]; - } - - $container = $this->createContainer($key); - - return $container; - } - - /** - * Does a particular container exist? - * - * @param string $key - * @return bool - */ - public function containerExists($key) - { - $key = (string) $key; - $return = array_key_exists($key, $this->_items); - return $return; - } - - /** - * Set the container for an item in the registry - * - * @param string $key - * @param Zend_View_Placeholder_Container_Abstract $container - * @return Zend_View_Placeholder_Registry - */ - public function setContainer($key, Zend_View_Helper_Placeholder_Container_Abstract $container) - { - $key = (string) $key; - $this->_items[$key] = $container; - return $this; - } - - /** - * Delete a container - * - * @param string $key - * @return bool - */ - public function deleteContainer($key) - { - $key = (string) $key; - if (isset($this->_items[$key])) { - unset($this->_items[$key]); - return true; - } - - return false; - } - - /** - * Set the container class to use - * - * @param string $name - * @return Zend_View_Helper_Placeholder_Registry - */ - public function setContainerClass($name) - { - if (!class_exists($name)) { - #require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($name); - } - - $reflection = new ReflectionClass($name); - if (!$reflection->isSubclassOf(new ReflectionClass('Zend_View_Helper_Placeholder_Container_Abstract'))) { - #require_once 'Zend/View/Helper/Placeholder/Registry/Exception.php'; - $e = new Zend_View_Helper_Placeholder_Registry_Exception('Invalid Container class specified'); - $e->setView($this->view); - throw $e; - } - - $this->_containerClass = $name; - return $this; - } - - /** - * Retrieve the container class - * - * @return string - */ - public function getContainerClass() - { - return $this->_containerClass; - } -} diff --git a/library/Zend/View/Helper/Placeholder/Registry/Exception.php b/library/Zend/View/Helper/Placeholder/Registry/Exception.php deleted file mode 100644 index ed3f1422a0..0000000000 --- a/library/Zend/View/Helper/Placeholder/Registry/Exception.php +++ /dev/null @@ -1,39 +0,0 @@ -view->placeholder($placeholder)->captureStart(); - echo $this->view->render($script); - $this->view->placeholder($placeholder)->captureEnd(); - } -} diff --git a/library/Zend/View/Helper/ServerUrl.php b/library/Zend/View/Helper/ServerUrl.php deleted file mode 100644 index c38ec8bc86..0000000000 --- a/library/Zend/View/Helper/ServerUrl.php +++ /dev/null @@ -1,148 +0,0 @@ -setScheme($scheme); - - if (isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])) { - $this->setHost($_SERVER['HTTP_HOST']); - } else if (isset($_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'])) { - $name = $_SERVER['SERVER_NAME']; - $port = $_SERVER['SERVER_PORT']; - - if (($scheme == 'http' && $port == 80) || - ($scheme == 'https' && $port == 443)) { - $this->setHost($name); - } else { - $this->setHost($name . ':' . $port); - } - } - } - - /** - * View helper entry point: - * Returns the current host's URL like http://site.com - * - * @param string|boolean $requestUri [optional] if true, the request URI - * found in $_SERVER will be appended - * as a path. If a string is given, it - * will be appended as a path. Default - * is to not append any path. - * @return string server url - */ - public function serverUrl($requestUri = null) - { - if ($requestUri === true) { - $path = $_SERVER['REQUEST_URI']; - } else if (is_string($requestUri)) { - $path = $requestUri; - } else { - $path = ''; - } - - return $this->getScheme() . '://' . $this->getHost() . $path; - } - - /** - * Returns host - * - * @return string host - */ - public function getHost() - { - return $this->_host; - } - - /** - * Sets host - * - * @param string $host new host - * @return Zend_View_Helper_ServerUrl fluent interface, returns self - */ - public function setHost($host) - { - $this->_host = $host; - return $this; - } - - /** - * Returns scheme (typically http or https) - * - * @return string scheme (typically http or https) - */ - public function getScheme() - { - return $this->_scheme; - } - - /** - * Sets scheme (typically http or https) - * - * @param string $scheme new scheme (typically http or https) - * @return Zend_View_Helper_ServerUrl fluent interface, returns self - */ - public function setScheme($scheme) - { - $this->_scheme = $scheme; - return $this; - } -} diff --git a/library/Zend/View/Helper/Translate.php b/library/Zend/View/Helper/Translate.php deleted file mode 100644 index e107e55f6a..0000000000 --- a/library/Zend/View/Helper/Translate.php +++ /dev/null @@ -1,180 +0,0 @@ -setTranslator($translate); - } - } - - /** - * Translate a message - * You can give multiple params or an array of params. - * If you want to output another locale just set it as last single parameter - * Example 1: translate('%1\$s + %2\$s', $value1, $value2, $locale); - * Example 2: translate('%1\$s + %2\$s', array($value1, $value2), $locale); - * - * @param string $messageid Id of the message to be translated - * @return string|Zend_View_Helper_Translate Translated message - */ - public function translate($messageid = null) - { - if ($messageid === null) { - return $this; - } - - $translate = $this->getTranslator(); - $options = func_get_args(); - - array_shift($options); - $count = count($options); - $locale = null; - if ($count > 0) { - if (Zend_Locale::isLocale($options[($count - 1)], null, false) !== false) { - $locale = array_pop($options); - } - } - - if ((count($options) === 1) and (is_array($options[0]) === true)) { - $options = $options[0]; - } - - if ($translate !== null) { - $messageid = $translate->translate($messageid, $locale); - } - - if (count($options) === 0) { - return $messageid; - } - - return vsprintf($messageid, $options); - } - - /** - * Sets a translation Adapter for translation - * - * @param Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate - * @throws Zend_View_Exception When no or a false instance was set - * @return Zend_View_Helper_Translate - */ - public function setTranslator($translate) - { - if ($translate instanceof Zend_Translate_Adapter) { - $this->_translator = $translate; - } else if ($translate instanceof Zend_Translate) { - $this->_translator = $translate->getAdapter(); - } else { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); - $e->setView($this->view); - throw $e; - } - - return $this; - } - - /** - * Retrieve translation object - * - * @return Zend_Translate_Adapter|null - */ - public function getTranslator() - { - if ($this->_translator === null) { - #require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Translate')) { - $this->setTranslator(Zend_Registry::get('Zend_Translate')); - } - } - - return $this->_translator; - } - - /** - * Set's an new locale for all further translations - * - * @param string|Zend_Locale $locale New locale to set - * @throws Zend_View_Exception When no Zend_Translate instance was set - * @return Zend_View_Helper_Translate - */ - public function setLocale($locale = null) - { - $translate = $this->getTranslator(); - if ($translate === null) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); - $e->setView($this->view); - throw $e; - } - - $translate->setLocale($locale); - return $this; - } - - /** - * Returns the set locale for translations - * - * @throws Zend_View_Exception When no Zend_Translate instance was set - * @return string|Zend_Locale - */ - public function getLocale() - { - $translate = $this->getTranslator(); - if ($translate === null) { - #require_once 'Zend/View/Exception.php'; - $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); - $e->setView($this->view); - throw $e; - } - - return $translate->getLocale(); - } -} diff --git a/library/Zend/View/Helper/Url.php b/library/Zend/View/Helper/Url.php deleted file mode 100644 index f2e28f7de0..0000000000 --- a/library/Zend/View/Helper/Url.php +++ /dev/null @@ -1,51 +0,0 @@ -getRouter(); - return $router->assemble($urlOptions, $name, $reset, $encode); - } -} diff --git a/library/Zend/View/Helper/UserAgent.php b/library/Zend/View/Helper/UserAgent.php deleted file mode 100644 index ef45419843..0000000000 --- a/library/Zend/View/Helper/UserAgent.php +++ /dev/null @@ -1,83 +0,0 @@ -setUserAgent($userAgent); - } - return $this->getUserAgent(); - } - - /** - * Set UserAgent instance - * - * @param Zend_Http_UserAgent $userAgent - * @return Zend_View_Helper_UserAgent - */ - public function setUserAgent(Zend_Http_UserAgent $userAgent) - { - $this->_userAgent = $userAgent; - return $this; - } - - /** - * Retrieve UserAgent instance - * - * If none set, instantiates one using no configuration - * - * @return Zend_Http_UserAgent - */ - public function getUserAgent() - { - if (null === $this->_userAgent) { - #require_once 'Zend/Http/UserAgent.php'; - $this->setUserAgent(new Zend_Http_UserAgent()); - } - return $this->_userAgent; - } -} diff --git a/library/Zend/View/Interface.php b/library/Zend/View/Interface.php deleted file mode 100644 index 496ec7108e..0000000000 --- a/library/Zend/View/Interface.php +++ /dev/null @@ -1,137 +0,0 @@ - value pairs to set en - * masse. - * - * @see __set() - * @param string|array $spec The assignment strategy to use (key or array of key - * => value pairs) - * @param mixed $value (Optional) If assigning a named variable, use this - * as the value. - * @return void - */ - public function assign($spec, $value = null); - - /** - * Clear all assigned variables - * - * Clears all variables assigned to Zend_View either via {@link assign()} or - * property overloading ({@link __get()}/{@link __set()}). - * - * @return void - */ - public function clearVars(); - - /** - * Processes a view script and returns the output. - * - * @param string $name The script name to process. - * @return string The script output. - */ - public function render($name); -} diff --git a/library/Zend/View/Stream.php b/library/Zend/View/Stream.php deleted file mode 100644 index ae8d52419e..0000000000 --- a/library/Zend/View/Stream.php +++ /dev/null @@ -1,183 +0,0 @@ -_data = file_get_contents($path); - - /** - * If reading the file failed, update our local stat store - * to reflect the real stat of the file, then return on failure - */ - if ($this->_data === false) { - $this->_stat = stat($path); - return false; - } - - /** - * Convert to long-form and to - * - */ - $this->_data = preg_replace('/\<\?\=/', "_data); - $this->_data = preg_replace('/<\?(?!xml|php)/s', '_data); - - /** - * file_get_contents() won't update PHP's stat cache, so we grab a stat - * of the file to prevent additional reads should the script be - * requested again, which will make include() happy. - */ - $this->_stat = stat($path); - - return true; - } - - /** - * Included so that __FILE__ returns the appropriate info - * - * @return array - */ - public function url_stat() - { - return $this->_stat; - } - - /** - * Reads from the stream. - */ - public function stream_read($count) - { - $ret = substr($this->_data, $this->_pos, $count); - $this->_pos += strlen($ret); - return $ret; - } - - - /** - * Tells the current position in the stream. - */ - public function stream_tell() - { - return $this->_pos; - } - - - /** - * Tells if we are at the end of the stream. - */ - public function stream_eof() - { - return $this->_pos >= strlen($this->_data); - } - - - /** - * Stream statistics. - */ - public function stream_stat() - { - return $this->_stat; - } - - - /** - * Seek to a specific point in the stream. - */ - public function stream_seek($offset, $whence) - { - switch ($whence) { - case SEEK_SET: - if ($offset < strlen($this->_data) && $offset >= 0) { - $this->_pos = $offset; - return true; - } else { - return false; - } - break; - - case SEEK_CUR: - if ($offset >= 0) { - $this->_pos += $offset; - return true; - } else { - return false; - } - break; - - case SEEK_END: - if (strlen($this->_data) + $offset >= 0) { - $this->_pos = strlen($this->_data) + $offset; - return true; - } else { - return false; - } - break; - - default: - return false; - } - } -} diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 52763fff45..fb99871319 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -32,15 +32,12 @@ require_once 'Zend/Auth/AllTests.php'; require_once 'Zend/Barcode/AllTests.php'; require_once 'Zend/Cache/AllTests.php'; -require_once 'Zend/Captcha/AllTests.php'; require_once 'Zend/Cloud/AllTests.php'; require_once 'Zend/CodeGenerator/Php/AllTests.php'; require_once 'Zend/Db/AllTests.php'; -require_once 'Zend/Dom/AllTests.php'; require_once 'Zend/ConfigTest.php'; require_once 'Zend/Config/AllTests.php'; require_once 'Zend/Console/GetoptTest.php'; -require_once 'Zend/Controller/AllTests.php'; require_once 'Zend/CurrencyTest.php'; require_once 'Zend/Crypt/AllTests.php'; require_once 'Zend/DateTest.php'; @@ -48,16 +45,13 @@ require_once 'Zend/DebugTest.php'; require_once 'Zend/EventManager/AllTests.php'; require_once 'Zend/ExceptionTest.php'; -require_once 'Zend/Feed/AllTests.php'; require_once 'Zend/File/AllTests.php'; require_once 'Zend/FilterTest.php'; require_once 'Zend/Filter/AllTests.php'; -require_once 'Zend/Form/AllTests.php'; require_once 'Zend/Gdata/AllTests.php'; require_once 'Zend/Http/AllTests.php'; require_once 'Zend/JsonTest.php'; require_once 'Zend/Json/AllTests.php'; -require_once 'Zend/Layout/AllTests.php'; require_once 'Zend/Ldap/AllTests.php'; require_once 'Zend/LoaderTest.php'; require_once 'Zend/Loader/AllTests.php'; @@ -86,7 +80,6 @@ require_once 'Zend/Search/Lucene/AllTests.php'; require_once 'Zend/Serializer/AllTests.php'; require_once 'Zend/Server/AllTests.php'; -require_once 'Zend/Service/AllTests.php'; require_once 'Zend/Session/AllTests.php'; require_once 'Zend/Soap/AllTests.php'; require_once 'Zend/Tag/AllTests.php'; @@ -101,7 +94,6 @@ require_once 'Zend/ValidateTest.php'; require_once 'Zend/Validate/AllTests.php'; require_once 'Zend/VersionTest.php'; -require_once 'Zend/ViewTest.php'; require_once 'Zend/View/AllTests.php'; if (PHP_OS != 'AIX') { require_once 'Zend/Wildfire/AllTests.php'; diff --git a/tests/Zend/View/AllTests.php b/tests/Zend/View/AllTests.php deleted file mode 100644 index a05d46e91f..0000000000 --- a/tests/Zend/View/AllTests.php +++ /dev/null @@ -1,56 +0,0 @@ -addTest(Zend_View_Helper_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_View_AllTests::main') { - Zend_View_AllTests::main(); -} diff --git a/tests/Zend/View/Helper/ActionTest.php b/tests/Zend/View/Helper/ActionTest.php deleted file mode 100644 index cc12aef4ca..0000000000 --- a/tests/Zend/View/Helper/ActionTest.php +++ /dev/null @@ -1,339 +0,0 @@ -_origServer = $_SERVER; - $_SERVER = array( - 'SCRIPT_FILENAME' => __FILE__, - 'PHP_SELF' => __FILE__, - ); - - $front = Zend_Controller_Front::getInstance(); - $front->resetInstance(); - - $this->request = new Zend_Controller_Request_Http('http://framework.zend.com/action-foo'); - $this->response = new Zend_Controller_Response_Http(); - $this->response->headersSentThrowsException = false; - $front->setRequest($this->request) - ->setResponse($this->response) - ->addModuleDirectory(dirname(__FILE__) . '/_files/modules'); - - $this->view = new Zend_View(); - $this->helper = new Zend_View_Helper_Action(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->request, $this->response, $this->helper); - $_SERVER = $this->_origServer; - } - - /** - * @return void - */ - public function testInitialStateHasClonedObjects() - { - $this->assertNotSame($this->request, $this->helper->request); - $this->assertNotSame($this->response, $this->helper->response); - - $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); - $this->assertNotSame($dispatcher, $this->helper->dispatcher); - } - - /** - * @return void - */ - public function testInitialStateHasDefaultModuleName() - { - $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); - $module = $dispatcher->getDefaultModule(); - $this->assertEquals($module, $this->helper->defaultModule); - - $dispatcher->setDefaultModule('foo'); - $helper = new Zend_View_Helper_Action(); - $this->assertEquals('foo', $helper->defaultModule); - } - - /** - * @return void - */ - public function testResetObjectsClearsRequestVars() - { - $this->helper->request->setParam('foo', 'action-bar'); - $this->helper->resetObjects(); - $this->assertNull($this->helper->request->getParam('foo')); - } - - /** - * @return void - */ - public function testResetObjectsClearsResponseBody() - { - $this->helper->response->setBody('foobarbaz'); - $this->helper->resetObjects(); - $body = $this->helper->response->getBody(); - $this->assertTrue(empty($body)); - } - - /** - * @return void - */ - public function testResetObjectsClearsResponseHeaders() - { - $this->helper->response->setHeader('X-Foo', 'Bar') - ->setRawHeader('HTTP/1.1'); - $this->helper->resetObjects(); - $headers = $this->helper->response->getHeaders(); - $rawHeaders = $this->helper->response->getRawHeaders(); - $this->assertTrue(empty($headers)); - $this->assertTrue(empty($rawHeaders)); - } - - /** - * @return void - */ - public function testActionReturnsContentFromDefaultModule() - { - $value = $this->helper->action('bar', 'action-foo'); - $this->assertContains('In default module, FooController::barAction()', $value); - } - - /** - * @return void - */ - public function testActionReturnsContentFromSpecifiedModule() - { - $value = $this->helper->action('bar', 'foo', 'foo'); - $this->assertContains('In foo module, Foo_FooController::barAction()', $value); - } - - /** - * @return void - */ - public function testActionReturnsContentReflectingPassedParams() - { - $value = $this->helper->action('baz', 'action-foo', null, array('bat' => 'This is my message')); - $this->assertNotContains('BOGUS', $value, var_export($this->helper->request->getUserParams(), 1)); - $this->assertContains('This is my message', $value); - } - - /** - * @return void - */ - public function testActionReturnsEmptyStringWhenForwardDetected() - { - $value = $this->helper->action('forward', 'action-foo'); - $this->assertEquals('', $value); - } - - /** - * @return void - */ - public function testActionReturnsEmptyStringWhenRedirectDetected() - { - $value = $this->helper->action('redirect', 'action-foo'); - $this->assertEquals('', $value); - } - - /** - * @return void - */ - public function testConstructorThrowsExceptionWithNoControllerDirsInFrontController() - { - Zend_Controller_Front::getInstance()->resetInstance(); - try { - $helper = new Zend_View_Helper_Action(); - $this->fail('Empty front controller should cause action helper to throw exception'); - } catch (Exception $e) { - } - } - - /** - * @return void - */ - public function testConstructorThrowsExceptionWithNoRequestInFrontController() - { - $front = Zend_Controller_Front::getInstance(); - $front->resetInstance(); - - $response = new Zend_Controller_Response_Http(); - $response->headersSentThrowsException = false; - $front->setResponse($response) - ->addModuleDirectory(dirname(__FILE__) . '/_files/modules'); - try { - $helper = new Zend_View_Helper_Action(); - $this->fail('No request in front controller should cause action helper to throw exception'); - } catch (Exception $e) { - } - } - - /** - * @return void - */ - public function testConstructorThrowsExceptionWithNoResponseInFrontController() - { - $front = Zend_Controller_Front::getInstance(); - $front->resetInstance(); - - $request = new Zend_Controller_Request_Http('http://framework.zend.com/foo'); - $front->setRequest($this->request) - ->addModuleDirectory(dirname(__FILE__) . '/_files/modules'); - try { - $helper = new Zend_View_Helper_Action(); - $this->fail('No response in front controller should cause action helper to throw exception'); - } catch (Exception $e) { - } - } - - public function testViewObjectRemainsUnchangedAfterAction() - { - $value = $this->helper->action('bar', 'foo', 'foo'); - $this->assertContains('In foo module, Foo_FooController::barAction()', $value); - $this->assertNull($this->view->bar); - } - - public function testNestingActionsDoesNotBreakPlaceholderHelpers() - { - $html = $this->helper->action('nest', 'foo', 'foo'); - $title = $this->view->headTitle()->toString(); - $this->assertContains(' - ', $title, $title); - $this->assertContains('Foo Nest', $title); - $this->assertContains('Nested Stuff', $title); - } - - /** - * @group ZF-2716 - */ - public function testActionWithPartialsUseOfViewRendererReturnsToOriginatingViewState() - { - require_once 'Zend/View/Helper/Partial.php'; - $partial = new Zend_View_Helper_Partial(); - $this->view->setScriptPath(dirname(__FILE__) . '/_files/modules/default/views/scripts/'); - $partial->setView($this->view); - - Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view = $this->view; - - $partial->partial('partialActionCall.phtml'); - - $this->assertSame($this->view, Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view); - - } - - /** - * Future ViewRenderer State issues should be included in this test. - * - * @group ZF-2846 - */ - public function testActionReturnsViewRendererToOriginalState() - { - /* Setup the VR as if we were inside an action controller */ - $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); - $viewRenderer->init(); - Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); - - // make sure noRender is false - $this->assertFalse($viewRenderer->getNoRender()); - - $value = $this->helper->action('bar', 'action-foo'); - - $viewRendererPostAction = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - - // ViewRenderer noRender should still be false - $this->assertFalse($viewRendererPostAction->getNoRender()); - $this->assertSame($viewRenderer, $viewRendererPostAction); - } - - /** - * Multiple call state issue - * - * - * @group ZF-3456 - */ - public function testActionCalledWithinActionResetsResponseState() - { - $value = $this->helper->action('bar-one', 'baz', 'foo'); - $this->assertRegexp('/Baz-Three-View-Script\s+Baz-Two-View-Script\s+Baz-One-View-Script/s', $value); - } -} - -// Call Zend_View_Helper_ActionTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_ActionTest::main") { - Zend_View_Helper_ActionTest::main(); -} diff --git a/tests/Zend/View/Helper/AllTests.php b/tests/Zend/View/Helper/AllTests.php deleted file mode 100644 index 132746fd7e..0000000000 --- a/tests/Zend/View/Helper/AllTests.php +++ /dev/null @@ -1,151 +0,0 @@ -addTestSuite('Zend_View_Helper_ActionTest'); - $suite->addTestSuite('Zend_View_Helper_BaseUrlTest'); - $suite->addTestSuite('Zend_View_Helper_CurrencyTest'); - $suite->addTestSuite('Zend_View_Helper_CycleTest'); - $suite->addTestSuite('Zend_View_Helper_DeclareVarsTest'); - $suite->addTestSuite('Zend_View_Helper_DoctypeTest'); - $suite->addTestSuite('Zend_View_Helper_FieldsetTest'); - $suite->addTestSuite('Zend_View_Helper_FormButtonTest'); - $suite->addTestSuite('Zend_View_Helper_FormCheckboxTest'); - $suite->addTestSuite('Zend_View_Helper_FormErrorsTest'); - $suite->addTestSuite('Zend_View_Helper_FormFileTest'); - $suite->addTestSuite('Zend_View_Helper_FormImageTest'); - $suite->addTestSuite('Zend_View_Helper_FormLabelTest'); - $suite->addTestSuite('Zend_View_Helper_FormMultiCheckboxTest'); - $suite->addTestSuite('Zend_View_Helper_FormPasswordTest'); - $suite->addTestSuite('Zend_View_Helper_FormRadioTest'); - $suite->addTestSuite('Zend_View_Helper_FormResetTest'); - $suite->addTestSuite('Zend_View_Helper_FormSelectTest'); - $suite->addTestSuite('Zend_View_Helper_FormSubmitTest'); - $suite->addTestSuite('Zend_View_Helper_FormTest'); - $suite->addTestSuite('Zend_View_Helper_FormTextTest'); - $suite->addTestSuite('Zend_View_Helper_FormTextareaTest'); - $suite->addTestSuite('Zend_View_Helper_GravatarTest'); - $suite->addTestSuite('Zend_View_Helper_HeadLinkTest'); - $suite->addTestSuite('Zend_View_Helper_HeadMetaTest'); - $suite->addTestSuite('Zend_View_Helper_HeadScriptTest'); - $suite->addTestSuite('Zend_View_Helper_HeadStyleTest'); - $suite->addTestSuite('Zend_View_Helper_HeadTitleTest'); - $suite->addTestSuite('Zend_View_Helper_HtmlFlashTest'); - $suite->addTestSuite('Zend_View_Helper_HtmlListTest'); - $suite->addTestSuite('Zend_View_Helper_HtmlObjectTest'); - $suite->addTestSuite('Zend_View_Helper_HtmlPageTest'); - $suite->addTestSuite('Zend_View_Helper_HtmlQuicktimeTest'); - $suite->addTestSuite('Zend_View_Helper_InlineScriptTest'); - $suite->addTestSuite('Zend_View_Helper_JsonTest'); - $suite->addTestSuite('Zend_View_Helper_LayoutTest'); - $suite->addTest(Zend_View_Helper_Navigation_AllTests::suite()); - $suite->addTestSuite('Zend_View_Helper_PaginationControlTest'); - $suite->addTestSuite('Zend_View_Helper_PartialTest'); - $suite->addTestSuite('Zend_View_Helper_PartialLoopTest'); - $suite->addTestSuite('Zend_View_Helper_PlaceholderTest'); - $suite->addTestSuite('Zend_View_Helper_Placeholder_ContainerTest'); - $suite->addTestSuite('Zend_View_Helper_Placeholder_RegistryTest'); - $suite->addTestSuite('Zend_View_Helper_Placeholder_StandaloneContainerTest'); - $suite->addTestSuite('Zend_View_Helper_ServerUrlTest'); - $suite->addTestSuite('Zend_View_Helper_TranslateTest'); - $suite->addTestSuite('Zend_View_Helper_UrlTest'); - $suite->addTestSuite('Zend_View_Helper_UserAgentTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_View_Helper_AllTests::main') { - Zend_View_Helper_AllTests::main(); -} diff --git a/tests/Zend/View/Helper/AttributeJsEscapingTest.php b/tests/Zend/View/Helper/AttributeJsEscapingTest.php deleted file mode 100644 index cfcbead218..0000000000 --- a/tests/Zend/View/Helper/AttributeJsEscapingTest.php +++ /dev/null @@ -1,102 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormSubmit(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper, $this->view); - } - - - /** - * @group ZF-9926 - */ - public function testRendersSubmitInput() - { - $html = $this->helper->formSubmit(array( - 'name' => 'foo', - 'value' => 'Submit!', - 'attribs' => array('onsubmit' => array('foo', '\'bar\'', 10)) - )); - $this->assertEquals('', $html); - } -} - -// Call Zend_View_Helper_FormSubmitTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormSubmitTest::main") { - Zend_View_Helper_FormSubmitTest::main(); -} diff --git a/tests/Zend/View/Helper/BaseUrlTest.php b/tests/Zend/View/Helper/BaseUrlTest.php deleted file mode 100644 index 9586dd7dd5..0000000000 --- a/tests/Zend/View/Helper/BaseUrlTest.php +++ /dev/null @@ -1,212 +0,0 @@ -_previousBaseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); - $this->_server = $_SERVER; - } - - /** - * Cleans up the environment after running a test. - */ - protected function tearDown() - { - Zend_Controller_Front::getInstance()->setBaseUrl($this->_previousBaseUrl); - Zend_Controller_Front::getInstance()->resetInstance(); - - $_SERVER = $this->_server; - } - - /** - * Test and make sure base url returned is consistent with the FC - * - */ - public function testBaseUrlIsSameAsFrontController() - { - $baseUrls = array('', '/subdir', '/subdir/', '/sub/sub/dir'); - foreach ($baseUrls as $baseUrl) { - Zend_Controller_Front::getInstance()->setBaseUrl($baseUrl); - $helper = new Zend_View_Helper_BaseUrl(); - - $this->assertEquals(rtrim($baseUrl, '/\\'), $helper->baseUrl()); - } - } - - /** - * Test and make sure if paths given without / prefix are fixed - * - */ - public function testBaseUrlIsCorrectingFilePath() - { - $baseUrls = array( - '' => '/file.js', - '/subdir' => '/subdir/file.js', - '/sub/sub/dir' => '/sub/sub/dir/file.js', - ); - - foreach ($baseUrls as $baseUrl => $val) { - Zend_Controller_Front::getInstance()->setBaseUrl($baseUrl); - $helper = new Zend_View_Helper_BaseUrl(); - - $this->assertEquals($val, $helper->baseUrl('file.js')); - } - } - - /** - * Test and make sure baseUrl appended with file works - * - */ - public function testBaseUrlIsAppendedWithFile() - { - $baseUrls = array( - '' => '/file.js', - '/subdir' => '/subdir/file.js', - '/sub/sub/dir' => '/sub/sub/dir/file.js', - ); - - foreach ($baseUrls as $baseUrl => $val) { - Zend_Controller_Front::getInstance()->setBaseUrl($baseUrl); - $helper = new Zend_View_Helper_BaseUrl(); - - $this->assertEquals($val, $helper->baseUrl('/file.js')); - } - } - - /** - * Test and makes sure that baseUrl appended with path works - * - */ - public function testBaseUrlIsAppendedWithPath() - { - $baseUrls = array( - '' => '/path/bar', - '/subdir' => '/subdir/path/bar', - '/sub/sub/dir' => '/sub/sub/dir/path/bar', - ); - - foreach ($baseUrls as $baseUrl => $val) { - Zend_Controller_Front::getInstance()->setBaseUrl($baseUrl); - $helper = new Zend_View_Helper_BaseUrl(); - - $this->assertEquals($val, $helper->baseUrl('/path/bar')); - } - } - - /** - * Test and makes sure that baseUrl appended with root path - * - */ - public function testBaseUrlIsAppendedWithRootPath() - { - $baseUrls = array( - '' => '/', - '/foo' => '/foo/' - ); - - foreach ($baseUrls as $baseUrl => $val) { - Zend_Controller_Front::getInstance()->setBaseUrl($baseUrl); - $helper = new Zend_View_Helper_BaseUrl(); - - $this->assertEquals($val, $helper->baseUrl('/')); - } - } - - public function testSetBaseUrlModifiesBaseUrl() - { - $helper = new Zend_View_Helper_BaseUrl(); - $helper->setBaseUrl('/myfoo'); - $this->assertEquals('/myfoo', $helper->getBaseUrl()); - } - - public function testGetBaseUrlReturnsBaseUrl() - { - Zend_Controller_Front::getInstance()->setBaseUrl('/mybar'); - $helper = new Zend_View_Helper_BaseUrl(); - $this->assertEquals('/mybar', $helper->getBaseUrl()); - } - - public function testGetBaseUrlReturnsBaseUrlWithoutScriptName() - { - $_SERVER['SCRIPT_NAME'] = '/foo/bar/bat/mybar/index.php'; - Zend_Controller_Front::getInstance()->setBaseUrl('/mybar/index.php'); - $helper = new Zend_View_Helper_BaseUrl(); - $this->assertEquals('/mybar', $helper->getBaseUrl()); - } -} - -// Call Zend_View_Helper_BaseUrlTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == 'Zend_View_Helper_BaseUrlTest::main') { - Zend_View_Helper_BaseUrlTest::main(); -} diff --git a/tests/Zend/View/Helper/CurrencyTest.php b/tests/Zend/View/Helper/CurrencyTest.php deleted file mode 100644 index 8535721775..0000000000 --- a/tests/Zend/View/Helper/CurrencyTest.php +++ /dev/null @@ -1,200 +0,0 @@ -clearRegistry(); - require_once 'Zend/Cache.php'; - $this->_cache = Zend_Cache::factory('Core', 'File', - array('lifetime' => 120, 'automatic_serialization' => true), - array('cache_dir' => dirname(__FILE__) . '/../../_files/')); - Zend_Currency::setCache($this->_cache); - - $this->helper = new Zend_View_Helper_Currency('de_AT'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper); - $this->_cache->clean(Zend_Cache::CLEANING_MODE_ALL); - $this->clearRegistry(); - } - - public function testCurrencyObjectPassedToConstructor() - { - $curr = new Zend_Currency('de_AT'); - - $helper = new Zend_View_Helper_Currency($curr); - $this->assertEquals('€ 1.234,56', $helper->currency(1234.56)); - $this->assertEquals('€ 0,12', $helper->currency(0.123)); - } - - public function testLocalCurrencyObjectUsedWhenPresent() - { - $curr = new Zend_Currency('de_AT'); - - $this->helper->setCurrency($curr); - $this->assertEquals('€ 1.234,56', $this->helper->currency(1234.56)); - $this->assertEquals('€ 0,12', $this->helper->currency(0.123)); - } - - public function testCurrencyObjectInRegistryUsedInAbsenceOfLocalCurrencyObject() - { - $curr = new Zend_Currency('de_AT'); - Zend_Registry::set('Zend_Currency', $curr); - $this->assertEquals('€ 1.234,56', $this->helper->currency(1234.56)); - } - - public function testPassingNonNullNonCurrencyObjectToConstructorThrowsException() - { - try { - $helper = new Zend_View_Helper_Currency('something'); - } catch (Exception $e) { - if (substr($e->getMessage(), 0, 15) == 'No region found') { - $this->assertContains('within the locale', $e->getMessage()); - } else { - $this->assertContains('not found', $e->getMessage()); - } - } - } - - public function testPassingNonCurrencyObjectToSetCurrencyThrowsException() - { - try { - $this->helper->setCurrency('something'); - } catch (Exception $e) { - if (substr($e->getMessage(), 0, 15) == 'No region found') { - $this->assertContains('within the locale', $e->getMessage()); - } else { - $this->assertContains('not found', $e->getMessage()); - } - } - } - - public function testCanOutputCurrencyWithOptions() - { - $curr = new Zend_Currency('de_AT'); - - $this->helper->setCurrency($curr); - $this->assertEquals("€ 1.234,56", $this->helper->currency(1234.56, "de_AT")); - } - - public function testCurrencyObjectNullByDefault() - { - $this->assertNotNull($this->helper->getCurrency()); - } - - public function testLocalCurrencyObjectIsPreferredOverRegistry() - { - $currReg = new Zend_Currency('de_AT'); - Zend_Registry::set('Zend_Currency', $currReg); - - $this->helper = new Zend_View_Helper_Currency(); - $this->assertSame($currReg, $this->helper->getCurrency()); - - $currLoc = new Zend_Currency('en_US'); - $this->helper->setCurrency($currLoc); - $this->assertSame($currLoc, $this->helper->getCurrency()); - $this->assertNotSame($currLoc, $currReg); - } - - public function testHelperObjectReturnedWhenNoArgumentsPassed() - { - $helper = $this->helper->currency(); - $this->assertSame($this->helper, $helper); - - $currLoc = new Zend_Currency('de_AT'); - $this->helper->setCurrency($currLoc); - $helper = $this->helper->currency(); - $this->assertSame($this->helper, $helper); - } -} - -// Call Zend_View_Helper_TranslateTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_TranslateTest::main") { - Zend_View_Helper_TranslateTest::main(); -} diff --git a/tests/Zend/View/Helper/CycleTest.php b/tests/Zend/View/Helper/CycleTest.php deleted file mode 100644 index 030642abf3..0000000000 --- a/tests/Zend/View/Helper/CycleTest.php +++ /dev/null @@ -1,169 +0,0 @@ -helper = new Zend_View_Helper_Cycle(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper); - } - - public function testCycleMethodReturnsObjectInstance() - { - $cycle = $this->helper->cycle(); - $this->assertTrue($cycle instanceof Zend_View_Helper_Cycle); - } - - public function testAssignAndGetValues() - { - $this->helper->assign(array('a', 1, 'asd')); - $this->assertEquals(array('a', 1, 'asd'), $this->helper->getAll()); - } - - public function testCycleMethod() - { - $this->helper->cycle(array('a', 1, 'asd')); - $this->assertEquals(array('a', 1, 'asd'), $this->helper->getAll()); - } - - public function testToString() - { - $this->helper->cycle(array('a', 1, 'asd')); - $this->assertEquals('a', (string) $this->helper->toString()); - } - - public function testNextValue() - { - $this->helper->assign(array('a', 1, 3)); - $this->assertEquals('a', (string) $this->helper->next()); - $this->assertEquals(1, (string) $this->helper->next()); - $this->assertEquals(3, (string) $this->helper->next()); - $this->assertEquals('a', (string) $this->helper->next()); - $this->assertEquals(1, (string) $this->helper->next()); - } - - public function testPrevValue() - { - $this->helper->assign(array(4, 1, 3)); - $this->assertEquals(3, (string) $this->helper->prev()); - $this->assertEquals(1, (string) $this->helper->prev()); - $this->assertEquals(4, (string) $this->helper->prev()); - $this->assertEquals(3, (string) $this->helper->prev()); - $this->assertEquals(1, (string) $this->helper->prev()); - } - - public function testRewind() - { - $this->helper->assign(array(5, 8, 3)); - $this->assertEquals(5, (string) $this->helper->next()); - $this->assertEquals(8, (string) $this->helper->next()); - $this->helper->rewind(); - $this->assertEquals(5, (string) $this->helper->next()); - $this->assertEquals(8, (string) $this->helper->next()); - } - - public function testMixedMethods() - { - $this->helper->assign(array(5, 8, 3)); - $this->assertEquals(5, (string) $this->helper->next()); - $this->assertEquals(5, (string) $this->helper->current()); - $this->assertEquals(8, (string) $this->helper->next()); - $this->assertEquals(5, (string) $this->helper->prev()); - } - - public function testTwoCycles() - { - $this->helper->assign(array(5, 8, 3)); - $this->assertEquals(5, (string) $this->helper->next()); - $this->assertEquals(2, (string) $this->helper->cycle(array(2,38,1),'cycle2')->next()); - $this->assertEquals(8, (string) $this->helper->cycle()->next()); - $this->assertEquals(38, (string) $this->helper->setName('cycle2')->next()); - } - - public function testTwoCyclesInLoop() - { - $expected = array(5,4,2,3); - $expected2 = array(7,34,8,6); - for($i=0;$i<4;$i++) { - $this->assertEquals($expected[$i], (string) $this->helper->cycle($expected)->next()); - $this->assertEquals($expected2[$i], (string) $this->helper->cycle($expected2,'cycle2')->next()); - } - } - -} -// Call Zend_View_Helper_CycleTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_CycleTest::main") { - Zend_View_Helper_CycleTest::main(); -} - diff --git a/tests/Zend/View/Helper/DeclareVarsTest.php b/tests/Zend/View/Helper/DeclareVarsTest.php deleted file mode 100644 index f5b4237724..0000000000 --- a/tests/Zend/View/Helper/DeclareVarsTest.php +++ /dev/null @@ -1,117 +0,0 @@ -setScriptPath(dirname(__FILE__) . $base); - $view->strictVars(true); - $this->view = $view; - } - - public function tearDown() - { - unset($this->view); - } - - protected function _declareVars() - { - $this->view->declareVars( - 'varName1', - 'varName2', - array( - 'varName3' => 'defaultValue', - 'varName4' => array() - ) - ); - } - - public function testDeclareUndeclaredVars() - { - $this->_declareVars(); - - $this->assertTrue(isset($this->view->varName1)); - $this->assertTrue(isset($this->view->varName2)); - $this->assertTrue(isset($this->view->varName3)); - $this->assertTrue(isset($this->view->varName4)); - - $this->assertEquals('defaultValue', $this->view->varName3); - $this->assertEquals(array(), $this->view->varName4); - } - - public function testDeclareDeclaredVars() - { - $this->view->varName2 = 'alreadySet'; - $this->view->varName3 = 'myValue'; - $this->view->varName5 = 'additionalValue'; - - $this->_declareVars(); - - $this->assertTrue(isset($this->view->varName1)); - $this->assertTrue(isset($this->view->varName2)); - $this->assertTrue(isset($this->view->varName3)); - $this->assertTrue(isset($this->view->varName4)); - $this->assertTrue(isset($this->view->varName5)); - - $this->assertEquals('alreadySet', $this->view->varName2); - $this->assertEquals('myValue', $this->view->varName3); - $this->assertEquals('additionalValue', $this->view->varName5); - } -} - -// Call Zend_View_Helper_DeclareVarsTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_DeclareVarsTest::main") { - Zend_View_Helper_DeclareVarsTest::main(); -} diff --git a/tests/Zend/View/Helper/DoctypeTest.php b/tests/Zend/View/Helper/DoctypeTest.php deleted file mode 100644 index ea52eb10c5..0000000000 --- a/tests/Zend/View/Helper/DoctypeTest.php +++ /dev/null @@ -1,224 +0,0 @@ -helper = new Zend_View_Helper_Doctype(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper); - } - - public function testRegistryEntryCreatedAfterInstantiation() - { - $this->assertTrue(Zend_Registry::isRegistered('Zend_View_Helper_Doctype')); - $doctype = Zend_Registry::get('Zend_View_Helper_Doctype'); - $this->assertTrue($doctype instanceof ArrayObject); - $this->assertTrue(isset($doctype['doctype'])); - $this->assertTrue(isset($doctype['doctypes'])); - $this->assertTrue(is_array($doctype['doctypes'])); - } - - public function testDoctypeMethodReturnsObjectInstance() - { - $doctype = $this->helper->doctype(); - $this->assertTrue($doctype instanceof Zend_View_Helper_Doctype); - } - - public function testPassingDoctypeSetsDoctype() - { - $doctype = $this->helper->doctype('XHTML1_STRICT'); - $this->assertEquals('XHTML1_STRICT', $doctype->getDoctype()); - } - - public function testIsXhtmlReturnsTrueForXhtmlDoctypes() - { - $types = array( - 'XHTML1_STRICT', - 'XHTML1_TRANSITIONAL', - 'XHTML1_FRAMESET', - 'XHTML1_RDFA', - 'XHTML1_RDFA11', - 'XHTML5', - ); - - foreach ($types as $type) { - $doctype = $this->helper->doctype($type); - $this->assertEquals($type, $doctype->getDoctype()); - $this->assertTrue($doctype->isXhtml()); - } - - $doctype = $this->helper->doctype(''); - $this->assertEquals('CUSTOM_XHTML', $doctype->getDoctype()); - $this->assertTrue($doctype->isXhtml()); - } - - public function testIsXhtmlReturnsFalseForNonXhtmlDoctypes() - { - foreach (array('HTML4_STRICT', 'HTML4_LOOSE', 'HTML4_FRAMESET') as $type) { - $doctype = $this->helper->doctype($type); - $this->assertEquals($type, $doctype->getDoctype()); - $this->assertFalse($doctype->isXhtml()); - } - - $doctype = $this->helper->doctype(''); - $this->assertEquals('CUSTOM', $doctype->getDoctype()); - $this->assertFalse($doctype->isXhtml()); - } - - public function testIsHtml5() { - foreach (array('HTML5', 'XHTML5') as $type) { - $doctype = $this->helper->doctype($type); - $this->assertEquals($type, $doctype->getDoctype()); - $this->assertTrue($doctype->isHtml5()); - } - - foreach (array('HTML4_STRICT', 'HTML4_LOOSE', 'HTML4_FRAMESET', 'XHTML1_STRICT', 'XHTML1_TRANSITIONAL', 'XHTML1_FRAMESET') as $type) { - $doctype = $this->helper->doctype($type); - $this->assertEquals($type, $doctype->getDoctype()); - $this->assertFalse($doctype->isHtml5()); - } - } - - public function testIsRdfa() - { - $this->assertTrue($this->helper->doctype('XHTML1_RDFA')->isRdfa()); - $this->assertTrue($this->helper->doctype('XHTML1_RDFA11')->isRdfa()); - - // built-in doctypes - foreach (array('HTML4_STRICT', 'HTML4_LOOSE', 'HTML4_FRAMESET', 'XHTML1_STRICT', 'XHTML1_TRANSITIONAL', 'XHTML1_FRAMESET') as $type) { - $doctype = $this->helper->doctype($type); - $this->assertFalse($doctype->isRdfa()); - } - - // custom doctype - $doctype = $this->helper->doctype(''); - $this->assertFalse($doctype->isRdfa()); - } - - public function testCanRegisterCustomHtml5Doctype() { - $doctype = $this->helper->doctype(''); - $this->assertEquals('CUSTOM', $doctype->getDoctype()); - $this->assertTrue($doctype->isHtml5()); - } - - public function testCanRegisterCustomXhtmlDoctype() - { - $doctype = $this->helper->doctype(''); - $this->assertEquals('CUSTOM_XHTML', $doctype->getDoctype()); - $this->assertTrue($doctype->isXhtml()); - } - - public function testCanRegisterCustomHtmlDoctype() - { - $doctype = $this->helper->doctype(''); - $this->assertEquals('CUSTOM', $doctype->getDoctype()); - $this->assertFalse($doctype->isXhtml()); - } - - public function testMalformedCustomDoctypeRaisesException() - { - try { - $doctype = $this->helper->doctype(''); - $this->fail('Malformed doctype should raise exception'); - } catch (Exception $e) { - } - } - - public function testStringificationReturnsDoctypeString() - { - $doctype = $this->helper->doctype('XHTML1_STRICT'); - $string = $doctype->__toString(); - $registry = Zend_Registry::get('Zend_View_Helper_Doctype'); - $this->assertEquals($registry['doctypes']['XHTML1_STRICT'], $string); - } -} - -// Call Zend_View_Helper_DoctypeTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_DoctypeTest::main") { - Zend_View_Helper_DoctypeTest::main(); -} diff --git a/tests/Zend/View/Helper/FieldsetTest.php b/tests/Zend/View/Helper/FieldsetTest.php deleted file mode 100644 index 6be3475e37..0000000000 --- a/tests/Zend/View/Helper/FieldsetTest.php +++ /dev/null @@ -1,119 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_Fieldset(); - $this->helper->setView($this->view); - ob_start(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - ob_end_clean(); - } - - public function testFieldsetHelperCreatesFieldsetWithProvidedContent() - { - $html = $this->helper->fieldset('foo', 'foobar'); - $this->assertRegexp('#]+id="foo".*?>#', $html); - $this->assertContains('', $html); - $this->assertContains('foobar', $html); - } - - public function testProvidingLegendOptionToFieldsetCreatesLegendTag() - { - $html = $this->helper->fieldset('foo', 'foobar', array('legend' => 'Great Scott!')); - $this->assertRegexp('#Great Scott!#', $html); - } - - /** - * @group ZF-2913 - */ - public function testEmptyLegendShouldNotRenderLegendTag() - { - foreach (array(null, '', ' ', false) as $legend) { - $html = $this->helper->fieldset('foo', 'foobar', array('legend' => $legend)); - $this->assertNotContains('', $html, 'Failed with value ' . var_export($legend, 1) . ': ' . $html); - } - } - - /** - * @group ZF-3632 - */ - public function testHelperShouldAllowDisablingEscapingOfLegend() - { - $html = $this->helper->fieldset('foo', 'foobar', array('legend' => 'Great Scott!', 'escape' => false)); - $this->assertRegexp('#Great Scott!#', $html, $html); - } -} - -// Call Zend_View_Helper_FieldsetTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FieldsetTest::main") { - Zend_View_Helper_FieldsetTest::main(); -} diff --git a/tests/Zend/View/Helper/FormButtonTest.php b/tests/Zend/View/Helper/FormButtonTest.php deleted file mode 100644 index 54be7659ef..0000000000 --- a/tests/Zend/View/Helper/FormButtonTest.php +++ /dev/null @@ -1,139 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormButton(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @access protected - */ - protected function tearDown() - { - } - - public function testFormButtonRendersButtonXhtml() - { - $button = $this->helper->formButton('foo', 'bar'); - $this->assertRegexp('/]*?value="bar"/', $button); - $this->assertRegexp('/]*?name="foo"/', $button); - $this->assertRegexp('/]*?id="foo"/', $button); - $this->assertContains('', $button); - } - - public function testCanPassContentViaContentAttribKey() - { - $button = $this->helper->formButton('foo', 'bar', array('content' => 'Display this')); - $this->assertContains('>Display this<', $button); - $this->assertContains('assertContains('', $button); - } - - public function testCanDisableContentEscaping() - { - $button = $this->helper->formButton('foo', 'bar', array('content' => 'Display this', 'escape' => false)); - $this->assertContains('>Display this<', $button); - - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'attribs' => array('content' => 'Display this', 'escape' => false))); - $this->assertContains('>Display this<', $button); - - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'escape' => false, 'attribs' => array('content' => 'Display this'))); - $this->assertContains('>Display this<', $button); - $this->assertContains('assertContains('', $button); - } - - public function testValueUsedForContentWhenNoContentProvided() - { - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar')); - $this->assertRegexp('#]*?value="bar"[^>]*>bar#', $button); - } - - public function testButtonTypeIsButtonByDefault() - { - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar')); - $this->assertContains('type="button"', $button); - } - - public function testButtonTypeMayOnlyBeValidXhtmlButtonType() - { - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'attribs' => array('type' => 'submit'))); - $this->assertContains('type="submit"', $button); - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'attribs' => array('type' => 'reset'))); - $this->assertContains('type="reset"', $button); - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'attribs' => array('type' => 'button'))); - $this->assertContains('type="button"', $button); - $button = $this->helper->formButton(array('name' => 'foo', 'value' => 'bar', 'attribs' => array('type' => 'bogus'))); - $this->assertContains('type="button"', $button); - } -} - -// Call Zend_View_Helper_FormButtonTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormButtonTest::main") { - Zend_View_Helper_FormButtonTest::main(); -} diff --git a/tests/Zend/View/Helper/FormCheckboxTest.php b/tests/Zend/View/Helper/FormCheckboxTest.php deleted file mode 100644 index b762870abb..0000000000 --- a/tests/Zend/View/Helper/FormCheckboxTest.php +++ /dev/null @@ -1,351 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormCheckbox(); - $this->helper->setView($this->view); - } - - public function testIdSetFromName() - { - $element = $this->helper->formCheckbox('foo'); - $this->assertContains('name="foo"', $element); - $this->assertContains('id="foo"', $element); - } - - public function testSetIdFromAttribs() - { - $element = $this->helper->formCheckbox('foo', null, array('id' => 'bar')); - $this->assertContains('name="foo"', $element); - $this->assertContains('id="bar"', $element); - } - - /** - * ZF-2513 - */ - public function testCanDisableCheckbox() - { - $html = $this->helper->formCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'attribs'=> array('disable' => true) - )); - $this->assertRegexp('/]*?(disabled="disabled")/', $html); - } - - /** - * ZF-3505 - */ - public function testCheckboxNotDisabled() - { - $html = $this->helper->formCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'attribs'=> array('disable' => false) - )); - $this->assertNotContains('disabled="disabled"', $html); - } - - public function testCanSelectCheckbox() - { - $html = $this->helper->formCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'attribs'=> array('checked' => true) - )); - $this->assertRegexp('/]*?(checked="checked")/', $html); - $count = substr_count($html, 'checked'); - $this->assertEquals(2, $count); - } - - /** - * ZF-1955 - */ - public function testNameBracketsStrippedWhenCreatingId() - { - $html = $this->helper->formCheckbox(array( - 'name' => 'foo[]', - 'value' => 'bar' - )); - $this->assertRegexp('/]*?(id="foo")/', $html); - - $html = $this->helper->formCheckbox(array( - 'name' => 'foo[bar]', - 'value' => 'bar' - )); - $this->assertRegexp('/]*?(id="foo-bar")/', $html); - - $html = $this->helper->formCheckbox(array( - 'name' => 'foo[bar][baz]', - 'value' => 'bar' - )); - $this->assertRegexp('/]*?(id="foo-bar-baz")/', $html); - } - - /** - * @group ZF-2230 - */ - public function testDoesNotRenderHiddenElementsForCheckboxArray() - { - $html = $this->helper->formCheckbox(array( - 'name' => 'foo[]', - 'value' => 'bar' - )); - $this->assertNotRegexp('/]*?(type="hidden")/', $html); - } - - /** - * @group ZF-3149 - */ - public function testShouldRenderHiddenElementShowingUncheckedOptionForNonArrayNames() - { - $html1 = $this->helper->formCheckbox( - 'foo', - 'bar', - array('checked' => true), - array( - 'checked' => 'bar', - 'unChecked' => 'baz' - ) - ); - $html2 = $this->helper->formCheckbox( - 'foo', - 'bar', - array('checked' => true), - array( - 'bar', - 'baz' - ) - ); - $html3 = $this->helper->formCheckbox( - 'foo', - 'bar', - array('checked' => false), - array( - 'checked' => 'bar', - 'unChecked' => 'baz' - ) - ); - $html4 = $this->helper->formCheckbox( - 'foo', - 'bar', - array('checked' => false), - array( - 'bar', - 'baz' - ) - ); - foreach (array('html1', 'html2', 'html3', 'html4') as $html) { - if (!preg_match_all('/(]+>)/', $$html, $matches)) { - $this->fail('Unexpected output generated by helper'); - } - $this->assertEquals(2, count($matches[1])); - foreach ($matches[1] as $element) { - if (strstr($element, 'hidden')) { - $this->assertContains('baz', $element, 'Failed using ' . $html); - } else { - $this->assertContains('bar', $element, 'Failed using ' . $html); - $this->assertContains('checked', $element, 'Failed using ' . $html); - } - } - } - } - - /** - * @group ZF-3149 - */ - public function testCheckedAttributeNotRenderedIfItEvaluatesToFalse() - { - $test = $this->helper->formCheckbox('foo', 'value', array('checked' => false)); - $this->assertNotContains('checked', $test); - } - - public function testCanSpecifyValue() - { - $test = $this->helper->formCheckbox('foo', 'bar'); - $this->assertContains('value="bar"', $test); - } - - /** - * @group ZF-3149 - */ - public function testShouldCheckValueIfValueMatchesCheckedOption() - { - $test = $this->helper->formCheckbox('foo', 'bar', array(), array('bar', 'baz')); - $this->assertContains('value="bar"', $test); - $this->assertContains('checked', $test); - - $test = $this->helper->formCheckbox('foo', 'bar', array(), array('checked' => 'bar', 'unChecked' => 'baz')); - $this->assertContains('value="bar"', $test); - $this->assertContains('checked', $test); - } - - /** - * @group ZF-3149 - */ - public function testShouldOnlySetValueIfValueMatchesCheckedOption() - { - $test = $this->helper->formCheckbox('foo', 'baz', array(), array('bar', 'baz')); - $this->assertContains('value="bar"', $test); - } - - /** - * @group ZF-3149 - */ - public function testShouldNotCheckValueIfValueDoesNotMatchCheckedOption() - { - $test = $this->helper->formCheckbox('foo', 'baz', array(), array('bar', 'baz')); - $this->assertContains('value="bar"', $test); - $this->assertNotContains('checked', $test); - } - - public function testRendersAsHtmlByDefault() - { - $test = $this->helper->formCheckbox('foo', 'bar'); - $this->assertNotContains(' />', $test, $test); - } - - public function testCanRendersAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $test = $this->helper->formCheckbox('foo', 'bar'); - $this->assertContains(' />', $test); - } - - /** - * @group ZF-6467 - */ - public function testShouldNotShowHiddenFieldIfDisableIsTrue() - { - $test = $this->helper->formCheckbox('foo', 'bar', array('disable' => true)); - $this->assertNotContains('type="hidden"', $test); - } - - public function testIntValueIsChecked() - { - $test = $this->helper->formCheckbox('foo', '1', array(), array('checked'=>1, 'unchecked'=>0)); - $this->assertContains('checked="checked"', $test); - - $test = $this->helper->formCheckbox('foo', '1', array(), array(1,0)); - $this->assertContains('checked="checked"', $test); - - $test = $this->helper->formCheckbox('foo', 1, array(), array('checked'=>1, 'unchecked'=>0)); - $this->assertContains('checked="checked"', $test); - - $test = $this->helper->formCheckbox('foo', 1, array(), array(1,0)); - $this->assertContains('checked="checked"', $test); - - $test = $this->helper->formCheckbox('foo', 0, array(), array('checked'=>1, 'unchecked'=>0)); - $this->assertNotContains('checked="checked"', $test); - - $test = $this->helper->formCheckbox('foo', 0, array(), array(1,0)); - $this->assertNotContains('checked="checked"', $test); - } - - /** - * @group ZF-6624 - */ - public function testRenderingWithoutHiddenElement() - { - $html = $this->helper->formCheckbox( - 'foo', - 'bar', - array( - 'disableHidden' => true, - ) - ); - $this->assertSame( - '', - $html - ); - - $html = $this->helper->formCheckbox( - 'foo', - 'bar'); - - $this->assertSame( - '', - $html - ); - - $html = $this->helper->formCheckbox( - 'foo', - 'bar', - array( - 'disableHidden' => false, - ) - ); - - $this->assertSame( - '', - $html - ); - } -} - -// Call Zend_View_Helper_FormCheckboxTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormCheckboxTest::main") { - Zend_View_Helper_FormCheckboxTest::main(); -} - diff --git a/tests/Zend/View/Helper/FormErrorsTest.php b/tests/Zend/View/Helper/FormErrorsTest.php deleted file mode 100644 index 1ec64f26fb..0000000000 --- a/tests/Zend/View/Helper/FormErrorsTest.php +++ /dev/null @@ -1,198 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormErrors(); - $this->helper->setView($this->view); - ob_start(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - ob_end_clean(); - } - - public function testGetElementEndReturnsDefaultValue() - { - $this->assertEquals('', $this->helper->getElementEnd()); - } - - public function testGetElementSeparatorReturnsDefaultValue() - { - $this->assertEquals('
  • ', $this->helper->getElementSeparator()); - } - - public function testGetElementStartReturnsDefaultValue() - { - $this->assertEquals('
  • ', $this->helper->getElementStart()); - } - - public function testCanSetElementEndString() - { - $this->testGetElementEndReturnsDefaultValue(); - $this->helper->setElementEnd(''); - $this->assertEquals('', $this->helper->getElementEnd()); - } - - public function testCanSetElementSeparatorString() - { - $this->testGetElementSeparatorReturnsDefaultValue(); - $this->helper->setElementSeparator('
    '); - $this->assertEquals('
    ', $this->helper->getElementSeparator()); - } - - public function testCanSetElementStartString() - { - $this->testGetElementStartReturnsDefaultValue(); - $this->helper->setElementStart('
    ');
    -        $this->assertEquals('
    ', $this->helper->getElementStart());
    -    }
    -
    -    public function testFormErrorsRendersUnorderedListByDefault()
    -    {
    -        $errors = array('foo', 'bar', 'baz');
    -        $html = $this->helper->formErrors($errors);
    -        $this->assertContains('assertContains('
  • ' . $error . '
  • ', $html); - } - $this->assertContains('', $html); - } - - public function testFormErrorsRendersWithSpecifiedStrings() - { - $this->helper->setElementStart('
    ') - ->setElementSeparator('
    ') - ->setElementEnd('
    '); - $errors = array('foo', 'bar', 'baz'); - $html = $this->helper->formErrors($errors); - $this->assertContains('
    ', $html); - foreach ($errors as $error) { - $this->assertContains('
    ' . $error . '
    ', $html); - } - $this->assertContains('
    ', $html); - } - - public function testFormErrorsPreventsXssAttacks() - { - $errors = array( - 'bad' => '\">', - ); - $html = $this->helper->formErrors($errors); - $this->assertNotContains($errors['bad'], $html); - $this->assertContains('&', $html); - } - - public function testCanDisableEscapingErrorMessages() - { - $errors = array( - 'foo' => 'Field is required', - 'bar' => 'Please click here for more information' - ); - $html = $this->helper->formErrors($errors, array('escape' => false)); - $this->assertContains($errors['foo'], $html); - $this->assertContains($errors['bar'], $html); - } - - /** - * @group ZF-3477 - * @link http://framework.zend.com/issues/browse/ZF-3477 - */ - public function testCanSetClassAttribute() - { - $options = array('class' => 'custom-class'); - $actualHtml = $this->helper->formErrors(array(), $options); - $this->assertEquals( - '
    ', - $actualHtml - ); - } - - /** - * @group ZF-5962 - */ - public function testCanSetElementStringsPerOptions() - { - $actual = $this->helper->formErrors( - array('foo', 'bar', 'baz'), - array( - 'elementStart' => '

    ', - 'elementEnd' => '

    ', - 'elementSeparator' => '
    ', - ) - ); - - $this->assertEquals('

    foo
    bar
    baz

    ', $actual); - } -} - -// Call Zend_View_Helper_FormErrorsTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormErrorsTest::main") { - Zend_View_Helper_FormErrorsTest::main(); -} diff --git a/tests/Zend/View/Helper/FormFileTest.php b/tests/Zend/View/Helper/FormFileTest.php deleted file mode 100644 index d937656f30..0000000000 --- a/tests/Zend/View/Helper/FormFileTest.php +++ /dev/null @@ -1,152 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormFile(); - $this->helper->setView($this->view); - } - - /** - * ZF-1666 - */ - public function testCanDisableElement() - { - $html = $this->helper->formFile(array( - 'name' => 'foo', - 'attribs' => array('disable' => true) - )); - - $this->assertRegexp('/]*?(disabled="disabled")/', $html); - } - - /** - * ZF-1666 - */ - public function testDisablingElementDoesNotRenderHiddenElements() - { - $html = $this->helper->formFile(array( - 'name' => 'foo', - 'attribs' => array('disable' => true) - )); - - $this->assertNotRegexp('/]*?(type="hidden")/', $html); - } - - - public function testRendersAsHtmlByDefault() - { - $test = $this->helper->formFile(array( - 'name' => 'foo', - )); - $this->assertNotContains(' />', $test); - } - - public function testCanRendersAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $test = $this->helper->formFile(array( - 'name' => 'foo', - )); - $this->assertContains(' />', $test); - } - - /** - * @group GH-191 - */ - public function testRendersCustomAttributes() - { - $test = $this->helper->formFile( - 'foo', - array( - 'data-image-old' => 100, - 'data-image-new' => 200, - ) - ); - $this->assertEquals( - '', - $test - ); - } -} - -// Call Zend_View_Helper_FormFileTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormFileTest::main") { - Zend_View_Helper_FormFileTest::main(); -} diff --git a/tests/Zend/View/Helper/FormImageTest.php b/tests/Zend/View/Helper/FormImageTest.php deleted file mode 100644 index ea9c503b6e..0000000000 --- a/tests/Zend/View/Helper/FormImageTest.php +++ /dev/null @@ -1,125 +0,0 @@ -view = new Zend_View(); - $this->view->doctype('HTML4_LOOSE'); // Reset doctype to default - - $this->helper = new Zend_View_Helper_FormImage(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @access protected - */ - protected function tearDown() - { - } - - public function testFormImageRendersFormImageXhtml() - { - $button = $this->helper->formImage('foo', 'bar'); - $this->assertRegexp('/]*?src="bar"/', $button); - $this->assertRegexp('/]*?name="foo"/', $button); - $this->assertRegexp('/]*?type="image"/', $button); - } - - public function testDisablingFormImageRendersImageInputWithDisableAttribute() - { - $button = $this->helper->formImage('foo', 'bar', array('disable' => true)); - $this->assertRegexp('/]*?disabled="disabled"/', $button); - $this->assertRegexp('/]*?src="bar"/', $button); - $this->assertRegexp('/]*?name="foo"/', $button); - $this->assertRegexp('/]*?type="image"/', $button); - } - - /** - * @group ZF-11477 - */ - public function testRendersAsHtmlByDefault() - { - $test = $this->helper->formImage(array( - 'name' => 'foo', - )); - $this->assertNotContains(' />', $test); - } - - /** - * @group ZF-11477 - */ - public function testCanRendersAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $test = $this->helper->formImage(array( - 'name' => 'foo', - )); - $this->assertContains(' />', $test); - } -} - -// Call Zend_View_Helper_FormImageTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormImageTest::main") { - Zend_View_Helper_FormImageTest::main(); -} diff --git a/tests/Zend/View/Helper/FormLabelTest.php b/tests/Zend/View/Helper/FormLabelTest.php deleted file mode 100644 index cba07313be..0000000000 --- a/tests/Zend/View/Helper/FormLabelTest.php +++ /dev/null @@ -1,148 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormLabel(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @access protected - */ - protected function tearDown() - { - } - - public function testFormLabelWithSaneInput() - { - $label = $this->helper->formLabel('foo', 'bar'); - $this->assertEquals('', $label); - } - - public function testFormLabelWithInputNeedingEscapesUsesViewEscaping() - { - $label = $this->helper->formLabel('<&foo', ''); - $expected = ''; - $this->assertEquals($expected, $label); - } - - public function testViewIsSetAndSameAsCallingViewObject() - { - $this->assertTrue(isset($this->helper->view)); - $this->assertTrue($this->helper->view instanceof Zend_View_Interface); - $this->assertSame($this->view, $this->helper->view); - } - - public function testAttribsAreSet() - { - $label = $this->helper->formLabel('foo', 'bar', array('class' => 'baz')); - $this->assertEquals('', $label); - } - - public function testNameAndIdForZF2154() - { - $label = $this->helper->formLabel('name', 'value', array('id' => 'id')); - $this->assertEquals('', $label); - } - - /** - * @group ZF-2473 - */ - public function testCanDisableEscapingLabelValue() - { - $label = $this->helper->formLabel('foo', 'Label This!', array('escape' => false)); - $this->assertContains('Label This!', $label); - $label = $this->helper->formLabel(array('name' => 'foo', 'value' => 'Label This!', 'escape' => false)); - $this->assertContains('Label This!', $label); - $label = $this->helper->formLabel(array('name' => 'foo', 'value' => 'Label This!', 'attribs' => array('escape' => false))); - $this->assertContains('Label This!', $label); - } - - /** - * @group ZF-6426 - */ - public function testHelperShouldAllowSuppressionOfForAttribute() - { - $label = $this->helper->formLabel('foo', 'bar', array('disableFor' => true)); - $this->assertNotContains('for="foo"', $label); - } - - /** - * @group ZF-8265 - */ - public function testShouldNotRenderDisableForAttributeIfForIsSuppressed() - { - $label = $this->helper->formLabel('foo', 'bar', array('disableFor' => true)); - $this->assertNotContains('disableFor=', $label, 'Output contains disableFor attribute!'); - } -} - -// Call Zend_View_Helper_FormLabelTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormLabelTest::main") { - Zend_View_Helper_FormLabelTest::main(); -} diff --git a/tests/Zend/View/Helper/FormMultiCheckboxTest.php b/tests/Zend/View/Helper/FormMultiCheckboxTest.php deleted file mode 100644 index 68631a6480..0000000000 --- a/tests/Zend/View/Helper/FormMultiCheckboxTest.php +++ /dev/null @@ -1,156 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormMultiCheckbox(); - $this->helper->setView($this->view); - ob_start(); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - ob_end_clean(); - } - - public function testMultiCheckboxHelperRendersLabelledCheckboxesForEachOption() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formMultiCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - foreach ($options as $key => $value) { - $pattern = '#((]*>.*?)(]*?("' . $key . '").*?>)(.*?))#'; - if (!preg_match($pattern, $html, $matches)) { - $this->fail('Failed to match ' . $pattern . ': ' . $html); - } - $this->assertContains($value, $matches[5], var_export($matches, 1)); - $this->assertContains('type="checkbox"', $matches[3], var_export($matches, 1)); - $this->assertContains('name="foo[]"', $matches[3], var_export($matches, 1)); - $this->assertContains('value="' . $key . '"', $matches[3], var_export($matches, 1)); - } - } - - public function testRendersAsHtmlByDefault() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formMultiCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - foreach ($options as $key => $value) { - $pattern = '#(]*?("' . $key . '").*?>)#'; - if (!preg_match($pattern, $html, $matches)) { - $this->fail('Failed to match ' . $pattern . ': ' . $html); - } - $this->assertNotContains(' />', $matches[1]); - } - } - - public function testCanRendersAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formMultiCheckbox(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - foreach ($options as $key => $value) { - $pattern = '#(]*?("' . $key . '").*?>)#'; - if (!preg_match($pattern, $html, $matches)) { - $this->fail('Failed to match ' . $pattern . ': ' . $html); - } - $this->assertContains(' />', $matches[1]); - } - } -} - -// Call Zend_View_Helper_FormMultiCheckboxTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormMultiCheckboxTest::main") { - Zend_View_Helper_FormMultiCheckboxTest::main(); -} diff --git a/tests/Zend/View/Helper/FormPasswordTest.php b/tests/Zend/View/Helper/FormPasswordTest.php deleted file mode 100644 index 1197087d4f..0000000000 --- a/tests/Zend/View/Helper/FormPasswordTest.php +++ /dev/null @@ -1,147 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormPassword(); - $this->helper->setView($this->view); - } - - /** - * @group ZF-1666 - */ - public function testCanDisableElement() - { - $html = $this->helper->formPassword(array( - 'name' => 'foo', - 'value' => 'bar', - 'attribs' => array('disable' => true) - )); - - $this->assertRegexp('/]*?(disabled="disabled")/', $html); - } - - /** - * @group ZF-1666 - */ - public function testDisablingElementDoesNotRenderHiddenElements() - { - $html = $this->helper->formPassword(array( - 'name' => 'foo', - 'value' => 'bar', - 'attribs' => array('disable' => true) - )); - - $this->assertNotRegexp('/]*?(type="hidden")/', $html); - } - - public function testShouldRenderAsHtmlByDefault() - { - $test = $this->helper->formPassword('foo', 'bar'); - $this->assertNotContains(' />', $test); - } - - public function testShouldAllowRenderingAsXhtml() - { - $this->view->doctype('XHTML1_STRICT'); - $test = $this->helper->formPassword('foo', 'bar'); - $this->assertContains(' />', $test); - } - - public function testShouldNotRenderValueByDefault() - { - $test = $this->helper->formPassword('foo', 'bar'); - $this->assertNotContains('bar', $test); - } - - /** - * @group ZF-2860 - */ - public function testShouldRenderValueWhenRenderPasswordFlagPresentAndTrue() - { - $test = $this->helper->formPassword('foo', 'bar', array('renderPassword' => true)); - $this->assertContains('value="bar"', $test); - } - - /** - * @group ZF-2860 - */ - public function testRenderPasswordAttribShouldNeverBeRendered() - { - $test = $this->helper->formPassword('foo', 'bar', array('renderPassword' => true)); - $this->assertNotContains('renderPassword', $test); - $test = $this->helper->formPassword('foo', 'bar', array('renderPassword' => false)); - $this->assertNotContains('renderPassword', $test); - } -} - -// Call Zend_View_Helper_FormPasswordTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormPasswordTest::main") { - Zend_View_Helper_FormPasswordTest::main(); -} diff --git a/tests/Zend/View/Helper/FormRadioTest.php b/tests/Zend/View/Helper/FormRadioTest.php deleted file mode 100644 index 9ce69f7ee7..0000000000 --- a/tests/Zend/View/Helper/FormRadioTest.php +++ /dev/null @@ -1,523 +0,0 @@ -view = new Zend_View(); - $this->view->doctype('HTML4_LOOSE'); // Set default doctype - $this->helper = new Zend_View_Helper_FormRadio(); - $this->helper->setView($this->view); - } - - public function testRendersRadioLabelsWhenRenderingMultipleOptions() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - foreach ($options as $key => $value) { - $this->assertRegexp('#.*?' . $value . '.*?#', $html, $html); - $this->assertRegexp('#.*?#', $html, $html); - } - } - - public function testCanSpecifyRadioLabelPlacement() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('labelPlacement' => 'append') - )); - foreach ($options as $key => $value) { - $this->assertRegexp('#.*?#', $html, $html); - } - - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('labelPlacement' => 'prepend') - )); - foreach ($options as $key => $value) { - $this->assertRegexp('#' . $value . '#', $html, $html); - } - } - - /** - * @group ZF-3206 - */ - public function testSpecifyingLabelPlacementShouldNotOverwriteValue() - { - $options = array( - 'bar' => 'Bar', - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array( - 'labelPlacement' => 'append', - ) - )); - $this->assertRegexp('#]*(checked="checked")#', $html, $html); - } - - public function testCanSpecifyRadioLabelAttribs() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('labelClass' => 'testclass', 'label_id' => 'testid') - )); - - foreach ($options as $key => $value) { - $this->assertRegexp('#]*?class="testclass"[^>]*>.*?' . $value . '#', $html, $html); - $this->assertRegexp('#]*?id="testid"[^>]*>.*?' . $value . '#', $html, $html); - } - } - - public function testCanSpecifyRadioSeparator() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'listsep' => '--FunkySep--', - )); - - $this->assertContains('--FunkySep--', $html); - $count = substr_count($html, '--FunkySep--'); - $this->assertEquals(2, $count); - } - - /** - * ZF-2513 - */ - public function testCanDisableAllRadios() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('disable' => true) - )); - - $this->assertRegexp('/]*?(disabled="disabled")/', $html, $html); - $count = substr_count($html, 'disabled="disabled"'); - $this->assertEquals(3, $count); - } - - /** - * ZF-2513 - */ - public function testCanDisableIndividualRadios() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('disable' => array('bar')) - )); - - $this->assertRegexp('/]*?(value="bar")[^>]*(disabled="disabled")/', $html, $html); - $count = substr_count($html, 'disabled="disabled"'); - $this->assertEquals(1, $count); - } - - /** - * ZF-2513 - */ - public function testCanDisableMultipleRadios() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - 'attribs' => array('disable' => array('foo', 'baz')) - )); - - foreach (array('foo', 'baz') as $test) { - $this->assertRegexp('/]*?(value="' . $test . '")[^>]*?(disabled="disabled")/', $html, $html); - } - $this->assertNotRegexp('/]*?(value="bar")[^>]*?(disabled="disabled")/', $html, $html); - $count = substr_count($html, 'disabled="disabled"'); - $this->assertEquals(2, $count); - } - - public function testLabelsAreEscapedByDefault() - { - $options = array( - 'bar' => 'Bar', - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'options' => $options, - )); - - $this->assertNotContains($options['bar'], $html); - $this->assertContains('<b>Bar</b>', $html); - } - - public function testXhtmlLabelsAreAllowed() - { - $options = array( - 'bar' => 'Bar', - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'options' => $options, - 'attribs' => array('escape' => false) - )); - - $this->assertContains($options['bar'], $html); - } - - /** - * ZF-1666 - */ - public function testDoesNotRenderHiddenElements() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'options' => $options, - )); - - $this->assertNotRegexp('/]*?(type="hidden")/', $html); - } - - public function testSpecifyingAValueThatMatchesAnOptionChecksIt() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - - if (!preg_match('/(]*?(value="bar")[^>]*>)/', $html, $matches)) { - $this->fail('Radio for a given option was not found?'); - } - $this->assertContains('checked="checked"', $matches[1], var_export($matches, 1)); - } - - public function testOptionsWithMatchesInAnArrayOfValuesAreChecked() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => array('foo', 'baz'), - 'options' => $options, - )); - - foreach (array('foo', 'baz') as $value) { - if (!preg_match('/(]*?(value="' . $value . '")[^>]*>)/', $html, $matches)) { - $this->fail('Radio for a given option was not found?'); - } - $this->assertContains('checked="checked"', $matches[1], var_export($matches, 1)); - } - } - - public function testEachRadioShouldHaveIdCreatedByAppendingFilteredValue() - { - $options = array( - 'foo bar' => 'Foo', - 'bar baz' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo[]', - 'value' => 'bar', - 'options' => $options, - )); - - require_once 'Zend/Filter/Alnum.php'; - $filter = new Zend_Filter_Alnum(); - foreach ($options as $key => $value) { - $id = 'foo-' . $filter->filter($key); - $this->assertRegexp('/]*)(id="' . $id . '")/', $html); - } - } - - public function testEachRadioShouldUseAttributeIdWhenSpecified() - { - $options = array( - 'foo bar' => 'Foo', - 'bar baz' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo[bar]', - 'value' => 'bar', - 'attribs' => array('id' => 'foo-bar'), - 'options' => $options, - )); - - require_once 'Zend/Filter/Alnum.php'; - $filter = new Zend_Filter_Alnum(); - foreach ($options as $key => $value) { - $id = 'foo-bar-' . $filter->filter($key); - $this->assertRegexp('/]*)(id="' . $id . '")/', $html); - } - } - - /** - * @group ZF-5681 - */ - public function testRadioLabelDoesNotContainHardCodedStyle() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - $this->assertNotContains('style="white-space: nowrap;"', $html); - } - - /** - * @group ZF-8709 - */ - public function testRadioLabelContainsNotForAttributeTag() - { - $actual = $this->helper->formRadio( - array( - 'name' => 'foo', - 'options' => array( - 'bar' => 'Bar', - 'baz' => 'Baz' - ), - ) - ); - - $expected = '
    ' - . "\n" - . ''; - - $this->assertSame($expected, $actual); - } - - /** - * @group ZF-4191 - */ - public function testDashesShouldNotBeFilteredFromId() - { - $name = "Foo"; - $options = array( - -1 => 'Test -1', - 0 => 'Test 0', - 1 => 'Test 1' - ); - - $formRadio = new Zend_View_Helper_FormRadio(); - $formRadio->setView(new Zend_View()); - $html = $formRadio->formRadio($name, -1, null, $options); - foreach ( $options as $key=>$value ) { - $fid = "{$name}-{$key}"; - $this->assertRegExp('/]*)(id="'.$fid.'")/', $html); - } - - // Assert that radio for value -1 is the selected one - $this->assertRegExp('/]*)(id="'.$name.'--1")([^>]*)(checked="checked")/', $html); - } - - /** - * @group ZF-11477 - */ - public function testRendersAsHtmlByDefault() - { - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'options' => $options, - )); - - $this->assertContains('value="foo">', $html); - $this->assertContains('value="bar">', $html); - $this->assertContains('value="baz">', $html); - } - - /** - * @group ZF-11477 - */ - public function testCanRendersAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'options' => $options, - )); - $this->assertContains('value="foo" />', $html); - $this->assertContains('value="bar" />', $html); - $this->assertContains('value="baz" />', $html); - } - - /** - * @group ZF-11620 - */ - public function testSeparatorCanRendersAsXhtmlByDefault() - { - $this->view->doctype('XHTML1_STRICT'); - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - - $this->assertContains('
    ', $html); - $count = substr_count($html, '
    '); - $this->assertEquals(2, $count); - } - - /** - * @group ZF-11620 - */ - public function testeparatorCanRendersAsHtml() - { - $this->view->doctype('HTML4_STRICT'); - $options = array( - 'foo' => 'Foo', - 'bar' => 'Bar', - 'baz' => 'Baz' - ); - $html = $this->helper->formRadio(array( - 'name' => 'foo', - 'value' => 'bar', - 'options' => $options, - )); - - $this->assertContains('
    ', $html); - $count = substr_count($html, '
    '); - $this->assertEquals(2, $count); - } - -} - -// Call Zend_View_Helper_FormRadioTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormRadioTest::main") { - Zend_View_Helper_FormRadioTest::main(); -} - diff --git a/tests/Zend/View/Helper/FormResetTest.php b/tests/Zend/View/Helper/FormResetTest.php deleted file mode 100644 index ad2208612a..0000000000 --- a/tests/Zend/View/Helper/FormResetTest.php +++ /dev/null @@ -1,123 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormReset(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper, $this->view); - } - - public function testShouldRenderResetInput() - { - $html = $this->helper->formReset(array( - 'name' => 'foo', - 'value' => 'Reset', - )); - $this->assertRegexp('/]*?(type="reset")/', $html); - } - - /** - * @group ZF-2845 - */ - public function testShouldAllowDisabling() - { - $html = $this->helper->formReset(array( - 'name' => 'foo', - 'value' => 'Reset', - 'attribs' => array('disable' => true) - )); - $this->assertRegexp('/]*?(disabled="disabled")/', $html); - } - - public function testShouldRenderAsHtmlByDefault() - { - $test = $this->helper->formReset('foo', 'bar'); - $this->assertNotContains(' />', $test); - } - - public function testShouldAllowRenderingAsXHtml() - { - $this->view->doctype('XHTML1_STRICT'); - $test = $this->helper->formReset('foo', 'bar'); - $this->assertContains(' />', $test); - } -} - -// Call Zend_View_Helper_FormResetTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_View_Helper_FormResetTest::main") { - Zend_View_Helper_FormResetTest::main(); -} diff --git a/tests/Zend/View/Helper/FormSelectTest.php b/tests/Zend/View/Helper/FormSelectTest.php deleted file mode 100644 index 7b32134321..0000000000 --- a/tests/Zend/View/Helper/FormSelectTest.php +++ /dev/null @@ -1,384 +0,0 @@ -view = new Zend_View(); - $this->helper = new Zend_View_Helper_FormSelect(); - $this->helper->setView($this->view); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->helper, $this->view); - } - - /** - * @group ZF-10661 - */ - public function testRenderingWithOptions() - { - $html = $this->helper->formSelect( - 'foo', - null, - null, - array( - 'bar' => 'Bar', - 'baz' => 'Baz', - ) - ); - - $expected = ''; - - $this->assertSame($expected, $html); - } - - public function testFormSelectWithNameOnlyCreatesEmptySelect() - { - $html = $this->helper->formSelect('foo'); - $this->assertRegExp('#]+name="foo"#', $html); - $this->assertContains('', $html); - $this->assertNotContains('helper->formSelect('foo', null, null, array('foo' => 'Foobar', 'baz' => 'Bazbat')); - $this->assertRegExp('#]+name="foo"#', $html); - $this->assertContains('', $html); - $this->assertRegExp('#]+value="foo".*?>Foobar#', $html); - $this->assertRegExp('#]+value="baz".*?>Bazbat#', $html); - $this->assertEquals(2, substr_count($html, 'helper->formSelect('foo', 'baz', null, array('foo' => 'Foobar', 'baz' => 'Bazbat')); - $this->assertRegExp('#]+value="baz"[^>]*selected.*?>Bazbat#', $html); - } - - public function testFormSelectWithMultipleAttributeCreatesMultiSelect() - { - $html = $this->helper->formSelect('foo', null, array('multiple' => true), array('foo' => 'Foobar', 'baz' => 'Bazbat')); - $this->assertRegExp('#]+name="foo\[\]"#', $html); - $this->assertRegExp('#]+multiple="multiple"#', $html); - } - - public function testFormSelectWithMultipleAttributeAndValuesCreatesMultiSelectWithSelectedValues() - { - $html = $this->helper->formSelect('foo', array('foo', 'baz'), array('multiple' => true), array('foo' => 'Foobar', 'baz' => 'Bazbat')); - $this->assertRegExp('#]+value="foo"[^>]*selected.*?>Foobar#', $html); - $this->assertRegExp('#]+value="baz"[^>]*selected.*?>Bazbat#', $html); - } - - /** - * ZF-1930 - * @return void - */ - public function testFormSelectWithZeroValueSelectsValue() - { - $html = $this->helper->formSelect('foo', 0, null, array('foo' => 'Foobar', 0 => 'Bazbat')); - $this->assertRegExp('#]+value="0"[^>]*selected.*?>Bazbat#', $html); - } - - /** - * ZF-2513 - */ - public function testCanDisableEntireSelect() - { - $html = $this->helper->formSelect(array( - 'name' => 'baz', - 'options' => array( - 'foo' => 'Foo', - 'bar' => 'Bar' - ), - 'attribs' => array( - 'disable' => true - ), - )); - $this->assertRegexp('/]*?disabled/', $html, $html); - $this->assertNotRegexp('/]*?disabled="disabled"/', $html, $html); - } - - /** - * ZF-2513 - */ - public function testCanDisableIndividualSelectOptionsOnly() - { - $html = $this->helper->formSelect(array( - 'name' => 'baz', - 'options' => array( - 'foo' => 'Foo', - 'bar' => 'Bar' - ), - 'attribs' => array( - 'disable' => array('bar') - ), - )); - $this->assertNotRegexp('/]*?disabled/', $html, $html); - $this->assertRegexp('/
  • ' . Zend_View_Helper_HtmlList::EOL . '
  • two', $list); - } - - /* - * @group ZF-5018 - */ - public function testMakeNestedDeepUnorderedList() - { - $items = array('one', array('four', array('six', 'seven', 'eight'), 'five'), 'two', 'three'); - - $list = $this->helper->htmlList($items); - - $this->assertContains('
      ' . Zend_View_Helper_HtmlList::EOL, $list); - $this->assertContains('
    ' . Zend_View_Helper_HtmlList::EOL, $list); - $this->assertContains('one
  • \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - case 'setUserAdmin': - if ($_POST['mode'] == 'issue') { - startHTML(); - giveUserAdminRights($gapps, true, $_POST['user']); - endHTML(true); - } elseif ($_POST['mode'] == 'revoke') { - startHTML(); - revokeUserAdminRights($gapps, true, $_POST['user']); - endHTML(true); - } else { - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

    Invalid mode.

    \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - case 'setForceChangePassword': - if ($_POST['mode'] == 'set') { - startHTML(); - setUserMustChangePassword($gapps, true, $_POST['user']); - endHTML(true); - } elseif ($_POST['mode'] == 'clear') { - startHTML(); - clearUserMustChangePassword($gapps, true, $_POST['user']); - endHTML(true); - } else { - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

    Invalid mode.

    \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - case 'deleteUser': - startHTML(); - deleteUser($gapps, true, $_POST['user']); - endHTML(true); - case 'createNickname': - startHTML(); - createNickname($gapps, true, $_POST['user'], - $_POST['nickname']); - endHTML(true); - case 'deleteNickname': - startHTML(); - deleteNickname($gapps, true, $_POST['nickname']); - endHTML(true); - case 'createEmailList': - startHTML(); - createEmailList($gapps, true, $_POST['emailList']); - endHTML(true); - case 'deleteEmailList': - startHTML(); - deleteEmailList($gapps, true, $_POST['emailList']); - endHTML(true); - case 'modifySubscription': - if ($_POST['mode'] == 'subscribe') { - startHTML(); - addRecipientToEmailList($gapps, true, $_POST['recipient'], - $_POST['emailList']); - endHTML(true); - } elseif ($_POST['mode'] == 'unsubscribe') { - startHTML(); - removeRecipientFromEmailList($gapps, true, - $_POST['recipient'], $_POST['emailList']); - endHTML(true); - } else { - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

    Invalid mode.

    \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - } - } - - // Check for an invalid command. If so, display an error and exit. - if (!empty($_REQUEST['command'])) { - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

    Invalid command.

    \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - - // If a menu parameter is available, display a submenu. - if (!empty($_REQUEST['menu'])) { - switch ($_REQUEST['menu']) { - case 'user': - startHTML(); - displayUserMenu(); - endHTML(); - case 'nickname': - startHTML(); - displayNicknameMenu(); - endHTML(); - case 'emailList': - startHTML(); - displayEmailListMenu(); - endHTML(); - case 'logout': - startHTML(false); - logout(); - endHTML(); - default: - header('HTTP/1.1 400 Bad Request'); - startHTML(); - echo "

    Invalid menu selection.

    \n"; - echo "

    Please check your request and try again.

    "; - endHTML(true); - } - } - - // If we get this far, that means there's nothing to do. Display - // the main menu. - // If no command was issued and no menu was selected, display the - // main menu. - startHTML(); - displayMenu(); - endHTML(); -} - -// ************************** PROGRAM ENTRY POINT ************************** - -if (!isset($_SERVER["HTTP_HOST"])) { - // running through command line - runCLIVersion($argv, $argc); -} else { - // running through web server - try { - runWWWVersion(); - } catch (Zend_Gdata_Gapps_ServiceException $e) { - // Try to recover gracefully from a service exception. - // The HTML prologue will have already been sent. - echo "

    Service Error Encountered

    \n"; - echo "
    " . htmlspecialchars($e->__toString()) . "
    "; - endHTML(true); - } -} diff --git a/demos/Zend/Gdata/InstallationChecker.php b/demos/Zend/Gdata/InstallationChecker.php deleted file mode 100644 index b3e21d80aa..0000000000 --- a/demos/Zend/Gdata/InstallationChecker.php +++ /dev/null @@ -1,386 +0,0 @@ - array( - 'tested' => false, 'errors' => null), - self::ZEND_GDATA_INSTALL_ERRORS => array( - 'tested' => false, 'errors' => null), - self::SSL_CAPABILITIES_ERRORS => array( - 'tested' => false, 'errors' => null), - self::YOUTUBE_API_CONNECTIVITY_ERRORS => array( - 'tested' => false, 'errors' => null) - ); - - private $_sapiModeCLI = null; - - /** - * Create a new InstallationChecker object and run verifications. - * @return void - */ - public function __construct() - { - $this->determineIfInCLIMode(); - $this->runAllVerifications(); - $this->outputResults(); - } - - /** - * Set the sapiModeCLI variable to true if we are running CLI mode. - * - * @return void - */ - private function determineIfInCLIMode() - { - if (php_sapi_name() == 'cli') { - $this->_sapiModeCLI = true; - } - } - - /** - * Getter for sapiModeCLI variable. - * - * @return boolean True if we are running in CLI mode. - */ - public function runningInCLIMode() - { - if ($this->_sapiModeCLI) { - return true; - } else { - return false; - } - } - - /** - * Run verifications, stopping at each step if there is a failure. - * - * @return void - */ - public function runAllVerifications() - { - if (!$this->validatePHPExtensions()) { - return; - } - if (!$this->validateZendFrameworkInstallation()) { - return; - } - if (!$this->testSSLCapabilities()) { - return; - } - if (!$this->validateYouTubeAPIConnectivity()) { - return; - } - } - - /** - * Validate that the required PHP Extensions are installed and available. - * - * @return boolean False if there were errors. - */ - private function validatePHPExtensions() - { - $phpExtensionErrors = array(); - foreach (self::$REQUIRED_EXTENSIONS as $requiredExtension) { - if (!extension_loaded($requiredExtension)) { - $requiredExtensionError = $requiredExtension . - ' extension missing'; - $documentationLink = null; - if ($requiredExtension != 'standard') { - $documentationLink = self::PHP_MANUAL_LINK_FRAGMENT . - $requiredExtension . '.php'; - $documentationLink = - $this->checkAndAddHTMLLink($documentationLink); - } else { - $documentationLink = self::PHP_MANUAL_LINK_FRAGMENT . - 'spl.php'; - $documentationLink = - $this->checkAndAddHTMLLink($documentationLink); - } - - if ($documentationLink) { - $phpExtensionErrors[] = $requiredExtensionError . - ' - refer to ' . $documentationLink; - } - } - } - $this->_allErrors[self::PHP_EXTENSION_ERRORS]['tested'] = true; - if (count($phpExtensionErrors) > 0) { - $this->_allErrors[self::PHP_EXTENSION_ERRORS]['errors'] = - $phpExtensionErrors; - return false; - } - return true; - } - - /** - * Validate that the Gdata component of Zend Framework is installed - * properly. Also checks that the required YouTube API helper methods are - * found. - * - * @return boolean False if there were errors. - */ - private function validateZendFrameworkInstallation() - { - $zendFrameworkInstallationErrors = array(); - $zendLoaderPresent = false; - try { - $zendLoaderPresent = @fopen('Zend/Loader.php', 'r', true); - } catch (Exception $e) { - $zendFrameworkInstallationErrors[] = 'Exception thrown trying to ' . - 'access Zend/Loader.php using \'use_include_path\' = true ' . - 'Make sure you include the Zend Framework in your ' . - 'include_path which currently contains: "' . - ini_get('include_path') . '"'; - } - - if ($zendLoaderPresent) { - @fclose($zendLoaderPresent); - require_once('Zend/Loader.php'); - require_once('Zend/Version.php'); - Zend_Loader::loadClass('Zend_Gdata_YouTube'); - Zend_Loader::loadClass('Zend_Gdata_YouTube_VideoEntry'); - $yt = new Zend_Gdata_YouTube(); - $videoEntry = $yt->newVideoEntry(); - if (!method_exists($videoEntry, 'setVideoTitle')) { - $zendFrameworkMessage = 'Your version of the ' . - 'Zend Framework ' . Zend_Version::VERSION . ' is too old' . - ' to run the YouTube demo application and does not' . - ' contain the new helper methods. Please check out a' . - ' newer version from Zend\'s repository: ' . - checkAndAddHTMLLink(self::ZEND_SUBVERSION_URI); - $zendFrameworkInstallationErrors[] = $zendFrameworkMessage; - } - } else { - if (count($zendFrameworkInstallationErrors) < 1) { - $zendFrameworkInstallationErrors[] = 'Exception thrown trying' . - ' to access Zend/Loader.php using \'use_include_path\' =' . - ' true. Make sure you include Zend Framework in your' . - ' include_path which currently contains: ' . - ini_get('include_path'); - } - } - - $this->_allErrors[self::ZEND_GDATA_INSTALL_ERRORS]['tested'] = true; - - if (count($zendFrameworkInstallationErrors) > 0) { - $this->_allErrors[self::ZEND_GDATA_INSTALL_ERRORS]['errors'] = - $zendFrameworkInstallationErrors; - return false; - } - return true; - } - - /** - * Create HTML link from an input string if not in CLI mode. - * - * @param string The error message to be converted to a link. - * @return string Either the original error message or an HTML version. - */ - private function checkAndAddHTMLLink($inputString) { - if (!$this->runningInCLIMode()) { - return $this->makeHTMLLink($inputString); - } else { - return $inputString; - } - } - - /** - * Create an HTML link from a string. - * - * @param string The string to be made into link text and anchor target. - * @return string HTML link. - */ - private function makeHTMLLink($inputString) - { - return '' . - $inputString . ''; - } - - /** - * Validate that SSL Capabilities are available. - * - * @return boolean False if there were errors. - */ - private function testSSLCapabilities() - { - $sslCapabilitiesErrors = array(); - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass('Zend_Http_Client'); - - $httpClient = new Zend_Http_Client( - 'https://www.google.com/accounts/AuthSubRequest'); - $response = $httpClient->request(); - $this->_allErrors[self::SSL_CAPABILITIES_ERRORS]['tested'] = true; - - if ($response->isError()) { - $sslCapabilitiesErrors[] = 'Response from trying to access' . - ' \'https://www.google.com/accounts/AuthSubRequest\' ' . - $response->getStatus() . ' - ' . $response->getMessage(); - } - - if (count($sslCapabilitiesErrors) > 0) { - $this->_allErrors[self::SSL_CAPABILITIES_ERRORS]['errors'] = - $sslCapabilitiesErrors; - return false; - } - return true; - } - - /** - * Validate that we can connect to the YouTube API. - * - * @return boolean False if there were errors. - */ - private function validateYouTubeAPIConnectivity() - { - $connectivityErrors = array(); - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass('Zend_Gdata_YouTube'); - $yt = new Zend_Gdata_YouTube(); - $topRatedFeed = $yt->getTopRatedVideoFeed(); - if ($topRatedFeed instanceof Zend_Gdata_YouTube_VideoFeed) { - if ($topRatedFeed->getTotalResults()->getText() < 1) { - $connectivityErrors[] = 'There was less than 1 video entry' . - ' in the \'Top Rated Video Feed\''; - } - } else { - $connectivityErrors[] = 'The call to \'getTopRatedVideoFeed()\' ' . - 'did not result in a Zend_Gdata_YouTube_VideoFeed object'; - } - - $this->_allErrors[self::YOUTUBE_API_CONNECTIVITY_ERRORS]['tested'] = - true; - if (count($connectivityErrors) > 0) { - $this->_allErrors[self::YOUTUBE_API_CONNECTIVITY_ERRORS]['tested'] = - $connectivityErrors; - return false; - } - return true; - } - - /** - * Dispatch a call to outputResultsInHTML or outputResultsInText pending - * the current SAPI mode. - * - * @return void - */ - public function outputResults() - { - if ($this->_sapiModeCLI) { - print $this->getResultsInText(); - } else { - print $this->getResultsInHTML(); - } - } - - - /** - * Return a string representing the results of the verifications. - * - * @return string A string representing the results. - */ - private function getResultsInText() - { - $output = "== Ran PHP Installation Checker using CLI ==\n"; - - $error_count = 0; - foreach($this->_allErrors as $key => $value) { - $output .= $key . ' -- '; - if (($value['tested'] == true) && (count($value['errors']) == 0)) { - $output .= "No errors found\n"; - } elseif ($value['tested'] == true) { - $output .= "Tested\n"; - $error_count = 0; - foreach ($value['errors'] as $error) { - $output .= "Error number: " . $error_count . "\n--" . - $error . "\n"; - } - } else { - $output .= "Not tested\n"; - } - $error_count++; - } - return $output; - } - - /** - * Return an HTML table representing the results of the verifications. - * - * @return string An HTML string representing the results. - */ - private function getResultsInHTML() - { - $html = "\n". - "\nPHP Installation Checker\n" . - "\n" . - "\n" . - "\n"; - - $error_count = 0; - foreach($this->_allErrors as $key => $value) { - $html .= ""; - if (($value['tested'] == true) && (count($value['errors']) == 0)) { - $html .= "\n" . - "\n"; - } elseif ($value['tested'] == true) { - $html .= "\n"; - $error_count = 0; - foreach ($value['errors'] as $error) { - $html .= "" . - "\n"; - } - } else { - $html .= "\n"; - } - $error_count++; - } - $html .= ""; - return $html; - } -} - -$installationChecker = new InstallationChecker(); diff --git a/demos/Zend/Gdata/MyLibrary/demo.php b/demos/Zend/Gdata/MyLibrary/demo.php deleted file mode 100755 index ce473273ef..0000000000 --- a/demos/Zend/Gdata/MyLibrary/demo.php +++ /dev/null @@ -1,226 +0,0 @@ -getMessage() ."\nCredentials provided were ". - "email: [$email] and password [$password].\n"); - } - $this->gdClient = new Zend_Gdata_Books($client); - } - - /** - * Print the content of a feed - * - * @param Zend_Gdata_Gbase_Feed $feed - * @return void - */ - public function printFeed($feed) - { - $i = 0; - foreach($feed as $entry) { - $titles = $entry->getTitles(); - $rating = $entry->getRating(); - if (count($titles)) { - if (!is_object($rating)) { - $rating_str = "?"; - } else { - $rating_str = $rating->getAverage(); - } - print $i." ".$titles[0]->getText(). - ", Rating: ".$rating_str."\n"; - $i++; - } - } - } - - /** - * List books in the My library feed - * - * @return void - */ - public function listLibrary() - { - $feed = $this->gdClient->getUserLibraryFeed(); - print "== Books in my library ==\n"; - $this->printFeed($feed); - print "\n"; - } - - /** - * List books in the annotation feed. - * - * @return void - */ - public function listReviewed() - { - $feed = $this->gdClient->getUserLibraryFeed( - Zend_Gdata_Books::MY_ANNOTATION_FEED_URI); - print "== Books I annotated ==\n"; - $this->printFeed($feed); - print "\n"; - } - - /** - * Add an arbitrary book to the library feed. - * - * @param string $volumeId Volume to the library - * @return void - */ - public function addBookToLibrary($volumeId) - { - $entry = new Zend_Gdata_Books_VolumeEntry(); - $entry->setId( - new Zend_Gdata_App_Extension_Id($volumeId)); - print "Inserting ".$volumeId."\n\n"; - return $this->gdClient->insertVolume($entry); - } - - /** - * Add an arbitrary book to the library feed. - * - * @param string $volumeId Volume to add a rating to - * @param float $rating Numeric rating from 0 to 5 - * @return void - */ - public function addRating($volumeId, $rating) - { - $entry = new Zend_Gdata_Books_VolumeEntry(); - $entry->setId( - new Zend_Gdata_App_Extension_Id($volumeId)); - $entry->setRating( - new Zend_Gdata_Extension_Rating($rating, "0", 5, 1)); - print "Inserting a rating of ".$rating." for ".$volumeId."\n\n"; - return $this->gdClient->insertVolume($entry, - Zend_Gdata_Books::MY_ANNOTATION_FEED_URI); - } - - /** - * Remove an an arbitrary book from a feed (either remove - * from library feed or remove the annotations from annotation - * feed). - * - * @param Zend_Gdata_Books_VolumeEntry $entry - * @return void - */ - public function removeBook($entry) - { - print "Deleting ".$entry->getId()->getText()."\n\n"; - $this->gdClient->deleteVolume($entry); - } - - /** - * Main logic for the demo. - * - * @return void - */ - public function run() - { - $test_volume = "8YEAAAAAYAAJ"; - - // Playing with the library feed - $this->listLibrary(); - - $entry = $this->addBookToLibrary($test_volume); - $this->listLibrary(); - - $this->removeBook($entry); - $this->listLibrary(); - - // Playing with the annotation feed - $this->listReviewed(); - - $entry = $this->addRating($test_volume, 4.0); - $this->listReviewed(); - - $this->removeBook($entry); - $this->listReviewed(); - } -} - -/** - * getInput - * - * @param string $text - * @return string - */ -function getInput($text) -{ - echo $text.': '; - return trim(fgets(STDIN)); -} - -echo "Books Gdata API - my library demo\n\n"; -$email = null; -$pass = null; - -// process command line options -foreach ($argv as $argument) { - $argParts = explode('=', $argument); - if ($argParts[0] == '--email') { - $email = $argParts[1]; - } else if ($argParts[0] == '--pass') { - $pass = $argParts[1]; - } -} - -if (($email == null) || ($pass == null)) { - $email = getInput( - "Please enter your email address [example: username@gmail.com]"); - $pass = getInput( - "Please enter your password [example: mypassword]"); -} - -$demo = new SimpleDemo($email, $pass); -$demo->run(); diff --git a/demos/Zend/Gdata/Photos.php b/demos/Zend/Gdata/Photos.php deleted file mode 100755 index 63e147d058..0000000000 --- a/demos/Zend/Gdata/Photos.php +++ /dev/null @@ -1,904 +0,0 @@ -= 5.2.11 - * - * You can run this sample from a web browser. - * - * NOTE: You must ensure that Zend Framework is in your PHP include - * path. You can do this via php.ini settings, or by modifying the - * argument to set_include_path in the code below. - * - * NOTE: As this is sample code, not all of the functions do full error - * handling. - */ - -/** - * @see Zend_Loader - */ -require_once 'Zend/Loader.php'; - -/** - * @see Zend_Gdata - */ -Zend_Loader::loadClass('Zend_Gdata'); - -/** - * @see Zend_Gdata_AuthSub - */ -Zend_Loader::loadClass('Zend_Gdata_AuthSub'); - -/** - * @see Zend_Gdata_Photos - */ -Zend_Loader::loadClass('Zend_Gdata_Photos'); - -/** - * @see Zend_Gdata_Photos_UserQuery - */ -Zend_Loader::loadClass('Zend_Gdata_Photos_UserQuery'); - -/** - * @see Zend_Gdata_Photos_AlbumQuery - */ -Zend_Loader::loadClass('Zend_Gdata_Photos_AlbumQuery'); - -/** - * @see Zend_Gdata_Photos_PhotoQuery - */ -Zend_Loader::loadClass('Zend_Gdata_Photos_PhotoQuery'); - -/** - * @see Zend_Gdata_App_Extension_Category - */ -Zend_Loader::loadClass('Zend_Gdata_App_Extension_Category'); - -session_start(); - - -/** - * Adds a new photo to the specified album - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @param array $photo The uploaded photo - * @return void - */ -function addPhoto($client, $user, $albumId, $photo) -{ - $photos = new Zend_Gdata_Photos($client); - - $fd = $photos->newMediaFileSource($photo["tmp_name"]); - $fd->setContentType($photo["type"]); - - $entry = new Zend_Gdata_Photos_PhotoEntry(); - $entry->setMediaSource($fd); - $entry->setTitle($photos->newTitle($photo["name"])); - - $albumQuery = new Zend_Gdata_Photos_AlbumQuery; - $albumQuery->setUser($user); - $albumQuery->setAlbumId($albumId); - - $albumEntry = $photos->getAlbumEntry($albumQuery); - - $result = $photos->insertPhotoEntry($entry, $albumEntry); - if ($result) { - outputAlbumFeed($client, $user, $albumId); - } else { - echo "There was an issue with the file upload."; - } -} - -/** - * Deletes the specified photo - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @param integer $photoId The photo's id - * @return void - */ -function deletePhoto($client, $user, $albumId, $photoId) -{ - $photos = new Zend_Gdata_Photos($client); - - $photoQuery = new Zend_Gdata_Photos_PhotoQuery; - $photoQuery->setUser($user); - $photoQuery->setAlbumId($albumId); - $photoQuery->setPhotoId($photoId); - $photoQuery->setType('entry'); - - $entry = $photos->getPhotoEntry($photoQuery); - - $photos->deletePhotoEntry($entry, true); - - outputAlbumFeed($client, $user, $albumId); -} - -/** - * Adds a new album to the specified user's album - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param string $name The name of the new album - * @return void - */ -function addAlbum($client, $user, $name) -{ - $photos = new Zend_Gdata_Photos($client); - - $entry = new Zend_Gdata_Photos_AlbumEntry(); - $entry->setTitle($photos->newTitle($name)); - - $result = $photos->insertAlbumEntry($entry); - if ($result) { - outputUserFeed($client, $user); - } else { - echo "There was an issue with the album creation."; - } -} - -/** - * Deletes the specified album - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @return void - */ -function deleteAlbum($client, $user, $albumId) -{ - $photos = new Zend_Gdata_Photos($client); - - $albumQuery = new Zend_Gdata_Photos_AlbumQuery; - $albumQuery->setUser($user); - $albumQuery->setAlbumId($albumId); - $albumQuery->setType('entry'); - - $entry = $photos->getAlbumEntry($albumQuery); - - $photos->deleteAlbumEntry($entry, true); - - outputUserFeed($client, $user); -} - -/** - * Adds a new comment to the specified photo - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @param integer $photoId The photo's id - * @param string $comment The comment to add - * @return void - */ -function addComment($client, $user, $album, $photo, $comment) -{ - $photos = new Zend_Gdata_Photos($client); - - $entry = new Zend_Gdata_Photos_CommentEntry(); - $entry->setTitle($photos->newTitle($comment)); - $entry->setContent($photos->newContent($comment)); - - $photoQuery = new Zend_Gdata_Photos_PhotoQuery; - $photoQuery->setUser($user); - $photoQuery->setAlbumId($album); - $photoQuery->setPhotoId($photo); - $photoQuery->setType('entry'); - - $photoEntry = $photos->getPhotoEntry($photoQuery); - - $result = $photos->insertCommentEntry($entry, $photoEntry); - if ($result) { - outputPhotoFeed($client, $user, $album, $photo); - } else { - echo "There was an issue with the comment creation."; - } -} - -/** - * Deletes the specified comment - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @param integer $photoId The photo's id - * @param integer $commentId The comment's id - * @return void - */ -function deleteComment($client, $user, $albumId, $photoId, $commentId) -{ - $photos = new Zend_Gdata_Photos($client); - - $photoQuery = new Zend_Gdata_Photos_PhotoQuery; - $photoQuery->setUser($user); - $photoQuery->setAlbumId($albumId); - $photoQuery->setPhotoId($photoId); - $photoQuery->setType('entry'); - - $path = $photoQuery->getQueryUrl() . '/commentid/' . $commentId; - - $entry = $photos->getCommentEntry($path); - - $photos->deleteCommentEntry($entry, true); - - outputPhotoFeed($client, $user, $albumId, $photoId); -} - -/** - * Adds a new tag to the specified photo - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $album The album's id - * @param integer $photo The photo's id - * @param string $tag The tag to add to the photo - * @return void - */ -function addTag($client, $user, $album, $photo, $tag) -{ - $photos = new Zend_Gdata_Photos($client); - - $entry = new Zend_Gdata_Photos_TagEntry(); - $entry->setTitle($photos->newTitle($tag)); - - $photoQuery = new Zend_Gdata_Photos_PhotoQuery; - $photoQuery->setUser($user); - $photoQuery->setAlbumId($album); - $photoQuery->setPhotoId($photo); - $photoQuery->setType('entry'); - - $photoEntry = $photos->getPhotoEntry($photoQuery); - - $result = $photos->insertTagEntry($entry, $photoEntry); - if ($result) { - outputPhotoFeed($client, $user, $album, $photo); - } else { - echo "There was an issue with the tag creation."; - } -} - -/** - * Deletes the specified tag - * - * @param Zend_Http_Client $client The authenticated client - * @param string $user The user's account name - * @param integer $albumId The album's id - * @param integer $photoId The photo's id - * @param string $tagContent The name of the tag to be deleted - * @return void - */ -function deleteTag($client, $user, $albumId, $photoId, $tagContent) -{ - $photos = new Zend_Gdata_Photos($client); - - $photoQuery = new Zend_Gdata_Photos_PhotoQuery; - $photoQuery->setUser($user); - $photoQuery->setAlbumId($albumId); - $photoQuery->setPhotoId($photoId); - $query = $photoQuery->getQueryUrl() . "?kind=tag"; - - $photoFeed = $photos->getPhotoFeed($query); - - foreach ($photoFeed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_TagEntry) { - if ($entry->getContent() == $tagContent) { - $tagEntry = $entry; - } - } - } - - $photos->deleteTagEntry($tagEntry, true); - - outputPhotoFeed($client, $user, $albumId, $photoId); -} - -/** - * Returns the path to the current script, without any query params - * - * Env variables used: - * $_SERVER['PHP_SELF'] - * - * @return string Current script path - */ -function getCurrentScript() -{ - global $_SERVER; - return $_SERVER["PHP_SELF"]; -} - -/** - * Returns the full URL of the current page, based upon env variables - * - * Env variables used: - * $_SERVER['HTTPS'] = (on|off|) - * $_SERVER['HTTP_HOST'] = value of the Host: header - * $_SERVER['SERVER_PORT'] = port number (only used if not http/80,https/443) - * $_SERVER['REQUEST_URI'] = the URI after the method of the HTTP request - * - * @return string Current URL - */ -function getCurrentUrl() -{ - global $_SERVER; - - /** - * Filter php_self to avoid a security vulnerability. - */ - $php_request_uri = htmlentities(substr($_SERVER['REQUEST_URI'], 0, - strcspn($_SERVER['REQUEST_URI'], "\n\r")), ENT_QUOTES); - - if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') { - $protocol = 'https://'; - } else { - $protocol = 'http://'; - } - $host = $_SERVER['HTTP_HOST']; - if ($_SERVER['SERVER_PORT'] != '' && - (($protocol == 'http://' && $_SERVER['SERVER_PORT'] != '80') || - ($protocol == 'https://' && $_SERVER['SERVER_PORT'] != '443'))) { - $port = ':' . $_SERVER['SERVER_PORT']; - } else { - $port = ''; - } - return $protocol . $host . $port . $php_request_uri; -} - -/** - * Returns the AuthSub URL which the user must visit to authenticate requests - * from this application. - * - * Uses getCurrentUrl() to get the next URL which the user will be redirected - * to after successfully authenticating with the Google service. - * - * @return string AuthSub URL - */ -function getAuthSubUrl() -{ - $next = getCurrentUrl(); - $scope = 'http://picasaweb.google.com/data'; - $secure = false; - $session = true; - return Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, - $session); -} - -/** - * Outputs a request to the user to login to their Google account, including - * a link to the AuthSub URL. - * - * Uses getAuthSubUrl() to get the URL which the user must visit to authenticate - * - * @return void - */ -function requestUserLogin($linkText) -{ - $authSubUrl = getAuthSubUrl(); - echo "{$linkText}"; -} - -/** - * Returns a HTTP client object with the appropriate headers for communicating - * with Google using AuthSub authentication. - * - * Uses the $_SESSION['sessionToken'] to store the AuthSub session token after - * it is obtained. The single use token supplied in the URL when redirected - * after the user succesfully authenticated to Google is retrieved from the - * $_GET['token'] variable. - * - * @return Zend_Http_Client - */ -function getAuthSubHttpClient() -{ - global $_SESSION, $_GET; - if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) { - $_SESSION['sessionToken'] = - Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']); - } - $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']); - return $client; -} - -/** - * Processes loading of this sample code through a web browser. Uses AuthSub - * authentication and outputs a list of a user's albums if succesfully - * authenticated. - * - * @return void - */ -function processPageLoad() -{ - global $_SESSION, $_GET; - if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) { - requestUserLogin('Please login to your Google Account.'); - } else { - $client = getAuthSubHttpClient(); - if (!empty($_REQUEST['command'])) { - switch ($_REQUEST['command']) { - case 'retrieveSelf': - outputUserFeed($client, "default"); - break; - case 'retrieveUser': - outputUserFeed($client, $_REQUEST['user']); - break; - case 'retrieveAlbumFeed': - outputAlbumFeed($client, $_REQUEST['user'], $_REQUEST['album']); - break; - case 'retrievePhotoFeed': - outputPhotoFeed($client, $_REQUEST['user'], $_REQUEST['album'], - $_REQUEST['photo']); - break; - } - } - - // Now we handle the potentially destructive commands, which have to - // be submitted by POST only. - if (!empty($_POST['command'])) { - switch ($_POST['command']) { - case 'addPhoto': - addPhoto($client, $_POST['user'], $_POST['album'], $_FILES['photo']); - break; - case 'deletePhoto': - deletePhoto($client, $_POST['user'], $_POST['album'], - $_POST['photo']); - break; - case 'addAlbum': - addAlbum($client, $_POST['user'], $_POST['name']); - break; - case 'deleteAlbum': - deleteAlbum($client, $_POST['user'], $_POST['album']); - break; - case 'addComment': - addComment($client, $_POST['user'], $_POST['album'], $_POST['photo'], - $_POST['comment']); - break; - case 'addTag': - addTag($client, $_POST['user'], $_POST['album'], $_POST['photo'], - $_POST['tag']); - break; - case 'deleteComment': - deleteComment($client, $_POST['user'], $_POST['album'], - $_POST['photo'], $_POST['comment']); - break; - case 'deleteTag': - deleteTag($client, $_POST['user'], $_POST['album'], $_POST['photo'], - $_POST['tag']); - break; - default: - break; - } - } - - // If a menu parameter is available, display a submenu. - if (!empty($_REQUEST['menu'])) { - switch ($_REQUEST['menu']) { - case 'user': - displayUserMenu(); - break; - case 'photo': - displayPhotoMenu(); - break; - case 'album': - displayAlbumMenu(); - break; - case 'logout': - logout(); - break; - default: - header('HTTP/1.1 400 Bad Request'); - echo "

    Invalid menu selection.

    \n"; - echo "

    Please check your request and try again.

    "; - } - } - - if (empty($_REQUEST['menu']) && empty($_REQUEST['command'])) { - displayMenu(); - } - } -} - -/** - * Displays the main menu, allowing the user to select from a list of actions. - * - * @return void - */ -function displayMenu() -{ -?> -

    Main Menu

    - -

    Welcome to the Photos API demo page. Please select - from one of the following four options to fetch information.

    - - -
    "; - echo "<< Back"; -} - -/** - * Displays the user menu, allowing the user to request a specific user's feed. - * - * @return void - */ -function displayUserMenu() -{ -?> -

    User Menu

    - - - -

    Photo Menu

    - - - -

    Album Menu

    - - -setUser($user); - - $userFeed = $photos->getUserFeed(null, $query); - echo "

    User Feed for: " . $userFeed->getTitle() . "

    "; - echo "
    \n"; - - echo "

    Add an Album

    "; -?> - - - - - - -setUser($user); - $query->setAlbumId($albumId); - - $albumFeed = $photos->getAlbumFeed($query); - echo "

    Album Feed for: " . $albumFeed->getTitle() . "

    "; - echo "
    \n"; - - echo "

    Add a Photo

    "; -?> - - - - - - Please select a photo to upload:
    - - -setUser($user); - $query->setAlbumId($albumId); - $query->setPhotoId($photoId); - $query = $query->getQueryUrl() . "?kind=comment,tag"; - - $photoFeed = $photos->getPhotoFeed($query); - echo "

    Photo Feed for: " . $photoFeed->getTitle() . "

    "; - $thumbs = $photoFeed->getMediaGroup()->getThumbnail(); - echo ""; - - echo "

    Comments:

    "; - echo "
      \n"; - foreach ($photoFeed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_CommentEntry) { - echo "\t
    • " . $entry->getContent(); - echo "
      "; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo "
    • \n"; - } - } - echo "
    \n"; - echo "

    Add a Comment

    "; -?> - - - - - - - - -"; - echo "

    Tags:

    "; - echo "
      \n"; - foreach ($photoFeed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_TagEntry) { - echo "\t
    • " . $entry->getTitle(); - echo "
      "; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo "
    • \n"; - } - } - echo "
    \n"; - echo "

    Add a Tag

    "; -?> - - - - - - - - - - -getMessage() ."\nCredentials provided were email: [$email] and password [$password].\n"); - } - - $this->gdClient = new Zend_Gdata_Spreadsheets($client); - $this->currKey = ''; - $this->currWkshtId = ''; - $this->listFeed = ''; - $this->rowCount = 0; - $this->columnCount = 0; - } - - /** - * promptForSpreadsheet - * - * @return void - */ - public function promptForSpreadsheet() - { - $feed = $this->gdClient->getSpreadsheetFeed(); - print "== Available Spreadsheets ==\n"; - $this->printFeed($feed); - $input = getInput("\nSelection"); - $currKey = explode('/', $feed->entries[$input]->id->text); - $this->currKey = $currKey[5]; - } - - /** - * promptForWorksheet - * - * @return void - */ - public function promptForWorksheet() - { - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $query->setSpreadsheetKey($this->currKey); - $feed = $this->gdClient->getWorksheetFeed($query); - print "== Available Worksheets ==\n"; - $this->printFeed($feed); - $input = getInput("\nSelection"); - $currWkshtId = explode('/', $feed->entries[$input]->id->text); - $this->currWkshtId = $currWkshtId[8]; - - } - - /** - * promptForCellsAction - * - * @return void - */ - public function promptForCellsAction() - { - echo "Pick a command:\n"; - echo "\ndump -- dump cell information\nupdate {row} {col} {input_value} -- update cell information\n"; - $input = getInput('Command'); - $command = explode(' ', $input); - if ($command[0] == 'dump') { - $this->cellsGetAction(); - } else if (($command[0] == 'update') && (count($command) > 2)) { - $this->getRowAndColumnCount(); - if (count($command) == 4) { - $this->cellsUpdateAction($command[1], $command[2], $command[3]); - } elseif (count($command) > 4) { - $newValue = implode(' ', array_slice($command,3)); - $this->cellsUpdateAction($command[1], $command[2], $newValue); - } else { - $this->cellsUpdateAction($command[1], $command[2], ''); - } - } else { - $this->invalidCommandError($input); - } - } - - /** - * promptToResize - * - * @param integer $newRowCount - * @param integer $newColumnCount - * @return boolean - */ - public function promptToResize($newRowCount, $newColumnCount) { - $input = getInput('Would you like to resize the worksheet? [yes | no]'); - if ($input == 'yes') { - return $this->resizeWorksheet($newRowCount, $newColumnCount); - } else { - return false; - } - } - - /** - * resizeWorksheet - * - * @param integer $newRowCount - * @param integer $newColumnCount - * @return boolean - */ - public function resizeWorksheet($newRowCount, $newColumnCount) { - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $currentWorksheet = $this->gdClient->getWorksheetEntry($query); - $currentWorksheet = $currentWorksheet->setRowCount(new Zend_Gdata_Spreadsheets_Extension_RowCount($newRowCount)); - $currentWorksheet = $currentWorksheet->setColumnCount(new Zend_Gdata_Spreadsheets_Extension_ColCount($newColumnCount)); - $currentWorksheet->save(); - $this->getRowAndColumnCount(); - print "Worksheet has been resized to $this->rowCount rows and $this->columnCount columns.\n"; - return true; - } - - /** - * promptForListAction - * - * @return void - */ - public function promptForListAction() - { - echo "\n== Options ==\n". - "dump -- dump row information\n". - "insert {row_data} -- insert data in the next available cell in a given column (example: insert column_header=content)\n". - "update {row_index} {row_data} -- update data in the row provided (example: update row-number column-header=newdata\n". - "delete {row_index} -- delete a row\n\n"; - - $input = getInput('Command'); - $command = explode(' ', $input); - if ($command[0] == 'dump') { - $this->listGetAction(); - } else if ($command[0] == 'insert') { - $this->listInsertAction(array_slice($command, 1)); - } else if ($command[0] == 'update') { - $this->listUpdateAction($command[1], array_slice($command, 2)); - } else if ($command[0] == 'delete') { - $this->listDeleteAction($command[1]); - } else { - $this->invalidCommandError($input); - } - } - - /** - * cellsGetAction - * - * @return void - */ - public function cellsGetAction() - { - $query = new Zend_Gdata_Spreadsheets_CellQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $feed = $this->gdClient->getCellFeed($query); - $this->printFeed($feed); - } - - /** - * cellsUpdateAction - * - * @param integer $row - * @param integer $col - * @param string $inputValue - * @return void - */ - public function cellsUpdateAction($row, $col, $inputValue) - { - if (($row > $this->rowCount) || ($col > $this->columnCount)) { - print "Current worksheet only has $this->rowCount rows and $this->columnCount columns.\n"; - if (!$this->promptToResize($row, $col)) { - return; - } - } - $entry = $this->gdClient->updateCell($row, $col, $inputValue, - $this->currKey, $this->currWkshtId); - if ($entry instanceof Zend_Gdata_Spreadsheets_CellEntry) { - echo "Success!\n"; - } - } - - /** - * listGetAction - * - * @return void - */ - public function listGetAction() - { - $query = new Zend_Gdata_Spreadsheets_ListQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $this->listFeed = $this->gdClient->getListFeed($query); - print "entry id | row-content in column A | column-header: cell-content\n". - "Please note: The 'dump' command on the list feed only dumps data until the first blank row is encountered.\n\n"; - - $this->printFeed($this->listFeed); - print "\n"; - } - - /** - * listInsertAction - * - * @param mixed $rowData - * @return void - */ - public function listInsertAction($rowData) - { - $rowArray = $this->stringToArray($rowData); - $entry = $this->gdClient->insertRow($rowArray, $this->currKey, $this->currWkshtId); - if ($entry instanceof Zend_Gdata_Spreadsheets_ListEntry) { - foreach ($rowArray as $column_header => $value) { - echo "Success! Inserted '$value' in column '$column_header' at row ". substr($entry->getTitle()->getText(), 5) ."\n"; - } - } - } - - /** - * listUpdateAction - * - * @param integer $index - * @param mixed $rowData - * @return void - */ - public function listUpdateAction($index, $rowData) - { - $query = new Zend_Gdata_Spreadsheets_ListQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $this->listFeed = $this->gdClient->getListFeed($query); - $rowArray = $this->stringToArray($rowData); - $entry = $this->gdClient->updateRow($this->listFeed->entries[$index], $rowArray); - if ($entry instanceof Zend_Gdata_Spreadsheets_ListEntry) { - echo "Success!\n"; $response = $entry->save(); - - } - } - - /** - * listDeleteAction - * - * @param integer $index - * @return void - */ - public function listDeleteAction($index) - { - $query = new Zend_Gdata_Spreadsheets_ListQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $this->listFeed = $this->gdClient->getListFeed($query); - $this->gdClient->deleteRow($this->listFeed->entries[$index]); - } - - /** - * stringToArray - * - * @param string $rowData - * @return array - */ - public function stringToArray($rowData) - { - $arr = array(); - foreach ($rowData as $row) { - $temp = explode('=', $row); - $arr[$temp[0]] = $temp[1]; - } - return $arr; - } - - /** - * printFeed - * - * @param Zend_Gdata_Gbase_Feed $feed - * @return void - */ - public function printFeed($feed) - { - $i = 0; - foreach($feed->entries as $entry) { - if ($entry instanceof Zend_Gdata_Spreadsheets_CellEntry) { - print $entry->title->text .' '. $entry->content->text . "\n"; - } else if ($entry instanceof Zend_Gdata_Spreadsheets_ListEntry) { - print $i .' '. $entry->title->text .' | '. $entry->content->text . "\n"; - } else { - print $i .' '. $entry->title->text . "\n"; - } - $i++; - } - } - - /** - * getRowAndColumnCount - * - * @return void - */ - public function getRowAndColumnCount() - { - $query = new Zend_Gdata_Spreadsheets_CellQuery(); - $query->setSpreadsheetKey($this->currKey); - $query->setWorksheetId($this->currWkshtId); - $feed = $this->gdClient->getCellFeed($query); - - if ($feed instanceOf Zend_Gdata_Spreadsheets_CellFeed) { - $this->rowCount = $feed->getRowCount(); - $this->columnCount = $feed->getColumnCount(); - } - } - - /** - * invalidCommandError - * - * @param string $input - * @return void - */ - public function invalidCommandError($input) - { - echo 'Invalid input: '.$input."\n"; - } - - /** - * promtForFeedtype - * - * @return void - */ - public function promptForFeedtype() { - - $input = getInput('Select to use either the cell or the list feed [cells or list]'); - - if ($input == 'cells') { - while(1) { - $this->promptForCellsAction(); - } - } else if ($input == 'list') { - while(1) { - $this->promptForListAction(); - } - } else { - print "Invalid input. Please try again.\n"; - $this->promptForFeedtype(); - } - } - - /** - * run - * - * @return void - */ - public function run() - { - $this->promptForSpreadsheet(); - $this->promptForWorksheet(); - $this->promptForFeedtype(); - } -} - -/** - * getInput - * - * @param string $text - * @return string - */ -function getInput($text) -{ - echo $text.': '; - return trim(fgets(STDIN)); -} - -$email = null; -$pass = null; - -// process command line options -foreach ($argv as $argument) { - $argParts = explode('=', $argument); - if ($argParts[0] == '--email') { - $email = $argParts[1]; - } else if ($argParts[0] == '--pass') { - $pass = $argParts[1]; - } -} - -if (($email == null) || ($pass == null)) { - $email = getInput("Please enter your email address [example: username@gmail.com]"); - $pass = getInput("Please enter your password [example: mypassword]"); -} - -$sample = new SimpleCRUD($email, $pass); -$sample->run(); diff --git a/demos/Zend/Gdata/YouTubeVideoApp/README.txt b/demos/Zend/Gdata/YouTubeVideoApp/README.txt deleted file mode 100644 index 3cea242f61..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/README.txt +++ /dev/null @@ -1,44 +0,0 @@ -== YouTube data API Video App in PHP == - -PHP sample code for the YouTube data API. Utilizes the Zend Framework -Zend_Gdata component to communicate with the YouTube data API. - -Requires the Zend Framework Zend_Gdata component and PHP >= 5.2.11 -This sample is run from within a web browser. These files are required: - -session_details.php - a script to view log output and session variables -operations.php - the main logic, which interfaces with the YouTube API -index.php - the HTML to represent the web UI, contains some PHP -video_app.css - the CSS to define the interface style -video_app.js - the JavaScript used to provide the video list AJAX interface - --------------- - -NOTE: If using in production, some additional precautions with regards -to filtering the input data should be used. This code is designed only -for demonstration purposes. - --------------- - -Please be sure to obtain a Developer Key from YouTube prior to using -this application by visiting this site: - -http://code.google.com/apis/youtube/dashboard/ - -More information on the YouTube Data API and Tools is available here: - -http://code.google.com/apis/youtube - -For a video explaining the basics of how this application works, please -visit this link: - -http://www.youtube.com/watch?v=iIp7OnHXBlo - -To see this application running live, please visit: - -http://googlecodesamples.com - -== UPDATES == - -3/2009 - Removed functionality to set the Developer Key in a form. Instead, - it is now hard-coded in the index.php page. This reduces complexity. diff --git a/demos/Zend/Gdata/YouTubeVideoApp/index.php b/demos/Zend/Gdata/YouTubeVideoApp/index.php deleted file mode 100755 index fd193a4aef..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/index.php +++ /dev/null @@ -1,193 +0,0 @@ -= 5.2.11 - * This sample is run from within a web browser. These files are required: - * session_details.php - a script to view log output and session variables - * operations.php - the main logic, which interfaces with the YouTube API - * index.php - the HTML to represent the web UI, contains some PHP - * video_app.css - the CSS to define the interface style - * video_app.js - the JavaScript used to provide the video list AJAX interface - * - * NOTE: If using in production, some additional precautions with regards - * to filtering the input data should be used. This code is designed only - * for demonstration purposes. - */ -session_start(); - -/** - * Set your developer key here. - * - * NOTE: In a production application you may want to store this information in - * an external file. - */ -$_SESSION['developerKey'] = ''; - -/** - * Convert HTTP status into normal text. - * - * @param number $status HTTP status received after posting syndicated upload - * @param string $code Alphanumeric description of error - * @param string $videoId (optional) Video id received back to which the status - * code refers to - */ -function uploadStatus($status, $code = null, $videoId = null) -{ - switch ($status) { - case $status < 400: - echo 'Success ! Entry created (id: '. $videoId . - ') (check details)'; - break; - default: - echo 'There seems to have been an error: '. $code . - '(check details)'; - } -} - -/** - * Helper function to check whether a session token has been set - * - * @return boolean Returns true if a session token has been set - */ -function authenticated() -{ - if (isset($_SESSION['sessionToken'])) { - return true; - } -} - -/** - * Helper function to print a list of authenticated actions for a user. - */ -function printAuthenticatedActions() -{ - print <<

    Authenticated Actions

    - -END; -} -?> - - - - - YouTube data API Video Browser in PHP - - - - - -
    -
    -

    YouTube data API Video App in PHP

    - click to examine session variables
    - -
    - -
    -
    - -
    Authentication status: - -END; - } else { - print <<Click here to generate authentication link -
    -END; - } - ?> -
    - -
    - ' . - uploadStatus($_GET['status'], $code, $id) . - '
    '; - } - ?> - - - -
    -
    -
    -
    -
    - - - - -
    -
    -
    -
    -
    -
    - - - diff --git a/demos/Zend/Gdata/YouTubeVideoApp/notfound.jpg b/demos/Zend/Gdata/YouTubeVideoApp/notfound.jpg deleted file mode 100755 index 76ec81c45f2039e6b9049216358c35c8afe86730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1345 zcmex=PKf)jZ@&eEk zNPvT#l?^DPFTlXa%mPNttPp8NCT12^HbEhFVMPuRQA0;DC1nYfL~$dNz(Sw~5maM9 zT0o+LD29VYZ!z#NGXmYfEXZKbu;~Cuj38h%F1>Adc4L0fmvCv`(nHIRCLdAW6Q^@# z?%!3j@~c&hZ8yH}FI+Qmy}MR^VD0OJuanP4s;^wKs$XgDjjk`}p9OXXd|eX%zWzzs z_v6#^kL%{gG2CWsst<@{KlpD;Tz?8@WB&ZJ)i0|5_P*Zxw)AxS^O~*etu1cK2Uc~R z58> zSiK|J;`uA@Eitxxx8K_|dH?pUvVYdQW>;*Dd2e4+`fbVjmr3u=lnd=Doo;;S)uX=X z)Re82Q>Nc9R6SaIJ5Y1B`~JtF#eyrI{*L%}QI55V$Bb|H6S1e;VvF-8#})R3J+~=1 zSTX6L$ZPS!Qt9QbEBZQDZ@IPV$A1R({YN&hpZ}^ZzqKZQ+h6TB_Pf8!{Jp-bG4($~ zy2!)hQNPRn{i$VqbFjTWKsVp5VBO;V{3|BzH2u15>h|Dk<*JQhkvGqF-}ZaGzd7Tq zdDhz^-`wg7_XsULNz?xf(&r3b?a_Lgv32d!6J7W3Tl)K^QX^7EoO48Hcf*T23D|7H10 z?ZA}%@*noE{FgYlKmG95)3;ymJiq;M{rBhYNk7}3@3nvBXF4?@Vou~z+5OzzV$&vm z_gImd>{O1^Pm42*#0mG{}aC?)AaDgCA%pphMUgTOyX(@+ZX0_W2x8m zE3PLmuAUgREA7kbC82+obulnnKE2kravIK6rb#@ZZX$yG5ssbo6Dm-pidi)s$Ox&8i({EL+d|3mxgN78Sj; z-D};WBe#C|F5JD2*wcIkQ=jr*wvZt#a|G0Oy zgHb)LqCb9p-TWsnl{aMD=iT)8_Le=ReZ*_KM#40^+ey8r?%i5sx-Q(~$t}Y`;XD^@ M0fPAzw}SsS0qyV?bN~PV diff --git a/demos/Zend/Gdata/YouTubeVideoApp/operations.php b/demos/Zend/Gdata/YouTubeVideoApp/operations.php deleted file mode 100755 index afa62b90d1..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/operations.php +++ /dev/null @@ -1,1097 +0,0 @@ -= 5.2.11 - * This sample is run from within a web browser. These files are required: - * session_details.php - a script to view log output and session variables - * operations.php - the main logic, which interfaces with the YouTube API - * index.php - the HTML to represent the web UI, contains some PHP - * video_app.css - the CSS to define the interface style - * video_app.js - the JavaScript used to provide the video list AJAX interface - * - * NOTE: If using in production, some additional precautions with regards - * to filtering the input data should be used. This code is designed only - * for demonstration purposes. - */ -require_once 'Zend/Loader.php'; -Zend_Loader::loadClass('Zend_Gdata_YouTube'); -Zend_Loader::loadClass('Zend_Gdata_AuthSub'); -Zend_Loader::loadClass('Zend_Gdata_App_Exception'); - -/* - * The main controller logic. - * - * POST used for all authenticated requests - * otherwise use GET for retrieve and supplementary values - */ -session_start(); -setLogging('on'); -generateUrlInformation(); - -if (!isset($_POST['operation'])) { - // if a GET variable is set then process the token upgrade - if (isset($_GET['token'])) { - updateAuthSubToken($_GET['token']); - } else { - if (loggingEnabled()) { - logMessage('reached operations.php without $_POST or $_GET variables set', 'error'); - header('Location: index.php'); - } - } -} - -$operation = $_POST['operation']; - -switch ($operation) { - - case 'create_upload_form': - createUploadForm($_POST['videoTitle'], - $_POST['videoDescription'], - $_POST['videoCategory'], - $_POST['videoTags']); - break; - - case 'edit_meta_data': - editVideoData($_POST['newVideoTitle'], - $_POST['newVideoDescription'], - $_POST['newVideoCategory'], - $_POST['newVideoTags'], - $_POST['videoId']); - break; - - case 'check_upload_status': - checkUpload($_POST['videoId']); - break; - - case 'delete_video': - deleteVideo($_POST['videoId']); - break; - - case 'auth_sub_request': - generateAuthSubRequestLink(); - break; - - case 'auth_sub_token_upgrade': - updateAuthSubToken($_GET['token']); - break; - - case 'clear_session_var': - clearSessionVar($_POST['name']); - break; - - case 'retrieve_playlists': - retrievePlaylists(); - break; - - case 'create_playlist': - createPlaylist($_POST['playlistTitle'], $_POST['playlistDescription']); - break; - - case 'delete_playlist': - deletePlaylist($_POST['playlistTitle']); - break; - - case 'update_playlist': - updatePlaylist($_POST['newPlaylistTitle'], - $_POST['newPlaylistDescription'], - $_POST['oldPlaylistTitle']); - break; - - case (strcmp(substr($operation, 0, 7), 'search_') == 0): - // initialize search specific information - $searchType = substr($operation, 7); - searchVideos($searchType, $_POST['searchTerm'], $_POST['startIndex'], - $_POST['maxResults']); - break; - - case 'show_video': - echoVideoPlayer($_POST['videoId']); - break; - - default: - unsupportedOperation($_POST); - break; -} - -/** - * Perform a search on youtube. Passes the result feed to echoVideoList. - * - * @param string $searchType The type of search to perform. - * If set to 'owner' then attempt to authenticate. - * @param string $searchTerm The term to search on. - * @param string $startIndex Start retrieving search results from this index. - * @param string $maxResults The number of results to retrieve. - * @return void - */ -function searchVideos($searchType, $searchTerm, $startIndex, $maxResults) -{ - // create an unauthenticated service object - $youTubeService = new Zend_Gdata_YouTube(); - $query = $youTubeService->newVideoQuery(); - $query->setQuery($searchTerm); - $query->setStartIndex($startIndex); - $query->setMaxResults($maxResults); - - switch ($searchType) { - case 'most_viewed': - $query->setFeedType('most viewed'); - $query->setTime('this_week'); - $feed = $youTubeService->getVideoFeed($query); - break; - case 'most_recent': - $query->setFeedType('most recent'); - $query->setTime('this_week'); - $feed = $youTubeService->getVideoFeed($query); - break; - case 'recently_featured': - $query->setFeedType('recently featured'); - $feed = $youTubeService->getVideoFeed($query); - break; - case 'top_rated': - $query->setFeedType('top rated'); - $query->setTime('this_week'); - $feed = $youTubeService->getVideoFeed($query); - break; - case 'username': - $feed = $youTubeService->getUserUploads($searchTerm); - break; - case 'all': - $feed = $youTubeService->getVideoFeed($query); - break; - case 'owner': - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - try { - $feed = $youTubeService->getUserUploads('default'); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), - 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not retrieve users video feed: ' - . $e->getMessage() . '
    '; - return; - } - echoVideoList($feed, true); - return; - - default: - echo 'ERROR - Unknown search type - \'' . $searchType . '\''; - return; - } - - if (loggingEnabled()) { - $httpClient = $youTubeService->getHttpClient(); - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - echoVideoList($feed); -} - -/** - * Finds the URL for the flash representation of the specified video. - * - * @param Zend_Gdata_YouTube_VideoEntry $entry The video entry - * @return (string|null) The URL or null, if the URL is not found - */ -function findFlashUrl($entry) -{ - foreach ($entry->mediaGroup->content as $content) { - if ($content->type === 'application/x-shockwave-flash') { - return $content->url; - } - } - return null; -} - -/** - * Check the upload status of a video - * - * @param string $videoId The video to check. - * @return string A message about the video's status. - */ -function checkUpload($videoId) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - - $feed = $youTubeService->getuserUploads('default'); - $message = 'No further status information available yet.'; - - foreach($feed as $videoEntry) { - if ($videoEntry->getVideoId() == $videoId) { - // check if video is in draft status - try { - $control = $videoEntry->getControl(); - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - not able to retrieve control element ' - . $e->getMessage(); - return; - } - - if ($control instanceof Zend_Gdata_App_Extension_Control) { - if (($control->getDraft() != null) && - ($control->getDraft()->getText() == 'yes')) { - $state = $videoEntry->getVideoState(); - if ($state instanceof Zend_Gdata_YouTube_Extension_State) { - $message = 'Upload status: ' . $state->getName() . ' ' - . $state->getText(); - } else { - print $message; - } - } - } - } - } - print $message; -} - -/** - * Store location of the demo application into session variables. - * - * @return void - */ -function generateUrlInformation() -{ - if (!isset($_SESSION['operationsUrl']) || !isset($_SESSION['homeUrl'])) { - $_SESSION['operationsUrl'] = 'http://'. $_SERVER['HTTP_HOST'] - . $_SERVER['PHP_SELF']; - $path = explode('/', $_SERVER['PHP_SELF']); - $path[count($path)-1] = 'index.php'; - $_SESSION['homeUrl'] = 'http://'. $_SERVER['HTTP_HOST'] - . implode('/', $path); - } -} - -/** - * Log a message to the session variable array. - * - * @param string $message The message to log. - * @param string $messageType The type of message to log. - * @return void - */ -function logMessage($message, $messageType) -{ - if (!isset($_SESSION['log_maxLogEntries'])) { - $_SESSION['log_maxLogEntries'] = 20; - } - - if (!isset($_SESSION['log_currentCounter'])) { - $_SESSION['log_currentCounter'] = 0; - } - - $currentCounter = $_SESSION['log_currentCounter']; - $currentCounter++; - - if ($currentCounter > $_SESSION['log_maxLogEntries']) { - $_SESSION['log_currentCounter'] = 0; - } - - $logLocation = 'log_entry_'. $currentCounter . '_' . $messageType; - $_SESSION[$logLocation] = $message; - $_SESSION['log_currentCounter'] = $currentCounter; -} - -/** - * Update an existing video's meta-data. - * - * @param string $newVideoTitle The new title for the video entry. - * @param string $newVideoDescription The new description for the video entry. - * @param string $newVideoCategory The new category for the video entry. - * @param string $newVideoTags The new set of tags for the video entry (whitespace separated). - * @param string $videoId The video id for the video to be edited. - * @return void - */ -function editVideoData($newVideoTitle, $newVideoDescription, $newVideoCategory, $newVideoTags, $videoId) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getVideoFeed('https://gdata.youtube.com/feeds/users/default/uploads'); - $videoEntryToUpdate = null; - - foreach($feed as $entry) { - if ($entry->getVideoId() == $videoId) { - $videoEntryToUpdate = $entry; - break; - } - } - - if (!$videoEntryToUpdate instanceof Zend_Gdata_YouTube_VideoEntry) { - print 'ERROR - Could not find a video entry with id ' . $videoId - . '
    ' . printCacheWarning(); - return; - } - - try { - $putUrl = $videoEntryToUpdate->getEditLink()->getHref(); - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not obtain video entry\'s edit link: ' - . $e->getMessage() . '
    '; - return; - } - - $videoEntryToUpdate->setVideoTitle($newVideoTitle); - $videoEntryToUpdate->setVideoDescription($newVideoDescription); - $videoEntryToUpdate->setVideoCategory($newVideoCategory); - - // convert tags from space separated to comma separated - $videoTagsArray = explode(' ', trim($newVideoTags)); - - // strip out empty array elements - foreach($videoTagsArray as $key => $value) { - if (strlen($value) < 2) { - unset($videoTagsArray[$key]); - } - } - - $videoEntryToUpdate->setVideoTags(implode(', ', $videoTagsArray)); - - try { - $updatedEntry = $youTubeService->updateEntry($videoEntryToUpdate, $putUrl); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not post video meta-data: ' . $e->getMessage(); - return; - } - print 'Entry updated successfully.
    ' - . '(refresh your video listing)
    ' - . printCacheWarning(); -} - -/** - * Create upload form by sending the incoming video meta-data to youtube and - * retrieving a new entry. Prints form HTML to page. - * - * @param string $VideoTitle The title for the video entry. - * @param string $VideoDescription The description for the video entry. - * @param string $VideoCategory The category for the video entry. - * @param string $VideoTags The set of tags for the video entry (whitespace separated). - * @param string $nextUrl (optional) The URL to redirect back to after form upload has completed. - * @return void - */ -function createUploadForm($videoTitle, $videoDescription, $videoCategory, $videoTags, $nextUrl = null) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $newVideoEntry = new Zend_Gdata_YouTube_VideoEntry(); - - $newVideoEntry->setVideoTitle($videoTitle); - $newVideoEntry->setVideoDescription($videoDescription); - - //make sure first character in category is capitalized - $videoCategory = strtoupper(substr($videoCategory, 0, 1)) - . substr($videoCategory, 1); - $newVideoEntry->setVideoCategory($videoCategory); - - // convert videoTags from whitespace separated into comma separated - $videoTagsArray = explode(' ', trim($videoTags)); - $newVideoEntry->setVideoTags(implode(', ', $videoTagsArray)); - - $tokenHandlerUrl = 'https://gdata.youtube.com/action/GetUploadToken'; - try { - $tokenArray = $youTubeService->getFormUploadToken($newVideoEntry, $tokenHandlerUrl); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not retrieve token for syndicated upload. ' - . $e->getMessage() - . '
    ' - . 'click here to view details of last request
    '; - return; - } - - $tokenValue = $tokenArray['token']; - $postUrl = $tokenArray['url']; - - // place to redirect user after upload - if (!$nextUrl) { - $nextUrl = $_SESSION['homeUrl']; - } - - print <<< END -
    - - - - -END; -} - -/** - * Deletes a Video. - * - * @param string $videoId Id of the video to be deleted. - * @return void - */ -function deleteVideo($videoId) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getVideoFeed('https://gdata.youtube.com/feeds/users/default/uploads'); - $videoEntryToDelete = null; - - foreach($feed as $entry) { - if ($entry->getVideoId() == $videoId) { - $videoEntryToDelete = $entry; - break; - } - } - - // check if videoEntryToUpdate was found - if (!$videoEntryToDelete instanceof Zend_Gdata_YouTube_VideoEntry) { - print 'ERROR - Could not find a video entry with id ' . $videoId . '
    '; - return; - } - - try { - $httpResponse = $youTubeService->delete($videoEntryToDelete); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not delete video: '. $e->getMessage(); - return; - } - - print 'Entry deleted succesfully.
    ' . $httpResponse->getBody() - . '
    (refresh your video listing)
    ' - . printCacheWarning(); -} - -/** - * Enables logging. - * - * @param string $loggingOption 'on' to turn logging on, 'off' to turn logging off. - * @param integer|null $maxLogItems Maximum items to log, default is 10. - * @return void - */ -function setLogging($loggingOption, $maxLogItems = 10) -{ - switch ($loggingOption) { - case 'on' : - $_SESSION['logging'] = 'on'; - $_SESSION['log_currentCounter'] = 0; - $_SESSION['log_maxLogEntries'] = $maxLogItems; - break; - - case 'off': - $_SESSION['logging'] = 'off'; - break; - } -} - -/** - * Check whether logging is enabled. - * - * @return boolean Return true if session variable for logging is set to 'on'. - */ -function loggingEnabled() -{ - if ($_SESSION['logging'] == 'on') { - return true; - } -} - -/** - * Unset a specific session variable. - * - * @param string $name Name of the session variable to delete. - * @return void - */ -function clearSessionVar($name) -{ - if (isset($_SESSION[$name])) { - unset($_SESSION[$name]); - } - header('Location: session_details.php'); -} - -/** - * Generate an AuthSub request Link and print it to the page. - * - * @param string $nextUrl URL to redirect to after performing the authentication. - * @return void - */ -function generateAuthSubRequestLink($nextUrl = null) -{ - $scope = 'https://gdata.youtube.com'; - $secure = false; - $session = true; - - if (!$nextUrl) { - generateUrlInformation(); - $nextUrl = $_SESSION['operationsUrl']; - } - - $url = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session); - echo 'Click here to authenticate with YouTube'; -} - -/** - * Upgrade the single-use token to a session token. - * - * @param string $singleUseToken A valid single use token that is upgradable to a session token. - * @return void - */ -function updateAuthSubToken($singleUseToken) -{ - try { - $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken); - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Token upgrade for ' . $singleUseToken - . ' failed : ' . $e->getMessage(); - return; - } - - $_SESSION['sessionToken'] = $sessionToken; - generateUrlInformation(); - header('Location: ' . $_SESSION['homeUrl']); -} - -/** - * Convenience method to obtain an authenticted Zend_Http_Client object. - * - * @return Zend_Http_Client An authenticated client. - */ -function getAuthSubHttpClient() -{ - try { - $httpClient = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']); - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not obtain authenticated Http client object. ' - . $e->getMessage(); - return; - } - $httpClient->setHeaders('X-GData-Key', 'key='. $_SESSION['developerKey']); - return $httpClient; -} - -/** - * Echo img tags for the first thumbnail representing each video in the - * specified video feed. Upon clicking the thumbnails, the video should - * be presented. - * - * @param Zend_Gdata_YouTube_VideoFeed $feed The video feed - * @return void - */ -function echoThumbnails($feed) -{ - foreach ($feed as $entry) { - $videoId = $entry->getVideoId(); - $firstThumbnail = htmlspecialchars( - $entry->mediaGroup->thumbnail[0]->url); - echo ''; - } -} - -/** - * Echo the list of videos in the specified feed. - * - * @param Zend_Gdata_YouTube_VideoFeed $feed The video feed. - * @param boolean|null $authenticated If true then the videoList will - * attempt to create additional forms to edit video meta-data. - * @return void - */ -function echoVideoList($feed, $authenticated = false) -{ - $table = '
    Ran PHP Installation Checker on " . - gmdate('c') . "
    " . $key . "Tested
    No errors found
    Tested
    " . $error_count . "" . $error . "
    Not tested
    '; - $results = 0; - - foreach ($feed as $entry) { - $videoId = $entry->getVideoId(); - $thumbnailUrl = 'notfound.jpg'; - if (count($entry->mediaGroup->thumbnail) > 0) { - $thumbnailUrl = htmlspecialchars( - $entry->mediaGroup->thumbnail[0]->url); - } - - $videoTitle = htmlspecialchars($entry->getVideoTitle()); - $videoDescription = htmlspecialchars($entry->getVideoDescription()); - $videoCategory = htmlspecialchars($entry->getVideoCategory()); - $videoTags = $entry->getVideoTags(); - - $table .= '' - . '' - . ''; - $results++; - } - - if ($results < 1) { - echo '
    No results found

    '; - } else { - echo $table .'
    '. stripslashes($videoTitle) . '' - . '

    ' - . stripslashes($videoDescription) . '

    ' - . '

    category: ' . $videoCategory - . '

    tagged: ' - . htmlspecialchars(implode(', ', $videoTags)) . '

    '; - - if ($authenticated) { - $table .= '

    ' - . 'edit video data | ' - . 'delete this video


    '; - } - - $table .= '

    '; - } -} - -/** - * Echo the video embed code, related videos and videos owned by the same user - * as the specified videoId. - * - * @param string $videoId The video - * @return void - */ -function echoVideoPlayer($videoId) -{ - $youTubeService = new Zend_Gdata_YouTube(); - - try { - $entry = $youTubeService->getVideoEntry($videoId); - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } - - $videoTitle = htmlspecialchars($entry->getVideoTitle()); - $videoUrl = htmlspecialchars(findFlashUrl($entry)); - $relatedVideoFeed = getRelatedVideos($entry->getVideoId()); - $topRatedFeed = getTopRatedVideosByUser($entry->author[0]->name); - - print <<$videoTitle

    - - - - - -END; - - echo '
    '; - echoVideoMetadata($entry); - echo '
    Related:
    '; - echoThumbnails($relatedVideoFeed); - echo '
    Top rated videos by user:
    '; - echoThumbnails($topRatedFeed); -} - -/** - * Returns a feed of videos related to the specified video - * - * @param string $videoId The video - * @return Zend_Gdata_YouTube_VideoFeed The feed of related videos - */ -function getRelatedVideos($videoId) -{ - $youTubeService = new Zend_Gdata_YouTube(); - $ytQuery = $youTubeService->newVideoQuery(); - // show videos related to the specified video - $ytQuery->setFeedType('related', $videoId); - // order videos by rating - $ytQuery->setOrderBy('rating'); - // retrieve a maximum of 5 videos - $ytQuery->setMaxResults(5); - // retrieve only embeddable videos - $ytQuery->setFormat(5); - return $youTubeService->getVideoFeed($ytQuery); -} - -/** - * Returns a feed of top rated videos for the specified user - * - * @param string $user The username - * @return Zend_Gdata_YouTube_VideoFeed The feed of top rated videos - */ -function getTopRatedVideosByUser($user) -{ - $userVideosUrl = 'https://gdata.youtube.com/feeds/users/' . - $user . '/uploads'; - $youTubeService = new Zend_Gdata_YouTube(); - $ytQuery = $youTubeService->newVideoQuery($userVideosUrl); - // order by the rating of the videos - $ytQuery->setOrderBy('rating'); - // retrieve a maximum of 5 videos - $ytQuery->setMaxResults(5); - // retrieve only embeddable videos - $ytQuery->setFormat(5); - return $youTubeService->getVideoFeed($ytQuery); -} - -/** - * Echo video metadata - * - * @param Zend_Gdata_YouTube_VideoEntry $entry The video entry - * @return void - */ -function echoVideoMetadata($entry) -{ - $title = htmlspecialchars($entry->getVideoTitle()); - $description = htmlspecialchars($entry->getVideoDescription()); - $authorUsername = htmlspecialchars($entry->author[0]->name); - $authorUrl = 'http://www.youtube.com/profile?user=' . - $authorUsername; - $tags = htmlspecialchars(implode(', ', $entry->getVideoTags())); - $duration = htmlspecialchars($entry->getVideoDuration()); - $watchPage = htmlspecialchars($entry->getVideoWatchPageUrl()); - $viewCount = htmlspecialchars($entry->getVideoViewCount()); - $rating = 0; - if (isset($entry->rating->average)) { - $rating = $entry->rating->average; - } - $numRaters = 0; - if (isset($entry->rating->numRaters)) { - $numRaters = $entry->rating->numRaters; - } - $flashUrl = htmlspecialchars(findFlashUrl($entry)); - print <<Title:
    ${title}
    - Description: ${description}
    - Author: ${authorUsername}
    - Tags: ${tags}
    - Duration: ${duration} seconds
    - View count: ${viewCount}
    - Rating: ${rating} (${numRaters} ratings)
    - Flash: ${flashUrl}
    - Watch page: ${watchPage}
    -END; -} - -/** - * Print message about YouTube caching. - * - * @return string A message - */ -function printCacheWarning() -{ - return '

    ' - . 'Please note that the change may not be reflected in the API ' - . 'immediately due to caching.
    ' - . 'Please refer to the API documentation for more details.

    '; -} - -/** - * Retrieve playlists for the currently authenticated user and print. - * @return void - */ -function retrievePlaylists() -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getPlaylistListFeed('default'); - - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - - if (!$feed instanceof Zend_Gdata_YouTube_PlaylistListFeed) { - print 'ERROR - Could not retrieve playlists
    '. - printCacheWarning(); - return; - } - - $playlistEntries = '
      '; - $entriesFound = 0; - foreach($feed as $entry) { - $playlistTitle = $entry->getTitleValue(); - $playlistDescription = $entry->getDescription()->getText(); - $playlistEntries .= '
    • ' . $playlistTitle - . '

      ' . $playlistDescription . ' | ' - . 'update | ' - . 'delete
    • '; - $entriesFound++; - } - - $playlistEntries .= '

    ' - . 'Add new playlist
    ' - . '
    '; - - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - if ($entriesFound > 0) { - print $playlistEntries; - } else { - print 'No playlists found'; - } -} - -/** - * Create a new playlist for the currently authenticated user - * - * @param string $playlistTitle Title of the new playlist - * @param string $playlistDescription Description for the new playlist - * @return void - */ -function createPlaylist($playlistTitle, $playlistDescription) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getPlaylistListFeed('default'); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - - $newPlaylist = $youTubeService->newPlaylistListEntry(); - $newPlaylist->description = $youTubeService->newDescription()->setText($playlistDescription); - $newPlaylist->title = $youTubeService->newTitle()->setText($playlistDescription); - - if (!$feed instanceof Zend_Gdata_YouTube_PlaylistListFeed) { - print 'ERROR - Could not retrieve playlists
    ' - . printCacheWarning(); - return; - } - - $playlistFeedUrl = 'https://gdata.youtube.com/feeds/users/default/playlists'; - - try { - $updatedEntry = $youTubeService->insertEntry($newPlaylist, $playlistFeedUrl); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not create new playlist: ' . $e->getMessage(); - return; - } - - print 'Playlist added succesfully.
    (refresh your playlist listing)
    ' - . printCacheWarning(); -} - -/** - * Delete a playlist - * - * @param string $playlistTitle Title of the playlist to be deleted - * @return void - */ -function deletePlaylist($playlistTitle) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getPlaylistListFeed('default'); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - - $playlistEntryToDelete = null; - - foreach($feed as $playlistEntry) { - if ($playlistEntry->getTitleValue() == $playlistTitle) { - $playlistEntryToDelete = $playlistEntry; - break; - } - } - - if (!$playlistEntryToDelete instanceof Zend_Gdata_YouTube_PlaylistListEntry) { - print 'ERROR - Could not retrieve playlist to be deleted
    ' - . printCacheWarning(); - return; - } - - try { - $response = $playlistEntryToDelete->delete(); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not delete the playlist: ' . $e->getMessage(); - return; - } - - print 'Playlist deleted succesfully.
    ' - . '' - . '(refresh your playlist listing)
    ' . printCacheWarning(); -} - -/** - * Delete a playlist - * - * @param string $newplaylistTitle New title for the playlist to be updated - * @param string $newPlaylistDescription New description for the playlist to be updated - * @param string $oldPlaylistTitle Title of the playlist to be updated - * @return void - */ -function updatePlaylist($newPlaylistTitle, $newPlaylistDescription, $oldPlaylistTitle) -{ - $httpClient = getAuthSubHttpClient(); - $youTubeService = new Zend_Gdata_YouTube($httpClient); - $feed = $youTubeService->getPlaylistListFeed('default'); - - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - - $playlistEntryToDelete = null; - - foreach($feed as $playlistEntry) { - if ($playlistEntry->getTitleValue() == $oldplaylistTitle) { - $playlistEntryToDelete = $playlistEntry; - break; - } - } - - if (!$playlistEntryToDelete instanceof Zend_Gdata_YouTube_PlaylistListEntry) { - print 'ERROR - Could not retrieve playlist to be updated
    ' - . printCacheWarning(); - return; - } - - try { - $response = $playlistEntryToDelete->delete(); - if (loggingEnabled()) { - logMessage($httpClient->getLastRequest(), 'request'); - logMessage($httpClient->getLastResponse()->getBody(), 'response'); - } - } catch (Zend_Gdata_App_HttpException $httpException) { - print 'ERROR ' . $httpException->getMessage() - . ' HTTP details

    ' - . '' - . 'click here to view details of last request
    '; - return; - } catch (Zend_Gdata_App_Exception $e) { - print 'ERROR - Could not delete the playlist: ' . $e->getMessage(); - return; - } - - print 'Playlist deleted succesfully.
    (refresh your playlist listing)
    '. - printCacheWarning(); -} - -/** - * Helper function if an unsupported operation is passed into this files main loop. - * - * @param array $post (Optional) The post variables that accompanied the operation, if available. - * @return void - */ -function unsupportedOperation($post) -{ - $message = 'ERROR An unsupported operation has been called - post variables received ' - . print_r($post, true); - - if (loggingEnabled()) { - logMessage($message, 'error'); - } - print $message; -} - -?> diff --git a/demos/Zend/Gdata/YouTubeVideoApp/session_details.php b/demos/Zend/Gdata/YouTubeVideoApp/session_details.php deleted file mode 100755 index 0dfb393ff8..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/session_details.php +++ /dev/null @@ -1,66 +0,0 @@ -= 5.2.11 - * This sample is run from within a web browser. These files are required: - * session_details.php - a script to view log output and session variables - * operations.php - the main logic, which interfaces with the YouTube API - * index.php - the HTML to represent the web UI, contains some PHP - * video_app.css - the CSS to define the interface style - * video_app.js - the JavaScript used to provide the video list AJAX interface - * - * NOTE: If using in production, some additional precautions with regards - * to filtering the input data should be used. This code is designed only - * for demonstration purposes. - */ -session_start(); -?> - - - YouTube data API Video Browser in PHP - Session Viewer - - - - -
    -
    -

    Session variables


    -
    - $value) { - - print '

    '. $key . '

    '. $value .'

    '. - '
    ' . - ''. - ''. - '

    '; -} -?> -
    -back -
    diff --git a/demos/Zend/Gdata/YouTubeVideoApp/video_app.css b/demos/Zend/Gdata/YouTubeVideoApp/video_app.css deleted file mode 100755 index 0e4a743e05..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/video_app.css +++ /dev/null @@ -1,236 +0,0 @@ -body { - background-color: #fff; - color: #232323; - font-family: Arial, sans-serif; - font-size: small; - margin: 8px; - margin-top: 3px; -} - -/* TODO jhartman --> swap out with css from app engine apps -*/ - - -img { - border: 0; -} - -table { - border-collapse: collapse; -} - -th, td { - padding: 0; - vertical-align: top; - text-align: left; -} - -a:link { - color: #0000cc; -} - -a:active { - color: #cc0000; -} - -a:visited { - color: #551a8b; -} - -h1 { - font-size: x-large; - margin-top: 0px; - margin-bottom: 5px; -} - -h2 { - font-size: large; -} - -h3 { - font-size: medium; -} - -h4 { - font-size: small; -} - -form { - display: inline; - margin: 0; - padding: 0; -} - -li { - margin-bottom: 0.25em; -} - -pre, code { - color: #007000; - font-family: "bogus font here", monospace; - font-size: 100%; -} - -pre { - border: 1px solid silver; - background-color: #f5f5f5; - padding: 0.5em; - overflow: auto; - margin: 2em; -} - -pre ins { - color: #cc0000; - font-weight: bold; - text-decoration: none; -} - -/* forms */ -textarea { - width: 600px; - border: 1px solid #ddd; - padding: 5px; -} - -.submit { - border: 1px solid #ddd; -} - -input, select{ - border: 1px solid #ddd; - margin-bottom: 2px; -} - -hr { - border: none; - border-bottom: 1px solid #ddd; -} - -/* "Selected" links */ -a.selected, .selected a, .selected { - color: black; - font-weight: bold; - text-decoration: none; -} - -a.selected:visited, .selected a:visited { - color: black; -} - -p.videoDescription { - margin: 0; - padding: 0; - overflow: scroll; - font-size: small; -} - -p.videoCategory { - margin: 0; - padding: 0; - /* overflow: scroll; */ - font-size: x-small; -} - -p.videoTags { - margin: 0; - padding: 0; - /* overflow: scroll; */ - font-size: x-small; -} - -p.edit { - font-size: small; -} - -.note { - padding: 2px; - background-color: yellow; - color: #000; -} - -#editForm { - font-size: small; -} - -table.videoList { - width: 100%; -} - -.videoList td { - padding: 10px 0px 5px 5px; - border-bottom: 1px solid silver; -} - -#titleBar { - border: 1px solid silver; - background-color: #e5ecf9; - margin: 0; - padding: 0; - padding-top: 5px; - padding-bottom: 10px; - padding-left: 10px; - padding-right: 10px; - margin-top: 5px; - margin-bottom: 15px; -} - -#titleText { - float: left; -} - -#searchBox { - float: right; -} - -#authStatus { - border-bottom: 1px solid #ddd; - padding: 2px; - margin-bottom: 10px; - -} - -#main { - margin: 10px; -} - -#mainSessions { - background-color: #ddd; - padding: 10px; -} - -#searchResults { - width: 100%; - background-color: silver; -} - -#searchResultsListColumn { - float: left; - width: 47%; - margin-bottom: 20px; - padding-right: 2px; -} - -#searchResultsVideoColumn { - float: right; - width: 47%; - padding-left: 5px; - border-left: 1px solid #ddd; - -} - -#sessionVariable { - font-family: Courier, monospace; - background-color: #fff; - padding: 10px; - width: 80%; - overflow: scroll; -} - -.thumbnail { - padding: 0px 0px 0px 2px; -} - -#imageLoadThumbnail { - padding: 4px; - background-color: #333; -} diff --git a/demos/Zend/Gdata/YouTubeVideoApp/video_app.js b/demos/Zend/Gdata/YouTubeVideoApp/video_app.js deleted file mode 100755 index 6ec22308f4..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoApp/video_app.js +++ /dev/null @@ -1,582 +0,0 @@ -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Gdata - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ - -/** - * @fileoverview Provides functions for browsing and searching YouTube - * data API feeds, as well as performing authentication, syndicated uploads - * and playlist management using a PHP backend powered by the Zend_Gdata component - * of Zend Framework. - */ - -/** - * provides namespacing for the YouTube Video Application PHP version (ytVideoApp) - */ -var ytVideoApp = {}; - -/** - * maximum number of results to return for list of videos - * @type Number - */ -ytVideoApp.MAX_RESULTS_LIST = 5; - -/** - * navigation button id used to page to the previous page of - * results in the list of videos - * @type String - */ -ytVideoApp.PREVIOUS_PAGE_BUTTON = 'previousPageButton'; - -/** - * navigation button id used to page to the next page of - * results in the list of videos - * @type String - */ -ytVideoApp.NEXT_PAGE_BUTTON = 'nextPageButton'; - -/** - * container div for navigation elements - * @type String - */ -ytVideoApp.NAVIGATION_DIV = 'navigationForm'; - -/** - * container div id used to hold list of videos - * @type String - */ -ytVideoApp.VIDEO_LIST_CONTAINER_DIV = 'searchResultsVideoList'; - -/** - * container div id used to hold video search results - * @type String - */ -ytVideoApp.VIDEO_SEARCH_RESULTS_DIV = 'searchResultsVideoColumn'; - -/** - * container div id used to hold the video player - * @type String - */ -ytVideoApp.VIDEO_PLAYER_DIV = 'videoPlayer'; - -/** - * container div id used to hold the search box displayed at the top of - * the browser after one search has already been performed - * @type String - */ -ytVideoApp.TOP_SEARCH_CONTAINER_DIV = 'searchBox'; - -/** container div to show detailed upload status - * @type String - */ -ytVideoApp.VIDEO_UPLOAD_STATUS = 'detailedUploadStatus'; - -/** - * container div to hold the form for syndicated upload - * @type String - */ -ytVideoApp.SYNDICATED_UPLOAD_DIV = 'syndicatedUploadDiv'; - -/** - * container div to hold the form to edit video meta-data - * @type String - */ -ytVideoApp.VIDEO_DATA_EDIT_DIV = 'editForm'; - -/** - * containder div to hold authentication link in special cases where auth gets - * set prior to developer key - * @type String - */ -ytVideoApp.AUTHSUB_REQUEST_DIV = 'generateAuthSubLink'; - -/** - * container div to hold the form for editing video meta-data - * @type String - */ -ytVideoApp.VIDEO_META_DATA_EDIT_DIV = 'editVideoMetaDataDiv'; - -/** - * container div to hold the form for adding a new playlist - * @type String - */ -ytVideoApp.PLAYLIST_ADD_DIV = 'addNewPlaylist'; - -/** - * the page number to use for the next page navigation button - * @type Number - */ -ytVideoApp.nextPage = 2; - -/** - * the page number to use for the previous page navigation button - * @type Number - */ -ytVideoApp.previousPage = 0; - -/** - * the last search term used to query - allows for the navigation - * buttons to know what string query to perform when clicked - * @type String - */ -ytVideoApp.previousSearchTerm = ''; - -/** - * the last query type used for querying - allows for the navigation - * buttons to know what type of query to perform when clicked - * @type String - */ -ytVideoApp.previousQueryType = 'all'; - -/** - * Retrieves a list of videos matching the provided criteria. The list of - * videos can be restricted to a particular standard feed or search criteria. - * @param {String} op The type of action to be done. - * for querying all videos, or the name of a standard feed. - * @param {String} searchTerm The search term(s) to use for querying as the - * 'vq' query parameter value - * @param {Number} page The 1-based page of results to return. - */ -ytVideoApp.listVideos = function(op, searchTerm, page) { - ytVideoApp.previousSearchTerm = searchTerm; - ytVideoApp.previousQueryType = op; - var maxResults = ytVideoApp.MAX_RESULTS_LIST; - var startIndex = (((page - 1) * ytVideoApp.MAX_RESULTS_LIST) + 1); - ytVideoApp.presentFeed(op, maxResults, startIndex, searchTerm); - ytVideoApp.updateNavigation(page); -}; - -/** - * Sends an AJAX request to the server to retrieve a list of videos or - * the video player/metadata. Sends the request to the specified filePath - * on the same host, passing the specified params, and filling the specified - * resultDivName with the resutls upon success. - * @param {String} filePath The path to which the request should be sent - * @param {String} params The URL encoded POST params - * @param {String} resultDivName The name of the DIV used to hold the results - */ -ytVideoApp.sendRequest = function(filePath, params, resultDivName) { - if (window.XMLHttpRequest) { - var xmlhr = new XMLHttpRequest(); - } else { - var xmlhr = new ActiveXObject('MSXML2.XMLHTTP.3.0'); - } - - xmlhr.open('POST', filePath); - xmlhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - - xmlhr.onreadystatechange = function() { - var resultDiv = document.getElementById(resultDivName); - if (xmlhr.readyState == 1) { - resultDiv.innerHTML = 'Loading...'; - } else if (xmlhr.readyState == 4 && xmlhr.status == 200) { - if (xmlhr.responseText) { - resultDiv.innerHTML = xmlhr.responseText; - } - } else if (xmlhr.readyState == 4) { - alert('Invalid response received - Status: ' + xmlhr.status); - } - } - xmlhr.send(params); -} - -/** - * Uses ytVideoApp.sendRequest to display a YT video player and metadata for the - * specified video ID. - * @param {String} videoId The ID of the YouTube video to show - */ -ytVideoApp.presentVideo = function(videoId, updateThumbnail) { - var params = 'operation=show_video&videoId=' + videoId; - var filePath = 'operations.php'; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_PLAYER_DIV); -} - -/** - * Creates a form to enter video meta-data in preparation for syndicated upload. - */ -ytVideoApp.prepareUploadForm = function() { - var metaDataForm = ['
    ', - 'Enter video title:

    ', - 'Enter video description:

    ', - 'Select a category:
    ', - 'Enter some tags to describe your video ', - '(separated by spaces):
    ', - '
    ', - '', - '
    '].join(''); - - document.getElementById(ytVideoApp.SYNDICATED_UPLOAD_DIV).innerHTML = metaDataForm; -} - -/** - * Uses ytVideoApp.sendRequest to prepare a syndicated upload. - * - * @param {String} videoTitle The title for new video - * @param {String} videoDescription The video's description - * @param {String} videoCategory The category for the video - * @param {String} videoTags A white-space separated string of Tags - */ -ytVideoApp.prepareSyndicatedUpload = function(videoTitle, videoDescription, videoCategory, videoTags) { - var filePath = 'operations.php'; - var params = 'operation=create_upload_form' + - '&videoTitle=' + videoTitle + - '&videoDescription=' + videoDescription + - '&videoCategory=' + videoCategory + - '&videoTags=' + videoTags; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.SYNDICATED_UPLOAD_DIV); -} - -/** - * Uses ytVideoApp.sendRequest to create the authSub link. - */ -ytVideoApp.presentAuthLink = function() { - var filePath = 'operations.php'; - var params = 'operation=auth_sub_request'; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.AUTHSUB_REQUEST_DIV); -} - - -/** - * Uses ytVideoApp.sendRequest to check a videos upload status. - * - * @param {String} videoId The id of the video to check - */ -ytVideoApp.checkUploadDetails = function(videoId) { - var filePath = 'operations.php'; - var params = 'operation=check_upload_status' + - '&videoId=' + videoId; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_UPLOAD_STATUS); -} - - -/** - * Creates an HTML form to edit a video's meta-data, populated with the - * videos current meta-data. - * - * @param {String} oldVideoTitle The old title of the video - * @param {String} oldVideoDescription The old description of the video - * @param {String} oldVideoCategory The old category of the video - * @param {String} oldVideoTags The old tags for the video (separated by white-space) - * @param {String} videoId The id of the video to be edited - */ -ytVideoApp.presentMetaDataEditForm = function(oldVideoTitle, oldVideoDescription, oldVideoCategory, oldVideoTags, videoId) { - // split oldVideoTags by comma and present as whitespace separated - var oldVideoTagsArray = oldVideoTags.split(','); - oldVideoTags = oldVideoTagsArray.join(' '); - var editMetaDataForm = ['
    ', - 'Enter a new video title:
    ', - '
    ', - 'Enter a new video description:
    ', - '
    ', - 'Select a new category:
    ', - 'Enter some new tags to describe your video ', - '(separated by spaces):
    ', - '
    ', - '
    ', - '', - '
    '].join(''); - - document.getElementById(ytVideoApp.VIDEO_SEARCH_RESULTS_DIV).innerHTML = editMetaDataForm; -} - -/** - * Uses ytVideoApp.sendRequest to submit updated video meta-data. - * - * @param {String} newVideoTitle The new title of the video - * @param {String} newVideoDescription The new description of the video - * @param {String} newVideoCategory The new category of the video - * @param {String} newVideoTags The new tags for the video (separated by white-space) - * @param {String} videoId The id of the video to be edited - */ -ytVideoApp.editMetaData = function(newVideoTitle, newVideoDescription, newVideoCategory, newVideoTags, videoId) { - var filePath = 'operations.php'; - var params = 'operation=edit_meta_data' + - '&newVideoTitle=' + newVideoTitle + - '&newVideoDescription=' + newVideoDescription + - '&newVideoCategory=' + newVideoCategory + - '&newVideoTags=' + newVideoTags + - '&videoId=' + videoId; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_SEARCH_RESULTS_DIV); -}; - - -/** - * Confirms whether user wants to delete a video. - * @param {String} videoId The video Id to be deleted - */ -ytVideoApp.confirmDeletion = function(videoId) { - var answer = confirm('Do you really want to delete the video with id: ' + videoId + ' ?'); - if (answer) { - ytVideoApp.prepareDeletion(videoId); - } -} - -/** - * Uses ytVideoApp.sendRequest to request a video to be deleted. - * @param {String} videoId The video Id to be deleted - */ -ytVideoApp.prepareDeletion = function(videoId) { - var filePath = 'operations.php'; - var params = 'operation=delete_video' + - '&videoId=' + videoId; - - var table = document.getElementById('videoResultList'); - var indexOfRowToBeDeleted = -1; - var tableRows = document.getElementsByTagName('TR'); - for (var i = 0, tableRow; tableRow = tableRows[i]; i++) { - if (tableRow.id == videoId) { - indexOfRowToBeDeleted = i; - } - } - if (indexOfRowToBeDeleted > -1) { - table.deleteRow(indexOfRowToBeDeleted); - } - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_SEARCH_RESULTS_DIV); -} - -/** - * Uses ytVideoApp.sendRequest to display a list of of YT videos. - * @param {String} op The operation to perform to retrieve a feed - * @param {Number} maxResults The maximum number of videos to list - * @param {Number} startIndex The first video to include in the list - * @param {String} searchTerm The search terms to pass to the specified feed - */ -ytVideoApp.presentFeed = function(op, maxResults, startIndex, searchTerm){ - var params = 'operation=' + op + - '&maxResults=' + maxResults + - '&startIndex=' + startIndex + - '&searchTerm=' + searchTerm; - var filePath = 'operations.php'; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_LIST_CONTAINER_DIV); -}; - -/** - * Updates the variables used by the navigation buttons and the 'enabled' - * status of the buttons based upon the current page number passed in. - * @param {Number} page The current page number - */ -ytVideoApp.updateNavigation = function(page) { - ytVideoApp.nextPage = page + 1; - ytVideoApp.previousPage = page - 1; - document.getElementById(ytVideoApp.NEXT_PAGE_BUTTON).style.display = 'inline'; - document.getElementById(ytVideoApp.PREVIOUS_PAGE_BUTTON).style.display = 'inline'; - if (ytVideoApp.previousPage < 1) { - document.getElementById(ytVideoApp.PREVIOUS_PAGE_BUTTON).disabled = true; - } else { - document.getElementById(ytVideoApp.PREVIOUS_PAGE_BUTTON).disabled = false; - } - document.getElementById(ytVideoApp.NEXT_PAGE_BUTTON).disabled = false; -}; - -/** - * Hides the navigation. - */ -ytVideoApp.hideNavigation = function() { - document.getElementById(ytVideoApp.NAVIGATION_DIV).style.display = 'none'; -}; - -/** - * Update video results div - */ -ytVideoApp.refreshSearchResults = function() { - document.getElementById(ytVideoApp.VIDEO_SEARCH_RESULTS_DIV).innerHTML = ''; -} - -/** - * Method called when the query type has been changed. Clears out the - * value of the search term input box by default if one of the standard - * feeds is selected. This is to improve usability, as many of the standard - * feeds may not include results for even fairly popular search terms. - * @param {String} op The operation to perform. - * for querying all videos, or the name of one of the standard feeds. - * @param {Node} searchTermInputElement The HTML input element for the input - * element. - */ -ytVideoApp.queryTypeChanged = function(op, searchTermInputElement) { - if (op == 'search_username') { - searchTermInputElement.value = '-- enter username --'; - } else if (op != 'search_all') { - searchTermInputElement.value = ''; - } -}; - -/** - * Create a basic HTML form to use for creating a new playlist. - */ -ytVideoApp.prepareCreatePlaylistForm = function() { - var newPlaylistForm = ['
    ', - 'Enter a title for the new playlist:
    ', - '
    ', - 'Enter a description:
    ', - '
    ', - '', - '
    '].join(''); - - document.getElementById(ytVideoApp.PLAYLIST_ADD_DIV).innerHTML = newPlaylistForm; -} - -/** -* Uses ytVideoApp.sendRequest to create a new playlist. -* -* @param {String} playlistTitle The title of the new playlist -* @param {String} playlistDescription A description of the new playlist -*/ -ytVideoApp.createNewPlaylist = function(playlistTitle, playlistDescription) { - var filePath = 'operations.php'; - var params = 'operation=create_playlist' + - '&playlistTitle=' + playlistTitle + - '&playlistDescription=' + playlistDescription; - ytVideoApp.hideNavigation(); - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_SEARCH_RESULTS_DIV); -} - -/** - * Confirm user wants to delete a playlist - * - * @param {String} playlistTitle The title of the playlist to be deleted - */ -ytVideoApp.confirmPlaylistDeletion = function(playlistTitle) { - var answer = confirm('Do you really want to delete the playlist titled : ' + - playlistTitle + ' ?'); - if (answer) { - ytVideoApp.deletePlaylist(playlistTitle); - } -} - -/** -* Uses ytVideoApp.sendRequest to delete a playlist. -* -* @param {String} playlistTitle The title of the new playlist -*/ -ytVideoApp.deletePlaylist = function(playlistTitle) { - var filePath = 'operations.php'; - var params = 'operation=delete_playlist' + - '&playlistTitle=' + playlistTitle; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_SEARCH_RESULTS_DIV); -} - -/** - * Create a basic HTML form to use for modifying a playlist. - * - * @param {String} oldPlaylistTitle The old title of the playlist - * @param {String} oldPlaylistDescription The old description of the playlist - */ -ytVideoApp.prepareUpdatePlaylistForm = function(oldPlaylistTitle, oldPlaylistDescription) { - var playlistUpdateForm = ['
    ', - 'Enter a title for the new playlist:
    ', - '
    ', - 'Enter a description:
    ', - '
    ', - '', - '', - '
    '].join(''); - - document.getElementById(ytVideoApp.VIDEO_SEARCH_RESULTS_DIV).innerHTML = playlistUpdateForm; -} - -/** -* Uses ytVideoApp.sendRequest to update a playlist. -* -* @param {String} newPlaylistTitle The new title of the playlist -* @param {String} newPlaylistDescription A new description of the playlist -*/ -ytVideoApp.updatePlaylist = function(newPlaylistTitle, newPlaylistDescription, oldPlaylistTitle) { - var filePath = 'operations.php'; - var params = 'operation=update_playlist' + - '&newPlaylistTitle=' + newPlaylistTitle + - '&newPlaylistDescription=' + newPlaylistDescription + - '&oldPlaylistTitle=' + oldPlaylistTitle; - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_LIST_CONTAINER_DIV); -} - -/** -* Uses ytVideoApp.sendRequest to retrieve a users playlist. -* -*/ -ytVideoApp.retrievePlaylists = function() { - var filePath = 'operations.php'; - var params = 'operation=retrieve_playlists'; - ytVideoApp.hideNavigation(); - ytVideoApp.sendRequest(filePath, params, ytVideoApp.VIDEO_LIST_CONTAINER_DIV); -} diff --git a/demos/Zend/Gdata/YouTubeVideoBrowser/index.php b/demos/Zend/Gdata/YouTubeVideoBrowser/index.php deleted file mode 100755 index 6b9dc38ec4..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoBrowser/index.php +++ /dev/null @@ -1,278 +0,0 @@ -= 5.2.11 - * - * This sample is run from within a web browser. These files are required: - * index.php - the main logic, which interfaces with the YouTube API - * interface.html - the HTML to represent the web UI - * web_browser.css - the CSS to define the interface style - * web_browser.js - the JavaScript used to provide the video list AJAX interface - * - * NOTE: If using in production, some additional precautions with regards - * to filtering the input data should be used. This code is designed only - * for demonstration purposes. - */ - -/** - * @see Zend_Loader - */ -require_once 'Zend/Loader.php'; - -/** - * @see Zend_Gdata_YouTube - */ -Zend_Loader::loadClass('Zend_Gdata_YouTube'); - -/** - * Finds the URL for the flash representation of the specified video - * - * @param Zend_Gdata_YouTube_VideoEntry $entry The video entry - * @return string|null The URL or null, if the URL is not found - */ -function findFlashUrl($entry) -{ - foreach ($entry->mediaGroup->content as $content) { - if ($content->type === 'application/x-shockwave-flash') { - return $content->url; - } - } - return null; -} - -/** - * Returns a feed of top rated videos for the specified user - * - * @param string $user The username - * @return Zend_Gdata_YouTube_VideoFeed The feed of top rated videos - */ -function getTopRatedVideosByUser($user) -{ - $userVideosUrl = 'https://gdata.youtube.com/feeds/users/' . - $user . '/uploads'; - $yt = new Zend_Gdata_YouTube(); - $ytQuery = $yt->newVideoQuery($userVideosUrl); - // order by the rating of the videos - $ytQuery->setOrderBy('rating'); - // retrieve a maximum of 5 videos - $ytQuery->setMaxResults(5); - // retrieve only embeddable videos - $ytQuery->setFormat(5); - return $yt->getVideoFeed($ytQuery); -} - -/** - * Returns a feed of videos related to the specified video - * - * @param string $videoId The video - * @return Zend_Gdata_YouTube_VideoFeed The feed of related videos - */ -function getRelatedVideos($videoId) -{ - $yt = new Zend_Gdata_YouTube(); - $ytQuery = $yt->newVideoQuery(); - // show videos related to the specified video - $ytQuery->setFeedType('related', $videoId); - // order videos by rating - $ytQuery->setOrderBy('rating'); - // retrieve a maximum of 5 videos - $ytQuery->setMaxResults(5); - // retrieve only embeddable videos - $ytQuery->setFormat(5); - return $yt->getVideoFeed($ytQuery); -} - -/** - * Echo img tags for the first thumbnail representing each video in the - * specified video feed. Upon clicking the thumbnails, the video should - * be presented. - * - * @param Zend_Gdata_YouTube_VideoFeed $feed The video feed - * @return void - */ -function echoThumbnails($feed) -{ - foreach ($feed as $entry) { - $videoId = $entry->getVideoId(); - echo ''; - } -} - -/** - * Echo the video embed code, related videos and videos owned by the same user - * as the specified videoId. - * - * @param string $videoId The video - * @return void - */ -function echoVideoPlayer($videoId) -{ - $yt = new Zend_Gdata_YouTube(); - - $entry = $yt->getVideoEntry($videoId); - $videoTitle = $entry->mediaGroup->title; - $videoUrl = findFlashUrl($entry); - $relatedVideoFeed = getRelatedVideos($entry->getVideoId()); - $topRatedFeed = getTopRatedVideosByUser($entry->author[0]->name); - - print <<$videoTitle

    - - - - - -END; - echo '
    '; - echoVideoMetadata($entry); - echo '
    Related:
    '; - echoThumbnails($relatedVideoFeed); - echo '
    Top rated videos by user:
    '; - echoThumbnails($topRatedFeed); -} - -/** - * Echo video metadata - * - * @param Zend_Gdata_YouTube_VideoEntry $entry The video entry - * @return void - */ -function echoVideoMetadata($entry) -{ - $title = $entry->mediaGroup->title; - $description = $entry->mediaGroup->description; - $authorUsername = $entry->author[0]->name; - $authorUrl = 'http://www.youtube.com/profile?user=' . $authorUsername; - $tags = $entry->mediaGroup->keywords; - $duration = $entry->mediaGroup->duration->seconds; - $watchPage = $entry->mediaGroup->player[0]->url; - $viewCount = $entry->statistics->viewCount; - $rating = $entry->rating->average; - $numRaters = $entry->rating->numRaters; - $flashUrl = findFlashUrl($entry); - print <<Title:
    ${title}
    - Description: ${description}
    - Author: ${authorUsername}
    - Tags: ${tags}
    - Duration: ${duration} seconds
    - View count: ${viewCount}
    - Rating: ${rating} (${numRaters} ratings)
    - Flash: ${flashUrl}
    - Watch page: ${watchPage}
    -END; -} - -/** - * Echo the list of videos in the specified feed. - * - * @param Zend_Gdata_YouTube_VideoFeed $feed The video feed - * @return void - */ -function echoVideoList($feed) -{ - echo ''; - echo ''; - foreach ($feed as $entry) { - $videoId = $entry->getVideoId(); - $thumbnailUrl = $entry->mediaGroup->thumbnail[0]->url; - $videoTitle = $entry->mediaGroup->title; - $videoDescription = $entry->mediaGroup->description; - print << - - - -END; - } - echo '
    - ${videoTitle} -

    ${videoDescription}

    -
    '; -} - -/* - * The main controller logic of the YouTube video browser demonstration app. - */ -$queryType = isset($_POST['queryType']) ? $_POST['queryType'] : null; - -if ($queryType === null) { - /* display the entire interface */ - include 'interface.html'; -} else if ($queryType == 'show_video') { - /* display an individual video */ - if (array_key_exists('videoId', $_POST)) { - $videoId = $_POST['videoId']; - echoVideoPlayer($videoId); - } else if (array_key_exists('videoId', $_GET)) { - $videoId = $_GET['videoId']; - echoVideoPlayer($videoId); - } else { - echo 'No videoId found.'; - exit; - } -} else { - /* display a list of videos */ - $searchTerm = $_POST['searchTerm']; - $startIndex = $_POST['startIndex']; - $maxResults = $_POST['maxResults']; - - $yt = new Zend_Gdata_YouTube(); - $query = $yt->newVideoQuery(); - $query->setQuery($searchTerm); - $query->setStartIndex($startIndex); - $query->setMaxResults($maxResults); - - /* check for one of the standard feeds, or list from 'all' videos */ - switch ($queryType) { - case 'most_viewed': - $query->setFeedType('most viewed'); - $query->setTime('this_week'); - $feed = $yt->getVideoFeed($query); - break; - case 'most_recent': - $query->setFeedType('most recent'); - $feed = $yt->getVideoFeed($query); - break; - case 'recently_featured': - $query->setFeedType('recently featured'); - $feed = $yt->getVideoFeed($query); - break; - case 'top_rated': - $query->setFeedType('top rated'); - $query->setTime('this_week'); - $feed = $yt->getVideoFeed($query); - break; - case 'all': - $feed = $yt->getVideoFeed($query); - break; - default: - echo 'ERROR - unknown queryType - "' . $queryType . '"'; - break; - } - echoVideoList($feed); -} diff --git a/demos/Zend/Gdata/YouTubeVideoBrowser/interface.html b/demos/Zend/Gdata/YouTubeVideoBrowser/interface.html deleted file mode 100644 index ce70aec37e..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoBrowser/interface.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - YouTube data API Video Browser in PHP - - - - -
    -
    -

    YouTube data API Video Browser in PHP

    - -
    -
    -
    -
    -

    Search YouTube:

    -
    - - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - diff --git a/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.css b/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.css deleted file mode 100644 index 1984ed996b..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.css +++ /dev/null @@ -1,152 +0,0 @@ -body { - background-color: white; - color: black; - font-family: Arial, sans-serif; - font-size: small; - margin: 8px; - margin-top: 3px; -} - -img { - border: 0; -} - -table { - border-collapse: collapse; -} - -th, td { - padding: 0; - vertical-align: top; - text-align: left; -} - -a:link { - color: #0000cc; -} - -a:active { - color: #cc0000; -} - -a:visited { - color: #551a8b; -} - -h1 { - font-size: x-large; - margin-top: 0px; - margin-bottom: 5px; -} - -h2 { - font-size: large; -} - -h3 { - font-size: medium; -} - -h4 { - font-size: small; -} - -form { - display: inline; - margin: 0; - padding: 0; -} - -li { - margin-bottom: 0.25em; -} - -pre, code { - color: #007000; - font-family: "bogus font here", monospace; - font-size: 100%; -} - -pre { - border: 1px solid silver; - background-color: #f5f5f5; - padding: 0.5em; - overflow: auto; - margin: 2em; -} - -pre ins { - color: #cc0000; - font-weight: bold; - text-decoration: none; -} - -/* "Selected" links */ - -a.selected, .selected a, .selected { - color: black; - font-weight: bold; - text-decoration: none; -} - -a.selected:visited, .selected a:visited { - color: black; -} - -p.videoDescription { - font-size: small; - margin: 0; - padding: 0; -} - -.videoList td { - padding-bottom: 5px; - padding-right: 5px; -} - -#titleBar { - border: 1px solid silver; - background-color: #e5ecf9; - font-size: large; - font-weight: bold; - margin: 0; - padding: 0; - padding-top: 5px; - padding-bottom: 10px; - padding-left: 10px; - padding-right: 10px; - margin-top: 5px; - margin-bottom: 15px; -} - -#titleText { - float: left; -} - -#searchBox { - float: right; -} - -#mainSearchBox { - background-color: #e5ecf9; - border: 1px solid silver; - width: 250; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 10px; - padding-right: 10px; -} - -#searchResults { - width: 100%; -} - -#searchResultsListColumn { - float: left; - width: 47%; -} - -#searchResultsVideoColumn { - float: right; - width: 47%; -} diff --git a/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.js b/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.js deleted file mode 100644 index 16a81f8b59..0000000000 --- a/demos/Zend/Gdata/YouTubeVideoBrowser/video_browser.js +++ /dev/null @@ -1,228 +0,0 @@ -/** - * Zend Framework - * - * LICENSE - * - * This source file is subject to the new BSD license that is bundled - * with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://framework.zend.com/license/new-bsd - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@zend.com so we can send you a copy immediately. - * - * @category Zend - * @package Zend_Gdata - * @subpackage Demos - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ - -/** - * @fileoverview Provides functions for browsing and searching YouTube - * data API feeds using a PHP backend powered by the Zend_Gdata component - * of the Zend Framework. - */ - -/** - * provides namespacing for the YouTube Video Browser PHP version (ytvbp) - */ -var ytvbp = {}; - -/** - * maximum number of results to return for list of videos - * @type Number - */ -ytvbp.MAX_RESULTS_LIST = 5; - -/** - * navigation button id used to page to the previous page of - * results in the list of videos - * @type String - */ -ytvbp.PREVIOUS_PAGE_BUTTON = 'previousPageButton'; - -/** - * navigation button id used to page to the next page of - * results in the list of videos - * @type String - */ -ytvbp.NEXT_PAGE_BUTTON = 'nextPageButton'; - -/** - * container div id used to hold list of videos - * @type String - */ -ytvbp.VIDEO_LIST_CONTAINER_DIV = 'searchResultsVideoList'; - -/** - * container div id used to hold the video player - * @type String - */ -ytvbp.VIDEO_PLAYER_DIV = 'videoPlayer'; - -/** - * container div id used to hold the search box which displays when the page - * first loads - * @type String - */ -ytvbp.MAIN_SEARCH_CONTAINER_DIV = 'mainSearchBox'; - -/** - * container div id used to hold the search box displayed at the top of - * the browser after one search has already been performed - * @type String - */ -ytvbp.TOP_SEARCH_CONTAINER_DIV = 'searchBox'; - -/** - * the page number to use for the next page navigation button - * @type Number - */ -ytvbp.nextPage = 2; - -/** - * the page number to use for the previous page navigation button - * @type Number - */ -ytvbp.previousPage = 0; - -/** - * the last search term used to query - allows for the navigation - * buttons to know what string query to perform when clicked - * @type String - */ -ytvbp.previousSearchTerm = ''; - -/** - * the last query type used for querying - allows for the navigation - * buttons to know what type of query to perform when clicked - * @type String - */ -ytvbp.previousQueryType = 'all'; - -/** - * Retrieves a list of videos matching the provided criteria. The list of - * videos can be restricted to a particular standard feed or search criteria. - * @param {String} queryType The type of query to be done - either 'all' - * for querying all videos, or the name of a standard feed. - * @param {String} searchTerm The search term(s) to use for querying as the - * 'vq' query parameter value - * @param {Number} page The 1-based page of results to return. - */ -ytvbp.listVideos = function(queryType, searchTerm, page) { - ytvbp.previousSearchTerm = searchTerm; - ytvbp.previousQueryType = queryType; - var maxResults = ytvbp.MAX_RESULTS_LIST; - var startIndex = (((page - 1) * ytvbp.MAX_RESULTS_LIST) + 1); - ytvbp.presentFeed(queryType, maxResults, startIndex, searchTerm); - ytvbp.updateNavigation(page); -}; - -/** - * Sends an AJAX request to the server to retrieve a list of videos or - * the video player/metadata. Sends the request to the specified filePath - * on the same host, passing the specified params, and filling the specified - * resultDivName with the resutls upon success. - * @param {String} filePath The path to which the request should be sent - * @param {String} params The URL encoded POST params - * @param {String} resultDivName The name of the DIV used to hold the results - */ -ytvbp.sendRequest = function(filePath, params, resultDivName) { - if (window.XMLHttpRequest) { - var xmlhr = new XMLHttpRequest(); - } else { - var xmlhr = new ActiveXObject('MSXML2.XMLHTTP.3.0'); - } - - xmlhr.open('POST', filePath, true); - xmlhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - - xmlhr.onreadystatechange = function() { - var resultDiv = document.getElementById(resultDivName); - if (xmlhr.readyState == 1) { - resultDiv.innerHTML = 'Loading...'; - } else if (xmlhr.readyState == 4 && xmlhr.status == 200) { - if (xmlhr.responseText) { - resultDiv.innerHTML = xmlhr.responseText; - } - } else if (xmlhr.readyState == 4) { - alert('Invalid response received - Status: ' + xmlhr.status); - } - } - xmlhr.send(params); -} - -/** - * Uses ytvbp.sendRequest to display a YT video player and metadata for the - * specified video ID. - * @param {String} videoId The ID of the YouTube video to show - */ -ytvbp.presentVideo = function(videoId) { - var params = 'queryType=show_video&videoId=' + videoId; - var filePath = 'index.php'; - ytvbp.sendRequest(filePath, params, ytvbp.VIDEO_PLAYER_DIV); -} - -/** - * Uses ytvbp.sendRequest to display a list of of YT videos. - * @param {String} queryType The name of a standard video feed or 'all' - * @param {Number} maxResults The maximum number of videos to list - * @param {Number} startIndex The first video to include in the list - * @param {String} searchTerm The search terms to pass to the specified feed - */ -ytvbp.presentFeed = function(queryType, maxResults, startIndex, searchTerm){ - var params = 'queryType=' + queryType + - '&maxResults=' + maxResults + - '&startIndex=' + startIndex + - '&searchTerm=' + searchTerm; - var filePath = 'index.php'; - ytvbp.sendRequest(filePath, params, ytvbp.VIDEO_LIST_CONTAINER_DIV); -} - -/** - * Updates the variables used by the navigation buttons and the 'enabled' - * status of the buttons based upon the current page number passed in. - * @param {Number} page The current page number - */ -ytvbp.updateNavigation = function(page) { - ytvbp.nextPage = page + 1; - ytvbp.previousPage = page - 1; - document.getElementById(ytvbp.NEXT_PAGE_BUTTON).style.display = 'inline'; - document.getElementById(ytvbp.PREVIOUS_PAGE_BUTTON).style.display = 'inline'; - if (ytvbp.previousPage < 1) { - document.getElementById(ytvbp.PREVIOUS_PAGE_BUTTON).disabled = true; - } else { - document.getElementById(ytvbp.PREVIOUS_PAGE_BUTTON).disabled = false; - } - document.getElementById(ytvbp.NEXT_PAGE_BUTTON).disabled = false; -}; - -/** - * Hides the main (large) search form and enables one that's in the - * title bar of the application. The main search form is only used - * for the first load. Subsequent searches should use the version in - * the title bar. - */ -ytvbp.hideMainSearch = function() { - document.getElementById(ytvbp.MAIN_SEARCH_CONTAINER_DIV).style.display = - 'none'; - document.getElementById(ytvbp.TOP_SEARCH_CONTAINER_DIV).style.display = - 'inline'; -}; - -/** - * Method called when the query type has been changed. Clears out the - * value of the search term input box by default if one of the standard - * feeds is selected. This is to improve usability, as many of the standard - * feeds may not include results for even fairly popular search terms. - * @param {String} queryType The type of query being done - either 'all' - * for querying all videos, or the name of one of the standard feeds. - * @param {Node} searchTermInputElement The HTML input element for the input - * element. - */ -ytvbp.queryTypeChanged = function(queryType, searchTermInputElement) { - if (queryType != 'all') { - searchTermInputElement.value = ''; - } -}; diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 0868f0c14b..a259771a0e 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -27,7 +27,6 @@ require_once 'Zend/Acl/AclTest.php'; require_once 'Zend/Amf/AllTests.php'; -require_once 'Zend/Application/AllTests.php'; require_once 'Zend/AuthTest.php'; require_once 'Zend/Auth/AllTests.php'; require_once 'Zend/Cache/AllTests.php'; @@ -43,7 +42,6 @@ require_once 'Zend/File/AllTests.php'; require_once 'Zend/FilterTest.php'; require_once 'Zend/Filter/AllTests.php'; -require_once 'Zend/Gdata/AllTests.php'; require_once 'Zend/Http/AllTests.php'; require_once 'Zend/JsonTest.php'; require_once 'Zend/Json/AllTests.php'; @@ -149,37 +147,24 @@ public static function suite() // Start remaining tests... $suite->addTestSuite('Zend_Acl_AclTest'); $suite->addTest(Zend_Amf_AllTests::suite()); - $suite->addTest(Zend_Application_AllTests::suite()); $suite->addTestSuite('Zend_AuthTest'); $suite->addTest(Zend_Auth_AllTests::suite()); - $suite->addTest(Zend_Barcode_AllTests::suite()); $suite->addTest(Zend_Cache_AllTests::suite()); - $suite->addTest(Zend_Captcha_AllTests::suite()); - $suite->addTest(Zend_Cloud_AllTests::suite()); - $suite->addTest(Zend_CodeGenerator_Php_AllTests::suite()); $suite->addTestSuite('Zend_ConfigTest'); $suite->addTest(Zend_Config_AllTests::suite()); $suite->addTestSuite('Zend_Console_GetoptTest'); - $suite->addTest(Zend_Controller_AllTests::suite()); $suite->addTestSuite('Zend_CurrencyTest'); $suite->addTest(Zend_Crypt_AllTests::suite()); $suite->addTestSuite('Zend_DateTest'); $suite->addTest(Zend_Date_AllTests::suite()); $suite->addTest(Zend_Db_AllTests::suite()); - $suite->addTestSuite('Zend_DebugTest'); - $suite->addTest(Zend_Dom_AllTests::suite()); - $suite->addTest(Zend_EventManager_AllTests::suite()); $suite->addTestSuite('Zend_ExceptionTest'); - $suite->addTest(Zend_Feed_AllTests::suite()); $suite->addTest(Zend_File_AllTests::suite()); $suite->addTestSuite('Zend_FilterTest'); $suite->addTest(Zend_Filter_AllTests::suite()); - $suite->addTest(Zend_Form_AllTests::suite()); - $suite->addTest(Zend_Gdata_AllTests::suite()); $suite->addTest(Zend_Http_AllTests::suite()); $suite->addTestSuite('Zend_JsonTest'); $suite->addTest(Zend_Json_AllTests::suite()); - $suite->addTest(Zend_Layout_AllTests::suite()); $suite->addTest(Zend_Ldap_AllTests::suite()); $suite->addTestSuite('Zend_LoaderTest'); $suite->addTest(Zend_Loader_AllTests::suite()); @@ -192,20 +177,15 @@ public static function suite() $suite->addTestSuite('Zend_MimeTest'); $suite->addTest(Zend_Mime_AllTests::suite()); $suite->addTestSuite('Zend_NavigationTest'); - $suite->addTest(Zend_Navigation_AllTests::suite()); $suite->addTest(Zend_Oauth_AllTests::suite()); - $suite->addTest(Zend_Paginator_AllTests::suite()); $suite->addTestSuite('Zend_PdfTest'); $suite->addTest(Zend_Pdf_AllTests::suite()); $suite->addTest(Zend_ProgressBar_AllTests::suite()); $suite->addTestSuite('Zend_RegistryTest'); - $suite->addTest(Zend_Rest_AllTests::suite()); - $suite->addTest(Zend_Reflection_AllTests::suite()); $suite->addTest(Zend_Queue_AllTests::suite()); $suite->addTest(Zend_Search_Lucene_AllTests::suite()); $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); - $suite->addTest(Zend_Service_AllTests::suite()); $suite->addTest(Zend_Tag_AllTests::suite()); $suite->addTest(Zend_Test_AllTests::suite()); $suite->addTest(Zend_Text_AllTests::suite()); @@ -217,9 +197,6 @@ public static function suite() $suite->addTest(Zend_Uri_AllTests::suite()); $suite->addTestSuite('Zend_ValidateTest'); $suite->addTest(Zend_Validate_AllTests::suite()); - $suite->addTestSuite('Zend_ViewTest'); - $suite->addTest(Zend_View_AllTests::suite()); - $suite->addTestSuite('Zend_VersionTest'); if (PHP_OS != 'AIX') { $suite->addTest(Zend_Wildfire_AllTests::suite()); } diff --git a/tests/Zend/Gdata/AllTests.php b/tests/Zend/Gdata/AllTests.php deleted file mode 100644 index ceca677924..0000000000 --- a/tests/Zend/Gdata/AllTests.php +++ /dev/null @@ -1,386 +0,0 @@ -addTestSuite('Zend_Gdata_AuthSubTest'); - - /** - * Tests that do not require online access to servers - */ - $suite->addTestSuite('Zend_Gdata_AppTest'); - $suite->addTestSuite('Zend_Gdata_App_UtilTest'); - $suite->addTestSuite('Zend_Gdata_App_BaseTest'); - $suite->addTestSuite('Zend_Gdata_App_AuthorTest'); - $suite->addTestSuite('Zend_Gdata_App_CategoryTest'); - $suite->addTestSuite('Zend_Gdata_App_ContentTest'); - $suite->addTestSuite('Zend_Gdata_App_ControlTest'); - $suite->addTestSuite('Zend_Gdata_App_EntryTest'); - $suite->addTestSuite('Zend_Gdata_App_FeedTest'); - $suite->addTestSuite('Zend_Gdata_App_GeneratorTest'); - $suite->addTestSuite('Zend_Gdata_App_CaptchaRequiredExceptionTest'); - $suite->addTestSuite('Zend_Gdata_GdataTest'); - $suite->addTestSuite('Zend_Gdata_QueryTest'); - - $suite->addTestSuite('Zend_Gdata_AttendeeStatusTest'); - $suite->addTestSuite('Zend_Gdata_AttendeeTypeTest'); - $suite->addTestSuite('Zend_Gdata_CommentsTest'); - $suite->addTestSuite('Zend_Gdata_EntryTest'); - $suite->addTestSuite('Zend_Gdata_FeedTest'); - $suite->addTestSuite('Zend_Gdata_EntryLinkTest'); - $suite->addTestSuite('Zend_Gdata_EventStatusTest'); - $suite->addTestSuite('Zend_Gdata_ExtendedPropertyTest'); - $suite->addTestSuite('Zend_Gdata_FeedLinkTest'); - $suite->addTestSuite('Zend_Gdata_OpenSearchItemsPerPageTest'); - $suite->addTestSuite('Zend_Gdata_OpenSearchStartIndexTest'); - $suite->addTestSuite('Zend_Gdata_OpenSearchTotalResultsTest'); - $suite->addTestSuite('Zend_Gdata_OriginalEventTest'); - $suite->addTestSuite('Zend_Gdata_RecurrenceTest'); - $suite->addTestSuite('Zend_Gdata_RecurrenceExceptionTest'); - $suite->addTestSuite('Zend_Gdata_ReminderTest'); - $suite->addTestSuite('Zend_Gdata_TransparencyTest'); - $suite->addTestSuite('Zend_Gdata_VisibilityTest'); - $suite->addTestSuite('Zend_Gdata_WhenTest'); - $suite->addTestSuite('Zend_Gdata_WhereTest'); - $suite->addTestSuite('Zend_Gdata_WhoTest'); - - $suite->addTestSuite('Zend_Gdata_CalendarTest'); - $suite->addTestSuite('Zend_Gdata_CalendarFeedTest'); - $suite->addTestSuite('Zend_Gdata_CalendarEventTest'); - $suite->addTestSuite('Zend_Gdata_CalendarFeedCompositeTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_EventQueryTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_EventQueryExceptionTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_EventEntryTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_AccessLevelTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_ColorTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_HiddenTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_LinkTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_SelectedTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_SendEventNotificationsTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_TimezoneTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_WebContentTest'); - $suite->addTestSuite('Zend_Gdata_Calendar_QuickAddTest'); - - $suite->addTestSuite('Zend_Gdata_Spreadsheets_ColCountTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_RowCountTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_CellTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_CustomTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_WorksheetEntryTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_CellEntryTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_ListEntryTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_SpreadsheetFeedTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_WorksheetFeedTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_CellFeedTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_ListFeedTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_DocumentQueryTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_CellQueryTest'); - $suite->addTestSuite('Zend_Gdata_Spreadsheets_ListQueryTest'); - - $suite->addTestSuite('Zend_Gdata_Docs_DocumentListFeedTest'); - $suite->addTestSuite('Zend_Gdata_Docs_DocumentListEntryTest'); - $suite->addTestSuite('Zend_Gdata_Docs_QueryTest'); - - $suite->addTestSuite('Zend_Gdata_Photos_PhotosAlbumEntryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosAlbumFeedTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosAlbumQueryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosCommentEntryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosPhotoEntryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosPhotoFeedTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosPhotoQueryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosTagEntryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosUserEntryTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosUserFeedTest'); - $suite->addTestSuite('Zend_Gdata_Photos_PhotosUserQueryTest'); - - $suite->addTestSuite('Zend_Gdata_GappsTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListRecipientEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListRecipientFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListRecipientQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_EmailListTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_ErrorTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_GroupEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_GroupFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_GroupQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_LoginTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_MemberEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_MemberFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_MemberQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_NameTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_NicknameEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_NicknameFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_NicknameQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_NicknameTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_OwnerEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_OwnerFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_OwnerQueryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_PropertyTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_QuotaTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_ServiceExceptionTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_UserEntryTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_UserFeedTest'); - $suite->addTestSuite('Zend_Gdata_Gapps_UserQueryTest'); - - $suite->addTestSuite('Zend_Gdata_Books_CollectionEntryTest'); - $suite->addTestSuite('Zend_Gdata_Books_CollectionFeedTest'); - $suite->addTestSuite('Zend_Gdata_Books_VolumeEntryTest'); - $suite->addTestSuite('Zend_Gdata_Books_VolumeFeedTest'); - - $skippingOnlineTests = true; - if (defined('TESTS_ZEND_GDATA_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_ONLINE_ENABLED') == true && - defined('TESTS_ZEND_GDATA_CLIENTLOGIN_ENABLED') && - constant('TESTS_ZEND_GDATA_CLIENTLOGIN_ENABLED') == true) { - /** - * Tests that do require online access to servers - * and authentication credentials - */ - $skippingOnlineTests = false; - if (defined('TESTS_ZEND_GDATA_BLOGGER_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_BLOGGER_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_GdataOnlineTest'); - } - - if (defined('TESTS_ZEND_GDATA_CALENDAR_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_CALENDAR_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_CalendarOnlineTest'); - } - - if (defined('TESTS_ZEND_GDATA_SPREADSHEETS_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_SPREADSHEETS_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_SpreadsheetsOnlineTest'); - } - - if (defined('TESTS_ZEND_GDATA_DOCS_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_DOCS_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_DocsOnlineTest'); - } - - if (defined('TESTS_ZEND_GDATA_PHOTOS_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_PHOTOS_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_PhotosOnlineTest'); - } - - if (defined('TESTS_ZEND_GDATA_BOOKS_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_BOOKS_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_BooksOnlineTest'); - } - } - if (defined('TESTS_ZEND_GDATA_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_ONLINE_ENABLED') == true) { - /** - * Tests that do require online access to servers, but - * don't require the standard authentication credentials - */ - $skippingOnlineTests = false; - if (defined('TESTS_ZEND_GDATA_GAPPS_ONLINE_ENABLED') && - constant('TESTS_ZEND_GDATA_GAPPS_ONLINE_ENABLED') == true) { - $suite->addTestSuite('Zend_Gdata_GappsOnlineTest'); - } - } - if ($skippingOnlineTests) { - $suite->addTestSuite('Zend_Gdata_SkipOnlineTest'); - } - return $suite; - } - -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Gdata_AllTests::main') { - Zend_Gdata_AllTests::main(); -} diff --git a/tests/Zend/Gdata/Analytics/AccountFeedTest.php b/tests/Zend/Gdata/Analytics/AccountFeedTest.php deleted file mode 100755 index 18d24bf0aa..0000000000 --- a/tests/Zend/Gdata/Analytics/AccountFeedTest.php +++ /dev/null @@ -1,71 +0,0 @@ -accountFeed = new Zend_Gdata_Analytics_AccountFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestAccountFeed.xml') - ); - } - - public function testAccountFeed() - { - $this->assertEquals(2, count($this->accountFeed->entries)); - - foreach ($this->accountFeed->entries as $entry) { - $this->assertInstanceOf('Zend_Gdata_Analytics_AccountEntry', $entry); - } - } - - public function testFirstAccountProperties() - { - $account = $this->accountFeed->entries[0]; - $this->assertEquals(876543, "{$account->accountId}"); - $this->assertEquals('foobarbaz', "{$account->accountName}"); - $this->assertInstanceOf('Zend_GData_App_Extension_Link', $account->link[0]); - } - - public function testSecondAccountProperties() - { - $account = $this->accountFeed->entries[1]; - $this->assertEquals(23456789, "{$account->accountId}"); - $this->assertEquals('brain dump', "{$account->accountName}"); - $this->assertInstanceOf('Zend_GData_App_Extension_Link', $account->link[0]); - } -} diff --git a/tests/Zend/Gdata/Analytics/AccountQueryTest.php b/tests/Zend/Gdata/Analytics/AccountQueryTest.php deleted file mode 100644 index 9354de2cc9..0000000000 --- a/tests/Zend/Gdata/Analytics/AccountQueryTest.php +++ /dev/null @@ -1,126 +0,0 @@ -accountQuery = new Zend_GData_Analytics_AccountQuery(); - $this->queryBase = Zend_GData_Analytics_AccountQuery::ANALYTICS_FEED_URI; - } - - public function testWebpropertiesAll() - { - $this->accountQuery->webproperties(); - $allQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/~all/webproperties', - $allQuery - ); - } - - public function testWebpropertiesSpecific() - { - $this->accountQuery->webproperties(12345678); - $specificQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/12345678/webproperties', - $specificQuery - ); - } - - public function testProfilesAll() - { - $this->accountQuery->profiles(); - $allQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/~all/webproperties/~all/profiles', - $allQuery - ); - } - - public function testProfilesSpecific() - { - $this->accountQuery->profiles('U-87654321-0', 87654321); - $specificQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/87654321/webproperties/U-87654321-0/profiles', - $specificQuery - ); - } - - public function testGoalsAll() - { - $this->accountQuery->goals(); - $allQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/~all/webproperties/~all/profiles/~all/goals', - $allQuery - ); - } - - public function testGoalsSpecific() - { - $this->accountQuery->goals(42, 'U-87654321-0', 87654321); - $specificQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/87654321/webproperties/U-87654321-0/profiles/42/goals', - $specificQuery - ); - } - - public function testChainedProperties() - { - $this->accountQuery - ->goals(42) - ->profiles('U-87654321-0') - ->webproperties(87654321); - $specificQuery = $this->accountQuery->getQueryUrl(); - - $this->assertEquals( - $this->queryBase . '/87654321/webproperties/U-87654321-0/profiles/42/goals', - $specificQuery - ); - } -} diff --git a/tests/Zend/Gdata/Analytics/DataFeedTest.php b/tests/Zend/Gdata/Analytics/DataFeedTest.php deleted file mode 100644 index fc37899faf..0000000000 --- a/tests/Zend/Gdata/Analytics/DataFeedTest.php +++ /dev/null @@ -1,80 +0,0 @@ - 12, - 'foobar.de' => 3, - 'foobarbaz.ch' => 1, - 'baz.ch' => 1, - ); - /** @var DataFeed */ - public $dataFeed; - - public function setUp() - { - $this->dataFeed = new Zend_Gdata_Analytics_DataFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestDataFeed.xml') - ); - } - - public function testDataFeed() - { - $count = count($this->testData); - $this->assertEquals(count($this->dataFeed->entries), $count); - $this->assertEquals($this->dataFeed->entries->count(), $count); - foreach ($this->dataFeed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Analytics_DataEntry); - } - } - - public function testGetters() - { - $sources = array_keys($this->testData); - $values = array_values($this->testData); - - foreach ($this->dataFeed as $index => $row) { - $source = $row->getDimension(Zend_Gdata_Analytics_DataQuery::DIMENSION_SOURCE); - $medium = $row->getDimension('ga:medium'); - $visits = $row->getMetric('ga:visits'); - $visitsValue = $row->getValue('ga:visits'); - - $this->assertEquals("$medium", 'referral'); - $this->assertEquals("$source", $sources[$index]); - $this->assertEquals("$visits", $values[$index]); - $this->assertEquals("$visitsValue", $values[$index]); - } - } -} diff --git a/tests/Zend/Gdata/Analytics/DataQueryTest.php b/tests/Zend/Gdata/Analytics/DataQueryTest.php deleted file mode 100644 index a5be3baaba..0000000000 --- a/tests/Zend/Gdata/Analytics/DataQueryTest.php +++ /dev/null @@ -1,101 +0,0 @@ -dataQuery = new Zend_GData_Analytics_DataQuery(); - } - - public function testProfileId() - { - $this->assertTrue($this->dataQuery->getProfileId() == null); - $this->dataQuery->setProfileId(123456); - $this->assertTrue($this->dataQuery->getProfileId() == 123456); - } - - public function testAddMetric() - { - $this->assertTrue(count($this->dataQuery->getMetrics()) == 0); - $this->dataQuery->addMetric(Zend_GData_Analytics_DataQuery::METRIC_BOUNCES); - $this->assertTrue(count($this->dataQuery->getMetrics()) == 1); - } - - public function testAddAndRemoveMetric() - { - $this->dataQuery->addMetric(Zend_GData_Analytics_DataQuery::METRIC_BOUNCES); - $this->dataQuery->removeMetric(Zend_GData_Analytics_DataQuery::METRIC_BOUNCES); - $this->assertTrue(count($this->dataQuery->getMetrics()) == 0); - } - - public function testAddDimension() - { - $this->assertTrue(count($this->dataQuery->getDimensions()) == 0); - $this->dataQuery->addDimension(Zend_GData_Analytics_DataQuery::DIMENSION_AD_SLOT); - $this->assertTrue(count($this->dataQuery->getDimensions()) == 1); - } - - public function testAddAndRemoveDimension() - { - $this->dataQuery->addDimension(Zend_GData_Analytics_DataQuery::DIMENSION_AD_SLOT); - $this->dataQuery->removeDimension(Zend_GData_Analytics_DataQuery::DIMENSION_AD_SLOT); - $this->assertTrue(count($this->dataQuery->getDimensions()) == 0); - } - - public function testQueryString() - { - $this->dataQuery - ->setProfileId(123456789) - ->addFilter('foo=bar') - ->addFilter('bar>2') - ->addOrFilter('baz=42') - ->addDimension(Zend_GData_Analytics_DataQuery::DIMENSION_CITY) - ->addMetric(Zend_GData_Analytics_DataQuery::METRIC_PAGEVIEWS) - ->addMetric(Zend_GData_Analytics_DataQuery::METRIC_VISITS); - $url = parse_url($this->dataQuery->getQueryUrl()); - parse_str($url['query'], $parameter); - - $this->assertEquals(count($parameter), 4); - $this->assertEquals($parameter['ids'], "ga:123456789"); - $this->assertEquals($parameter['dimensions'], "ga:city"); - $this->assertEquals($parameter['metrics'], "ga:pageviews,ga:visits"); - $this->assertEquals($parameter['filters'], 'foo=bar;bar>2,baz=42'); - } -} diff --git a/tests/Zend/Gdata/Analytics/_files/TestAccountFeed.xml b/tests/Zend/Gdata/Analytics/_files/TestAccountFeed.xml deleted file mode 100644 index 9d2b83a2a3..0000000000 --- a/tests/Zend/Gdata/Analytics/_files/TestAccountFeed.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - https://www.googleapis.com/analytics/v2.4/management/accounts - 2012-07-13T16:53:15.150Z - Google Analytics Accounts for mail@storkki.de - - - Google Analytics - - Google Analytics - 2 - 1 - 1000 - - https://www.googleapis.com/analytics/v2.4/management/accounts/876543 - 2010-03-02T16:04:23.720Z - Google Analytics Account foobarbaz - - - - - - - https://www.googleapis.com/analytics/v2.4/management/accounts/23456789 - 2011-05-17T06:53:24.385Z - Google Analytics Account brain dump - - - - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Analytics/_files/TestDataFeed.xml b/tests/Zend/Gdata/Analytics/_files/TestDataFeed.xml deleted file mode 100644 index 3d9b6479b8..0000000000 --- a/tests/Zend/Gdata/Analytics/_files/TestDataFeed.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - https://www.googleapis.com/analytics/v2.4/data?ids=ga:45678912&dimensions=ga:medium,ga:source,ga:browserVersion,ga:month&metrics=ga:bounces,ga:visits&sort=-ga:visits,ga:bounces&filters=ga:browser%3D%3DFirefox&start-date=2011-05-01&end-date=2011-05-31&start-index=1&max-results=50 - 2012-07-13T17:05:16.454Z - Google Analytics Data for Profile 45678912 - - - Google Analytics - - Google Analytics - 4 - 1 - 50 - - - - - false - - - - - ga:45678912 - www.foobar.de - - 2011-05-31 - 2011-05-01 - - https://www.googleapis.com/analytics/v2.4/data?ids=ga:45678912&ga:browserVersion=4.0.1&ga:medium=referral&ga:month=05&ga:source=foobarbaz.de&filters=ga:browser%3D%3DFirefox&start-date=2011-05-01&end-date=2011-05-31 - 2012-07-13T17:05:16.454Z - ga:medium=referral | ga:source=foobarbaz.de | ga:browserVersion=4.0.1 | ga:month=05 - - - - - - - - - - https://www.googleapis.com/analytics/v2.4/data?ids=ga:45678912&ga:browserVersion=3.6.17&ga:medium=referral&ga:month=05&ga:source=foobarbaz.de&filters=ga:browser%3D%3DFirefox&start-date=2011-05-01&end-date=2011-05-31 - 2012-07-13T17:05:16.454Z - ga:medium=referral | ga:source=foobar.de | ga:browserVersion=3.6.17 | ga:month=05 - - - - - - - - - - https://www.googleapis.com/analytics/v2.4/data?ids=ga:45678912&ga:browserVersion=3.5.19&ga:medium=referral&ga:month=05&ga:source=foobarbaz.ch&filters=ga:browser%3D%3DFirefox&start-date=2011-05-01&end-date=2011-05-31 - 2012-07-13T17:05:16.454Z - ga:medium=referral | ga:source=foobarbaz.ch | ga:browserVersion=3.5.19 | ga:month=05 - - - - - - - - - - https://www.googleapis.com/analytics/v2.4/data?ids=ga:45678912&ga:browserVersion=3.6.17&ga:medium=referral&ga:month=05&ga:source=foobarbaz.ch&filters=ga:browser%3D%3DFirefox&start-date=2011-05-01&end-date=2011-05-31 - 2012-07-13T17:05:16.454Z - ga:medium=referral | ga:source=baz.ch | ga:browserVersion=3.6.17 | ga:month=05 - - - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/App/AuthorTest.php b/tests/Zend/Gdata/App/AuthorTest.php deleted file mode 100644 index dee63acd7c..0000000000 --- a/tests/Zend/Gdata/App/AuthorTest.php +++ /dev/null @@ -1,118 +0,0 @@ -authorText = file_get_contents( - 'Zend/Gdata/App/_files/AuthorElementSample1.xml', - true); - $this->author = new Zend_Gdata_App_Extension_Author(); - } - - public function testEmptyAuthorShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->author->extensionElements)); - $this->assertTrue(count($this->author->extensionElements) == 0); - } - - public function testNormalAuthorShouldHaveNoExtensionElements() { - $this->author->name = new Zend_Gdata_App_Extension_Name('Jeff Scudder'); - $this->assertEquals($this->author->name->text, 'Jeff Scudder'); - $this->assertEquals(count($this->author->extensionElements), 0); - $newAuthor = new Zend_Gdata_App_Extension_Author(); - $newAuthor->transferFromXML($this->author->saveXML()); - $this->assertEquals(count($newAuthor->extensionElements), 0); - $newAuthor->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newAuthor->extensionElements), 1); - $this->assertEquals($newAuthor->name->text, 'Jeff Scudder'); - - /* try constructing using magic factory */ - $app = new Zend_Gdata_App(); - $newAuthor2 = $app->newAuthor(); - $newAuthor2->transferFromXML($newAuthor->saveXML()); - $this->assertEquals(count($newAuthor2->extensionElements), 1); - $this->assertEquals($newAuthor2->name->text, 'Jeff Scudder'); - } - - public function testEmptyAuthorToAndFromStringShouldMatch() { - $authorXml = $this->author->saveXML(); - $newAuthor = new Zend_Gdata_App_Extension_Author(); - $newAuthor->transferFromXML($authorXml); - $newAuthorXml = $newAuthor->saveXML(); - $this->assertTrue($authorXml == $newAuthorXml); - } - - public function testAuthorWithNameEmailToAndFromStringShouldMatch() { - $this->author->name = new Zend_Gdata_App_Extension_Name('Jeff Scudder'); - $this->author->email = new Zend_Gdata_App_Extension_Email( - 'api.jscudder@gmail.com'); - $this->author->uri = new Zend_Gdata_App_Extension_Uri( - 'http://code.google.com/apis/gdata/'); - $authorXml = $this->author->saveXML(); - $newAuthor = new Zend_Gdata_App_Extension_Author(); - $newAuthor->transferFromXML($authorXml); - $newAuthorXml = $newAuthor->saveXML(); - $this->assertTrue($authorXml == $newAuthorXml); - $this->assertEquals('Jeff Scudder', $newAuthor->name->text); - $this->assertEquals('api.jscudder@gmail.com', $newAuthor->email->text); - $this->assertEquals('http://code.google.com/apis/gdata/', $newAuthor->uri->text); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->author->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->author->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->author->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->author->extensionAttributes['foo2']['value']); - $authorXml = $this->author->saveXML(); - $newAuthor = new Zend_Gdata_App_Extension_Author(); - $newAuthor->transferFromXML($authorXml); - //var_dump($this->author); - //print $authorXml; - $this->assertEquals('bar', $newAuthor->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newAuthor->extensionAttributes['foo2']['value']); - } - - public function testConvertFullAuthorToAndFromString() { - $this->author->transferFromXML($this->authorText); - $this->assertEquals($this->author->name->text, 'John Doe'); - $this->assertEquals($this->author->email->text, - 'johndoes@someemailadress.com'); - $this->assertEquals($this->author->uri->text, 'http://www.google.com'); - } - -} diff --git a/tests/Zend/Gdata/App/BaseTest.php b/tests/Zend/Gdata/App/BaseTest.php deleted file mode 100644 index e5b0e9dff5..0000000000 --- a/tests/Zend/Gdata/App/BaseTest.php +++ /dev/null @@ -1,133 +0,0 @@ -fileName = 'Zend/Gdata/App/_files/FeedSample1.xml'; - $this->base = new Zend_Gdata_App_MockBase(); - } - - public function testUnknownNamespaceReturnsInput() { - $this->assertEquals('example', - $this->base->lookupNamespace('example')); - } - public function testAtomV1NamespaceReturnedByDefault() { - $this->assertEquals('http://www.w3.org/2005/Atom', - $this->base->lookupNamespace('atom')); - } - - public function testAtomPubV1NamespaceReturnedByDefault() { - $this->assertEquals('http://purl.org/atom/app#', - $this->base->lookupNamespace('app')); - } - - public function testAtomV1NamespaceReturnedWhenSpecifyingMajorVersion() { - $this->assertEquals('http://www.w3.org/2005/Atom', - $this->base->lookupNamespace('atom', - 1)); - } - - public function testAtomV1NamespaceReturnedWhenSpecifyingMajorAndMinorVersion() { - $this->assertEquals('http://www.w3.org/2005/Atom', - $this->base->lookupNamespace('atom', - 1, 0)); - } - - public function testAtomPubV1NamespaceReturnedWhenSpecifyingMajorVersion() { - $this->assertEquals('http://purl.org/atom/app#', - $this->base->lookupNamespace('app', - 1)); - } - - public function testAtomPubV1NamespaceReturnedWhenSpecifyingMajorAndMinorVersion() { - $this->assertEquals('http://purl.org/atom/app#', - $this->base->lookupNamespace('app', - 1, 0)); - } - - public function testAtomPubV2NamespaceReturnedWhenSpecifyingMajorVersion() { - $this->assertEquals('http://www.w3.org/2007/app', - $this->base->lookupNamespace('app', - 2)); - } - - public function testAtomPubV2NamespaceReturnedWhenSpecifyingMajorAndMinorVersion() { - $this->assertEquals('http://www.w3.org/2007/app', - $this->base->lookupNamespace('app', - 2, 0)); - } - - public function testNullReturnsLatestVersion() { - $this->assertEquals('http://www.w3.org/2007/app', - $this->base->lookupNamespace('app', - null, null)); - } - - public function testRegisterNamespaceWorksWithoutVersion() { - $ns = 'http://example.net/namespaces.foo'; - $prefix = 'foo'; - $this->base->registerNamespace($prefix, $ns); - $result = $this->base->lookupNamespace($prefix); - $this->assertEquals($ns, $result); - } - - public function testRegisterNamespaceAllowsSettingMajorVersion() { - $ns = 'http://example.net/namespaces.foo'; - $prefix = 'foo'; - $this->base->registerNamespace($prefix, 'wrong-1', 1); - $this->base->registerNamespace($prefix, $ns, 2); - $this->base->registerNamespace($prefix, 'wrong-3', 3); - $this->base->registerNamespace($prefix, 'wrong-4', 4); - $result = $this->base->lookupNamespace($prefix, 2); - $this->assertEquals($ns, $result); - } - - public function testRegisterNamespaceAllowsSettingMinorVersion() { - $ns = 'http://example.net/namespaces.foo'; - $prefix = 'foo'; - $this->base->registerNamespace($prefix, 'wrong-1', 1); - $this->base->registerNamespace($prefix, 'wrong-2-0', 2,0); - $this->base->registerNamespace($prefix, 'wrong-2-1', 2,1); - $this->base->registerNamespace($prefix, 'wrong-2-2', 2,2); - $this->base->registerNamespace($prefix, $ns, 2, 3); - $this->base->registerNamespace($prefix, 'wrong-2-4', 2,4); - $this->base->registerNamespace($prefix, 'wrong-3-0', 3-0); - $this->base->registerNamespace($prefix, 'wrong-3-1', 3-1); - $this->base->registerNamespace($prefix, 'wrong-4', 4); - $result = $this->base->lookupNamespace($prefix, 2, 3); - $this->assertEquals($ns, $result); - } - -} diff --git a/tests/Zend/Gdata/App/CaptchaRequiredExceptionTest.php b/tests/Zend/Gdata/App/CaptchaRequiredExceptionTest.php deleted file mode 100644 index 69ccd2fd68..0000000000 --- a/tests/Zend/Gdata/App/CaptchaRequiredExceptionTest.php +++ /dev/null @@ -1,58 +0,0 @@ -exampleException = new Zend_Gdata_App_CaptchaRequiredException('testtoken', 'Captcha?ctoken=testtoken'); - } - - public function testExceptionContainsValidInformation() { - $this->assertEquals('testtoken', $this->exampleException->getCaptchaToken()); - $this->assertEquals('https://www.google.com/accounts/Captcha?ctoken=testtoken', $this->exampleException->getCaptchaUrl()); - } - - public function testExceptionIsThrowable() { - $caught = false; - try { - throw $this->exampleException; - } - catch(Zend_Gdata_App_CaptchaRequiredException $e) { - $caught = true; - } - - $this->assertTrue($caught); - } - -} diff --git a/tests/Zend/Gdata/App/CategoryTest.php b/tests/Zend/Gdata/App/CategoryTest.php deleted file mode 100644 index 3f531614fc..0000000000 --- a/tests/Zend/Gdata/App/CategoryTest.php +++ /dev/null @@ -1,114 +0,0 @@ -categoryText = file_get_contents( - 'Zend/Gdata/App/_files/CategoryElementSample1.xml', - true); - $this->category = new Zend_Gdata_App_Extension_Category(); - } - - public function testEmptyCategoryShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->category->extensionElements)); - $this->assertTrue(count($this->category->extensionElements) == 0); - } - - public function testNormalCategoryShouldHaveNoExtensionElements() { - - $this->category->scheme = 'http://schemas.google.com/g/2005#kind'; - $this->assertEquals($this->category->scheme, 'http://schemas.google.com/g/2005#kind'); - $this->assertEquals(count($this->category->extensionElements), 0); - $newCategory = new Zend_Gdata_App_Extension_Category(); - $newCategory->transferFromXML($this->category->saveXML()); - $this->assertEquals(0, count($newCategory->extensionElements)); - $newCategory->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newCategory->extensionElements), 1); - $this->assertEquals($newCategory->scheme, 'http://schemas.google.com/g/2005#kind'); - - /* try constructing using magic factory */ - $app = new Zend_Gdata_App(); - $newCategory2 = $app->newCategory(); - $newCategory2->transferFromXML($newCategory->saveXML()); - $this->assertEquals(count($newCategory2->extensionElements), 1); - $this->assertEquals($newCategory2->scheme, 'http://schemas.google.com/g/2005#kind'); - } - - public function testEmptyCategoryToAndFromStringShouldMatch() { - $categoryXml = $this->category->saveXML(); - $newCategory = new Zend_Gdata_App_Extension_Category(); - $newCategory->transferFromXML($categoryXml); - $newCategoryXml = $newCategory->saveXML(); - $this->assertTrue($categoryXml == $newCategoryXml); - } - - public function testCategoryWithSchemeAndTermToAndFromStringShouldMatch() { - $this->category->scheme = 'http://schemas.google.com/g/2005#kind'; - $this->category->term = 'http://schemas.google.com/g/2005#event'; - $this->category->label = 'event kind'; - $categoryXml = $this->category->saveXML(); - $newCategory = new Zend_Gdata_App_Extension_Category(); - $newCategory->transferFromXML($categoryXml); - $newCategoryXml = $newCategory->saveXML(); - $this->assertTrue($categoryXml == $newCategoryXml); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $newCategory->scheme); - $this->assertEquals('http://schemas.google.com/g/2005#event', $newCategory->term); - $this->assertEquals('event kind', $newCategory->label); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->category->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->category->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->category->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->category->extensionAttributes['foo2']['value']); - $categoryXml = $this->category->saveXML(); - $newCategory = new Zend_Gdata_App_Extension_Category(); - $newCategory->transferFromXML($categoryXml); - $this->assertEquals('bar', $newCategory->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newCategory->extensionAttributes['foo2']['value']); - } - - public function testConvertFullCategoryToAndFromString() { - $this->category->transferFromXML($this->categoryText); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $this->category->scheme); - $this->assertEquals('http://schemas.google.com/g/2005#event', $this->category->term); - $this->assertEquals('event kind', $this->category->label); - } - -} diff --git a/tests/Zend/Gdata/App/ContentTest.php b/tests/Zend/Gdata/App/ContentTest.php deleted file mode 100644 index f9d6ecd9bc..0000000000 --- a/tests/Zend/Gdata/App/ContentTest.php +++ /dev/null @@ -1,97 +0,0 @@ -contentText = file_get_contents( - 'Zend/Gdata/App/_files/ContentElementSample1.xml', - true); - $this->contentText2 = file_get_contents( - 'Zend/Gdata/App/_files/ContentElementSample2.xml', - true); - $this->content = new Zend_Gdata_App_Extension_Content(); - } - - public function testEmptyContentShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->content->extensionElements)); - $this->assertTrue(count($this->content->extensionElements) == 0); - } - - public function testEmptyContentToAndFromStringShouldMatch() { - $contentXml = $this->content->saveXML(); - $newContent = new Zend_Gdata_App_Extension_Content(); - $newContent->transferFromXML($contentXml); - $newContentXml = $newContent->saveXML(); - $this->assertTrue($contentXml == $newContentXml); - } - - public function testContentWithTextAndTypeToAndFromStringShouldMatch() { - $this->content->text = ''; - $this->content->type = 'xhtml'; - $contentXml = $this->content->saveXML(); - $newContent = new Zend_Gdata_App_Extension_Content(); - $newContent->transferFromXML($contentXml); - $newContentXml = $newContent->saveXML(); - $this->assertEquals($newContentXml, $contentXml); - $this->assertEquals('', $newContent->text); - $this->assertEquals('xhtml', $newContent->type); - } - - public function testContentWithSrcAndTypeToAndFromStringShouldMatch() { - $this->content->src = 'http://www.example.com/image.png'; - $this->content->type = 'image/png'; - $contentXml = $this->content->saveXML(); - $newContent = new Zend_Gdata_App_Extension_Content(); - $newContent->transferFromXML($contentXml); - $newContentXml = $newContent->saveXML(); - $this->assertEquals($newContentXml, $contentXml); - $this->assertEquals('http://www.example.com/image.png', $newContent->src); - $this->assertEquals('image/png', $newContent->type); - } - - public function testConvertContentWithSrcAndTypeToAndFromString() { - $this->content->transferFromXML($this->contentText); - $this->assertEquals('http://www.example.com/image.png', $this->content->src); - $this->assertEquals('image/png', $this->content->type); - } - - public function testConvertContentWithTextAndTypeToAndFromString() { - $this->content->transferFromXML($this->contentText2); - $this->assertEquals('xhtml', $this->content->type); - $this->assertEquals(1, count($this->content->extensionElements)); - } - -} diff --git a/tests/Zend/Gdata/App/ControlTest.php b/tests/Zend/Gdata/App/ControlTest.php deleted file mode 100644 index faf66be6fb..0000000000 --- a/tests/Zend/Gdata/App/ControlTest.php +++ /dev/null @@ -1,75 +0,0 @@ -controlText = file_get_contents( - 'Zend/Gdata/App/_files/ControlElementSample1.xml', - true); - $this->control = new Zend_Gdata_App_Extension_Control(); - } - - public function testEmptyControlShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->control->extensionElements)); - $this->assertTrue(count($this->control->extensionElements) == 0); - } - - public function testEmptyControlToAndFromStringShouldMatch() { - $controlXml = $this->control->saveXML(); - $newControl = new Zend_Gdata_App_Extension_Control(); - $newControl->transferFromXML($controlXml); - $newControlXml = $newControl->saveXML(); - $this->assertTrue($controlXml == $newControlXml); - } - - public function testControlWithDraftToAndFromStringShouldMatch() { - $draft = new Zend_Gdata_App_Extension_Draft('yes'); - $this->control->draft = $draft; - $controlXml = $this->control->saveXML(); - $newControl = new Zend_Gdata_App_Extension_Control(); - $newControl->transferFromXML($controlXml); - $newControlXml = $newControl->saveXML(); - $this->assertEquals($newControlXml, $controlXml); - $this->assertEquals('yes', $newControl->draft->text); - } - - public function testConvertControlWithDraftToAndFromString() { - $this->control->transferFromXML($this->controlText); - $this->assertEquals('yes', $this->control->draft->text); - } - -} diff --git a/tests/Zend/Gdata/App/EntryTest.php b/tests/Zend/Gdata/App/EntryTest.php deleted file mode 100644 index e1d1bccee3..0000000000 --- a/tests/Zend/Gdata/App/EntryTest.php +++ /dev/null @@ -1,625 +0,0 @@ -enryText = $this->loadResponse( - dirname(__FILE__) . '/../App/_files/EntrySample1.xml' - ); - $this->httpEntrySample = $this->loadResponse( - dirname(__FILE__) . '/../App/_files/EntrySampleHttp1.txt' - ); - $this->enry = new Zend_Gdata_App_Entry(); - - $this->adapter = new Test_Zend_Gdata_MockHttpClient(); - $this->client = new Zend_Gdata_HttpClient(); - $this->client->setAdapter($this->adapter); - $this->service = new Zend_Gdata_App($this->client); - } - - public function loadResponse($filename) - { - $response = file_get_contents($filename); - - // Line endings are sometimes an issue inside the canned responses; the - // following is a negative lookbehind assertion, and replaces any \n - // not preceded by \r with the sequence \r\n, ensuring that the message - // is well-formed. - return preg_replace("#(?assertTrue(is_array($this->enry->extensionElements)); - $this->assertTrue(count($this->enry->extensionElements) == 0); - } - - public function testEmptyEntryToAndFromStringShouldMatch() - { - $enryXml = $this->enry->saveXML(); - $newEntry = new Zend_Gdata_App_Entry(); - $newEntry->transferFromXML($enryXml); - $newEntryXml = $newEntry->saveXML(); - $this->assertTrue($enryXml == $newEntryXml); - } - - public function testConvertEntryToAndFromString() - { - $this->enry->transferFromXML($this->enryText); - $enryXml = $this->enry->saveXML(); - $newEntry = new Zend_Gdata_App_Entry(); - $newEntry->transferFromXML($enryXml); -/* - $this->assertEquals(1, count($newEntry->entry)); - $this->assertEquals('dive into mark', $newEntry->title->text); - $this->assertEquals('text', $newEntry->title->type); - $this->assertEquals('2005-07-31T12:29:29Z', $newEntry->updated->text); - $this->assertEquals('tag:example.org,2003:3', $newEntry->id->text); - $this->assertEquals(2, count($newEntry->link)); - $this->assertEquals('http://example.org/', - $newEntry->getAlternateLink()->href); - $this->assertEquals('en', - $newEntry->getAlternateLink()->hrefLang); - $this->assertEquals('text/html', - $newEntry->getAlternateLink()->type); - $this->assertEquals('http://example.org/enry.atom', - $newEntry->getSelfLink()->href); - $this->assertEquals('application/atom+xml', - $newEntry->getSelfLink()->type); - $this->assertEquals('Copyright (c) 2003, Mark Pilgrim', - $newEntry->rights->text); - $entry = $newEntry->entry[0]; - $this->assertEquals('Atom draft-07 snapshot', $entry->title->text); - $this->assertEquals('tag:example.org,2003:3.2397', - $entry->id->text); - $this->assertEquals('2005-07-31T12:29:29Z', $entry->updated->text); - $this->assertEquals('2003-12-13T08:29:29-04:00', - $entry->published->text); - $this->assertEquals('Mark Pilgrim', - $entry->author[0]->name->text); - $this->assertEquals('http://example.org/', - $entry->author[0]->uri->text); - $this->assertEquals(2, count($entry->contributor)); - $this->assertEquals('Sam Ruby', - $entry->contributor[0]->name->text); - $this->assertEquals('Joe Gregorio', - $entry->contributor[1]->name->text); - $this->assertEquals('xhtml', $entry->content->type); -*/ - } - - public function testCanSetAndGetEtag() - { - $data = "W/&FooBarBaz&"; - $this->enry->setEtag($data); - $this->assertEquals($this->enry->getEtag(), $data); - } - - public function testCanSetAndgetService() - { - $data = new Zend_Gdata_App(); - $this->enry->setService($data); - $this->assertEquals($this->enry->getService(), $data); - - $data = null; - $this->enry->setService($data); - $this->assertEquals($this->enry->getService(), $data); - } - - public function testsetServiceProvidesFluentInterface() - { - $result = $this->enry->setService(null); - $this->assertEquals($this->enry, $result); - } - - public function testGetHttpClientPullsFromServiceInstance() - { - $s = new Zend_Gdata_App(); - $this->enry->setService($s); - - $c = new Zend_Gdata_HttpClient(); - $s->setHttpClient($c); - $this->assertEquals($this->enry->getHttpClient(), - $s->getHttpClient()); - - $c = new Zend_Http_Client(); - $s->setHttpClient($c); - $this->assertEquals($this->enry->getHttpClient(), - $s->getHttpClient($c)); - } - - public function testSetHttpClientPushesIntoServiceInstance() - { - $s = new Zend_Gdata_App(); - $this->enry->setService($s); - - $c = new Zend_Gdata_HttpClient(); - $this->enry->setHttpClient($c); - $this->assertEquals(get_class($s->getHttpClient()), - 'Zend_Gdata_HttpClient'); - - $c = new Zend_Http_Client(); - $this->enry->setHttpClient($c); - $this->assertEquals(get_class($s->getHttpClient()), - 'Zend_Http_Client'); - } - - public function testSaveSupportsGdataV2() - { - // Prepare mock response - $this->adapter->setResponse("HTTP/1.1 201 Created"); - - // Make sure that we're using protocol v2 - $this->service->setMajorProtocolVersion(2); - $this->enry->setService($this->service); - - // Set a URL for posting, so that save() will work - $editLink = new Zend_Gdata_App_extension_Link('http://example.com', - 'edit'); - $this->enry->setLink(array($editLink)); - - // Perform a (mock) save - $this->enry->save(); - - // Check to make sure that a v2 header was sent - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'GData-Version: 2') - $found = true; - } - $this->assertTrue($found, - 'GData-Version header missing or incorrect.'); - } - - public function testDeleteSupportsGdataV2() - { - // Prepare mock response - $this->adapter->setResponse("HTTP/1.1 200 OK"); - - // Make sure that we're using protocol v2 - $this->service->setMajorProtocolVersion(2); - $this->enry->setService($this->service); - - // Set a URL for posting, so that save() will work - $editLink = new Zend_Gdata_App_extension_Link('http://example.com', - 'edit'); - $this->enry->setLink(array($editLink)); - - // Perform a (mock) save - $this->enry->delete(); - - // Check to make sure that a v2 header was sent - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'GData-Version: 2') - $found = true; - } - $this->assertTrue($found, - 'GData-Version header missing or incorrect.'); - } - - public function testIfMatchHeaderCanBeSetOnSave() - { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->save(null, null, - array('If-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, - 'If-Match header not found or incorrect'); - } - - public function testIfNoneMatchHeaderCanBeSetOnSave() - { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->save(null, null, - array('If-None-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-None-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, - 'If-None-Match header not found or incorrect'); - } - - public function testCanSetUriOnSave() - { - $uri = 'http://example.net/foo/bar'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $newEntry = $entry->save($uri); - $request = $this->adapter->popRequest(); - $uriObject = Zend_Uri_Http::fromString($uri); - $uriObject->setPort('80'); - $this->assertEquals($uriObject, $request->uri); - } - - public function testCanSetClassnameOnSave() - { - $className = 'Zend_Gdata_Entry'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $newEntry = $entry->save(null, $className); - $this->assertEquals($className, get_class($newEntry)); - } - - public function testIfNoneMatchSetOnReload() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-None-Match: ' . $etag) - $found = true; - } - $this->assertTrue($found, - 'If-None-Match header not found or incorrect'); - } - - public function testIfNoneMatchCanBeSetOnReload() - { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(null, null, - array('If-None-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-None-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, - 'If-None-Match header not found or incorrect'); - } - - public function testReloadReturnsEntryObject() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $this->assertEquals('Zend_Gdata_App_Entry', get_class($newEntry)); - } - - public function testReloadPopulatesEntryObject() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $this->assertEquals('Hello world', $newEntry->title->text); - } - - public function testReloadDoesntThrowExceptionIfNoEtag() - { - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $newEntry = $entry->reload(); - $this->assertEquals('Zend_Gdata_App_Entry', get_class($newEntry)); - } - - public function testReloadExtractsURIFromEditLink() - { - $expectedUri = 'http://www.example.com'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - $expectedUri, - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $requestUri = $this->adapter->popRequest()->uri; - $expectedUriObject = Zend_Uri_Http::fromString($expectedUri); - $expectedUriObject->setPort('80'); - $this->assertEquals($expectedUriObject, $requestUri); - } - - public function testReloadAllowsCustomURI() - { - $uriOverride = 'http://www.example.org'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload($uriOverride); - $requestUri = $this->adapter->popRequest()->uri; - $uriOverrideObject = Zend_Uri_Http::fromString($uriOverride); - $uriOverrideObject->setPort('80'); - $this->assertEquals($uriOverrideObject, $requestUri); - } - - public function testReloadReturnsNullIfEntryNotModified() - { - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse('HTTP/1.1 304 Not Modified'); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $this->assertEquals(null, $newEntry); - } - - public function testCanSetReloadReturnClassname() - { - $className = 'Zend_Gdata_Entry'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(null, $className); - $this->assertEquals($className, get_class($newEntry)); - } - - public function testReloadInheritsClassname() - { - $className = 'Zend_Gdata_Entry'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = new $className; - $entry->setService($this->service); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $newEntry = $entry->reload(); - $this->assertEquals($className, get_class($newEntry)); - } - - public function testCanSetMajorProtocolVersion() - { - $expectedVersion = 42; - $entry = $this->service->newEntry(); - $entry->setMajorProtocolVersion($expectedVersion); - $receivedVersion = $entry->getMajorProtocolVersion(); - $this->assertEquals($expectedVersion, $receivedVersion); - } - - public function testCanSetMinorProtocolVersion() - { - $expectedVersion = 42; - $entry = $this->service->newEntry(); - $entry->setMinorProtocolVersion($expectedVersion); - $receivedVersion = $entry->getMinorProtocolVersion(); - $this->assertEquals($expectedVersion, $receivedVersion); - } - - public function testMajorProtocolVersionCannotBeZero() - { - $expectedVersion = 0; - $entry = $this->service->newEntry(); - $this->setExpectedException('Zend_Gdata_App_InvalidArgumentException'); - $entry->setMajorProtocolVersion($expectedVersion); - } - - public function testMajorProtocolVersionCannotBeNegative() - { - $expectedVersion = -1; - $entry = $this->service->newEntry(); - $this->setExpectedException('Zend_Gdata_App_InvalidArgumentException'); - $entry->setMajorProtocolVersion($expectedVersion); - } - - public function testMajorProtocolVersionMayBeNull() - { - $expectedVersion = null; - $entry = $this->service->newEntry(); - $entry->setMajorProtocolVersion($expectedVersion); - $receivedVersion = $entry->getMajorProtocolVersion(); - $this->assertNull($receivedVersion); - } - - public function testMinorProtocolVersionMayBeZero() - { - $expectedVersion = 0; - $entry = $this->service->newEntry(); - $entry->setMinorProtocolVersion($expectedVersion); - $receivedVersion = $entry->getMinorProtocolVersion(); - $this->assertEquals($expectedVersion, $receivedVersion); - } - - public function testMinorProtocolVersionCannotBeNegative() - { - $expectedVersion = -1; - $entry = $this->service->newEntry(); - $this->setExpectedException('Zend_Gdata_App_InvalidArgumentException'); - $entry->setMinorProtocolVersion($expectedVersion); - } - - public function testMinorProtocolVersionMayBeNull() - { - $expectedVersion = null; - $entry = $this->service->newEntry(); - $entry->setMinorProtocolVersion($expectedVersion); - $receivedVersion = $entry->getMinorProtocolVersion(); - $this->assertNull($receivedVersion); - } - - public function testDefaultMajorProtocolVersionIs1() - { - $entry = $this->service->newEntry(); - $this->assertEquals(1, $entry->getMajorProtocolVersion()); - } - - public function testDefaultMinorProtocolVersionIsNull() - { - $entry = $this->service->newEntry(); - $this->assertNull($entry->getMinorProtocolVersion()); - } - - public function testLookupNamespaceUsesCurrentVersion() - { - $prefix = 'test'; - $v1TestString = 'TEST-v1'; - $v2TestString = 'TEST-v2'; - - Zend_Gdata_App_Base::flushNamespaceLookupCache(); - $entry = $this->service->newEntry(); - $entry->registerNamespace($prefix, $v1TestString, 1, 0); - $entry->registerNamespace($prefix, $v2TestString, 2, 0); - $entry->setMajorProtocolVersion(1); - $result = $entry->lookupNamespace($prefix); - $this->assertEquals($v1TestString, $result); - $entry->setMajorProtocolVersion(2); - $result = $entry->lookupNamespace($prefix); - $this->assertEquals($v2TestString, $result); - $entry->setMajorProtocolVersion(null); // Should default to latest - $result = $entry->lookupNamespace($prefix); - $this->assertEquals($v2TestString, $result); - } - - public function testLookupNamespaceObeysParentBehavior() - { - $prefix = 'test'; - $testString10 = 'TEST-v1-0'; - $testString20 = 'TEST-v2-0'; - $testString11 = 'TEST-v1-1'; - $testString21 = 'TEST-v2-1'; - $testString12 = 'TEST-v1-2'; - $testString22 = 'TEST-v2-2'; - - Zend_Gdata_App_Base::flushNamespaceLookupCache(); - $entry = $this->service->newEntry(); - $entry->registerNamespace($prefix, $testString10, 1, 0); - $entry->registerNamespace($prefix, $testString20, 2, 0); - $entry->registerNamespace($prefix, $testString11, 1, 1); - $entry->registerNamespace($prefix, $testString21, 2, 1); - $entry->registerNamespace($prefix, $testString12, 1, 2); - $entry->registerNamespace($prefix, $testString22, 2, 2); - - // Assumes default version (1) - $result = $entry->lookupNamespace($prefix, 1, null); - $this->assertEquals($testString12, $result); - $result = $entry->lookupNamespace($prefix, 2, null); - $this->assertEquals($testString22, $result); - $result = $entry->lookupNamespace($prefix, 1, 1); - $this->assertEquals($testString11, $result); - $result = $entry->lookupNamespace($prefix, 2, 1); - $this->assertEquals($testString21, $result); - $result = $entry->lookupNamespace($prefix, null, null); - $this->assertEquals($testString12, $result); - $result = $entry->lookupNamespace($prefix, null, 1); - $this->assertEquals($testString11, $result); - - // Override to retrieve latest version - $entry->setMajorProtocolVersion(null); - $result = $entry->lookupNamespace($prefix, null, null); - $this->assertEquals($testString22, $result); - $result = $entry->lookupNamespace($prefix, null, 1); - $this->assertEquals($testString21, $result); - } - -} diff --git a/tests/Zend/Gdata/App/FeedTest.php b/tests/Zend/Gdata/App/FeedTest.php deleted file mode 100644 index 02a800ffc7..0000000000 --- a/tests/Zend/Gdata/App/FeedTest.php +++ /dev/null @@ -1,282 +0,0 @@ -feedText = file_get_contents( - 'Zend/Gdata/App/_files/FeedSample1.xml', - true); - $this->feed = new Zend_Gdata_App_Feed(); - } - - public function testEmptyFeedShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->feed->extensionElements)); - $this->assertTrue(count($this->feed->extensionElements) == 0); - } - - public function testEmptyFeedToAndFromStringShouldMatch() { - $feedXml = $this->feed->saveXML(); - $newFeed = new Zend_Gdata_App_Feed(); - $newFeed->transferFromXML($feedXml); - $newFeedXml = $newFeed->saveXML(); - $this->assertTrue($feedXml == $newFeedXml); - } - - public function testConvertFeedToAndFromString() { - $this->feed->transferFromXML($this->feedText); - $feedXml = $this->feed->saveXML(); - $newFeed = new Zend_Gdata_App_Feed(); - $newFeed->transferFromXML($feedXml); - $this->assertEquals(1, count($newFeed->entry)); - $this->assertEquals('dive into mark', $newFeed->title->text); - $this->assertEquals('text', $newFeed->title->type); - $this->assertEquals('2005-07-31T12:29:29Z', $newFeed->updated->text); - $this->assertEquals('tag:example.org,2003:3', $newFeed->id->text); - $this->assertEquals(2, count($newFeed->link)); - $this->assertEquals('http://example.org/', - $newFeed->getAlternateLink()->href); - $this->assertEquals('en', - $newFeed->getAlternateLink()->hrefLang); - $this->assertEquals('text/html', - $newFeed->getAlternateLink()->type); - $this->assertEquals('http://example.org/feed.atom', - $newFeed->getSelfLink()->href); - $this->assertEquals('application/atom+xml', - $newFeed->getSelfLink()->type); - $this->assertEquals('Copyright (c) 2003, Mark Pilgrim', - $newFeed->rights->text); - $entry = $newFeed->entry[0]; - $this->assertEquals('Atom draft-07 snapshot', $entry->title->text); - $this->assertEquals('tag:example.org,2003:3.2397', - $entry->id->text); - $this->assertEquals('2005-07-31T12:29:29Z', $entry->updated->text); - $this->assertEquals('2003-12-13T08:29:29-04:00', - $entry->published->text); - $this->assertEquals('Mark Pilgrim', - $entry->author[0]->name->text); - $this->assertEquals('http://example.org/', - $entry->author[0]->uri->text); - $this->assertEquals(2, count($entry->contributor)); - $this->assertEquals('Sam Ruby', - $entry->contributor[0]->name->text); - $this->assertEquals('Joe Gregorio', - $entry->contributor[1]->name->text); - $this->assertEquals('xhtml', $entry->content->type); - } - - public function testCanAddIndividualEntries() { - $this->feed->transferFromXML($this->feedText); - $this->assertEquals(1, count($this->feed->entry)); - $oldTitle = $this->feed->entry[0]->title->text; - $newEntry = new Zend_Gdata_App_Entry(); - $newEntry->setTitle(new Zend_Gdata_App_Extension_Title("Foo")); - $this->feed->addEntry($newEntry); - $this->assertEquals(2, count($this->feed->entry)); - $this->assertEquals($oldTitle, $this->feed->entry[0]->title->text); - $this->assertEquals("Foo", $this->feed->entry[1]->title->text); - } - - public function testCanSetAndGetEtag() { - $data = "W/&FooBarBaz&"; - $this->feed->setEtag($data); - $this->assertEquals($this->feed->getEtag(), $data); - } - - public function testSetServicePropagatesToChildren() { - // Setup - $entries = array(new Zend_Gdata_App_Entry(), - new Zend_Gdata_App_Entry()); - foreach ($entries as $entry) { - $this->feed->addEntry($entry); - } - - // Set new service instance and test for propagation - $s = new Zend_Gdata_App(); - $this->feed->setService($s); - - $service = $this->feed->getService(); - if (!is_object($service)) { - $this->fail('No feed service received'); - } - $this->assertEquals('Zend_Gdata_App', - get_class($service)); - - foreach ($entries as $entry) { - $service = $entry->getService(); - if (!is_object($service)) { - $this->fail('No entry service received'); - } - $this->assertEquals('Zend_Gdata_App', - get_class($service)); - } - - // Set null service instance and test for propagation - $s = null; - $this->feed->setService($s); - $this->assertFalse(is_object($this->feed->getService())); - foreach ($entries as $entry) { - $service = $entry->getService(); - $this->assertFalse(is_object($service)); - } - } - - public function testCanSetMajorProtocolVersion() - { - $expectedVersion = 42; - $this->feed->setMajorProtocolVersion($expectedVersion); - $receivedVersion = $this->feed->getMajorProtocolVersion(); - $this->assertEquals($expectedVersion, $receivedVersion); - } - - public function testCanSetMinorProtocolVersion() - { - $expectedVersion = 42; - $this->feed->setMinorProtocolVersion($expectedVersion); - $receivedVersion = $this->feed->getMinorProtocolVersion(); - $this->assertEquals($expectedVersion, $receivedVersion); - } - - public function testEntriesInheritFeedVersionOnCreate() - { - $major = 98; - $minor = 12; - $this->feed->setMajorProtocolVersion($major); - $this->feed->setMinorProtocolVersion($minor); - $this->feed->transferFromXML($this->feedText); - foreach ($this->feed->entries as $entry) { - $this->assertEquals($major, $entry->getMajorProtocolVersion()); - $this->assertEquals($minor, $entry->getMinorProtocolVersion()); - } - } - - public function testEntriesInheritFeedVersionOnUpdate() - { - $major = 98; - $minor = 12; - $this->feed->transferFromXML($this->feedText); - $this->feed->setMajorProtocolVersion($major); - $this->feed->setMinorProtocolVersion($minor); - foreach ($this->feed->entries as $entry) { - $this->assertEquals($major, $entry->getMajorProtocolVersion()); - $this->assertEquals($minor, $entry->getMinorProtocolVersion()); - } - } - - public function testDefaultMajorProtocolVersionIs1() - { - $this->assertEquals(1, $this->feed->getMajorProtocolVersion()); - } - - public function testDefaultMinorProtocolVersionIsNull() - { - $this->assertNull($this->feed->getMinorProtocolVersion()); - } - - public function testLookupNamespaceUsesCurrentVersion() - { - $prefix = 'test'; - $v1TestString = 'TEST-v1'; - $v2TestString = 'TEST-v2'; - - Zend_Gdata_App_Base::flushNamespaceLookupCache(); - $feed = $this->feed; - $feed->registerNamespace($prefix, $v1TestString, 1, 0); - $feed->registerNamespace($prefix, $v2TestString, 2, 0); - $feed->setMajorProtocolVersion(1); - $result = $feed->lookupNamespace($prefix); - $this->assertEquals($v1TestString, $result); - $feed->setMajorProtocolVersion(2); - $result = $feed->lookupNamespace($prefix); - $this->assertEquals($v2TestString, $result); - $feed->setMajorProtocolVersion(null); // Should default to latest - $result = $feed->lookupNamespace($prefix); - } - - public function testLookupNamespaceObeysParentBehavior() - { - $prefix = 'test'; - $testString10 = 'TEST-v1-0'; - $testString20 = 'TEST-v2-0'; - $testString11 = 'TEST-v1-1'; - $testString21 = 'TEST-v2-1'; - $testString12 = 'TEST-v1-2'; - $testString22 = 'TEST-v2-2'; - - Zend_Gdata_App_Base::flushNamespaceLookupCache(); - $feed = $this->feed; - $feed->registerNamespace($prefix, $testString10, 1, 0); - $feed->registerNamespace($prefix, $testString20, 2, 0); - $feed->registerNamespace($prefix, $testString11, 1, 1); - $feed->registerNamespace($prefix, $testString21, 2, 1); - $feed->registerNamespace($prefix, $testString12, 1, 2); - $feed->registerNamespace($prefix, $testString22, 2, 2); - - // Assumes default version (1) - $result = $feed->lookupNamespace($prefix, 1, null); - $this->assertEquals($testString12, $result); - $result = $feed->lookupNamespace($prefix, 2, null); - $this->assertEquals($testString22, $result); - $result = $feed->lookupNamespace($prefix, 1, 1); - $this->assertEquals($testString11, $result); - $result = $feed->lookupNamespace($prefix, 2, 1); - $this->assertEquals($testString21, $result); - $result = $feed->lookupNamespace($prefix, null, null); - $this->assertEquals($testString12, $result); - $result = $feed->lookupNamespace($prefix, null, 1); - $this->assertEquals($testString11, $result); - - // Override to retrieve latest version - $feed->setMajorProtocolVersion(null); - $result = $feed->lookupNamespace($prefix, null, null); - $this->assertEquals($testString22, $result); - $result = $feed->lookupNamespace($prefix, null, 1); - $this->assertEquals($testString21, $result); - } - - /** - * @group ZF-10242 - */ - public function testCount() - { - $feed = new Zend_Gdata_App_Feed(); - $feed->addEntry('foo') - ->addEntry('bar'); - - $this->assertEquals(2, $feed->count()); - $this->assertEquals(2, count($feed)); - } -} diff --git a/tests/Zend/Gdata/App/GeneratorTest.php b/tests/Zend/Gdata/App/GeneratorTest.php deleted file mode 100644 index f38141d748..0000000000 --- a/tests/Zend/Gdata/App/GeneratorTest.php +++ /dev/null @@ -1,82 +0,0 @@ -generatorText = file_get_contents( - 'Zend/Gdata/App/_files/GeneratorElementSample1.xml', - true); - $this->generator = new Zend_Gdata_App_Extension_Generator(); - } - - public function testEmptyGeneratorShouldHaveEmptyExtensionsList() { - $this->assertTrue(is_array($this->generator->extensionElements)); - $this->assertTrue(count($this->generator->extensionElements) == 0); - } - - public function testEmptyGeneratorToAndFromStringShouldMatch() { - $generatorXml = $this->generator->saveXML(); - $newGenerator = new Zend_Gdata_App_Extension_Generator(); - $newGenerator->transferFromXML($generatorXml); - $newGeneratorXml = $newGenerator->saveXML(); - $this->assertTrue($generatorXml == $newGeneratorXml); - } - - public function testGeneratorToAndFromStringShouldMatch() { - $this->generator->uri = 'http://code.google.com/apis/gdata/'; - $this->generator->version = '1.0'; - $this->generator->text = 'Google data APIs'; - $generatorXml = $this->generator->saveXML(); - $newGenerator = new Zend_Gdata_App_Extension_Generator(); - $newGenerator->transferFromXML($generatorXml); - $newGeneratorXml = $newGenerator->saveXML(); - $this->assertEquals($newGeneratorXml, $generatorXml); - $this->assertEquals('http://code.google.com/apis/gdata/', - $newGenerator->uri); - $this->assertEquals('1.0', $newGenerator->version); - $this->assertEquals('Google data APIs', $newGenerator->text); - } - - public function testConvertGeneratorWithDraftToAndFromString() { - $this->generator->transferFromXML($this->generatorText); - $this->assertEquals('http://code.google.com/apis/gdata/', - $this->generator->uri); - $this->assertEquals('1.0', $this->generator->version); - $this->assertEquals('Google data APIs', $this->generator->text); - } - -} diff --git a/tests/Zend/Gdata/App/HttpExceptionTest.php b/tests/Zend/Gdata/App/HttpExceptionTest.php deleted file mode 100755 index 8b233285b8..0000000000 --- a/tests/Zend/Gdata/App/HttpExceptionTest.php +++ /dev/null @@ -1,71 +0,0 @@ -sprKey = constant('TESTS_ZEND_GDATA_SPREADSHEETS_SPREADSHEETKEY'); - $this->wksId = constant('TESTS_ZEND_GDATA_SPREADSHEETS_WORKSHEETID'); - $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $this->gdata = new Zend_Gdata_Spreadsheets($client); - } - - public function testGetRawResponseBody() - { - try { - $rowData = array(); - $entry = $this->gdata->insertRow($rowData, $this->sprKey); - $this->fail('Expecting Zend_Gdata_App_HttpException'); - } catch (Zend_Gdata_App_HttpException $hExc) { - $this->assertThat($hExc, - $this->isInstanceOf('Zend_Gdata_App_HttpException'), - 'Expecting Zend_Gdata_App_HttpException, got ' - . get_class($hExc)); - - $message = $hExc->getMessage(); - $this->assertEquals($message, 'Expected response code 200, got 400'); - $body = $hExc->getRawResponseBody(); - $this->assertNotNull($body); - $this->assertNotEquals(stripos($body, - 'Blank rows cannot be written; use delete instead.'), false); - } - } -} diff --git a/tests/Zend/Gdata/App/MockBase.php b/tests/Zend/Gdata/App/MockBase.php deleted file mode 100644 index ac354e2c4f..0000000000 --- a/tests/Zend/Gdata/App/MockBase.php +++ /dev/null @@ -1,38 +0,0 @@ -assertEquals('2006-12-01', $date); - } - - public function testFormatTimestampFromStringWithTimezone() - { - // assert that a correctly formatted timestamp is not modified - $date = Zend_Gdata_App_Util::formatTimestamp('2007-01-10T13:31:12-04:00'); - $this->assertEquals('2007-01-10T13:31:12-04:00', $date); - } - - public function testFormatTimestampWithMilliseconds() - { - // assert that a correctly formatted timestamp is not modified - $date = Zend_Gdata_App_Util::formatTimestamp('1956-12-14T43:09:54.52376Z'); - $this->assertEquals('1956-12-14T43:09:54.52376Z', $date); - } - - public function testFormatTimestampUsingZuluAsOffset() - { - // assert that a correctly formatted timestamp is not modified - $date = Zend_Gdata_App_Util::formatTimestamp('2024-03-19T01:38:12Z'); - $this->assertEquals('2024-03-19T01:38:12Z', $date); - } - - public function testFormatTimestampUsingLowercaseTAndZ() - { - // assert that a correctly formatted timestamp is not modified - $date = Zend_Gdata_App_Util::formatTimestamp('1945-07-19t12:19:08z'); - $this->assertEquals('1945-07-19t12:19:08z', $date); - } - - public function testFormatTimestampFromStringWithNonCompliantDate() - { - // assert that a non-compliant date is converted to RFC 3339 - $date = Zend_Gdata_App_Util::formatTimestamp('2007/07/13'); - $this->assertEquals('2007-07-13T00:00:00', $date); - } - - public function testFormatTimestampFromInteger() - { - $ts = 1164960000; // Fri Dec 1 00:00:00 PST 2006 - $date = Zend_Gdata_App_Util::formatTimestamp($ts); - $this->assertEquals('2006-12-01T08:00:00+00:00', $date); - } - - public function testExceptionFormatTimestampNonsense() - { - $util = new Zend_Gdata_App_Util(); - try { - $ts = Zend_Gdata_App_Util::formatTimestamp('nonsense string'); - } catch (Zend_Gdata_App_Exception $e) { - $this->assertEquals('Invalid timestamp: nonsense string.', $e->getMessage()); - return; - } - // Excetion not thrown, this is bad. - $this->fail("Exception not thrown."); - } - - public function testExceptionFormatTimestampSemiInvalid() - { - $util = new Zend_Gdata_App_Util(); - try { - $ts = Zend_Gdata_App_Util::formatTimestamp('2007-06-05adslfkja'); - } catch (Zend_Gdata_App_Exception $e) { - $this->assertEquals('Invalid timestamp: 2007-06-05adslfkja.', $e->getMessage()); - return; - } - // Excetion not thrown, this is bad. - $this->fail("Exception not thrown."); - } - - public function testExceptionFormatTimestampInvalidTime() - { - $util = new Zend_Gdata_App_Util(); - try { - $ts = Zend_Gdata_App_Util::formatTimestamp('2007-06-05Tadslfkja'); - } catch (Zend_Gdata_App_Exception $e) { - $this->assertEquals('Invalid timestamp: 2007-06-05Tadslfkja.', $e->getMessage()); - return; - } - // Excetion not thrown, this is bad. - $this->fail("Exception not thrown."); - } - - public function testExceptionFormatTimestampInvalidOffset() - { - $util = new Zend_Gdata_App_Util(); - try { - $ts = Zend_Gdata_App_Util::formatTimestamp('2007-06-05T02:51:12+egg'); - } catch (Zend_Gdata_App_Exception $e) { - $this->assertEquals('Invalid timestamp: 2007-06-05T02:51:12+egg.', $e->getMessage()); - return; - } - // Excetion not thrown, this is bad. - $this->fail("Exception not thrown."); - } - - public function testExceptionFormatTimestampInvalidOffsetHours() - { - $util = new Zend_Gdata_App_Util(); - try { - $ts = Zend_Gdata_App_Util::formatTimestamp('2007-06-05T02:51:12-ab:00'); - } catch (Zend_Gdata_App_Exception $e) { - $this->assertEquals('Invalid timestamp: 2007-06-05T02:51:12-ab:00.', $e->getMessage()); - return; - } - // Excetion not thrown, this is bad. - $this->fail("Exception not thrown."); - } - - /** - * @group ZF-11610 - */ - public function testFormatTimestepHandlesSmallUnixTimestampProperly() - { - $this->assertEquals( - '1970-01-01T00:02:03+00:00', - Zend_Gdata_App_Util::formatTimestamp(123) - ); - } - - public function testFindGreatestBoundedValueReturnsMax() { - $data = array(-1 => null, - 0 => null, - 1 => null, - 2 => null, - 3 => null, - 5 => null, - -2 => null); - $result = Zend_Gdata_App_Util::findGreatestBoundedValue(99, $data); - $this->assertEquals(5, $result); - } - - public function testFindGreatestBoundedValueReturnsMaxWhenBounded() { - $data = array(-1 => null, - 0 => null, - 1 => null, - 2 => null, - 3 => null, - 5 => null, - -2 => null); - $result = Zend_Gdata_App_Util::findGreatestBoundedValue(4, $data); - $this->assertEquals(3, $result); - } - - public function testFindGreatestBoundedValueReturnsMaxWhenUnbounded() { - $data = array(-1 => null, - 0 => null, - 1 => null, - 2 => null, - 3 => null, - 5 => null, - -2 => null); - $result = Zend_Gdata_App_Util::findGreatestBoundedValue(null, $data); - $this->assertEquals(5, $result); - } - - public function testFindGreatestBoundedValueReturnsZeroWhenZeroBounded() { - $data = array(-1 => null, - 0 => null, - 1 => null, - 2 => null, - 3 => null, - 5 => null, - -2 => null); - $result = Zend_Gdata_App_Util::findGreatestBoundedValue(0, $data); - $this->assertEquals(0, $result); - } - - public function testFindGreatestBoundedValueFailsWhenNegativelyBounded() { - $data = array(-1 => null, - 0 => null, - 1 => null, - 2 => null, - 3 => null, - 5 => null, - -2 => null); - try { - $result = Zend_Gdata_App_Util::findGreatestBoundedValue(-1, $data); - $failed = true; - } catch (Zend_Gdata_App_Exception $e) { - $failed = false; - } - $this->assertFalse($failed, 'Exception not raised.'); - } - -} diff --git a/tests/Zend/Gdata/App/_files/AuthorElementSample1.xml b/tests/Zend/Gdata/App/_files/AuthorElementSample1.xml deleted file mode 100644 index 772b6f5d6c..0000000000 --- a/tests/Zend/Gdata/App/_files/AuthorElementSample1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - John Doe - johndoes@someemailadress.com - http://www.google.com - diff --git a/tests/Zend/Gdata/App/_files/CategoryElementSample1.xml b/tests/Zend/Gdata/App/_files/CategoryElementSample1.xml deleted file mode 100644 index 2a8b60981c..0000000000 --- a/tests/Zend/Gdata/App/_files/CategoryElementSample1.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/tests/Zend/Gdata/App/_files/ContentElementSample1.xml b/tests/Zend/Gdata/App/_files/ContentElementSample1.xml deleted file mode 100644 index 91acb5bc9b..0000000000 --- a/tests/Zend/Gdata/App/_files/ContentElementSample1.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/tests/Zend/Gdata/App/_files/ContentElementSample2.xml b/tests/Zend/Gdata/App/_files/ContentElementSample2.xml deleted file mode 100644 index 18cdfc1c66..0000000000 --- a/tests/Zend/Gdata/App/_files/ContentElementSample2.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/App/_files/ControlElementSample1.xml b/tests/Zend/Gdata/App/_files/ControlElementSample1.xml deleted file mode 100644 index 5fbd7ef426..0000000000 --- a/tests/Zend/Gdata/App/_files/ControlElementSample1.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - yes - diff --git a/tests/Zend/Gdata/App/_files/EntrySample1.xml b/tests/Zend/Gdata/App/_files/EntrySample1.xml deleted file mode 100644 index 27de402524..0000000000 --- a/tests/Zend/Gdata/App/_files/EntrySample1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - Atom draft-07 snapshot - - - tag:example.org,2003:3.2397 - 2005-07-31T12:29:29Z - 2003-12-13T08:29:29-04:00 - - Mark Pilgrim - http://example.org/ - f8dy@example.com - - - Sam Ruby - - - Joe Gregorio - - -
    -

    [Update: The Atom draft is finished.]

    -
    -
    -
    diff --git a/tests/Zend/Gdata/App/_files/EntrySampleHttp1.txt b/tests/Zend/Gdata/App/_files/EntrySampleHttp1.txt deleted file mode 100644 index 33bdd0bca2..0000000000 --- a/tests/Zend/Gdata/App/_files/EntrySampleHttp1.txt +++ /dev/null @@ -1,29 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/atom+xml; charset=UTF-8 -Last-Modified: Sun, 07 Sep 2008 17:53:51 GMT -Cache-Control: max-age=0 private -ETag: W/"CkcHQH8_fCp7ImA9WxRTGEw." -Date: Sun, 07 Sep 2008 21:23:39 GMT -Content-Length: 1450 -Server: GFE/1.3 - - - - - tag:blogger.com,1999:blog-8273578352962669317.post-6938730899689776686 - 2008-09-07T10:53:00.001-07:00 - 2008-09-07T10:53:51.144-07:00 - 2008-09-07T10:53:51.144-07:00 - Hello world - <p>Hello world!</p> - - - - - - - John Doe - http://www.blogger.com/profile/12345678901234567890 - jdoe@example.com - - diff --git a/tests/Zend/Gdata/App/_files/FeedSample1.xml b/tests/Zend/Gdata/App/_files/FeedSample1.xml deleted file mode 100644 index b1a4b36845..0000000000 --- a/tests/Zend/Gdata/App/_files/FeedSample1.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - dive into mark - - A <em>lot</em> of effort - went into making this effortless - - 2005-07-31T12:29:29Z - tag:example.org,2003:3 - - - Copyright (c) 2003, Mark Pilgrim - - Example Toolkit - - - Atom draft-07 snapshot - - - tag:example.org,2003:3.2397 - 2005-07-31T12:29:29Z - 2003-12-13T08:29:29-04:00 - - Mark Pilgrim - http://example.org/ - f8dy@example.com - - - Sam Ruby - - - Joe Gregorio - - -
    -

    [Update: The Atom draft is finished.]

    -
    -
    -
    -
    diff --git a/tests/Zend/Gdata/App/_files/GeneratorElementSample1.xml b/tests/Zend/Gdata/App/_files/GeneratorElementSample1.xml deleted file mode 100644 index 00ae021818..0000000000 --- a/tests/Zend/Gdata/App/_files/GeneratorElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - -Google data APIs diff --git a/tests/Zend/Gdata/AppTest.php b/tests/Zend/Gdata/AppTest.php deleted file mode 100644 index 0b02b5d87d..0000000000 --- a/tests/Zend/Gdata/AppTest.php +++ /dev/null @@ -1,644 +0,0 @@ -fileName = 'Zend/Gdata/App/_files/FeedSample1.xml'; - $this->expectedEtag = 'W/"CkcHQH8_fCp7ImA9WxRTGEw."'; - $this->expectedMajorProtocolVersion = 1; - $this->expectedMinorProtocolVersion = 2; - $this->httpEntrySample = $this->loadResponse( - dirname(__FILE__) . '/_files/AppSample1.txt' - ); - $this->httpEntrySampleWithoutVersion = $this->loadResponse( - dirname(__FILE__) . '/_files/AppSample2.txt' - ); - $this->httpFeedSample = $this->loadResponse( - dirname(__FILE__) . '/_files/AppSample3.txt' - ); - $this->httpFeedSampleWithoutVersion = $this->loadResponse( - dirname(__FILE__) . '/_files/AppSample4.txt' - ); - - $this->adapter = new Test_Zend_Gdata_MockHttpClient(); - $this->client = new Zend_Gdata_HttpClient(); - $this->client->setAdapter($this->adapter); - $this->service = new Zend_Gdata_App($this->client); - } - - public function loadResponse($filename) - { - $response = file_get_contents($filename); - - // Line endings are sometimes an issue inside the canned responses; the - // following is a negative lookbehind assertion, and replaces any \n - // not preceded by \r with the sequence \r\n, ensuring that the message - // is well-formed. - return preg_replace("#(?fileName, - 'Zend_Gdata_App_Feed', true); - $this->assertEquals('dive into mark', $feed->title->text); - } - - public function testSetAndGetHttpMethodOverride() - { - Zend_Gdata_App::setHttpMethodOverride(true); - $this->assertEquals(true, Zend_Gdata_App::getHttpMethodOverride()); - } - - public function testSetAndGetProtocolVersion() - { - $this->service->setMajorProtocolVersion(2); - $this->service->setMinorProtocolVersion(1); - $this->assertEquals(2, $this->service->getMajorProtocolVersion()); - $this->assertEquals(1, $this->service->getMinorProtocolVersion()); - } - - public function testDefaultProtocolVersionIs1X() - { - $this->assertEquals(1, $this->service->getMajorProtocolVersion()); - $this->assertEquals(null, $this->service->getMinorProtocolVersion()); - } - - public function testMajorProtocolVersionCannotBeLessThanOne() - { - $exceptionCaught = false; - try { - $this->service->setMajorProtocolVersion(0); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - $exceptionCaught = true; - } - $this->assertTrue($exceptionCaught, 'Expected exception not caught: ' - + 'Zend_Gdata_App_InvalidArgumentException'); - } - - public function testMajorProtocolVersionCannotBeNull() - { - $exceptionCaught = false; - try { - $this->service->setMajorProtocolVersion(null); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - $exceptionCaught = true; - } - $this->assertTrue($exceptionCaught, 'Expected exception not caught: ' - + 'Zend_Gdata_App_InvalidArgumentException'); - } - - public function testMinorProtocolVersionCannotBeLessThanZero() - { - $exceptionCaught = false; - try { - $this->service->setMinorProtocolVersion(-1); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - $exceptionCaught = true; - } - $this->assertTrue($exceptionCaught, 'Expected exception not caught: ' - + 'Zend_Gdata_App_InvalidArgumentException'); - } - - public function testNoGdataVersionHeaderSentWhenUsingV1() - { - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - - $this->service->setMajorProtocolVersion(1); - $this->service->setMinorProtocolVersion(null); - $this->service->get('http://www.example.com'); - - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if (strstr($header, 'GData-Version:')) - $found = true; - } - $this->assertFalse($found, 'Version header found in V1 feed'); - } - - public function testNoGdataVersionHeaderSentWhenUsingV1X() - { - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - - $this->service->setMajorProtocolVersion(1); - $this->service->setMinorProtocolVersion(1); - $this->service->get('http://www.example.com'); - - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if (strstr($header, 'GData-Version:')) - $found = true; - } - $this->assertTrue(!$found, 'Version header found in V1 feed'); - } - - public function testGdataVersionHeaderSentWhenUsingV2() - { - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - - $this->service->setMajorProtocolVersion(2); - $this->service->setMinorProtocolVersion(null); - $this->service->get('http://www.example.com'); - - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'GData-Version: 2') - $found = true; - } - $this->assertTrue($found, 'Version header not found or incorrect'); - } - - public function testGdataVersionHeaderSentWhenUsingV2X() - { - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - - $this->service->setMajorProtocolVersion(2); - $this->service->setMinorProtocolVersion(1); - $this->service->get('http://www.example.com'); - - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'GData-Version: 2') - $found = true; - } - $this->assertTrue($found, 'Version header not found or incorrect'); - } - - public function testHTTPETagsPropagateToEntriesOnGet() - { - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->getEntry('http://www.example.com'); - $this->assertEquals($this->expectedEtag, $entry->getEtag()); - } - - public function testHTTPETagsPropagateToEntriesOnUpdate() - { - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $newEntry = $this->service->updateEntry($entry, 'http://www.example.com'); - $this->assertEquals($this->expectedEtag, $newEntry->getEtag()); - } - - public function testHTTPEtagsPropagateToEntriesOnInsert() - { - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $newEntry = $this->service->insertEntry($entry, 'http://www.example.com'); - $this->assertEquals($this->expectedEtag, $newEntry->getEtag()); - } - - public function testIfMatchHTTPHeaderSetOnUpdate() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $this->service->updateEntry($entry); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect'); - } - - public function testIfMatchHTTPHeaderSetOnUpdateIfWeak() - { - $etag = 'W/ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $this->service->updateEntry($entry); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertFalse($found, 'If-Match header found'); - } - - public function testIfMatchHTTPHeaderSetOnSave() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $entry->setService($this->service); - $entry->save(); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect'); - } - - public function testIfMatchHTTPHeaderNotSetOnDelete() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $entry->setService($this->service); - $entry->delete(); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertFalse($found, 'If-Match header found on delete'); - } - - public function testIfMatchHTTPHeaderSetOnManualPost() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = $this->service->newEntry(); - $entry->setEtag($etag); - $entry->setService($this->service); - $this->service->post($entry, 'http://www.example.com'); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect'); - } - - public function testIfMatchHTTPHeaderSetOnManualPut() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $entry->setService($this->service); - $this->service->put($entry); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect'); - } - - public function testIfMatchHTTPHeaderSetOnManualDelete() - { - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = $this->service->newEntry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $entry->setService($this->service); - $this->service->delete($entry); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertFalse($found, 'If-Match header found on delete'); - } - - public function testIfMatchHeaderCanBeSetOnInsert() { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $newEntry = $this->service->insertEntry($entry, - 'http://www.example.com', - 'Zend_Gdata_App_Entry', - array('If-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect'); - } - - public function testIfNoneMatchHeaderCanBeSetOnInsert() { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $newEntry = $this->service->insertEntry($entry, - 'http://www.example.com', - 'Zend_Gdata_App_Entry', - array('If-None-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-None-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, 'If-None-Match header not found or incorrect '); - } - - public function testIfMatchHeaderCanBeSetOnUpdate() { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $newEntry = $this->service->updateEntry($entry, - 'http://www.example.com', - 'Zend_Gdata_App_Entry', - array('If-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, 'If-Match header not found or incorrect or incorrect'); - } - - public function testIfNoneMatchHeaderCanBeSetOnUpdate() { - $etagOverride = 'foo'; - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $this->adapter->setResponse($this->httpEntrySample); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $newEntry = $this->service->updateEntry($entry, - 'http://www.example.com', - 'Zend_Gdata_App_Entry', - array('If-None-Match' => $etagOverride)); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-None-Match: ' . $etagOverride) - $found = true; - } - $this->assertTrue($found, 'If-None-Match header not found or incorrect'); - } - - /** - * @group ZF-8397 - */ - public function testIfMatchHTTPHeaderIsResetEachRequest() - { - // Update an entry - $etag = 'ABCD1234'; - $this->adapter->setResponse("HTTP/1.1 201 Created"); - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->link = array(new Zend_Gdata_App_Extension_Link( - 'http://www.example.com', - 'edit', - 'application/atom+xml')); - $entry->setEtag($etag); - $this->service->updateEntry($entry); - - // Get another entry without ETag set, - // Previous value of If-Match HTTP header should not be sent - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->getEntry('http://www.example.com'); - $headers = $this->adapter->popRequest()->headers; - $found = false; - foreach ($headers as $header) { - if ($header == 'If-Match: ' . $etag) - $found = true; - } - $this->assertFalse($found, 'If-Match header found'); - } - - public function testGenerateIfMatchHeaderDataReturnsEtagIfV2() { - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $result = $this->service->generateIfMatchHeaderData($entry, false); - $this->assertEquals($etag, $result); - } - - public function testGenerateIfMatchHeaderDataReturnsNullIfV1() { - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(1); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $result = $this->service->generateIfMatchHeaderData($entry, false); - $this->assertEquals(null, $result); - } - - public function testGenerateIfMatchHeaderDataReturnsNullIfNotEntry() { - $this->service->setMajorProtocolVersion(2); - $result = $this->service->generateIfMatchHeaderData("Hello world", false); - $this->assertEquals(null, $result); - } - - public function testGenerateIfMatchHeaderDataReturnsNullIfWeak() { - $etag = 'W/ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $result = $this->service->generateIfMatchHeaderData($entry, false); - $this->assertEquals(null, $result); - } - - public function testGenerateIfMatchHeaderDataReturnsEtagIfWeakAndFlagSet() { - $etag = 'W/ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $result = $this->service->generateIfMatchHeaderData($entry, true); - $this->assertEquals($etag, $result); - } - - public function testGenerateIfMatchHeaderDataReturnsEtagIfNotWeakAndFlagSet() { - $etag = 'ABCD1234'; - $this->service->setMajorProtocolVersion(2); - $entry = new Zend_Gdata_App_Entry(); - $entry->setEtag($etag); - $result = $this->service->generateIfMatchHeaderData($entry, true); - $this->assertEquals($etag, $result); - } - - public function testImportUrlSetsMajorProtocolVersionOnEntry() { - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->getEntry('http://www.example.com'); - $this->assertEquals($this->expectedMajorProtocolVersion, $entry->getMajorProtocolVersion()); - } - - public function testImportUrlSetsMinorProtocolVersionOnEntry() { - $this->adapter->setResponse($this->httpEntrySample); - $entry = $this->service->getEntry('http://www.example.com'); - $this->assertEquals($this->expectedMinorProtocolVersion, $entry->getMinorProtocolVersion()); - } - - public function testImportUrlSetsNullVersionIfNoVersionHeaderOnEntry() { - $this->adapter->setResponse($this->httpEntrySampleWithoutVersion); - $entry = $this->service->getEntry('http://www.example.com'); - $this->assertEquals(null, $entry->getMinorProtocolVersion()); - $this->assertEquals(null, $entry->getMinorProtocolVersion()); - } - - public function testImportUrlSetsMajorProtocolVersionOnFeed() { - $this->adapter->setResponse($this->httpFeedSample); - $feed = $this->service->getFeed('http://www.example.com'); - $this->assertEquals($this->expectedMajorProtocolVersion, $feed->getMajorProtocolVersion()); - foreach ($feed as $entry) { - $this->assertEquals($this->expectedMajorProtocolVersion, $entry->getMajorProtocolVersion()); - } - } - - public function testImportUrlSetsMinorProtocolVersionOnFeed() { - $this->adapter->setResponse($this->httpFeedSample); - $feed = $this->service->getFeed('http://www.example.com'); - $this->assertEquals($this->expectedMinorProtocolVersion, $feed->getMinorProtocolVersion()); - foreach ($feed as $entry) { - $this->assertEquals($this->expectedMinorProtocolVersion, $entry->getMinorProtocolVersion()); - } - } - - public function testImportUrlSetsNullVersionIfNoVersionHeaderOnFeed() { - $this->adapter->setResponse($this->httpFeedSampleWithoutVersion); - $feed = $this->service->getFeed('http://www.example.com'); - $this->assertEquals(null, $feed->getMajorProtocolVersion()); - $this->assertEquals(null, $feed->getMinorProtocolVersion()); - foreach ($feed as $entry) { - $this->assertEquals(null, $entry->getMajorProtocolVersion()); - $this->assertEquals(null, $entry->getMinorProtocolVersion()); - } - } - - public function testMagicConstructorsPropogateMajorVersion() { - $v = 42; - $this->service->setMajorProtocolVersion($v); - $feed = $this->service->newFeed(); - $this->assertEquals($v, $feed->getMajorProtocolVersion()); - } - - public function testMagicConstructorsPropogateMinorVersion() { - $v = 84; - $this->service->setMinorProtocolVersion($v); - $feed = $this->service->newFeed(); - $this->assertEquals($v, $feed->getMinorProtocolVersion()); - } - - /** - * When error handler is overridden to throw an ErrorException, the extension loader - * in Zend_Gdata will throw an ErrorException when the class doesn't exist in the - * first extension directory even if it exists in subsequent ones. This test - * enforces a fix that keeps this from happening - * - * @group ZF-12268 - * @group ZF-7013 - */ - public function testLoadExtensionCausesFatalErrorWhenErrorHandlerIsOverridden() - { - // Override the error handler to throw an ErrorException - set_error_handler(create_function('$a, $b, $c, $d', 'throw new ErrorException($b, 0, $a, $c, $d);'), E_ALL); - try { - $eq = $this->service->newEventQuery(); - restore_error_handler(); - $this->assertTrue($eq instanceof Zend_Gdata_Calendar_EventQuery); - } catch ( Zend_Gdata_App_Exception $ex ) { - // If we catch this exception, it means the ErrorException resulting - // from the include_once E_NOTICE was caught in the right place, - // but the extension was not found in any directory - // (Expected since we didn't load the Calendar extension dir) - restore_error_handler(); - $this->assertContains('EventQuery', $ex->getMessage()); - } catch ( ErrorException $ex ) { - restore_error_handler(); - $this->fail('Did not expect ErrorException'); - } - } - - /** - * @group ZF-10243 - */ - public function testStaticImportWithoutUsingObjectMapping() - { - $this->adapter->setResponse($this->httpEntrySample); - $feed = Zend_Gdata_App::import( - 'http://www.example.com', - $this->client, - 'Zend_Gdata_App_Feed', - false - ); - - $this->assertContains('12345678901234567890', $feed); - } -} diff --git a/tests/Zend/Gdata/AttendeeStatusTest.php b/tests/Zend/Gdata/AttendeeStatusTest.php deleted file mode 100644 index 4a18527229..0000000000 --- a/tests/Zend/Gdata/AttendeeStatusTest.php +++ /dev/null @@ -1,125 +0,0 @@ -attendeeStatusText = file_get_contents( - 'Zend/Gdata/_files/AttendeeStatusElementSample1.xml', - true); - $this->attendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); - } - - public function testEmptyAttendeeStatusShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->attendeeStatus->extensionElements)); - $this->assertTrue(count($this->attendeeStatus->extensionElements) == 0); - } - - public function testEmptyAttendeeStatusShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->attendeeStatus->extensionAttributes)); - $this->assertTrue(count($this->attendeeStatus->extensionAttributes) == 0); - } - - public function testSampleAttendeeStatusShouldHaveNoExtensionElements() { - $this->attendeeStatus->transferFromXML($this->attendeeStatusText); - $this->assertTrue(is_array($this->attendeeStatus->extensionElements)); - $this->assertTrue(count($this->attendeeStatus->extensionElements) == 0); - } - - public function testSampleAttendeeStatusShouldHaveNoExtensionAttributes() { - $this->attendeeStatus->transferFromXML($this->attendeeStatusText); - $this->assertTrue(is_array($this->attendeeStatus->extensionAttributes)); - $this->assertTrue(count($this->attendeeStatus->extensionAttributes) == 0); - } - - public function testNormalAttendeeStatusShouldHaveNoExtensionElements() { - $this->attendeeStatus->value = "http://schemas.google.com/g/2005#event.accepted"; - - $this->assertEquals("http://schemas.google.com/g/2005#event.accepted", $this->attendeeStatus->value); - - $this->assertEquals(0, count($this->attendeeStatus->extensionElements)); - $newAttendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); - $newAttendeeStatus->transferFromXML($this->attendeeStatus->saveXML()); - $this->assertEquals(0, count($newAttendeeStatus->extensionElements)); - $newAttendeeStatus->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newAttendeeStatus->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.accepted", $newAttendeeStatus->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newAttendeeStatus2 = $gdata->newAttendeeStatus(); - $newAttendeeStatus2->transferFromXML($newAttendeeStatus->saveXML()); - $this->assertEquals(1, count($newAttendeeStatus2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.accepted", $newAttendeeStatus2->value); - } - - public function testEmptyAttendeeStatusToAndFromStringShouldMatch() { - $attendeeStatusXml = $this->attendeeStatus->saveXML(); - $newAttendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); - $newAttendeeStatus->transferFromXML($attendeeStatusXml); - $newAttendeeStatusXml = $newAttendeeStatus->saveXML(); - $this->assertTrue($attendeeStatusXml == $newAttendeeStatusXml); - } - - public function testAttendeeStatusWithValueToAndFromStringShouldMatch() { - $this->attendeeStatus->value = "http://schemas.google.com/g/2005#event.accepted"; - $attendeeStatusXml = $this->attendeeStatus->saveXML(); - $newAttendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); - $newAttendeeStatus->transferFromXML($attendeeStatusXml); - $newAttendeeStatusXml = $newAttendeeStatus->saveXML(); - $this->assertTrue($attendeeStatusXml == $newAttendeeStatusXml); - $this->assertEquals("http://schemas.google.com/g/2005#event.accepted", $this->attendeeStatus->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->attendeeStatus->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->attendeeStatus->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->attendeeStatus->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->attendeeStatus->extensionAttributes['foo2']['value']); - $attendeeStatusXml = $this->attendeeStatus->saveXML(); - $newAttendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); - $newAttendeeStatus->transferFromXML($attendeeStatusXml); - $this->assertEquals('bar', $newAttendeeStatus->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newAttendeeStatus->extensionAttributes['foo2']['value']); - } - - public function testConvertFullAttendeeStatusToAndFromString() { - $this->attendeeStatus->transferFromXML($this->attendeeStatusText); - $this->assertEquals("http://schemas.google.com/g/2005#event.invited", $this->attendeeStatus->value); - } - -} diff --git a/tests/Zend/Gdata/AttendeeTypeTest.php b/tests/Zend/Gdata/AttendeeTypeTest.php deleted file mode 100644 index 1adbc68ae0..0000000000 --- a/tests/Zend/Gdata/AttendeeTypeTest.php +++ /dev/null @@ -1,125 +0,0 @@ -attendeeTypeText = file_get_contents( - 'Zend/Gdata/_files/AttendeeTypeElementSample1.xml', - true); - $this->attendeeType = new Zend_Gdata_Extension_AttendeeType(); - } - - public function testEmptyAttendeeTypeShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->attendeeType->extensionElements)); - $this->assertTrue(count($this->attendeeType->extensionElements) == 0); - } - - public function testEmptyAttendeeTypeShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->attendeeType->extensionAttributes)); - $this->assertTrue(count($this->attendeeType->extensionAttributes) == 0); - } - - public function testSampleAttendeeTypeShouldHaveNoExtensionElements() { - $this->attendeeType->transferFromXML($this->attendeeTypeText); - $this->assertTrue(is_array($this->attendeeType->extensionElements)); - $this->assertTrue(count($this->attendeeType->extensionElements) == 0); - } - - public function testSampleAttendeeTypeShouldHaveNoExtensionAttributes() { - $this->attendeeType->transferFromXML($this->attendeeTypeText); - $this->assertTrue(is_array($this->attendeeType->extensionAttributes)); - $this->assertTrue(count($this->attendeeType->extensionAttributes) == 0); - } - - public function testNormalAttendeeTypeShouldHaveNoExtensionElements() { - $this->attendeeType->value = "http://schemas.google.com/g/2005#event.optional"; - - $this->assertEquals("http://schemas.google.com/g/2005#event.optional", $this->attendeeType->value); - - $this->assertEquals(0, count($this->attendeeType->extensionElements)); - $newAttendeeType = new Zend_Gdata_Extension_AttendeeType(); - $newAttendeeType->transferFromXML($this->attendeeType->saveXML()); - $this->assertEquals(0, count($newAttendeeType->extensionElements)); - $newAttendeeType->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newAttendeeType->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.optional", $newAttendeeType->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newAttendeeType2 = $gdata->newAttendeeType(); - $newAttendeeType2->transferFromXML($newAttendeeType->saveXML()); - $this->assertEquals(1, count($newAttendeeType2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.optional", $newAttendeeType2->value); - } - - public function testEmptyAttendeeTypeToAndFromStringShouldMatch() { - $attendeeTypeXml = $this->attendeeType->saveXML(); - $newAttendeeType = new Zend_Gdata_Extension_AttendeeType(); - $newAttendeeType->transferFromXML($attendeeTypeXml); - $newAttendeeTypeXml = $newAttendeeType->saveXML(); - $this->assertTrue($attendeeTypeXml == $newAttendeeTypeXml); - } - - public function testAttendeeTypeWithValueToAndFromStringShouldMatch() { - $this->attendeeType->value = "http://schemas.google.com/g/2005#event.optional"; - $attendeeTypeXml = $this->attendeeType->saveXML(); - $newAttendeeType = new Zend_Gdata_Extension_AttendeeType(); - $newAttendeeType->transferFromXML($attendeeTypeXml); - $newAttendeeTypeXml = $newAttendeeType->saveXML(); - $this->assertTrue($attendeeTypeXml == $newAttendeeTypeXml); - $this->assertEquals("http://schemas.google.com/g/2005#event.optional", $this->attendeeType->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->attendeeType->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->attendeeType->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->attendeeType->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->attendeeType->extensionAttributes['foo2']['value']); - $attendeeTypeXml = $this->attendeeType->saveXML(); - $newAttendeeType = new Zend_Gdata_Extension_AttendeeType(); - $newAttendeeType->transferFromXML($attendeeTypeXml); - $this->assertEquals('bar', $newAttendeeType->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newAttendeeType->extensionAttributes['foo2']['value']); - } - - public function testConvertFullAttendeeTypeToAndFromString() { - $this->attendeeType->transferFromXML($this->attendeeTypeText); - $this->assertEquals("http://schemas.google.com/g/2005#event.required", $this->attendeeType->value); - } - -} diff --git a/tests/Zend/Gdata/AuthSubTest.php b/tests/Zend/Gdata/AuthSubTest.php deleted file mode 100755 index b44a19ef5e..0000000000 --- a/tests/Zend/Gdata/AuthSubTest.php +++ /dev/null @@ -1,272 +0,0 @@ -assertEquals('https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fwww.example.com%2Ffoo.php&scope=http://www.google.com/calendar/feeds&secure=0&session=1', $uri); - } - - public function testGetAuthSubTokenUriModifiedBase() - { - $uri = Zend_Gdata_AuthSub::getAuthSubTokenUri( - 'http://www.example.com/foo.php', //next - 'http://www.google.com/calendar/feeds', //scope - 0, //secure - 1, //session - 'http://www.otherauthservice.com/accounts/AuthSubRequest'); - - // Note: the scope here is not encoded. It should be encoded, - // but the method getAuthSubTokenUri calls urldecode($scope). - // This currently works (no reported bugs) as web browsers will - // handle the encoding in most cases. - $this->assertEquals('http://www.otherauthservice.com/accounts/AuthSubRequest?next=http%3A%2F%2Fwww.example.com%2Ffoo.php&scope=http://www.google.com/calendar/feeds&secure=0&session=1', $uri); - } - - public function testSecureAuthSubSigning() - { - if (!extension_loaded('openssl')) { - $this->markTestSkipped('The openssl extension is not available'); - } else { - $c = new Zend_Gdata_HttpClient(); - $c->setAuthSubPrivateKeyFile("Zend/Gdata/_files/RsaKey.pem", - null, true); - $c->setAuthSubToken('abcdefg'); - $requestData = $c->filterHttpRequest('POST', - 'http://www.example.com/feed', - array(), - 'foo bar', - 'text/plain'); - - $authHeaderCheckPassed = false; - $headers = $requestData['headers']; - foreach ($headers as $headerName => $headerValue) { - if (strtolower($headerName) == 'authorization') { - preg_match('/data="([^"]*)"/', $headerValue, $matches); - $dataToSign = $matches[1]; - preg_match('/sig="([^"]*)"/', $headerValue, $matches); - $sig = $matches[1]; - if (function_exists('openssl_verify')) { - $fp = fopen('Zend/Gdata/_files/RsaCert.pem', 'r', true); - $cert = ''; - while (!feof($fp)) { - $cert .= fread($fp, 8192); - } - fclose($fp); - $pubkeyid = openssl_get_publickey($cert); - $verified = openssl_verify($dataToSign, - base64_decode($sig), $pubkeyid); - $this->assertEquals( - 1, $verified, - 'The generated signature was unable ' . - 'to be verified.'); - $authHeaderCheckPassed = true; - } - } - } - $this->assertEquals(true, $authHeaderCheckPassed, - 'Auth header not found for sig verification.'); - } - } - - public function testPrivateKeyNotFound() - { - $this->setExpectedException('Zend_Gdata_App_InvalidArgumentException'); - - if (!extension_loaded('openssl')) { - $this->markTestSkipped('The openssl extension is not available'); - } else { - $c = new Zend_Gdata_HttpClient(); - $c->setAuthSubPrivateKeyFile("zendauthsubfilenotfound", null, true); - } - } - - public function testAuthSubSessionTokenReceivesSuccessfulResult() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setResponse("HTTP/1.1 200 OK\r\n\r\nToken={$this->token}\r\nExpiration=20201004T123456Z"); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $respToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($this->token, $client); - $this->assertEquals($this->token, $respToken); - } - - /** - * @expectedException Zend_Gdata_App_AuthException - */ - public function testAuthSubSessionTokenCatchesFailedResult() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setResponse("HTTP/1.1 500 Internal Server Error\r\n\r\nInternal Server Error"); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $newtok = Zend_Gdata_AuthSub::getAuthSubSessionToken($this->token, $client); - } - - /** - * @expectedException Zend_Gdata_App_HttpException - */ - public function testAuthSubSessionTokenCatchesHttpClientException() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setNextRequestWillFail(true); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $newtok = Zend_Gdata_AuthSub::getAuthSubSessionToken($this->token, $client); - } - - public function testAuthSubRevokeTokenReceivesSuccessfulResult() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setResponse("HTTP/1.1 200 OK"); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $revoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($this->token, $client); - $this->assertTrue($revoked); - } - - public function testAuthSubRevokeTokenCatchesFailedResult() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setResponse("HTTP/1.1 500 Not Successful"); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $revoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($this->token, $client); - $this->assertFalse($revoked); - } - - /** - * @expectedException Zend_Gdata_App_HttpException - */ - public function testAuthSubRevokeTokenCatchesHttpClientException() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setNextRequestWillFail(true); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $revoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($this->token, $client); - } - - public function testGetAuthSubTokenInfoReceivesSuccessfulResult() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $response = "HTTP/1.1 200 OK\r\n\r\nTarget=http://example.com\nScope=http://example.com\nSecure=false"; - $adapter->setResponse($response); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $respBody = Zend_Gdata_AuthSub::getAuthSubTokenInfo($this->token, $client); - - $this->assertContains("Target=http://example.com", $respBody); - $this->assertContains("Scope=http://example.com", $respBody); - $this->assertContains("Secure=false", $respBody); - } - - /** - * @expectedException Zend_Gdata_App_HttpException - */ - public function testGetAuthSubTokenInfoCatchesHttpClientException() - { - $adapter = new Zend_Http_Client_Adapter_Test(); - $adapter->setNextRequestWillFail(true); - - $client = new Zend_Gdata_HttpClient(); - $client->setUri('http://example.com/AuthSub'); - $client->setAdapter($adapter); - - $revoked = Zend_Gdata_AuthSub::getAuthSubTokenInfo($this->token, $client); - } - - public function testGetHttpClientProvidesNewClientWhenNullPassed() - { - $client = Zend_Gdata_AuthSub::getHttpClient($this->token); - $this->assertTrue($client instanceof Zend_Gdata_HttpClient ); - $this->assertEquals($this->token, $client->getAuthSubToken()); - } - - /** - * @group ZF-11351 - * @expectedException Zend_Gdata_App_HttpException - */ - public function testAuthSubGetHttpClientShouldThrowExceptionOnVanillaHttpClient() - { - $client = new Zend_Http_Client(); - $client->setUri('http://example.com/AuthSub'); - $gdclient = Zend_Gdata_AuthSub::getHttpClient('FakeToken', $client); - $this->fail('Expected exception Zend_Gdata_App_HttpException not raised!'); - } - -} diff --git a/tests/Zend/Gdata/Books/CollectionEntryTest.php b/tests/Zend/Gdata/Books/CollectionEntryTest.php deleted file mode 100644 index 6a4b9d4e3a..0000000000 --- a/tests/Zend/Gdata/Books/CollectionEntryTest.php +++ /dev/null @@ -1,48 +0,0 @@ -gdata = new Zend_Gdata_Books_CollectionEntry(); - } - - public function testCollectionEntry() - { - $this->assertTrue(true); - } - -} diff --git a/tests/Zend/Gdata/Books/CollectionFeedTest.php b/tests/Zend/Gdata/Books/CollectionFeedTest.php deleted file mode 100644 index 902f7f7078..0000000000 --- a/tests/Zend/Gdata/Books/CollectionFeedTest.php +++ /dev/null @@ -1,48 +0,0 @@ -gdata = new Zend_Gdata_Books_CollectionFeed(); - } - - public function testCollectionFeed() - { - $this->assertTrue(true); - } - -} diff --git a/tests/Zend/Gdata/Books/VolumeEntryTest.php b/tests/Zend/Gdata/Books/VolumeEntryTest.php deleted file mode 100644 index 566f466d14..0000000000 --- a/tests/Zend/Gdata/Books/VolumeEntryTest.php +++ /dev/null @@ -1,125 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Books/_files/VolumeEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Books_VolumeEntry(); - } - - private function verifySamplePropertiesAreCorrect ($volumeEntry) { - $this->assertEquals('http://www.google.com/books/feeds/volumes/Mfer_MFwQrkC', - $volumeEntry->id->text); - $this->assertEquals('2008-10-07T15:28:15.000Z', $volumeEntry->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $volumeEntry->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/books/2008#volume', $volumeEntry->category[0]->term); - $this->assertEquals('http://bks1.books.google.com/books?id=Mfer_MFwQrkC&printsec=frontcover&img=1&zoom=5&sig=ACfU3U1o90VpMryPI7WKSyIhmAWdC1uDtw&source=gbs_gdata', $volumeEntry->getThumbnailLink()->href); - $this->assertEquals('http://books.google.com/books?id=Mfer_MFwQrkC&ie=ISO-8859-1&source=gbs_gdata', $volumeEntry->getInfoLink()->href); - $this->assertEquals(null, $volumeEntry->getPreviewLink()); - $creators = $volumeEntry->getCreators(); - $this->assertEquals('William Shakespeare', $creators[0]->text); - $titles = $volumeEntry->getTitles(); - $this->assertEquals('Hamlet', $titles[0]->text); - $dates = $volumeEntry->getDates(); - $this->assertEquals('2002-02', $dates[0]->text); - $identifiers = $volumeEntry->getIdentifiers(); - $this->assertEquals('Mfer_MFwQrkC', $identifiers[0]->text); - $this->assertEquals('ISBN:0198320493', $identifiers[1]->text); - $languages = $volumeEntry->getLanguages(); - $this->assertEquals('en', $languages[0]->text); - $formats = $volumeEntry->getFormats(); - $this->assertEquals('178 pages', $formats[0]->text); - $publishers = $volumeEntry->getPublishers(); - $this->assertEquals('Oxford University Press', $publishers[0]->text); - $subjects = $volumeEntry->getSubjects(); - $this->assertEquals('Denmark', $subjects[0]->text); - $this->assertEquals(null, $volumeEntry->getPreviewLink()); - $this->assertEquals('http://www.google.com/books/feeds/users/me/volumes', $volumeEntry->getAnnotationLink()->href); - $this->assertEquals('http://books.google.com/books?id=Mfer_MFwQrkC&ie=ISO-8859-1&source=gbs_gdata', $volumeEntry->getInfoLink()->href); - $this->assertEquals('http://bks1.books.google.com/books?id=Mfer_MFwQrkC&printsec=frontcover&img=1&zoom=5&sig=ACfU3U1o90VpMryPI7WKSyIhmAWdC1uDtw&source=gbs_gdata', $volumeEntry->getThumbnailLink()->href); - $this->assertEquals('Denmark', $subjects[0]->text); - $this->assertEquals('http://schemas.google.com/books/2008#view_partial', $volumeEntry->getViewability()->value); - $this->assertEquals('Mfer_MFwQrkC', $volumeEntry->getVolumeId()); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertEquals(0, count($this->entry->extensionElements)); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertEquals(0, count($this->entry->extensionAttributes)); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertEquals(0, count($this->entry->extensionElements)); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertEquals(0, count($this->entry->extensionAttributes)); - } - - public function testEmptyVolumeEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newVolumeEntry = new Zend_Gdata_Books_VolumeEntry(); - $newVolumeEntry->transferFromXML($entryXml); - $newVolumeEntryXml = $newVolumeEntry->saveXML(); - $this->assertEquals($entryXml, $newVolumeEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifySamplePropertiesAreCorrect($this->entry); - } - - public function testConvertVolumeEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newVolumeEntry = new Zend_Gdata_Books_VolumeEntry(); - $newVolumeEntry->transferFromXML($entryXml); - $this->verifySamplePropertiesAreCorrect($newVolumeEntry); - $newVolumeEntryXml = $newVolumeEntry->saveXML(); - $this->assertEquals($entryXml, $newVolumeEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Books/VolumeFeedTest.php b/tests/Zend/Gdata/Books/VolumeFeedTest.php deleted file mode 100644 index 6d6ba7ef7a..0000000000 --- a/tests/Zend/Gdata/Books/VolumeFeedTest.php +++ /dev/null @@ -1,108 +0,0 @@ -feedText = file_get_contents( - 'Zend/Gdata/Books/_files/VolumeFeedDataSample1.xml', - true); - $this->feed = new Zend_Gdata_Books_VolumeFeed(); - } - - private function verifyAllSamplePropertiesAreCorrect ($volumeFeed) { - $this->assertEquals('http://www.google.com/books/feeds/volumes', - $volumeFeed->id->text); - $this->assertEquals('2008-10-07T16:41:52.000Z', $volumeFeed->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $volumeFeed->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/books/2008#volume', $volumeFeed->category[0]->term); - $this->assertEquals('text', $volumeFeed->title->type); - $this->assertEquals('Search results for Hamlet', $volumeFeed->title->text);; - $this->assertEquals('self', $volumeFeed->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $volumeFeed->getLink('self')->type); - $this->assertEquals('http://www.google.com/books/feeds/volumes?q=Hamlet&start-index=3&max-results=5', $volumeFeed->getLink('self')->href); - $this->assertEquals('Google Books Search', $volumeFeed->author[0]->name->text); - $this->assertEquals('http://www.google.com', $volumeFeed->author[0]->uri->text); - $this->assertEquals(512, $volumeFeed->totalResults->text); - $this->assertEquals(3, $volumeFeed->startIndex->text); - $this->assertEquals(5, $volumeFeed->itemsPerPage->text); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->feed->extensionElements)); - $this->assertEquals(0, count($this->feed->extensionElements)); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->feed->extensionAttributes)); - $this->assertEquals(0, count($this->feed->extensionAttributes)); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->feed->transferFromXML($this->feedText); - $this->assertTrue(is_array($this->feed->extensionElements)); - $this->assertEquals(0, count($this->feed->extensionElements)); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->feed->transferFromXML($this->feedText); - $this->assertTrue(is_array($this->feed->extensionAttributes)); - $this->assertEquals(0, count($this->feed->extensionAttributes)); - } - - public function testEmptyVolumeFeedToAndFromStringShouldMatch() { - $entryXml = $this->feed->saveXML(); - $newVolumeFeed = new Zend_Gdata_Books_VolumeFeed(); - $newVolumeFeed->transferFromXML($entryXml); - $newVolumeFeedXml = $newVolumeFeed->saveXML(); - $this->assertEquals($entryXml, $newVolumeFeedXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->feed->transferFromXML($this->feedText); - $this->verifyAllSamplePropertiesAreCorrect($this->feed); - } - - public function testConvertVolumeFeedToAndFromString() { - $this->feed->transferFromXML($this->feedText); - $entryXml = $this->feed->saveXML(); - $newVolumeFeed = new Zend_Gdata_Books_VolumeFeed(); - $newVolumeFeed->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newVolumeFeed); - $newVolumeFeedXml = $newVolumeFeed->saveXML(); - $this->assertEquals($entryXml, $newVolumeFeedXml); - } - -} diff --git a/tests/Zend/Gdata/Books/_files/VolumeEntryDataSample1.xml b/tests/Zend/Gdata/Books/_files/VolumeEntryDataSample1.xml deleted file mode 100644 index 0b6cd9516e..0000000000 --- a/tests/Zend/Gdata/Books/_files/VolumeEntryDataSample1.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - http://www.google.com/books/feeds/volumes/Mfer_MFwQrkC - 2008-10-07T15:28:15.000Z - - Hamlet - - - - - - - - - Bad review... - William Shakespeare - Roma Gill - 2002-02 - Featuring the images of some of the world's most famous stage and film actors, these additions to the all-new Oxford School Shakespeare introduce--and enthrall--young people to one of the greatest writers of all time. This season brings revised editions of five of the Bard's most famous plays--As You Like It, Othello, Hamlet, Love's Labour Lost and The Taming of the Shrew. Designed specifically for students unfamiliar with Shakespeare's rich literary legacy, these new editions present Shakespeare's sometimes-intimidating Middle English in a way that is easy-to-read and engaging for ages twelve and up. The notes and introductions have been completely revised, allowing unprecedented clarity and accessibility. Featuring new covers and new illustrations--including photos from recent productions of Shakespeare's plays from around the world--Oxford School Shakespeare brings all the pleasure of these literary treasures to life. - 178 pages - Mfer_MFwQrkC - ISBN:0198320493 - en - Oxford University Press - Denmark - Hamlet (Legendary character)/ Drama - Murder victims' families/ Drama - Juvenile Nonfiction / Drama - Drama / English, Irish, Scottish, Welsh - Drama / Shakespeare - Hamlet - diff --git a/tests/Zend/Gdata/Books/_files/VolumeFeedDataSample1.xml b/tests/Zend/Gdata/Books/_files/VolumeFeedDataSample1.xml deleted file mode 100644 index 5f17aaa084..0000000000 --- a/tests/Zend/Gdata/Books/_files/VolumeFeedDataSample1.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - http://www.google.com/books/feeds/volumes - 2008-10-07T16:41:52.000Z - - Search results for Hamlet - - - - - - - Google Books Search - http://www.google.com - - Google Book Search data API - 512 - 3 - 5 - - http://www.google.com/books/feeds/volumes/aCI_v2-QH04C - 2008-10-07T16:41:52.000Z - - Hamlet - - - - - - - - - William Shakespeare - Barbara Mowat - Paul Werstine - 2003-07-01 - Each edition includes:• Freshly edited text based on the best early printed version of the play• Full explanatory notes conveniently placed on pages facing... - 400 pages - aCI_v2-QH04C - ISBN:074347712X - Washington Square Press - Fiction - Hamlet - Prince of Denmark - - - http://www.google.com/books/feeds/volumes/VBoVAAAAYAAJ - 2008-10-07T16:41:52.000Z - - Hamlet - - - - - - - - - William Shakespeare - George Pierce Baker - 1913 - 219 pages - VBoVAAAAYAAJ - HARVARD:32044100887074 - Hamlet (Legendary character) - Hamlet - Prince of Denmark - - - http://www.google.com/books/feeds/volumes/S5YvAgAACAAJ - 2008-10-07T16:41:52.000Z - - Hamlet - - - - - - - - William Shakespeare - 1995-05-01 - Among Shakespeare&#39;s plays, &quot;Hamlet&quot; is considered by many hismasterpiece. - S5YvAgAACAAJ - ISBN:0811468259 - Heinemann/Raintree - Juvenile Fiction - Hamlet - - - http://www.google.com/books/feeds/volumes/Hxk3SFdOJr4C - 2008-10-07T16:41:52.000Z - - Hamlet - - - - - - - - - William Shakespeare - Alan Durband - 1987-05-01 - The significance of the plays is reinforced by sections discussing Shakespeare&#39;s life, works and theatre. - 336 pages - Hxk3SFdOJr4C - ISBN:0748703462 - Nelson Thornes Ltd - Drama - Hamlet - Shakespeare Made Easy - - - http://www.google.com/books/feeds/volumes/lZE0AAAAMAAJ - 2008-10-07T16:41:52.000Z - - Julius Caesar - - - - - - - - - William Shakespeare - Samuel Thurber - Arthur Wilson Verity - 1895 - Tan leather binding, gold-embossed, with gilt pattern insert and coat of arms on cover. - 123 pages - lZE0AAAAMAAJ - UOM:39015063516275 - Conspiracies - Julius Caesar - - diff --git a/tests/Zend/Gdata/BooksOnlineTest.php b/tests/Zend/Gdata/BooksOnlineTest.php deleted file mode 100644 index c0141ce719..0000000000 --- a/tests/Zend/Gdata/BooksOnlineTest.php +++ /dev/null @@ -1,108 +0,0 @@ -gdata = new Zend_Gdata_Books($client); - } - - public function testGetVolumeFeed() - { - $query = $this->gdata->newVolumeQuery(); - $query->setQuery('Hamlet'); - $query->setStartIndex(5); - $query->setMaxResults(8); - $query->setMinViewability('partial_view'); - $feed = $this->gdata->getVolumeFeed($query); - - $this->assertTrue($feed instanceof Zend_Gdata_Books_VolumeFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Books_VolumeEntry); - $this->assertEquals($feed->getHttpClient(), $entry->getHttpClient()); - } - - $this->assertEquals(5, $feed->startIndex->text); - $this->assertEquals(8, $feed->itemsPerPage->text); - } - - public function testGetVolumetEntry() - { - $entry = $this->gdata->getVolumeEntry('Mfer_MFwQrkC'); - $this->assertTrue($entry instanceof Zend_Gdata_Books_VolumeEntry); - } - - public function testUserLibraryFeed() - { - $feed = $this->gdata->getUserLibraryFeed(); - $this->assertTrue($feed instanceof Zend_Gdata_Books_VolumeFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Books_VolumeEntry); - $this->assertEquals( - $feed->getHttpClient(), $entry->getHttpClient()); - } - - $entry = new Zend_Gdata_Books_VolumeEntry(); - $entry->setId(new Zend_Gdata_App_Extension_Id('Mfer_MFwQrkC')); - $newEntry = $this->gdata->insertVolume($entry); - $this->assertTrue($newEntry instanceof Zend_Gdata_Books_VolumeEntry); - $this->gdata->deleteVolume($newEntry); - } - - public function testUserAnnotationFeed() - { - $feed = $this->gdata->getUserAnnotationFeed(); - $this->assertTrue($feed instanceof Zend_Gdata_Books_VolumeFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Books_VolumeEntry); - $this->assertEquals( - $feed->getHttpClient(), $entry->getHttpClient()); - } - - $entry = new Zend_Gdata_Books_VolumeEntry(); - $entry->setId(new Zend_Gdata_App_Extension_Id('Mfer_MFwQrkC')); - $entry->setRating(new Zend_Gdata_Extension_Rating(3, 1, 5, 1)); - $newEntry = $this->gdata->insertVolume($entry, - Zend_Gdata_Books::MY_ANNOTATION_FEED_URI); - $this->assertTrue($newEntry instanceof Zend_Gdata_Books_VolumeEntry); - $this->gdata->deleteVolume($newEntry); - } -} diff --git a/tests/Zend/Gdata/BooksTest.php b/tests/Zend/Gdata/BooksTest.php deleted file mode 100644 index d14c3b8359..0000000000 --- a/tests/Zend/Gdata/BooksTest.php +++ /dev/null @@ -1,48 +0,0 @@ -gdata = new Zend_Gdata_Books(new Zend_Http_Client()); - } - - public function testBooks() - { - $this->assertTrue(true); - } - -} diff --git a/tests/Zend/Gdata/Calendar/AccessLevelTest.php b/tests/Zend/Gdata/Calendar/AccessLevelTest.php deleted file mode 100644 index b7fbc01b8c..0000000000 --- a/tests/Zend/Gdata/Calendar/AccessLevelTest.php +++ /dev/null @@ -1,124 +0,0 @@ -accessLevelText = file_get_contents( - 'Zend/Gdata/Calendar/_files/AccessLevelElementSample1.xml', - true); - $this->accessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); - } - - public function testEmptyAccessLevelShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->accessLevel->extensionElements)); - $this->assertTrue(count($this->accessLevel->extensionElements) == 0); - } - - public function testEmptyAccessLevelShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->accessLevel->extensionAttributes)); - $this->assertTrue(count($this->accessLevel->extensionAttributes) == 0); - } - - public function testSampleAccessLevelShouldHaveNoExtensionElements() { - $this->accessLevel->transferFromXML($this->accessLevelText); - $this->assertTrue(is_array($this->accessLevel->extensionElements)); - $this->assertTrue(count($this->accessLevel->extensionElements) == 0); - } - - public function testSampleAccessLevelShouldHaveNoExtensionAttributes() { - $this->accessLevel->transferFromXML($this->accessLevelText); - $this->assertTrue(is_array($this->accessLevel->extensionAttributes)); - $this->assertTrue(count($this->accessLevel->extensionAttributes) == 0); - } - - public function testNormalAccessLevelShouldHaveNoExtensionElements() { - $this->accessLevel->value = 'freebusy'; - $this->assertEquals($this->accessLevel->value, 'freebusy'); - $this->assertEquals(count($this->accessLevel->extensionElements), 0); - $newAccessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); - $newAccessLevel->transferFromXML($this->accessLevel->saveXML()); - $this->assertEquals(count($newAccessLevel->extensionElements), 0); - $newAccessLevel->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newAccessLevel->extensionElements), 1); - $this->assertEquals($newAccessLevel->value, 'freebusy'); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newAccessLevel2 = $cal->newAccessLevel(); - $newAccessLevel2->transferFromXML($newAccessLevel->saveXML()); - $this->assertEquals(count($newAccessLevel2->extensionElements), 1); - $this->assertEquals($newAccessLevel2->value, 'freebusy'); - } - - public function testEmptyAccessLevelToAndFromStringShouldMatch() { - $accessLevelXml = $this->accessLevel->saveXML(); - $newAccessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); - $newAccessLevel->transferFromXML($accessLevelXml); - $newAccessLevelXml = $newAccessLevel->saveXML(); - $this->assertTrue($accessLevelXml == $newAccessLevelXml); - } - - public function testAccessLevelWithValueToAndFromStringShouldMatch() { - $this->accessLevel->value = 'freebusy'; - $accessLevelXml = $this->accessLevel->saveXML(); - $newAccessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); - $newAccessLevel->transferFromXML($accessLevelXml); - $newAccessLevelXml = $newAccessLevel->saveXML(); - $this->assertTrue($accessLevelXml == $newAccessLevelXml); - $this->assertEquals('freebusy', $newAccessLevel->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->accessLevel->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->accessLevel->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->accessLevel->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->accessLevel->extensionAttributes['foo2']['value']); - $accessLevelXml = $this->accessLevel->saveXML(); - $newAccessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); - $newAccessLevel->transferFromXML($accessLevelXml); - $this->assertEquals('bar', $newAccessLevel->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newAccessLevel->extensionAttributes['foo2']['value']); - } - - public function testConvertFullAccessLevelToAndFromString() { - $this->accessLevel->transferFromXML($this->accessLevelText); - $this->assertEquals($this->accessLevel->value, 'owner'); - } - -} diff --git a/tests/Zend/Gdata/Calendar/ColorTest.php b/tests/Zend/Gdata/Calendar/ColorTest.php deleted file mode 100644 index 9bb00aa60e..0000000000 --- a/tests/Zend/Gdata/Calendar/ColorTest.php +++ /dev/null @@ -1,124 +0,0 @@ -colorText = file_get_contents( - 'Zend/Gdata/Calendar/_files/ColorElementSample1.xml', - true); - $this->color = new Zend_Gdata_Calendar_Extension_Color(); - } - - public function testEmptyColorShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->color->extensionElements)); - $this->assertTrue(count($this->color->extensionElements) == 0); - } - - public function testEmptyColorShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->color->extensionAttributes)); - $this->assertTrue(count($this->color->extensionAttributes) == 0); - } - - public function testSampleColorShouldHaveNoExtensionElements() { - $this->color->transferFromXML($this->colorText); - $this->assertTrue(is_array($this->color->extensionElements)); - $this->assertTrue(count($this->color->extensionElements) == 0); - } - - public function testSampleColorShouldHaveNoExtensionAttributes() { - $this->color->transferFromXML($this->colorText); - $this->assertTrue(is_array($this->color->extensionAttributes)); - $this->assertTrue(count($this->color->extensionAttributes) == 0); - } - - public function testNormalColorShouldHaveNoExtensionElements() { - $this->color->value = '#abcdef'; - $this->assertEquals($this->color->value, '#abcdef'); - $this->assertEquals(count($this->color->extensionElements), 0); - $newColor = new Zend_Gdata_Calendar_Extension_Color(); - $newColor->transferFromXML($this->color->saveXML()); - $this->assertEquals(count($newColor->extensionElements), 0); - $newColor->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newColor->extensionElements), 1); - $this->assertEquals($newColor->value, '#abcdef'); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newColor2 = $cal->newColor(); - $newColor2->transferFromXML($newColor->saveXML()); - $this->assertEquals(count($newColor2->extensionElements), 1); - $this->assertEquals($newColor2->value, '#abcdef'); - } - - public function testEmptyColorToAndFromStringShouldMatch() { - $colorXml = $this->color->saveXML(); - $newColor = new Zend_Gdata_Calendar_Extension_Color(); - $newColor->transferFromXML($colorXml); - $newColorXml = $newColor->saveXML(); - $this->assertTrue($colorXml == $newColorXml); - } - - public function testColorWithValueToAndFromStringShouldMatch() { - $this->color->value = '#abcdef'; - $colorXml = $this->color->saveXML(); - $newColor = new Zend_Gdata_Calendar_Extension_Color(); - $newColor->transferFromXML($colorXml); - $newColorXml = $newColor->saveXML(); - $this->assertTrue($colorXml == $newColorXml); - $this->assertEquals('#abcdef', $newColor->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->color->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->color->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->color->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->color->extensionAttributes['foo2']['value']); - $colorXml = $this->color->saveXML(); - $newColor = new Zend_Gdata_Calendar_Extension_Color(); - $newColor->transferFromXML($colorXml); - $this->assertEquals('bar', $newColor->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newColor->extensionAttributes['foo2']['value']); - } - - public function testConvertFullColorToAndFromString() { - $this->color->transferFromXML($this->colorText); - $this->assertEquals($this->color->value, '#5A6986'); - } - -} diff --git a/tests/Zend/Gdata/Calendar/EventEntryTest.php b/tests/Zend/Gdata/Calendar/EventEntryTest.php deleted file mode 100644 index b646332d73..0000000000 --- a/tests/Zend/Gdata/Calendar/EventEntryTest.php +++ /dev/null @@ -1,138 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Calendar/_files/EventEntrySample1.xml', - true); - $this->entry = new Zend_Gdata_Calendar_EventEntry(); - } - - public function testSetters() { - $entry = new Zend_Gdata_Calendar_EventEntry(); - $who = new Zend_Gdata_Extension_Who(); - $who->setValueString("John Doe"); - $who->setEmail("john@doe.com"); - $entry->setWho($who); - $whoRetrieved = $entry->getWho(); - $this->assertEquals("john@doe.com", $whoRetrieved->getEmail()); - $this->assertEquals("John Doe", $whoRetrieved->getValueString()); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyEventEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newEventEntry = new Zend_Gdata_Calendar_EventEntry(); - $newEventEntry->transferFromXML($entryXml); - $newEventEntryXml = $newEventEntry->saveXML(); - $this->assertTrue($entryXml == $newEventEntryXml); - } - - public function testConvertEventEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newEventEntry = new Zend_Gdata_Calendar_EventEntry(); - $newEventEntry->transferFromXML($entryXml); - $newEventEntryXml = $newEventEntry->saveXML(); - $this->assertEquals($entryXml, $newEventEntryXml); - $this->assertEquals('http://www.google.com/calendar/feeds/default/private/full/s0dtsvq4pe15ku09jideg67fv4_20070509T193000Z', - $newEventEntry->id->text); - $this->assertEquals('Mantek', - $newEventEntry->extendedProperty[0]->value); - $this->assertEquals('s0dtsvq4pe15ku09jideg67fv4', - $newEventEntry->originalEvent->id); - $this->assertEquals('s0dtsvq4pe15ku09jideg67fv4', - $newEventEntry->originalEvent->id); - $this->assertEquals('http://www.google.com/calendar/feeds/default/private/full/s0dtsvq4pe15ku09jideg67fv4_20070509T193000Z/comments', - $newEventEntry->comments->feedLink->href); - } - -/* - public function testEventEntryWithTextAndTypeToAndFromStringShouldMatch() { - $this->feed->text = ''; - $this->feed->type = 'xhtml'; - $feedXml = $this->feed->saveXML(); - $newEventEntry = new Zend_Gdata_App_EventEntry(); - $newEventEntry->transferFromXML($feedXml); - $newEventEntryXml = $newEventEntry->saveXML(); - $this->assertEquals($newEventEntryXml, $feedXml); - $this->assertEquals('', $newEventEntry->text); - $this->assertEquals('xhtml', $newEventEntry->type); - } - - public function testEventEntryWithSrcAndTypeToAndFromStringShouldMatch() { - $this->feed->src = 'http://www.example.com/image.png'; - $this->feed->type = 'image/png'; - $feedXml = $this->feed->saveXML(); - $newEventEntry = new Zend_Gdata_App_EventEntry(); - $newEventEntry->transferFromXML($feedXml); - $newEventEntryXml = $newEventEntry->saveXML(); - $this->assertEquals($newEventEntryXml, $feedXml); - $this->assertEquals('http://www.example.com/image.png', $newEventEntry->src); - $this->assertEquals('image/png', $newEventEntry->type); - } - - public function testConvertEventEntryWithSrcAndTypeToAndFromString() { - $this->feed->transferFromXML($this->feedText); - $this->assertEquals('http://www.example.com/image.png', $this->feed->src); - $this->assertEquals('image/png', $this->feed->type); - } -*/ - -} diff --git a/tests/Zend/Gdata/Calendar/EventQueryExceptionTest.php b/tests/Zend/Gdata/Calendar/EventQueryExceptionTest.php deleted file mode 100644 index 2694403933..0000000000 --- a/tests/Zend/Gdata/Calendar/EventQueryExceptionTest.php +++ /dev/null @@ -1,68 +0,0 @@ -query = new Zend_Gdata_Calendar_EventQuery(); - } - - /** - * @expectedException Zend_Gdata_App_Exception - */ - public function testSingleEventsThrowsExceptionOnSetInvalidValue() - { - $this->query->resetParameters(); - $singleEvents = 'puppy'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setSingleEvents($singleEvents); - } - - /** - * @expectedException Zend_Gdata_App_Exception - */ - public function testFutureEventsThrowsExceptionOnSetInvalidValue() - { - $this->query->resetParameters(); - $futureEvents = 'puppy'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setFutureEvents($futureEvents); - } - -} diff --git a/tests/Zend/Gdata/Calendar/EventQueryTest.php b/tests/Zend/Gdata/Calendar/EventQueryTest.php deleted file mode 100644 index a4f14aa50c..0000000000 --- a/tests/Zend/Gdata/Calendar/EventQueryTest.php +++ /dev/null @@ -1,270 +0,0 @@ -query = new Zend_Gdata_Calendar_EventQuery(); - } - - public function testDefaultBaseUrlForQuery() - { - $queryUrl = $this->query->getQueryUrl(); - $this->assertEquals('https://www.google.com/calendar/feeds/default/public/full', - $queryUrl); - } - - public function testAlternateBaseUrlForQuery() - { - $this->query = new Zend_Gdata_Calendar_EventQuery('http://www.foo.com'); - $queryUrl = $this->query->getQueryUrl(); - // the URL passed in the constructor has the user, visibility - // projection appended for the return value of $query->getQueryUrl() - $this->assertEquals('http://www.foo.com/default/public/full', $queryUrl); - } - - public function testUpdatedMinMaxParam() - { - $updatedMin = '2006-09-20'; - $updatedMax = '2006-11-05'; - $this->query->resetParameters(); - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setUpdatedMin($updatedMin); - $this->query->setUpdatedMax($updatedMax); - $this->assertTrue($this->query->updatedMin != null); - $this->assertTrue($this->query->updatedMax != null); - $this->assertTrue($this->query->user != null); - $this->assertEquals(Zend_Gdata_App_Util::formatTimestamp($updatedMin), $this->query->getUpdatedMin()); - $this->assertEquals(Zend_Gdata_App_Util::formatTimestamp($updatedMax), $this->query->getUpdatedMax()); - $this->assertEquals(self::GOOGLE_DEVELOPER_CALENDAR, $this->query->getUser()); - - $this->query->updatedMin = null; - $this->assertFalse($this->query->updatedMin != null); - $this->query->updatedMax = null; - $this->assertFalse($this->query->updatedMax != null); - $this->query->user = null; - $this->assertFalse($this->query->user != null); - } - - public function testStartMinMaxParam() - { - $this->query->resetParameters(); - $startMin = '2006-10-30'; - $startMax = '2006-11-01'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setStartMin($startMin); - $this->query->setStartMax($startMax); - $this->assertTrue($this->query->startMin != null); - $this->assertTrue($this->query->startMax != null); - $this->assertEquals(Zend_Gdata_App_Util::formatTimestamp($startMin), $this->query->getStartMin()); - $this->assertEquals(Zend_Gdata_App_Util::formatTimestamp($startMax), $this->query->getStartMax()); - - $this->query->startMin = null; - $this->assertFalse($this->query->startMin != null); - $this->query->startMax = null; - $this->assertFalse($this->query->startMax != null); - $this->query->user = null; - $this->assertFalse($this->query->user != null); - } - - public function testVisibilityParam() - { - $this->query->resetParameters(); - $visibility = 'private'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setVisibility($visibility); - $this->assertTrue($this->query->visibility != null); - $this->assertEquals($visibility, $this->query->getVisibility()); - $this->query->visibility = null; - $this->assertFalse($this->query->visibility != null); - } - - public function testProjectionParam() - { - $this->query->resetParameters(); - $projection = 'composite'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setProjection($projection); - $this->assertTrue($this->query->projection != null); - $this->assertEquals($projection, $this->query->getProjection()); - $this->query->projection = null; - $this->assertFalse($this->query->projection != null); - } - - public function testOrderbyParam() - { - $this->query->resetParameters(); - $orderby = 'starttime'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setOrderby($orderby); - $this->assertTrue($this->query->orderby != null); - $this->assertEquals($orderby, $this->query->getOrderby()); - $this->query->orderby = null; - $this->assertFalse($this->query->orderby != null); - } - - public function testEventParam() - { - $this->query->resetParameters(); - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setEvent(self::ZEND_CONFERENCE_EVENT); - $this->assertTrue($this->query->event != null); - $this->assertEquals(self::ZEND_CONFERENCE_EVENT, $this->query->getEvent()); - $this->query->event = null; - $this->assertFalse($this->query->event != null); - } - - public function testCommentsParam() - { - $this->query->resetParameters(); - $comment = 'we need to reschedule'; - $this->query->setComments($comment); - $this->assertTrue($this->query->comments != null); - $this->assertEquals($comment, $this->query->getComments()); - $this->query->comments = null; - $this->assertFalse(isset($this->query->comments)); - } - - public function testSortOrder() - { - $this->query->resetParameters(); - $sortOrder = 'ascending'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setSortOrder($sortOrder); - $this->assertTrue($this->query->sortOrder != null); - $this->assertEquals($sortOrder, $this->query->getSortOrder()); - $this->query->sortOrder = null; - $this->assertFalse($this->query->sortOrder != null); - } - - public function testRecurrenceExpansionStart() - { - $this->query->resetParameters(); - $res = self::SAMPLE_RFC3339; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setRecurrenceExpansionStart($res); - $this->assertTrue($this->query->recurrenceExpansionStart != null); - $this->assertEquals($res, $this->query->getRecurrenceExpansionStart()); - $this->query->recurrenceExpansionStart = null; - $this->assertFalse($this->query->recurrenceExpansionStart != null); - } - - public function testRecurrenceExpansionEnd() - { - $this->query->resetParameters(); - $ree = self::SAMPLE_RFC3339; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setRecurrenceExpansionEnd($ree); - $this->assertTrue($this->query->recurrenceExpansionEnd != null); - $this->assertEquals($ree, $this->query->getRecurrenceExpansionEnd()); - $this->query->recurrenceExpansionEnd = null; - $this->assertFalse($this->query->recurrenceExpansionEnd != null); - } - - public function testSingleEvents() - { - $this->query->resetParameters(); - // Test string handling - $singleEvents = 'true'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setSingleEvents($singleEvents); - $this->assertTrue($this->query->singleEvents === true); - // Test bool handling - $singleEvents = false; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setSingleEvents($singleEvents); - $this->assertTrue($this->query->singleEvents === false); - // Test unsetting - $this->assertEquals($singleEvents, $this->query->getSingleEvents()); - $this->query->setSingleEvents(null); - $this->assertFalse($this->query->singleEvents != null); - } - - public function testFutureEvents() - { - $this->query->resetParameters(); - // Test string handling - $singleEvents = 'true'; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setFutureEvents($singleEvents); - $this->assertTrue($this->query->futureEvents === true); - // Test bool handling - $singleEvents = false; - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setFutureEvents($singleEvents); - $this->assertTrue($this->query->futureEvents === false); - // Test unsetting - $this->query->futureEvents = null; - $this->assertFalse($this->query->futureEvents != null); - - } - - public function testCustomQueryURIGeneration() - { - $this->query->resetParameters(); - $this->query->setUser(self::GOOGLE_DEVELOPER_CALENDAR); - $this->query->setVisibility("private"); - $this->query->setProjection("composite"); - $this->query->setEvent(self::ZEND_CONFERENCE_EVENT); - $this->query->setComments(self::ZEND_CONFERENCE_EVENT_COMMENT); - $this->assertEquals("https://www.google.com/calendar/feeds/developer-calendar@google.com/private/composite/" . - self::ZEND_CONFERENCE_EVENT . "/comments/" . self::ZEND_CONFERENCE_EVENT_COMMENT, - $this->query->getQueryUrl()); - } - - public function testDefaultQueryURIGeneration() - { - $this->query->resetParameters(); - $this->assertEquals("https://www.google.com/calendar/feeds/default/public/full", - $this->query->getQueryUrl()); - } - - public function testCanNullifyParameters() - { - $testURI = "http://www.google.com/calendar/feeds/foo%40group.calendar.google.com/private/full"; - $this->query = new Zend_Gdata_Calendar_EventQuery($testURI); - $this->query->setUser(null); - $this->query->setVisibility(null); - $this->query->setProjection(null); - $result = $this->query->getQueryUrl(); - $this->assertEquals($testURI, $result); - } -} diff --git a/tests/Zend/Gdata/Calendar/HiddenTest.php b/tests/Zend/Gdata/Calendar/HiddenTest.php deleted file mode 100644 index 0e465ec108..0000000000 --- a/tests/Zend/Gdata/Calendar/HiddenTest.php +++ /dev/null @@ -1,124 +0,0 @@ -hiddenText = file_get_contents( - 'Zend/Gdata/Calendar/_files/HiddenElementSample1.xml', - true); - $this->hidden = new Zend_Gdata_Calendar_Extension_Hidden(); - } - - public function testEmptyHiddenShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->hidden->extensionElements)); - $this->assertTrue(count($this->hidden->extensionElements) == 0); - } - - public function testEmptyHiddenShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->hidden->extensionAttributes)); - $this->assertTrue(count($this->hidden->extensionAttributes) == 0); - } - - public function testSampleHiddenShouldHaveNoExtensionElements() { - $this->hidden->transferFromXML($this->hiddenText); - $this->assertTrue(is_array($this->hidden->extensionElements)); - $this->assertTrue(count($this->hidden->extensionElements) == 0); - } - - public function testSampleHiddenShouldHaveNoExtensionAttributes() { - $this->hidden->transferFromXML($this->hiddenText); - $this->assertTrue(is_array($this->hidden->extensionAttributes)); - $this->assertTrue(count($this->hidden->extensionAttributes) == 0); - } - - public function testNormalHiddenShouldHaveNoExtensionElements() { - $this->hidden->value = true; - $this->assertEquals($this->hidden->value, true); - $this->assertEquals(count($this->hidden->extensionElements), 0); - $newHidden = new Zend_Gdata_Calendar_Extension_Hidden(); - $newHidden->transferFromXML($this->hidden->saveXML()); - $this->assertEquals(count($newHidden->extensionElements), 0); - $newHidden->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newHidden->extensionElements), 1); - $this->assertEquals($newHidden->value, true); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newHidden2 = $cal->newHidden(); - $newHidden2->transferFromXML($newHidden->saveXML()); - $this->assertEquals(count($newHidden2->extensionElements), 1); - $this->assertEquals($newHidden2->value, true); - } - - public function testEmptyHiddenToAndFromStringShouldMatch() { - $hiddenXml = $this->hidden->saveXML(); - $newHidden = new Zend_Gdata_Calendar_Extension_Hidden(); - $newHidden->transferFromXML($hiddenXml); - $newHiddenXml = $newHidden->saveXML(); - $this->assertTrue($hiddenXml == $newHiddenXml); - } - - public function testHiddenWithValueToAndFromStringShouldMatch() { - $this->hidden->value = true; - $hiddenXml = $this->hidden->saveXML(); - $newHidden = new Zend_Gdata_Calendar_Extension_Hidden(); - $newHidden->transferFromXML($hiddenXml); - $newHiddenXml = $newHidden->saveXML(); - $this->assertTrue($hiddenXml == $newHiddenXml); - $this->assertEquals(true, $newHidden->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->hidden->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->hidden->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->hidden->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->hidden->extensionAttributes['foo2']['value']); - $hiddenXml = $this->hidden->saveXML(); - $newHidden = new Zend_Gdata_Calendar_Extension_Hidden(); - $newHidden->transferFromXML($hiddenXml); - $this->assertEquals('bar', $newHidden->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newHidden->extensionAttributes['foo2']['value']); - } - - public function testConvertFullHiddenToAndFromString() { - $this->hidden->transferFromXML($this->hiddenText); - $this->assertEquals($this->hidden->value, false); - } - -} diff --git a/tests/Zend/Gdata/Calendar/LinkTest.php b/tests/Zend/Gdata/Calendar/LinkTest.php deleted file mode 100644 index 40f58c2e8f..0000000000 --- a/tests/Zend/Gdata/Calendar/LinkTest.php +++ /dev/null @@ -1,165 +0,0 @@ -linkText = file_get_contents( - 'Zend/Gdata/Calendar/_files/LinkElementSample1.xml', - true); - $this->link = new Zend_Gdata_Calendar_Extension_Link(); - } - - public function testEmptyLinkShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->link->extensionElements)); - $this->assertTrue(count($this->link->extensionElements) == 0); - } - - public function testEmptyLinkShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->link->extensionAttributes)); - $this->assertTrue(count($this->link->extensionAttributes) == 0); - } - - public function testSampleLinkShouldHaveNoExtensionElements() { - $this->link->transferFromXML($this->linkText); - $this->assertTrue(is_array($this->link->extensionElements)); - $this->assertTrue(count($this->link->extensionElements) == 0); - } - - public function testSampleLinkShouldHaveNoExtensionAttributes() { - $this->link->transferFromXML($this->linkText); - $this->assertTrue(is_array($this->link->extensionAttributes)); - $this->assertTrue(count($this->link->extensionAttributes) == 0); - } - - public function testNormalLinkShouldHaveNoExtensionElements() { - $this->link->rel = "http://nowhere.invalid/"; - $this->link->title = "Somewhere"; - $this->link->href = "http://somewhere.invalid/"; - $this->link->type = "text/plain"; - $this->link->webContent = new Zend_Gdata_Calendar_Extension_WebContent("a", "1", "2"); - - $this->assertEquals($this->link->rel, "http://nowhere.invalid/"); - $this->assertEquals($this->link->title, "Somewhere"); - $this->assertEquals($this->link->href, "http://somewhere.invalid/"); - $this->assertEquals($this->link->type, "text/plain"); - $this->assertEquals($this->link->webcontent->url, "a"); - $this->assertEquals($this->link->webcontent->height, "1"); - $this->assertEquals($this->link->webcontent->width, "2"); - - $this->assertEquals(count($this->link->extensionElements), 0); - $newLink = new Zend_Gdata_Calendar_Extension_Link(); - $newLink->transferFromXML($this->link->saveXML()); - $this->assertEquals(count($newLink->extensionElements), 0); - $newLink->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newLink->extensionElements), 1); - $this->assertEquals($newLink->rel, "http://nowhere.invalid/"); - $this->assertEquals($newLink->title, "Somewhere"); - $this->assertEquals($newLink->href, "http://somewhere.invalid/"); - $this->assertEquals($newLink->type, "text/plain"); - $this->assertEquals($newLink->webcontent->url, "a"); - $this->assertEquals($newLink->webcontent->height, "1"); - $this->assertEquals($newLink->webcontent->width, "2"); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newLink2 = $cal->newLink(); - $newLink2->transferFromXML($newLink->saveXML()); - $this->assertEquals(count($newLink2->extensionElements), 1); - $this->assertEquals($newLink2->rel, "http://nowhere.invalid/"); - $this->assertEquals($newLink2->title, "Somewhere"); - $this->assertEquals($newLink2->href, "http://somewhere.invalid/"); - $this->assertEquals($newLink2->type, "text/plain"); - $this->assertEquals($newLink2->webcontent->url, "a"); - $this->assertEquals($newLink2->webcontent->height, "1"); - $this->assertEquals($newLink2->webcontent->width, "2"); - } - - public function testEmptyLinkToAndFromStringShouldMatch() { - $linkXml = $this->link->saveXML(); - $newLink = new Zend_Gdata_Calendar_Extension_Link(); - $newLink->transferFromXML($linkXml); - $newLinkXml = $newLink->saveXML(); - $this->assertTrue($linkXml == $newLinkXml); - } - - public function testLinkWithValueToAndFromStringShouldMatch() { - $this->link->rel = "http://nowhere.invalid/"; - $this->link->title = "Somewhere"; - $this->link->href = "http://somewhere.invalid/"; - $this->link->type = "text/plain"; - $this->link->webContent = new Zend_Gdata_Calendar_Extension_WebContent("a", "1", "2"); - $linkXml = $this->link->saveXML(); - $newLink = new Zend_Gdata_Calendar_Extension_Link(); - $newLink->transferFromXML($linkXml); - $newLinkXml = $newLink->saveXML(); - $this->assertTrue($linkXml == $newLinkXml); - $this->assertEquals($this->link->rel, "http://nowhere.invalid/"); - $this->assertEquals($this->link->title, "Somewhere"); - $this->assertEquals($this->link->href, "http://somewhere.invalid/"); - $this->assertEquals($this->link->type, "text/plain"); - $this->assertEquals($this->link->webcontent->url, "a"); - $this->assertEquals($this->link->webcontent->height, "1"); - $this->assertEquals($this->link->webcontent->width, "2"); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->link->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->link->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->link->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->link->extensionAttributes['foo2']['value']); - $linkXml = $this->link->saveXML(); - $newLink = new Zend_Gdata_Calendar_Extension_Link(); - $newLink->transferFromXML($linkXml); - $this->assertEquals('bar', $newLink->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newLink->extensionAttributes['foo2']['value']); - } - - public function testConvertFullLinkToAndFromString() { - $this->link->transferFromXML($this->linkText); - $this->assertEquals($this->link->rel, "http://schemas.google.com/gCal/2005/webContent"); - $this->assertEquals($this->link->title, "Independence Day"); - $this->assertEquals($this->link->href, "http://www.google.com/calendar/images/google-holiday.gif"); - $this->assertEquals($this->link->type, "image/gif"); - $this->assertEquals($this->link->webcontent->url, "http://www.google.com/logos/july4th06.gif"); - $this->assertEquals($this->link->webcontent->height, "120"); - $this->assertEquals($this->link->webcontent->width, "276"); - } - -} diff --git a/tests/Zend/Gdata/Calendar/QuickAddTest.php b/tests/Zend/Gdata/Calendar/QuickAddTest.php deleted file mode 100644 index b55109af94..0000000000 --- a/tests/Zend/Gdata/Calendar/QuickAddTest.php +++ /dev/null @@ -1,124 +0,0 @@ -quickAddText = file_get_contents( - 'Zend/Gdata/Calendar/_files/QuickAddElementSample1.xml', - true); - $this->quickAdd = new Zend_Gdata_Calendar_Extension_QuickAdd(); - } - - public function testEmptyQuickAddShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->quickAdd->extensionElements)); - $this->assertTrue(count($this->quickAdd->extensionElements) == 0); - } - - public function testEmptyQuickAddShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->quickAdd->extensionAttributes)); - $this->assertTrue(count($this->quickAdd->extensionAttributes) == 0); - } - - public function testSampleQuickAddShouldHaveNoExtensionElements() { - $this->quickAdd->transferFromXML($this->quickAddText); - $this->assertTrue(is_array($this->quickAdd->extensionElements)); - $this->assertTrue(count($this->quickAdd->extensionElements) == 0); - } - - public function testSampleQuickAddShouldHaveNoExtensionAttributes() { - $this->quickAdd->transferFromXML($this->quickAddText); - $this->assertTrue(is_array($this->quickAdd->extensionAttributes)); - $this->assertTrue(count($this->quickAdd->extensionAttributes) == 0); - } - - public function testNormalQuickAddShouldHaveNoExtensionElements() { - $this->quickAdd->value = false; - $this->assertEquals($this->quickAdd->value, false); - $this->assertEquals(count($this->quickAdd->extensionElements), 0); - $newQuickAdd = new Zend_Gdata_Calendar_Extension_QuickAdd(); - $newQuickAdd->transferFromXML($this->quickAdd->saveXML()); - $this->assertEquals(count($newQuickAdd->extensionElements), 0); - $newQuickAdd->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newQuickAdd->extensionElements), 1); - $this->assertEquals($newQuickAdd->value, false); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newQuickAdd2 = $cal->newQuickAdd(); - $newQuickAdd2->transferFromXML($newQuickAdd->saveXML()); - $this->assertEquals(count($newQuickAdd2->extensionElements), 1); - $this->assertEquals($newQuickAdd2->value, false); - } - - public function testEmptyQuickAddToAndFromStringShouldMatch() { - $quickAddXml = $this->quickAdd->saveXML(); - $newQuickAdd = new Zend_Gdata_Calendar_Extension_QuickAdd(); - $newQuickAdd->transferFromXML($quickAddXml); - $newQuickAddXml = $newQuickAdd->saveXML(); - $this->assertTrue($quickAddXml == $newQuickAddXml); - } - - public function testQuickAddWithValueToAndFromStringShouldMatch() { - $this->quickAdd->value = false; - $quickAddXml = $this->quickAdd->saveXML(); - $newQuickAdd = new Zend_Gdata_Calendar_Extension_QuickAdd(); - $newQuickAdd->transferFromXML($quickAddXml); - $newQuickAddXml = $newQuickAdd->saveXML(); - $this->assertTrue($quickAddXml == $newQuickAddXml); - $this->assertEquals(false, $newQuickAdd->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->quickAdd->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->quickAdd->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->quickAdd->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->quickAdd->extensionAttributes['foo2']['value']); - $quickAddXml = $this->quickAdd->saveXML(); - $newQuickAdd = new Zend_Gdata_Calendar_Extension_QuickAdd(); - $newQuickAdd->transferFromXML($quickAddXml); - $this->assertEquals('bar', $newQuickAdd->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newQuickAdd->extensionAttributes['foo2']['value']); - } - - public function testConvertFullQuickAddToAndFromString() { - $this->quickAdd->transferFromXML($this->quickAddText); - $this->assertEquals($this->quickAdd->value, true); - } - -} diff --git a/tests/Zend/Gdata/Calendar/SelectedTest.php b/tests/Zend/Gdata/Calendar/SelectedTest.php deleted file mode 100644 index ae4510b668..0000000000 --- a/tests/Zend/Gdata/Calendar/SelectedTest.php +++ /dev/null @@ -1,124 +0,0 @@ -selectedText = file_get_contents( - 'Zend/Gdata/Calendar/_files/SelectedElementSample1.xml', - true); - $this->selected = new Zend_Gdata_Calendar_Extension_Selected(); - } - - public function testEmptySelectedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->selected->extensionElements)); - $this->assertTrue(count($this->selected->extensionElements) == 0); - } - - public function testEmptySelectedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->selected->extensionAttributes)); - $this->assertTrue(count($this->selected->extensionAttributes) == 0); - } - - public function testSampleSelectedShouldHaveNoExtensionElements() { - $this->selected->transferFromXML($this->selectedText); - $this->assertTrue(is_array($this->selected->extensionElements)); - $this->assertTrue(count($this->selected->extensionElements) == 0); - } - - public function testSampleSelectedShouldHaveNoExtensionAttributes() { - $this->selected->transferFromXML($this->selectedText); - $this->assertTrue(is_array($this->selected->extensionAttributes)); - $this->assertTrue(count($this->selected->extensionAttributes) == 0); - } - - public function testNormalSelectedShouldHaveNoExtensionElements() { - $this->selected->value = true; - $this->assertEquals($this->selected->value, true); - $this->assertEquals(count($this->selected->extensionElements), 0); - $newSelected = new Zend_Gdata_Calendar_Extension_Selected(); - $newSelected->transferFromXML($this->selected->saveXML()); - $this->assertEquals(count($newSelected->extensionElements), 0); - $newSelected->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newSelected->extensionElements), 1); - $this->assertEquals($newSelected->value, true); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newSelected2 = $cal->newSelected(); - $newSelected2->transferFromXML($newSelected->saveXML()); - $this->assertEquals(count($newSelected2->extensionElements), 1); - $this->assertEquals($newSelected2->value, true); - } - - public function testEmptySelectedToAndFromStringShouldMatch() { - $selectedXml = $this->selected->saveXML(); - $newSelected = new Zend_Gdata_Calendar_Extension_Selected(); - $newSelected->transferFromXML($selectedXml); - $newSelectedXml = $newSelected->saveXML(); - $this->assertTrue($selectedXml == $newSelectedXml); - } - - public function testSelectedWithValueToAndFromStringShouldMatch() { - $this->selected->value = true; - $selectedXml = $this->selected->saveXML(); - $newSelected = new Zend_Gdata_Calendar_Extension_Selected(); - $newSelected->transferFromXML($selectedXml); - $newSelectedXml = $newSelected->saveXML(); - $this->assertTrue($selectedXml == $newSelectedXml); - $this->assertEquals(true, $newSelected->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->selected->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->selected->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->selected->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->selected->extensionAttributes['foo2']['value']); - $selectedXml = $this->selected->saveXML(); - $newSelected = new Zend_Gdata_Calendar_Extension_Selected(); - $newSelected->transferFromXML($selectedXml); - $this->assertEquals('bar', $newSelected->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newSelected->extensionAttributes['foo2']['value']); - } - - public function testConvertFullSelectedToAndFromString() { - $this->selected->transferFromXML($this->selectedText); - $this->assertEquals($this->selected->value, false); - } - -} diff --git a/tests/Zend/Gdata/Calendar/SendEventNotificationsTest.php b/tests/Zend/Gdata/Calendar/SendEventNotificationsTest.php deleted file mode 100644 index 328a840e26..0000000000 --- a/tests/Zend/Gdata/Calendar/SendEventNotificationsTest.php +++ /dev/null @@ -1,124 +0,0 @@ -sendEventNotificationsText = file_get_contents( - 'Zend/Gdata/Calendar/_files/SendEventNotificationsElementSample1.xml', - true); - $this->sendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); - } - - public function testEmptySendEventNotificationsShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->sendEventNotifications->extensionElements)); - $this->assertTrue(count($this->sendEventNotifications->extensionElements) == 0); - } - - public function testEmptySendEventNotificationsShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->sendEventNotifications->extensionAttributes)); - $this->assertTrue(count($this->sendEventNotifications->extensionAttributes) == 0); - } - - public function testSampleSendEventNotificationsShouldHaveNoExtensionElements() { - $this->sendEventNotifications->transferFromXML($this->sendEventNotificationsText); - $this->assertTrue(is_array($this->sendEventNotifications->extensionElements)); - $this->assertTrue(count($this->sendEventNotifications->extensionElements) == 0); - } - - public function testSampleSendEventNotificationsShouldHaveNoExtensionAttributes() { - $this->sendEventNotifications->transferFromXML($this->sendEventNotificationsText); - $this->assertTrue(is_array($this->sendEventNotifications->extensionAttributes)); - $this->assertTrue(count($this->sendEventNotifications->extensionAttributes) == 0); - } - - public function testNormalSendEventNotificationsShouldHaveNoExtensionElements() { - $this->sendEventNotifications->value = true; - $this->assertEquals($this->sendEventNotifications->value, true); - $this->assertEquals(count($this->sendEventNotifications->extensionElements), 0); - $newSendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); - $newSendEventNotifications->transferFromXML($this->sendEventNotifications->saveXML()); - $this->assertEquals(count($newSendEventNotifications->extensionElements), 0); - $newSendEventNotifications->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newSendEventNotifications->extensionElements), 1); - $this->assertEquals($newSendEventNotifications->value, true); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newSendEventNotifications2 = $cal->newSendEventNotifications(); - $newSendEventNotifications2->transferFromXML($newSendEventNotifications->saveXML()); - $this->assertEquals(count($newSendEventNotifications2->extensionElements), 1); - $this->assertEquals($newSendEventNotifications2->value, true); - } - - public function testEmptySendEventNotificationsToAndFromStringShouldMatch() { - $sendEventNotificationsXml = $this->sendEventNotifications->saveXML(); - $newSendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); - $newSendEventNotifications->transferFromXML($sendEventNotificationsXml); - $newSendEventNotificationsXml = $newSendEventNotifications->saveXML(); - $this->assertTrue($sendEventNotificationsXml == $newSendEventNotificationsXml); - } - - public function testSendEventNotificationsWithValueToAndFromStringShouldMatch() { - $this->sendEventNotifications->value = true; - $sendEventNotificationsXml = $this->sendEventNotifications->saveXML(); - $newSendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); - $newSendEventNotifications->transferFromXML($sendEventNotificationsXml); - $newSendEventNotificationsXml = $newSendEventNotifications->saveXML(); - $this->assertTrue($sendEventNotificationsXml == $newSendEventNotificationsXml); - $this->assertEquals(true, $newSendEventNotifications->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->sendEventNotifications->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->sendEventNotifications->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->sendEventNotifications->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->sendEventNotifications->extensionAttributes['foo2']['value']); - $sendEventNotificationsXml = $this->sendEventNotifications->saveXML(); - $newSendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); - $newSendEventNotifications->transferFromXML($sendEventNotificationsXml); - $this->assertEquals('bar', $newSendEventNotifications->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newSendEventNotifications->extensionAttributes['foo2']['value']); - } - - public function testConvertFullSendEventNotificationsToAndFromString() { - $this->sendEventNotifications->transferFromXML($this->sendEventNotificationsText); - $this->assertEquals($this->sendEventNotifications->value, false); - } - -} diff --git a/tests/Zend/Gdata/Calendar/TimezoneTest.php b/tests/Zend/Gdata/Calendar/TimezoneTest.php deleted file mode 100644 index 17be4e7296..0000000000 --- a/tests/Zend/Gdata/Calendar/TimezoneTest.php +++ /dev/null @@ -1,124 +0,0 @@ -timezoneText = file_get_contents( - 'Zend/Gdata/Calendar/_files/TimezoneElementSample1.xml', - true); - $this->timezone = new Zend_Gdata_Calendar_Extension_Timezone(); - } - - public function testEmptyTimezoneShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->timezone->extensionElements)); - $this->assertTrue(count($this->timezone->extensionElements) == 0); - } - - public function testEmptyTimezoneShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->timezone->extensionAttributes)); - $this->assertTrue(count($this->timezone->extensionAttributes) == 0); - } - - public function testSampleTimezoneShouldHaveNoExtensionElements() { - $this->timezone->transferFromXML($this->timezoneText); - $this->assertTrue(is_array($this->timezone->extensionElements)); - $this->assertTrue(count($this->timezone->extensionElements) == 0); - } - - public function testSampleTimezoneShouldHaveNoExtensionAttributes() { - $this->timezone->transferFromXML($this->timezoneText); - $this->assertTrue(is_array($this->timezone->extensionAttributes)); - $this->assertTrue(count($this->timezone->extensionAttributes) == 0); - } - - public function testNormalTimezoneShouldHaveNoExtensionElements() { - $this->timezone->value = "America/Chicago"; - $this->assertEquals($this->timezone->value, "America/Chicago"); - $this->assertEquals(count($this->timezone->extensionElements), 0); - $newTimezone = new Zend_Gdata_Calendar_Extension_Timezone(); - $newTimezone->transferFromXML($this->timezone->saveXML()); - $this->assertEquals(count($newTimezone->extensionElements), 0); - $newTimezone->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newTimezone->extensionElements), 1); - $this->assertEquals($newTimezone->value, "America/Chicago"); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newTimezone2 = $cal->newTimezone(); - $newTimezone2->transferFromXML($newTimezone->saveXML()); - $this->assertEquals(count($newTimezone2->extensionElements), 1); - $this->assertEquals($newTimezone2->value, "America/Chicago"); - } - - public function testEmptyTimezoneToAndFromStringShouldMatch() { - $timezoneXml = $this->timezone->saveXML(); - $newTimezone = new Zend_Gdata_Calendar_Extension_Timezone(); - $newTimezone->transferFromXML($timezoneXml); - $newTimezoneXml = $newTimezone->saveXML(); - $this->assertTrue($timezoneXml == $newTimezoneXml); - } - - public function testTimezoneWithValueToAndFromStringShouldMatch() { - $this->timezone->value = "America/Chicago"; - $timezoneXml = $this->timezone->saveXML(); - $newTimezone = new Zend_Gdata_Calendar_Extension_Timezone(); - $newTimezone->transferFromXML($timezoneXml); - $newTimezoneXml = $newTimezone->saveXML(); - $this->assertTrue($timezoneXml == $newTimezoneXml); - $this->assertEquals("America/Chicago", $newTimezone->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->timezone->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->timezone->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->timezone->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->timezone->extensionAttributes['foo2']['value']); - $timezoneXml = $this->timezone->saveXML(); - $newTimezone = new Zend_Gdata_Calendar_Extension_Timezone(); - $newTimezone->transferFromXML($timezoneXml); - $this->assertEquals('bar', $newTimezone->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newTimezone->extensionAttributes['foo2']['value']); - } - - public function testConvertFullTimezoneToAndFromString() { - $this->timezone->transferFromXML($this->timezoneText); - $this->assertEquals($this->timezone->value, "America/Los_Angeles"); - } - -} diff --git a/tests/Zend/Gdata/Calendar/WebContentTest.php b/tests/Zend/Gdata/Calendar/WebContentTest.php deleted file mode 100644 index d1149bf69b..0000000000 --- a/tests/Zend/Gdata/Calendar/WebContentTest.php +++ /dev/null @@ -1,140 +0,0 @@ -webContentText = file_get_contents( - 'Zend/Gdata/Calendar/_files/WebContentElementSample1.xml', - true); - $this->webContent = new Zend_Gdata_Calendar_Extension_WebContent(); - } - - public function testEmptyWebContentShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->webContent->extensionElements)); - $this->assertTrue(count($this->webContent->extensionElements) == 0); - } - - public function testEmptyWebContentShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->webContent->extensionAttributes)); - $this->assertTrue(count($this->webContent->extensionAttributes) == 0); - } - - public function testSampleWebContentShouldHaveNoExtensionElements() { - $this->webContent->transferFromXML($this->webContentText); - $this->assertTrue(is_array($this->webContent->extensionElements)); - $this->assertTrue(count($this->webContent->extensionElements) == 0); - } - - public function testSampleWebContentShouldHaveNoExtensionAttributes() { - $this->webContent->transferFromXML($this->webContentText); - $this->assertTrue(is_array($this->webContent->extensionAttributes)); - $this->assertTrue(count($this->webContent->extensionAttributes) == 0); - } - - public function testNormalWebContentShouldHaveNoExtensionElements() { - $this->webContent->url = "http://nowhere.invalid/"; - $this->webContent->height = "100"; - $this->webContent->width = "200"; - - $this->assertEquals($this->webContent->url, "http://nowhere.invalid/"); - $this->assertEquals($this->webContent->height, "100"); - $this->assertEquals($this->webContent->width, "200"); - - $this->assertEquals(count($this->webContent->extensionElements), 0); - $newWebContent = new Zend_Gdata_Calendar_Extension_WebContent(); - $newWebContent->transferFromXML($this->webContent->saveXML()); - $this->assertEquals(count($newWebContent->extensionElements), 0); - $newWebContent->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(count($newWebContent->extensionElements), 1); - $this->assertEquals($newWebContent->url, "http://nowhere.invalid/"); - $this->assertEquals($newWebContent->height, "100"); - $this->assertEquals($newWebContent->width, "200"); - - /* try constructing using magic factory */ - $cal = new Zend_Gdata_Calendar(); - $newWebContent2 = $cal->newWebContent(); - $newWebContent2->transferFromXML($newWebContent->saveXML()); - $this->assertEquals(count($newWebContent2->extensionElements), 1); - $this->assertEquals($newWebContent2->url, "http://nowhere.invalid/"); - $this->assertEquals($newWebContent2->height, "100"); - $this->assertEquals($newWebContent2->width, "200"); - } - - public function testEmptyWebContentToAndFromStringShouldMatch() { - $webContentXml = $this->webContent->saveXML(); - $newWebContent = new Zend_Gdata_Calendar_Extension_WebContent(); - $newWebContent->transferFromXML($webContentXml); - $newWebContentXml = $newWebContent->saveXML(); - $this->assertTrue($webContentXml == $newWebContentXml); - } - - public function testWebContentWithValueToAndFromStringShouldMatch() { - $this->webContent->url = "http://nowhere.invalid/"; - $this->webContent->height = "100"; - $this->webContent->width = "200"; - $webContentXml = $this->webContent->saveXML(); - $newWebContent = new Zend_Gdata_Calendar_Extension_WebContent(); - $newWebContent->transferFromXML($webContentXml); - $newWebContentXml = $newWebContent->saveXML(); - $this->assertTrue($webContentXml == $newWebContentXml); - $this->assertEquals($this->webContent->url, "http://nowhere.invalid/"); - $this->assertEquals($this->webContent->height, "100"); - $this->assertEquals($this->webContent->width, "200"); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->webContent->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->webContent->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->webContent->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->webContent->extensionAttributes['foo2']['value']); - $webContentXml = $this->webContent->saveXML(); - $newWebContent = new Zend_Gdata_Calendar_Extension_WebContent(); - $newWebContent->transferFromXML($webContentXml); - $this->assertEquals('bar', $newWebContent->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newWebContent->extensionAttributes['foo2']['value']); - } - - public function testConvertFullWebContentToAndFromString() { - $this->webContent->transferFromXML($this->webContentText); - $this->assertEquals($this->webContent->url, "http://www.google.com/logos/july4th06.gif"); - $this->assertEquals($this->webContent->height, "120"); - $this->assertEquals($this->webContent->width, "276"); - } - -} diff --git a/tests/Zend/Gdata/Calendar/_files/AccessLevelElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/AccessLevelElementSample1.xml deleted file mode 100644 index 47843bc6cd..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/AccessLevelElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/ColorElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/ColorElementSample1.xml deleted file mode 100644 index 8e9f29b682..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/ColorElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/EventEntrySample1.xml b/tests/Zend/Gdata/Calendar/_files/EventEntrySample1.xml deleted file mode 100644 index 8c4763b725..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/EventEntrySample1.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - http://www.google.com/calendar/feeds/default/private/full/s0dtsvq4pe15ku09jideg67fv4_20070509T193000Z - 2007-05-09T16:32:03.000Z - 2007-05-09T16:34:33.000Z - - www2007 recurring - - - - - - - - gdata ops - gdata.ops.test@gmail.com - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Gdata/Calendar/_files/EventFeedCompositeSample1.xml b/tests/Zend/Gdata/Calendar/_files/EventFeedCompositeSample1.xml deleted file mode 100644 index 32eb50c3bf..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/EventFeedCompositeSample1.xml +++ /dev/null @@ -1,362 +0,0 @@ - - - http://www.google.com/calendar/feeds/default/private/composite - 2007-05-31T01:15:00.000Z - - GData Ops Demo's Composite View - GData Is Awesome - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - Google Calendar - 7 - 1 - 25 - - - - http://www.google.com/calendar/feeds/default/private/composite/5v9l3sqdqt0b7mg1nhnmgdfup8 - 2007-09-14T15:37:53.000Z - 2007-09-14T15:37:53.000Z - - Specialized Event - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - DTSTART;TZID=America/Los_Angeles:20070913T080000 - DTEND;TZID=America/Los_Angeles:20070913T090000 - RRULE:FREQ=DAILY;UNTIL=20070920T150000Z;WKST=SU BEGIN:VTIMEZONE - TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles - BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT - DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU - END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 - TZNAME:PST DTSTART:19701101T020000 - RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:STANDARD - END:VTIMEZONE - - - - - - - - - - - - 5v9l3sqdqt0b7mg1nhnmgdfup8_20070914T150000Z - 2007-09-14T15:37:53.000Z - 2007-09-14T15:41:06.000Z - - Specialized Event - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/5v9l3sqdqt0b7mg1nhnmgdfup8_20070914T150000Z/comments - 2007-09-14T15:42:41.390Z - - Comments for: Specialized - Event - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/sh6kv08egsls7mc5tf6np8hi9c - 2007-05-24T20:49:14.000Z - 2007-05-24T20:49:14.000Z - - - Tennis Game - Meet for a quick lesson. - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - DTSTART;VALUE=DATE:20070501 DTEND;VALUE=DATE:20070502 RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904 - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/lq2ai6imsbq209q3aeturho50g - 2007-05-09T16:44:38.000Z - 2007-05-17T10:33:49.000Z - - all day event may 24 - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - 2007-05-31T01:15:13.249Z - - Comments for: all day event may 24 - - - dfr2c8pbtb8g6uphrsrlpao7mc - 2007-05-23T20:38:08.000Z - 2007-05-23T20:38:08.000Z - - <p>This is my comments!</p> - - User 1 - user1@nowhere.invalid - - - - i9q87onko1uphfs7i21elnnb4g - 2007-06-01T21:21:47.000Z - 2007-06-01T21:21:47.000Z - - <p>This is a user supplied comment.</p> - - User 2 - user2@nowhere.invalid - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/4v2a4eddoqja2727ptkq78euq8 - 2007-05-09T16:43:58.000Z - 2007-05-17T10:33:49.000Z - - all day event may 23 - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - 2007-05-31T01:15:13.250Z - - Comments for: all day event may 23 - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/14gfovd20fqvtj1d1np7ei9tbg - 2007-05-09T16:43:53.000Z - 2007-05-17T10:33:49.000Z - - all day event may 22 - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - 2007-05-31T01:15:13.250Z - - Comments for: all day event may 22 - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/s0dtsvq4pe15ku09jideg67fv4_20070509T193000Z - 2007-05-09T16:32:03.000Z - 2007-05-09T16:34:33.000Z - - www2007 recurring - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - 2007-05-31T01:15:13.251Z - - Comments for: www2007 recurring - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/composite/s0dtsvq4pe15ku09jideg67fv4 - 2007-05-09T16:32:03.000Z - 2007-05-09T16:32:03.000Z - - www2007 recurring - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - DTSTART;TZID=America/Anchorage:20070508T113000 DTEND;TZID=America/Anchorage:20070508T123000 RRULE:FREQ=DAILY;UNTIL=20070513T193000Z;WKST=SU BEGIN:VTIMEZONE TZID:America/Anchorage X-LIC-LOCATION:America/Anchorage BEGIN:DAYLIGHT TZOFFSETFROM:-0900 TZOFFSETTO:-0800 TZNAME:AKDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0800 TZOFFSETTO:-0900 TZNAME:AKST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:STANDARD END:VTIMEZONE - - - - - - - - - - s0dtsvq4pe15ku09jideg67fv4_20070509T193000Z - 2007-05-09T16:32:03.000Z - 2007-05-09T16:34:33.000Z - - www2007 recurring - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - 2007-05-31T01:15:13.259Z - - Comments for: www2007 recurring - - - - - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Gdata/Calendar/_files/HiddenElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/HiddenElementSample1.xml deleted file mode 100644 index 21c03d7293..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/HiddenElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/LinkElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/LinkElementSample1.xml deleted file mode 100644 index a39056fd54..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/LinkElementSample1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Calendar/_files/ListFeedSample1.xml b/tests/Zend/Gdata/Calendar/_files/ListFeedSample1.xml deleted file mode 100644 index 3919a7863c..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/ListFeedSample1.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - http://www.google.com/calendar/feeds/default - 2007-05-30T00:23:26.998Z - GData Ops Demo's Calendar List - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - http://test.address.invalid/ - - Google Calendar - 1 - - http://www.google.com/calendar/feeds/default/gdata.ops.demo%40gmail.com - 2007-05-30T00:23:27.006Z - 2007-05-30T00:20:38.000Z - GData Ops Demo - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - http://www.google.com/calendar/feeds/default/ri3u1buho56d1k2papoec4c16s%40group.calendar.google.com - 2007-05-30T00:23:27.005Z - 2007-05-30T00:20:38.000Z - My Other Awesome Calendar - This is my other calendar. - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/5fcmq8mrd633rulib1jgtuuk90%40group.calendar.google.com - 2007-05-30T00:23:27.005Z - 2007-05-22T05:35:47.000Z - Sample Calendar A - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/a2f8cl1m7ottkhmoita51gu9cc%40group.calendar.google.com - 2007-05-30T00:23:27.005Z - 2007-05-21T07:31:41.000Z - Sample Calendar B - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/rndpkbg35nhelu9fbp63u9sgp0%40group.calendar.google.com - 2007-05-30T00:23:27.006Z - 2007-05-22T21:02:34.000Z - Sample Calendar C - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/u4u5cksnpp1vufdarpupn5um5s%40group.calendar.google.com - 2007-05-30T00:23:27.006Z - 2007-05-17T10:12:36.000Z - Sample Calendar D - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/ibdlf33v6fj62rgfucib6s181s%40group.calendar.google.com - 2007-05-30T00:23:27.006Z - 2007-05-17T10:52:01.000Z - Sample Calender E - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - http://www.google.com/calendar/feeds/default/usa__en%40holiday.calendar.google.com - 2007-05-30T00:23:27.006Z - 2007-05-17T09:48:29.000Z - US Holidays - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - http://www.google.com/calendar/feeds/default/7u5mocvk4et2vgtjte1dtcff2o%40group.calendar.google.com - 2007-05-30T00:23:27.005Z - 2007-05-30T00:20:02.000Z - My Awesome Calendar - This is my awesome calendar - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - diff --git a/tests/Zend/Gdata/Calendar/_files/QuickAddElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/QuickAddElementSample1.xml deleted file mode 100644 index 2eaa4960fc..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/QuickAddElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/SelectedElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/SelectedElementSample1.xml deleted file mode 100644 index 8f8179cde3..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/SelectedElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/SendEventNotificationsElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/SendEventNotificationsElementSample1.xml deleted file mode 100644 index 3173035452..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/SendEventNotificationsElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/TestDataEventFeedSample1.xml b/tests/Zend/Gdata/Calendar/_files/TestDataEventFeedSample1.xml deleted file mode 100644 index 08bb95a315..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/TestDataEventFeedSample1.xml +++ /dev/null @@ -1,460 +0,0 @@ - - - - http://www.google.com/calendar/feeds/default/private/full - 2007-03-20T21:29:57.000Z - - GData Ops Demo - Demo Feed - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - http://test.address.invalid/ - - - Google Calendar - 10 - 1 - 25 - - - - http://www.google.com/calendar/feeds/default/private/full/o99flmgmkfkfrr8u745ghr3100 - 2007-03-20T21:29:52.000Z - 2007-03-20T21:29:57.000Z - - test deleted - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/2qt3ao5hbaq7m9igr5ak9esjo0 - 2007-03-20T21:26:04.000Z - 2007-03-20T21:28:46.000Z - - Afternoon at Dolores Park with Kim - This will be fun. - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/uvsqhg7klnae40v50vihr1pvos - 2007-03-20T21:28:37.000Z - 2007-03-20T21:28:37.000Z - - Team meeting - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - DTSTART;TZID=America/Los_Angeles:20070323T090000 - DTEND;TZID=America/Los_Angeles:20070323T100000 - RRULE:FREQ=WEEKLY;BYDAY=FR;UNTIL=20070817T160000Z;WKST=SU - BEGIN:VTIMEZONE TZID:America/Los_Angeles - X-LIC-LOCATION:America/Los_Angeles BEGIN:STANDARD - TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST - DTSTART:19701025T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU - END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 - TZNAME:PDT DTSTART:19700405T020000 - RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU END:DAYLIGHT - END:VTIMEZONE - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/st4vk9kiffs6rasrl32e4a7alo - 2007-03-20T21:25:46.000Z - 2007-03-20T21:25:46.000Z - - Movie with Kim and danah - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/ofl1e45ubtsoh6gtu127cls2oo - 2007-03-20T21:24:43.000Z - 2007-03-20T21:25:08.000Z - - Dinner with Kim and Sarah - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/b69s2avfi2joigsclecvjlc91g - 2007-03-20T21:24:19.000Z - 2007-03-20T21:25:05.000Z - - Dinner with Jane and John - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/u9p66kkiotn8bqh9k7j4rcnjjc - 2007-03-20T21:24:33.000Z - 2007-03-20T21:24:33.000Z - - Tennis with Elizabeth - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/76oj2kceidob3s708tvfnuaq3c - 2007-03-20T21:24:00.000Z - 2007-03-20T21:24:00.000Z - - Lunch with Jenn - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/5np9ec8m7uoauk1vedh5mhodco - 2007-03-20T07:50:02.000Z - 2007-03-20T20:39:26.000Z - - test entry - test desc - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://www.google.com/calendar/feeds/default/private/full/fu6sl0rqakf3o0a13oo1i1a1mg - 2007-02-14T23:23:37.000Z - 2007-02-14T23:25:30.000Z - - test - - - - - - - - GData Ops Demo - gdata.ops.demo@gmail.com - - - - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Gdata/Calendar/_files/TimezoneElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/TimezoneElementSample1.xml deleted file mode 100644 index f0792d63c7..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/TimezoneElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Calendar/_files/WebContentElementSample1.xml b/tests/Zend/Gdata/Calendar/_files/WebContentElementSample1.xml deleted file mode 100644 index bea486dd29..0000000000 --- a/tests/Zend/Gdata/Calendar/_files/WebContentElementSample1.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/tests/Zend/Gdata/CalendarEventTest.php b/tests/Zend/Gdata/CalendarEventTest.php deleted file mode 100644 index c63feedd9d..0000000000 --- a/tests/Zend/Gdata/CalendarEventTest.php +++ /dev/null @@ -1,494 +0,0 @@ -eventFeed = new Zend_Gdata_Calendar_EventFeed($eventFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testEventFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->eventFeed and convert back to objects */ - $newEventFeed = new Zend_Gdata_Calendar_EventFeed( - $this->eventFeed->saveXML()); - $newEntryCount = 0; - foreach ($newEventFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testEntryCount() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - } - $this->assertEquals(10, $entryCount); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $feed = $this->eventFeed; - - // Assert that the feed's author is correct - $feedAuthor = $feed->getAuthor(); - $this->assertEquals($feedAuthor, $feed->author); - $this->assertEquals(1, count($feedAuthor)); - $this->assertTrue($feedAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($feedAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($feedAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - $this->assertTrue($feedAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($feedAuthor[0], "uri", "text", "http://test.address.invalid/"); - - // Assert that each entry has valid author data - foreach ($feed as $entry) { - $entryAuthor = $entry->getAuthor(); - $this->assertEquals(1, count($entryAuthor)); - $this->verifyProperty2($entryAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($entryAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - $this->verifyProperty($entryAuthor[0], "uri", null); - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->eventFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://www.google.com/calendar/feeds/default/private/full"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[1]; - $this->verifyProperty2($entry, "id", "text", - "http://www.google.com/calendar/feeds/default/private/full/2qt3ao5hbaq7m9igr5ak9esjo0"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $feed = $this->eventFeed; - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - } - - // Assert one of the entry's Published dates - $entry = $feed[1]; - $this->verifyProperty2($entry, "published", "text", "2007-03-20T21:26:04.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->eventFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-03-20T21:29:57.000Z"); - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Published dates - $entry = $feed[1]; - $this->verifyProperty2($entry, "updated", "text", "2007-03-20T21:28:46.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->eventFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", - "GData Ops Demo"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "title", "text", "Afternoon at Dolores Park with Kim"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSubtitle() - { - $feed = $this->eventFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getSubtitle() instanceof Zend_Gdata_App_Extension_Subtitle); - $this->verifyProperty2($feed, "subtitle", "text", - "Demo Feed"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTimezone() - { - $feed = $this->eventFeed; - - // Assert that the feed's timezone is correct - $this->assertTrue($feed->getTimezone() instanceof Zend_Gdata_Calendar_Extension_Timezone); - $this->verifyProperty2($feed, "timezone", "value", - "America/Los_Angeles"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testStartIndex() - { - $feed = $this->eventFeed; - - // Assert that the feed's startIndex is correct - $this->assertTrue($feed->getStartIndex() instanceof Zend_Gdata_Extension_OpenSearchStartIndex); - $this->verifyProperty2($feed, "startIndex", "text", "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testItemsPerPage() - { - $feed = $this->eventFeed; - - // Assert that the feed's itemsPerPage is correct - $this->assertTrue($feed->getItemsPerPage() instanceof Zend_Gdata_Extension_OpenSearchItemsPerPage); - $this->verifyProperty2($feed, "itemsPerPage", "text", "25"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testContent() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a content object - foreach ($feed as $entry) { - $this->assertTrue($entry->getContent() instanceof Zend_Gdata_App_Extension_Content); - } - - // Assert one of the entry's values - $entry = $feed[1]; - $this->verifyProperty2($entry, "content", "text", "This will be fun."); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSendEventNotifications() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a sendEventNotifications object - foreach ($feed as $entry) { - $this->assertTrue($entry->getSendEventNotifications() instanceof Zend_Gdata_Calendar_Extension_SendEventNotifications); - } - - // Assert one of the entry's values - $entry = $feed[1]; - $this->verifyProperty2($entry, "sendEventNotifications", "value", false); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testEventStatus() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a eventStatus object - foreach ($feed as $entry) { - $this->assertTrue($entry->getEventStatus() instanceof Zend_Gdata_Extension_EventStatus); - } - - // Assert one of the entry's values - $entry = $feed[1]; - $this->verifyProperty2($entry, "eventStatus", "value", "http://schemas.google.com/g/2005#event.confirmed"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testComments() - { - $feed = $this->eventFeed; - - // Assert one of the entry's commments links - $entry = $feed[1]; - $this->assertTrue($entry->getComments() instanceof Zend_Gdata_Extension_Comments); - $this->verifyProperty2($entry->getComments(), "feedLink", "href", "http://www.google.com/calendar/feeds/default/private/full/2qt3ao5hbaq7m9igr5ak9esjo0/comments"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testVisibility() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a visibility object - foreach ($feed as $entry) { - $this->assertTrue($entry->getVisibility() instanceof Zend_Gdata_Extension_Visibility); - } - - // Assert one of the entries values - $entry = $feed[1]; - $this->verifyProperty2($entry, "visibility", "value", "http://schemas.google.com/g/2005#event.private"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTransparency() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a transparency object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTransparency() instanceof Zend_Gdata_Extension_Transparency); - } - - // Assert one of the entries values - $entry = $feed[1]; - $this->verifyProperty2($entry, "transparency", "value", "http://schemas.google.com/g/2005#event.opaque"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWhen() - { - $feed = $this->eventFeed; - - // Assert one of the entry's values - $entry = $feed[1]; - $when = $entry->getWhen(); - $this->assertEquals($entry->getWhen(), $entry->when); - $this->assertEquals(1, count($when)); - $w = $when[0]; - $this->assertTrue($w instanceof Zend_Gdata_Extension_When); - $this->verifyProperty($w, "startTime", "2007-03-24T12:00:00.000-07:00"); - $this->verifyProperty($w, "endTime", "2007-03-24T15:00:00.000-07:00"); - - // Assert that the associated reminders are correct - $reminders = $w->getReminders(); - $this->assertEquals(1, count($reminders)); - $this->verifyProperty($reminders[0], "minutes", "20"); - $this->verifyProperty($reminders[0], "method", "alert"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWhere() - { - $feed = $this->eventFeed; - - // Assert one of the entry's values - $entry = $feed[1]; - $where = $entry->getWhere(); - $this->assertEquals(1, count($where)); - $this->assertTrue($where[0] instanceof Zend_Gdata_Extension_Where); - $this->verifyProperty($where[0], "valueString", "Dolores Park with Kim"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWho() - { - $feed = $this->eventFeed; - - // For one of the entries, make sure that all who entries are of the - // right kind - $entry = $feed[1]; - $who = $entry->getWho(); - foreach ($who as $w) { - $this->assertTrue($w instanceof Zend_Gdata_Extension_Who); - } - $this->assertEquals(2, count($who)); - - // Check one of the who entries to make sure the values are valid - $this->verifyProperty($who[0], "rel", "http://schemas.google.com/g/2005#event.organizer"); - $this->verifyProperty($who[0], "valueString", "GData Ops Demo"); - $this->verifyProperty($who[0], "email", "gdata.ops.demo@gmail.com"); - $this->verifyProperty2($who[0], "attendeeStatus", "value", "http://schemas.google.com/g/2005#event.accepted"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->eventFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.0"); - $this->verifyProperty2($feed, "generator", "uri", "http://www.google.com/calendar"); - $this->verifyProperty2($feed, "generator", "text", "Google Calendar"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testQuickAdd() - { - $feed = $this->eventFeed; - - // Assert that one of the event's QuickAdd entries is correct - $quickAdd = $feed->entry[1]->getQuickAdd(); - $this->assertTrue($quickAdd instanceof Zend_Gdata_Calendar_Extension_QuickAdd); - $this->verifyProperty($quickAdd, "value", true); - } - -} diff --git a/tests/Zend/Gdata/CalendarFeedCompositeTest.php b/tests/Zend/Gdata/CalendarFeedCompositeTest.php deleted file mode 100644 index 859b274dbf..0000000000 --- a/tests/Zend/Gdata/CalendarFeedCompositeTest.php +++ /dev/null @@ -1,509 +0,0 @@ -eventFeed = new Zend_Gdata_Calendar_EventFeed($eventFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($obj->$propGetter(), $value); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($obj->$propGetter()->$secondGetter(), $value); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testEventFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->eventFeed and convert back to objects */ - $newEventFeed = new Zend_Gdata_Calendar_EventFeed( - $this->eventFeed->saveXML()); - $newEntryCount = 0; - foreach ($newEventFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testEntryCount() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - } - $this->assertEquals(7, $entryCount); - $this->assertEquals($entryCount, $this->eventFeed->totalResults->text); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $feed = $this->eventFeed; - - // Assert that the feed's author is correct - $feedAuthor = $feed->getAuthor(); - $this->assertEquals($feedAuthor, $feed->author); - $this->assertEquals(1, count($feedAuthor)); - $this->assertTrue($feedAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($feedAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($feedAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - - // Assert that each entry has valid author data - foreach ($feed as $entry) { - $entryAuthor = $entry->getAuthor(); - $this->assertEquals(1, count($entryAuthor)); - $this->verifyProperty2($entryAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($entryAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - $this->verifyProperty($entryAuthor[0], "uri", null); - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->eventFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://www.google.com/calendar/feeds/default/private/composite"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[2]; - $this->verifyProperty2($entry, "id", "text", - "http://www.google.com/calendar/feeds/default/private/composite/lq2ai6imsbq209q3aeturho50g"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $feed = $this->eventFeed; - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - } - - // Assert one of the entry's Published dates - $entry = $feed[2]; - $this->verifyProperty2($entry, "published", "text", "2007-05-09T16:44:38.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->eventFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-05-31T01:15:00.000Z"); - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Published dates - $entry = $feed[2]; - $this->verifyProperty2($entry, "updated", "text", "2007-05-17T10:33:49.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->eventFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", - "GData Ops Demo's Composite View"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - - // Assert one of the entry's Titles - $entry = $feed[2]; - $this->verifyProperty2($entry, "title", "text", "all day event may 24"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSubtitle() - { - $feed = $this->eventFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getSubtitle() instanceof Zend_Gdata_App_Extension_Subtitle); - $this->verifyProperty2($feed, "subtitle", "text", - "GData Is Awesome"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTimezone() - { - $feed = $this->eventFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTimezone() instanceof Zend_Gdata_Calendar_Extension_Timezone); - $this->verifyProperty2($feed, "timezone", "value", - "America/Chicago"); - } - - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testEventStatus() - { - $feed = $this->eventFeed; - - // Assert that all entry's have an eventStatus object - foreach ($feed as $entry) { - $this->assertTrue($entry->getEventStatus() instanceof Zend_Gdata_Extension_EventStatus); - } - - // Assert one of the entries values - $entry = $feed[2]; - $this->verifyProperty2($entry, "eventStatus", "value", "http://schemas.google.com/g/2005#event.confirmed"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testVisibility() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a visibility object - foreach ($feed as $entry) { - $this->assertTrue($entry->getVisibility() instanceof Zend_Gdata_Extension_Visibility); - } - - // Assert one of the entries values - $entry = $feed[2]; - $this->verifyProperty2($entry, "visibility", "value", "http://schemas.google.com/g/2005#event.default"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTransparency() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a transparency object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTransparency() instanceof Zend_Gdata_Extension_Transparency); - } - - // Assert one of the entries values - $entry = $feed[2]; - $this->verifyProperty2($entry, "transparency", "value", "http://schemas.google.com/g/2005#event.transparent"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSendEventNotifications() - { - $feed = $this->eventFeed; - - // Assert that all entry's have a sendEventNotifications object - foreach ($feed as $entry) { - $this->assertTrue($entry->getSendEventNotifications() instanceof Zend_Gdata_Calendar_Extension_SendEventNotifications); - } - - // Assert one of the entry's values - $entry = $feed[2]; - $this->verifyProperty2($entry, "sendEventNotifications", "value", false); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWhen() - { - $feed = $this->eventFeed; - - // Assert one of the entry's values - $entry = $feed[2]; - $when = $entry->getWhen(); - $this->assertEquals($entry->getWhen(), $entry->when); - $this->assertEquals(1, count($when)); - $this->assertTrue($when[0] instanceof Zend_Gdata_Extension_When); - $this->verifyProperty($when[0], "startTime", "2007-05-24"); - $this->verifyProperty($when[0], "endTime", "2007-05-25"); - - // Verify that the reminders show up - $reminders = $when[0]->getReminders(); - $this->assertEquals(2, count($reminders)); - $this->assertTrue($reminders[0] instanceof Zend_Gdata_Extension_Reminder); - $this->assertTrue($reminders[1] instanceof Zend_Gdata_Extension_Reminder); - $this->verifyProperty($reminders[0], "minutes", "10"); - $this->verifyProperty($reminders[0], "method", "alert"); - $this->verifyProperty($reminders[1], "minutes", "10"); - $this->verifyProperty($reminders[1], "method", "email"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWhere() - { - $feed = $this->eventFeed; - - // Assert one of the entry's values - $entry = $feed[2]; - $where = $entry->getWhere(); - $this->assertEquals(1, count($where)); - $this->assertTrue($where[0] instanceof Zend_Gdata_Extension_Where); - $this->verifyProperty($where[0], "valueString", "Mountain View, California"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testComments() - { - $feed = $this->eventFeed; - - - // Assert one of the entries has the correct values - // Make sure the comment element looks right - $entry = $feed[2]; - $c = $entry->getComments(); - $this->assertEquals($c, $entry->comments); - $this->assertTrue($c instanceof Zend_Gdata_Extension_Comments); - - // Make sure that the feedLink looks right - $fl = $c->getFeedLink(); - $this->assertTrue($fl instanceof Zend_Gdata_Extension_FeedLink); - $this->assertEquals($fl, $c->feedLink); - $this->verifyProperty($fl, "href", "http://www.google.com/calendar/feeds/default/private/full/lq2ai6imsbq209q3aeturho50g/comments"); - - // Make sure the embedded feed looks right - $cFeed = $fl->getFeed(); - $this->assertTrue($cFeed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($cFeed, $fl->feed); - - // Verify the remainder of the comment feed metadata - $this->assertTrue($cFeed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($cFeed, "updated", "text", "2007-05-31T01:15:13.249Z"); - - $this->assertTrue($cFeed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($cFeed, "title", "text", "Comments for: all day event may 24"); - - // Verify that the comments appear to be good - $commentCount = 0; - foreach ($cFeed as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Entry); - $commentCount++; - } - $this->assertEquals(2, $commentCount); - - // Closely examine one of the comments - $comment = $cFeed[1]; - - $this->assertTrue($comment->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($comment, "id", "text", "i9q87onko1uphfs7i21elnnb4g"); - - $this->assertTrue($comment->getPublished() instanceof Zend_Gdata_App_Extension_Published); - $this->verifyProperty2($comment, "published", "text", "2007-06-01T21:21:47.000Z"); - - $this->assertTrue($comment->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($comment, "updated", "text", "2007-06-01T21:21:47.000Z"); - - $this->assertEquals(1, count($comment->author)); - $this->assertTrue($comment->author[0] instanceof Zend_Gdata_App_Extension_Author); - $this->assertTrue($comment->author[0]->getName() instanceof Zend_Gdata_App_Extension_Name); - $this->assertTrue($comment->author[0]->getEmail() instanceof Zend_Gdata_App_Extension_Email); - $this->verifyProperty2($comment->author[0], "name", "text", "User 2"); - $this->verifyProperty2($comment->author[0], "email", "text", "user2@nowhere.invalid"); - - $this->assertTrue($comment->getContent() instanceof Zend_Gdata_App_Extension_Content); - $this->verifyProperty($comment->getContent(), "type", "html"); - $this->assertEquals('

    This is a user supplied comment.

    ', $comment->getContent()->text); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testRecurrence() - { - $feed = $this->eventFeed; - - // Assert one of the entry's values - $entry = $feed[1]; - $this->assertTrue($entry->getRecurrence() instanceof Zend_Gdata_Extension_Recurrence); - $this->verifyProperty2($entry, "recurrence", "text", - "DTSTART;VALUE=DATE:20070501 DTEND;VALUE=DATE:20070502 RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testStartIndex() - { - $feed = $this->eventFeed; - - // Assert that the feed's startIndex is correct - $this->assertTrue($feed->getStartIndex() instanceof Zend_Gdata_Extension_OpenSearchStartIndex); - $this->verifyProperty2($feed, "startIndex", "text", "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testItemsPerPage() - { - $feed = $this->eventFeed; - - // Assert that the feed's itemsPerPage is correct - $this->assertTrue($feed->getItemsPerPage() instanceof Zend_Gdata_Extension_OpenSearchItemsPerPage); - $this->verifyProperty2($feed, "itemsPerPage", "text", "25"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->eventFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.0"); - $this->verifyProperty2($feed, "generator", "uri", "http://www.google.com/calendar"); - } - - -} diff --git a/tests/Zend/Gdata/CalendarFeedTest.php b/tests/Zend/Gdata/CalendarFeedTest.php deleted file mode 100644 index b7f12b949a..0000000000 --- a/tests/Zend/Gdata/CalendarFeedTest.php +++ /dev/null @@ -1,388 +0,0 @@ -listFeed = new Zend_Gdata_Calendar_ListFeed($listFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testEventFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->listFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_ListEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->listFeed and convert back to objects */ - $newListFeed = new Zend_Gdata_Calendar_ListFeed( - $this->listFeed->saveXML()); - $newEntryCount = 0; - foreach ($newListFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_ListEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testEntryCount() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->listFeed as $entry) { - $entryCount++; - } - $this->assertEquals(9, $entryCount); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $feed = $this->listFeed; - - // Assert that the feed's author is correct - $feedAuthor = $feed->getAuthor(); - $this->assertEquals($feedAuthor, $feed->author); - $this->assertEquals(1, count($feedAuthor)); - $this->assertTrue($feedAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($feedAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($feedAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - $this->assertTrue($feedAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($feedAuthor[0], "uri", "text", "http://test.address.invalid/"); - - // Assert that each entry has valid author data - foreach ($feed as $entry) { - $entryAuthor = $entry->getAuthor(); - $this->assertEquals(1, count($entryAuthor)); - $this->verifyProperty2($entryAuthor[0], "name", "text", "GData Ops Demo"); - $this->verifyProperty2($entryAuthor[0], "email", "text", "gdata.ops.demo@gmail.com"); - $this->verifyProperty($entryAuthor[0], "uri", null); - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->listFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://www.google.com/calendar/feeds/default"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[1]; - $this->verifyProperty2($entry, "id", "text", - "http://www.google.com/calendar/feeds/default/ri3u1buho56d1k2papoec4c16s%40group.calendar.google.com"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $feed = $this->listFeed; - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - } - - // Assert one of the entry's Published dates - $entry = $feed[1]; - $this->verifyProperty2($entry, "published", "text", "2007-05-30T00:23:27.005Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->listFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-05-30T00:23:26.998Z"); - - // Assert that all entry's have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Published dates - $entry = $feed[1]; - $this->verifyProperty2($entry, "updated", "text", "2007-05-30T00:20:38.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->listFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", - "GData Ops Demo's Calendar List"); - - // Assert that all entry's have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "title", "text", "My Other Awesome Calendar"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testColor() - { - $feed = $this->listFeed; - - // Assert that all entry's have an color object - foreach ($feed as $entry) { - $this->assertTrue($entry->getColor() instanceof Zend_Gdata_Calendar_Extension_Color); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "color", "value", "#A32929"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testAccessLevel() - { - $feed = $this->listFeed; - - // Assert that all entry's have an accessLevel object - foreach ($feed as $entry) { - $this->assertTrue($entry->getAccessLevel() instanceof Zend_Gdata_Calendar_Extension_AccessLevel); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "accessLevel", "value", "owner"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTimezone() - { - $feed = $this->listFeed; - - // Assert that all entry's have an accessLevel object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTimezone() instanceof Zend_Gdata_Calendar_Extension_Timezone); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "timezone", "value", "America/Chicago"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testHidden() - { - $feed = $this->listFeed; - - // Assert that all entry's have an accessLevel object - foreach ($feed as $entry) { - $this->assertTrue($entry->getHidden() instanceof Zend_Gdata_Calendar_Extension_Hidden); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "hidden", "value", false); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSelected() - { - $feed = $this->listFeed; - - // Assert that all entry's have a selected object - foreach ($feed as $entry) { - $this->assertTrue($entry->getSelected() instanceof Zend_Gdata_Calendar_Extension_Selected); - } - - // Assert one of the entry's Titles - $entry = $feed[1]; - $this->verifyProperty2($entry, "selected", "value", true); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testStartIndex() - { - $feed = $this->listFeed; - - // Assert that the feed's startIndex is correct - $this->assertTrue($feed->getStartIndex() instanceof Zend_Gdata_Extension_OpenSearchStartIndex); - $this->verifyProperty2($feed, "startIndex", "text", "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testWhere() - { - $feed = $this->listFeed; - - // Assert one of the entry's where values - $entry = $feed[1]; - $this->assertEquals($entry->getWhere(), $entry->where); - $this->assertTrue($entry->where[0] instanceof Zend_Gdata_Extension_Where); - $this->assertEquals("Palo Alto, California", $entry->where[0]->getValueString()); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSummary() - { - $feed = $this->listFeed; - - // Assert one of the entry's summaries - $entry = $feed[1]; - $this->assertTrue($entry->getSummary() instanceof Zend_Gdata_App_Extension_Summary); - $this->verifyProperty2($entry, "summary", "text", "This is my other calendar."); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->listFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.0"); - $this->verifyProperty2($feed, "generator", "uri", "http://www.google.com/calendar"); - } - -} diff --git a/tests/Zend/Gdata/CalendarOnlineTest.php b/tests/Zend/Gdata/CalendarOnlineTest.php deleted file mode 100644 index 71efe2398b..0000000000 --- a/tests/Zend/Gdata/CalendarOnlineTest.php +++ /dev/null @@ -1,172 +0,0 @@ -gdata = new Zend_Gdata_Calendar($client); - } - - public function testCalendarListFeed() - { - $calFeed = $this->gdata->getCalendarListFeed(); - $this->assertTrue(strpos($calFeed->title->text, 'Calendar List') - !== false); - $calCount = 0; - foreach ($calFeed as $calendar) { - $calCount++; - } - $this->assertTrue($calCount > 0); - } - - /** - * @group ZF-1701 - */ - public function testCalendarOnlineFeed() - { - $eventFeed = $this->gdata->getCalendarEventFeed(); - $this->assertTrue(strpos($eventFeed->title->text, TESTS_ZEND_GDATA_CLIENTLOGIN_EMAIL) - !== false); - $eventCount = 0; - foreach ( $eventFeed as $event ) { - $this->assertTrue($event instanceof Zend_Gdata_Calendar_EventEntry); - $eventCount++; - } - $this->assertTrue($eventCount > 0 ); - $this->assertTrue(count($eventFeed) == $eventCount); - } - - function getEvent($eventId) - { - $query = $this->gdata->newEventQuery(); - $query->setUser('default'); - $query->setVisibility('private'); - $query->setProjection('full'); - $query->setEvent($eventId); - - $eventEntry = $this->gdata->getCalendarEventEntry($query); - $this->assertTrue( - $eventEntry instanceof Zend_Gdata_Calendar_EventEntry); - return $eventEntry; - } - - public function createEvent( - $title = 'Tennis with Beth', - $desc='Meet for a quick lesson', $where = 'On the courts', - $startDate = '2008-01-20', $startTime = '10:00', - $endDate = '2008-01-20', $endTime = '11:00', $tzOffset = '-08') - { - $newEntry = $this->gdata->newEventEntry(); - $newEntry->title = $this->gdata->newTitle(trim($title)); - $newEntry->where = array($this->gdata->newWhere($where)); - - $newEntry->content = $this->gdata->newContent($desc); - $newEntry->content->type = 'text'; - - $when = $this->gdata->newWhen(); - $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00"; - $when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00"; - $reminder = $this->gdata->newReminder(); - $reminder->minutes = '30'; - $reminder->method = 'email'; - $when->reminders = array($reminder); - $newEntry->when = array($when); - - $createdEntry = $this->gdata->insertEvent($newEntry); - - $this->assertEquals('email in 30 minutes', $reminder->__toString()); - $this->assertEquals($title, $createdEntry->title->text); - $this->assertEquals($desc, $createdEntry->content->text); - $this->assertEquals(strtotime($when->startTime), - strtotime($createdEntry->when[0]->startTime)); - $this->assertEquals(strtotime($when->endTime), - strtotime($createdEntry->when[0]->endTime)); - $this->assertEquals($reminder->method, - $createdEntry->when[0]->reminders[0]->method); - $this->assertEquals($reminder->minutes, - $createdEntry->when[0]->reminders[0]->minutes); - $this->assertEquals($where, $createdEntry->where[0]->valueString); - - return $createdEntry; - } - - function updateEvent ($eventId, $newTitle) - { - $eventOld = $this->getEvent($eventId); - $eventOld->title = $this->gdata->newTitle($newTitle); - $eventOld->save(); - $eventNew = $this->getEvent($eventId); - $this->assertEquals($newTitle, $eventNew->title->text); - return $eventNew; - } - - public function testCreateEvent() - { - $createdEntry = $this->createEvent(); - } - - public function testCreateAndUpdateEvent() - { - $newTitle = 'my new title'; - $createdEntry = $this->createEvent(); - preg_match('#.*/([A-Za-z0-9]+)$#', $createdEntry->id->text, $matches); - $id = $matches[1]; - $updatedEvent = $this->updateEvent($id, $newTitle); - $this->assertEquals($newTitle, $updatedEvent->title->text); - } - - public function testCreateAndDeleteEvent() - { - /* deletion can be performed in several different ways-- test all */ - $createdEntry = $this->createEvent(); - $createdEntry->delete(); - - $createdEntry2 = $this->createEvent(); - $this->gdata->delete($createdEntry2); - - $createdEntry3 = $this->createEvent(); - $this->gdata->delete($createdEntry3->getEditLink()->href); - } -} diff --git a/tests/Zend/Gdata/CalendarTest.php b/tests/Zend/Gdata/CalendarTest.php deleted file mode 100644 index 452460625c..0000000000 --- a/tests/Zend/Gdata/CalendarTest.php +++ /dev/null @@ -1,102 +0,0 @@ -eventFeedText = file_get_contents( - 'Zend/Gdata/Calendar/_files/TestDataEventFeedSample1.xml', - true); - $this->eventFeed = new Zend_Gdata_Calendar_EventFeed(); - } - - public function testEmptyEventFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->eventFeed->extensionElements)); - $this->assertTrue(count($this->eventFeed->extensionElements) == 0); - } - - public function testEmptyEventFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->eventFeed->extensionAttributes)); - $this->assertTrue(count($this->eventFeed->extensionAttributes) == 0); - } - - public function testSampleEventFeedShouldHaveNoExtensionElements() { - $this->eventFeed->transferFromXML($this->eventFeedText); - $this->assertTrue(is_array($this->eventFeed->extensionElements)); - $this->assertTrue(count($this->eventFeed->extensionElements) == 0); - } - - public function testSampleEventFeedShouldHaveNoExtensionAttributes() { - $this->eventFeed->transferFromXML($this->eventFeedText); - $this->assertTrue(is_array($this->eventFeed->extensionAttributes)); - $this->assertTrue(count($this->eventFeed->extensionAttributes) == 0); - } - - public function testEventFeedToAndFromString() - { - $this->eventFeed->transferFromXML($this->eventFeedText); - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->eventFeed and convert back to objects */ - $newEventFeed = new Zend_Gdata_Calendar_EventFeed( - $this->eventFeed->saveXML()); - $newEntryCount = 0; - foreach ($newEventFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Calendar_EventEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - public function testEntryCount() - { - $this->eventFeed->transferFromXML($this->eventFeedText); - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->eventFeed as $entry) { - $entryCount++; - } - $this->assertEquals($entryCount, 10); - $this->assertEquals($entryCount, $this->eventFeed->totalResults->text); - } - -} diff --git a/tests/Zend/Gdata/CommentsTest.php b/tests/Zend/Gdata/CommentsTest.php deleted file mode 100644 index 057a736077..0000000000 --- a/tests/Zend/Gdata/CommentsTest.php +++ /dev/null @@ -1,127 +0,0 @@ -commentsText = file_get_contents( - 'Zend/Gdata/_files/CommentsElementSample1.xml', - true); - $this->comments = new Zend_Gdata_Extension_Comments(); - } - - public function testEmptyCommentsShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->comments->extensionElements)); - $this->assertTrue(count($this->comments->extensionElements) == 0); - } - - public function testEmptyCommentsShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->comments->extensionAttributes)); - $this->assertTrue(count($this->comments->extensionAttributes) == 0); - } - - public function testSampleCommentsShouldHaveNoExtensionElements() { - $this->comments->transferFromXML($this->commentsText); - $this->assertTrue(is_array($this->comments->extensionElements)); - $this->assertTrue(count($this->comments->extensionElements) == 0); - } - - public function testSampleCommentsShouldHaveNoExtensionAttributes() { - $this->comments->transferFromXML($this->commentsText); - $this->assertTrue(is_array($this->comments->extensionAttributes)); - $this->assertTrue(count($this->comments->extensionAttributes) == 0); - } - - public function testNormalCommentsShouldHaveNoExtensionElements() { - $this->comments->rel = "http://schemas.google.com/g/2005#regular"; - - $this->assertEquals("http://schemas.google.com/g/2005#regular", $this->comments->rel); - - $this->assertEquals(0, count($this->comments->extensionElements)); - $newComments = new Zend_Gdata_Extension_Comments(); - $newComments->transferFromXML($this->comments->saveXML()); - $this->assertEquals(0, count($newComments->extensionElements)); - $newComments->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newComments->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#regular", $newComments->rel); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newComments2 = $gdata->newComments(); - $newComments2->transferFromXML($newComments->saveXML()); - $this->assertEquals(1, count($newComments2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#regular", $newComments2->rel); - } - - public function testEmptyCommentsToAndFromStringShouldMatch() { - $commentsXml = $this->comments->saveXML(); - $newComments = new Zend_Gdata_Extension_Comments(); - $newComments->transferFromXML($commentsXml); - $newCommentsXml = $newComments->saveXML(); - $this->assertTrue($commentsXml == $newCommentsXml); - } - - public function testCommentsWithValueToAndFromStringShouldMatch() { - $this->comments->rel = "http://schemas.google.com/g/2005#regular"; - $commentsXml = $this->comments->saveXML(); - $newComments = new Zend_Gdata_Extension_Comments(); - $newComments->transferFromXML($commentsXml); - $newCommentsXml = $newComments->saveXML(); - $this->assertTrue($commentsXml == $newCommentsXml); - $this->assertEquals("http://schemas.google.com/g/2005#regular", $this->comments->rel); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->comments->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->comments->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->comments->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->comments->extensionAttributes['foo2']['value']); - $commentsXml = $this->comments->saveXML(); - $newComments = new Zend_Gdata_Extension_Comments(); - $newComments->transferFromXML($commentsXml); - $this->assertEquals('bar', $newComments->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newComments->extensionAttributes['foo2']['value']); - } - - public function testConvertFullCommentsToAndFromString() { - $this->comments->transferFromXML($this->commentsText); - $this->assertEquals("http://schemas.google.com/g/2005#reviews", $this->comments->rel); - $this->assertTrue($this->comments->feedLink instanceof Zend_Gdata_Extension_FeedLink); - $this->assertEquals("http://example.com/restaurants/SanFrancisco/432432/reviews", $this->comments->feedLink->href); - } - -} diff --git a/tests/Zend/Gdata/Docs/DocumentListEntryTest.php b/tests/Zend/Gdata/Docs/DocumentListEntryTest.php deleted file mode 100755 index df29d34d40..0000000000 --- a/tests/Zend/Gdata/Docs/DocumentListEntryTest.php +++ /dev/null @@ -1,72 +0,0 @@ -doc = new Zend_Gdata_Docs_DocumentListEntry( - file_get_contents('Zend/Gdata/Docs/_files/TestDataDocumentListEntrySample.xml', true)); - } - - public function testToAndFromString() - { - $this->assertTrue($this->doc instanceof Zend_Gdata_Docs_DocumentListEntry); - $this->assertTrue($this->doc->title->text === 'Test Spreadsheet'); - - $newDoc = new Zend_Gdata_Docs_DocumentListEntry(); - $doc = new DOMDocument(); - $doc->loadXML($this->doc->saveXML()); - $newDoc->transferFromDom($doc->documentElement); - - $this->assertTrue($newDoc->title == $this->doc->title); - } - - public function testSetMediaSource() - { - // Service object to create the media file source. - $this->docsClient = new Zend_Gdata_Docs(null); - $mediaSource = $this->docsClient->newMediaFileSource('test_file_name'); - $mediaSource->setSlug('test slug'); - $mediaSource->setContentType('test content type'); - $this->doc->setMediaSource($mediaSource); - $this->assertTrue($this->doc->getMediaSource()->getContentType() === - 'test content type'); - $this->assertTrue($this->doc->getMediaSource()->getSlug() === - 'test slug'); - } - -} diff --git a/tests/Zend/Gdata/Docs/DocumentListFeedTest.php b/tests/Zend/Gdata/Docs/DocumentListFeedTest.php deleted file mode 100755 index b5a96d6512..0000000000 --- a/tests/Zend/Gdata/Docs/DocumentListFeedTest.php +++ /dev/null @@ -1,67 +0,0 @@ -docFeed = new Zend_Gdata_Docs_DocumentListFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestDataDocumentListFeedSample.xml'), - true); - } - - public function testToAndFromString() - { - // There should be 2 entries in the feed. - $this->assertTrue(count($this->docFeed->entries) == 2); - $this->assertTrue($this->docFeed->entries->count() == 2); - foreach($this->docFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - } - - $newDocFeed = new Zend_Gdata_Docs_DocumentListFeed(); - $doc = new DOMDocument(); - $doc->loadXML($this->docFeed->saveXML()); - $newDocFeed->transferFromDom($doc->documentElement); - - $this->assertTrue(count($newDocFeed->entries) == count($this->docFeed->entries)); - foreach($newDocFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - } - } - -} diff --git a/tests/Zend/Gdata/Docs/QueryTest.php b/tests/Zend/Gdata/Docs/QueryTest.php deleted file mode 100755 index 5b7b1a227f..0000000000 --- a/tests/Zend/Gdata/Docs/QueryTest.php +++ /dev/null @@ -1,77 +0,0 @@ -docQuery = new Zend_Gdata_Docs_Query(); - } - - public function testTitle() - { - $this->assertTrue($this->docQuery->getTitle() == null); - $this->docQuery->setTitle('test title'); - $this->assertTrue($this->docQuery->getTitle() == 'test title'); - $this->assertTrue($this->docQuery->getQueryString() == '?title=test+title'); - $this->docQuery->setTitle(null); - $this->assertTrue($this->docQuery->getTitle() == null); - } - - public function testTitleExact() - { - $this->assertTrue($this->docQuery->getTitleExact() == null); - $this->docQuery->setTitleExact('test title'); - $this->assertTrue($this->docQuery->getTitleExact() == 'test title'); - $this->assertTrue($this->docQuery->getQueryString() == '?title-exact=test+title'); - $this->docQuery->setTitleExact(null); - $this->assertTrue($this->docQuery->getTitleExact() == null); - } - - public function testProjection() - { - $this->assertTrue($this->docQuery->getProjection() == 'full'); - $this->docQuery->setProjection('abc'); - $this->assertTrue($this->docQuery->getProjection() == 'abc'); - } - - public function testVisibility() - { - $this->assertTrue($this->docQuery->getVisibility() == 'private'); - $this->docQuery->setVisibility('xyz'); - $this->assertTrue($this->docQuery->getVisibility() == 'xyz'); - } -} diff --git a/tests/Zend/Gdata/Docs/_files/TestDataDocumentListEntrySample.xml b/tests/Zend/Gdata/Docs/_files/TestDataDocumentListEntrySample.xml deleted file mode 100755 index 1860425cc7..0000000000 --- a/tests/Zend/Gdata/Docs/_files/TestDataDocumentListEntrySample.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - test.user - test.user@gmail.com - - - http://docs.google.com/feeds/documents/private/full/spreadsheet%3Asupercalifragilisticexpealidocious - - - - Test Spreadsheet - 2007-07-03T18:03:32.045Z - diff --git a/tests/Zend/Gdata/Docs/_files/TestDataDocumentListFeedSample.xml b/tests/Zend/Gdata/Docs/_files/TestDataDocumentListFeedSample.xml deleted file mode 100755 index d19a2f2a8f..0000000000 --- a/tests/Zend/Gdata/Docs/_files/TestDataDocumentListFeedSample.xml +++ /dev/null @@ -1,38 +0,0 @@ - - 2 - 1 - - - - test.user - test.user@gmail.com - - - http://docs.google.com/feeds/documents/private/full/spreadsheet%3Asupercalifragilisticexpeadocious - - - - Test Spreadsheet - 2007-07-03T18:03:32.045Z - - - - - test.user - test.user@gmail.com - - - http://docs.google.com/feeds/documents/private/full/document%3Agr00vy - - - Test Document - 2007-07-03T18:02:50.338Z - - http://docs.google.com/feeds/documents/private/full - - - - - Available Documents - test.user@gmail.com - 2007-07-09T23:07:21.898Z - diff --git a/tests/Zend/Gdata/DocsOnlineTest.php b/tests/Zend/Gdata/DocsOnlineTest.php deleted file mode 100755 index 36cb852c47..0000000000 --- a/tests/Zend/Gdata/DocsOnlineTest.php +++ /dev/null @@ -1,129 +0,0 @@ -docTitle = constant('TESTS_ZEND_GDATA_DOCS_DOCUMENTTITLE'); - $service = Zend_Gdata_Docs::AUTH_SERVICE_NAME; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $this->gdata = new Zend_Gdata_Docs($client); - } - - public function testGetSpreadsheetFeed() - { - $feed = $this->gdata->getDocumentListFeed(); - $this->assertTrue($feed instanceof Zend_Gdata_Docs_DocumentListFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $query = new Zend_Gdata_Docs_Query(); - $feed = $this->gdata->getDocumentListFeed($query); - $this->assertTrue($feed instanceof Zend_Gdata_Docs_DocumentListFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $uri = $query->getQueryUrl(); - $feed = $this->gdata->getDocumentListFeed($uri); - $this->assertTrue($feed instanceof Zend_Gdata_Docs_DocumentListFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - } - - public function testQueryForTitle() - { - $query = new Zend_Gdata_Docs_Query(); - $query->title = $this->docTitle; - $feed = $this->gdata->getDocumentListFeed($query); - $this->assertTrue(strpos(strtolower($feed->entries[0]->title), strtolower($this->docTitle)) !== FALSE); - } - - public function testGetDocumentListEntry() - { - $query = new Zend_Gdata_Docs_Query(); - $feed = $this->gdata->getDocumentListFeed($query); - $selfLinkHref = $feed->entries[0]->getSelfLink()->href; - $entry = $this->gdata->getDocumentListEntry($selfLinkHref); - $this->assertTrue($entry instanceof Zend_Gdata_Docs_DocumentListEntry); - } - - public function testUploadFindAndDelete() - { - $documentTitle = 'spreadsheet_upload_test.csv'; - $newDocumentEntry = $this->gdata->uploadFile( - 'Zend/Gdata/_files/DocsTest.csv', $documentTitle, - $this->gdata->lookupMimeType('CSV'), - Zend_Gdata_Docs::DOCUMENTS_LIST_FEED_URI); - $this->assertTrue($newDocumentEntry->title->text === $documentTitle); - - // Get the newly created document. - // First extract the document's ID key from the Atom id. - $idParts = explode('/', $newDocumentEntry->id->text); - $keyParts = explode('%3A', end($idParts)); - $documentFromGetDoc = $this->gdata->getDoc($keyParts[1], $keyParts[0]); - $this->assertTrue($documentFromGetDoc->title->text === $documentTitle); - if ($keyParts[0] == 'document') { - $documentFromGetDocument = $this->gdata->getDocument($keyParts[1]); - $this->assertTrue( - $documentFromGetDocument->title->text === $documentTitle); - } - if ($keyParts[0] == 'spreadsheet') { - $documentFromGetSpreadsheet = $this->gdata->getSpreadsheet( - $keyParts[1]); - $this->assertTrue( - $documentFromGetSpreadsheet->title->text === $documentTitle); - } - if ($keyParts[0] == 'presentation') { - $documentFromGetPresentation = $this->gdata->getPresentation( - $keyParts[1]); - $this->assertTrue( - $documentFromGetPresentation->title->text === $documentTitle); - } - - // Cleanup and remove the new document. - $newDocumentEntry->delete(); - } - -} diff --git a/tests/Zend/Gdata/DocsTest.php b/tests/Zend/Gdata/DocsTest.php deleted file mode 100755 index a94bba786e..0000000000 --- a/tests/Zend/Gdata/DocsTest.php +++ /dev/null @@ -1,95 +0,0 @@ -adapter = new Test_Zend_Gdata_MockHttpClient(); - $this->client = new Zend_Gdata_HttpClient(); - $this->client->setAdapter($this->adapter); - $this->gdata = new Zend_Gdata_Docs($this->client); - } - - public function testCreateFolder() - { - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - $this->gdata->createFolder("Test Folder"); - $request = $this->adapter->popRequest(); - - // Check to make sure the correct URI is in use - $this->assertEquals( - "docs.google.com", - $request->uri->getHost()); - $this->assertEquals( - "/feeds/documents/private/full", - $request->uri->getPath()); - - // Check to make sure that this is a folder - $this->assertNotEquals( false, strpos($request->body, - "assertNotEquals(false, strpos($request->body, - "Test Folder")); - } - - public function testCreateSubfolder() - { - $subfolderName = "MySubfolder"; - $this->adapter->setResponse(array('HTTP/1.1 200 OK\r\n\r\n')); - $this->gdata->createFolder("Test Folder", $subfolderName); - $request = $this->adapter->popRequest(); - - // Check to make sure the correct URI is in use - $this->assertEquals( - "docs.google.com", - $request->uri->getHost()); - $this->assertEquals( - "/feeds/folders/private/full/" . $subfolderName, - $request->uri->getPath()); - - // Check to make sure that this is a folder - $this->assertNotEquals( false, strpos($request->body, - "assertNotEquals(false, strpos($request->body, - "Test Folder")); - } - - -} diff --git a/tests/Zend/Gdata/EntryLinkTest.php b/tests/Zend/Gdata/EntryLinkTest.php deleted file mode 100644 index 54be806d8e..0000000000 --- a/tests/Zend/Gdata/EntryLinkTest.php +++ /dev/null @@ -1,141 +0,0 @@ -entryLinkText = file_get_contents( - 'Zend/Gdata/_files/EntryLinkElementSample1.xml', - true); - $this->entryLink = new Zend_Gdata_Extension_EntryLink(); - } - - public function testEmptyEntryLinkShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entryLink->extensionElements)); - $this->assertTrue(count($this->entryLink->extensionElements) == 0); - } - - public function testEmptyEntryLinkShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entryLink->extensionAttributes)); - $this->assertTrue(count($this->entryLink->extensionAttributes) == 0); - } - - public function testSampleEntryLinkShouldHaveNoExtensionElements() { - $this->entryLink->transferFromXML($this->entryLinkText); - $this->assertTrue(is_array($this->entryLink->extensionElements)); - $this->assertTrue(count($this->entryLink->extensionElements) == 0); - } - - public function testSampleEntryLinkShouldHaveNoExtensionAttributes() { - $this->entryLink->transferFromXML($this->entryLinkText); - $this->assertTrue(is_array($this->entryLink->extensionAttributes)); - $this->assertTrue(count($this->entryLink->extensionAttributes) == 0); - } - - public function testNormalEntryLinkShouldHaveNoExtensionElements() { - $this->entryLink->href = "http://gmail.com/jo/contacts/Bob"; - $this->entryLink->rel = "self"; - $this->entryLink->readOnly = false; - - $this->assertEquals("http://gmail.com/jo/contacts/Bob", $this->entryLink->href); - $this->assertEquals("self", $this->entryLink->rel); - $this->assertEquals(false, $this->entryLink->readOnly); - - $this->assertEquals(0, count($this->entryLink->extensionElements)); - $newEntryLink = new Zend_Gdata_Extension_EntryLink(); - $newEntryLink->transferFromXML($this->entryLink->saveXML()); - $this->assertEquals(0, count($newEntryLink->extensionElements)); - $newEntryLink->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newEntryLink->extensionElements)); - $this->assertEquals("http://gmail.com/jo/contacts/Bob", $newEntryLink->href); - $this->assertEquals("self", $newEntryLink->rel); - $this->assertEquals(false, $newEntryLink->readOnly); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newEntryLink2 = $gdata->newEntryLink(); - $newEntryLink2->transferFromXML($newEntryLink->saveXML()); - $this->assertEquals(1, count($newEntryLink2->extensionElements)); - $this->assertEquals("http://gmail.com/jo/contacts/Bob", $newEntryLink2->href); - $this->assertEquals("self", $newEntryLink2->rel); - $this->assertEquals(false, $newEntryLink2->readOnly); - } - - public function testEmptyEntryLinkToAndFromStringShouldMatch() { - $entryLinkXml = $this->entryLink->saveXML(); - $newEntryLink = new Zend_Gdata_Extension_EntryLink(); - $newEntryLink->transferFromXML($entryLinkXml); - $newEntryLinkXml = $newEntryLink->saveXML(); - $this->assertTrue($entryLinkXml == $newEntryLinkXml); - } - - public function testEntryLinkWithValueToAndFromStringShouldMatch() { - $this->entryLink->href = "http://gmail.com/jo/contacts/Bob"; - $this->entryLink->rel = "self"; - $this->entryLink->readOnly = false; - $entryLinkXml = $this->entryLink->saveXML(); - $newEntryLink = new Zend_Gdata_Extension_EntryLink(); - $newEntryLink->transferFromXML($entryLinkXml); - $newEntryLinkXml = $newEntryLink->saveXML(); - $this->assertTrue($entryLinkXml == $newEntryLinkXml); - $this->assertEquals("http://gmail.com/jo/contacts/Bob", $this->entryLink->href); - $this->assertEquals("self", $this->entryLink->rel); - $this->assertEquals(false, $this->entryLink->readOnly); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->entryLink->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->entryLink->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->entryLink->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->entryLink->extensionAttributes['foo2']['value']); - $entryLinkXml = $this->entryLink->saveXML(); - $newEntryLink = new Zend_Gdata_Extension_EntryLink(); - $newEntryLink->transferFromXML($entryLinkXml); - $this->assertEquals('bar', $newEntryLink->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newEntryLink->extensionAttributes['foo2']['value']); - } - - public function testConvertFullEntryLinkToAndFromString() { - $this->entryLink->transferFromXML($this->entryLinkText); - $this->assertEquals("http://gmail.com/jo/contacts/Jo", $this->entryLink->href); - $this->assertEquals("via", $this->entryLink->rel); - $this->assertEquals(true, $this->entryLink->readOnly); - $this->assertTrue($this->entryLink->entry instanceof Zend_Gdata_App_Entry); - $this->assertEquals("Jo March", $this->entryLink->entry->title->text); - } - -} diff --git a/tests/Zend/Gdata/EntryTest.php b/tests/Zend/Gdata/EntryTest.php deleted file mode 100644 index 954c617b13..0000000000 --- a/tests/Zend/Gdata/EntryTest.php +++ /dev/null @@ -1,126 +0,0 @@ -entry = new Zend_Gdata_Entry(); - $this->entryText = file_get_contents( - 'Zend/Gdata/_files/EntrySample1.xml', - true); - $this->etagLocalName = 'etag'; - $this->expectedEtag = 'W/"CkcHQH8_fCp7ImA9WxRTGEw."'; - $this->expectedMismatchExceptionMessage = "ETag mismatch"; - $this->gdNamespace = 'http://schemas.google.com/g/2005'; - $this->openSearchNamespacev1 = 'http://a9.com/-/spec/opensearchrss/1.0/'; - $this->openSearchNamespacev2 = 'http://a9.com/-/spec/opensearch/1.1/'; - - } - - public function testXMLHasNoEtagsWhenUsingV1() { - $etagData = 'Quux'; - $this->entry->setEtag($etagData); - $domNode = $this->entry->getDOM(null, 1, null); - $this->assertNull($domNode->attributes->getNamedItemNS($this->gdNamespace, $this->etagLocalName)); - } - - public function testXMLHasNoEtagsWhenUsingV1X() { - $etagData = 'Quux'; - $this->entry->setEtag($etagData); - $domNode = $this->entry->getDOM(null, 1, 1); - $this->assertNull($domNode->attributes->getNamedItemNS($this->gdNamespace, $this->etagLocalName)); - } - - public function testXMLHasEtagsWhenUsingV2() { - $etagData = 'Quux'; - $this->entry->setEtag($etagData); - $domNode = $this->entry->getDOM(null, 2, null); - $this->assertEquals($etagData, $domNode->attributes->getNamedItemNS($this->gdNamespace, $this->etagLocalName)->nodeValue); - } - - public function testXMLHasEtagsWhenUsingV2X() { - $etagData = 'Quux'; - $this->entry->setEtag($etagData); - $domNode = $this->entry->getDOM(null, 2, 1); - $this->assertEquals($etagData, $domNode->attributes->getNamedItemNS($this->gdNamespace, $this->etagLocalName)->nodeValue); - } - - public function testXMLETagsPropagateToEntry() { - $this->entry->transferFromXML($this->entryText); - $this->assertEquals($this->expectedEtag, $this->entry->getEtag()); - } - - public function testXMLandHTMLEtagsDifferingThrowsException() { - $exceptionCaught = false; - $this->entry->setEtag("Foo"); - try { - $this->entry->transferFromXML($this->entryText); - } catch (Zend_Gdata_App_IOException $e) { - $exceptionCaught = true; - } - $this->assertTrue($exceptionCaught, "Exception Zend_Gdata_IO_Exception expected"); - } - - public function testHttpAndXmlEtagsDifferingThrowsExceptionWithMessage() { - $messageCorrect = false; - $this->entry->setEtag("Foo"); - try { - $this->entry->transferFromXML($this->entryText); - } catch (Zend_Gdata_App_IOException $e) { - if ($e->getMessage() == $this->expectedMismatchExceptionMessage) - $messageCorrect = true; - } - $this->assertTrue($messageCorrect, "Exception Zend_Gdata_IO_Exception message incorrect"); - } - - public function testNothingBadHappensWhenHttpAndXmlEtagsMatch() { - $this->entry->setEtag($this->expectedEtag); - $this->entry->transferFromXML($this->entryText); - $this->assertEquals($this->expectedEtag, $this->entry->getEtag()); - } - - public function testLookUpOpenSearchv1Namespace() { - $this->assertEquals($this->openSearchNamespacev1, - $this->entry->lookupNamespace('openSearch', 1, 0)); - $this->assertEquals($this->openSearchNamespacev1, - $this->entry->lookupNamespace('openSearch', 1, null)); - } - - public function testLookupOpenSearchv2Namespace() { - $this->assertEquals($this->openSearchNamespacev2, - $this->entry->lookupNamespace('openSearch', 2, 0)); - $this->assertEquals($this->openSearchNamespacev2, - $this->entry->lookupNamespace('openSearch', 2, null)); - } - -} diff --git a/tests/Zend/Gdata/EventStatusTest.php b/tests/Zend/Gdata/EventStatusTest.php deleted file mode 100644 index 8af3955687..0000000000 --- a/tests/Zend/Gdata/EventStatusTest.php +++ /dev/null @@ -1,125 +0,0 @@ -eventStatusText = file_get_contents( - 'Zend/Gdata/_files/EventStatusElementSample1.xml', - true); - $this->eventStatus = new Zend_Gdata_Extension_EventStatus(); - } - - public function testEmptyEventStatusShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->eventStatus->extensionElements)); - $this->assertTrue(count($this->eventStatus->extensionElements) == 0); - } - - public function testEmptyEventStatusShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->eventStatus->extensionAttributes)); - $this->assertTrue(count($this->eventStatus->extensionAttributes) == 0); - } - - public function testSampleEventStatusShouldHaveNoExtensionElements() { - $this->eventStatus->transferFromXML($this->eventStatusText); - $this->assertTrue(is_array($this->eventStatus->extensionElements)); - $this->assertTrue(count($this->eventStatus->extensionElements) == 0); - } - - public function testSampleEventStatusShouldHaveNoExtensionAttributes() { - $this->eventStatus->transferFromXML($this->eventStatusText); - $this->assertTrue(is_array($this->eventStatus->extensionAttributes)); - $this->assertTrue(count($this->eventStatus->extensionAttributes) == 0); - } - - public function testNormalEventStatusShouldHaveNoExtensionElements() { - $this->eventStatus->value = "http://schemas.google.com/g/2005#event.tentative"; - - $this->assertEquals("http://schemas.google.com/g/2005#event.tentative", $this->eventStatus->value); - - $this->assertEquals(0, count($this->eventStatus->extensionElements)); - $newEventStatus = new Zend_Gdata_Extension_EventStatus(); - $newEventStatus->transferFromXML($this->eventStatus->saveXML()); - $this->assertEquals(0, count($newEventStatus->extensionElements)); - $newEventStatus->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newEventStatus->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.tentative", $newEventStatus->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newEventStatus2 = $gdata->newEventStatus(); - $newEventStatus2->transferFromXML($newEventStatus->saveXML()); - $this->assertEquals(1, count($newEventStatus2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.tentative", $newEventStatus2->value); - } - - public function testEmptyEventStatusToAndFromStringShouldMatch() { - $eventStatusXml = $this->eventStatus->saveXML(); - $newEventStatus = new Zend_Gdata_Extension_EventStatus(); - $newEventStatus->transferFromXML($eventStatusXml); - $newEventStatusXml = $newEventStatus->saveXML(); - $this->assertTrue($eventStatusXml == $newEventStatusXml); - } - - public function testEventStatusWithValueToAndFromStringShouldMatch() { - $this->eventStatus->value = "http://schemas.google.com/g/2005#event.tentative"; - $eventStatusXml = $this->eventStatus->saveXML(); - $newEventStatus = new Zend_Gdata_Extension_EventStatus(); - $newEventStatus->transferFromXML($eventStatusXml); - $newEventStatusXml = $newEventStatus->saveXML(); - $this->assertTrue($eventStatusXml == $newEventStatusXml); - $this->assertEquals("http://schemas.google.com/g/2005#event.tentative", $this->eventStatus->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->eventStatus->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->eventStatus->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->eventStatus->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->eventStatus->extensionAttributes['foo2']['value']); - $eventStatusXml = $this->eventStatus->saveXML(); - $newEventStatus = new Zend_Gdata_Extension_EventStatus(); - $newEventStatus->transferFromXML($eventStatusXml); - $this->assertEquals('bar', $newEventStatus->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newEventStatus->extensionAttributes['foo2']['value']); - } - - public function testConvertFullEventStatusToAndFromString() { - $this->eventStatus->transferFromXML($this->eventStatusText); - $this->assertEquals("http://schemas.google.com/g/2005#event.confirmed", $this->eventStatus->value); - } - -} diff --git a/tests/Zend/Gdata/ExtendedPropertyTest.php b/tests/Zend/Gdata/ExtendedPropertyTest.php deleted file mode 100644 index abe2504bc3..0000000000 --- a/tests/Zend/Gdata/ExtendedPropertyTest.php +++ /dev/null @@ -1,132 +0,0 @@ -extendedPropertyText = file_get_contents( - 'Zend/Gdata/_files/ExtendedPropertyElementSample1.xml', - true); - $this->extendedProperty = new Zend_Gdata_Extension_ExtendedProperty(); - } - - public function testEmptyExtendedPropertyShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->extendedProperty->extensionElements)); - $this->assertTrue(count($this->extendedProperty->extensionElements) == 0); - } - - public function testEmptyExtendedPropertyShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->extendedProperty->extensionAttributes)); - $this->assertTrue(count($this->extendedProperty->extensionAttributes) == 0); - } - - public function testSampleExtendedPropertyShouldHaveNoExtensionElements() { - $this->extendedProperty->transferFromXML($this->extendedPropertyText); - $this->assertTrue(is_array($this->extendedProperty->extensionElements)); - $this->assertTrue(count($this->extendedProperty->extensionElements) == 0); - } - - public function testSampleExtendedPropertyShouldHaveNoExtensionAttributes() { - $this->extendedProperty->transferFromXML($this->extendedPropertyText); - $this->assertTrue(is_array($this->extendedProperty->extensionAttributes)); - $this->assertTrue(count($this->extendedProperty->extensionAttributes) == 0); - } - - public function testNormalExtendedPropertyShouldHaveNoExtensionElements() { - $this->extendedProperty->name = "http://www.example.com/schemas/2007#mycal.foo"; - $this->extendedProperty->value = "5678"; - - $this->assertEquals("http://www.example.com/schemas/2007#mycal.foo", $this->extendedProperty->name); - $this->assertEquals("5678", $this->extendedProperty->value); - - $this->assertEquals(0, count($this->extendedProperty->extensionElements)); - $newExtendedProperty = new Zend_Gdata_Extension_ExtendedProperty(); - $newExtendedProperty->transferFromXML($this->extendedProperty->saveXML()); - $this->assertEquals(0, count($newExtendedProperty->extensionElements)); - $newExtendedProperty->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newExtendedProperty->extensionElements)); - $this->assertEquals("http://www.example.com/schemas/2007#mycal.foo", $newExtendedProperty->name); - $this->assertEquals("5678", $newExtendedProperty->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newExtendedProperty2 = $gdata->newExtendedProperty(); - $newExtendedProperty2->transferFromXML($newExtendedProperty->saveXML()); - $this->assertEquals(1, count($newExtendedProperty2->extensionElements)); - $this->assertEquals("http://www.example.com/schemas/2007#mycal.foo", $newExtendedProperty2->name); - $this->assertEquals("5678", $newExtendedProperty2->value); - } - - public function testEmptyExtendedPropertyToAndFromStringShouldMatch() { - $extendedPropertyXml = $this->extendedProperty->saveXML(); - $newExtendedProperty = new Zend_Gdata_Extension_ExtendedProperty(); - $newExtendedProperty->transferFromXML($extendedPropertyXml); - $newExtendedPropertyXml = $newExtendedProperty->saveXML(); - $this->assertTrue($extendedPropertyXml == $newExtendedPropertyXml); - } - - public function testExtendedPropertyWithValueToAndFromStringShouldMatch() { - $this->extendedProperty->name = "http://www.example.com/schemas/2007#mycal.foo"; - $this->extendedProperty->value = "5678"; - $extendedPropertyXml = $this->extendedProperty->saveXML(); - $newExtendedProperty = new Zend_Gdata_Extension_ExtendedProperty(); - $newExtendedProperty->transferFromXML($extendedPropertyXml); - $newExtendedPropertyXml = $newExtendedProperty->saveXML(); - $this->assertTrue($extendedPropertyXml == $newExtendedPropertyXml); - $this->assertEquals("http://www.example.com/schemas/2007#mycal.foo", $this->extendedProperty->name); - $this->assertEquals("5678", $this->extendedProperty->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->extendedProperty->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->extendedProperty->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->extendedProperty->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->extendedProperty->extensionAttributes['foo2']['value']); - $extendedPropertyXml = $this->extendedProperty->saveXML(); - $newExtendedProperty = new Zend_Gdata_Extension_ExtendedProperty(); - $newExtendedProperty->transferFromXML($extendedPropertyXml); - $this->assertEquals('bar', $newExtendedProperty->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newExtendedProperty->extensionAttributes['foo2']['value']); - } - - public function testConvertFullExtendedPropertyToAndFromString() { - $this->extendedProperty->transferFromXML($this->extendedPropertyText); - $this->assertEquals("http://www.example.com/schemas/2007#mycal.id", $this->extendedProperty->name); - $this->assertEquals("1234", $this->extendedProperty->value); - } - -} diff --git a/tests/Zend/Gdata/FeedLinkTest.php b/tests/Zend/Gdata/FeedLinkTest.php deleted file mode 100644 index 274ef25ace..0000000000 --- a/tests/Zend/Gdata/FeedLinkTest.php +++ /dev/null @@ -1,148 +0,0 @@ -feedLinkText = file_get_contents( - 'Zend/Gdata/_files/FeedLinkElementSample1.xml', - true); - $this->feedLink = new Zend_Gdata_Extension_FeedLink(); - } - - public function testEmptyFeedLinkShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->feedLink->extensionElements)); - $this->assertTrue(count($this->feedLink->extensionElements) == 0); - } - - public function testEmptyFeedLinkShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->feedLink->extensionAttributes)); - $this->assertTrue(count($this->feedLink->extensionAttributes) == 0); - } - - public function testSampleFeedLinkShouldHaveNoExtensionElements() { - $this->feedLink->transferFromXML($this->feedLinkText); - $this->assertTrue(is_array($this->feedLink->extensionElements)); - $this->assertTrue(count($this->feedLink->extensionElements) == 0); - } - - public function testSampleFeedLinkShouldHaveNoExtensionAttributes() { - $this->feedLink->transferFromXML($this->feedLinkText); - $this->assertTrue(is_array($this->feedLink->extensionAttributes)); - $this->assertTrue(count($this->feedLink->extensionAttributes) == 0); - } - - public function testNormalFeedLinkShouldHaveNoExtensionElements() { - $this->feedLink->href = "http://www.google.com/calendar/feeds/default/private/full"; - $this->feedLink->rel = "via"; - $this->feedLink->countHint = "5"; - $this->feedLink->readOnly = false; - - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full", $this->feedLink->href); - $this->assertEquals("via", $this->feedLink->rel); - $this->assertEquals("5", $this->feedLink->countHint); - $this->assertEquals(false, $this->feedLink->readOnly); - - $this->assertEquals(0, count($this->feedLink->extensionElements)); - $newFeedLink = new Zend_Gdata_Extension_FeedLink(); - $newFeedLink->transferFromXML($this->feedLink->saveXML()); - $this->assertEquals(0, count($newFeedLink->extensionElements)); - $newFeedLink->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newFeedLink->extensionElements)); - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full", $newFeedLink->href); - $this->assertEquals("via", $newFeedLink->rel); - $this->assertEquals("5", $newFeedLink->countHint); - $this->assertEquals(false, $newFeedLink->readOnly); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newFeedLink2 = $gdata->newFeedLink(); - $newFeedLink2->transferFromXML($newFeedLink->saveXML()); - $this->assertEquals(1, count($newFeedLink2->extensionElements)); - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full", $newFeedLink2->href); - $this->assertEquals("via", $newFeedLink2->rel); - $this->assertEquals("5", $newFeedLink2->countHint); - $this->assertEquals(false, $newFeedLink2->readOnly); - } - - public function testEmptyFeedLinkToAndFromStringShouldMatch() { - $feedLinkXml = $this->feedLink->saveXML(); - $newFeedLink = new Zend_Gdata_Extension_FeedLink(); - $newFeedLink->transferFromXML($feedLinkXml); - $newFeedLinkXml = $newFeedLink->saveXML(); - $this->assertTrue($feedLinkXml == $newFeedLinkXml); - } - - public function testFeedLinkWithValueToAndFromStringShouldMatch() { - $this->feedLink->href = "http://www.google.com/calendar/feeds/default/private/full"; - $this->feedLink->rel = "via"; - $this->feedLink->countHint = "5"; - $this->feedLink->readOnly = false; - $feedLinkXml = $this->feedLink->saveXML(); - $newFeedLink = new Zend_Gdata_Extension_FeedLink(); - $newFeedLink->transferFromXML($feedLinkXml); - $newFeedLinkXml = $newFeedLink->saveXML(); - $this->assertTrue($feedLinkXml == $newFeedLinkXml); - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full", $this->feedLink->href); - $this->assertEquals("via", $this->feedLink->rel); - $this->assertEquals("5", $this->feedLink->countHint); - $this->assertEquals(false, $this->feedLink->readOnly); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->feedLink->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->feedLink->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->feedLink->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->feedLink->extensionAttributes['foo2']['value']); - $feedLinkXml = $this->feedLink->saveXML(); - $newFeedLink = new Zend_Gdata_Extension_FeedLink(); - $newFeedLink->transferFromXML($feedLinkXml); - $this->assertEquals('bar', $newFeedLink->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newFeedLink->extensionAttributes['foo2']['value']); - } - - public function testConvertFullFeedLinkToAndFromString() { - $this->feedLink->transferFromXML($this->feedLinkText); - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full/3tsi3ag1q40bnsik88k25sgpss/comments", $this->feedLink->href); - $this->assertEquals("http://schemas.google.com/g/2005#feed", $this->feedLink->rel); - $this->assertEquals("0", $this->feedLink->countHint); - $this->assertEquals(true, $this->feedLink->readOnly); - $this->assertTrue($this->feedLink->feed instanceof Zend_Gdata_App_Feed); - $this->assertEquals("Comments for: Sample Event", $this->feedLink->feed->title->text); - } - -} diff --git a/tests/Zend/Gdata/FeedTest.php b/tests/Zend/Gdata/FeedTest.php deleted file mode 100644 index e418e862bd..0000000000 --- a/tests/Zend/Gdata/FeedTest.php +++ /dev/null @@ -1,158 +0,0 @@ -etagLocalName = 'etag'; - $this->expectedEtag = 'W/"CE4BRXw4cCp7ImA9WxRVFEs."'; - $this->expectedMismatchExceptionMessage = "ETag mismatch"; - $this->feed = new Zend_Gdata_Feed(); - $this->feedTextV1 = file_get_contents( - 'Zend/Gdata/_files/FeedSampleV1.xml', - true); - $this->feedTextV2 = file_get_contents( - 'Zend/Gdata/_files/FeedSampleV2.xml', - true); - $this->gdNamespace = 'http://schemas.google.com/g/2005'; - $this->openSearchNamespacev1 = 'http://a9.com/-/spec/opensearchrss/1.0/'; - $this->openSearchNamespacev2 = 'http://a9.com/-/spec/opensearch/1.1/'; - } - - public function testXMLHasNoEtagsWhenUsingV1() { - $etagData = 'Quux'; - $this->feed->setEtag($etagData); - $domNode = $this->feed->getDOM(null, 1, null); - $this->assertNull( - $domNode->attributes->getNamedItemNS( - $this->gdNamespace, $this->etagLocalName)); - } - - public function testXMLHasNoEtagsWhenUsingV1X() { - $etagData = 'Quux'; - $this->feed->setEtag($etagData); - $domNode = $this->feed->getDOM(null, 1, 1); - $this->assertNull( - $domNode->attributes->getNamedItemNS( - $this->gdNamespace, $this->etagLocalName)); - } - - public function testXMLHasEtagsWhenUsingV2() { - $etagData = 'Quux'; - $this->feed->setEtag($etagData); - $domNode = $this->feed->getDOM(null, 2, null); - $this->assertEquals( - $etagData, - $domNode->attributes->getNamedItemNS( - $this->gdNamespace, $this->etagLocalName)->nodeValue); - } - - public function testXMLHasEtagsWhenUsingV2X() { - $etagData = 'Quux'; - $this->feed->setEtag($etagData); - $domNode = $this->feed->getDOM(null, 2, 1); - $this->assertEquals( - $etagData, - $domNode->attributes->getNamedItemNS( - $this->gdNamespace, $this->etagLocalName)->nodeValue); - } - - public function testXMLETagsPropagateToFeed() { - $this->feed->transferFromXML($this->feedTextV2); - $etagValue = $this->feed->getEtag(); - $this->assertEquals($this->expectedEtag, $this->feed->getEtag()); - } - - public function testXMLandHTMLEtagsDifferingThrowsException() { - $exceptionCaught = false; - $this->feed->setEtag("Foo"); - try { - $this->feed->transferFromXML($this->feedTextV2); - } catch (Zend_Gdata_App_IOException $e) { - $exceptionCaught = true; - } - $this->assertTrue($exceptionCaught, "Exception Zend_Gdata_IO_Exception expected"); - } - - public function testHttpAndXmlEtagsDifferingThrowsExceptionWithMessage() { - $messageCorrect = false; - $this->feed->setEtag("Foo"); - try { - $this->feed->transferFromXML($this->feedTextV2); - } catch (Zend_Gdata_App_IOException $e) { - if ($e->getMessage() == $this->expectedMismatchExceptionMessage) - $messageCorrect = true; - } - $this->assertTrue($messageCorrect, "Exception Zend_Gdata_IO_Exception message incorrect"); - } - - public function testNothingBadHappensWhenHttpAndXmlEtagsMatch() { - $this->feed->setEtag($this->expectedEtag); - $this->feed->transferFromXML($this->feedTextV2); - $this->assertEquals($this->expectedEtag, $this->feed->getEtag()); - } - - public function testLookUpOpenSearchv1Namespace() { - $this->feed->setMajorProtocolVersion(1); - $this->feed->setMinorProtocolVersion(0); - $this->assertEquals($this->openSearchNamespacev1, - $this->feed->lookupNamespace('openSearch', 1)); - $this->feed->setMinorProtocolVersion(null); - $this->assertEquals($this->openSearchNamespacev1, - $this->feed->lookupNamespace('openSearch', 1)); - } - - public function testLookupOpenSearchv2Namespace() { - $this->feed->setMajorProtocolVersion(2); - $this->feed->setMinorProtocolVersion(0); - $this->assertEquals($this->openSearchNamespacev2, - $this->feed->lookupNamespace('openSearch')); - $this->feed->setMinorProtocolVersion(null); - $this->assertEquals($this->openSearchNamespacev2, - $this->feed->lookupNamespace('openSearch')); - } - - public function testNoExtensionElementsInV1Feed() { - $this->feed->setMajorProtocolVersion(1); - $this->feed->transferFromXML($this->feedTextV1); - $this->assertEquals(0, sizeof($this->feed->extensionElements)); - } - - public function testNoExtensionElementsInV2Feed() { - $this->feed->setMajorProtocolVersion(2); - $this->feed->transferFromXML($this->feedTextV2); - $this->assertEquals(0, sizeof($this->feed->extensionElements)); - } -} diff --git a/tests/Zend/Gdata/Gapps/EmailListEntryTest.php b/tests/Zend/Gdata/Gapps/EmailListEntryTest.php deleted file mode 100644 index 812bb4bcf7..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListEntryTest.php +++ /dev/null @@ -1,140 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/EmailListEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_EmailListEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($emailListEntry) { - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales', - $emailListEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $emailListEntry->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $emailListEntry->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/apps/2006#emailList', $emailListEntry->category[0]->term); - $this->assertEquals('text', $emailListEntry->title->type); - $this->assertEquals('us-sales', $emailListEntry->title->text);; - $this->assertEquals('self', $emailListEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $emailListEntry->getLink('self')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales', $emailListEntry->getLink('self')->href); - $this->assertEquals('edit', $emailListEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $emailListEntry->getLink('edit')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales', $emailListEntry->getLink('edit')->href); - $this->assertEquals('us-sales', $emailListEntry->emailList->name); - $this->assertEquals('http://schemas.google.com/apps/2006#emailList.recipients', $emailListEntry->getFeedLink('http://schemas.google.com/apps/2006#emailList.recipients')->rel); - $this->assertEquals('http://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient/', $emailListEntry->getFeedLink('http://schemas.google.com/apps/2006#emailList.recipients')->href); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyEmailListEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newEmailListEntry = new Zend_Gdata_Gapps_EmailListEntry(); - $newEmailListEntry->transferFromXML($entryXml); - $newEmailListEntryXml = $newEmailListEntry->saveXML(); - $this->assertTrue($entryXml == $newEmailListEntryXml); - } - - public function testGetFeedLinkReturnsAllStoredEntriesWhenUsedWithNoParameters() { - // Prepare test data - $entry1 = new Zend_Gdata_Extension_FeedLink(); - $entry1->rel = "first"; - $entry1->href= "foo"; - $entry2 = new Zend_Gdata_Extension_FeedLink(); - $entry2->rel = "second"; - $entry2->href= "bar"; - $data = array($entry1, $entry2); - - // Load test data and run test - $this->entry->feedLink = $data; - $this->assertEquals(2, count($this->entry->feedLink)); - } - - public function testGetFeedLinkCanReturnEntriesByRelValue() { - // Prepare test data - $entry1 = new Zend_Gdata_Extension_FeedLink(); - $entry1->rel = "first"; - $entry1->href= "foo"; - $entry2 = new Zend_Gdata_Extension_FeedLink(); - $entry2->rel = "second"; - $entry2->href= "bar"; - $data = array($entry1, $entry2); - - // Load test data and run test - $this->entry->feedLink = $data; - $this->assertEquals($entry1, $this->entry->getFeedLink('first')); - $this->assertEquals($entry2, $this->entry->getFeedLink('second')); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertEmailListEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newEmailListEntry = new Zend_Gdata_Gapps_EmailListEntry(); - $newEmailListEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newEmailListEntry); - $newEmailListEntryXml = $newEmailListEntry->saveXML(); - $this->assertEquals($entryXml, $newEmailListEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListFeedTest.php b/tests/Zend/Gdata/Gapps/EmailListFeedTest.php deleted file mode 100644 index 157d89ae26..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -emailListFeed = new Zend_Gdata_Gapps_EmailListFeed($emailListFeedText); - $this->emptyEmailListFeed = new Zend_Gdata_Gapps_EmailListFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyEmailListFeed->extensionElements)); - $this->assertTrue(count($this->emptyEmailListFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyEmailListFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyEmailListFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emailListFeed->extensionElements)); - $this->assertTrue(count($this->emailListFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emailListFeed->extensionAttributes)); - $this->assertTrue(count($this->emailListFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->emailListFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_EmailListEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->emailListFeed and convert back to objects */ - $newEmailListFeed = new Zend_Gdata_Gapps_EmailListFeed( - $this->emailListFeed->saveXML()); - $newEntryCount = 0; - foreach ($newEmailListFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_EmailListEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->emailListFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListQueryTest.php b/tests/Zend/Gdata/Gapps/EmailListQueryTest.php deleted file mode 100644 index fff1d36be6..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListQueryTest.php +++ /dev/null @@ -1,138 +0,0 @@ -query = new Zend_Gdata_Gapps_EmailListQuery(); - } - - // Test to make sure that URI generation works - public function testDefaultQueryURIGeneration() - { - $this->query->setDomain("foo.bar.invalid"); - $this->assertEquals("https://apps-apis.google.com/a/feeds/foo.bar.invalid/emailList/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/hello.world.baz/emailList/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the emailListName accessor methods work and propagate - // to the query URI. - public function testCanSetEmailListNameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setEmailListName("foo"); - $this->assertEquals("foo", $this->query->getEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/foo", - $this->query->getQueryUrl()); - - $this->query->setEmailListName("bar"); - $this->assertEquals("bar", $this->query->getEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/bar", - $this->query->getQueryUrl()); - } - - // Test to make sure that the recipient accessor methods work and propagate - // to the query URI. - public function testCanSetRecipientProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setRecipient("bar@qux.com"); - $this->assertEquals("bar@qux.com", $this->query->getRecipient()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0?recipient=bar%40qux.com", - $this->query->getQueryUrl()); - - $this->query->setRecipient(null); - $this->assertEquals(null, $this->query->getRecipient()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the startUsername accessor methods work and - // propagate to the query URI. - public function testCanSetStartEmailListNameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setStartEmailListName("foo"); - $this->assertEquals("foo", $this->query->getStartEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0?startEmailListName=foo", - $this->query->getQueryUrl()); - - $this->query->setStartEmailListName(null); - $this->assertEquals(null, $this->query->getStartEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that all parameters can be set simultaneously with no - // ill effects. - public function testCanSetAllParameters() - { - $this->query->setDomain("my.domain.com"); - $this->query->setEmailListName("foo"); - $this->query->setRecipient("bar@qux.com"); - $this->query->setStartEmailListName("wibble"); - $this->assertEquals("foo", $this->query->getEmailListName()); - $this->assertEquals("bar@qux.com", $this->query->getRecipient()); - $this->assertEquals("wibble", $this->query->getStartEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/foo?recipient=bar%40qux.com&startEmailListName=wibble", - $this->query->getQueryUrl()); - - $this->query->setRecipient("baz@blah.com"); - $this->query->setEmailListName("xyzzy"); - $this->query->setStartEmailListName("woof"); - $this->assertEquals("xyzzy", $this->query->getEmailListName()); - $this->assertEquals("baz@blah.com", $this->query->getRecipient()); - $this->assertEquals("woof", $this->query->getStartEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/xyzzy?recipient=baz%40blah.com&startEmailListName=woof", - $this->query->getQueryUrl()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListRecipientEntryTest.php b/tests/Zend/Gdata/Gapps/EmailListRecipientEntryTest.php deleted file mode 100644 index 89570f2ce5..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListRecipientEntryTest.php +++ /dev/null @@ -1,107 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/EmailListRecipientEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_EmailListRecipientEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($emailListRecipientEntry) { - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient/SusanJones%40example.com', - $emailListRecipientEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $emailListRecipientEntry->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $emailListRecipientEntry->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/apps/2006#emailList.recipient', $emailListRecipientEntry->category[0]->term); - $this->assertEquals('text', $emailListRecipientEntry->title->type); - $this->assertEquals('SusanJones', $emailListRecipientEntry->title->text);; - $this->assertEquals('self', $emailListRecipientEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $emailListRecipientEntry->getLink('self')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient/SusanJones%40example.com', $emailListRecipientEntry->getLink('self')->href); - $this->assertEquals('edit', $emailListRecipientEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $emailListRecipientEntry->getLink('edit')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient/SusanJones%40example.com', $emailListRecipientEntry->getLink('edit')->href); - $this->assertEquals('SusanJones@example.com', $emailListRecipientEntry->who->email); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyEmailListRecipientEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newEmailListRecipientEntry = new Zend_Gdata_Gapps_EmailListRecipientEntry(); - $newEmailListRecipientEntry->transferFromXML($entryXml); - $newEmailListRecipientEntryXml = $newEmailListRecipientEntry->saveXML(); - $this->assertTrue($entryXml == $newEmailListRecipientEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertEmailListRecipientEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newEmailListRecipientEntry = new Zend_Gdata_Gapps_EmailListRecipientEntry(); - $newEmailListRecipientEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newEmailListRecipientEntry); - $newEmailListRecipientEntryXml = $newEmailListRecipientEntry->saveXML(); - $this->assertEquals($entryXml, $newEmailListRecipientEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListRecipientFeedTest.php b/tests/Zend/Gdata/Gapps/EmailListRecipientFeedTest.php deleted file mode 100644 index 9166ee206c..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListRecipientFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -emailListRecipientFeed = new Zend_Gdata_Gapps_EmailListRecipientFeed($emailListRecipientFeedText); - $this->emptyEmailListRecipientFeed = new Zend_Gdata_Gapps_EmailListRecipientFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyEmailListRecipientFeed->extensionElements)); - $this->assertTrue(count($this->emptyEmailListRecipientFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyEmailListRecipientFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyEmailListRecipientFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emailListRecipientFeed->extensionElements)); - $this->assertTrue(count($this->emailListRecipientFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emailListRecipientFeed->extensionAttributes)); - $this->assertTrue(count($this->emailListRecipientFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->emailListRecipientFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_EmailListRecipientEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->emailListRecipientFeed and convert back to objects */ - $newEmailListRecipientFeed = new Zend_Gdata_Gapps_EmailListRecipientFeed( - $this->emailListRecipientFeed->saveXML()); - $newEntryCount = 0; - foreach ($newEmailListRecipientFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_EmailListRecipientEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->emailListRecipientFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListRecipientQueryTest.php b/tests/Zend/Gdata/Gapps/EmailListRecipientQueryTest.php deleted file mode 100644 index dd64f02b37..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListRecipientQueryTest.php +++ /dev/null @@ -1,90 +0,0 @@ -query = new Zend_Gdata_Gapps_EmailListRecipientQuery(); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setEmailListName("something"); - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/something/recipient/", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/hello.world.baz/emailList/2.0/something/recipient/", - $this->query->getQueryUrl()); - } - - // Test to make sure that the emailListName accessor methods work and propagate - // to the query URI. - public function testCanSetEmailListNameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setEmailListName("foo"); - $this->assertEquals("foo", $this->query->getEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/foo/recipient/", - $this->query->getQueryUrl()); - - $this->query->setEmailListName("bar"); - $this->assertEquals("bar", $this->query->getEmailListName()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/bar/recipient/", - $this->query->getQueryUrl()); - } - - public function testCanSetStartRecipientProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setEmailListName("foo"); - $this->query->setStartRecipient("bar"); - $this->assertEquals("bar", $this->query->getStartRecipient()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/foo/recipient/?startRecipient=bar", - $this->query->getQueryUrl()); - - $this->query->setStartRecipient(null); - $this->assertEquals(null, $this->query->getStartRecipient()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/emailList/2.0/foo/recipient/", - $this->query->getQueryUrl()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/EmailListTest.php b/tests/Zend/Gdata/Gapps/EmailListTest.php deleted file mode 100644 index 7810db33d1..0000000000 --- a/tests/Zend/Gdata/Gapps/EmailListTest.php +++ /dev/null @@ -1,126 +0,0 @@ -emailListText = file_get_contents( - 'Zend/Gdata/Gapps/_files/EmailListElementSample1.xml', - true); - $this->emailList = new Zend_Gdata_Gapps_Extension_EmailList(); - } - - public function testEmptyEmailListShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emailList->extensionElements)); - $this->assertTrue(count($this->emailList->extensionElements) == 0); - } - - public function testEmptyEmailListShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emailList->extensionAttributes)); - $this->assertTrue(count($this->emailList->extensionAttributes) == 0); - } - - public function testSampleEmailListShouldHaveNoExtensionElements() { - $this->emailList->transferFromXML($this->emailListText); - $this->assertTrue(is_array($this->emailList->extensionElements)); - $this->assertTrue(count($this->emailList->extensionElements) == 0); - } - - public function testSampleEmailListShouldHaveNoExtensionAttributes() { - $this->emailList->transferFromXML($this->emailListText); - $this->assertTrue(is_array($this->emailList->extensionAttributes)); - $this->assertTrue(count($this->emailList->extensionAttributes) == 0); - } - - public function testNormalEmailListShouldHaveNoExtensionElements() { - $this->emailList->name = "test-name"; - - $this->assertEquals("test-name", $this->emailList->name); - - $this->assertEquals(0, count($this->emailList->extensionElements)); - $newEmailList = new Zend_Gdata_Gapps_Extension_EmailList(); - $newEmailList->transferFromXML($this->emailList->saveXML()); - $this->assertEquals(0, count($newEmailList->extensionElements)); - $newEmailList->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newEmailList->extensionElements)); - $this->assertEquals("test-name", $newEmailList->name); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newEmailList2 = $gdata->newEmailList(); - $newEmailList2->transferFromXML($newEmailList->saveXML()); - $this->assertEquals(1, count($newEmailList2->extensionElements)); - $this->assertEquals("test-name", $newEmailList2->name); - } - - public function testEmptyEmailListToAndFromStringShouldMatch() { - $emailListXml = $this->emailList->saveXML(); - $newEmailList = new Zend_Gdata_Gapps_Extension_EmailList(); - $newEmailList->transferFromXML($emailListXml); - $newEmailListXml = $newEmailList->saveXML(); - $this->assertTrue($emailListXml == $newEmailListXml); - } - - public function testEmailListWithValueToAndFromStringShouldMatch() { - $this->emailList->name = "test-name"; - $emailListXml = $this->emailList->saveXML(); - $newEmailList = new Zend_Gdata_Gapps_Extension_EmailList(); - $newEmailList->transferFromXML($emailListXml); - $newEmailListXml = $newEmailList->saveXML(); - $this->assertTrue($emailListXml == $newEmailListXml); - $this->assertEquals("test-name", $this->emailList->name); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->emailList->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->emailList->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->emailList->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->emailList->extensionAttributes['foo2']['value']); - $emailListXml = $this->emailList->saveXML(); - $newEmailList = new Zend_Gdata_Gapps_Extension_EmailList(); - $newEmailList->transferFromXML($emailListXml); - $this->assertEquals('bar', $newEmailList->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newEmailList->extensionAttributes['foo2']['value']); - } - - public function testConvertFullEmailListToAndFromString() { - $this->emailList->transferFromXML($this->emailListText); - $this->assertEquals("us-sales", $this->emailList->name); - } - -} diff --git a/tests/Zend/Gdata/Gapps/ErrorTest.php b/tests/Zend/Gdata/Gapps/ErrorTest.php deleted file mode 100644 index d6737823f9..0000000000 --- a/tests/Zend/Gdata/Gapps/ErrorTest.php +++ /dev/null @@ -1,88 +0,0 @@ -error = new Zend_Gdata_Gapps_Error(); - } - - public function testCanSetAndGetErrorCodeUsingConstant() { - $this->error->setErrorCode( - Zend_Gdata_Gapps_Error::INVALID_EMAIL_ADDRESS); - $this->assertEquals(Zend_Gdata_Gapps_Error::INVALID_EMAIL_ADDRESS, - $this->error->getErrorCode()); - } - - public function testCanSetAndGetErrorCodeUsingInteger() { - $this->error->setErrorCode(123); - $this->assertEquals(123, $this->error->getErrorCode()); - } - - public function testCanSetAndGetReason() { - $text = "The foo is missing a bar."; - $this->error->setReason($text); - $this->assertEquals($text, $this->error->getReason()); - } - - public function testCanSetAndGetInvalidInput() { - $text = "for___baz"; - $this->error->setInvalidInput($text); - $this->assertEquals($text, $this->error->getInvalidInput()); - } - - public function testContstructorAllowsSettingAllVariables() { - $this->error = new Zend_Gdata_Gapps_Error( - Zend_Gdata_Gapps_Error::USER_DELETED_RECENTLY, - "foo", "bar"); - $this->assertEquals(Zend_Gdata_Gapps_Error::USER_DELETED_RECENTLY, - $this->error->getErrorCode()); - $this->assertEquals("foo", $this->error->getReason()); - $this->assertEquals("bar", $this->error->getInvalidInput()); - } - - public function testToStringProvidesHelpfulMessage() { - $this->error->setErrorCode(Zend_Gdata_Gapps_Error::USER_SUSPENDED); - $this->error->setReason("The foo is missing a bar."); - $this->error->setInvalidInput("for___baz"); - $this->assertEquals("Error 1101: The foo is missing a bar.\n\tInvalid Input: \"for___baz\"", $this->error->__toString()); - - $this->error->setErrorCode(Zend_Gdata_Gapps_Error::UNKNOWN_ERROR); - $this->error->setReason("Unknown error."); - $this->error->setInvalidInput("blah"); - $this->assertEquals("Error 1000: Unknown error.\n\tInvalid Input: \"blah\"", $this->error->__toString()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/GroupEntryTest.php b/tests/Zend/Gdata/Gapps/GroupEntryTest.php deleted file mode 100644 index 3f86618c02..0000000000 --- a/tests/Zend/Gdata/Gapps/GroupEntryTest.php +++ /dev/null @@ -1,110 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/GroupEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_GroupEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($groupEntry) { - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales', - $groupEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $groupEntry->updated->text); - $this->assertEquals('self', $groupEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $groupEntry->getLink('self')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales', $groupEntry->getLink('self')->href); - $this->assertEquals('edit', $groupEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $groupEntry->getLink('edit')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales', $groupEntry->getLink('edit')->href); - $this->assertEquals('groupId', $groupEntry->property[0]->name); - $this->assertEquals('us-sales', $groupEntry->property[0]->value); - $this->assertEquals('groupName', $groupEntry->property[1]->name); - $this->assertEquals('us-sales', $groupEntry->property[1]->value); - $this->assertEquals('description', $groupEntry->property[2]->name); - $this->assertEquals('UnitedStatesSalesTeam', $groupEntry->property[2]->value); - $this->assertEquals('emailPermission', $groupEntry->property[3]->name); - $this->assertEquals('Domain', $groupEntry->property[3]->value); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyGroupEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newGroupEntry = new Zend_Gdata_Gapps_GroupEntry(); - $newGroupEntry->transferFromXML($entryXml); - $newGroupEntryXml = $newGroupEntry->saveXML(); - $this->assertTrue($entryXml == $newGroupEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertGroupEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newGroupEntry = new Zend_Gdata_Gapps_GroupEntry(); - $newGroupEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newGroupEntry); - $newGroupEntryXml = $newGroupEntry->saveXML(); - $this->assertEquals($entryXml, $newGroupEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/GroupFeedTest.php b/tests/Zend/Gdata/Gapps/GroupFeedTest.php deleted file mode 100644 index a95a23338b..0000000000 --- a/tests/Zend/Gdata/Gapps/GroupFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -groupFeed = new Zend_Gdata_Gapps_GroupFeed($groupFeedText); - $this->emptyGroupFeed = new Zend_Gdata_Gapps_GroupFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyGroupFeed->extensionElements)); - $this->assertTrue(count($this->emptyGroupFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyGroupFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyGroupFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->groupFeed->extensionElements)); - $this->assertTrue(count($this->groupFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->groupFeed->extensionAttributes)); - $this->assertTrue(count($this->groupFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of GroupEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->groupFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_GroupEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->groupFeed and convert back to objects */ - $newGroupFeed = new Zend_Gdata_Gapps_GroupFeed( - $this->groupFeed->saveXML()); - $newEntryCount = 0; - foreach ($newGroupFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_GroupEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of group entries equals the number - * of groups defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->groupFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/GroupQueryTest.php b/tests/Zend/Gdata/Gapps/GroupQueryTest.php deleted file mode 100644 index 9da58b4a68..0000000000 --- a/tests/Zend/Gdata/Gapps/GroupQueryTest.php +++ /dev/null @@ -1,168 +0,0 @@ -query = new Zend_Gdata_Gapps_GroupQuery(); - } - - // Test to make sure that URI generation works - public function testDefaultQueryURIGeneration() - { - $this->query->setDomain("foo.bar.invalid"); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/foo.bar.invalid", - $this->query->getQueryUrl()); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/hello.world.baz", - $this->query->getQueryUrl()); - } - - // Test to make sure that the groupId accessor methods work and propagate - // to the query URI. - public function testCanSetGroupIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->assertEquals("foo", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo", - $this->query->getQueryUrl()); - - $this->query->setGroupId("bar"); - $this->assertEquals("bar", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/bar", - $this->query->getQueryUrl()); - } - - // Test to make sure that the member accessor methods work and propagate - // to the query URI. - public function testCanSetMemberProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setMember("bar@qux.com"); - $this->assertEquals("bar@qux.com", $this->query->getMember()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/?member=bar%40qux.com", - $this->query->getQueryUrl()); - - $this->query->setMember(null); - $this->assertEquals(null, $this->query->getMember()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com", - $this->query->getQueryUrl()); - } - - // Test to make sure that the startUsername accessor methods work and - // propagate to the query URI. - public function testCanSetStartGroupIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setStartGroupId("foo"); - $this->assertEquals("foo", $this->query->getStartGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com?start=foo", - $this->query->getQueryUrl()); - - $this->query->setStartGroupId(null); - $this->assertEquals(null, $this->query->getStartGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com", - $this->query->getQueryUrl()); - } - - public function testCanSetDirectOnlyProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setMember("bar@qux.com"); - $this->query->setDirectOnly(true); - $this->assertEquals(true, $this->query->getDirectOnly()); - $expected_url = "https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/"; - $expected_url .= "?member=bar%40qux.com&directOnly=true"; - $this->assertEquals($expected_url, $this->query->getQueryUrl()); - - $this->query->setDirectOnly(false); - $this->assertEquals(false, $this->query->getDirectOnly()); - $expected_url = "https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/"; - $expected_url .= "?member=bar%40qux.com&directOnly=false"; - $this->assertEquals($expected_url, $this->query->getQueryUrl()); - - $this->query->setDirectOnly(null); - $this->assertEquals(null, $this->query->getDirectOnly()); - $expected_url = "https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/"; - $expected_url .= "?member=bar%40qux.com"; - $this->assertEquals($expected_url, $this->query->getQueryUrl()); - } - - // Test to make sure that all parameters can be set simultaneously with no - // ill effects. - public function testCanSetAllParameters() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->query->setMember("bar@qux.com"); - $this->query->setStartGroupId("wibble"); - $this->query->setDirectOnly(true); - $this->assertEquals("foo", $this->query->getGroupId()); - $this->assertEquals("bar@qux.com", $this->query->getMember()); - $this->assertEquals("wibble", $this->query->getStartGroupId()); - $this->assertEquals(true, $this->query->getDirectOnly()); - $expected_url = "https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/"; - $expected_url .= "foo/?member=bar%40qux.com&start=wibble&directOnly=true"; - $this->assertEquals($expected_url, $this->query->getQueryUrl()); - - $this->query->setMember("baz@blah.com"); - $this->query->setGroupId("xyzzy"); - $this->query->setStartGroupId("woof"); - $this->query->setDirectOnly(false); - $this->assertEquals("xyzzy", $this->query->getGroupId()); - $this->assertEquals("baz@blah.com", $this->query->getMember()); - $this->assertEquals("woof", $this->query->getStartGroupId()); - $this->assertEquals(false, $this->query->getDirectOnly()); - $expected_url = "https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/"; - $expected_url .= "xyzzy/?member=baz%40blah.com&start=woof&directOnly=false"; - $this->assertEquals($expected_url, $this->query->getQueryUrl()); - } - -} - diff --git a/tests/Zend/Gdata/Gapps/LoginTest.php b/tests/Zend/Gdata/Gapps/LoginTest.php deleted file mode 100644 index 97d26200ec..0000000000 --- a/tests/Zend/Gdata/Gapps/LoginTest.php +++ /dev/null @@ -1,169 +0,0 @@ -loginText = file_get_contents( - 'Zend/Gdata/Gapps/_files/LoginElementSample1.xml', - true); - $this->login = new Zend_Gdata_Gapps_Extension_Login(); - } - - public function testEmptyLoginShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->login->extensionElements)); - $this->assertTrue(count($this->login->extensionElements) == 0); - } - - public function testEmptyLoginShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->login->extensionAttributes)); - $this->assertTrue(count($this->login->extensionAttributes) == 0); - } - - public function testSampleLoginShouldHaveNoExtensionElements() { - $this->login->transferFromXML($this->loginText); - $this->assertTrue(is_array($this->login->extensionElements)); - $this->assertTrue(count($this->login->extensionElements) == 0); - } - - public function testSampleLoginShouldHaveNoExtensionAttributes() { - $this->login->transferFromXML($this->loginText); - $this->assertTrue(is_array($this->login->extensionAttributes)); - $this->assertTrue(count($this->login->extensionAttributes) == 0); - } - - public function testNormalLoginShouldHaveNoExtensionElements() { - $this->login->username = "johndoe"; - $this->login->password = "abcdefg1234567890"; - $this->login->hashFunctionName = "Foo"; - $this->login->suspended = true; - $this->login->admin = true; - $this->login->changePasswordAtNextLogin = true; - $this->login->agreedToTerms = false; - - $this->assertEquals("johndoe", $this->login->username); - $this->assertEquals("abcdefg1234567890", $this->login->password); - $this->assertEquals("Foo", $this->login->hashFunctionName); - $this->assertEquals(true, $this->login->suspended); - $this->assertEquals(true, $this->login->admin); - $this->assertEquals(true, $this->login->changePasswordAtNextLogin); - $this->assertEquals(false, $this->login->agreedToTerms); - - $this->assertEquals(0, count($this->login->extensionElements)); - $newLogin = new Zend_Gdata_Gapps_Extension_Login(); - $newLogin->transferFromXML($this->login->saveXML()); - $this->assertEquals(0, count($newLogin->extensionElements)); - $newLogin->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newLogin->extensionElements)); - $this->assertEquals("johndoe", $newLogin->username); - $this->assertEquals("abcdefg1234567890", $newLogin->password); - $this->assertEquals("Foo", $newLogin->hashFunctionName); - $this->assertEquals(true, $newLogin->suspended); - $this->assertEquals(true, $newLogin->admin); - $this->assertEquals(true, $newLogin->changePasswordAtNextLogin); - $this->assertEquals(false, $newLogin->agreedToTerms); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newLogin2 = $gdata->newLogin(); - $newLogin2->transferFromXML($newLogin->saveXML()); - $this->assertEquals(1, count($newLogin2->extensionElements)); - $this->assertEquals("johndoe", $newLogin2->username); - $this->assertEquals("abcdefg1234567890", $newLogin2->password); - $this->assertEquals("Foo", $newLogin2->hashFunctionName); - $this->assertEquals(true, $newLogin2->suspended); - $this->assertEquals(true, $newLogin2->admin); - $this->assertEquals(true, $newLogin2->changePasswordAtNextLogin); - $this->assertEquals(false, $newLogin2->agreedToTerms); - } - - public function testEmptyLoginToAndFromStringShouldMatch() { - $loginXml = $this->login->saveXML(); - $newLogin = new Zend_Gdata_Gapps_Extension_Login(); - $newLogin->transferFromXML($loginXml); - $newLoginXml = $newLogin->saveXML(); - $this->assertTrue($loginXml == $newLoginXml); - } - - public function testLoginWithValueToAndFromStringShouldMatch() { - $this->login->username = "johndoe"; - $this->login->password = "abcdefg1234567890"; - $this->login->hashFunctionName = "Foo"; - $this->login->suspended = true; - $this->login->admin = true; - $this->login->changePasswordAtNextLogin = true; - $this->login->agreedToTerms = false; - $loginXml = $this->login->saveXML(); - $newLogin = new Zend_Gdata_Gapps_Extension_Login(); - $newLogin->transferFromXML($loginXml); - $newLoginXml = $newLogin->saveXML(); - $this->assertTrue($loginXml == $newLoginXml); - $this->assertEquals("johndoe", $this->login->username); - $this->assertEquals("abcdefg1234567890", $this->login->password); - $this->assertEquals("Foo", $this->login->hashFunctionName); - $this->assertEquals(true, $this->login->suspended); - $this->assertEquals(true, $this->login->admin); - $this->assertEquals(true, $this->login->changePasswordAtNextLogin); - $this->assertEquals(false, $this->login->agreedToTerms); - - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->login->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->login->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->login->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->login->extensionAttributes['foo2']['value']); - $loginXml = $this->login->saveXML(); - $newLogin = new Zend_Gdata_Gapps_Extension_Login(); - $newLogin->transferFromXML($loginXml); - $this->assertEquals('bar', $newLogin->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newLogin->extensionAttributes['foo2']['value']); - } - - public function testConvertFullLoginToAndFromString() { - $this->login->transferFromXML($this->loginText); - $this->assertEquals("SusanJones-1321", $this->login->username); - $this->assertEquals("123\$\$abc", $this->login->password); - $this->assertEquals("SHA-1", $this->login->hashFunctionName); - $this->assertEquals(false, $this->login->suspended); - $this->assertEquals(false, $this->login->admin); - $this->assertEquals(false, $this->login->changePasswordAtNextLogin); - $this->assertEquals(true, $this->login->agreedToTerms); - } - -} diff --git a/tests/Zend/Gdata/Gapps/MemberEntryTest.php b/tests/Zend/Gdata/Gapps/MemberEntryTest.php deleted file mode 100644 index 22f82454a0..0000000000 --- a/tests/Zend/Gdata/Gapps/MemberEntryTest.php +++ /dev/null @@ -1,108 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/MemberEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_MemberEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($memberEntry) { - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/suejones%40example.com', - $memberEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $memberEntry->updated->text); - $this->assertEquals('self', $memberEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $memberEntry->getLink('self')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/suejones%40example.com', $memberEntry->getLink('self')->href); - $this->assertEquals('edit', $memberEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $memberEntry->getLink('edit')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/suejones%40example.com', $memberEntry->getLink('edit')->href); - $this->assertEquals('memberId', $memberEntry->property[0]->name); - $this->assertEquals('suejones@example.com', $memberEntry->property[0]->value); - $this->assertEquals('memberType', $memberEntry->property[1]->name); - $this->assertEquals('User', $memberEntry->property[1]->value); - $this->assertEquals('directMember', $memberEntry->property[2]->name); - $this->assertEquals('true', $memberEntry->property[2]->value); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyMemberEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newMemberEntry = new Zend_Gdata_Gapps_MemberEntry(); - $newMemberEntry->transferFromXML($entryXml); - $newMemberEntryXml = $newMemberEntry->saveXML(); - $this->assertTrue($entryXml == $newMemberEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertMemberEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newMemberEntry = new Zend_Gdata_Gapps_MemberEntry(); - $newMemberEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newMemberEntry); - $newMemberEntryXml = $newMemberEntry->saveXML(); - $this->assertEquals($entryXml, $newMemberEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/MemberFeedTest.php b/tests/Zend/Gdata/Gapps/MemberFeedTest.php deleted file mode 100644 index a4633d6790..0000000000 --- a/tests/Zend/Gdata/Gapps/MemberFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -memberFeed = new Zend_Gdata_Gapps_MemberFeed($memberFeedText); - $this->emptyMemberFeed = new Zend_Gdata_Gapps_MemberFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyMemberFeed->extensionElements)); - $this->assertTrue(count($this->emptyMemberFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyMemberFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyMemberFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->memberFeed->extensionElements)); - $this->assertTrue(count($this->memberFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->memberFeed->extensionAttributes)); - $this->assertTrue(count($this->memberFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of MemberEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->memberFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_MemberEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->memberFeed and convert back to objects */ - $newMemberFeed = new Zend_Gdata_Gapps_MemberFeed( - $this->memberFeed->saveXML()); - $newEntryCount = 0; - foreach ($newMemberFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_MemberEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of member entries equals the number - * of members defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->memberFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/MemberQueryTest.php b/tests/Zend/Gdata/Gapps/MemberQueryTest.php deleted file mode 100644 index b884a023a6..0000000000 --- a/tests/Zend/Gdata/Gapps/MemberQueryTest.php +++ /dev/null @@ -1,109 +0,0 @@ -query = new Zend_Gdata_Gapps_MemberQuery(); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setGroupId("something"); - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/something/member", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/hello.world.baz/something/member", - $this->query->getQueryUrl()); - } - - // Test to make sure that the groupId accessor methods work and propagate - // to the query URI. - public function testCanSetGroupIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->assertEquals("foo", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/member", - $this->query->getQueryUrl()); - - $this->query->setGroupId("bar"); - $this->assertEquals("bar", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/bar/member", - $this->query->getQueryUrl()); - } - - // Test to make sure that the memberId accessor methods work and propagate - // to the query URI. - public function testCanSetMemberIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->query->setMemberId("bar"); - $this->assertEquals("bar", $this->query->getMemberId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/member/bar", - $this->query->getQueryUrl()); - - $this->query->setGroupId("baz"); - $this->query->setMemberId(null); - $this->assertEquals(null, $this->query->getMemberId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/baz/member", - $this->query->getQueryUrl()); - } - - public function testCanSetStartMemberIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->query->setStartMemberId("bar"); - $this->assertEquals("bar", $this->query->getStartMemberId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/member?start=bar", - $this->query->getQueryUrl()); - - $this->query->setStartMemberId(null); - $this->assertEquals(null, $this->query->getStartMemberId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/member", - $this->query->getQueryUrl()); - } - -} - diff --git a/tests/Zend/Gdata/Gapps/NameTest.php b/tests/Zend/Gdata/Gapps/NameTest.php deleted file mode 100644 index 04ff04e87e..0000000000 --- a/tests/Zend/Gdata/Gapps/NameTest.php +++ /dev/null @@ -1,133 +0,0 @@ -theNameText = file_get_contents( - 'Zend/Gdata/Gapps/_files/NameElementSample1.xml', - true); - $this->theName = new Zend_Gdata_Gapps_Extension_Name(); - } - - public function testEmptyNameShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->theName->extensionElements)); - $this->assertTrue(count($this->theName->extensionElements) == 0); - } - - public function testEmptyNameShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->theName->extensionAttributes)); - $this->assertTrue(count($this->theName->extensionAttributes) == 0); - } - - public function testSampleNameShouldHaveNoExtensionElements() { - $this->theName->transferFromXML($this->theNameText); - $this->assertTrue(is_array($this->theName->extensionElements)); - $this->assertTrue(count($this->theName->extensionElements) == 0); - } - - public function testSampleNameShouldHaveNoExtensionAttributes() { - $this->theName->transferFromXML($this->theNameText); - $this->assertTrue(is_array($this->theName->extensionAttributes)); - $this->assertTrue(count($this->theName->extensionAttributes) == 0); - } - - public function testNormalNameShouldHaveNoExtensionElements() { - $this->theName->givenName = "John"; - $this->theName->familyName = "Doe"; - - $this->assertEquals("John", $this->theName->givenName); - $this->assertEquals("Doe", $this->theName->familyName); - - $this->assertEquals(0, count($this->theName->extensionElements)); - $newName = new Zend_Gdata_Gapps_Extension_Name(); - $newName->transferFromXML($this->theName->saveXML()); - $this->assertEquals(0, count($newName->extensionElements)); - $newName->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newName->extensionElements)); - $this->assertEquals("John", $newName->givenName); - $this->assertEquals("Doe", $newName->familyName); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newName2 = $gdata->newName(); - $newName2->transferFromXML($newName->saveXML()); - $this->assertEquals(1, count($newName2->extensionElements)); - $this->assertEquals("John", $newName2->givenName); - $this->assertEquals("Doe", $newName2->familyName); - } - - public function testEmptyNameToAndFromStringShouldMatch() { - $nameXml = $this->theName->saveXML(); - $newName = new Zend_Gdata_Gapps_Extension_Name(); - $newName->transferFromXML($nameXml); - $newNameXml = $newName->saveXML(); - $this->assertTrue($nameXml == $newNameXml); - } - - public function testNameWithValueToAndFromStringShouldMatch() { - $this->theName->givenName = "John"; - $this->theName->familyName = "Doe"; - $nameXml = $this->theName->saveXML(); - $newName = new Zend_Gdata_Gapps_Extension_Name(); - $newName->transferFromXML($nameXml); - $newNameXml = $newName->saveXML(); - $this->assertTrue($nameXml == $newNameXml); - $this->assertEquals("John", $this->theName->givenName); - $this->assertEquals("Doe", $this->theName->familyName); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->theName->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->theName->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->theName->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->theName->extensionAttributes['foo2']['value']); - $nameXml = $this->theName->saveXML(); - $newName = new Zend_Gdata_Gapps_Extension_Name(); - $newName->transferFromXML($nameXml); - $this->assertEquals('bar', $newName->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newName->extensionAttributes['foo2']['value']); - } - - public function testConvertFullNameToAndFromString() { - $this->theName->transferFromXML($this->theNameText); - $this->assertEquals("Susan", $this->theName->givenName); - $this->assertEquals("Jones", $this->theName->familyName); - } - -} diff --git a/tests/Zend/Gdata/Gapps/NicknameEntryTest.php b/tests/Zend/Gdata/Gapps/NicknameEntryTest.php deleted file mode 100644 index e4850f6e3e..0000000000 --- a/tests/Zend/Gdata/Gapps/NicknameEntryTest.php +++ /dev/null @@ -1,112 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/NicknameEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_NicknameEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($nicknameEntry) { - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/nickname/2.0/Susy', - $nicknameEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $nicknameEntry->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $nicknameEntry->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/apps/2006#nickname', $nicknameEntry->category[0]->term); - $this->assertEquals('text', $nicknameEntry->title->type); - $this->assertEquals('Susy', $nicknameEntry->title->text);; - $this->assertEquals('self', $nicknameEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $nicknameEntry->getLink('self')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/nickname/2.0/Susy', $nicknameEntry->getLink('self')->href); - $this->assertEquals('edit', $nicknameEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $nicknameEntry->getLink('edit')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/nickname/2.0/Susy', $nicknameEntry->getLink('edit')->href); - $this->assertEquals('Susy', $nicknameEntry->nickname->name); - $this->assertEquals('SusanJones', $nicknameEntry->login->username); - $this->assertEquals(false, $nicknameEntry->login->suspended); - $this->assertEquals(false, $nicknameEntry->login->admin); - $this->assertEquals(false, $nicknameEntry->login->changePasswordAtNextLogin); - $this->assertEquals(true, $nicknameEntry->login->agreedToTerms); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyNicknameEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newNicknameEntry = new Zend_Gdata_Gapps_NicknameEntry(); - $newNicknameEntry->transferFromXML($entryXml); - $newNicknameEntryXml = $newNicknameEntry->saveXML(); - $this->assertTrue($entryXml == $newNicknameEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertNicknameEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newNicknameEntry = new Zend_Gdata_Gapps_NicknameEntry(); - $newNicknameEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newNicknameEntry); - $newNicknameEntryXml = $newNicknameEntry->saveXML(); - $this->assertEquals($entryXml, $newNicknameEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/NicknameFeedTest.php b/tests/Zend/Gdata/Gapps/NicknameFeedTest.php deleted file mode 100644 index 331fdd0c61..0000000000 --- a/tests/Zend/Gdata/Gapps/NicknameFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -nicknameFeed = new Zend_Gdata_Gapps_NicknameFeed($nicknameFeedText); - $this->emptyNicknameFeed = new Zend_Gdata_Gapps_NicknameFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyNicknameFeed->extensionElements)); - $this->assertTrue(count($this->emptyNicknameFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyNicknameFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyNicknameFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->nicknameFeed->extensionElements)); - $this->assertTrue(count($this->nicknameFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->nicknameFeed->extensionAttributes)); - $this->assertTrue(count($this->nicknameFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->nicknameFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_NicknameEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->nicknameFeed and convert back to objects */ - $newNicknameFeed = new Zend_Gdata_Gapps_NicknameFeed( - $this->nicknameFeed->saveXML()); - $newEntryCount = 0; - foreach ($newNicknameFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_NicknameEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->nicknameFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/NicknameQueryTest.php b/tests/Zend/Gdata/Gapps/NicknameQueryTest.php deleted file mode 100644 index 5e38000098..0000000000 --- a/tests/Zend/Gdata/Gapps/NicknameQueryTest.php +++ /dev/null @@ -1,140 +0,0 @@ -query = new Zend_Gdata_Gapps_NicknameQuery(); - } - - // Test to make sure that URI generation works - public function testDefaultQueryURIGeneration() - { - $this->query->setDomain("foo.bar.invalid"); - $this->assertEquals("https://apps-apis.google.com/a/feeds/foo.bar.invalid/nickname/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/hello.world.baz/nickname/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the username accessor methods work and propagate - // to the query URI. - public function testCanSetUsernameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setUsername("foo"); - $this->assertEquals("foo", $this->query->getUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0?username=foo", - $this->query->getQueryUrl()); - - $this->query->setUsername(null); - $this->assertEquals(null, $this->query->getUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the nickname accessor methods work and propagate - // to the query URI. - public function testCanSetNicknameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setNickname("foo"); - $this->assertEquals("foo", $this->query->getNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/foo", - $this->query->getQueryUrl()); - - $this->query->setNickname("bar"); - $this->assertEquals("bar", $this->query->getNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/bar", - $this->query->getQueryUrl()); - } - - // Test to make sure that the startNickname accessor methods work and - // propagate to the query URI. - public function testCanSetStartNicknameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setNickname("foo"); - $this->query->setStartNickname("bar"); - $this->assertEquals("bar", $this->query->getStartNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/foo?startNickname=bar", - $this->query->getQueryUrl()); - - $this->query->setStartNickname(null); - $this->assertEquals(null, $this->query->getStartNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/foo", - $this->query->getQueryUrl()); - } - - - // Test to make sure that all parameters can be set simultaneously with no - // ill effects. - public function testCanSetAllParameters() - { - $this->query->setDomain("my.domain.com"); - $this->query->setNickname("foo"); - $this->query->setUsername("bar"); - $this->query->setStartNickname("baz"); - $this->assertEquals("foo", $this->query->getNickname()); - $this->assertEquals("bar", $this->query->getUsername()); - $this->assertEquals("baz", $this->query->getStartNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/foo?username=bar&startNickname=baz", - $this->query->getQueryUrl()); - - $this->query->setUsername("qux"); - $this->query->setNickname("baz"); - $this->query->setStartNickname("wibble"); - $this->assertEquals("baz", $this->query->getNickname()); - $this->assertEquals("qux", $this->query->getUsername()); - $this->assertEquals("wibble", $this->query->getStartNickname()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/nickname/2.0/baz?username=qux&startNickname=wibble", - $this->query->getQueryUrl()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/NicknameTest.php b/tests/Zend/Gdata/Gapps/NicknameTest.php deleted file mode 100644 index 37d1f11feb..0000000000 --- a/tests/Zend/Gdata/Gapps/NicknameTest.php +++ /dev/null @@ -1,126 +0,0 @@ -nicknameText = file_get_contents( - 'Zend/Gdata/Gapps/_files/NicknameElementSample1.xml', - true); - $this->nickname = new Zend_Gdata_Gapps_Extension_Nickname(); - } - - public function testEmptyNicknameShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->nickname->extensionElements)); - $this->assertTrue(count($this->nickname->extensionElements) == 0); - } - - public function testEmptyNicknameShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->nickname->extensionAttributes)); - $this->assertTrue(count($this->nickname->extensionAttributes) == 0); - } - - public function testSampleNicknameShouldHaveNoExtensionElements() { - $this->nickname->transferFromXML($this->nicknameText); - $this->assertTrue(is_array($this->nickname->extensionElements)); - $this->assertTrue(count($this->nickname->extensionElements) == 0); - } - - public function testSampleNicknameShouldHaveNoExtensionAttributes() { - $this->nickname->transferFromXML($this->nicknameText); - $this->assertTrue(is_array($this->nickname->extensionAttributes)); - $this->assertTrue(count($this->nickname->extensionAttributes) == 0); - } - - public function testNormalNicknameShouldHaveNoExtensionElements() { - $this->nickname->name = "Trogdor"; - - $this->assertEquals("Trogdor", $this->nickname->name); - - $this->assertEquals(0, count($this->nickname->extensionElements)); - $newNickname = new Zend_Gdata_Gapps_Extension_Nickname(); - $newNickname->transferFromXML($this->nickname->saveXML()); - $this->assertEquals(0, count($newNickname->extensionElements)); - $newNickname->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newNickname->extensionElements)); - $this->assertEquals("Trogdor", $newNickname->name); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newNickname2 = $gdata->newNickname(); - $newNickname2->transferFromXML($newNickname->saveXML()); - $this->assertEquals(1, count($newNickname2->extensionElements)); - $this->assertEquals("Trogdor", $newNickname2->name); - } - - public function testEmptyNicknameToAndFromStringShouldMatch() { - $nicknameXml = $this->nickname->saveXML(); - $newNickname = new Zend_Gdata_Gapps_Extension_Nickname(); - $newNickname->transferFromXML($nicknameXml); - $newNicknameXml = $newNickname->saveXML(); - $this->assertTrue($nicknameXml == $newNicknameXml); - } - - public function testNicknameWithValueToAndFromStringShouldMatch() { - $this->nickname->name = "Trogdor"; - $nicknameXml = $this->nickname->saveXML(); - $newNickname = new Zend_Gdata_Gapps_Extension_Nickname(); - $newNickname->transferFromXML($nicknameXml); - $newNicknameXml = $newNickname->saveXML(); - $this->assertTrue($nicknameXml == $newNicknameXml); - $this->assertEquals("Trogdor", $this->nickname->name); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->nickname->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->nickname->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->nickname->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->nickname->extensionAttributes['foo2']['value']); - $nicknameXml = $this->nickname->saveXML(); - $newNickname = new Zend_Gdata_Gapps_Extension_Nickname(); - $newNickname->transferFromXML($nicknameXml); - $this->assertEquals('bar', $newNickname->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newNickname->extensionAttributes['foo2']['value']); - } - - public function testConvertFullNicknameToAndFromString() { - $this->nickname->transferFromXML($this->nicknameText); - $this->assertEquals("Jones", $this->nickname->name); - } - -} diff --git a/tests/Zend/Gdata/Gapps/OwnerEntryTest.php b/tests/Zend/Gdata/Gapps/OwnerEntryTest.php deleted file mode 100644 index f3b7eed6b8..0000000000 --- a/tests/Zend/Gdata/Gapps/OwnerEntryTest.php +++ /dev/null @@ -1,104 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/OwnerEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_OwnerEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($ownerEntry) { - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/joe%40example.com', - $ownerEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $ownerEntry->updated->text); - $this->assertEquals('self', $ownerEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $ownerEntry->getLink('self')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/joe%40example.com', $ownerEntry->getLink('self')->href); - $this->assertEquals('edit', $ownerEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $ownerEntry->getLink('edit')->type); - $this->assertEquals('https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/joe%40example.com', $ownerEntry->getLink('edit')->href); - $this->assertEquals('email', $ownerEntry->property[0]->name); - $this->assertEquals('joe@example.com', $ownerEntry->property[0]->value); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyOwnerEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newOwnerEntry = new Zend_Gdata_Gapps_OwnerEntry(); - $newOwnerEntry->transferFromXML($entryXml); - $newOwnerEntryXml = $newOwnerEntry->saveXML(); - $this->assertTrue($entryXml == $newOwnerEntryXml); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertOwnerEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newOwnerEntry = new Zend_Gdata_Gapps_OwnerEntry(); - $newOwnerEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newOwnerEntry); - $newOwnerEntryXml = $newOwnerEntry->saveXML(); - $this->assertEquals($entryXml, $newOwnerEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/OwnerFeedTest.php b/tests/Zend/Gdata/Gapps/OwnerFeedTest.php deleted file mode 100644 index c628c364c7..0000000000 --- a/tests/Zend/Gdata/Gapps/OwnerFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -ownerFeed = new Zend_Gdata_Gapps_OwnerFeed($ownerFeedText); - $this->emptyOwnerFeed = new Zend_Gdata_Gapps_OwnerFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyOwnerFeed->extensionElements)); - $this->assertTrue(count($this->emptyOwnerFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyOwnerFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyOwnerFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->ownerFeed->extensionElements)); - $this->assertTrue(count($this->ownerFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->ownerFeed->extensionAttributes)); - $this->assertTrue(count($this->ownerFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of OwnerEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->ownerFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_OwnerEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->ownerFeed and convert back to objects */ - $newOwnerFeed = new Zend_Gdata_Gapps_OwnerFeed( - $this->ownerFeed->saveXML()); - $newEntryCount = 0; - foreach ($newOwnerFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_OwnerEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of owner entries equals the number - * of owners defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->ownerFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/OwnerQueryTest.php b/tests/Zend/Gdata/Gapps/OwnerQueryTest.php deleted file mode 100644 index 0db3b886ab..0000000000 --- a/tests/Zend/Gdata/Gapps/OwnerQueryTest.php +++ /dev/null @@ -1,91 +0,0 @@ -query = new Zend_Gdata_Gapps_OwnerQuery(); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setGroupId("something"); - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/something/owner", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/hello.world.baz/something/owner", - $this->query->getQueryUrl()); - } - - // Test to make sure that the groupId accessor methods work and propagate - // to the query URI. - public function testCanSetGroupIdProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->assertEquals("foo", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/owner", - $this->query->getQueryUrl()); - - $this->query->setGroupId("bar"); - $this->assertEquals("bar", $this->query->getGroupId()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/bar/owner", - $this->query->getQueryUrl()); - } - - public function testCanSetOwnerEmailProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setGroupId("foo"); - $this->query->setOwnerEmail("bar@blah.com"); - $this->assertEquals("bar@blah.com", $this->query->getOwnerEmail()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/owner/bar@blah.com", - $this->query->getQueryUrl()); - - $this->query->setOwnerEmail('baz@blah.com'); - $this->assertEquals('baz@blah.com', $this->query->getOwnerEmail()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/group/2.0/my.domain.com/foo/owner/baz@blah.com", - $this->query->getQueryUrl()); - } - -} - diff --git a/tests/Zend/Gdata/Gapps/PropertyTest.php b/tests/Zend/Gdata/Gapps/PropertyTest.php deleted file mode 100644 index 63458a7933..0000000000 --- a/tests/Zend/Gdata/Gapps/PropertyTest.php +++ /dev/null @@ -1,133 +0,0 @@ -thePropertyText = file_get_contents( - 'Zend/Gdata/Gapps/_files/PropertyElementSample1.xml', - true); - $this->theProperty = new Zend_Gdata_Gapps_Extension_Property(); - } - - public function testEmptyPropertyShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->theProperty->extensionElements)); - $this->assertTrue(count($this->theProperty->extensionElements) == 0); - } - - public function testEmptyPropertyShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->theProperty->extensionAttributes)); - $this->assertTrue(count($this->theProperty->extensionAttributes) == 0); - } - - public function testSamplePropertyShouldHaveNoExtensionElements() { - $this->theProperty->transferFromXML($this->thePropertyText); - $this->assertTrue(is_array($this->theProperty->extensionElements)); - $this->assertTrue(count($this->theProperty->extensionElements) == 0); - } - - public function testSamplePropertyShouldHaveNoExtensionAttributes() { - $this->theProperty->transferFromXML($this->thePropertyText); - $this->assertTrue(is_array($this->theProperty->extensionAttributes)); - $this->assertTrue(count($this->theProperty->extensionAttributes) == 0); - } - - public function testNormalPropertyShouldHaveNoExtensionElements() { - $this->theProperty->name = "foo"; - $this->theProperty->value = "bar"; - - $this->assertEquals("foo", $this->theProperty->name); - $this->assertEquals("bar", $this->theProperty->value); - - $this->assertEquals(0, count($this->theProperty->extensionElements)); - $newProperty = new Zend_Gdata_Gapps_Extension_Property(); - $newProperty->transferFromXML($this->theProperty->saveXML()); - $this->assertEquals(0, count($newProperty->extensionElements)); - $newProperty->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newProperty->extensionElements)); - $this->assertEquals("foo", $newProperty->name); - $this->assertEquals("bar", $newProperty->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newProperty2 = $gdata->newProperty(); - $newProperty2->transferFromXML($newProperty->saveXML()); - $this->assertEquals(1, count($newProperty2->extensionElements)); - $this->assertEquals("foo", $newProperty2->name); - $this->assertEquals("bar", $newProperty2->value); - } - - public function testEmptyPropertyToAndFromStringShouldMatch() { - $propertyXml = $this->theProperty->saveXML(); - $newProperty = new Zend_Gdata_Gapps_Extension_Property(); - $newProperty->transferFromXML($propertyXml); - $newPropertyXml = $newProperty->saveXML(); - $this->assertTrue($propertyXml == $newPropertyXml); - } - - public function testPropertyWithValueToAndFromStringShouldMatch() { - $this->theProperty->name = "foo2"; - $this->theProperty->value = "bar2"; - $propertyXml = $this->theProperty->saveXML(); - $newProperty = new Zend_Gdata_Gapps_Extension_Property(); - $newProperty->transferFromXML($propertyXml); - $newPropertyXml = $newProperty->saveXML(); - $this->assertTrue($propertyXml == $newPropertyXml); - $this->assertEquals("foo2", $this->theProperty->name); - $this->assertEquals("bar2", $this->theProperty->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->theProperty->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->theProperty->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->theProperty->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->theProperty->extensionAttributes['foo2']['value']); - $propertyXml = $this->theProperty->saveXML(); - $newProperty = new Zend_Gdata_Gapps_Extension_Property(); - $newProperty->transferFromXML($propertyXml); - $this->assertEquals('bar', $newProperty->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newProperty->extensionAttributes['foo2']['value']); - } - - public function testConvertFullNameToAndFromString() { - $this->theProperty->transferFromXML($this->thePropertyText); - $this->assertEquals("Some Name", $this->theProperty->name); - $this->assertEquals("Some Value", $this->theProperty->value); - } - -} diff --git a/tests/Zend/Gdata/Gapps/QuotaTest.php b/tests/Zend/Gdata/Gapps/QuotaTest.php deleted file mode 100644 index 1378dd71b9..0000000000 --- a/tests/Zend/Gdata/Gapps/QuotaTest.php +++ /dev/null @@ -1,126 +0,0 @@ -quotaText = file_get_contents( - 'Zend/Gdata/Gapps/_files/QuotaElementSample1.xml', - true); - $this->quota = new Zend_Gdata_Gapps_Extension_Quota(); - } - - public function testEmptyQuotaShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->quota->extensionElements)); - $this->assertTrue(count($this->quota->extensionElements) == 0); - } - - public function testEmptyQuotaShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->quota->extensionAttributes)); - $this->assertTrue(count($this->quota->extensionAttributes) == 0); - } - - public function testSampleQuotaShouldHaveNoExtensionElements() { - $this->quota->transferFromXML($this->quotaText); - $this->assertTrue(is_array($this->quota->extensionElements)); - $this->assertTrue(count($this->quota->extensionElements) == 0); - } - - public function testSampleQuotaShouldHaveNoExtensionAttributes() { - $this->quota->transferFromXML($this->quotaText); - $this->assertTrue(is_array($this->quota->extensionAttributes)); - $this->assertTrue(count($this->quota->extensionAttributes) == 0); - } - - public function testNormalQuotaShouldHaveNoExtensionElements() { - $this->quota->limit = "123456789"; - - $this->assertEquals("123456789", $this->quota->limit); - - $this->assertEquals(0, count($this->quota->extensionElements)); - $newQuota = new Zend_Gdata_Gapps_Extension_Quota(); - $newQuota->transferFromXML($this->quota->saveXML()); - $this->assertEquals(0, count($newQuota->extensionElements)); - $newQuota->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newQuota->extensionElements)); - $this->assertEquals("123456789", $newQuota->limit); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata_Gapps(); - $newQuota2 = $gdata->newQuota(); - $newQuota2->transferFromXML($newQuota->saveXML()); - $this->assertEquals(1, count($newQuota2->extensionElements)); - $this->assertEquals("123456789", $newQuota2->limit); - } - - public function testEmptyQuotaToAndFromStringShouldMatch() { - $quotaXml = $this->quota->saveXML(); - $newQuota = new Zend_Gdata_Gapps_Extension_Quota(); - $newQuota->transferFromXML($quotaXml); - $newQuotaXml = $newQuota->saveXML(); - $this->assertTrue($quotaXml == $newQuotaXml); - } - - public function testQuotaWithValueToAndFromStringShouldMatch() { - $this->quota->limit = "123456789"; - $quotaXml = $this->quota->saveXML(); - $newQuota = new Zend_Gdata_Gapps_Extension_Quota(); - $newQuota->transferFromXML($quotaXml); - $newQuotaXml = $newQuota->saveXML(); - $this->assertTrue($quotaXml == $newQuotaXml); - $this->assertEquals("123456789", $this->quota->limit); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->quota->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->quota->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->quota->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->quota->extensionAttributes['foo2']['value']); - $quotaXml = $this->quota->saveXML(); - $newQuota = new Zend_Gdata_Gapps_Extension_Quota(); - $newQuota->transferFromXML($quotaXml); - $this->assertEquals('bar', $newQuota->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newQuota->extensionAttributes['foo2']['value']); - } - - public function testConvertFullQuotaToAndFromString() { - $this->quota->transferFromXML($this->quotaText); - $this->assertEquals("2048", $this->quota->limit); - } - -} diff --git a/tests/Zend/Gdata/Gapps/ServiceExceptionTest.php b/tests/Zend/Gdata/Gapps/ServiceExceptionTest.php deleted file mode 100644 index 8f06e45b3c..0000000000 --- a/tests/Zend/Gdata/Gapps/ServiceExceptionTest.php +++ /dev/null @@ -1,128 +0,0 @@ -xmlSample = file_get_contents( - 'Zend/Gdata/Gapps/_files/AppsForYourDomainElementSample1.xml', - true); - $this->fixture = new Zend_Gdata_Gapps_ServiceException(); - $this->data[1] = new Zend_Gdata_Gapps_Error(1234, "foo", "bar"); - $this->data[2] = new Zend_Gdata_Gapps_Error(4317, "blah", "woof"); - $this->data[3] = new Zend_Gdata_Gapps_Error(5978, "blue", "puppy"); - $this->data[4] = new Zend_Gdata_Gapps_Error(2398, "red", "kitten"); - } - - /** - * @expectedException Zend_Gdata_Gapps_ServiceException - */ - public function testCanThrowServiceException() { - throw $this->fixture; - } - - public function testCanSetAndGetErrorArray() { - $this->fixture->setErrors($this->data); - $incoming = $this->fixture->getErrors(); - $this->assertTrue(is_array($incoming)); - $this->assertEquals(count($this->data), count($incoming)); - foreach ($this->data as $i) { - $this->assertEquals($i, $incoming[$i->getErrorCode()]); - } - } - - public function testCanInsertSingleError() { - $this->fixture->setErrors($this->data); - $outgoing = new Zend_Gdata_Gapps_Error(1111, "a", "b"); - $this->fixture->addError($outgoing); - $result = $this->fixture->getError(1111); - $this->assertEquals($outgoing, $result); - } - - public function testCanSetPropertiesViaConstructor() { - $this->fixture = new Zend_Gdata_Gapps_ServiceException($this->data); - $incoming = $this->fixture->getErrors(); - $this->assertTrue(is_array($incoming)); - $this->assertEquals(count($this->data), count($incoming)); - foreach($this->data as $i) { - $this->assertEquals($i, $incoming[$i->getErrorCode()]); - } - } - - public function testCanRetrieveASpecificErrorByCode() { - $this->fixture->setErrors($this->data); - $result = $this->fixture->getError(5978); - $this->assertEquals($this->data[3], $result); - } - - public function testRetrievingNonexistantErrorCodeReturnsNull() { - $this->fixture->setErrors($this->data); - $result = $this->fixture->getError(0000); - $this->assertEquals(null, $result); - } - - public function testCanCheckIfAKeyExists() { - $this->fixture->setErrors($this->data); - $this->assertTrue($this->fixture->hasError(2398)); - $this->assertFalse($this->fixture->hasError(0000)); - } - - public function testCanConvertFromXML() { - $this->fixture->importFromString($this->xmlSample); - $incoming = $this->fixture->getErrors(); - $this->assertTrue(is_array($incoming)); - $this->assertEquals(3, count($incoming)); - $this->assertEquals("9925", $incoming[9925]->errorCode); - $this->assertEquals("Foo", $incoming[9925]->invalidInput); - $this->assertEquals("Bar", $incoming[9925]->reason); - } - - public function testCanConvertToString() { - $this->fixture->setErrors($this->data); - $this->assertEquals("The server encountered the following errors processing the request: -Error 1234: foo -\tInvalid Input: \"bar\" -Error 4317: blah -\tInvalid Input: \"woof\" -Error 5978: blue -\tInvalid Input: \"puppy\" -Error 2398: red -\tInvalid Input: \"kitten\"", $this->fixture->__toString()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/UserEntryTest.php b/tests/Zend/Gdata/Gapps/UserEntryTest.php deleted file mode 100644 index a2f12d3f51..0000000000 --- a/tests/Zend/Gdata/Gapps/UserEntryTest.php +++ /dev/null @@ -1,145 +0,0 @@ -entryText = file_get_contents( - 'Zend/Gdata/Gapps/_files/UserEntryDataSample1.xml', - true); - $this->entry = new Zend_Gdata_Gapps_UserEntry(); - } - - private function verifyAllSamplePropertiesAreCorrect ($userEntry) { - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/user/2.0/SusanJones', - $userEntry->id->text); - $this->assertEquals('1970-01-01T00:00:00.000Z', $userEntry->updated->text); - $this->assertEquals('http://schemas.google.com/g/2005#kind', $userEntry->category[0]->scheme); - $this->assertEquals('http://schemas.google.com/apps/2006#user', $userEntry->category[0]->term); - $this->assertEquals('text', $userEntry->title->type); - $this->assertEquals('SusanJones', $userEntry->title->text);; - $this->assertEquals('self', $userEntry->getLink('self')->rel); - $this->assertEquals('application/atom+xml', $userEntry->getLink('self')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/user/2.0/SusanJones', $userEntry->getLink('self')->href); - $this->assertEquals('edit', $userEntry->getLink('edit')->rel); - $this->assertEquals('application/atom+xml', $userEntry->getLink('edit')->type); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/user/2.0/SusanJones', $userEntry->getLink('edit')->href); - $this->assertEquals('SusanJones', $userEntry->login->username); - $this->assertEquals('Jones', $userEntry->name->familyName); - $this->assertEquals('Susan', $userEntry->name->givenName); - $this->assertEquals('http://schemas.google.com/apps/2006#user.nicknames', $userEntry->getFeedLink('http://schemas.google.com/apps/2006#user.nicknames')->rel); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/nickname/2.0?username=Susy-1321', $userEntry->getFeedLink('http://schemas.google.com/apps/2006#user.nicknames')->href); - $this->assertEquals('http://schemas.google.com/apps/2006#user.emailLists', $userEntry->getFeedLink('http://schemas.google.com/apps/2006#user.emailLists')->rel); - $this->assertEquals('https://apps-apis.google.com/a/feeds/example.com/emailList/2.0?recipient=us-sales@example.com', $userEntry->getFeedLink('http://schemas.google.com/apps/2006#user.emailLists')->href); - $this->assertEquals('2048', $userEntry->quota->limit); - } - - public function testEmptyEntryShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testEmptyEntryShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionElements() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionElements)); - $this->assertTrue(count($this->entry->extensionElements) == 0); - } - - public function testSampleEntryShouldHaveNoExtensionAttributes() { - $this->entry->transferFromXML($this->entryText); - $this->assertTrue(is_array($this->entry->extensionAttributes)); - $this->assertTrue(count($this->entry->extensionAttributes) == 0); - } - - public function testEmptyUserEntryToAndFromStringShouldMatch() { - $entryXml = $this->entry->saveXML(); - $newUserEntry = new Zend_Gdata_Gapps_UserEntry(); - $newUserEntry->transferFromXML($entryXml); - $newUserEntryXml = $newUserEntry->saveXML(); - $this->assertTrue($entryXml == $newUserEntryXml); - } - - public function testGetFeedLinkReturnsAllStoredEntriesWhenUsedWithNoParameters() { - // Prepare test data - $entry1 = new Zend_Gdata_Extension_FeedLink(); - $entry1->rel = "first"; - $entry1->href= "foo"; - $entry2 = new Zend_Gdata_Extension_FeedLink(); - $entry2->rel = "second"; - $entry2->href= "bar"; - $data = array($entry1, $entry2); - - // Load test data and run test - $this->entry->feedLink = $data; - $this->assertEquals(2, count($this->entry->feedLink)); - } - - public function testGetFeedLinkCanReturnEntriesByRelValue() { - // Prepare test data - $entry1 = new Zend_Gdata_Extension_FeedLink(); - $entry1->rel = "first"; - $entry1->href= "foo"; - $entry2 = new Zend_Gdata_Extension_FeedLink(); - $entry2->rel = "second"; - $entry2->href= "bar"; - $data = array($entry1, $entry2); - - // Load test data and run test - $this->entry->feedLink = $data; - $this->assertEquals($entry1, $this->entry->getFeedLink('first')); - $this->assertEquals($entry2, $this->entry->getFeedLink('second')); - } - - public function testSamplePropertiesAreCorrect () { - $this->entry->transferFromXML($this->entryText); - $this->verifyAllSamplePropertiesAreCorrect($this->entry); - } - - public function testConvertUserEntryToAndFromString() { - $this->entry->transferFromXML($this->entryText); - $entryXml = $this->entry->saveXML(); - $newUserEntry = new Zend_Gdata_Gapps_UserEntry(); - $newUserEntry->transferFromXML($entryXml); - $this->verifyAllSamplePropertiesAreCorrect($newUserEntry); - $newUserEntryXml = $newUserEntry->saveXML(); - $this->assertEquals($entryXml, $newUserEntryXml); - } - -} diff --git a/tests/Zend/Gdata/Gapps/UserFeedTest.php b/tests/Zend/Gdata/Gapps/UserFeedTest.php deleted file mode 100644 index da227bde45..0000000000 --- a/tests/Zend/Gdata/Gapps/UserFeedTest.php +++ /dev/null @@ -1,109 +0,0 @@ -userFeed = new Zend_Gdata_Gapps_UserFeed($userFeedText); - $this->emptyUserFeed = new Zend_Gdata_Gapps_UserFeed(); - } - - public function testEmptyFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->emptyUserFeed->extensionElements)); - $this->assertTrue(count($this->emptyUserFeed->extensionElements) == 0); - } - - public function testEmptyFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->emptyUserFeed->extensionAttributes)); - $this->assertTrue(count($this->emptyUserFeed->extensionAttributes) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->userFeed->extensionElements)); - $this->assertTrue(count($this->userFeed->extensionElements) == 0); - } - - public function testSampleFeedShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->userFeed->extensionAttributes)); - $this->assertTrue(count($this->userFeed->extensionAttributes) == 0); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of EventEntry and object count matches. - */ - public function testXmlImportAndOutputAreNonDestructive() - { - $entryCount = 0; - foreach ($this->userFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_UserEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->userFeed and convert back to objects */ - $newUserFeed = new Zend_Gdata_Gapps_UserFeed( - $this->userFeed->saveXML()); - $newEntryCount = 0; - foreach ($newUserFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Gapps_UserEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that there number of lsit feeds equals the number - * of calendars defined in the sample file. - */ - public function testAllEntriesInFeedAreInstantiated() - { - //TODO feeds implementing ArrayAccess would be helpful here - $entryCount = 0; - foreach ($this->userFeed as $entry) { - $entryCount++; - } - $this->assertEquals(2, $entryCount); - } - -} diff --git a/tests/Zend/Gdata/Gapps/UserQueryTest.php b/tests/Zend/Gdata/Gapps/UserQueryTest.php deleted file mode 100644 index 2bfe72dc9a..0000000000 --- a/tests/Zend/Gdata/Gapps/UserQueryTest.php +++ /dev/null @@ -1,98 +0,0 @@ -query = new Zend_Gdata_Gapps_UserQuery(); - } - - // Test to make sure that URI generation works - public function testDefaultQueryURIGeneration() - { - $this->query->setDomain("foo.bar.invalid"); - $this->assertEquals("https://apps-apis.google.com/a/feeds/foo.bar.invalid/user/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the domain accessor methods work and propagate - // to the query URI. - public function testCanSetQueryDomain() - { - $this->query->setDomain("my.domain.com"); - $this->assertEquals("my.domain.com", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/user/2.0", - $this->query->getQueryUrl()); - - $this->query->setDomain("hello.world.baz"); - $this->assertEquals("hello.world.baz", $this->query->getDomain()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/hello.world.baz/user/2.0", - $this->query->getQueryUrl()); - } - - // Test to make sure that the username accessor methods work and propagate - // to the query URI. - public function testCanSetUsernameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setUsername("foo"); - $this->assertEquals("foo", $this->query->getUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/user/2.0/foo", - $this->query->getQueryUrl()); - - $this->query->setUsername("bar"); - $this->assertEquals("bar", $this->query->getUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/user/2.0/bar", - $this->query->getQueryUrl()); - } - - // Test to make sure that the startUsername accessor methods work and - // propagate to the query URI. - public function testCanSetStartUsernameProperty() - { - $this->query->setDomain("my.domain.com"); - $this->query->setStartUsername("foo"); - $this->assertEquals("foo", $this->query->getStartUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/user/2.0?startUsername=foo", - $this->query->getQueryUrl()); - - $this->query->setStartUsername(null); - $this->assertEquals(null, $this->query->getStartUsername()); - $this->assertEquals("https://apps-apis.google.com/a/feeds/my.domain.com/user/2.0", - $this->query->getQueryUrl()); - } - -} diff --git a/tests/Zend/Gdata/Gapps/_files/AppsForYourDomainElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/AppsForYourDomainElementSample1.xml deleted file mode 100644 index e4ec89f42f..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/AppsForYourDomainElementSample1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/EmailListElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/EmailListElementSample1.xml deleted file mode 100644 index 09349e88f3..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/EmailListElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/EmailListEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/EmailListEntryDataSample1.xml deleted file mode 100644 index ddbd2c7b3c..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/EmailListEntryDataSample1.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales - 1970-01-01T00:00:00.000Z - - us-sales - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/EmailListFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/EmailListFeedDataSample1.xml deleted file mode 100644 index 8d779c7b61..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/EmailListFeedDataSample1.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - http://apps-apis.google.com/a/feeds/example.com/emailList/2.0 - - 1970-01-01T00:00:00.000Z - - EmailLists - diff --git a/tests/Zend/Gdata/Gapps/_files/EmailListRecipientEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/EmailListRecipientEntryDataSample1.xml deleted file mode 100644 index 8bd3c8dfe8..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/EmailListRecipientEntryDataSample1.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - https://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient/SusanJones%40example.com - 1970-01-01T00:00:00.000Z - - SusanJones - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/EmailListRecipientFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/EmailListRecipientFeedDataSample1.xml deleted file mode 100644 index b217c0d378..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/EmailListRecipientFeedDataSample1.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - http://apps-apis.google.com/a/feeds/example.com/emailList/2.0/us-sales/recipient - - 1970-01-01T00:00:00.000Z - - Recipients for email list us-sales - diff --git a/tests/Zend/Gdata/Gapps/_files/GroupEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/GroupEntryDataSample1.xml deleted file mode 100644 index a23e6b5ea9..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/GroupEntryDataSample1.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales - 1970-01-01T00:00:00.000Z - - - - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/GroupFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/GroupFeedDataSample1.xml deleted file mode 100644 index c37ec263cb..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/GroupFeedDataSample1.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com - 2008-12-03T16:33:05.260Z - - - - 1 - - https://apps-apis.google.com/a/feeds/group/2.0/example.com/us-sales%40example.com - 2008-12-03T16:33:05.261Z - - - - - - - - - https://apps-apis.google.com/a/feeds/group/2.0/example.com/Staff-2435%40example.com - 2008-12-03T16:33:05.260Z - - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Gapps/_files/LoginElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/LoginElementSample1.xml deleted file mode 100644 index f6971dc848..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/LoginElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/MemberEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/MemberEntryDataSample1.xml deleted file mode 100644 index 953fa2a6ce..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/MemberEntryDataSample1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/suejones%40example.com - 1970-01-01T00:00:00.000Z - - - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/MemberFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/MemberFeedDataSample1.xml deleted file mode 100644 index aa395ffaa5..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/MemberFeedDataSample1.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member - - 1 - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/suejones%40example.com - - - - - - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/member/ca-sales%40example.com - - - - - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Gapps/_files/NameElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/NameElementSample1.xml deleted file mode 100644 index 4b30681cb9..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/NameElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/NicknameElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/NicknameElementSample1.xml deleted file mode 100644 index a986073cfb..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/NicknameElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/NicknameEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/NicknameEntryDataSample1.xml deleted file mode 100644 index 8c165cea57..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/NicknameEntryDataSample1.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - https://apps-apis.google.com/a/feeds/example.com/nickname/2.0/Susy - 1970-01-01T00:00:00.000Z - - Susy - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/NicknameFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/NicknameFeedDataSample1.xml deleted file mode 100644 index 9598bf4499..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/NicknameFeedDataSample1.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - http://apps-apis.google.com/a/feeds/example.com/nickname/2.0 - - 1970-01-01T00:00:00.000Z - - Nicknames for user SusanJones - - - - 1 - 2 - - - http://apps-apis.google.com/a/feeds/example.com/nickname/2.0/susy - - - susy - - - - - - - - http://apps-apis.google.com/a/feeds/example.com/nickname/2.0/suse - - - suse - - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/OwnerEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/OwnerEntryDataSample1.xml deleted file mode 100644 index c59c87b08e..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/OwnerEntryDataSample1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/joe%40example.com - 1970-01-01T00:00:00.000Z - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/OwnerFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/OwnerFeedDataSample1.xml deleted file mode 100644 index bf1c77536c..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/OwnerFeedDataSample1.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner - 1970-01-01T00:00:00.000Z - - - - 1 - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/joe%40example.com - 1970-01-01T00:00:00.000Z - - - - - - https://www.google.com/a/feeds/group/2.0/example.com/us-sales/owner/suejones%40example.com - 1970-01-01T00:00:00.000Z - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/PropertyElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/PropertyElementSample1.xml deleted file mode 100644 index 740207140a..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/PropertyElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/QuotaElementSample1.xml b/tests/Zend/Gdata/Gapps/_files/QuotaElementSample1.xml deleted file mode 100644 index f516dbd7ef..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/QuotaElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/Gapps/_files/UserEntryDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/UserEntryDataSample1.xml deleted file mode 100644 index 0754443022..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/UserEntryDataSample1.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - https://apps-apis.google.com/a/feeds/example.com/user/2.0/SusanJones - 1970-01-01T00:00:00.000Z - - SusanJones - - - - - - - - diff --git a/tests/Zend/Gdata/Gapps/_files/UserFeedDataSample1.xml b/tests/Zend/Gdata/Gapps/_files/UserFeedDataSample1.xml deleted file mode 100644 index ff4b78e572..0000000000 --- a/tests/Zend/Gdata/Gapps/_files/UserFeedDataSample1.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - http://apps-apis.google.com/a/feeds/example.com/user/2.0 - - 1970-01-01T00:00:00.000Z - - Users - diff --git a/tests/Zend/Gdata/GappsOnlineTest.php b/tests/Zend/Gdata/GappsOnlineTest.php deleted file mode 100644 index dc613e31a1..0000000000 --- a/tests/Zend/Gdata/GappsOnlineTest.php +++ /dev/null @@ -1,834 +0,0 @@ -id = uniqid('ZF-'); - $username = constant('TESTS_ZEND_GDATA_GAPPS_EMAIL'); - $pass = constant('TESTS_ZEND_GDATA_GAPPS_PASSWORD'); - $this->domain = constant('TESTS_ZEND_GDATA_GAPPS_DOMAIN'); - $client = Zend_Gdata_ClientLogin::getHttpClient($username, $pass, Zend_Gdata_Gapps::AUTH_SERVICE_NAME); - $this->gdata = new Zend_Gdata_Gapps($client, $this->domain); - - // Container to hold users and lists created during tests. All entries in - // here will have delete() called during tear down. - // - // Failed deletions are okay, so add everying creatd in here, even if - // you plan to delete the user yourself! - $this->autoDeletePool = array(); - } - - public function tearDown() - { - // Delete all entries in $this->autoDeletePool. - foreach ($this->autoDeletePool as $x) { - try { - $x->delete(); - } catch (Exception $e) { - // Failed deletes are okay. Try and delete the rest anyway. - } - } - } - - // Schedule an entry for deletion at test tear-down. - protected function autoDelete($entry) { - $this->autoDeletePool[] = $entry; - } - - // Test Create/Read/Update/Destroy operations on a UserEntry - public function testUserCRUDOperations() { - // Create a new user - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Verify that returned values are correct - $this->assertEquals($this->id, $user->login->username); - $this->assertEquals(self::GIVEN_NAME, $user->name->givenName); - $this->assertEquals(self::FAMILY_NAME, $user->name->familyName); - - // Since we can't retrieve the password or hash function via the - // API, let's see if a ClientLogin auth request succeeds - try { - Zend_Gdata_ClientLogin::getHTTPClient($this->id . '@' . - $this->domain, self::PASSWORD, 'xapi'); - } catch (Zend_Gdata_App_AuthException $e) { - $this->fail("Unable to authenticate new user via ClientLogin."); - } - - // Check to make sure there are no extension elements/attributes - // in the retrieved user - $this->assertTrue(count($user->extensionElements) == 0); - $this->assertTrue(count($user->extensionAttributes) == 0); - - // Try searching for the same user and make sure that they're returned - $user2 = $this->gdata->retrieveUser($this->id); - $this->assertEquals($user->saveXML(), $user2->saveXML()); - - // Delete user (uses builtin delete method, convenience delete - // method tested further down) - $user->delete(); - - // Ensure that user was deleted - $deletedUser = $this->gdata->retrieveUser($this->id); - $this->assertNull($deletedUser); - } - - // Test to make sure that users with unicode characters can be created - // okay. - public function testUsersSupportUnicode() { - // Create a user - $user = $this->gdata->createUser($this->id, 'テスト', 'ユーザー', - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Make sure the user is the same as returned by the server - $this->assertEquals('テスト', $user->name->givenName); - $this->assertEquals('ユーザー', $user->name->familyName); - } - - // Test to make sure that a page of users can be retrieved. - public function testRetrievePageOfUsers() { - $feed = $this->gdata->retrievePageOfUsers(); - $this->assertTrue(count($feed->entries) > 0); - } - - // Test to make sure that a page of users can be retrieved with a - // startUsername parameter. - public function testRetrievePageOfUsersWithStartingUsername() { - $feed = $this->gdata->retrievePageOfUsers(); - $this->assertTrue(count($feed->entries) > 0); - $username = $feed->entries[0]->login->username; - $feed = $this->gdata->retrievePageOfUsers($username); - $this->assertTrue(count($feed->entries) > 0); - } - - // Test to see if all users can be retrieved - // NOTE: This test may timeout if the domain used for testing contains - // many pages of users. - public function testRetrieveAllUsers() { - // Create 35 users to make sure that there's more than one page. - for ($i = 0; $i < 25; $i++) { - $user = $this->gdata->createUser(uniqid('ZF-'), self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - } - - $feed = $this->gdata->retrieveAllUsers(); - $this->assertTrue(count($feed->entry) > 0); - } - - // Test to see if a user can be manually updated by calling updateUser(). - public function testManualUserEntryUpdate() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $user->name->givenName = "Renamed"; - $user2 = $this->gdata->updateUser($this->id, $user); - $this->assertEquals("Renamed", $user2->name->givenName); - } - - // Test to see if a user can be suspended, then un-suspended - public function testCanSuspendAndRestoreUser() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - $returned = $this->gdata->suspendUser($this->id); - $user = $this->gdata->retrieveUser($this->id); - $this->assertEquals(true, $user->login->suspended); - $this->assertEquals($this->id, $returned->login->username); - - $returned = $this->gdata->restoreUser($this->id); - $user = $this->gdata->retrieveUser($this->id); - $this->assertEquals(false, $user->login->suspended); - $this->assertEquals($this->id, $returned->login->username); - } - - // Test the convenience delete method for users - public function testCanDeleteUser() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Assert that the user exists, just in case... - $rUser = $this->gdata->retrieveUser($this->id); - $this->assertNotNull($rUser); - - // Delete user - $this->gdata->deleteUser($this->id); - - // Ensure that user was deleted - $rUser = $this->gdata->retrieveUser($this->id); - $this->assertNull($rUser); - } - - public function testNicknameCRUDOperations() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Create nickname - // Apps will convert the nickname to lowercase on the server, so - // we just make sure the generated nickname is lowercase here to start - // to avoid confusion later on. - $generatedNickname = strtolower(uniqid('zf-nick-')); - $nickname = $this->gdata->createNickname($this->id, $generatedNickname); - $this->assertEquals($generatedNickname, $nickname->nickname->name); - $this->assertEquals($this->id, $nickname->login->username); - - // Retrieve nickname - $nickname = $this->gdata->retrieveNickname($generatedNickname); - $this->assertEquals($generatedNickname, $nickname->nickname->name); - $this->assertEquals($this->id, $nickname->login->username); - - // Delete nickname (uses builtin delete method, convenience delete - // method tested further down) - $nickname->delete(); - - // Ensure that nickname was deleted - $nickname = $this->gdata->retrieveNickname($generatedNickname); - $this->assertNull($nickname); - } - - public function testRetrieveNicknames() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Create 5 nicknames - for ($i = 0; $i < 5; $i++) { - $generatedNickname[$i] = strtolower(uniqid('zf-nick-')); - $this->gdata->createNickname($this->id, $generatedNickname[$i]); - } - - // Retrieve all nicknames for the test user and see if they match - $nicknameFeed = $this->gdata->retrieveNicknames($this->id); - $this->assertEquals(count($generatedNickname), count($nicknameFeed->entry)); - foreach ($nicknameFeed as $nicknameEntry) { - $searchResult = array_search($nicknameEntry->nickname->name, - $generatedNickname); - $this->assertNotSame(false, $searchResult); - unset($generatedNickname[$searchResult]); - } - $this->assertEquals(0, count($generatedNickname)); - } - - public function testRetrievePageOfNicknames() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Create 5 nicknames - for ($i = 0; $i < 5; $i++) { - $generatedNickname[$i] = strtolower(uniqid('zf-nick-')); - $this->gdata->createNickname($this->id, $generatedNickname[$i]); - } - - // Test to make sure that we receive at least 5 nicknames back - // from the server - $results = $this->gdata->retrievePageOfNicknames(); - $this->assertTrue(count($results->entry) >= 5); - } - - public function testRetrieveAllNicknames() { - // Create 3 users, each with 10 nicknames - for ($i = 0; $i < 3; $i++) { - $user = $this->gdata->createUser(uniqid('ZF-'), self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - for ($j = 0; $j < 10; $j++) { - $generatedNickname = strtolower(uniqid('zf-nick-')); - $this->gdata->createNickname($user->login->username, $generatedNickname); - } - } - - // Test to make sure that we receive at least 5 nicknames back - // from the server - $results = $this->gdata->retrieveAllNicknames(); - $this->assertTrue(count($results->entry) >= 30); - } - - // Test the convenience delete method for nicknames - public function testCanDeleteNickname() { - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $generatedNickname = strtolower(uniqid('zf-nick-')); - $this->gdata->createNickname($this->id, $generatedNickname); - - // Assert that the nickname exists, just in case... - $rNick = $this->gdata->retrieveNickname($generatedNickname); - $this->assertNotNull($rNick); - - // Delete nickname - $this->gdata->deleteNickname($generatedNickname); - - // Ensure that nickname was deleted - $rNick = $this->gdata->retrieveNickname($generatedNickname); - $this->assertNull($rNick); - } - - public function testGroupCRUDOperations() { - // Create group - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'zf-group-', - 'testGroupCRUDOperations()'); - $this->autoDelete($group); - - $groupId = null; - $properties = $group->getProperty(); - foreach ($properties as $property) { - if($property->name == 'groupId') { - $groupId = $property->value; - } - } - - $this->assertEquals($generatedGroupName, $groupId); - - // Retrieve group - $query = $this->gdata->newGroupQuery(); - $groupFeed = $this->gdata->getGroupFeed($query); - $entryCount = count($groupFeed->entry); - $this->assertTrue($entryCount > 0); - - // Delete group (uses builtin delete method, convenience delete - // method tested further down) - $group->delete(); - - // Ensure that group was deleted - $groupFeed = $this->gdata->getGroupFeed($query); - $this->assertEquals($entryCount - 1, count($groupFeed->entry)); - - } - - public function testCanAssignMultipleGroupsToOneUser() { - // Create a user - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Create two groups - $groupCount = 2; - - for ($i = 0; $i < $groupCount; $i++) { - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanAssignMultipleGroupsToOneUser() ' . $i); - $this->autoDelete($group); - $this->gdata->addMemberToGroup($this->id, $generatedGroupName); - } - - // Make sure that the user is subscribed to both groups - $subscriptions = $this->gdata->retrieveGroups($this->id); - $this->assertEquals($groupCount, count($subscriptions->entry)); - - } - - public function testCanRetrievePageOfGroups() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanRetrievePageOfGroups()'); - $this->autoDelete($group); - - // Try retrieving the group feed - $feed = $this->gdata->retrievePageOfGroups(); - $this->assertTrue(count($feed->entry) > 0); - - } - - public function testCanRetrieveAllGroups() { - // Create a couple of users to make sure we don't hit the limit - // on the max number of groups. - for ($i = 0; $i < 3; $i++) { - $user = $this->gdata->createUser(uniqid('ZF-'), self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - } - - // Create a whole bunch of groups to make sure we trigger - // paging. - for ($i = 0; $i < 30; $i++) { - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group ' . $i, - 'testCanRetrieveAllGroups()'); - $this->autoDelete($group); - } - - // Try retrieving the group feed - $feed = $this->gdata->retrieveAllGroups(); - $this->assertTrue(count($feed->entry) >= 30); - - } - - // Test the convenience delete method for groups - public function testCanDeleteGroup() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanDeleteGroup()'); - $this->autoDelete($group); - - // Assert that the group exists, just in case... - $query = $this->gdata->newGroupQuery(); - $query->setGroupId($generatedGroupName); - $entry = $this->gdata->getGroupEntry($query); - $this->assertNotNull($entry); - - // Delete group - $this->gdata->deleteGroup($generatedGroupName); - - // Ensure that group was deleted - try { - $query = $this->gdata->newGroupQuery(); - $query->setGroupId($generatedGroupName); - $entry = $this->gdata->getGroupEntry($query); - // This souldn't execute - $this->fail('Retrieving a non-existant group entry didn\'t' . - 'raise exception.'); - } catch (Zend_Gdata_Gapps_ServiceException $e) { - if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { - // Dummy assertion just to say we tested something here. - $this->assertTrue(true); - } else { - // Exception thrown for an unexpected reason - throw $e; - } - } - - } - - public function testCanRetrievePageOfMembers() { - // Create a new group - $generatedGroupName = strtolower(uniqid('zf-group-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanRetrievePageOfMembers()'); - $this->autoDelete($group); - - // Create two users and assign them to the group - $userCount = 2; - for ($i = 0; $i < $userCount; $i++) { - $generatedUsername = uniqid('ZF-'); - $user = $this->gdata->createUser($generatedUsername, - self::GIVEN_NAME, self::FAMILY_NAME, sha1(self::PASSWORD), - self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addMemberToGroup($generatedUsername, - $generatedGroupName); - } - - // Retrieve members - $memberFeed = $this->gdata->retrievePageOfMembers($generatedGroupName); - $this->assertTrue(count($memberFeed->entry) == $userCount); - - } - - public function testCanRetrievAllMembers() { - // Create a new group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanRetrievAllMembers()'); - $this->autoDelete($group); - - // Create enough users to trigger paging and assign them to the group - $userCount = 30; - for ($i = 0; $i < $userCount; $i++) { - $generatedUsername = uniqid('ZF-'); - $user = $this->gdata->createUser($generatedUsername, - self::GIVEN_NAME, self::FAMILY_NAME, sha1(self::PASSWORD), - self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addMemberToGroup($generatedUsername, $generatedGroupName); - } - - // Retrieve members - $memberFeed = $this->gdata->retrieveAllMembers($generatedGroupName); - $this->assertTrue(count($memberFeed->entry) == $userCount); - - } - - // Test the convenience removeMemberFromGroup method for group members - public function testCanRemoveMemberFromGroup() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanDeleteGroupMember()'); - $this->autoDelete($group); - - // Create a user for the group - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addMemberToGroup($this->id, $generatedGroupName); - - // Assert that the member exists, just in case... - $members = $this->gdata->retrieveAllMembers($generatedGroupName); - $this->assertTrue(count($members->entry) == 1); - - // Remove the member from the group - $this->gdata->removeMemberFromGroup($user->login->username, - $generatedGroupName); - - // Ensure that user was deleted - $members = $this->gdata->retrieveAllMembers($generatedGroupName); - $this->assertTrue(count($members->entry) == 0); - - } - - public function testCanRetrieveGroupOwners() { - // Create a new group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanRetrievAllOwners()'); - $this->autoDelete($group); - - $userCount = 3; - for ($i = 0; $i < $userCount; $i++) { - $generatedUsername = uniqid('ZF-'); - $user = $this->gdata->createUser($generatedUsername, - self::GIVEN_NAME, self::FAMILY_NAME, sha1(self::PASSWORD), - self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addOwnerToGroup($generatedUsername, - $generatedGroupName); - } - - // Retrieve owners - $ownerFeed = $this->gdata->retrieveGroupOwners($generatedGroupName); - $this->assertTrue(count($ownerFeed->entry) == $userCount); - - } - - // Test the convenience removeOwnerFromGroup method for group owners - public function testCanRemoveOwnerFromGroup() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanDeleteGroupOwner()'); - $this->autoDelete($group); - - // Create a user for the group - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addOwnerToGroup($this->id, $generatedGroupName); - - // Assert that the owner exists, just in case... - $owners = $this->gdata->retrieveGroupOwners($generatedGroupName); - $this->assertTrue(count($owners->entry) == 1); - - // Remove the owner from the group - $this->gdata->removeOwnerFromGroup($user->login->username, - $generatedGroupName); - - // Ensure that user was deleted - $owners = $this->gdata->retrieveGroupOwners($generatedGroupName); - $this->assertTrue(count($owners->entry) == 0); - } - - // Test the convenience isMember method - public function testIsMember() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testIsMember()'); - $this->autoDelete($group); - - // Create a user for the group - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addMemberToGroup($this->id, $generatedGroupName); - - $isMember = $this->gdata->isMember($this->id, $generatedGroupName); - - $this->assertTrue($isMember); - - $isMember = $this->gdata->isMember('foo_' . $this->id, $generatedGroupName); - - $this->assertFalse($isMember); - - } - - // Test the convenience isOwner method - public function testIsOwner() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testIsMember()'); - $this->autoDelete($group); - - // Create a user for the group - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addOwnerToGroup($this->id, $generatedGroupName); - - $isOwner = $this->gdata->isOwner($this->id, $generatedGroupName); - - $this->assertTrue($isOwner); - - $isOwner = $this->gdata->isOwner('foo_' . $this->id, $generatedGroupName); - - $this->assertFalse($isOwner); - - } - - // Test the convenience updateGroup method - public function testCanUpdateGroup() { - // Create a group - $generatedGroupName = strtolower(uniqid('zf-list-')); - $group = $this->gdata->createGroup($generatedGroupName, 'Test Group', - 'testCanUpdateGroup()'); - $this->autoDelete($group); - - //set new value and save it - - $group = $this->gdata->updateGroup($generatedGroupName, null, 'new description here'); - - //verify new value - $description = null; - - $properties = $group->getProperty(); - foreach ($properties as $property) { - if($property->name == 'description') { - $description = $property->value; - } - } - - $this->assertEquals('new description here', $description); - - } - - public function testEmailListCRUDOperations() { - // Create email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - $this->assertEquals($generatedListName, $list->emailList->name); - - // Retrieve email list - $query = $this->gdata->newEmailListQuery(); - $listFeed = $this->gdata->getEmailListFeed($query); - $entryCount = count($listFeed->entry); - $this->assertTrue($entryCount > 0); - - // Delete email list (uses builtin delete method, convenience delete - // method tested further down) - $list->delete(); - - // Ensure that nickname was deleted - $listFeed = $this->gdata->getEmailListFeed($query); - $this->assertEquals($entryCount - 1, count($listFeed->entry)); - } - - public function testCanAssignMultipleEmailListsToOneUser() { - // Create a user - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - - // Create two email lists - $listCount = 2; - - for ($i = 0; $i < $listCount; $i++) { - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - $this->gdata->addRecipientToEmailList($this->id, $generatedListName); - } - - // Make sure that the user is subscribed to both lists - $subscriptions = $this->gdata->retrieveEmailLists($this->id); - $this->assertEquals($listCount, count($subscriptions->entry)); - } - - public function testCanRetrievePageOfEmailLists() { - // Create an email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - - // Try retrieving the email list feed - $feed = $this->gdata->retrievePageOfEmailLists(); - $this->assertTrue(count($feed->entry) > 0); - } - - public function testCanRetrieveAllEmailLists() { - // Create a couple of users to make sure we don't hit the limit - // on the max number of email lists. - for ($i = 0; $i < 3; $i++) { - $user = $this->gdata->createUser(uniqid('ZF-'), self::GIVEN_NAME, self::FAMILY_NAME, - sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - } - - // Create a whole bunch of email lists to make sure we trigger - // paging. - for ($i = 0; $i < 30; $i++) { - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - } - - // Try retrieving the email list feed - $feed = $this->gdata->retrieveAllEmailLists(); - $this->assertTrue(count($feed->entry) >= 30); - } - - // Test the convenience delete method for email lists - public function testCanDeleteEmailList() { - // Create an email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - - // Assert that the email list exists, just in case... - $query = $this->gdata->newEmailListQuery(); - $query->setEmailListName($generatedListName); - $entry = $this->gdata->getEmailListEntry($query); - $this->assertNotNull($entry); - - // Delete nickname - $this->gdata->deleteEmailList($generatedListName); - - // Ensure that nickname was deleted - try { - $query = $this->gdata->newEmailListQuery(); - $query->setEmailListName($generatedListName); - $entry = $this->gdata->getEmailListEntry($query); - // This souldn't execute - $this->fail('Retrieving a non-existant email list entry didn\'t' . - 'raise exception.'); - } catch (Zend_Gdata_Gapps_ServiceException $e) { - if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { - // Dummy assertion just to say we tested something here. - $this->assertTrue(true); - } else { - // Exception thrown for an unexpected reason - throw $e; - } - } - } - - public function testCanRetrievePageOfRecipients() { - // Create a new email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - - // Create two users and assign them to the email list - $userCount = 2; - for ($i = 0; $i < $userCount; $i++) { - $generatedUsername = uniqid('ZF-'); - $user = $this->gdata->createUser($generatedUsername, - self::GIVEN_NAME, self::FAMILY_NAME, sha1(self::PASSWORD), - self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addRecipientToEmailList($generatedUsername, - $generatedListName); - } - - // Retrieve recipients - $recipientFeed = - $this->gdata->retrievePageOfRecipients($generatedListName); - $this->assertTrue(count($recipientFeed->entry) == $userCount); - } - - public function testCanRetrievAllRecipients() { - // Create a new email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - - // Create enough users to trigger paging and assign them to the email - // list - $userCount = 30; - for ($i = 0; $i < $userCount; $i++) { - $generatedUsername = uniqid('ZF-'); - $user = $this->gdata->createUser($generatedUsername, - self::GIVEN_NAME, self::FAMILY_NAME, sha1(self::PASSWORD), - self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addRecipientToEmailList($generatedUsername, - $generatedListName); - } - - // Retrieve recipients - $recipientFeed = - $this->gdata->retrieveAllRecipients($generatedListName); - $this->assertTrue(count($recipientFeed->entry) == $userCount); - } - - // Test the convenience delete method for email list recipients - public function testCanDeleteEmailListRecipient() { - // Create an email list - $generatedListName = strtolower(uniqid('zf-list-')); - $list = $this->gdata->createEmailList($generatedListName); - $this->autoDelete($list); - - // Create a user for the email list - $user = $this->gdata->createUser($this->id, self::GIVEN_NAME, - self::FAMILY_NAME, sha1(self::PASSWORD), self::PASSWORD_HASH); - $this->autoDelete($user); - $this->gdata->addRecipientToEmailList($this->id, $generatedListName); - - // Assert that the recipient exists, just in case... - $recipients = - $this->gdata->retrieveAllRecipients($generatedListName); - $this->assertTrue(count($recipients->entry) == 1); - - // Remove the user from the list - $this->gdata->removeRecipientFromEmailList($user->login->username, - $generatedListName); - - // Ensure that user was deleted - $recipients = - $this->gdata->retrieveAllRecipients($generatedListName); - $this->assertTrue(count($recipients->entry) == 0); - } - -} diff --git a/tests/Zend/Gdata/GappsTest.php b/tests/Zend/Gdata/GappsTest.php deleted file mode 100644 index 19b9cb152c..0000000000 --- a/tests/Zend/Gdata/GappsTest.php +++ /dev/null @@ -1,79 +0,0 @@ -gdata = new Zend_Gdata_Gapps(null, self::TEST_DOMAIN); - } - - public function testMagicFactoryProvidesQueriesWithDomains() { - $userQ = $this->gdata->newUserQuery(); - $this->assertTrue($userQ instanceof Zend_Gdata_Gapps_UserQuery); - $this->assertEquals(self::TEST_DOMAIN, $userQ->getDomain()); - $this->assertEquals(null, $userQ->getUsername()); - - $userQ = $this->gdata->newUserQuery('foo'); - $this->assertTrue($userQ instanceof Zend_Gdata_Gapps_UserQuery); - $this->assertEquals(self::TEST_DOMAIN, $userQ->getDomain()); - $this->assertEquals('foo', $userQ->getUsername()); - } - - public function testMagicFactoryLeavesNonQueriesAlone() { - $login = $this->gdata->newLogin('blah'); - $this->assertTrue($login instanceof Zend_Gdata_Gapps_Extension_Login); - $this->assertEquals('blah', $login->username); - } - - public function testEmptyResponseExceptionRaisesException() { - require_once('Zend/Gdata/App/HttpException.php'); - $e = new Zend_Gdata_App_HttpException(); - $e->setResponse(null); - $success = false; - try { - $this->gdata->throwServiceExceptionIfDetected($e); - } catch (Zend_Gdata_App_IOException $f) { - $success = true; - } - $this->assertTrue($success, 'Zend_Gdata_App_IOException not thrown'); - } - -} diff --git a/tests/Zend/Gdata/GdataOnlineTest.php b/tests/Zend/Gdata/GdataOnlineTest.php deleted file mode 100644 index e64c1bfa7c..0000000000 --- a/tests/Zend/Gdata/GdataOnlineTest.php +++ /dev/null @@ -1,341 +0,0 @@ -blog = constant('TESTS_ZEND_GDATA_BLOG_ID'); - $service = 'blogger'; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $this->gdata = new Zend_Gdata($client); - $this->gdata->setMajorProtocolVersion(2); - } - - public function testPostAndDeleteByEntry() - { - $postUrl = 'http://www.blogger.com/feeds/' . $this->blog . - '/posts/default'; - $entry = $this->gdata->newEntry(); - $entry->title = $this->gdata->newTitle('PHP test blog post'); - $entry->content = $this->gdata->newContent('Blog post content...'); - $insertedEntry = $this->gdata->insertEntry($entry, $postUrl); - $this->assertEquals('PHP test blog post', $insertedEntry->title->text); - $this->assertEquals('Blog post content...', - $insertedEntry->content->text); - $this->assertTrue( - strpos($insertedEntry->getEditLink()->href, 'http') === 0); - $this->gdata->delete($insertedEntry); - } - - public function testPostAndDeleteByUrl() - { - $postUrl = 'http://www.blogger.com/feeds/' . $this->blog . - '/posts/default'; - $entry = $this->gdata->newEntry(); - $entry->title = $this->gdata->newTitle('PHP test blog post'); - $entry->content = $this->gdata->newContent('Blog post content...'); - $insertedEntry = $this->gdata->insertEntry($entry, $postUrl); - $this->assertTrue( - strpos($insertedEntry->getEditLink()->href, 'http') === 0); - $this->gdata->delete($insertedEntry->getEditLink()->href); - } - - public function testPostRetrieveEntryAndDelete() - { - $postUrl = 'http://www.blogger.com/feeds/' . $this->blog . - '/posts/default'; - $entry = $this->gdata->newEntry(); - $entry->title = $this->gdata->newTitle(' PHP test blog post '); - $this->assertTrue(isset($entry->title)); - $entry->content = $this->gdata->newContent('Blog post content...'); - - /* testing getText and __toString */ - $this->assertEquals("PHP test blog post", - $entry->title->getText()); - $this->assertEquals(" PHP test blog post ", - $entry->title->getText(false)); - $this->assertEquals($entry->title->getText(), - $entry->title->__toString()); - - $insertedEntry = $this->gdata->insertEntry($entry, $postUrl); - $retrievedEntryQuery = $this->gdata->newQuery( - $insertedEntry->getSelfLink()->href); - $retrievedEntry = $this->gdata->getEntry($retrievedEntryQuery); - $this->assertTrue( - strpos($retrievedEntry->getEditLink()->href, 'http') === 0); - $this->gdata->delete($retrievedEntry); - } - - public function testPostUpdateAndDeleteEntry() - { - $postUrl = 'http://www.blogger.com/feeds/' . $this->blog . - '/posts/default'; - $entry = $this->gdata->newEntry(); - $entry->title = $this->gdata->newTitle('PHP test blog post'); - $entry->content = $this->gdata->newContent('Blog post content...'); - $insertedEntry = $this->gdata->insertEntry($entry, $postUrl); - $this->assertTrue( - strpos($insertedEntry->getEditLink()->href, 'http') === 0); - $insertedEntry->title->text = 'PHP test blog post modified'; - $updatedEntry = $this->gdata->updateEntry($insertedEntry); - $this->assertEquals('PHP test blog post modified', - $updatedEntry->title->text); - $updatedEntry->title->text = 'PHP test blog post modified twice'; - // entry->saveXML() and entry->getXML() should be the same - $this->assertEquals($updatedEntry->saveXML(), - $updatedEntry->getXML()); - $newlyUpdatedEntry = $this->gdata->updateEntry($updatedEntry); - $this->assertEquals('PHP test blog post modified twice', - $updatedEntry->title->text); - $updatedEntry->delete(); - } - - public function testFeedImplementation() - { - $blogsUrl = 'http://www.blogger.com/feeds/default/blogs'; - $blogsQuery = $this->gdata->newQuery($blogsUrl); - $retrievedFeed = $this->gdata->getFeed($blogsQuery); - // rewind the retrieved feed first - $retrievedFeed->rewind(); - - // Make sure the iterator and array impls match - $entry1 = $retrievedFeed->current(); - $entry2 = $retrievedFeed[0]; - $this->assertEquals($entry1, $entry2); - - /* - TODO: Fix these tests - // Test ArrayAccess interface - $firstBlogTitle = $retrievedFeed[0]->title->text; - $entries = $retrievedFeed->entry; - $entries[0]->title->text = $firstBlogTitle . "**"; - $retrievedFeed[0] = $entries[0]; - $this->assertEquals($retrievedFeed->entry[0]->title->text, - $retrievedFeed[0]->title->text); - $this->assertEquals($firstBlogTitle . "**", - $retrievedFeed[0]->title->text); - */ - } - - public function testBadFeedRetrieval() - { - $feed = $this->gdata->newFeed(); - try { - $returnedFeed = $this->gdata->getFeed($feed); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - // we're expecting to cause an exception here - } - } - - public function testBadEntryRetrieval() - { - $entry = $this->gdata->newEntry(); - try { - $returnedEntry = $this->gdata->getEntry($entry); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - // we're expecting to cause an exception here - } - } - - public function testMediaUpload() - { - // the standard sevice for Gdata testing is Blogger, due to the strong - // match to the standard Gdata/APP protocol. However, Blogger doesn't - // currently support media uploads, so we're using Picasa Web Albums - // for this test instead - $user = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_EMAIL'); - $pass = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_PASSWORD'); - $this->blog = constant('TESTS_ZEND_GDATA_BLOG_ID'); - $service = 'lh2'; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $gd = new Zend_Gdata($client); - - // setup the photo content - $fs = $gd->newMediaFileSource('Zend/Gdata/_files/testImage.jpg'); - $fs->setContentType('image/jpeg'); - - - // create a new picasa album - $albumEntry = $gd->newEntry(); - $albumEntry->setTitle($gd->newTitle('My New Test Album')); - $albumEntry->setCategory(array($gd->newCategory( - 'http://schemas.google.com/photos/2007#album', - 'http://schemas.google.com/g/2005#kind' - ))); - $createdAlbumEntry = $gd->insertEntry($albumEntry, - 'http://picasaweb.google.com/data/feed/api/user/default'); - $this->assertEquals('My New Test Album', - $createdAlbumEntry->title->text); - $albumUrl = $createdAlbumEntry->getLink('http://schemas.google.com/g/2005#feed')->href; - - // post the photo to the new album, without any metadata - // other than the slug - // add a slug header to the media file source - $fs->setSlug('Going to the park'); - $createdPhotoBinaryOnly = $gd->insertEntry($fs, $albumUrl); - $this->assertEquals('Going to the park', - $createdPhotoBinaryOnly->title->text); - - // post the photo to the new album along with the entry - // remove slug header from the media file source - $fs->setSlug(null); - - // setup an entry with metadata - $mediaEntry = $gd->newMediaEntry(); - $mediaEntry->setMediaSource($fs); - - $mediaEntry->setTitle($gd->newTitle('My New Test Photo')); - $mediaEntry->setSummary($gd->newSummary('My New Test Photo Summary')); - $mediaEntry->setCategory(array($gd->newCategory( - 'http://schemas.google.com/photos/2007#photo ', - 'http://schemas.google.com/g/2005#kind' - ))); - $createdPhotoMultipart = $gd->insertEntry($mediaEntry, $albumUrl); - $this->assertEquals('My New Test Photo', - $createdPhotoMultipart->title->text); - - // cleanup and remove the album - // first we wait 5 seconds - sleep(5); - try { - $albumEntry->delete(); - } catch (Zend_Gdata_App_Exception $e) { - $this->fail('Tried to delete the test album, got exception: ' . - $e->getMessage()); - } - } - - function testIsAuthenticated() - { - $this->assertTrue($this->gdata->isAuthenticated()); - } - - function testRetrieveNextAndPreviousFeedsFromService() - { - $user = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_EMAIL'); - $pass = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_PASSWORD'); - $this->blog = constant('TESTS_ZEND_GDATA_BLOG_ID'); - $service = 'youtube'; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $gd = new Zend_Gdata($client); - - $feed = $gd->getFeed( - 'http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured', - 'Zend_Gdata_App_Feed'); - - $this->assertNotNull($feed); - $this->assertTrue($feed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($feed->count(), 25); - - $nextFeed = $gd->getNextFeed($feed); - - $this->assertNotNull($nextFeed); - $this->assertTrue($nextFeed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($nextFeed->count(), 25); - - $previousFeed = $gd->getPreviousFeed($nextFeed); - - $this->assertNotNull($previousFeed); - $this->assertTrue($previousFeed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($previousFeed->count(), 25); - - } - - function testRetrieveNextFeedAndPreviousFeedsFromFeed() - { - $user = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_EMAIL'); - $pass = constant('TESTS_ZEND_GDATA_CLIENTLOGIN_PASSWORD'); - $this->blog = constant('TESTS_ZEND_GDATA_BLOG_ID'); - $service = 'youtube'; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $gd = new Zend_Gdata($client); - - $feed = $gd->getFeed( - 'http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured', - 'Zend_Gdata_App_Feed'); - - $nextFeed = $feed->getNextFeed(); - - $this->assertNotNull($nextFeed); - $this->assertTrue($nextFeed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($nextFeed->count(), 25); - - $previousFeed = $nextFeed->getPreviousFeed(); - - $this->assertNotNull($previousFeed); - $this->assertTrue($previousFeed instanceof Zend_Gdata_App_Feed); - $this->assertEquals($previousFeed->count(), 25); - - } - - public function testDisableXMLToObjectMappingReturnsStringForFeed() - { - $gdata = new Zend_Gdata(); - $gdata->useObjectMapping(false); - $xmlString = $gdata->getFeed( - 'http://gdata.youtube.com/feeds/api/standardfeeds/top_rated'); - $this->assertEquals('string', gettype($xmlString)); - } - - public function testDisableXMLToObjectMappingReturnsStringForEntry() - { - $gdata = new Zend_Gdata(); - $gdata->useObjectMapping(false); - $xmlString = $gdata->getFeed( - 'http://gdata.youtube.com/feeds/api/videos/O4SWAfisH-8'); - $this->assertEquals('string', gettype($xmlString)); - } - - public function testDisableAndReEnableXMLToObjectMappingReturnsObject() - { - $gdata = new Zend_Gdata(); - $gdata->useObjectMapping(false); - $xmlString = $gdata->getEntry( - 'http://gdata.youtube.com/feeds/api/videos/O4SWAfisH-8'); - $this->assertEquals('string', gettype($xmlString)); - $gdata->useObjectMapping(true); - $entry = $gdata->getEntry( - 'http://gdata.youtube.com/feeds/api/videos/O4SWAfisH-8'); - $this->assertTrue($entry instanceof Zend_Gdata_Entry); - } - -} diff --git a/tests/Zend/Gdata/GdataTest.php b/tests/Zend/Gdata/GdataTest.php deleted file mode 100644 index dcaac7b700..0000000000 --- a/tests/Zend/Gdata/GdataTest.php +++ /dev/null @@ -1,102 +0,0 @@ -getHttpClient(); - $this->assertTrue($client instanceof Zend_Http_Client, - 'Expecting object of type Zend_Http_Client, got ' - . (gettype($client) == 'object' ? get_class($client) : gettype($client)) - ); - } - - public function testSpecificHttpClient() - { - $client = new Zend_Http_Client(); - $gdata = new Zend_Gdata($client); - $client2 = $gdata->getHttpClient(); - $this->assertTrue($client2 instanceof Zend_Http_Client, - 'Expecting object of type Zend_Http_Client, got ' - . (gettype($client) == 'object' ? get_class($client) : gettype($client)) - ); - $this->assertSame($client, $client2); - } - - public function testExceptionNotHttpClient() - { - $obj = new ArrayObject(); - try { - $gdata = new Zend_Gdata($obj); - $this->fail('Expecting to catch Zend_Gdata_App_HttpException'); - } catch (Exception $e) { - $this->assertThat($e, $this->isInstanceOf('Zend_Gdata_App_HttpException'), - 'Expecting Zend_Gdata_App_HttpException, got '.get_class($e)); - $this->assertEquals('Argument is not an instance of Zend_Http_Client.', $e->getMessage()); - } - } - - public function testGetFeedExceptionInvalidLocationType() - { - $gdata = new Zend_Gdata(); - try { - // give it neither a string nor a Zend_Gdata_Query object, - // and see if it throws an exception. - $feed = $gdata->getFeed(new stdClass()); - $this->fail('Expecting to catch Zend_Gdata_App_InvalidArgumentException'); - } catch (Zend_Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException, - 'Expecting Zend_Gdata_App_InvalidArgumentException, got '.get_class($e)); - $this->assertEquals('You must specify the location as either a string URI or a child of Zend_Gdata_Query', $e->getMessage()); - } - } - - public function testGetEntryExceptionInvalidLocationType() - { - $gdata = new Zend_Gdata(); - try { - // give it neither a string nor a Zend_Gdata_Query object, - // and see if it throws an exception. - $feed = $gdata->getEntry(new stdClass()); - $this->fail('Expecting to catch Zend_Gdata_App_InvalidArgumentException'); - } catch (Zend_Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException, - 'Expecting Zend_Gdata_App_InvalidArgumentException, got '.get_class($e)); - $this->assertEquals('You must specify the location as either a string URI or a child of Zend_Gdata_Query', $e->getMessage()); - } - } - -} diff --git a/tests/Zend/Gdata/MediaMimeStreamTest.php b/tests/Zend/Gdata/MediaMimeStreamTest.php deleted file mode 100644 index 2b3d702faa..0000000000 --- a/tests/Zend/Gdata/MediaMimeStreamTest.php +++ /dev/null @@ -1,186 +0,0 @@ -locationOfFakeBinary = - 'Zend/Gdata/_files/MediaMimeStreamSample1.txt'; - $this->smallXMLString = 'foo'; - $this->testMediaType = 'video/mpeg'; - $this->mediaMimeStream = new Zend_Gdata_MediaMimeStream( - $this->smallXMLString, $this->locationOfFakeBinary, - $this->testMediaType); - $this->exceptedLenOfMimeMessage = 283; - } - - public function testExceptionOnUnreadableFile() - { - $exceptionThrown = false; - try { - $mediaMimeStream = new Zend_Gdata_MediaMimeStream( - $this->smallXMLString, '/non/existant/path/to/nowhere'); - } catch (Zend_Gdata_App_IOException $e) { - $exceptionThrown = true; - } - $this->assertTrue($exceptionThrown, 'Was expecting an exception on ' . - 'attempting to read an unreadable or non-existant file'); - } - - public function testGetTotalSize() - { - $this->assertEquals($this->exceptedLenOfMimeMessage, - $this->mediaMimeStream->getTotalSize()); - } - - public function testHasData() - { - $this->assertTrue($this->mediaMimeStream->hasData()); - } - - public function testGetContentType() - { - $pattern = - '/multipart\/related;\sboundary=\"=_[a-z0-9]{32,}.*\"/'; - $this->assertEquals(1, preg_match($pattern, - $this->mediaMimeStream->getContentType())); - } - - /** - * Ensure that nothing breaks if we read past the end of the messsage in a - * single read. - * - * Note: The test message has the following part sizes in length: - * 211, 22, 39 for a total size of 272. This test performs a single read - * for 400 bytes. - */ - public function testReadAll() - { - $this->assertEquals($this->exceptedLenOfMimeMessage, - $this->mediaMimeStream->getTotalSize()); - $outputArray = array(); - while ($this->mediaMimeStream->hasData()) { - $outputArray = explode("\r\n", $this->mediaMimeStream->read(400)); - } - $mimeBoundaryPattern = '/--=_[a-z0-9]{32,}/'; - $mimeClosingBoundaryPattern = '/--=_[a-z0-9]{32,}--/'; - $this->assertEquals('', $outputArray[0]); - $this->assertEquals(1, - preg_match($mimeBoundaryPattern, $outputArray[1])); - $this->assertEquals('Content-Type: application/atom+xml', - $outputArray[2]); - $this->assertEquals('', $outputArray[3]); - $this->assertEquals($this->smallXMLString, $outputArray[4]); - $this->assertEquals('', $outputArray[5]); - $this->assertEquals(1, - preg_match($mimeBoundaryPattern, $outputArray[6])); - $this->assertEquals('Content-Type: video/mpeg', $outputArray[7]); - $this->assertEquals('Content-Transfer-Encoding: binary', - $outputArray[8]); - $this->assertEquals('', $outputArray[9]); - $this->assertEquals(file_get_contents($this->locationOfFakeBinary), - $outputArray[10]); - $this->assertEquals(1, - preg_match($mimeClosingBoundaryPattern, $outputArray[11])); - } - - /** - * Ensure that a variety of different stream sizes work. - * - * Note: The test message has the following part sizes in length: - * 211, 22, 39 for a total size of 287. - */ - public function testReadVariousBufferSizes() - { - $bufferSizesToTest = array(2, 20, 33, 44, 88, 100, 201); - foreach($bufferSizesToTest as $sizeToTest) { - $mediaMimeStream = new Zend_Gdata_MediaMimeStream( - $this->smallXMLString, $this->locationOfFakeBinary, - $this->testMediaType); - $this->assertEquals($sizeToTest, - strlen($mediaMimeStream->read($sizeToTest))); - } - } - - /** - * Ensure that nothing breaks if we read a message 1 byte at time. - */ - public function testReadWithoutCrossingSections() - { - $outputString = ''; - while ($this->mediaMimeStream->hasData()) { - $outputString .= $this->mediaMimeStream->read(1); - } - $this->assertEquals($this->exceptedLenOfMimeMessage, - strlen($outputString)); - } - - /** - * Ensure that nothing breaks if we read past at least two sections of - * the message. - * - * Note: The test message has the following part sizes in length: - * 211, 22, 39 for a total size of 272. This test reads 250 bytes at a time - * to make sure that we cross sections 1 and 2 and then read part of - * section 3. - */ - public function testReadCrossing2Sections() - { - $outputString = ''; - while ($this->mediaMimeStream->hasData()) { - $outputString .= $this->mediaMimeStream->read(250); - } - $this->assertEquals($this->exceptedLenOfMimeMessage, - strlen($outputString)); - } - - /** - * Ensure that nothing breaks if we read past at least one section of - * the message. - * - * Note: The test message has the following part sizes in length: - * 211, 22, 39 for a total size of 272. This test reads 230 bytes at a time - * to make sure that we cross section 1 and then read sections 2 and 3. - */ - public function testReadCrossing1Section() - { - $outputString = ''; - while ($this->mediaMimeStream->hasData()) { - $outputString .= $this->mediaMimeStream->read(230); - } - $this->assertEquals($this->exceptedLenOfMimeMessage, - strlen($outputString)); - } - -} diff --git a/tests/Zend/Gdata/OpenSearchItemsPerPageTest.php b/tests/Zend/Gdata/OpenSearchItemsPerPageTest.php deleted file mode 100644 index 7207efe868..0000000000 --- a/tests/Zend/Gdata/OpenSearchItemsPerPageTest.php +++ /dev/null @@ -1,126 +0,0 @@ -openSearchItemsPerPageText = file_get_contents( - 'Zend/Gdata/_files/OpenSearchItemsPerPageElementSample1.xml', - true); - $this->openSearchItemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); - } - - public function testEmptyOpenSearchItemsPerPageShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->openSearchItemsPerPage->extensionElements)); - $this->assertTrue(count($this->openSearchItemsPerPage->extensionElements) == 0); - } - - public function testEmptyOpenSearchItemsPerPageShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->openSearchItemsPerPage->extensionAttributes)); - $this->assertTrue(count($this->openSearchItemsPerPage->extensionAttributes) == 0); - } - - public function testSampleOpenSearchItemsPerPageShouldHaveNoExtensionElements() { - $this->openSearchItemsPerPage->transferFromXML($this->openSearchItemsPerPageText); - $this->assertTrue(is_array($this->openSearchItemsPerPage->extensionElements)); - $this->assertTrue(count($this->openSearchItemsPerPage->extensionElements) == 0); - } - - public function testSampleOpenSearchItemsPerPageShouldHaveNoExtensionAttributes() { - $this->openSearchItemsPerPage->transferFromXML($this->openSearchItemsPerPageText); - $this->assertTrue(is_array($this->openSearchItemsPerPage->extensionAttributes)); - $this->assertTrue(count($this->openSearchItemsPerPage->extensionAttributes) == 0); - } - - public function testNormalOpenSearchItemsPerPageShouldHaveNoExtensionElements() { - $this->openSearchItemsPerPage->text = "200"; - - $this->assertEquals("200", $this->openSearchItemsPerPage->text); - - $this->assertEquals(0, count($this->openSearchItemsPerPage->extensionElements)); - $newOpenSearchItemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); - $newOpenSearchItemsPerPage->transferFromXML($this->openSearchItemsPerPage->saveXML()); - $this->assertEquals(0, count($newOpenSearchItemsPerPage->extensionElements)); - $newOpenSearchItemsPerPage->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newOpenSearchItemsPerPage->extensionElements)); - $this->assertEquals("200", $newOpenSearchItemsPerPage->text); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newOpenSearchItemsPerPage2 = $gdata->newOpenSearchItemsPerPage(); - $newOpenSearchItemsPerPage2->transferFromXML($newOpenSearchItemsPerPage->saveXML()); - $this->assertEquals(1, count($newOpenSearchItemsPerPage2->extensionElements)); - $this->assertEquals("200", $newOpenSearchItemsPerPage2->text); - } - - public function testEmptyOpenSearchItemsPerPageToAndFromStringShouldMatch() { - $openSearchItemsPerPageXml = $this->openSearchItemsPerPage->saveXML(); - $newOpenSearchItemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); - $newOpenSearchItemsPerPage->transferFromXML($openSearchItemsPerPageXml); - $newOpenSearchItemsPerPageXml = $newOpenSearchItemsPerPage->saveXML(); - $this->assertTrue($openSearchItemsPerPageXml == $newOpenSearchItemsPerPageXml); - } - - public function testOpenSearchItemsPerPageWithValueToAndFromStringShouldMatch() { - $this->openSearchItemsPerPage->text = "200"; - $openSearchItemsPerPageXml = $this->openSearchItemsPerPage->saveXML(); - $newOpenSearchItemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); - $newOpenSearchItemsPerPage->transferFromXML($openSearchItemsPerPageXml); - $newOpenSearchItemsPerPageXml = $newOpenSearchItemsPerPage->saveXML(); - $this->assertTrue($openSearchItemsPerPageXml == $newOpenSearchItemsPerPageXml); - $this->assertEquals("200", $this->openSearchItemsPerPage->text); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->openSearchItemsPerPage->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->openSearchItemsPerPage->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->openSearchItemsPerPage->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->openSearchItemsPerPage->extensionAttributes['foo2']['value']); - $openSearchItemsPerPageXml = $this->openSearchItemsPerPage->saveXML(); - $newOpenSearchItemsPerPage = new Zend_Gdata_Extension_OpenSearchItemsPerPage(); - $newOpenSearchItemsPerPage->transferFromXML($openSearchItemsPerPageXml); - $this->assertEquals('bar', $newOpenSearchItemsPerPage->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newOpenSearchItemsPerPage->extensionAttributes['foo2']['value']); - } - - public function testConvertFullOpenSearchItemsPerPageToAndFromString() { - $this->openSearchItemsPerPage->transferFromXML($this->openSearchItemsPerPageText); - $this->assertEquals("25", $this->openSearchItemsPerPage->text); - } - -} diff --git a/tests/Zend/Gdata/OpenSearchStartIndexTest.php b/tests/Zend/Gdata/OpenSearchStartIndexTest.php deleted file mode 100644 index 32f6ca6f2b..0000000000 --- a/tests/Zend/Gdata/OpenSearchStartIndexTest.php +++ /dev/null @@ -1,126 +0,0 @@ -openSearchStartIndexText = file_get_contents( - 'Zend/Gdata/_files/OpenSearchStartIndexElementSample1.xml', - true); - $this->openSearchStartIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); - } - - public function testEmptyOpenSearchStartIndexShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->openSearchStartIndex->extensionElements)); - $this->assertTrue(count($this->openSearchStartIndex->extensionElements) == 0); - } - - public function testEmptyOpenSearchStartIndexShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->openSearchStartIndex->extensionAttributes)); - $this->assertTrue(count($this->openSearchStartIndex->extensionAttributes) == 0); - } - - public function testSampleOpenSearchStartIndexShouldHaveNoExtensionElements() { - $this->openSearchStartIndex->transferFromXML($this->openSearchStartIndexText); - $this->assertTrue(is_array($this->openSearchStartIndex->extensionElements)); - $this->assertTrue(count($this->openSearchStartIndex->extensionElements) == 0); - } - - public function testSampleOpenSearchStartIndexShouldHaveNoExtensionAttributes() { - $this->openSearchStartIndex->transferFromXML($this->openSearchStartIndexText); - $this->assertTrue(is_array($this->openSearchStartIndex->extensionAttributes)); - $this->assertTrue(count($this->openSearchStartIndex->extensionAttributes) == 0); - } - - public function testNormalOpenSearchStartIndexShouldHaveNoExtensionElements() { - $this->openSearchStartIndex->text = "20"; - - $this->assertEquals("20", $this->openSearchStartIndex->text); - - $this->assertEquals(0, count($this->openSearchStartIndex->extensionElements)); - $newOpenSearchStartIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); - $newOpenSearchStartIndex->transferFromXML($this->openSearchStartIndex->saveXML()); - $this->assertEquals(0, count($newOpenSearchStartIndex->extensionElements)); - $newOpenSearchStartIndex->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newOpenSearchStartIndex->extensionElements)); - $this->assertEquals("20", $newOpenSearchStartIndex->text); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newOpenSearchStartIndex2 = $gdata->newOpenSearchStartIndex(); - $newOpenSearchStartIndex2->transferFromXML($newOpenSearchStartIndex->saveXML()); - $this->assertEquals(1, count($newOpenSearchStartIndex2->extensionElements)); - $this->assertEquals("20", $newOpenSearchStartIndex2->text); - } - - public function testEmptyOpenSearchStartIndexToAndFromStringShouldMatch() { - $openSearchStartIndexXml = $this->openSearchStartIndex->saveXML(); - $newOpenSearchStartIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); - $newOpenSearchStartIndex->transferFromXML($openSearchStartIndexXml); - $newOpenSearchStartIndexXml = $newOpenSearchStartIndex->saveXML(); - $this->assertTrue($openSearchStartIndexXml == $newOpenSearchStartIndexXml); - } - - public function testOpenSearchStartIndexWithValueToAndFromStringShouldMatch() { - $this->openSearchStartIndex->text = "20"; - $openSearchStartIndexXml = $this->openSearchStartIndex->saveXML(); - $newOpenSearchStartIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); - $newOpenSearchStartIndex->transferFromXML($openSearchStartIndexXml); - $newOpenSearchStartIndexXml = $newOpenSearchStartIndex->saveXML(); - $this->assertTrue($openSearchStartIndexXml == $newOpenSearchStartIndexXml); - $this->assertEquals("20", $this->openSearchStartIndex->text); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->openSearchStartIndex->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->openSearchStartIndex->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->openSearchStartIndex->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->openSearchStartIndex->extensionAttributes['foo2']['value']); - $openSearchStartIndexXml = $this->openSearchStartIndex->saveXML(); - $newOpenSearchStartIndex = new Zend_Gdata_Extension_OpenSearchStartIndex(); - $newOpenSearchStartIndex->transferFromXML($openSearchStartIndexXml); - $this->assertEquals('bar', $newOpenSearchStartIndex->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newOpenSearchStartIndex->extensionAttributes['foo2']['value']); - } - - public function testConvertFullOpenSearchStartIndexToAndFromString() { - $this->openSearchStartIndex->transferFromXML($this->openSearchStartIndexText); - $this->assertEquals("5", $this->openSearchStartIndex->text); - } - -} diff --git a/tests/Zend/Gdata/OpenSearchTotalResultsTest.php b/tests/Zend/Gdata/OpenSearchTotalResultsTest.php deleted file mode 100644 index c762b86447..0000000000 --- a/tests/Zend/Gdata/OpenSearchTotalResultsTest.php +++ /dev/null @@ -1,126 +0,0 @@ -openSearchTotalResultsText = file_get_contents( - 'Zend/Gdata/_files/OpenSearchTotalResultsElementSample1.xml', - true); - $this->openSearchTotalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); - } - - public function testEmptyOpenSearchTotalResultsShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->openSearchTotalResults->extensionElements)); - $this->assertTrue(count($this->openSearchTotalResults->extensionElements) == 0); - } - - public function testEmptyOpenSearchTotalResultsShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->openSearchTotalResults->extensionAttributes)); - $this->assertTrue(count($this->openSearchTotalResults->extensionAttributes) == 0); - } - - public function testSampleOpenSearchTotalResultsShouldHaveNoExtensionElements() { - $this->openSearchTotalResults->transferFromXML($this->openSearchTotalResultsText); - $this->assertTrue(is_array($this->openSearchTotalResults->extensionElements)); - $this->assertTrue(count($this->openSearchTotalResults->extensionElements) == 0); - } - - public function testSampleOpenSearchTotalResultsShouldHaveNoExtensionAttributes() { - $this->openSearchTotalResults->transferFromXML($this->openSearchTotalResultsText); - $this->assertTrue(is_array($this->openSearchTotalResults->extensionAttributes)); - $this->assertTrue(count($this->openSearchTotalResults->extensionAttributes) == 0); - } - - public function testNormalOpenSearchTotalResultsShouldHaveNoExtensionElements() { - $this->openSearchTotalResults->text = "42"; - - $this->assertEquals("42", $this->openSearchTotalResults->text); - - $this->assertEquals(0, count($this->openSearchTotalResults->extensionElements)); - $newOpenSearchTotalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); - $newOpenSearchTotalResults->transferFromXML($this->openSearchTotalResults->saveXML()); - $this->assertEquals(0, count($newOpenSearchTotalResults->extensionElements)); - $newOpenSearchTotalResults->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newOpenSearchTotalResults->extensionElements)); - $this->assertEquals("42", $newOpenSearchTotalResults->text); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newOpenSearchTotalResults2 = $gdata->newOpenSearchTotalResults(); - $newOpenSearchTotalResults2->transferFromXML($newOpenSearchTotalResults->saveXML()); - $this->assertEquals(1, count($newOpenSearchTotalResults2->extensionElements)); - $this->assertEquals("42", $newOpenSearchTotalResults2->text); - } - - public function testEmptyOpenSearchTotalResultsToAndFromStringShouldMatch() { - $openSearchTotalResultsXml = $this->openSearchTotalResults->saveXML(); - $newOpenSearchTotalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); - $newOpenSearchTotalResults->transferFromXML($openSearchTotalResultsXml); - $newOpenSearchTotalResultsXml = $newOpenSearchTotalResults->saveXML(); - $this->assertTrue($openSearchTotalResultsXml == $newOpenSearchTotalResultsXml); - } - - public function testOpenSearchTotalResultsWithValueToAndFromStringShouldMatch() { - $this->openSearchTotalResults->text = "42"; - $openSearchTotalResultsXml = $this->openSearchTotalResults->saveXML(); - $newOpenSearchTotalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); - $newOpenSearchTotalResults->transferFromXML($openSearchTotalResultsXml); - $newOpenSearchTotalResultsXml = $newOpenSearchTotalResults->saveXML(); - $this->assertTrue($openSearchTotalResultsXml == $newOpenSearchTotalResultsXml); - $this->assertEquals("42", $this->openSearchTotalResults->text); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->openSearchTotalResults->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->openSearchTotalResults->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->openSearchTotalResults->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->openSearchTotalResults->extensionAttributes['foo2']['value']); - $openSearchTotalResultsXml = $this->openSearchTotalResults->saveXML(); - $newOpenSearchTotalResults = new Zend_Gdata_Extension_OpenSearchTotalResults(); - $newOpenSearchTotalResults->transferFromXML($openSearchTotalResultsXml); - $this->assertEquals('bar', $newOpenSearchTotalResults->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newOpenSearchTotalResults->extensionAttributes['foo2']['value']); - } - - public function testConvertFullOpenSearchTotalResultsToAndFromString() { - $this->openSearchTotalResults->transferFromXML($this->openSearchTotalResultsText); - $this->assertEquals("12", $this->openSearchTotalResults->text); - } - -} diff --git a/tests/Zend/Gdata/OriginalEventTest.php b/tests/Zend/Gdata/OriginalEventTest.php deleted file mode 100644 index b2523d9053..0000000000 --- a/tests/Zend/Gdata/OriginalEventTest.php +++ /dev/null @@ -1,134 +0,0 @@ -originalEventText = file_get_contents( - 'Zend/Gdata/_files/OriginalEventElementSample1.xml', - true); - $this->originalEvent = new Zend_Gdata_Extension_OriginalEvent(); - } - - public function testEmptyOriginalEventShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->originalEvent->extensionElements)); - $this->assertTrue(count($this->originalEvent->extensionElements) == 0); - } - - public function testEmptyOriginalEventShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->originalEvent->extensionAttributes)); - $this->assertTrue(count($this->originalEvent->extensionAttributes) == 0); - } - - public function testSampleOriginalEventShouldHaveNoExtensionElements() { - $this->originalEvent->transferFromXML($this->originalEventText); - $this->assertTrue(is_array($this->originalEvent->extensionElements)); - $this->assertTrue(count($this->originalEvent->extensionElements) == 0); - } - - public function testSampleOriginalEventShouldHaveNoExtensionAttributes() { - $this->originalEvent->transferFromXML($this->originalEventText); - $this->assertTrue(is_array($this->originalEvent->extensionAttributes)); - $this->assertTrue(count($this->originalEvent->extensionAttributes) == 0); - } - - public function testNormalOriginalEventShouldHaveNoExtensionElements() { - $this->originalEvent->href = "http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite"; - $this->originalEvent->id = "abcdef123456789"; - - $this->assertEquals("http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite", $this->originalEvent->href); - $this->assertEquals("abcdef123456789", $this->originalEvent->id); - - $this->assertEquals(0, count($this->originalEvent->extensionElements)); - $newOriginalEvent = new Zend_Gdata_Extension_OriginalEvent(); - $newOriginalEvent->transferFromXML($this->originalEvent->saveXML()); - $this->assertEquals(0, count($newOriginalEvent->extensionElements)); - $newOriginalEvent->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newOriginalEvent->extensionElements)); - $this->assertEquals("http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite", $newOriginalEvent->href); - $this->assertEquals("abcdef123456789", $newOriginalEvent->id); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newOriginalEvent2 = $gdata->newOriginalEvent(); - $newOriginalEvent2->transferFromXML($newOriginalEvent->saveXML()); - $this->assertEquals(1, count($newOriginalEvent2->extensionElements)); - $this->assertEquals("http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite", $newOriginalEvent2->href); - $this->assertEquals("abcdef123456789", $newOriginalEvent2->id); - } - - public function testEmptyOriginalEventToAndFromStringShouldMatch() { - $originalEventXml = $this->originalEvent->saveXML(); - $newOriginalEvent = new Zend_Gdata_Extension_OriginalEvent(); - $newOriginalEvent->transferFromXML($originalEventXml); - $newOriginalEventXml = $newOriginalEvent->saveXML(); - $this->assertTrue($originalEventXml == $newOriginalEventXml); - } - - public function testOriginalEventWithValueToAndFromStringShouldMatch() { - $this->originalEvent->href = "http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite"; - $this->originalEvent->id = "abcdef123456789"; - $originalEventXml = $this->originalEvent->saveXML(); - $newOriginalEvent = new Zend_Gdata_Extension_OriginalEvent(); - $newOriginalEvent->transferFromXML($originalEventXml); - $newOriginalEventXml = $newOriginalEvent->saveXML(); - $this->assertTrue($originalEventXml == $newOriginalEventXml); - $this->assertEquals("http://www.google.com/calendar/feeds/nobody@gmail.com/private/composite", $this->originalEvent->href); - $this->assertEquals("abcdef123456789", $this->originalEvent->id); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->originalEvent->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->originalEvent->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->originalEvent->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->originalEvent->extensionAttributes['foo2']['value']); - $originalEventXml = $this->originalEvent->saveXML(); - $newOriginalEvent = new Zend_Gdata_Extension_OriginalEvent(); - $newOriginalEvent->transferFromXML($originalEventXml); - $this->assertEquals('bar', $newOriginalEvent->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newOriginalEvent->extensionAttributes['foo2']['value']); - } - - public function testConvertFullOriginalEventToAndFromString() { - $this->originalEvent->transferFromXML($this->originalEventText); - $this->assertEquals("http://www.google.com/calendar/feeds/userID/private/full/123456789", $this->originalEvent->href); - $this->assertEquals("i8fl1nrv2bl57c1qgr3f0onmgg", $this->originalEvent->id); - $this->assertTrue($this->originalEvent->when instanceof Zend_Gdata_Extension_When); - $this->assertEquals("2006-03-17T22:00:00.000Z", $this->originalEvent->when->startTime); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosAlbumEntryTest.php b/tests/Zend/Gdata/Photos/PhotosAlbumEntryTest.php deleted file mode 100755 index c588767d76..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosAlbumEntryTest.php +++ /dev/null @@ -1,364 +0,0 @@ -albumEntry = new Zend_Gdata_Photos_AlbumEntry($albumEntryText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $entry = $this->albumEntry; - - // Assert that the entry's author is correct - $entryAuthor = $entry->getAuthor(); - $this->assertEquals($entryAuthor, $entry->author); - $this->assertEquals(1, count($entryAuthor)); - $this->assertTrue($entryAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($entryAuthor[0], "name", "text", "sample"); - $this->assertTrue($entryAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($entryAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $entry = $this->albumEntry; - - // Assert that the entry's ID is correct - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $entry = $this->albumEntry; - - // Assert that the photo entry has an Atom Published object - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - $this->verifyProperty2($entry, "published", "text", "2007-09-05T07:00:00.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $entry = $this->albumEntry; - - // Assert that the entry's updated date is correct - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($entry, "updated", "text", - "2007-09-05T20:49:24.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($entry, "title", "text", "Test"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoUser() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoUser() instanceof Zend_Gdata_Photos_Extension_User); - $this->verifyProperty2($entry, "gphotoUser", "text", - "sample.user"); - $this->verifyProperty3($entry, "gphotoUser", "text", - "sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNickname() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoNickname() instanceof Zend_Gdata_Photos_Extension_Nickname); - $this->verifyProperty2($entry, "gphotoNickname", "text", - "sample"); - $this->verifyProperty3($entry, "gphotoNickname", "text", - "sample"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoName() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoName() instanceof Zend_Gdata_Photos_Extension_Name); - $this->verifyProperty2($entry, "gphotoName", "text", - "Test"); - $this->verifyProperty3($entry, "gphotoName", "text", - "Test"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoId() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoId() instanceof Zend_Gdata_Photos_Extension_Id); - $this->verifyProperty2($entry, "gphotoId", "text", - "1"); - $this->verifyProperty3($entry, "gphotoId", "text", - "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoLocation() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoLocation() instanceof Zend_Gdata_Photos_Extension_Location); - $this->verifyProperty2($entry, "gphotoLocation", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoAccess() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoAccess() instanceof Zend_Gdata_Photos_Extension_Access); - $this->verifyProperty2($entry, "gphotoAccess", "text", - "public"); - $this->verifyProperty3($entry, "gphotoAccess", "text", - "public"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoTimestamp() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoTimestamp() instanceof Zend_Gdata_Photos_Extension_Timestamp); - $this->verifyProperty2($entry, "gphotoTimestamp", "text", - "1188975600000"); - $this->verifyProperty3($entry, "gphotoTimestamp", "text", - "1188975600000"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNumPhotos() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoNumPhotos() instanceof Zend_Gdata_Photos_Extension_NumPhotos); - $this->verifyProperty2($entry, "gphotoNumPhotos", "text", - "2"); - $this->verifyProperty3($entry, "gphotoNumPhotos", "text", - "2"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentingEnabled() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoCommentingEnabled() instanceof Zend_Gdata_Photos_Extension_CommentingEnabled); - $this->verifyProperty2($entry, "gphotoCommentingEnabled", "text", - "true"); - $this->verifyProperty3($entry, "gphotoCommentingEnabled", "text", - "true"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentCount() - { - $entry = $this->albumEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoCommentCount() instanceof Zend_Gdata_Photos_Extension_CommentCount); - $this->verifyProperty2($entry, "gphotoCommentCount", "text", - "0"); - $this->verifyProperty3($entry, "gphotoCommentCount", "text", - "0"); - } - - /** - * Check for the existence of a - */ - public function testMediaGroup() - { - $entry = $this->albumEntry; - - // Assert that the entry's media group exists - $this->assertTrue($entry->getMediaGroup() instanceof Zend_Gdata_Media_Extension_MediaGroup); - } - - /** - * Check for the geo data and verify that it contains the expected values - */ - public function testGeoData() - { - $geoRssWhere = $this->albumEntry->geoRssWhere; - $point = $geoRssWhere->point; - $pos = $point->pos; - $this->assertEquals("42.87194 13.56738", $pos->text); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosAlbumFeedTest.php b/tests/Zend/Gdata/Photos/PhotosAlbumFeedTest.php deleted file mode 100755 index c97de89229..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosAlbumFeedTest.php +++ /dev/null @@ -1,469 +0,0 @@ -albumFeed = new Zend_Gdata_Photos_AlbumFeed($albumFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of appropriate entry type and object count matches. - */ - public function testAlbumFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->albumFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_PhotoEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->albumFeed and convert back to objects */ - $newListFeed = new Zend_Gdata_Photos_UserFeed( - $this->albumFeed->saveXML()); - $newEntryCount = 0; - foreach ($newListFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_PhotoEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that the number of entries equals the number - * of entries defined in the sample file. - */ - public function testEntryCount() - { - $entryCount = 0; - foreach ($this->albumFeed as $entry) { - $entryCount++; - } - $this->assertEquals(4, $entryCount); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $feed = $this->albumFeed; - - // Assert that the feed's author is correct - $feedAuthor = $feed->getAuthor(); - $this->assertEquals($feedAuthor, $feed->author); - $this->assertEquals(1, count($feedAuthor)); - $this->assertTrue($feedAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($feedAuthor[0], "name", "text", "sample"); - $this->assertTrue($feedAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($feedAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - - // Assert that each entry has valid author data - foreach ($feed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_AlbumEntry) { - $entryAuthor = $entry->getAuthor(); - $this->assertEquals(1, count($entryAuthor)); - $this->verifyProperty2($entryAuthor[0], "name", "text", "sample"); - $this->verifyProperty2($entryAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - } - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->albumFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[0]; - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/2"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $feed = $this->albumFeed; - - // Assert that all photo entries have an Atom Published object - foreach ($feed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_PhotoEntry) { - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - } - } - - // Assert one of the entry's Published dates - $entry = $feed[0]; - $this->verifyProperty2($entry, "published", "text", "2007-09-05T20:49:23.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->albumFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-09-21T18:23:05.000Z"); - - // Assert that all entries have an Atom Updated object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Updated dates - $entry = $feed[0]; - $this->verifyProperty2($entry, "updated", "text", "2007-09-21T18:23:05.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", "Test"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - - // Assert one of the entry's Titles - $entry = $feed[0]; - $this->verifyProperty2($entry, "title", "text", "Aqua Blue.jpg"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSubtitle() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getSubtitle() instanceof Zend_Gdata_App_Extension_Subtitle); - $this->verifyProperty2($feed, "subtitle", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->albumFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.00"); - $this->verifyProperty2($feed, "generator", "uri", "http://picasaweb.google.com/"); - $this->verifyProperty2($feed, "generator", "text", "Picasaweb"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testIcon() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getIcon() instanceof Zend_Gdata_App_Extension_Icon); - $this->verifyProperty2($feed, "icon", "text", - "http://lh6.google.com/sample.user/Rt8WNoDZEJE/AAAAAAAAABk/HQGlDhpIgWo/s160-c/Test.jpg"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoUser() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoUser() instanceof Zend_Gdata_Photos_Extension_User); - $this->verifyProperty2($feed, "gphotoUser", "text", - "sample.user"); - $this->verifyProperty3($feed, "gphotoUser", "text", - "sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNickname() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoNickname() instanceof Zend_Gdata_Photos_Extension_Nickname); - $this->verifyProperty2($feed, "gphotoNickname", "text", - "sample"); - $this->verifyProperty3($feed, "gphotoNickname", "text", - "sample"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoName() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoName() instanceof Zend_Gdata_Photos_Extension_Name); - $this->verifyProperty2($feed, "gphotoName", "text", - "Test"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoId() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoId() instanceof Zend_Gdata_Photos_Extension_Id); - $this->verifyProperty2($feed, "gphotoId", "text", - "1"); - $this->verifyProperty3($feed, "gphotoId", "text", - "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoLocation() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoLocation() instanceof Zend_Gdata_Photos_Extension_Location); - $this->verifyProperty2($feed, "gphotoLocation", "text", - ""); - $this->verifyProperty3($feed, "gphotoLocation", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoAccess() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoAccess() instanceof Zend_Gdata_Photos_Extension_Access); - $this->verifyProperty2($feed, "gphotoAccess", "text", - "public"); - $this->verifyProperty3($feed, "gphotoAccess", "text", - "public"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoTimestamp() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoTimestamp() instanceof Zend_Gdata_Photos_Extension_Timestamp); - $this->verifyProperty2($feed, "gphotoTimestamp", "text", - "1188975600000"); - $this->verifyProperty3($feed, "gphotoTimestamp", "text", - "1188975600000"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNumPhotos() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoNumPhotos() instanceof Zend_Gdata_Photos_Extension_NumPhotos); - $this->verifyProperty2($feed, "gphotoNumPhotos", "text", - "2"); - $this->verifyProperty3($feed, "gphotoNumPhotos", "text", - "2"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentingEnabled() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoCommentingEnabled() instanceof Zend_Gdata_Photos_Extension_CommentingEnabled); - $this->verifyProperty2($feed, "gphotoCommentingEnabled", "text", - "true"); - $this->verifyProperty3($feed, "gphotoCommentingEnabled", "text", - "true"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentCount() - { - $feed = $this->albumFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoCommentCount() instanceof Zend_Gdata_Photos_Extension_CommentCount); - $this->verifyProperty2($feed, "gphotoCommentCount", "text", - "0"); - $this->verifyProperty3($feed, "gphotoCommentCount", "text", - "0"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosAlbumQueryTest.php b/tests/Zend/Gdata/Photos/PhotosAlbumQueryTest.php deleted file mode 100755 index afe5d5eb95..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosAlbumQueryTest.php +++ /dev/null @@ -1,198 +0,0 @@ -setUser("sample.user"); - $query->setAlbumId("1"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/album/test"; - - $query->setAlbumId(null); - $query->setAlbumName("test"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check for thrown exceptions upon improper albumname/id setting - */ - public function testAlbumQueryExceptions() - { - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - - try { - $generatedString = $query->getQueryUrl(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - - $query->setAlbumId("1"); - $query->setAlbumName("test"); - - try { - $generatedString = $query->getQueryUrl(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - } - - /** - * Check the consistency of an album feed request - * Projection is set to base - */ - public function testBaseAlbumQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/base/user/sample.user/albumid/1"; - - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setProjection("base"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of an album feed request filtered - * for a specific tag - */ - public function testTagFilterAlbumQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1?tag=test"; - - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setTag("test"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of an album feed request for private data - */ - public function testPrivateAlbumQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1?access=private"; - - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setAccess("private"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of an album feed request for specifically-sized thumbnails - */ - public function testThumbnailAlbumQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1?thumbsize=72"; - - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setThumbsize("72"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the set thumbsize is correct - $this->assertEquals("72", $query->getThumbsize()); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of an album feed request for specifically-sized images - */ - public function testImgAlbumQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1?imgmax=800"; - - $query = new Zend_Gdata_Photos_AlbumQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setImgMax("800"); - - // Assert that the set ImgMax is correct - $this->assertEquals("800", $query->getImgMax()); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - - // Check that ImgMax is set back to null - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1"; - $query->setImgMax(null); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosCommentEntryTest.php b/tests/Zend/Gdata/Photos/PhotosCommentEntryTest.php deleted file mode 100755 index cc6a1aa365..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosCommentEntryTest.php +++ /dev/null @@ -1,229 +0,0 @@ -commentEntry = new Zend_Gdata_Photos_CommentEntry($commentEntryText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $entry = $this->commentEntry; - - // Assert that the entry's ID is correct - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/commentid/5"); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $entry = $this->commentEntry; - - // Assert that the entry's author is correct - $entryAuthor = $entry->getAuthor(); - $this->assertEquals($entryAuthor, $entry->author); - $this->assertEquals(1, count($entryAuthor)); - $this->assertTrue($entryAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($entryAuthor[0], "name", "text", "sample"); - $this->assertTrue($entryAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($entryAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $entry = $this->commentEntry; - - // Assert that the photo entry has an Atom Published object - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - $this->verifyProperty2($entry, "published", "text", "2007-09-21T18:22:53.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $entry = $this->commentEntry; - - // Assert that the entry's updated date is correct - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($entry, "updated", "text", - "2007-09-21T18:22:53.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $entry = $this->commentEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($entry, "title", "text", "sample"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testContent() - { - $entry = $this->commentEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getContent() instanceof Zend_Gdata_App_Extension_Content); - $this->verifyProperty2($entry, "content", "text", "test comment"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoId() - { - $entry = $this->commentEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoId() instanceof Zend_Gdata_Photos_Extension_Id); - $this->verifyProperty2($entry, "gphotoId", "text", - "5"); - $this->verifyProperty3($entry, "gphotoId", "text", - "5"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoPhotoId() - { - $entry = $this->commentEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoPhotoId() instanceof Zend_Gdata_Photos_Extension_PhotoId); - $this->verifyProperty2($entry, "gphotoPhotoId", "text", - "100"); - $this->verifyProperty3($entry, "gphotoPhotoId", "text", - "100"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosPhotoEntryTest.php b/tests/Zend/Gdata/Photos/PhotosPhotoEntryTest.php deleted file mode 100755 index 36ad35688e..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosPhotoEntryTest.php +++ /dev/null @@ -1,395 +0,0 @@ -photoEntry = new Zend_Gdata_Photos_PhotoEntry($photoEntryText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $entry = $this->photoEntry; - - // Assert that the entry's ID is correct - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $entry = $this->photoEntry; - - // Assert that the photo entry has an Atom Published object - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - $this->verifyProperty2($entry, "published", "text", "2007-09-05T20:49:24.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $entry = $this->photoEntry; - - // Assert that the entry's updated date is correct - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($entry, "updated", "text", - "2007-09-21T18:19:38.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $entry = $this->photoEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($entry, "title", "text", "Aqua Graphite.jpg"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoId() - { - $entry = $this->photoEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoId() instanceof Zend_Gdata_Photos_Extension_Id); - $this->verifyProperty2($entry, "gphotoId", "text", - "100"); - $this->verifyProperty3($entry, "gphotoId", "text", - "100"); - } - - /** - * Check for the existance of exif namespaced data and verify that it contains - * the expected value. - */ - public function testExifData() - { - $exifTags = $this->photoEntry->exifTags; - $this->assertTrue($exifTags != null); - $this->assertTrue($exifTags->flash != null); - $this->assertTrue($exifTags->fstop != null); - $this->assertTrue($exifTags->exposure != null); - $this->assertTrue($exifTags->focallength != null); - $this->assertTrue($exifTags->iso != null); - $this->assertTrue($exifTags->time != null); - $this->assertTrue($exifTags->distance != null); - $this->assertTrue($exifTags->make != null); - $this->assertTrue($exifTags->model != null); - $this->assertTrue($exifTags->imageUniqueID != null); - $this->assertEquals("true", $exifTags->flash->text); - $this->assertEquals("11.0", $exifTags->fstop->text); - $this->assertEquals("0.0040", $exifTags->exposure->text); - $this->assertEquals("22.0", $exifTags->focallength->text); - $this->assertEquals("200", $exifTags->iso->text); - $this->assertEquals("1180950900000", $exifTags->time->text); - $this->assertEquals("0.0",$exifTags->distance->text); - $this->assertEquals("Fictitious Camera Company",$exifTags->make->text); - $this->assertEquals("AMAZING-100D",$exifTags->model->text); - $this->assertEquals("a5ce2e36b9df7d3cb081511c72e73926", $exifTags->imageUniqueID->text); - } - - /** - * Check for the geo data and verify that it contains the expected values - */ - public function testGeoData() - { - $geoRssWhere = $this->photoEntry->geoRssWhere; - $point = $geoRssWhere->point; - $pos = $point->pos; - $this->assertEquals("41.87194 12.56738", $pos->text); - } - - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoVersion() - { - $entry = $this->photoEntry; - - // Assert that the entry's version is correct - $this->assertTrue($entry->getGphotoVersion() instanceof Zend_Gdata_Photos_Extension_Version); - $this->verifyProperty2($entry, "gphotoVersion", "text", - "1190398778006402"); - $this->verifyProperty3($entry, "gphotoVersion", "text", - "1190398778006402"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoAlbumId() - { - $entry = $this->photoEntry; - - // Assert that the entry's albumid is correct - $this->assertTrue($entry->getGphotoAlbumId() instanceof Zend_Gdata_Photos_Extension_AlbumId); - $this->verifyProperty2($entry, "gphotoAlbumId", "text", - "1"); - $this->verifyProperty3($entry, "gphotoAlbumId", "text", - "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoWidth() - { - $entry = $this->photoEntry; - - // Assert that the entry's width is correct - $this->assertTrue($entry->getGphotoWidth() instanceof Zend_Gdata_Photos_Extension_Width); - $this->verifyProperty2($entry, "gphotoWidth", "text", - "2560"); - $this->verifyProperty3($entry, "gphotoWidth", "text", - "2560"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoHeight() - { - $entry = $this->photoEntry; - - // Assert that the entry's height is correct - $this->assertTrue($entry->getGphotoHeight() instanceof Zend_Gdata_Photos_Extension_Height); - $this->verifyProperty2($entry, "gphotoHeight", "text", - "1600"); - $this->verifyProperty3($entry, "gphotoHeight", "text", - "1600"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoSize() - { - $entry = $this->photoEntry; - - // Assert that the entry's size is correct - $this->assertTrue($entry->getGphotoSize() instanceof Zend_Gdata_Photos_Extension_Size); - $this->verifyProperty2($entry, "gphotoSize", "text", - "798334"); - $this->verifyProperty3($entry, "gphotoSize", "text", - "798334"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoClient() - { - $entry = $this->photoEntry; - - // Assert that the entry's client is correct - $this->assertTrue($entry->getGphotoClient() instanceof Zend_Gdata_Photos_Extension_Client); - $this->verifyProperty2($entry, "gphotoClient", "text", - ""); - $this->verifyProperty3($entry, "gphotoClient", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoChecksum() - { - $entry = $this->photoEntry; - - // Assert that the entry's checksum is correct - $this->assertTrue($entry->getGphotoChecksum() instanceof Zend_Gdata_Photos_Extension_Checksum); - $this->verifyProperty2($entry, "gphotoChecksum", "text", - ""); - $this->verifyProperty3($entry, "gphotoChecksum", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoTimestamp() - { - $entry = $this->photoEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoTimestamp() instanceof Zend_Gdata_Photos_Extension_Timestamp); - $this->verifyProperty2($entry, "gphotoTimestamp", "text", - "1189025363000"); - $this->verifyProperty3($entry, "gphotoTimestamp", "text", - "1189025363000"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentingEnabled() - { - $entry = $this->photoEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoCommentingEnabled() instanceof Zend_Gdata_Photos_Extension_CommentingEnabled); - $this->verifyProperty2($entry, "gphotoCommentingEnabled", "text", - "true"); - $this->verifyProperty3($entry, "gphotoCommentingEnabled", "text", - "true"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentCount() - { - $entry = $this->photoEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getGphotoCommentCount() instanceof Zend_Gdata_Photos_Extension_CommentCount); - $this->verifyProperty2($entry, "gphotoCommentCount", "text", - "0"); - $this->verifyProperty3($entry, "gphotoCommentCount", "text", - "0"); - } - - /** - * Check for the existence of a - */ - public function testMediaGroup() - { - $entry = $this->photoEntry; - - // Assert that the entry's media group exists - $this->assertTrue($entry->getMediaGroup() instanceof Zend_Gdata_Media_Extension_MediaGroup); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosPhotoFeedTest.php b/tests/Zend/Gdata/Photos/PhotosPhotoFeedTest.php deleted file mode 100755 index e6162f6346..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosPhotoFeedTest.php +++ /dev/null @@ -1,435 +0,0 @@ -photoFeed = new Zend_Gdata_Photos_PhotoFeed($photoFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of appropriate entry type and object count matches. - */ - public function testPhotoFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->photoFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_CommentEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->photoFeed and convert back to objects */ - $newListFeed = new Zend_Gdata_Photos_PhotoFeed( - $this->photoFeed->saveXML()); - $newEntryCount = 0; - foreach ($newListFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_CommentEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that the number of entries equals the number - * of entries defined in the sample file. - */ - public function testEntryCount() - { - $entryCount = 0; - foreach ($this->photoFeed as $entry) { - $entryCount++; - } - $this->assertEquals(3, $entryCount); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->photoFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1/photoid/100"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[0]; - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/tag/tag"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->photoFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-09-21T18:23:05.000Z"); - - // Assert that all entries have an Atom Updated object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Updated dates - $entry = $feed[0]; - $this->verifyProperty2($entry, "updated", "text", "2007-09-21T18:23:05.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", "Aqua Blue.jpg"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSubtitle() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getSubtitle() instanceof Zend_Gdata_App_Extension_Subtitle); - $this->verifyProperty2($feed, "subtitle", "text", - "Blue"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->photoFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.00"); - $this->verifyProperty2($feed, "generator", "uri", "http://picasaweb.google.com/"); - $this->verifyProperty2($feed, "generator", "text", "Picasaweb"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testIcon() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getIcon() instanceof Zend_Gdata_App_Extension_Icon); - $this->verifyProperty2($feed, "icon", "text", - "http://lh4.google.com/sample.user/Rt8WU4DZEKI/AAAAAAAAABY/IVgLqmnzJII/s288/Aqua%20Blue.jpg"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoId() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoId() instanceof Zend_Gdata_Photos_Extension_Id); - $this->verifyProperty2($feed, "gphotoId", "text", - "100"); - $this->verifyProperty3($feed, "gphotoId", "text", - "100"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoVersion() - { - $feed = $this->photoFeed; - - // Assert that the feed's version is correct - $this->assertTrue($feed->getGphotoVersion() instanceof Zend_Gdata_Photos_Extension_Version); - $this->verifyProperty2($feed, "gphotoVersion", "text", - "1190398985145172"); - $this->verifyProperty3($feed, "gphotoVersion", "text", - "1190398985145172"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoAlbumId() - { - $feed = $this->photoFeed; - - // Assert that the feed's albumid is correct - $this->assertTrue($feed->getGphotoAlbumId() instanceof Zend_Gdata_Photos_Extension_AlbumId); - $this->verifyProperty2($feed, "gphotoAlbumId", "text", - "1"); - $this->verifyProperty3($feed, "gphotoAlbumId", "text", - "1"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoTimestamp() - { - $feed = $this->photoFeed; - - // Assert that the feed's timestamp is correct - $this->assertTrue($feed->getGphotoTimestamp() instanceof Zend_Gdata_Photos_Extension_Timestamp); - $this->verifyProperty2($feed, "gphotoTimestamp", "text", - "1189025362000"); - $this->verifyProperty3($feed, "gphotoTimestamp", "text", - "1189025362000"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoWidth() - { - $feed = $this->photoFeed; - - // Assert that the feed's width is correct - $this->assertTrue($feed->getGphotoWidth() instanceof Zend_Gdata_Photos_Extension_Width); - $this->verifyProperty2($feed, "gphotoWidth", "text", - "2560"); - $this->verifyProperty3($feed, "gphotoWidth", "text", - "2560"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoHeight() - { - $feed = $this->photoFeed; - - // Assert that the feed's height is correct - $this->assertTrue($feed->getGphotoHeight() instanceof Zend_Gdata_Photos_Extension_Height); - $this->verifyProperty2($feed, "gphotoHeight", "text", - "1600"); - $this->verifyProperty3($feed, "gphotoHeight", "text", - "1600"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoSize() - { - $feed = $this->photoFeed; - - // Assert that the feed's size is correct - $this->assertTrue($feed->getGphotoSize() instanceof Zend_Gdata_Photos_Extension_Size); - $this->verifyProperty2($feed, "gphotoSize", "text", - "883405"); - $this->verifyProperty3($feed, "gphotoSize", "text", - "883405"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoClient() - { - $feed = $this->photoFeed; - - // Assert that the feed's client is correct - $this->assertTrue($feed->getGphotoClient() instanceof Zend_Gdata_Photos_Extension_Client); - $this->verifyProperty2($feed, "gphotoClient", "text", - ""); - $this->verifyProperty3($feed, "gphotoClient", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoChecksum() - { - $feed = $this->photoFeed; - - // Assert that the feed's checksum is correct - $this->assertTrue($feed->getGphotoChecksum() instanceof Zend_Gdata_Photos_Extension_Checksum); - $this->verifyProperty2($feed, "gphotoChecksum", "text", - ""); - $this->verifyProperty3($feed, "gphotoChecksum", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentingEnabled() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoCommentingEnabled() instanceof Zend_Gdata_Photos_Extension_CommentingEnabled); - $this->verifyProperty2($feed, "gphotoCommentingEnabled", "text", - "true"); - $this->verifyProperty3($feed, "gphotoCommentingEnabled", "text", - "true"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoCommentCount() - { - $feed = $this->photoFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoCommentCount() instanceof Zend_Gdata_Photos_Extension_CommentCount); - $this->verifyProperty2($feed, "gphotoCommentCount", "text", - "1"); - $this->verifyProperty3($feed, "gphotoCommentCount", "text", - "1"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosPhotoQueryTest.php b/tests/Zend/Gdata/Photos/PhotosPhotoQueryTest.php deleted file mode 100755 index 13c57b4312..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosPhotoQueryTest.php +++ /dev/null @@ -1,133 +0,0 @@ -setUser("sample.user"); - $query->setAlbumId("1"); - $query->setPhotoId("1"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of a user feed request - * Projection is set to base - */ - public function testBasePhotoQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/base/user/sample.user/albumid/1/photoid/1"; - - $query = new Zend_Gdata_Photos_PhotoQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setPhotoId("1"); - $query->setProjection("base"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check for thrown exceptions upon improper photoid setting - */ - public function testPhotoQueryExceptions() - { - $query = new Zend_Gdata_Photos_PhotoQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - - try { - $generatedString = $query->getQueryUrl(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - } - - /** - * Check the consistency of a user feed request filtered - * for a specific tag - */ - public function testTagFilterPhotoQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1/photoid/1?tag=test"; - - $query = new Zend_Gdata_Photos_PhotoQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setPhotoId("1"); - $query->setTag("test"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of a user feed request for private data - */ - public function testPrivatePhotoQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1/photoid/1?access=private"; - - $query = new Zend_Gdata_Photos_PhotoQuery(); - $query->setUser("sample.user"); - $query->setAlbumId("1"); - $query->setPhotoId("1"); - $query->setAccess("private"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosTagEntryTest.php b/tests/Zend/Gdata/Photos/PhotosTagEntryTest.php deleted file mode 100755 index fa01fdb26d..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosTagEntryTest.php +++ /dev/null @@ -1,130 +0,0 @@ -tagEntry = new Zend_Gdata_Photos_TagEntry($tagEntryText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $entry = $this->tagEntry; - - // Assert that the entry's ID is correct - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/tag/tag"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $entry = $this->tagEntry; - - // Assert that the entry's updated date is correct - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($entry, "updated", "text", - "1970-01-01T00:01:01.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $entry = $this->tagEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($entry, "title", "text", "tag"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosUserEntryTest.php b/tests/Zend/Gdata/Photos/PhotosUserEntryTest.php deleted file mode 100755 index ab6b9791a0..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosUserEntryTest.php +++ /dev/null @@ -1,228 +0,0 @@ -userEntry = new Zend_Gdata_Photos_UserEntry($userEntryText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $entry = $this->userEntry; - - // Assert that the entry's author is correct - $entryAuthor = $entry->getAuthor(); - $this->assertEquals($entryAuthor, $entry->author); - $this->assertEquals(1, count($entryAuthor)); - $this->assertTrue($entryAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($entryAuthor[0], "name", "text", "sample"); - $this->assertTrue($entryAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($entryAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $entry = $this->userEntry; - - // Assert that the entry's ID is correct - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $entry = $this->userEntry; - - // Assert that the photo entry has an Atom Published object - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - $this->verifyProperty2($entry, "published", "text", "2007-09-24T23:45:49.059Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $entry = $this->userEntry; - - // Assert that the entry's updated date is correct - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($entry, "updated", "text", - "2007-09-24T23:45:49.059Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $entry = $this->userEntry; - - // Assert that the entry's title is correct - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($entry, "title", "text", "sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoUser() - { - $entry = $this->userEntry; - - // Assert that the entry's user is correct - $this->assertTrue($entry->getGphotoUser() instanceof Zend_Gdata_Photos_Extension_User); - $this->verifyProperty2($entry, "gphotoUser", "text", "sample.user"); - $this->verifyProperty3($entry, "gphotoUser", "text", "sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNickname() - { - $entry = $this->userEntry; - - // Assert that the entry's nickname is correct - $this->assertTrue($entry->getGphotoNickname() instanceof Zend_Gdata_Photos_Extension_Nickname); - $this->verifyProperty2($entry, "gphotoNickname", "text", "sample"); - $this->verifyProperty3($entry, "gphotoNickname", "text", "sample"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoThumbnail() - { - $entry = $this->userEntry; - - // Assert that the entry's thumbnail is correct - $this->assertTrue($entry->getGphotoThumbnail() instanceof Zend_Gdata_Photos_Extension_Thumbnail); - $this->verifyProperty2($entry, "gphotoThumbnail", "text", - "http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user"); - $this->verifyProperty3($entry, "gphotoThumbnail", "text", - "http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosUserFeedTest.php b/tests/Zend/Gdata/Photos/PhotosUserFeedTest.php deleted file mode 100755 index a05cdbc938..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosUserFeedTest.php +++ /dev/null @@ -1,360 +0,0 @@ -userFeed = new Zend_Gdata_Photos_UserFeed($userFeedText); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty2($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Verify that a given property is set to a specific value, - * that it keeps that value when set using the setter, - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty3($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $propSetter = "set" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - $secondSetter = "set" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $obj->$propSetter($obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - /** - * Convert sample feed to XML then back to objects. Ensure that - * all objects are instances of appropriate entry type and object count matches. - */ - public function testUserFeedToAndFromString() - { - $entryCount = 0; - foreach ($this->userFeed as $entry) { - $entryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_AlbumEntry || - $entry instanceof Zend_Gdata_Photos_PhotoEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertTrue($entryCount > 0); - - /* Grab XML from $this->userFeed and convert back to objects */ - $newListFeed = new Zend_Gdata_Photos_UserFeed( - $this->userFeed->saveXML()); - $newEntryCount = 0; - foreach ($newListFeed as $entry) { - $newEntryCount++; - $this->assertTrue($entry instanceof Zend_Gdata_Photos_AlbumEntry || - $entry instanceof Zend_Gdata_Photos_PhotoEntry || - $entry instanceof Zend_Gdata_Photos_TagEntry); - } - $this->assertEquals($entryCount, $newEntryCount); - } - - /** - * Ensure that the number of entries equals the number - * of entries defined in the sample file. - */ - public function testEntryCount() - { - $entryCount = 0; - foreach ($this->userFeed as $entry) { - $entryCount++; - } - $this->assertEquals(3, $entryCount); - } - - /** - * Check for the existence of an and verify that they - * contain the expected values. - */ - public function testAuthor() - { - $feed = $this->userFeed; - - // Assert that the feed's author is correct - $feedAuthor = $feed->getAuthor(); - $this->assertEquals($feedAuthor, $feed->author); - $this->assertEquals(1, count($feedAuthor)); - $this->assertTrue($feedAuthor[0] instanceof Zend_Gdata_App_Extension_Author); - $this->verifyProperty2($feedAuthor[0], "name", "text", "sample"); - $this->assertTrue($feedAuthor[0]->getUri() instanceof Zend_Gdata_App_Extension_Uri); - $this->verifyProperty2($feedAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - - // Assert that each entry has valid author data - foreach ($feed as $entry) { - if ($entry instanceof Zend_Gdata_Photos_AlbumEntry) { - $entryAuthor = $entry->getAuthor(); - $this->assertEquals(1, count($entryAuthor)); - $this->verifyProperty2($entryAuthor[0], "name", "text", "sample"); - $this->verifyProperty2($entryAuthor[0], "uri", "text", "http://picasaweb.google.com/sample.user"); - } - } - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testId() - { - $feed = $this->userFeed; - - // Assert that the feed's ID is correct - $this->assertTrue($feed->getId() instanceof Zend_Gdata_App_Extension_Id); - $this->verifyProperty2($feed, "id", "text", - "http://picasaweb.google.com/data/feed/api/user/sample.user"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getId() instanceof Zend_Gdata_App_Extension_Id); - } - - // Assert one of the entry's IDs - $entry = $feed[0]; - $this->verifyProperty2($entry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/100"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testPublished() - { - $feed = $this->userFeed; - - // Assert that all entries have an Atom Published object - foreach ($feed as $entry) { - $this->assertTrue($entry->getPublished() instanceof Zend_Gdata_App_Extension_Published); - } - - // Assert one of the entry's Published dates - $entry = $feed[0]; - $this->verifyProperty2($entry, "published", "text", "2007-09-05T07:00:00.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testUpdated() - { - $feed = $this->userFeed; - - // Assert that the feed's updated date is correct - $this->assertTrue($feed->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - $this->verifyProperty2($feed, "updated", "text", - "2007-09-20T21:09:39.111Z"); - - // Assert that all entries have an Atom Updated object - foreach ($feed as $entry) { - $this->assertTrue($entry->getUpdated() instanceof Zend_Gdata_App_Extension_Updated); - } - - // Assert one of the entry's Updated dates - $entry = $feed[0]; - $this->verifyProperty2($entry, "updated", "text", "2007-09-05T20:49:24.000Z"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testTitle() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getTitle() instanceof Zend_Gdata_App_Extension_Title); - $this->verifyProperty2($feed, "title", "text", - "sample.user"); - - // Assert that all entries have an Atom ID object - foreach ($feed as $entry) { - $this->assertTrue($entry->getTitle() instanceof Zend_Gdata_App_Extension_Title); - } - - // Assert one of the entry's Titles - $entry = $feed[0]; - $this->verifyProperty2($entry, "title", "text", "Test"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testSubtitle() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getSubtitle() instanceof Zend_Gdata_App_Extension_Subtitle); - $this->verifyProperty2($feed, "subtitle", "text", - ""); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGenerator() - { - $feed = $this->userFeed; - - // Assert that the feed's generator is correct - $this->assertTrue($feed->getGenerator() instanceof Zend_Gdata_App_Extension_Generator); - $this->verifyProperty2($feed, "generator", "version", "1.00"); - $this->verifyProperty2($feed, "generator", "uri", "http://picasaweb.google.com/"); - $this->verifyProperty2($feed, "generator", "text", "Picasaweb"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testIcon() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getIcon() instanceof Zend_Gdata_App_Extension_Icon); - $this->verifyProperty2($feed, "icon", "text", - "http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoUser() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoUser() instanceof Zend_Gdata_Photos_Extension_User); - $this->verifyProperty2($feed, "gphotoUser", "text", - "sample.user"); - $this->verifyProperty3($feed, "gphotoUser", "text", - "sample.user"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoNickname() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoNickname() instanceof Zend_Gdata_Photos_Extension_Nickname); - $this->verifyProperty2($feed, "gphotoNickname", "text", - "sample"); - $this->verifyProperty3($feed, "gphotoNickname", "text", - "sample"); - } - - /** - * Check for the existence of an and verify that it contains - * the expected value. - */ - public function testGphotoThumbnail() - { - $feed = $this->userFeed; - - // Assert that the feed's title is correct - $this->assertTrue($feed->getGphotoThumbnail() instanceof Zend_Gdata_Photos_Extension_Thumbnail); - $this->verifyProperty2($feed, "gphotoThumbnail", "text", - "http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user"); - $this->verifyProperty3($feed, "gphotoThumbnail", "text", - "http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user"); - } - -} diff --git a/tests/Zend/Gdata/Photos/PhotosUserQueryTest.php b/tests/Zend/Gdata/Photos/PhotosUserQueryTest.php deleted file mode 100755 index 77759541f2..0000000000 --- a/tests/Zend/Gdata/Photos/PhotosUserQueryTest.php +++ /dev/null @@ -1,134 +0,0 @@ -setUser("sample.user"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of a user feed request - * Projection is set to base - */ - public function testBaseUserQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/base/user/sample.user"; - - $query = new Zend_Gdata_Photos_UserQuery(); - $query->setUser("sample.user"); - $query->setProjection("base"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check for thrown exceptions upon improper albumname/id setting - */ - public function testUserQueryExceptions() - { - $query = new Zend_Gdata_Photos_UserQuery(); - $query->setUser("sample.user"); - $query->setProjection(null); - - try { - $generatedString = $query->getQueryUrl(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - - $query->setProjection("api"); - $query->setUser(null); - - try { - $generatedString = $query->getQueryUrl(); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - } - - /** - * Check the consistency of a user feed request filtered - * for a specific tag - */ - public function testTagFilterUserQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user?tag=test"; - - $query = new Zend_Gdata_Photos_UserQuery(); - $query->setUser("sample.user"); - $query->setTag("test"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - - /** - * Check the consistency of a user feed request for private data - */ - public function testPrivateUserQuery() - { - $queryString = "https://picasaweb.google.com/data/feed/api/user/sample.user?access=private"; - - $query = new Zend_Gdata_Photos_UserQuery(); - $query->setUser("sample.user"); - $query->setAccess("private"); - - $generatedString = $query->getQueryUrl(); - - // Assert that the generated query matches the correct one - $this->assertEquals($queryString, $generatedString); - } - -} diff --git a/tests/Zend/Gdata/Photos/_files/TestAlbumEntry.xml b/tests/Zend/Gdata/Photos/_files/TestAlbumEntry.xml deleted file mode 100755 index 70bef7ad7a..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestAlbumEntry.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1 - 2007-09-05T07:00:00.000Z - 2007-09-05T20:49:24.000Z - - Test - - public - - - - - sample - http://picasaweb.google.com/sample.user - - 1 - Test - - public - 1188975600000 - 2 - sample.user - sample - true - 0 - - Test - - - - - sample - - - - 42.87194 13.56738 - - - diff --git a/tests/Zend/Gdata/Photos/_files/TestAlbumFeed.xml b/tests/Zend/Gdata/Photos/_files/TestAlbumFeed.xml deleted file mode 100755 index b8758a33e8..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestAlbumFeed.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - http://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1 - 2007-09-21T18:23:05.000Z - - Test - - public - http://lh6.google.com/sample.user/Rt8WNoDZEJE/AAAAAAAAABk/HQGlDhpIgWo/s160-c/Test.jpg - - - - - - sample - http://picasaweb.google.com/sample.user - - Picasaweb - 4 - 1 - 500 - 1 - Test - - public - 1188975600000 - 2 - sample.user - sample - true - 0 - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/2 - 2007-09-05T20:49:23.000Z - 2007-09-21T18:23:05.000Z - - Aqua Blue.jpg - Blue - - - - - 2 - 1190398985145172 - 0.0 - 1 - 2560 - 1600 - 883405 - - - 1189025362000 - - true - c041ce17aaa637eb656c81d9cf526c24 - - true - 1 - - Aqua Blue.jpg - Blue - tag, test - - - - - sample - - - - 41.87194 12.56738 - - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/3 - 2007-09-05T20:49:24.000Z - 2007-09-21T18:19:38.000Z - - Aqua Graphite.jpg - Gray - - - - - 3 - 1190398778006402 - 1.0 - 1 - 2560 - 1600 - 798334 - - - 1189025363000 - - true - a5ce2e36b9df7d3cb081511c72e73926 - - true - 0 - - Aqua Graphite.jpg - Gray - - - - - - sample - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/tag/tag - 2007-09-05T20:49:24.000Z - - tag - tag - - - - sample - http://picasaweb.google.com/sample.user - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/tag/test - 2007-09-05T20:49:24.000Z - - test - test - - - - sample - http://picasaweb.google.com/sample.user - - - diff --git a/tests/Zend/Gdata/Photos/_files/TestCommentEntry.xml b/tests/Zend/Gdata/Photos/_files/TestCommentEntry.xml deleted file mode 100755 index 5b3d4238f8..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestCommentEntry.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/commentid/5 - 2007-09-21T18:22:53.000Z - 2007-09-21T18:22:53.000Z - - sample - test comment - test comment - - - - sample - http://picasaweb.google.com/sample.user - sample.user - sample - http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s48-c/sample.user - - 5 - 100 - diff --git a/tests/Zend/Gdata/Photos/_files/TestPhotoEntry.xml b/tests/Zend/Gdata/Photos/_files/TestPhotoEntry.xml deleted file mode 100755 index 2f6e4b5d03..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestPhotoEntry.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100 - 2007-09-05T20:49:24.000Z - 2007-09-21T18:19:38.000Z - - Aqua Graphite.jpg - Gray - - - - - 100 - 1190398778006402 - 1 - 2560 - 1600 - 798334 - - - 1189025363000 - - 11.0 - 0.0040 - true - 22.0 - 200 - 1180950900000 - a5ce2e36b9df7d3cb081511c72e73926 - 0.0 - Fictitious Camera Company - AMAZING-100D - - true - 0 - - Aqua Graphite.jpg - Gray - - - - - - sample - - - - 41.87194 12.56738 - - - diff --git a/tests/Zend/Gdata/Photos/_files/TestPhotoFeed.xml b/tests/Zend/Gdata/Photos/_files/TestPhotoFeed.xml deleted file mode 100755 index ea3fb8fbf9..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestPhotoFeed.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - http://picasaweb.google.com/data/feed/api/user/sample.user/albumid/1/photoid/100 - 2007-09-21T18:23:05.000Z - - Aqua Blue.jpg - Blue - http://lh4.google.com/sample.user/Rt8WU4DZEKI/AAAAAAAAABY/IVgLqmnzJII/s288/Aqua%20Blue.jpg - - - - Picasaweb - 3 - 1 - 500 - 100 - 1190398985145172 - 1 - 2560 - 1600 - 883405 - - - 1189025362000 - - true - c041ce17aaa637eb656c81d9cf526c24 - - true - 1 - - Aqua Blue.jpg - Blue - tag, test - - - - - sample - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/tag/tag - 2007-09-21T18:23:05.000Z - - tag - tag - - - - sample - http://picasaweb.google.com/sample.user - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/tag/test - 2007-09-21T18:23:05.000Z - - test - test - - - - sample - http://picasaweb.google.com/sample.user - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/1/photoid/100/commentid/5 - 2007-09-21T18:22:53.000Z - 2007-09-21T18:22:53.000Z - - sample - test comment - test comment - - - - sample - http://picasaweb.google.com/sample.user - sample.user - sample - http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s48-c/sample.user - - 5 - 100 - - diff --git a/tests/Zend/Gdata/Photos/_files/TestTagEntry.xml b/tests/Zend/Gdata/Photos/_files/TestTagEntry.xml deleted file mode 100755 index 6e00dd586f..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestTagEntry.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - http://picasaweb.google.com/data/entry/api/user/sample.user/tag/tag - 1970-01-01T00:01:01.000Z - - tag - tag - - - - sample - http://picasaweb.google.com/sample.user - - diff --git a/tests/Zend/Gdata/Photos/_files/TestUserEntry.xml b/tests/Zend/Gdata/Photos/_files/TestUserEntry.xml deleted file mode 100755 index 759818c478..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestUserEntry.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - http://picasaweb.google.com/data/entry/api/user/sample.user - 2007-09-24T23:45:49.059Z - 2007-09-24T23:45:49.059Z - - sample.user - - - - - - sample - http://picasaweb.google.com/sample.user - - sample.user - sample - http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user - diff --git a/tests/Zend/Gdata/Photos/_files/TestUserFeed.xml b/tests/Zend/Gdata/Photos/_files/TestUserFeed.xml deleted file mode 100755 index 58dd6b407b..0000000000 --- a/tests/Zend/Gdata/Photos/_files/TestUserFeed.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - http://picasaweb.google.com/data/feed/api/user/sample.user - 2007-09-20T21:09:39.111Z - - sample.user - - http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user - - - - - - sample - http://picasaweb.google.com/sample.user - - Picasaweb - 4 - 1 - 100 - sample.user - sample - http://lh5.google.com/sample.user/AAAAuZnob5E/AAAAAAAAAAA/EtCbNCdLGxM/s64-c/sample.user - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/100 - 2007-09-05T07:00:00.000Z - 2007-09-05T20:49:24.000Z - - Test - - public - - - - - sample - http://picasaweb.google.com/sample.user - - 100 - Test - - public - 1188975600000 - 2 - sample.user - sample - true - 0 - - Test - - - - - sample - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/100/photoid/2 - 2007-09-05T20:49:24.000Z - 2007-09-05T20:49:23.000Z - - Second.jpg - - - - - - 2 - 1189025363424891 - 100 - 2560 - 1600 - 798334 - - - 1189025363000 - - true - a5ce2e36b9df7d3cb081511c72e73926 - - true - 0 - - Second.jpg - - - - - - - sample - - - - http://picasaweb.google.com/data/entry/api/user/sample.user/albumid/100/photoid/1 - 2007-09-05T20:49:23.000Z - 2007-09-05T20:49:22.000Z - - First.jpg - - - - - - 1 - 1189025362423722 - 100 - 2560 - 1600 - 883405 - - - 1189025362000 - - true - c041ce17aaa637eb656c81d9cf526c24 - - true - 0 - - First.jpg - - - - - - - sample - - - diff --git a/tests/Zend/Gdata/Photos/_files/test.jpg b/tests/Zend/Gdata/Photos/_files/test.jpg deleted file mode 100755 index d4a5a1098dfa166e24b95623f51bb125d1b2c435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14249 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 diff --git a/tests/Zend/Gdata/PhotosOnlineTest.php b/tests/Zend/Gdata/PhotosOnlineTest.php deleted file mode 100755 index e9594d527b..0000000000 --- a/tests/Zend/Gdata/PhotosOnlineTest.php +++ /dev/null @@ -1,288 +0,0 @@ -photos = new Zend_Gdata_Photos($client); - } - - /** - * Verify that a given property is set to a specific value - * and that the getter and magic variable return the same value. - * - * @param object $obj The object to be interrogated. - * @param string $name The name of the property to be verified. - * @param string $secondName 2nd level accessor function name - * @param object $value The expected value of the property. - */ - protected function verifyProperty($obj, $name, $secondName, $value) - { - $propName = $name; - $propGetter = "get" . ucfirst($name); - $secondGetter = "get" . ucfirst($secondName); - - $this->assertEquals($obj->$propGetter(), $obj->$propName); - $this->assertEquals($value, $obj->$propGetter()->$secondGetter()); - } - - public function createAlbum() - { - $client = $this->photos; - - $album = new Zend_Gdata_Photos_AlbumEntry(); - $album->setTitle($client->newTitle("testAlbum")); - $album->setCategory(array($client->newCategory( - 'http://schemas.google.com/photos/2007#album', - 'http://schemas.google.com/g/2005#kind'))); - - $newAlbum = $client->insertAlbumEntry($album); - $this->assertEquals($album->getTitle(), $newAlbum->getTitle()); - $this->assertEquals($newAlbum->getTitle(), $client->getAlbumEntry($newAlbum->getLink('self')->href)->getTitle()); - - $albumFeedUri = $newAlbum->getLink('http://schemas.google.com/g/2005#feed')->href; - $albumFeed = $client->getAlbumFeed($albumFeedUri); - $this->verifyProperty($albumFeed, "title", "text", "testAlbum"); - - return $newAlbum; - } - - public function createPhoto($album) - { - $client = $this->photos; - - $fd = $client->newMediaFileSource('Zend/Gdata/_files/testImage.jpg'); - $fd->setContentType('image/jpeg'); - - $photo = new Zend_Gdata_Photos_PhotoEntry(); - $photo->setMediaSource($fd); - $photo->setTitle($client->newTitle("test photo")); - $photo->setCategory(array($client->newCategory( - 'http://schemas.google.com/photos/2007#photo', - 'http://schemas.google.com/g/2005#kind'))); - - $newPhoto = $client->insertPhotoEntry($photo, $album); - $this->assertEquals($photo->getTitle(), $newPhoto->getTitle()); - $this->assertEquals($newPhoto->getTitle(), $client->getPhotoEntry($newPhoto->getLink('self')->href)->getTitle()); - - $photoFeedUri = $newPhoto->getLink('http://schemas.google.com/g/2005#feed')->href; - $photoFeed = $client->getPhotoFeed($photoFeedUri); - $this->verifyProperty($photoFeed, "title", "text", "test photo"); - - return $newPhoto; - } - - public function updatePhotoMetaData() - { - $client = $this->photos; - $album = $this->createAlbum(); - $insertedEntry = $this->createPhoto($album); - - $insertedEntry->title->text = "New Photo"; - $insertedEntry->summary->text = "Photo caption"; - $keywords = new Zend_Gdata_Media_Extension_MediaKeywords(); - $keywords->setText("foo, bar, baz"); - $insertedEntry->mediaGroup->keywords = $keywords; - - $updatedEntry = $insertedEntry->save(); - return array($updatedEntry, $album); - } - - public function createComment($photo) - { - $client = $this->photos; - - $comment = new Zend_Gdata_Photos_CommentEntry(); - $comment->setTitle($client->newTitle("test comment")); - $comment->setContent($client->newContent("test comment")); - $comment->setCategory(array($client->newCategory( - 'http://schemas.google.com/photos/2007#comment', - 'http://schemas.google.com/g/2005#kind'))); - - $newComment = $client->insertCommentEntry($comment, $photo); - $this->assertEquals($comment->getContent(), $newComment->getContent()); - $this->assertEquals($newComment->getContent(), $client->getCommentEntry($newComment->getLink('self')->href)->getContent()); - - return $newComment; - } - - public function createTag($photo) - { - $client = $this->photos; - - $tag = new Zend_Gdata_Photos_TagEntry(); - $tag->setTitle($client->newTitle("test tag")); - $tag->setContent($client->newContent("test tag")); - $tag->setCategory(array($client->newCategory( - 'http://schemas.google.com/photos/2007#tag', - 'http://schemas.google.com/g/2005#kind'))); - - $newTag = $client->insertTagEntry($tag, $photo); - $this->assertEquals($tag->getTitle(), $newTag->getTitle()); - $this->assertEquals($newTag->getTitle(), $client->getTagEntry($newTag->getLink('self')->href)->getTitle()); - - return $newTag; - } - - public function testCreateAlbumAndUploadPhoto() - { - $client = $this->photos; - $album = $this->createAlbum(); - $photo = $this->createPhoto($album); - - // Clean up the mess - $client->deletePhotoEntry($photo, true); - $client->deleteAlbumEntry($album, true); - } - - public function testUpdatePhotoMetadata() - { - $client = $this->photos; - $dataArray = $this->updatePhotoMetaData(); - $updatedPhoto = $dataArray[0]; - $album = $dataArray[1]; - - $this->assertTrue($updatedPhoto instanceof Zend_Gdata_Photos_PhotoEntry); - - // Clean up the mess - $client->deletePhotoEntry($updatedPhoto, true); - $client->deleteAlbumEntry($album, true); - } - - public function testUserFeedAndEntry() - { - $client = $this->photos; - - $userEntryUri = "http://picasaweb.google.com/data/entry/api/user/" . - constant('TESTS_ZEND_GDATA_PHOTOS_USERNAME'); - - $userEntry = $client->getUserEntry($userEntryUri); - $this->verifyProperty($userEntry, "id", "text", - "http://picasaweb.google.com/data/entry/api/user/" . - constant('TESTS_ZEND_GDATA_PHOTOS_USERNAME')); - - - $userFeed = $client->getUserFeed(constant('TESTS_ZEND_GDATA_PHOTOS_USERNAME')); - $this->verifyProperty($userFeed, "id", "text", - "http://picasaweb.google.com/data/feed/api/user/" . - constant('TESTS_ZEND_GDATA_PHOTOS_USERNAME')); - } - - public function testCreatePhotoCommentAndTag() - { - $client = $this->photos; - $album = $this->createAlbum(); - $photo = $this->createPhoto($album); - $comment = $this->createComment($photo); - $tag = $this->createTag($photo); - - // Clean up the mess - $client->deleteTagEntry($tag, true); - $client->deleteCommentEntry($comment, true); - $client->deletePhotoEntry($photo, true); - $client->deleteAlbumEntry($album, true); - } - - public function testInvalidEntryFetchingAndInserting() - { - $client = $this->photos; - - try { - $userEntry = $client->getUserEntry(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $userEntry = $client->getAlbumEntry(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $photoEntry = $client->getPhotoEntry(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $tagEntry = $client->getTagEntry(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $commentEntry = $client->getCommentEntry(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $photo = new Zend_Gdata_Photos_PhotoEntry(); - $result = $client->insertPhotoEntry($photo, null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $comment = new Zend_Gdata_Photos_CommentEntry(); - $result = $client->insertCommentEntry($comment, null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - try { - $tag = new Zend_Gdata_Photos_TagEntry(); - $result = $client->insertTagEntry($tag, null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - } - - public function testInvalidFeedFetching() - { - $client = $this->photos; - - try { - $albumFeed = $client->getAlbumFeed(null); - } catch (Exception $e) { - $this->assertTrue($e instanceof Zend_Gdata_App_InvalidArgumentException); - } - } - -} diff --git a/tests/Zend/Gdata/QueryTest.php b/tests/Zend/Gdata/QueryTest.php deleted file mode 100644 index be77f93301..0000000000 --- a/tests/Zend/Gdata/QueryTest.php +++ /dev/null @@ -1,122 +0,0 @@ -setAlt('rss'); - $this->assertEquals('rss', $query->alt); - $this->assertContains('alt=rss', $query->getQueryUrl()); - } - - public function testSetAndGetUpdatedMax() - { - $query = new Zend_Gdata_Query(); - $query->setUpdatedMax('2007-01-01'); - $this->assertEquals('2007-01-01', $query->getUpdatedMax()); - $this->assertContains('updated-max=2007-01-01', $query->getQueryUrl()); - } - - public function testSetAndGetUpdatedMin() - { - $query = new Zend_Gdata_Query(); - $query->setUpdatedMin('2007-01-01'); - $this->assertEquals('2007-01-01', $query->getUpdatedMin()); - $this->assertContains('updated-min=2007-01-01', $query->getQueryUrl()); - } - - public function testSetAndGetPublishedMax() - { - $query = new Zend_Gdata_Query(); - $query->setPublishedMax('2007-01-01'); - $this->assertEquals('2007-01-01', $query->getPublishedMax()); - $this->assertContains('published-max=2007-01-01', - $query->getQueryUrl()); - } - - public function testSetAndGetPublishedMin() - { - $query = new Zend_Gdata_Query(); - $query->setPublishedMin('2007-01-01'); - $this->assertEquals('2007-01-01', $query->getPublishedMin()); - $this->assertContains('published-min=2007-01-01', - $query->getQueryUrl()); - } - - public function testSetAndGetAuthor() - { - $query = new Zend_Gdata_Query(); - $query->setAuthor('My Name'); - $this->assertEquals('My Name', $query->getAuthor()); - $this->assertContains('author=My+Name', $query->getQueryUrl()); - } - - public function testSetAndGetMaxResults() - { - $query = new Zend_Gdata_Query(); - $query->setMaxResults('300'); - $this->assertEquals('300', $query->getMaxResults()); - $this->assertContains('max-results=300', $query->getQueryUrl()); - } - - public function testSetAndGetGenericParam() - { - $query = new Zend_Gdata_Query(); - $query->setParam('fw', 'zend'); - $this->assertEquals('zend', $query->getParam('fw')); - $this->assertContains('fw=zend', $query->getQueryUrl()); - } - - public function testSetAndGetFullTextQuery() - { - $query = new Zend_Gdata_Query(); - $query->setQuery('geek events'); - $this->assertEquals('geek events', $query->getQuery()); - $this->assertContains('q=geek+events', $query->getQueryUrl()); - } - - public function testSetAndGetStartIndex() - { - $query = new Zend_Gdata_Query(); - $query->setStartIndex(12); - $this->assertEquals(12, $query->getStartIndex()); - $this->assertContains('start-index=12', $query->getQueryUrl()); - } - -} diff --git a/tests/Zend/Gdata/RecurrenceExceptionTest.php b/tests/Zend/Gdata/RecurrenceExceptionTest.php deleted file mode 100644 index d5a15e5e5c..0000000000 --- a/tests/Zend/Gdata/RecurrenceExceptionTest.php +++ /dev/null @@ -1,129 +0,0 @@ -recurrenceExceptionText = file_get_contents( - 'Zend/Gdata/_files/RecurrenceExceptionElementSample1.xml', - true); - $this->recurrenceException = new Zend_Gdata_Extension_RecurrenceException(); - } - - public function testEmptyRecurrenceExceptionShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->recurrenceException->extensionElements)); - $this->assertTrue(count($this->recurrenceException->extensionElements) == 0); - } - - public function testEmptyRecurrenceExceptionShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->recurrenceException->extensionAttributes)); - $this->assertTrue(count($this->recurrenceException->extensionAttributes) == 0); - } - - public function testSampleRecurrenceExceptionShouldHaveNoExtensionElements() { - $this->recurrenceException->transferFromXML($this->recurrenceExceptionText); - $this->assertTrue(is_array($this->recurrenceException->extensionElements)); - $this->assertTrue(count($this->recurrenceException->extensionElements) == 0); - } - - public function testSampleRecurrenceExceptionShouldHaveNoExtensionAttributes() { - $this->recurrenceException->transferFromXML($this->recurrenceExceptionText); - $this->assertTrue(is_array($this->recurrenceException->extensionAttributes)); - $this->assertTrue(count($this->recurrenceException->extensionAttributes) == 0); - } - - public function testNormalRecurrenceExceptionShouldHaveNoExtensionElements() { - $this->recurrenceException->specialized = false; - - $this->assertEquals(false, $this->recurrenceException->specialized); - - $this->assertEquals(0, count($this->recurrenceException->extensionElements)); - $newRecurrenceException = new Zend_Gdata_Extension_RecurrenceException(); - $newRecurrenceException->transferFromXML($this->recurrenceException->saveXML()); - $this->assertEquals(0, count($newRecurrenceException->extensionElements)); - $newRecurrenceException->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newRecurrenceException->extensionElements)); - $this->assertEquals(false, $newRecurrenceException->specialized); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newRecurrenceException2 = $gdata->newRecurrenceException(); - $newRecurrenceException2->transferFromXML($newRecurrenceException->saveXML()); - $this->assertEquals(1, count($newRecurrenceException2->extensionElements)); - $this->assertEquals(false, $newRecurrenceException2->specialized); - } - - public function testEmptyRecurrenceExceptionToAndFromStringShouldMatch() { - $recurrenceExceptionXml = $this->recurrenceException->saveXML(); - $newRecurrenceException = new Zend_Gdata_Extension_RecurrenceException(); - $newRecurrenceException->transferFromXML($recurrenceExceptionXml); - $newRecurrenceExceptionXml = $newRecurrenceException->saveXML(); - $this->assertTrue($recurrenceExceptionXml == $newRecurrenceExceptionXml); - } - - public function testRecurrenceExceptionWithValueToAndFromStringShouldMatch() { - $this->recurrenceException->specialized = false; - $recurrenceExceptionXml = $this->recurrenceException->saveXML(); - $newRecurrenceException = new Zend_Gdata_Extension_RecurrenceException(); - $newRecurrenceException->transferFromXML($recurrenceExceptionXml); - $newRecurrenceExceptionXml = $newRecurrenceException->saveXML(); - $this->assertTrue($recurrenceExceptionXml == $newRecurrenceExceptionXml); - $this->assertEquals(false, $this->recurrenceException->specialized); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->recurrenceException->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->recurrenceException->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->recurrenceException->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->recurrenceException->extensionAttributes['foo2']['value']); - $recurrenceExceptionXml = $this->recurrenceException->saveXML(); - $newRecurrenceException = new Zend_Gdata_Extension_RecurrenceException(); - $newRecurrenceException->transferFromXML($recurrenceExceptionXml); - $this->assertEquals('bar', $newRecurrenceException->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newRecurrenceException->extensionAttributes['foo2']['value']); - } - - public function testConvertFullRecurrenceExceptionToAndFromString() { - $this->recurrenceException->transferFromXML($this->recurrenceExceptionText); - $this->assertEquals(true, $this->recurrenceException->specialized); - $this->assertTrue($this->recurrenceException->entryLink instanceof Zend_Gdata_Extension_EntryLink); - $this->assertEquals("http://www.google.com/calendar/feeds/default/private/full/hj4geu9lpkh3ebk6rvm4k8mhik", $this->recurrenceException->entryLink->href); - $this->assertTrue($this->recurrenceException->originalEvent instanceof Zend_Gdata_Extension_OriginalEvent); - $this->assertEquals("hj4geu9lpkh3ebk6rvm4k8mhik", $this->recurrenceException->originalEvent->id); - } - -} diff --git a/tests/Zend/Gdata/RecurrenceTest.php b/tests/Zend/Gdata/RecurrenceTest.php deleted file mode 100644 index e03f02a932..0000000000 --- a/tests/Zend/Gdata/RecurrenceTest.php +++ /dev/null @@ -1,125 +0,0 @@ -recurrenceText = file_get_contents( - 'Zend/Gdata/_files/RecurrenceElementSample1.xml', - true); - $this->recurrence = new Zend_Gdata_Extension_Recurrence(); - } - - public function testEmptyRecurrenceShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->recurrence->extensionElements)); - $this->assertTrue(count($this->recurrence->extensionElements) == 0); - } - - public function testEmptyRecurrenceShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->recurrence->extensionAttributes)); - $this->assertTrue(count($this->recurrence->extensionAttributes) == 0); - } - - public function testSampleRecurrenceShouldHaveNoExtensionElements() { - $this->recurrence->transferFromXML($this->recurrenceText); - $this->assertTrue(is_array($this->recurrence->extensionElements)); - $this->assertTrue(count($this->recurrence->extensionElements) == 0); - } - - public function testSampleRecurrenceShouldHaveNoExtensionAttributes() { - $this->recurrence->transferFromXML($this->recurrenceText); - $this->assertTrue(is_array($this->recurrence->extensionAttributes)); - $this->assertTrue(count($this->recurrence->extensionAttributes) == 0); - } - - public function testNormalRecurrenceShouldHaveNoExtensionElements() { - $this->recurrence->text = "Foo"; - - $this->assertEquals("Foo", $this->recurrence->text); - - $this->assertEquals(0, count($this->recurrence->extensionElements)); - $newRecurrence = new Zend_Gdata_Extension_Recurrence(); - $newRecurrence->transferFromXML($this->recurrence->saveXML()); - $this->assertEquals(0, count($newRecurrence->extensionElements)); - $newRecurrence->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newRecurrence->extensionElements)); - $this->assertEquals("Foo", $newRecurrence->text); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newRecurrence2 = $gdata->newRecurrence(); - $newRecurrence2->transferFromXML($newRecurrence->saveXML()); - $this->assertEquals(1, count($newRecurrence2->extensionElements)); - $this->assertEquals("Foo", $newRecurrence2->text); - } - - public function testEmptyRecurrenceToAndFromStringShouldMatch() { - $recurrenceXml = $this->recurrence->saveXML(); - $newRecurrence = new Zend_Gdata_Extension_Recurrence(); - $newRecurrence->transferFromXML($recurrenceXml); - $newRecurrenceXml = $newRecurrence->saveXML(); - $this->assertTrue($recurrenceXml == $newRecurrenceXml); - } - - public function testRecurrenceWithValueToAndFromStringShouldMatch() { - $this->recurrence->text = "Foo"; - $recurrenceXml = $this->recurrence->saveXML(); - $newRecurrence = new Zend_Gdata_Extension_Recurrence(); - $newRecurrence->transferFromXML($recurrenceXml); - $newRecurrenceXml = $newRecurrence->saveXML(); - $this->assertTrue($recurrenceXml == $newRecurrenceXml); - $this->assertEquals("Foo", $this->recurrence->text); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->recurrence->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->recurrence->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->recurrence->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->recurrence->extensionAttributes['foo2']['value']); - $recurrenceXml = $this->recurrence->saveXML(); - $newRecurrence = new Zend_Gdata_Extension_Recurrence(); - $newRecurrence->transferFromXML($recurrenceXml); - $this->assertEquals('bar', $newRecurrence->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newRecurrence->extensionAttributes['foo2']['value']); - } - - public function testConvertFullRecurrenceToAndFromString() { - $this->recurrence->transferFromXML($this->recurrenceText); - $this->assertEquals("DTSTART;VALUE=DATE:20070501\nDTEND;VALUE=DATE:20070502\nRRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904", $this->recurrence->text); - } - -} diff --git a/tests/Zend/Gdata/ReminderTest.php b/tests/Zend/Gdata/ReminderTest.php deleted file mode 100644 index c7031b4a50..0000000000 --- a/tests/Zend/Gdata/ReminderTest.php +++ /dev/null @@ -1,153 +0,0 @@ -reminderText = file_get_contents( - 'Zend/Gdata/_files/ReminderElementSample1.xml', - true); - $this->reminder = new Zend_Gdata_Extension_Reminder(); - } - - public function testEmptyReminderShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->reminder->extensionElements)); - $this->assertTrue(count($this->reminder->extensionElements) == 0); - } - - public function testEmptyReminderShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->reminder->extensionAttributes)); - $this->assertTrue(count($this->reminder->extensionAttributes) == 0); - } - - public function testSampleReminderShouldHaveNoExtensionElements() { - $this->reminder->transferFromXML($this->reminderText); - $this->assertTrue(is_array($this->reminder->extensionElements)); - $this->assertTrue(count($this->reminder->extensionElements) == 0); - } - - public function testSampleReminderShouldHaveNoExtensionAttributes() { - $this->reminder->transferFromXML($this->reminderText); - $this->assertTrue(is_array($this->reminder->extensionAttributes)); - $this->assertTrue(count($this->reminder->extensionAttributes) == 0); - } - - public function testNormalReminderShouldHaveNoExtensionElements() { - $this->reminder->days = "12"; - $this->reminder->minutes = "64"; - $this->reminder->absoluteTime = "2007-06-19T12:42:19-06:00"; - $this->reminder->method = "email"; - $this->reminder->hours = "80"; - - $this->assertEquals("12", $this->reminder->days); - $this->assertEquals("64", $this->reminder->minutes); - $this->assertEquals("2007-06-19T12:42:19-06:00", $this->reminder->absoluteTime); - $this->assertEquals("email", $this->reminder->method); - $this->assertEquals("80", $this->reminder->hours); - - $this->assertEquals(0, count($this->reminder->extensionElements)); - $newReminder = new Zend_Gdata_Extension_Reminder(); - $newReminder->transferFromXML($this->reminder->saveXML()); - $this->assertEquals(0, count($newReminder->extensionElements)); - $newReminder->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newReminder->extensionElements)); - $this->assertEquals("12", $newReminder->days); - $this->assertEquals("64", $newReminder->minutes); - $this->assertEquals("2007-06-19T12:42:19-06:00", $newReminder->absoluteTime); - $this->assertEquals("email", $newReminder->method); - $this->assertEquals("80", $newReminder->hours); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newReminder2 = $gdata->newReminder(); - $newReminder2->transferFromXML($newReminder->saveXML()); - $this->assertEquals(1, count($newReminder2->extensionElements)); - $this->assertEquals("12", $newReminder2->days); - $this->assertEquals("64", $newReminder2->minutes); - $this->assertEquals("2007-06-19T12:42:19-06:00", $newReminder2->absoluteTime); - $this->assertEquals("email", $newReminder2->method); - $this->assertEquals("80", $newReminder2->hours); - } - - public function testEmptyReminderToAndFromStringShouldMatch() { - $reminderXml = $this->reminder->saveXML(); - $newReminder = new Zend_Gdata_Extension_Reminder(); - $newReminder->transferFromXML($reminderXml); - $newReminderXml = $newReminder->saveXML(); - $this->assertTrue($reminderXml == $newReminderXml); - } - - public function testReminderWithValueToAndFromStringShouldMatch() { - $this->reminder->days = "12"; - $this->reminder->minutes = "64"; - $this->reminder->absoluteTime = "2007-06-19T12:42:19-06:00"; - $this->reminder->method = "email"; - $this->reminder->hours = "80"; - $reminderXml = $this->reminder->saveXML(); - $newReminder = new Zend_Gdata_Extension_Reminder(); - $newReminder->transferFromXML($reminderXml); - $newReminderXml = $newReminder->saveXML(); - $this->assertTrue($reminderXml == $newReminderXml); - $this->assertEquals("12", $this->reminder->days); - $this->assertEquals("64", $this->reminder->minutes); - $this->assertEquals("2007-06-19T12:42:19-06:00", $this->reminder->absoluteTime); - $this->assertEquals("email", $this->reminder->method); - $this->assertEquals("80", $this->reminder->hours); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->reminder->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->reminder->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->reminder->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->reminder->extensionAttributes['foo2']['value']); - $reminderXml = $this->reminder->saveXML(); - $newReminder = new Zend_Gdata_Extension_Reminder(); - $newReminder->transferFromXML($reminderXml); - $this->assertEquals('bar', $newReminder->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newReminder->extensionAttributes['foo2']['value']); - } - - public function testConvertFullReminderToAndFromString() { - $this->reminder->transferFromXML($this->reminderText); - $this->assertEquals("42", $this->reminder->days); - $this->assertEquals("50", $this->reminder->minutes); - $this->assertEquals("2005-06-06T16:55:00-08:00", $this->reminder->absoluteTime); - $this->assertEquals("sms", $this->reminder->method); - $this->assertEquals("20", $this->reminder->hours); - } - -} diff --git a/tests/Zend/Gdata/SkipTests.php b/tests/Zend/Gdata/SkipTests.php deleted file mode 100644 index 2dced86394..0000000000 --- a/tests/Zend/Gdata/SkipTests.php +++ /dev/null @@ -1,55 +0,0 @@ -markTestSkipped("Zend_Gdata online tests are not enabled in TestConfiguration.php"); - } - - public function testOnline() - { - // this is here only so we have at least one test - } -} - -class Zend_Gdata_SkipClientLoginTest extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped("Zend_Gdata authenticated tests are not enabled in TestConfiguration.php"); - } - - public function testClientLogin() - { - // this is here only so we have at least one test - } -} diff --git a/tests/Zend/Gdata/Spreadsheets/CellEntryTest.php b/tests/Zend/Gdata/Spreadsheets/CellEntryTest.php deleted file mode 100644 index 11188230cb..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/CellEntryTest.php +++ /dev/null @@ -1,64 +0,0 @@ -cellEntry = new Zend_Gdata_Spreadsheets_CellEntry(); - } - - public function testToAndFromString() - { - $this->cellEntry->setCell(new Zend_Gdata_Spreadsheets_Extension_Cell('my cell', '1', '2', 'input value', 'numeric value')); - $this->assertTrue($this->cellEntry->getCell()->getText() == 'my cell'); - $this->assertTrue($this->cellEntry->getCell()->getRow() == '1'); - $this->assertTrue($this->cellEntry->getCell()->getColumn() == '2'); - $this->assertTrue($this->cellEntry->getCell()->getInputValue() == 'input value'); - $this->assertTrue($this->cellEntry->getCell()->getNumericValue() == 'numeric value'); - - $newCellEntry = new Zend_Gdata_Spreadsheets_CellEntry(); - $doc = new DOMDocument(); - $doc->loadXML($this->cellEntry->saveXML()); - $newCellEntry->transferFromDom($doc->documentElement); - - $this->assertTrue($this->cellEntry->getCell()->getText() == $newCellEntry->getCell()->getText()); - $this->assertTrue($this->cellEntry->getCell()->getRow() == $newCellEntry->getCell()->getRow()); - $this->assertTrue($this->cellEntry->getCell()->getColumn() == $newCellEntry->getCell()->getColumn()); - $this->assertTrue($this->cellEntry->getCell()->getInputValue() == $newCellEntry->getCell()->getInputValue()); - $this->assertTrue($this->cellEntry->getCell()->getNumericValue() == $newCellEntry->getCell()->getNumericValue()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/CellFeedTest.php b/tests/Zend/Gdata/Spreadsheets/CellFeedTest.php deleted file mode 100644 index a0d7f41bdb..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/CellFeedTest.php +++ /dev/null @@ -1,91 +0,0 @@ -cellFeed = new Zend_Gdata_Spreadsheets_CellFeed( - file_get_contents('Zend/Gdata/Spreadsheets/_files/TestDataCellFeedSample1.xml', true), - true); - } - - public function testToAndFromString() - { - $this->assertTrue(count($this->cellFeed->entries) == 2); - $this->assertTrue($this->cellFeed->entries->count() == 2); - - foreach($this->cellFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - } - $this->assertTrue($this->cellFeed->getRowCount() instanceof Zend_Gdata_Spreadsheets_Extension_RowCount); - $this->assertTrue($this->cellFeed->getRowCount()->getText() == '100'); - $this->assertTrue($this->cellFeed->getColumnCount() instanceof Zend_Gdata_Spreadsheets_Extension_ColCount); - $this->assertTrue($this->cellFeed->getColumnCount()->getText() == '20'); - - $newCellFeed = new Zend_Gdata_Spreadsheets_CellFeed(); - $doc = new DOMDocument(); - $doc->loadXML($this->cellFeed->saveXML()); - $newCellFeed->transferFromDom($doc->documentElement); - - $this->assertTrue(count($newCellFeed->entries) == 2); - $this->assertTrue($newCellFeed->entries->count() == 2); - - foreach($newCellFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - } - $this->assertTrue($newCellFeed->getRowCount() instanceof Zend_Gdata_Spreadsheets_Extension_RowCount); - $this->assertTrue($newCellFeed->getRowCount()->getText() == '100'); - $this->assertTrue($newCellFeed->getColumnCount() instanceof Zend_Gdata_Spreadsheets_Extension_ColCount); - $this->assertTrue($newCellFeed->getColumnCount()->getText() == '20'); - } - - public function testGetSetCounts() - { - $newRowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); - $newRowCount->setText("20"); - $newColCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); - $newColCount->setText("50"); - - $this->cellFeed->setRowCount($newRowCount); - $this->cellFeed->setColumnCount($newColCount); - - $this->assertTrue($this->cellFeed->getRowCount()->getText() == "20"); - $this->assertTrue($this->cellFeed->getColumnCount()->getText() == "50"); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/CellQueryTest.php b/tests/Zend/Gdata/Spreadsheets/CellQueryTest.php deleted file mode 100644 index 8529538a85..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/CellQueryTest.php +++ /dev/null @@ -1,138 +0,0 @@ -docQuery = new Zend_Gdata_Spreadsheets_CellQuery(); - } - - public function testMinRow() - { - $this->assertTrue($this->docQuery->getMinRow() == null); - $this->docQuery->setMinRow('1'); - $this->assertTrue($this->docQuery->getMinRow() == '1'); - $this->assertTrue($this->docQuery->getQueryString() == '?min-row=1'); - $this->docQuery->setMinRow(null); - $this->assertTrue($this->docQuery->getMinRow() == null); - } - - public function testMaxRow() - { - $this->assertTrue($this->docQuery->getMaxRow() == null); - $this->docQuery->setMaxRow('2'); - $this->assertTrue($this->docQuery->getMaxRow() == '2'); - $this->assertTrue($this->docQuery->getQueryString() == '?max-row=2'); - $this->docQuery->setMaxRow(null); - $this->assertTrue($this->docQuery->getMaxRow() == null); - } - - public function testMinCol() - { - $this->assertTrue($this->docQuery->getMinCol() == null); - $this->docQuery->setMinCol('3'); - $this->assertTrue($this->docQuery->getMinCol() == '3'); - $this->assertTrue($this->docQuery->getQueryString() == '?min-col=3'); - $this->docQuery->setMinCol(null); - $this->assertTrue($this->docQuery->getMinCol() == null); - } - - public function testMaxCol() - { - $this->assertTrue($this->docQuery->getMaxCol() == null); - $this->docQuery->setMaxCol('4'); - $this->assertTrue($this->docQuery->getMaxCol() == '4'); - $this->assertTrue($this->docQuery->getQueryString() == '?max-col=4'); - $this->docQuery->setMaxCol(null); - $this->assertTrue($this->docQuery->getMaxCol() == null); - } - - public function testRange() - { - $this->assertTrue($this->docQuery->getRange() == null); - $this->docQuery->setRange('A1:B4'); - $this->assertTrue($this->docQuery->getRange() == 'A1:B4'); - $this->assertTrue($this->docQuery->getQueryString() == '?range=A1%3AB4'); - $this->docQuery->setRange(null); - $this->assertTrue($this->docQuery->getRange() == null); - } - - public function testReturnEmpty() - { - $this->assertTrue($this->docQuery->getReturnEmpty() == null); - $this->docQuery->setReturnEmpty('false'); - $this->assertTrue($this->docQuery->getReturnEmpty() == 'false'); - $this->assertTrue($this->docQuery->getQueryString() == '?return-empty=false'); - $this->docQuery->setReturnEmpty(null); - $this->assertTrue($this->docQuery->getReturnEmpty() == null); - } - - public function testWorksheetId() - { - $this->assertTrue($this->docQuery->getWorksheetId() == 'default'); - $this->docQuery->setWorksheetId('123'); - $this->assertTrue($this->docQuery->getWorksheetId() == '123'); - } - - public function testSpreadsheetKey() - { - $this->assertTrue($this->docQuery->getSpreadsheetKey() == null); - $this->docQuery->setSpreadsheetKey('abc'); - $this->assertTrue($this->docQuery->getSpreadsheetKey() == 'abc'); - } - - public function testCellId() - { - $this->assertTrue($this->docQuery->getCellId() == null); - $this->docQuery->setCellId('xyz'); - $this->assertTrue($this->docQuery->getCellId() == 'xyz'); - } - - public function testProjection() - { - $this->assertTrue($this->docQuery->getProjection() == 'full'); - $this->docQuery->setProjection('abc'); - $this->assertTrue($this->docQuery->getProjection() == 'abc'); - } - - public function testVisibility() - { - $this->assertTrue($this->docQuery->getVisibility() == 'private'); - $this->docQuery->setVisibility('xyz'); - $this->assertTrue($this->docQuery->getVisibility() == 'xyz'); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/CellTest.php b/tests/Zend/Gdata/Spreadsheets/CellTest.php deleted file mode 100644 index c3c78367e7..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/CellTest.php +++ /dev/null @@ -1,67 +0,0 @@ -cell = new Zend_Gdata_Spreadsheets_Extension_Cell(); - } - - public function testToAndFromString() - { - $this->cell->setText('test cell'); - $this->assertTrue($this->cell->getText() == 'test cell'); - $this->cell->setRow('1'); - $this->assertTrue($this->cell->getRow() == '1'); - $this->cell->setColumn('2'); - $this->assertTrue($this->cell->getColumn() == '2'); - $this->cell->setInputValue('test input value'); - $this->assertTrue($this->cell->getInputValue() == 'test input value'); - $this->cell->setNumericValue('test numeric value'); - $this->assertTrue($this->cell->getNumericValue() == 'test numeric value'); - - $newCell = new Zend_Gdata_Spreadsheets_Extension_Cell(); - $doc = new DOMDocument(); - $doc->loadXML($this->cell->saveXML()); - $newCell->transferFromDom($doc->documentElement); - $this->assertTrue($this->cell->getText() == $newCell->getText()); - $this->assertTrue($this->cell->getRow() == $newCell->getRow()); - $this->assertTrue($this->cell->getColumn() == $newCell->getColumn()); - $this->assertTrue($this->cell->getInputValue() == $newCell->getInputValue()); - $this->assertTrue($this->cell->getNumericValue() == $newCell->getNumericValue()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/ColCountTest.php b/tests/Zend/Gdata/Spreadsheets/ColCountTest.php deleted file mode 100644 index 0a37969e56..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/ColCountTest.php +++ /dev/null @@ -1,54 +0,0 @@ -colCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); - } - - public function testToAndFromString() - { - $this->colCount->setText('20'); - $this->assertTrue($this->colCount->getText() == '20'); - $newColCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); - $doc = new DOMDocument(); - $doc->loadXML($this->colCount->saveXML()); - $newColCount->transferFromDom($doc->documentElement); - $this->assertTrue($this->colCount->getText() == $newColCount->getText()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/CustomTest.php b/tests/Zend/Gdata/Spreadsheets/CustomTest.php deleted file mode 100644 index bee1ed08cc..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/CustomTest.php +++ /dev/null @@ -1,57 +0,0 @@ -custom = new Zend_Gdata_Spreadsheets_Extension_Custom(); - } - - public function testToAndFromString() - { - $this->custom->setText('value'); - $this->assertTrue($this->custom->getText() == 'value'); - $this->custom->setColumnName('column_name'); - $this->assertTrue($this->custom->getColumnName() == 'column_name'); - $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom(); - $doc = new DOMDocument(); - $doc->loadXML($this->custom->saveXML()); - $newCustom->transferFromDom($doc->documentElement); - $this->assertTrue($this->custom->getText() == $newCustom->getText()); - $this->assertTrue($this->custom->getColumnName() == $newCustom->getColumnName()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/DocumentQueryTest.php b/tests/Zend/Gdata/Spreadsheets/DocumentQueryTest.php deleted file mode 100644 index dfc668863a..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/DocumentQueryTest.php +++ /dev/null @@ -1,91 +0,0 @@ -docQuery = new Zend_Gdata_Spreadsheets_DocumentQuery(); - } - - public function testTitle() - { - $this->assertTrue($this->docQuery->getTitle() == null); - $this->docQuery->setTitle('test title'); - $this->assertTrue($this->docQuery->getTitle() == 'test title'); - $this->assertTrue($this->docQuery->getQueryString() == '?title=test+title'); - $this->docQuery->setTitle(null); - $this->assertTrue($this->docQuery->getTitle() == null); - } - - public function testTitleExact() - { - $this->assertTrue($this->docQuery->getTitleExact() == null); - $this->docQuery->setTitleExact('test title'); - $this->assertTrue($this->docQuery->getTitleExact() == 'test title'); - $this->assertTrue($this->docQuery->getQueryString() == '?title-exact=test+title'); - $this->docQuery->setTitleExact(null); - $this->assertTrue($this->docQuery->getTitleExact() == null); - } - - public function testWorksheetId() - { - $this->assertTrue($this->docQuery->getWorksheetId() == null); - $this->docQuery->setWorksheetId('123'); - $this->assertTrue($this->docQuery->getWorksheetId() == '123'); - } - - public function testSpreadsheetKey() - { - $this->assertTrue($this->docQuery->getSpreadsheetKey() == null); - $this->docQuery->setSpreadsheetKey('abc'); - $this->assertTrue($this->docQuery->getSpreadsheetKey() == 'abc'); - } - - public function testProjection() - { - $this->assertTrue($this->docQuery->getProjection() == 'full'); - $this->docQuery->setProjection('abc'); - $this->assertTrue($this->docQuery->getProjection() == 'abc'); - } - - public function testVisibility() - { - $this->assertTrue($this->docQuery->getVisibility() == 'private'); - $this->docQuery->setVisibility('xyz'); - $this->assertTrue($this->docQuery->getVisibility() == 'xyz'); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/ListEntryTest.php b/tests/Zend/Gdata/Spreadsheets/ListEntryTest.php deleted file mode 100644 index efba7181c3..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/ListEntryTest.php +++ /dev/null @@ -1,225 +0,0 @@ -listEntry = new Zend_Gdata_Spreadsheets_ListEntry(); - $this->rowData = array(); - $this->rowData[] = new Zend_Gdata_Spreadsheets_Extension_Custom( - 'column_1', 'value 1'); - $this->rowData[] = new Zend_Gdata_Spreadsheets_Extension_Custom( - 'column_2', 'value 2'); - } - - public function testToAndFromString() - { - $this->listEntry->setCustom($this->rowData); - $rowDataOut = $this->listEntry->getCustom(); - - $this->assertEquals(count($this->rowData), count($rowDataOut)); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i]->getText(), - $rowDataOut[$i]->getText()); - $this->assertEquals($this->rowData[$i]->getColumnName(), - $rowDataOut[$i]->getColumnName()); - } - - $newListEntry = new Zend_Gdata_Spreadsheets_ListEntry(); - $doc = new DOMDocument(); - $doc->loadXML($this->listEntry->saveXML()); - $newListEntry->transferFromDom($doc->documentElement); - $rowDataFromXML = $newListEntry->getCustom(); - - $this->assertEquals(count($this->rowData), count($rowDataFromXML)); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i]->getText(), - $rowDataFromXML[$i]->getText()); - $this->assertEquals($this->rowData[$i]->getColumnName(), - $rowDataFromXML[$i]->getColumnName()); - } - } - - public function testCustomElementOrderingPreserved() - { - $this->listEntry->setCustom($this->rowData); - - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i], - $this->listEntry->custom[$i]); - } - } - - public function testCustomElementsCanBeRetrievedByName() - { - $this->listEntry->setCustom($this->rowData); - - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i], - $this->listEntry->getCustomByName( - $this->rowData[$i]->getColumnName())); - } - } - - public function testCustomElementsCanBeRetrievedByNameUsingArrayNotation() - { - $this->listEntry->setCustom($this->rowData); - - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i], - $this->listEntry->getCustomByName( - $this->rowData[$i]->getColumnName())); - } - } - - public function testCanAddIndividualCustomElements() - { - for ($i = 0; $i < count($this->rowData); $i++) { - $this->listEntry->addCustom($this->rowData[$i]); - } - - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - for ($i = 0; $i < count($this->rowData); $i++) { - $this->assertEquals($this->rowData[$i], - $this->listEntry->custom[$i]); - } - } - - public function testRetrievingNonexistantCustomElementReturnsNull() - { - $this->assertNull($this->listEntry->getCustomByName('nonexistant')); - } - - public function testCanReplaceAllCustomElements() - { - $this->listEntry->setCustom($this->rowData); - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - $this->listEntry->setCustom(array()); - $this->assertEquals(0, count($this->listEntry->getCustom())); - } - - public function testCanDeleteCustomElementById() - { - $this->listEntry->setCustom($this->rowData); - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - $this->assertEquals($this->rowData[0], $this->listEntry->custom[0]); - - $this->listEntry->removeCustom(0); - $this->assertEquals(count($this->rowData) - 1, - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - $this->assertEquals($this->rowData[1], $this->listEntry->custom[0]); - } - - public function testCanDeleteCustomElementByName() - { - $this->listEntry->setCustom($this->rowData); - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - $this->assertEquals($this->rowData[0], - $this->listEntry->getCustomByName( - $this->rowData[0]->getColumnName())); - - $this->listEntry->removeCustomByName('column_1'); - $this->assertEquals(count($this->rowData) - 1, - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - $this->assertNull($this->listEntry->getCustomByName( - $this->rowData[0]->getColumnName())); - } - - public function testDeletingNonexistantElementByIdThrowsException() - { - $this->listEntry->setCustom($this->rowData); - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - - $exceptionCaught = false; - try { - $this->listEntry->removeCustom(9999); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - $exceptionCaught = true; - $this->assertEquals('Element does not exist.', $e->getMessage()); - } - $this->assertTrue($exceptionCaught); - } - - public function testDeletingNonexistantElementByNameThrowsException() - { - $this->listEntry->setCustom($this->rowData); - $this->assertEquals(count($this->rowData), - count($this->listEntry->getCustom())); - $this->assertEquals(count($this->listEntry->getCustom()), - count($this->listEntry->getCustomByName())); - - $exceptionCaught = false; - try { - $this->listEntry->removeCustomByName('nonexistant'); - } catch (Zend_Gdata_App_InvalidArgumentException $e) { - $exceptionCaught = true; - $this->assertEquals('Element does not exist.', $e->getMessage()); - } - $this->assertTrue($exceptionCaught); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/ListFeedTest.php b/tests/Zend/Gdata/Spreadsheets/ListFeedTest.php deleted file mode 100644 index 5aea35235f..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/ListFeedTest.php +++ /dev/null @@ -1,68 +0,0 @@ -listFeed = new Zend_Gdata_Spreadsheets_ListFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestDataListFeedSample1.xml'), - true); - } - - public function testToAndFromString() - { - $this->assertTrue(count($this->listFeed->entries) == 2); - $this->assertTrue($this->listFeed->entries->count() == 2); - foreach($this->listFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - } - - $newListFeed = new Zend_Gdata_Spreadsheets_ListFeed(); - $doc = new DOMDocument(); - $doc->loadXML($this->listFeed->saveXML()); - $newListFeed->transferFromDom($doc->documentElement); - - $this->assertTrue(count($newListFeed->entries) == 2); - $this->assertTrue($newListFeed->entries->count() == 2); - foreach($newListFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - } - - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/ListQueryTest.php b/tests/Zend/Gdata/Spreadsheets/ListQueryTest.php deleted file mode 100644 index 394612e74d..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/ListQueryTest.php +++ /dev/null @@ -1,109 +0,0 @@ -docQuery = new Zend_Gdata_Spreadsheets_ListQuery(); - } - - public function testWorksheetId() - { - $this->assertTrue($this->docQuery->getWorksheetId() == 'default'); - $this->docQuery->setWorksheetId('123'); - $this->assertTrue($this->docQuery->getWorksheetId() == '123'); - } - - public function testSpreadsheetKey() - { - $this->assertTrue($this->docQuery->getSpreadsheetKey() == null); - $this->docQuery->setSpreadsheetKey('abc'); - $this->assertTrue($this->docQuery->getSpreadsheetKey() == 'abc'); - } - - public function testRowId() - { - $this->assertTrue($this->docQuery->getRowId() == null); - $this->docQuery->setRowId('xyz'); - $this->assertTrue($this->docQuery->getRowId() == 'xyz'); - } - - public function testProjection() - { - $this->assertTrue($this->docQuery->getProjection() == 'full'); - $this->docQuery->setProjection('abc'); - $this->assertTrue($this->docQuery->getProjection() == 'abc'); - } - - public function testVisibility() - { - $this->assertTrue($this->docQuery->getVisibility() == 'private'); - $this->docQuery->setVisibility('xyz'); - $this->assertTrue($this->docQuery->getVisibility() == 'xyz'); - } - - public function testSpreadsheetQuery() - { - $this->assertTrue($this->docQuery->getSpreadsheetQuery() == null); - $this->docQuery->setSpreadsheetQuery('first=john&last=smith'); - $this->assertTrue($this->docQuery->getSpreadsheetQuery() == 'first=john&last=smith'); - $this->assertTrue($this->docQuery->getQueryString() == '?sq=first%3Djohn%26last%3Dsmith'); - $this->docQuery->setSpreadsheetQuery(null); - $this->assertTrue($this->docQuery->getSpreadsheetQuery() == null); - } - - - public function testOrderBy() - { - $this->assertTrue($this->docQuery->getOrderBy() == null); - $this->docQuery->setOrderBy('column:first'); - $this->assertTrue($this->docQuery->getOrderBy() == 'column:first'); - $this->assertTrue($this->docQuery->getQueryString() == '?orderby=column%3Afirst'); - $this->docQuery->setOrderBy(null); - $this->assertTrue($this->docQuery->getOrderBy() == null); - } - - public function testReverse() - { - $this->assertTrue($this->docQuery->getReverse() == null); - $this->docQuery->setReverse('true'); - $this->assertTrue($this->docQuery->getReverse() == 'true'); - $this->assertTrue($this->docQuery->getQueryString() == '?reverse=true'); - $this->docQuery->setReverse(null); - $this->assertTrue($this->docQuery->getReverse() == null); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/RowCountTest.php b/tests/Zend/Gdata/Spreadsheets/RowCountTest.php deleted file mode 100644 index e1f2b98b7e..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/RowCountTest.php +++ /dev/null @@ -1,54 +0,0 @@ -rowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); - } - - public function testToAndFromString() - { - $this->rowCount->setText('20'); - $this->assertTrue($this->rowCount->getText() == '20'); - $newRowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); - $doc = new DOMDocument(); - $doc->loadXML($this->rowCount->saveXML()); - $newRowCount->transferFromDom($doc->documentElement); - $this->assertTrue($this->rowCount->getText() == $newRowCount->getText()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/SpreadsheetFeedTest.php b/tests/Zend/Gdata/Spreadsheets/SpreadsheetFeedTest.php deleted file mode 100644 index 6337769e19..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/SpreadsheetFeedTest.php +++ /dev/null @@ -1,65 +0,0 @@ -sprFeed = new Zend_Gdata_Spreadsheets_SpreadsheetFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestDataSpreadsheetFeedSample1.xml'), - true); - } - - public function testToAndFromString() - { - $this->assertTrue(count($this->sprFeed->entries) == 1); - foreach($this->sprFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - } - - $newSprFeed = new Zend_Gdata_Spreadsheets_SpreadsheetFeed(); - $doc = new DOMDocument(); - $doc->loadXML($this->sprFeed->saveXML()); - $newSprFeed->transferFromDom($doc->documentElement); - - $this->assertTrue(count($newSprFeed->entries) == 1); - foreach($newSprFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - } - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/WorksheetEntryTest.php b/tests/Zend/Gdata/Spreadsheets/WorksheetEntryTest.php deleted file mode 100644 index ee8c89b206..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/WorksheetEntryTest.php +++ /dev/null @@ -1,57 +0,0 @@ -wksEntry = new Zend_Gdata_Spreadsheets_WorksheetEntry(); - } - - public function testToAndFromString() - { - $this->wksEntry->setRowCount(new Zend_Gdata_Spreadsheets_Extension_RowCount('20')); - $this->assertTrue($this->wksEntry->getRowCount()->getText() == '20'); - $this->wksEntry->setColumnCount(new Zend_Gdata_Spreadsheets_Extension_ColCount('40')); - $this->assertTrue($this->wksEntry->getColumnCount()->getText() == '40'); - $newWksEntry = new Zend_Gdata_Spreadsheets_WorksheetEntry(); - $doc = new DOMDocument(); - $doc->loadXML($this->wksEntry->saveXML()); - $newWksEntry->transferFromDom($doc->documentElement); - $this->assertTrue($this->wksEntry->getRowCount()->getText() == $newWksEntry->getRowCount()->getText()); - $this->assertTrue($this->wksEntry->getColumnCount()->getText() == $newWksEntry->getColumnCount()->getText()); - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/WorksheetFeedTest.php b/tests/Zend/Gdata/Spreadsheets/WorksheetFeedTest.php deleted file mode 100644 index 7f1fa6c2c7..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/WorksheetFeedTest.php +++ /dev/null @@ -1,65 +0,0 @@ -wksFeed = new Zend_Gdata_Spreadsheets_WorksheetFeed( - file_get_contents(dirname(__FILE__) . '/_files/TestDataWorksheetFeedSample1.xml'), - true); - } - - public function testToAndFromString() - { - $this->assertTrue(count($this->wksFeed->entries) == 1); - foreach($this->wksFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - } - - $newWksFeed = new Zend_Gdata_Spreadsheets_WorksheetFeed(); - $doc = new DOMDocument(); - $doc->loadXML($this->wksFeed->saveXML()); - $newWksFeed->transferFromDom($doc->documentElement); - - $this->assertTrue(count($newWksFeed->entries) == 1); - foreach($newWksFeed->entries as $entry) - { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - } - } - -} diff --git a/tests/Zend/Gdata/Spreadsheets/_files/TestDataCellFeedSample1.xml b/tests/Zend/Gdata/Spreadsheets/_files/TestDataCellFeedSample1.xml deleted file mode 100644 index e40a0c3cd6..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/_files/TestDataCellFeedSample1.xml +++ /dev/null @@ -1,49 +0,0 @@ - - http://spreadsheets.google.com/feeds/cells/key/od6/private/full - 2006-11-17T18:27:32.543Z - Sheet1 - - - - - - Fitzwilliam Darcy - fitz@gmail.com - - 1 - 1 - 100 - 20 - - http://spreadsheets.google.com/feeds/cells/key/od6/private/full/R1C1 - 2006-11-17T18:27:32.543Z - - A1 - Name - - - Name - - - http://spreadsheets.google.com/feeds/cells/key/od6/private/full/R1C2 - 2006-11-17T18:27:32.543Z - - B1 - Hours - - - Hours - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Spreadsheets/_files/TestDataListFeedSample1.xml b/tests/Zend/Gdata/Spreadsheets/_files/TestDataListFeedSample1.xml deleted file mode 100644 index 1f8212b9bf..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/_files/TestDataListFeedSample1.xml +++ /dev/null @@ -1,56 +0,0 @@ - - http://spreadsheets.google.com/feeds/list/key/od6/private/full - 2006-11-17T18:23:45.173Z - Sheet1 - - - - - - Fitzwilliam Darcy - fitz@gmail.com - - 2 - 1 - 2 - - http://spreadsheets.google.com/feeds/list/key/od6/private/full/cokwr - 2006-11-17T18:23:45.173Z - - Bingley - Hours: 10, Items: 2, IPM: 0.0033 - - - Bingley - 10 - 2 - 0.0033 - - - http://spreadsheets.google.com/feeds/list/key/od6/private/full/cyevm - 2006-11-17T18:23:45.173Z - - Charlotte - Hours: 60, Items: 18000, IPM: 5 - - - Charlotte - 60 - 18000 - 5 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Spreadsheets/_files/TestDataSpreadsheetFeedSample1.xml b/tests/Zend/Gdata/Spreadsheets/_files/TestDataSpreadsheetFeedSample1.xml deleted file mode 100644 index b069efc1e2..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/_files/TestDataSpreadsheetFeedSample1.xml +++ /dev/null @@ -1,38 +0,0 @@ - - http://spreadsheets.google.com/feeds/spreadsheets/private/full - 2006-11-17T18:23:45.173Z - Available Spreadsheets - - - - - Fitzwilliam Darcy - fitz@gmail.com - - 1 - 1 - 1 - - http://spreadsheets.google.com/feeds/spreadsheets/private/full/key - 2006-11-17T18:24:18.231Z - Groceries R Us - Groceries R Us - - - - - Fitzwilliam Darcy - fitz@gmail.com - - - \ No newline at end of file diff --git a/tests/Zend/Gdata/Spreadsheets/_files/TestDataWorksheetFeedSample1.xml b/tests/Zend/Gdata/Spreadsheets/_files/TestDataWorksheetFeedSample1.xml deleted file mode 100644 index d86afca4cf..0000000000 --- a/tests/Zend/Gdata/Spreadsheets/_files/TestDataWorksheetFeedSample1.xml +++ /dev/null @@ -1,37 +0,0 @@ - - http://spreadsheets.google.com/feeds/worksheets/key/private/full - 2006-11-17T18:23:45.173Z - Groceries R Us - - - - - Fitzwilliam Darcy - fitz@gmail.com - - 1 - 1 - 1 - - http://spreadsheets.google.com/feeds/worksheets/key/private/full/od6 - 2006-11-17T18:23:45.173Z - Sheet1 - Sheet1 - - - - 100 - 20 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/SpreadsheetsOnlineTest.php b/tests/Zend/Gdata/SpreadsheetsOnlineTest.php deleted file mode 100644 index 7d3472c192..0000000000 --- a/tests/Zend/Gdata/SpreadsheetsOnlineTest.php +++ /dev/null @@ -1,295 +0,0 @@ -sprKey = constant('TESTS_ZEND_GDATA_SPREADSHEETS_SPREADSHEETKEY'); - $this->wksId = constant('TESTS_ZEND_GDATA_SPREADSHEETS_WORKSHEETID'); - $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME; - $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); - $this->gdata = new Zend_Gdata_Spreadsheets($client); - } - - public function testGetSpreadsheetsAndWorksheetsAndData() - { - $spreadsheetCount = 0; - - $spreadsheets = $this->gdata->getSpreadsheets(); - $testedContents = false; - foreach($spreadsheets as $spreadsheet) { - $spreadsheetCount++; - $worksheetCount = 0; - $this->assertTrue($spreadsheet instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry, 'not instance of SpreadsheetEntry'); - foreach($spreadsheet->getWorksheets() as $worksheet) { - $this->assertTrue($worksheet instanceof Zend_Gdata_Spreadsheets_WorksheetEntry, 'not instance of WorksheetEntry'); - $worksheetCount++; - if ($spreadsheet->getTitle()->getText() == 'PHP Unit Test Sheet') { - $testedContents = true; - $contentAsCells = $worksheet->getContentsAsCells(); - $this->assertEquals('a1', $contentAsCells['A1']['value']); - $this->assertEquals('new', $contentAsCells['A2']['value']); - $this->assertEquals('row', $contentAsCells['B2']['value']); - $contentAsRows = $worksheet->getContentsAsRows(); - $this->assertEquals('new', $contentAsRows[0]['a1']); - $this->assertEquals('data', $contentAsRows[0]['c1']); - $this->assertEquals('here', $contentAsRows[0]['d1']); - } - } - $this->assertTrue($worksheetCount >= 1, 'didn\'t get >= 1 worksheet'); - } - $this->assertTrue($spreadsheetCount > 1, 'didn\'t get >1 spreadsheet'); - $this->assertTrue($testedContents, 'didn\'t test the contents of the worksheet'); - } - - public function testGetSpreadsheetFeed() - { - $feed = $this->gdata->getSpreadsheetFeed(); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_SpreadsheetFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $feed = $this->gdata->getSpreadsheetFeed($query); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_SpreadsheetFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $uri = $query->getQueryUrl(); - $feed = $this->gdata->getSpreadsheetFeed($uri); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_SpreadsheetFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - } - - public function testGetWorksheetFeed() - { - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $query->setSpreadsheetKey($this->sprKey); - $feed = $this->gdata->getWorksheetFeed($query); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_WorksheetFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $uri = $query->getQueryUrl(); - $feed = $this->gdata->getWorksheetFeed($uri); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_WorksheetFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - } - - public function testGetCellFeed() - { - $query = new Zend_Gdata_Spreadsheets_CellQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setWorksheetId($this->wksId); - $feed = $this->gdata->getCellFeed($query); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_CellFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $feed = $this->gdata->getCellFeed($query->getQueryUrl()); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_CellFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - } - - public function testGetListFeed() - { - $query = new Zend_Gdata_Spreadsheets_ListQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setWorksheetId($this->wksId); - $feed = $this->gdata->getListFeed($query); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_ListFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - - $feed = $this->gdata->getListFeed($query->getQueryUrl()); - $this->assertTrue($feed instanceof Zend_Gdata_Spreadsheets_ListFeed); - foreach ($feed->entries as $entry) { - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - $this->assertTrue($entry->getHttpClient() == $feed->getHttpClient()); - } - } - - public function testGetSpreadsheetEntry() - { - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $query->setSpreadsheetKey($this->sprKey); - $entry = $this->gdata->getSpreadsheetEntry($query); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - - $entry = $this->gdata->getSpreadsheetEntry($query->getQueryUrl()); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry); - } - - public function testGetWorksheetEntry() - { - $query = new Zend_Gdata_Spreadsheets_DocumentQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setWorksheetId($this->wksId); - $entry = $this->gdata->getWorksheetEntry($query); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - - $entry = $this->gdata->getWorksheetEntry($query->getQueryUrl()); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_WorksheetEntry); - } - - public function testGetCellEntry() - { - $query = new Zend_Gdata_Spreadsheets_CellQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setCellId('R1C1'); - $entry = $this->gdata->getCellEntry($query); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - - $entry = $this->gdata->getCellEntry($query->getQueryUrl()); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - } - - public function testGetListEntry() - { - $query = new Zend_Gdata_Spreadsheets_ListQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setStartIndex('1'); - $query->setMaxResults('1'); - $entry = $this->gdata->getListEntry($query); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - - $entry = $this->gdata->getListEntry($query->getQueryUrl()); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_ListEntry); - } - - public function testUpdateCell() - { - $this->gdata->updateCell(5, 1, 'updated data', $this->sprKey, $this->wksId); - - $query = new Zend_Gdata_Spreadsheets_CellQuery(); - $query->setSpreadsheetKey($this->sprKey); - $query->setCellId('R5C1'); - $entry = $this->gdata->getCellEntry($query); - $this->assertTrue($entry instanceof Zend_Gdata_Spreadsheets_CellEntry); - $this->assertTrue($entry->cell->getText() == 'updated data'); - - $this->gdata->updateCell(5, 1, '', $this->sprKey, $this->wksId); - } - - public function testInsertUpdateDeleteRow() - { - $rowData = array(); - $rowData['a1'] = 'new'; - $rowData['b1'] = 'row'; - $rowData['c1'] = 'data'; - $rowData['d1'] = 'here'; - $entry = $this->gdata->insertRow($rowData, $this->sprKey); - $rowData['a1'] = 'newer'; - $entry = $this->gdata->updateRow($entry, $rowData); - $this->gdata->deleteRow($entry); - } - - public function testInsertUpdateDeleteRow2() - { - $rowData = array(); - $rowData['a1'] = 'new'; - $rowData['b1'] = 'row'; - $rowData['c1'] = 'data'; - $rowData['d1'] = 'here'; - $entry = $this->gdata->insertRow($rowData, $this->sprKey); - $rowData['a1'] = 'newer'; - $entry = $this->gdata->updateRow($entry, $rowData); - $ssTest = new Zend_Gdata_Spreadsheets($entry->getHttpClient()); - $ssTest->delete($entry->getEditLink()->href); - } - - public function testInsertUpdateDeleteRow3() - { - $rowData = array(); - $rowData['a1'] = 'new'; - $rowData['b1'] = 'row'; - $rowData['c1'] = 'data'; - $rowData['d1'] = 'here'; - $entry = $this->gdata->insertRow($rowData, $this->sprKey); - $rowData['a1'] = 'newer'; - $entry = $this->gdata->updateRow($entry, $rowData); - $ssTest = new Zend_Gdata_Spreadsheets($entry->getHttpClient()); - $ssTest->delete($entry); - } - - public function testCustomElementsCollected() { - $rowData = array(); - $rowData['a1'] = 'new'; - $rowData['b1'] = 'row'; - $rowData['c1'] = 'data'; - $rowData['d1'] = 'here'; - $entry = $this->gdata->insertRow($rowData, $this->sprKey); - - $this->assertEquals(4, count($entry->custom)); - $this->assertEquals(4, count($entry->customByName)); - - $this->assertEquals('new', $entry->custom[0]->getText()); - $this->assertEquals('row', $entry->custom[1]->getText()); - $this->assertEquals('data', $entry->custom[2]->getText()); - $this->assertEquals('here', $entry->custom[3]->getText()); - - $this->assertEquals('new', $entry->customByName['a1']->getText()); - $this->assertEquals('row', $entry->customByName['b1']->getText()); - $this->assertEquals('data', $entry->customByName['c1']->getText()); - $this->assertEquals('here', $entry->customByName['d1']->getText()); - - $ssTest = new Zend_Gdata_Spreadsheets($entry->getHttpClient()); - $ssTest->delete($entry); - } - -} diff --git a/tests/Zend/Gdata/SpreadsheetsTest.php b/tests/Zend/Gdata/SpreadsheetsTest.php deleted file mode 100644 index 358980d492..0000000000 --- a/tests/Zend/Gdata/SpreadsheetsTest.php +++ /dev/null @@ -1,48 +0,0 @@ -gdata = new Zend_Gdata_Spreadsheets(new Zend_Http_Client()); - } - - public function testSpreadsheets() - { - $this->assertTrue(true); - } - -} diff --git a/tests/Zend/Gdata/TestUtility/MockHttpClient.php b/tests/Zend/Gdata/TestUtility/MockHttpClient.php deleted file mode 100644 index 623b7ab29d..0000000000 --- a/tests/Zend/Gdata/TestUtility/MockHttpClient.php +++ /dev/null @@ -1,81 +0,0 @@ -_requests = array(); - } - - public function popRequest() - { - if (count($this->_requests)) - return array_pop($this->_requests); - else - return NULL; - } - - public function write($method, - $uri, - $http_ver = '1.1', - $headers = array(), - $body = '') - { - $request = new Test_Zend_Gdata_MockHttpClient_Request(); - $request->method = $method; - $request->uri = $uri; - $request->http_ver = $http_ver; - $request->headers = $headers; - $request->body = $body; - array_push($this->_requests, $request); - return parent::write($method, $uri, $http_ver, $headers, $body); - } -} diff --git a/tests/Zend/Gdata/TransparencyTest.php b/tests/Zend/Gdata/TransparencyTest.php deleted file mode 100644 index a58daee2f6..0000000000 --- a/tests/Zend/Gdata/TransparencyTest.php +++ /dev/null @@ -1,125 +0,0 @@ -transparencyText = file_get_contents( - 'Zend/Gdata/_files/TransparencyElementSample1.xml', - true); - $this->transparency = new Zend_Gdata_Extension_Transparency(); - } - - public function testEmptyTransparencyShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->transparency->extensionElements)); - $this->assertTrue(count($this->transparency->extensionElements) == 0); - } - - public function testEmptyTransparencyShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->transparency->extensionAttributes)); - $this->assertTrue(count($this->transparency->extensionAttributes) == 0); - } - - public function testSampleTransparencyShouldHaveNoExtensionElements() { - $this->transparency->transferFromXML($this->transparencyText); - $this->assertTrue(is_array($this->transparency->extensionElements)); - $this->assertTrue(count($this->transparency->extensionElements) == 0); - } - - public function testSampleTransparencyShouldHaveNoExtensionAttributes() { - $this->transparency->transferFromXML($this->transparencyText); - $this->assertTrue(is_array($this->transparency->extensionAttributes)); - $this->assertTrue(count($this->transparency->extensionAttributes) == 0); - } - - public function testNormalTransparencyShouldHaveNoExtensionElements() { - $this->transparency->value = "http://schemas.google.com/g/2005#event.opaque"; - - $this->assertEquals("http://schemas.google.com/g/2005#event.opaque", $this->transparency->value); - - $this->assertEquals(0, count($this->transparency->extensionElements)); - $newTransparency = new Zend_Gdata_Extension_Transparency(); - $newTransparency->transferFromXML($this->transparency->saveXML()); - $this->assertEquals(0, count($newTransparency->extensionElements)); - $newTransparency->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newTransparency->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.opaque", $newTransparency->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newTransparency2 = $gdata->newTransparency(); - $newTransparency2->transferFromXML($newTransparency->saveXML()); - $this->assertEquals(1, count($newTransparency2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.opaque", $newTransparency2->value); - } - - public function testEmptyTransparencyToAndFromStringShouldMatch() { - $transparencyXml = $this->transparency->saveXML(); - $newTransparency = new Zend_Gdata_Extension_Transparency(); - $newTransparency->transferFromXML($transparencyXml); - $newTransparencyXml = $newTransparency->saveXML(); - $this->assertTrue($transparencyXml == $newTransparencyXml); - } - - public function testTransparencyWithValueToAndFromStringShouldMatch() { - $this->transparency->value = "http://schemas.google.com/g/2005#event.opaque"; - $transparencyXml = $this->transparency->saveXML(); - $newTransparency = new Zend_Gdata_Extension_Transparency(); - $newTransparency->transferFromXML($transparencyXml); - $newTransparencyXml = $newTransparency->saveXML(); - $this->assertTrue($transparencyXml == $newTransparencyXml); - $this->assertEquals("http://schemas.google.com/g/2005#event.opaque", $this->transparency->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->transparency->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->transparency->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->transparency->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->transparency->extensionAttributes['foo2']['value']); - $transparencyXml = $this->transparency->saveXML(); - $newTransparency = new Zend_Gdata_Extension_Transparency(); - $newTransparency->transferFromXML($transparencyXml); - $this->assertEquals('bar', $newTransparency->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newTransparency->extensionAttributes['foo2']['value']); - } - - public function testConvertFullTransparencyToAndFromString() { - $this->transparency->transferFromXML($this->transparencyText); - $this->assertEquals("http://schemas.google.com/g/2005#event.transparent", $this->transparency->value); - } - -} diff --git a/tests/Zend/Gdata/VisibilityTest.php b/tests/Zend/Gdata/VisibilityTest.php deleted file mode 100644 index a00a1e0a74..0000000000 --- a/tests/Zend/Gdata/VisibilityTest.php +++ /dev/null @@ -1,125 +0,0 @@ -visibilityText = file_get_contents( - 'Zend/Gdata/_files/VisibilityElementSample1.xml', - true); - $this->visibility = new Zend_Gdata_Extension_Visibility(); - } - - public function testEmptyVisibilityShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->visibility->extensionElements)); - $this->assertTrue(count($this->visibility->extensionElements) == 0); - } - - public function testEmptyVisibilityShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->visibility->extensionAttributes)); - $this->assertTrue(count($this->visibility->extensionAttributes) == 0); - } - - public function testSampleVisibilityShouldHaveNoExtensionElements() { - $this->visibility->transferFromXML($this->visibilityText); - $this->assertTrue(is_array($this->visibility->extensionElements)); - $this->assertTrue(count($this->visibility->extensionElements) == 0); - } - - public function testSampleVisibilityShouldHaveNoExtensionAttributes() { - $this->visibility->transferFromXML($this->visibilityText); - $this->assertTrue(is_array($this->visibility->extensionAttributes)); - $this->assertTrue(count($this->visibility->extensionAttributes) == 0); - } - - public function testNormalVisibilityShouldHaveNoExtensionElements() { - $this->visibility->value = "http://schemas.google.com/g/2005#event.private"; - - $this->assertEquals("http://schemas.google.com/g/2005#event.private", $this->visibility->value); - - $this->assertEquals(0, count($this->visibility->extensionElements)); - $newVisibility = new Zend_Gdata_Extension_Visibility(); - $newVisibility->transferFromXML($this->visibility->saveXML()); - $this->assertEquals(0, count($newVisibility->extensionElements)); - $newVisibility->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newVisibility->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.private", $newVisibility->value); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newVisibility2 = $gdata->newVisibility(); - $newVisibility2->transferFromXML($newVisibility->saveXML()); - $this->assertEquals(1, count($newVisibility2->extensionElements)); - $this->assertEquals("http://schemas.google.com/g/2005#event.private", $newVisibility2->value); - } - - public function testEmptyVisibilityToAndFromStringShouldMatch() { - $visibilityXml = $this->visibility->saveXML(); - $newVisibility = new Zend_Gdata_Extension_Visibility(); - $newVisibility->transferFromXML($visibilityXml); - $newVisibilityXml = $newVisibility->saveXML(); - $this->assertTrue($visibilityXml == $newVisibilityXml); - } - - public function testVisibilityWithValueToAndFromStringShouldMatch() { - $this->visibility->value = "http://schemas.google.com/g/2005#event.private"; - $visibilityXml = $this->visibility->saveXML(); - $newVisibility = new Zend_Gdata_Extension_Visibility(); - $newVisibility->transferFromXML($visibilityXml); - $newVisibilityXml = $newVisibility->saveXML(); - $this->assertTrue($visibilityXml == $newVisibilityXml); - $this->assertEquals("http://schemas.google.com/g/2005#event.private", $this->visibility->value); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->visibility->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->visibility->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->visibility->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->visibility->extensionAttributes['foo2']['value']); - $visibilityXml = $this->visibility->saveXML(); - $newVisibility = new Zend_Gdata_Extension_Visibility(); - $newVisibility->transferFromXML($visibilityXml); - $this->assertEquals('bar', $newVisibility->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newVisibility->extensionAttributes['foo2']['value']); - } - - public function testConvertFullVisibilityToAndFromString() { - $this->visibility->transferFromXML($this->visibilityText); - $this->assertEquals("http://schemas.google.com/g/2005#event.confidential", $this->visibility->value); - } - -} diff --git a/tests/Zend/Gdata/WhenTest.php b/tests/Zend/Gdata/WhenTest.php deleted file mode 100644 index 862732b864..0000000000 --- a/tests/Zend/Gdata/WhenTest.php +++ /dev/null @@ -1,144 +0,0 @@ -whenText = file_get_contents( - 'Zend/Gdata/_files/WhenElementSample1.xml', - true); - $this->when = new Zend_Gdata_Extension_When(); - } - - public function testEmptyWhenShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->when->extensionElements)); - $this->assertTrue(count($this->when->extensionElements) == 0); - } - - public function testEmptyWhenShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->when->extensionAttributes)); - $this->assertTrue(count($this->when->extensionAttributes) == 0); - } - - public function testSampleWhenShouldHaveNoExtensionElements() { - $this->when->transferFromXML($this->whenText); - $this->assertTrue(is_array($this->when->extensionElements)); - $this->assertTrue(count($this->when->extensionElements) == 0); - } - - public function testSampleWhenShouldHaveNoExtensionAttributes() { - $this->when->transferFromXML($this->whenText); - $this->assertTrue(is_array($this->when->extensionAttributes)); - $this->assertTrue(count($this->when->extensionAttributes) == 0); - } - - public function testNormalWhenShouldHaveNoExtensionElements() { - $this->when->valueString = "Later"; - $this->when->endTime = "2007-06-21T21:31:56-07:00"; - $this->when->startTime = "2007-06-19T05:42:19-06:00"; - - $this->assertEquals("Later", $this->when->valueString); - $this->assertEquals("2007-06-21T21:31:56-07:00", $this->when->endTime); - $this->assertEquals("2007-06-19T05:42:19-06:00", $this->when->startTime); - - $this->assertEquals(0, count($this->when->extensionElements)); - $newWhen = new Zend_Gdata_Extension_When(); - $newWhen->transferFromXML($this->when->saveXML()); - $this->assertEquals(0, count($newWhen->extensionElements)); - $newWhen->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newWhen->extensionElements)); - $this->assertEquals("Later", $newWhen->valueString); - $this->assertEquals("2007-06-21T21:31:56-07:00", $newWhen->endTime); - $this->assertEquals("2007-06-19T05:42:19-06:00", $newWhen->startTime); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newWhen2 = $gdata->newWhen(); - $newWhen2->transferFromXML($newWhen->saveXML()); - $this->assertEquals(1, count($newWhen2->extensionElements)); - $this->assertEquals("Later", $newWhen2->valueString); - $this->assertEquals("2007-06-21T21:31:56-07:00", $newWhen2->endTime); - $this->assertEquals("2007-06-19T05:42:19-06:00", $newWhen2->startTime); - } - - public function testEmptyWhenToAndFromStringShouldMatch() { - $whenXml = $this->when->saveXML(); - $newWhen = new Zend_Gdata_Extension_When(); - $newWhen->transferFromXML($whenXml); - $newWhenXml = $newWhen->saveXML(); - $this->assertTrue($whenXml == $newWhenXml); - } - - public function testWhenWithValueToAndFromStringShouldMatch() { - $this->when->valueString = "Later"; - $this->when->endTime = "2007-06-21T21:31:56-07:00"; - $this->when->startTime = "2007-06-19T05:42:19-06:00"; - $whenXml = $this->when->saveXML(); - $newWhen = new Zend_Gdata_Extension_When(); - $newWhen->transferFromXML($whenXml); - $newWhenXml = $newWhen->saveXML(); - $this->assertTrue($whenXml == $newWhenXml); - $this->assertEquals("Later", $this->when->valueString); - $this->assertEquals("2007-06-21T21:31:56-07:00", $this->when->endTime); - $this->assertEquals("2007-06-19T05:42:19-06:00", $this->when->startTime); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->when->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->when->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->when->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->when->extensionAttributes['foo2']['value']); - $whenXml = $this->when->saveXML(); - $newWhen = new Zend_Gdata_Extension_When(); - $newWhen->transferFromXML($whenXml); - $this->assertEquals('bar', $newWhen->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newWhen->extensionAttributes['foo2']['value']); - } - - public function testConvertFullWhenToAndFromString() { - $this->when->transferFromXML($this->whenText); - $this->assertEquals("Tomorrow @ 5 PM", $this->when->valueString); - $this->assertEquals("2005-06-06T18:00:00-08:00", $this->when->endTime); - $this->assertEquals("2005-06-06T17:00:00-08:00", $this->when->startTime); - } - - public function testToStringCanReturnValueString() { - $this->when->transferFromXML($this->whenText); - $this->assertEquals('Tomorrow @ 5 PM', $this->when->__toString()); - } - -} diff --git a/tests/Zend/Gdata/WhereTest.php b/tests/Zend/Gdata/WhereTest.php deleted file mode 100644 index 6dc573b225..0000000000 --- a/tests/Zend/Gdata/WhereTest.php +++ /dev/null @@ -1,141 +0,0 @@ -whereText = file_get_contents( - 'Zend/Gdata/_files/WhereElementSample1.xml', - true); - $this->where = new Zend_Gdata_Extension_Where(); - } - - public function testEmptyWhereShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->where->extensionElements)); - $this->assertTrue(count($this->where->extensionElements) == 0); - } - - public function testEmptyWhereShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->where->extensionAttributes)); - $this->assertTrue(count($this->where->extensionAttributes) == 0); - } - - public function testSampleWhereShouldHaveNoExtensionElements() { - $this->where->transferFromXML($this->whereText); - $this->assertTrue(is_array($this->where->extensionElements)); - $this->assertTrue(count($this->where->extensionElements) == 0); - } - - public function testSampleWhereShouldHaveNoExtensionAttributes() { - $this->where->transferFromXML($this->whereText); - $this->assertTrue(is_array($this->where->extensionAttributes)); - $this->assertTrue(count($this->where->extensionAttributes) == 0); - } - - public function testNormalWhereShouldHaveNoExtensionElements() { - $this->where->valueString = "Test Value String"; - $this->where->rel = "http://schemas.google.com/g/2005#event.alternate"; - $this->where->label = "Test Label"; - - $this->assertEquals("Test Value String", $this->where->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.alternate", $this->where->rel); - $this->assertEquals("Test Label", $this->where->label); - - $this->assertEquals(0, count($this->where->extensionElements)); - $newWhere = new Zend_Gdata_Extension_Where(); - $newWhere->transferFromXML($this->where->saveXML()); - $this->assertEquals(0, count($newWhere->extensionElements)); - $newWhere->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newWhere->extensionElements)); - $this->assertEquals("Test Value String", $newWhere->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.alternate", $newWhere->rel); - $this->assertEquals("Test Label", $newWhere->label); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newWhere2 = $gdata->newWhere(); - $newWhere2->transferFromXML($newWhere->saveXML()); - $this->assertEquals(1, count($newWhere2->extensionElements)); - $this->assertEquals("Test Value String", $newWhere2->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.alternate", $newWhere2->rel); - $this->assertEquals("Test Label", $newWhere2->label); - } - - public function testEmptyWhereToAndFromStringShouldMatch() { - $whereXml = $this->where->saveXML(); - $newWhere = new Zend_Gdata_Extension_Where(); - $newWhere->transferFromXML($whereXml); - $newWhereXml = $newWhere->saveXML(); - $this->assertTrue($whereXml == $newWhereXml); - } - - public function testWhereWithValueToAndFromStringShouldMatch() { - $this->where->valueString = "Test Value String"; - $this->where->rel = "http://schemas.google.com/g/2005#event.alternate"; - $this->where->label = "Test Label"; - $whereXml = $this->where->saveXML(); - $newWhere = new Zend_Gdata_Extension_Where(); - $newWhere->transferFromXML($whereXml); - $newWhereXml = $newWhere->saveXML(); - $this->assertTrue($whereXml == $newWhereXml); - $this->assertEquals("Test Value String", $this->where->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.alternate", $this->where->rel); - $this->assertEquals("Test Label", $this->where->label); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->where->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->where->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->where->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->where->extensionAttributes['foo2']['value']); - $whereXml = $this->where->saveXML(); - $newWhere = new Zend_Gdata_Extension_Where(); - $newWhere->transferFromXML($whereXml); - $this->assertEquals('bar', $newWhere->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newWhere->extensionAttributes['foo2']['value']); - } - - public function testConvertFullWhereToAndFromString() { - $this->where->transferFromXML($this->whereText); - $this->assertEquals("Joe's Pub", $this->where->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event", $this->where->rel); - $this->assertEquals("1234 Anywhere Ln., New York, NY", $this->where->label); - $this->assertTrue($this->where->entryLink instanceof Zend_Gdata_Extension_EntryLink); - $this->assertEquals("http://local.example.com/10018/JoesPub", $this->where->entryLink->href); - } - -} diff --git a/tests/Zend/Gdata/WhoTest.php b/tests/Zend/Gdata/WhoTest.php deleted file mode 100644 index 7b17b0265c..0000000000 --- a/tests/Zend/Gdata/WhoTest.php +++ /dev/null @@ -1,145 +0,0 @@ -whoText = file_get_contents( - 'Zend/Gdata/_files/WhoElementSample1.xml', - true); - $this->who = new Zend_Gdata_Extension_Who(); - } - - public function testEmptyWhoShouldHaveNoExtensionElements() { - $this->assertTrue(is_array($this->who->extensionElements)); - $this->assertTrue(count($this->who->extensionElements) == 0); - } - - public function testEmptyWhoShouldHaveNoExtensionAttributes() { - $this->assertTrue(is_array($this->who->extensionAttributes)); - $this->assertTrue(count($this->who->extensionAttributes) == 0); - } - - public function testSampleWhoShouldHaveNoExtensionElements() { - $this->who->transferFromXML($this->whoText); - $this->assertTrue(is_array($this->who->extensionElements)); - $this->assertTrue(count($this->who->extensionElements) == 0); - } - - public function testSampleWhoShouldHaveNoExtensionAttributes() { - $this->who->transferFromXML($this->whoText); - $this->assertTrue(is_array($this->who->extensionAttributes)); - $this->assertTrue(count($this->who->extensionAttributes) == 0); - } - - public function testNormalWhoShouldHaveNoExtensionElements() { - $this->who->valueString = "Test Value String"; - $this->who->rel = "http://schemas.google.com/g/2005#event.speaker"; - $this->who->email = "testemail@somewhere.domain.invalid"; - - $this->assertEquals("Test Value String", $this->who->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.speaker", $this->who->rel); - $this->assertEquals("testemail@somewhere.domain.invalid", $this->who->email); - - $this->assertEquals(0, count($this->who->extensionElements)); - $newWho = new Zend_Gdata_Extension_Who(); - $newWho->transferFromXML($this->who->saveXML()); - $this->assertEquals(0, count($newWho->extensionElements)); - $newWho->extensionElements = array( - new Zend_Gdata_App_Extension_Element('foo', 'atom', null, 'bar')); - $this->assertEquals(1, count($newWho->extensionElements)); - $this->assertEquals("Test Value String", $newWho->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.speaker", $newWho->rel); - $this->assertEquals("testemail@somewhere.domain.invalid", $newWho->email); - - /* try constructing using magic factory */ - $gdata = new Zend_Gdata(); - $newWho2 = $gdata->newWho(); - $newWho2->transferFromXML($newWho->saveXML()); - $this->assertEquals(1, count($newWho2->extensionElements)); - $this->assertEquals("Test Value String", $newWho2->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.speaker", $newWho2->rel); - $this->assertEquals("testemail@somewhere.domain.invalid", $newWho2->email); - } - - public function testEmptyWhoToAndFromStringShouldMatch() { - $whoXml = $this->who->saveXML(); - $newWho = new Zend_Gdata_Extension_Who(); - $newWho->transferFromXML($whoXml); - $newWhoXml = $newWho->saveXML(); - $this->assertTrue($whoXml == $newWhoXml); - } - - public function testWhoWithValueToAndFromStringShouldMatch() { - $this->who->valueString = "Test Value String"; - $this->who->rel = "http://schemas.google.com/g/2005#event.speaker"; - $this->who->email = "testemail@somewhere.domain.invalid"; - $whoXml = $this->who->saveXML(); - $newWho = new Zend_Gdata_Extension_Who(); - $newWho->transferFromXML($whoXml); - $newWhoXml = $newWho->saveXML(); - $this->assertTrue($whoXml == $newWhoXml); - $this->assertEquals("Test Value String", $this->who->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.speaker", $this->who->rel); - $this->assertEquals("testemail@somewhere.domain.invalid", $this->who->email); - } - - public function testExtensionAttributes() { - $extensionAttributes = $this->who->extensionAttributes; - $extensionAttributes['foo1'] = array('name'=>'foo1', 'value'=>'bar'); - $extensionAttributes['foo2'] = array('name'=>'foo2', 'value'=>'rab'); - $this->who->extensionAttributes = $extensionAttributes; - $this->assertEquals('bar', $this->who->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $this->who->extensionAttributes['foo2']['value']); - $whoXml = $this->who->saveXML(); - $newWho = new Zend_Gdata_Extension_Who(); - $newWho->transferFromXML($whoXml); - $this->assertEquals('bar', $newWho->extensionAttributes['foo1']['value']); - $this->assertEquals('rab', $newWho->extensionAttributes['foo2']['value']); - } - - public function testConvertFullWhoToAndFromString() { - $this->who->transferFromXML($this->whoText); - $this->assertEquals("Jo", $this->who->valueString); - $this->assertEquals("http://schemas.google.com/g/2005#event.attendee", $this->who->rel); - $this->assertEquals("jo@nowhere.invalid", $this->who->email); - $this->assertTrue($this->who->attendeeStatus instanceof Zend_Gdata_Extension_AttendeeStatus); - $this->assertEquals("http://schemas.google.com/g/2005#event.tentative", $this->who->attendeeStatus->value); - $this->assertTrue($this->who->attendeeType instanceof Zend_Gdata_Extension_AttendeeType); - $this->assertEquals("http://schemas.google.com/g/2005#event.required", $this->who->attendeeType->value); - $this->assertTrue($this->who->entryLink instanceof Zend_Gdata_Extension_EntryLink); - $this->assertEquals("http://gmail.com/jo/contacts/Jo", $this->who->entryLink->href); - } - -} diff --git a/tests/Zend/Gdata/_files/AppSample1.txt b/tests/Zend/Gdata/_files/AppSample1.txt deleted file mode 100644 index 0a4a31750f..0000000000 --- a/tests/Zend/Gdata/_files/AppSample1.txt +++ /dev/null @@ -1,30 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/atom+xml; charset=UTF-8 -Last-Modified: Sun, 07 Sep 2008 17:53:51 GMT -Cache-Control: max-age=0 private -ETag: W/"CkcHQH8_fCp7ImA9WxRTGEw." -Gdata-Version: 1.2 -Date: Sun, 07 Sep 2008 21:23:39 GMT -Content-Length: 1450 -Server: GFE/1.3 - - - - - 12345678901234567890 - 2008-09-07T10:53:00.001-07:00 - 2008-09-07T10:53:51.144-07:00 - 2008-09-07T10:53:51.144-07:00 - Hello world - <p>Hello world!</p> - - - - - - - John Doe - http://www.blogger.com/profile/5555555555555555 - jdoe@example.com - - diff --git a/tests/Zend/Gdata/_files/AppSample2.txt b/tests/Zend/Gdata/_files/AppSample2.txt deleted file mode 100644 index 93f8f62616..0000000000 --- a/tests/Zend/Gdata/_files/AppSample2.txt +++ /dev/null @@ -1,29 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/atom+xml; charset=UTF-8 -Last-Modified: Sun, 07 Sep 2008 17:53:51 GMT -Cache-Control: max-age=0 private -ETag: W/"CkcHQH8_fCp7ImA9WxRTGEw." -Date: Sun, 07 Sep 2008 21:23:39 GMT -Content-Length: 1450 -Server: GFE/1.3 - - - - - 12345678901234567890 - 2008-09-07T10:53:00.001-07:00 - 2008-09-07T10:53:51.144-07:00 - 2008-09-07T10:53:51.144-07:00 - Hello world - <p>Hello world!</p> - - - - - - - John Doe - http://www.blogger.com/profile/5555555555555555 - jdoe@example.com - - diff --git a/tests/Zend/Gdata/_files/AppSample3.txt b/tests/Zend/Gdata/_files/AppSample3.txt deleted file mode 100644 index acd00242a7..0000000000 --- a/tests/Zend/Gdata/_files/AppSample3.txt +++ /dev/null @@ -1,68 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/atom+xml; charset=UTF-8 -Last-Modified: Sun, 07 Sep 2008 17:53:51 GMT -Cache-Control: max-age=0 private -ETag: W/"CkcHQH8_fCp7ImA9WxRTGEw." -Gdata-Version: 1.2 -Date: Sun, 07 Sep 2008 21:23:39 GMT -Content-Length: 1450 -Server: GFE/1.3 - - - - - tag:blogger.com,1999:blog-8273578352962669317 - 2008-11-11T20:09:14.238-08:00 - Test Blog - This is my description. - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - Blogger - 30 - 1 - 25 - - tag:blogger.com,1999:blog-8273578352962669317.post-4858063079003295518 - 2008-11-11T20:09:00.001-08:00 - 2008-11-11T20:09:14.251-08:00 - 2008-11-11T20:09:14.251-08:00 - Test Image - FOO - - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - 0 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/AppSample4.txt b/tests/Zend/Gdata/_files/AppSample4.txt deleted file mode 100644 index a976632599..0000000000 --- a/tests/Zend/Gdata/_files/AppSample4.txt +++ /dev/null @@ -1,67 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/atom+xml; charset=UTF-8 -Last-Modified: Sun, 07 Sep 2008 17:53:51 GMT -Cache-Control: max-age=0 private -ETag: W/"CkcHQH8_fCp7ImA9WxRTGEw." -Date: Sun, 07 Sep 2008 21:23:39 GMT -Content-Length: 1450 -Server: GFE/1.3 - - - - - tag:blogger.com,1999:blog-8273578352962669317 - 2008-11-11T20:09:14.238-08:00 - Test Blog - This is my description. - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - Blogger - 30 - 1 - 25 - - tag:blogger.com,1999:blog-8273578352962669317.post-4858063079003295518 - 2008-11-11T20:09:00.001-08:00 - 2008-11-11T20:09:14.251-08:00 - 2008-11-11T20:09:14.251-08:00 - Test Image - FOO - - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - 0 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/AttendeeStatusElementSample1.xml b/tests/Zend/Gdata/_files/AttendeeStatusElementSample1.xml deleted file mode 100644 index 3ffc5e5076..0000000000 --- a/tests/Zend/Gdata/_files/AttendeeStatusElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/AttendeeTypeElementSample1.xml b/tests/Zend/Gdata/_files/AttendeeTypeElementSample1.xml deleted file mode 100644 index 547f1eeaaa..0000000000 --- a/tests/Zend/Gdata/_files/AttendeeTypeElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/CommentsElementSample1.xml b/tests/Zend/Gdata/_files/CommentsElementSample1.xml deleted file mode 100644 index 67ffd1d5e9..0000000000 --- a/tests/Zend/Gdata/_files/CommentsElementSample1.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Gdata/_files/DocsTest.csv b/tests/Zend/Gdata/_files/DocsTest.csv deleted file mode 100755 index d83012da72..0000000000 --- a/tests/Zend/Gdata/_files/DocsTest.csv +++ /dev/null @@ -1,4 +0,0 @@ -name,favoriteColor -fred,blue -john,red -doug,green diff --git a/tests/Zend/Gdata/_files/EntryLinkElementSample1.xml b/tests/Zend/Gdata/_files/EntryLinkElementSample1.xml deleted file mode 100644 index d5ba1384f4..0000000000 --- a/tests/Zend/Gdata/_files/EntryLinkElementSample1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - http://gmail.com/jo/contacts/Jo - - Jo March - - diff --git a/tests/Zend/Gdata/_files/EntrySample1.xml b/tests/Zend/Gdata/_files/EntrySample1.xml deleted file mode 100644 index e1433bbf6e..0000000000 --- a/tests/Zend/Gdata/_files/EntrySample1.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - tag:blogger.com,1999:blog-8273578352962669317.post-6938730899689776686 - 2008-09-07T10:53:00.001-07:00 - 2008-09-07T10:53:51.144-07:00 - 2008-09-07T10:53:51.144-07:00 - Hello world - <p>Hello world!</p> - - - - - - - John Doe - http://www.blogger.com/profile/12345678901234567890 - jdoe@example.com - - diff --git a/tests/Zend/Gdata/_files/EventStatusElementSample1.xml b/tests/Zend/Gdata/_files/EventStatusElementSample1.xml deleted file mode 100644 index e591595436..0000000000 --- a/tests/Zend/Gdata/_files/EventStatusElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/ExtendedPropertyElementSample1.xml b/tests/Zend/Gdata/_files/ExtendedPropertyElementSample1.xml deleted file mode 100644 index 3acb8210a2..0000000000 --- a/tests/Zend/Gdata/_files/ExtendedPropertyElementSample1.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/FeedLinkElementSample1.xml b/tests/Zend/Gdata/_files/FeedLinkElementSample1.xml deleted file mode 100644 index d56687ad68..0000000000 --- a/tests/Zend/Gdata/_files/FeedLinkElementSample1.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 2007-06-19T00:48:41.230Z - - Comments for: Sample Event - - - diff --git a/tests/Zend/Gdata/_files/FeedSampleV1.xml b/tests/Zend/Gdata/_files/FeedSampleV1.xml deleted file mode 100644 index be92553d18..0000000000 --- a/tests/Zend/Gdata/_files/FeedSampleV1.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - tag:blogger.com,1999:blog-8273578352962669317 - 2008-11-11T20:09:14.238-08:00 - Test Blog - This is my description. - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - Blogger - 30 - 1 - 25 - - tag:blogger.com,1999:blog-8273578352962669317.post-4858063079003295518 - 2008-11-11T20:09:00.001-08:00 - 2008-11-11T20:09:14.251-08:00 - 2008-11-11T20:09:14.251-08:00 - Test Image - FOO - - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - 0 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/FeedSampleV2.xml b/tests/Zend/Gdata/_files/FeedSampleV2.xml deleted file mode 100644 index a9b2fe3bb8..0000000000 --- a/tests/Zend/Gdata/_files/FeedSampleV2.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - tag:blogger.com,1999:blog-8273578352962669317 - 2008-11-11T20:09:14.238-08:00 - Test Blog - This is my description. - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - Blogger - 30 - 1 - 25 - - tag:blogger.com,1999:blog-8273578352962669317.post-4858063079003295518 - 2008-11-11T20:09:00.001-08:00 - 2008-11-11T20:09:14.251-08:00 - 2008-11-11T20:09:14.251-08:00 - Test Image - FOO - - - - - - - John Doe - http://www.blogger.com/profile/05925487542352262450 - tmjdev@gmail.com - - 0 - - \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/MediaMimeStreamSample1.txt b/tests/Zend/Gdata/_files/MediaMimeStreamSample1.txt deleted file mode 100644 index 5c42df7170..0000000000 --- a/tests/Zend/Gdata/_files/MediaMimeStreamSample1.txt +++ /dev/null @@ -1 +0,0 @@ -aaa---fakeBinary---bbb \ No newline at end of file diff --git a/tests/Zend/Gdata/_files/OpenSearchItemsPerPageElementSample1.xml b/tests/Zend/Gdata/_files/OpenSearchItemsPerPageElementSample1.xml deleted file mode 100644 index 6c7aa60171..0000000000 --- a/tests/Zend/Gdata/_files/OpenSearchItemsPerPageElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - -25 diff --git a/tests/Zend/Gdata/_files/OpenSearchStartIndexElementSample1.xml b/tests/Zend/Gdata/_files/OpenSearchStartIndexElementSample1.xml deleted file mode 100644 index 4fd667380a..0000000000 --- a/tests/Zend/Gdata/_files/OpenSearchStartIndexElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - -5 diff --git a/tests/Zend/Gdata/_files/OpenSearchTotalResultsElementSample1.xml b/tests/Zend/Gdata/_files/OpenSearchTotalResultsElementSample1.xml deleted file mode 100644 index b3f0a0c251..0000000000 --- a/tests/Zend/Gdata/_files/OpenSearchTotalResultsElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - -12 diff --git a/tests/Zend/Gdata/_files/OriginalEventElementSample1.xml b/tests/Zend/Gdata/_files/OriginalEventElementSample1.xml deleted file mode 100644 index 7955fd513f..0000000000 --- a/tests/Zend/Gdata/_files/OriginalEventElementSample1.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/tests/Zend/Gdata/_files/RecurrenceElementSample1.xml b/tests/Zend/Gdata/_files/RecurrenceElementSample1.xml deleted file mode 100644 index d252ec7987..0000000000 --- a/tests/Zend/Gdata/_files/RecurrenceElementSample1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - -DTSTART;VALUE=DATE:20070501 -DTEND;VALUE=DATE:20070502 -RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904 - diff --git a/tests/Zend/Gdata/_files/RecurrenceExceptionElementSample1.xml b/tests/Zend/Gdata/_files/RecurrenceExceptionElementSample1.xml deleted file mode 100644 index 768993c105..0000000000 --- a/tests/Zend/Gdata/_files/RecurrenceExceptionElementSample1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/Zend/Gdata/_files/ReminderElementSample1.xml b/tests/Zend/Gdata/_files/ReminderElementSample1.xml deleted file mode 100644 index aaa4961b83..0000000000 --- a/tests/Zend/Gdata/_files/ReminderElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/RsaCert.pem b/tests/Zend/Gdata/_files/RsaCert.pem deleted file mode 100644 index 445542cb33..0000000000 --- a/tests/Zend/Gdata/_files/RsaCert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICxTCCAi6gAwIBAgIJALIWLob1fh/YMA0GCSqGSIb3DQEBBQUAMEwxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEYMBYG -A1UEAxMPd3d3LmV4YW1wbGUuY29tMB4XDTA4MDYyOTIwMDEyMVoXDTA5MDYyOTIw -MDEyMVowTDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3Vu -dGFpbiBWaWV3MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBAN8jNUSm/KkypB2sTIRIob/GPVJAeDUSFOQ+HOT0sruM -lf0RzY8wLBQdVshLfq1PsdE49jPavnOR9+CBI4f1LUC24XUcDQ0W1MTltdOrx1Rr -FWQHrNE6R19N2eYLC0o0VBJhp4o6VERr8MhKiQT4GqtZjJpycF/G0M5ysDZCvaA9 -AgMBAAGjga4wgaswHQYDVR0OBBYEFH3/umQGqQAzS6zm8Vi29FKuk9K/MHwGA1Ud -IwR1MHOAFH3/umQGqQAzS6zm8Vi29FKuk9K/oVCkTjBMMQswCQYDVQQGEwJVUzEL -MAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxGDAWBgNVBAMTD3d3 -dy5leGFtcGxlLmNvbYIJALIWLob1fh/YMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEFBQADgYEAwBPAqlfAM0prZ7GNfVkFjxZv5/HALtcd54CYIiSk0FHFMmRrQbDr -DgaMcB4TVVF9ldVoRqvP4MpB4/SzYlEHMctjrJwbdVLZl7zACuTElsl4yr+Dzv6h -zVj1cIz9+lzwPZ8e0HJRRWmdEe+zoCed5iUigtEViMUvhszLzLcGmEc= ------END CERTIFICATE----- diff --git a/tests/Zend/Gdata/_files/RsaKey.pem b/tests/Zend/Gdata/_files/RsaKey.pem deleted file mode 100644 index b2deeca62d..0000000000 --- a/tests/Zend/Gdata/_files/RsaKey.pem +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXwIBAAKBgQDfIzVEpvypMqQdrEyESKG/xj1SQHg1EhTkPhzk9LK7jJX9Ec2P -MCwUHVbIS36tT7HROPYz2r5zkffggSOH9S1AtuF1HA0NFtTE5bXTq8dUaxVkB6zR -OkdfTdnmCwtKNFQSYaeKOlREa/DISokE+BqrWYyacnBfxtDOcrA2Qr2gPQIDAQAB -AoGBAMetwyJvaJSk67ZeFI8gTBbIeOGdLbUYPDfP2Z2N2E/7S9GO1+u2CQvrAVj2 -LiM7uP1owvG+Y0Yarr5p8fjdj6K4FBFZIsv7ugm9+lhwHMQXBMT8RdnPUtAupzRT -YuNlJgBluFyV2C6JZakmHKbn+RJxTnBAiWAMe+8zXQTNlhXBAkEA/0yk2o6q4yTR -hMg9REHyA8mNlZYgFm41tJmNIoshK+xWEyx+mvKEt3VHdkz0kDqzZo5XR/PoqH8P -FTsVntGyTQJBAN+/+Ckiw5XCBkeJMVmuynSP+PXXViczzBZiTJQeMf+ja+uL9XXH -cf2Y1Hg+0YGdr+NzGb3EKxH+CzLaaz3ZPbECQQDmFXUdZCauv6f0O2K7+ZLbxvJL -NhmFHZ5ZPWntD+a9ZynL7fXMP3VMwe29uG1Q7xZv/yi6OCAeeyRkxfMeR26hAkEA -y80hjuZ5W/kkmxgdeWC6S72vuM1xTbfiVykmM2vlgsIp1Jzg8Wy/KYyBSx182yD0 -SqpWcgEycesB7EoCkI1FoQJBALU/zXYUn0Jmh/qKruPo+7PwyQqgiO+muWoYxVC2 -vYdtqvvIAKUhERjA8vkbPdqp4zzjjzs6hjTeOmGqmmrFhxk= ------END RSA PRIVATE KEY----- diff --git a/tests/Zend/Gdata/_files/TransparencyElementSample1.xml b/tests/Zend/Gdata/_files/TransparencyElementSample1.xml deleted file mode 100644 index fe9028df9c..0000000000 --- a/tests/Zend/Gdata/_files/TransparencyElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/VisibilityElementSample1.xml b/tests/Zend/Gdata/_files/VisibilityElementSample1.xml deleted file mode 100644 index 5c9c4b836b..0000000000 --- a/tests/Zend/Gdata/_files/VisibilityElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/WhenElementSample1.xml b/tests/Zend/Gdata/_files/WhenElementSample1.xml deleted file mode 100644 index 2ecf824de1..0000000000 --- a/tests/Zend/Gdata/_files/WhenElementSample1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/tests/Zend/Gdata/_files/WhereElementSample1.xml b/tests/Zend/Gdata/_files/WhereElementSample1.xml deleted file mode 100644 index 1b01f15b5d..0000000000 --- a/tests/Zend/Gdata/_files/WhereElementSample1.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/Zend/Gdata/_files/WhoElementSample1.xml b/tests/Zend/Gdata/_files/WhoElementSample1.xml deleted file mode 100644 index 8df48804b4..0000000000 --- a/tests/Zend/Gdata/_files/WhoElementSample1.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/Zend/Gdata/_files/testImage.jpg b/tests/Zend/Gdata/_files/testImage.jpg deleted file mode 100644 index b378f7a3931af368e3249ceeceb68b445dca065e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13475 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 From 6fe3d3e8f66a82ec87541fa9d6deb40511b977e6 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:26:19 -0500 Subject: [PATCH 22/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Markup Tests --- tests/Zend/AllTests.php | 2 - tests/Zend/Markup/AllTests.php | 66 --- tests/Zend/Markup/BbcodeAndHtmlTest.php | 546 ------------------ tests/Zend/Markup/FactoryTest.php | 53 -- tests/Zend/Markup/ParserIntegrityTest.php | 84 --- tests/Zend/Markup/Test/Parser/MockParser.php | 88 --- tests/Zend/Markup/Test/Renderer/Html/Bar.php | 59 -- .../Markup/Test/Renderer/MockRenderer.php | 54 -- 8 files changed, 952 deletions(-) delete mode 100644 tests/Zend/Markup/AllTests.php delete mode 100644 tests/Zend/Markup/BbcodeAndHtmlTest.php delete mode 100644 tests/Zend/Markup/FactoryTest.php delete mode 100644 tests/Zend/Markup/ParserIntegrityTest.php delete mode 100644 tests/Zend/Markup/Test/Parser/MockParser.php delete mode 100644 tests/Zend/Markup/Test/Renderer/Html/Bar.php delete mode 100644 tests/Zend/Markup/Test/Renderer/MockRenderer.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index a259771a0e..f36d7b7480 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -52,7 +52,6 @@ require_once 'Zend/Locale/AllTests.php'; require_once 'Zend/Log/AllTests.php'; require_once 'Zend/Mail/AllTests.php'; -require_once 'Zend/Markup/AllTests.php'; require_once 'Zend/Measure/AllTests.php'; require_once 'Zend/Memory/AllTests.php'; require_once 'Zend/MimeTest.php'; @@ -172,7 +171,6 @@ public static function suite() $suite->addTest(Zend_Locale_AllTests::suite()); $suite->addTest(Zend_Log_AllTests::suite()); $suite->addTest(Zend_Mail_AllTests::suite()); - $suite->addTest(Zend_Markup_AllTests::suite()); $suite->addTest(Zend_Measure_AllTests::suite()); $suite->addTestSuite('Zend_MimeTest'); $suite->addTest(Zend_Mime_AllTests::suite()); diff --git a/tests/Zend/Markup/AllTests.php b/tests/Zend/Markup/AllTests.php deleted file mode 100644 index 9e47aeb43e..0000000000 --- a/tests/Zend/Markup/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTestSuite('Zend_Markup_BbcodeAndHtmlTest'); - $suite->addTestSuite('Zend_Markup_ParserIntegrityTest'); - $suite->addTestSuite('Zend_Markup_FactoryTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Markup_AllTests::main') { - Zend_Markup_AllTests::main(); -} diff --git a/tests/Zend/Markup/BbcodeAndHtmlTest.php b/tests/Zend/Markup/BbcodeAndHtmlTest.php deleted file mode 100644 index 3d24c084e2..0000000000 --- a/tests/Zend/Markup/BbcodeAndHtmlTest.php +++ /dev/null @@ -1,546 +0,0 @@ -_markup = Zend_Markup::factory('bbcode', 'html'); - } - - /** - * Tears down the fixture - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - unset($this->_markup); - } - - /** - * Test for basic tags - * - * @return void - */ - public function testBasicTags() - { - $this->assertEquals('foobar', $this->_markup->render('[b]foo[/b]bar')); - $this->assertEquals('foobarfooba[r', - $this->_markup->render('[b=test file="test"]foo[i hell=nice]bar[/i]foo[/b]ba[r')); - } - - /** - * Test the behaviour of complicated tags - * - * @return void - */ - public function testComplicatedTags() - { - $this->assertEquals('http://framework.zend.com/', - $this->_markup->render('[url]http://framework.zend.com/[/url]')); - $this->assertEquals('foo', - $this->_markup->render('[url=http://framework.zend.com/]foo[/url]')); - $this->assertEquals('bar', $this->_markup->render('[url="javascript:alert(1)"]bar[/url]')); - - $this->assertEquals('logo', - $this->_markup->render('[img]http://framework.zend.com/images/logo.png[/img]')); - $this->assertEquals('Zend Framework', - $this->_markup->render('[img alt="Zend Framework"]http://framework.zend.com/images/logo.png[/img]')); - - } - - /** - * Test input exceptions - * - * @return void - */ - public function testExceptionParserWrongInputType() - { - $this->setExpectedException('Zend_Markup_Parser_Exception'); - - $this->_markup->getParser()->parse(array()); - } - - /** - * Test exception - * - * @return void - */ - public function testExceptionParserEmptyInput() - { - $this->setExpectedException('Zend_Markup_Parser_Exception'); - - $this->_markup->getParser()->parse(''); - } - - /** - * Test adding tags - * - * @return void - */ - public function testAddTags() - { - $this->_markup->getPluginLoader()->addPrefixPath( - 'Zend_Markup_Test_Renderer_Html', - 'Zend/Markup/Test/Renderer/Html' - ); - - $this->_markup->addMarkup('bar', - Zend_Markup_Renderer_RendererAbstract::TYPE_CALLBACK, - array('group' => 'inline')); - $this->_markup->addMarkup('suppp', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array('start' => '', 'end' => '', 'group' => 'inline')); - $this->_markup->addMarkup('zend', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array('replace' => 'Zend Framework', 'group' => 'inline', 'empty' => true)); - $this->_markup->addMarkup('line', Zend_Markup_Renderer_RendererAbstract::TYPE_ALIAS, - array('name' => 'hr')); - - $this->assertEquals('[foo=blaat]helltestblaat[/foo]', - $this->_markup->render('[bar="blaat"]hell[suppp]test[/suppp]blaat[/]')); - - $this->assertEquals('Zend Framework', $this->_markup->render('[zend]')); - $this->assertEquals('
    ', $this->_markup->render('[line]')); - - $this->assertEquals('test aaptest', - $this->_markup->render('[suppp]test aap[/suppp]test')); - } - - public function testHtmlUrlTitleIsRenderedCorrectly() - { - $this->assertEquals( - 'test', - $this->_markup->render('[url=http://exampl.com title=foo]test[/url]') - ); - } - - public function testValueLessAttributeDoesNotThrowNotice() - { - // Notice: Uninitialized string offset: 42 - // in Zend/Markup/Parser/Bbcode.php on line 316 - $expected = 'Example'; - $value = '[url=http://example.com foo]Example[/url]'; - $this->assertEquals($expected, $this->_markup->render($value)); - } - - public function testAttributeNotEndingValueDoesNotThrowNotice() - { - // Notice: Uninitialized string offset: 13 - // in Zend/Markup/Parser/Bbcode.php on line 337 - - $this->_markup->render('[url=http://framework.zend.com/ title="'); - } - - public function testAttributeFollowingValueDoesNotThrowNotice() - { - // Notice: Uninitialized string offset: 38 - // in Zend/Markup/Parser/Bbcode.php on line 337 - - $this->_markup->render('[url="http://framework.zend.com/"title'); - } - - public function testHrTagWorks() - { - $this->assertEquals('foo
    bar', $this->_markup->render('foo[hr]bar')); - } - - public function testFunkyCombos() - { - $expected = 'a[/b][hr]b' - . 'cd[/u]e'; - $outcome = $this->_markup->render('[u]a[/b][hr]b[b]c[/u]d[/b][/u]e'); - $this->assertEquals($expected, $outcome); - } - - public function testImgSrcsConstraints() - { - $this->assertEquals('F/\!ZLrFz',$this->_markup->render('F[img]/\!ZLrFz[/img]')); - } - - public function testColorConstraintsAndJs() - { - $input = " i think you mean? [color=\"onclick='foobar();'\"]your text[/color] DASPRiD"; - $expected = "<kokx> i think you mean? your text DASPRiD"; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testNeverEndingAttribute() - { - $input = "[color=\"green]your text[/color]"; - $expected = 'your text'; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testTreatmentNonTags() - { - $input = '[span][acronym][h1][h2][h3][h4][h5][h6][nothing]' - . '[/h6][/h5][/h4][/h3][/h2][/h1][/acronym][/span]'; - $expected = '

    [nothing]' - . '

    e6m+5Wsxb;)hL^>Py)@<%z*c_X;J=lDhedFv%TpuTu3oFiKyz6ndk}BOB>r~=w)ERO-@O-~O^XuhdW4@TLic=E8MJ@G5As}z?oS z($0poCJVOOdbzafZ#~Ur!9B316DzhBnz&_^wwU33*JBE-m=>&<0}`yi=Y02k^^NVq zw&%LKF089+leT_XSAQ|8OfXTy#BI)y8KwLlb#Oy!~ zgY!exAUDM@P zn&#Ehsppfar}HNnUQ($ZR2Y6uu#Hlm$(d30d@o~LOnDNp55!wMr;iQu6!PZJ#v)U_ zOD6F^+30uV@f7vTdsKsR`mBmV-Jn&F`9#O1x^TToMTl$YnxA3J>f2XcnX7T@0*G+c0 zA4lH$7q`%D&(@ERo6B|RA&-L^kD=UV3MCz;!~uA*fLHR<4}9JI#GJn=ZlS4=tns7NmYm8F~1_E~C0w`k%rWEv za(8FbgSzf?5vSi{T9>@O{~lB*w8A?#q5`OwQ|&$)4_A2iLa*`0D>88g)s!dGpKHg@ zN%q{llp!^eM|OW2Wlr}e#18OX8?ey?$N!=2P2l7#s{QXL-95d{Op?h=x+eo9fk1ei z?oLP|kO>Gu*#uEQ1Ox;`MTyFz-QdE|5!~6lZr3FudQtDyd)*h@aOb)r0wO5F0Pfp$ z-?4em*inC9O= zgp)jj!imY}$zp9?wj=9t$BVT-{0ikJnLcd4p4OeGKJ=BI*Dgv=3!d6NwzwJ*%Rs?g z?!!D) zx-P2xN3;eR4`==IcK7i!vi1C1uTlgJTHMas`4nXN zlC+%hX!;@1sF#y7o6Ve18ncGqZzNs|c9}c*A{7{I?9JBjmvHHdh%fVQE)5Q*!TqS| z#4r)QLO|)96JIdG6(w~0xIWBS%{n?lPZ39oA zK;(*9-(+ii4>U=wb zQ<%wT5rfwyygHXc=v-iuJezOVlxA2<$4-%+BhNY=)|yB^@qMm*kE01gZodC0Mpb!_ z7bxvkN^4y~Cyef_y|vc~d8a9hH-C$UMX+hYT(Gd190MT8KezH)P1x3Lb{c%^wsmC; zLM7|SwiimcLiIX?W9~ZovM||f#&eY;MsO?wh1X)iCS^4LLh+qNAq zH&zdZRcu{q`fMQvCt!S^XhM*>0C&qCEae7exD}UJ!(}56@Q=idL@a5n;UtJPM|zBs z`ejba6zU_a1eQ3xy@OnrAQ@ibBHMCnq*97MrcO~q)h9Y@sK7Y}co9d09hI^LZ?fkMb-yiY)Gk$l_ zx+A>x2eL+g=KBEN(|lz8&*WRO;7jKDZ@}*Y{C4n5^IzAw4g9)H^c@=md6UVR4uZ{4 z$%WKSMr>7k?e-2gjt;s4T#CmO7L*dU5v|qStyq1XuFzBL{)87)7T!OgOaOeTZpF#l zoJZEh?%ODx*VB2KP0z!LchPQWXv%-IR)wjDyEYjVa0x}He|fI`rN-Pv1YeXhx}>~( zg0dNod+R2`=j|5L38LSJ{zA&WSai%)mkV7ERmlz!hpNn487HcE4|UN3kQ_y!o!8Sk zUCtI27W?6*k;VaKJ2S!jY^Njk&dn;g=m(qJ5CmsKJk*$?pj-OItfVODp*$oyG}zKY z4@Kokc}(EwEpYS}IC`s?Y2A}IMm_YGt0ga>ZP>JkzXx#|xD&5Zar*t@0d9EMPI~#& zjQ%diqAX{7qa0+}<@`2g$uP_akuC>GUZVc{ca(Iu;|NUWaQiBVc`q~0Sg0{MR%3al zZ+TB|&&_heroh&A`;AKTfNVp_$Nd%l<^|#Maes_N#m}SQTzmyjn?8Kb7>X{U9XQep zlD@(sT*DKyqsCw_nof<34V!7M5o}|89jqvuIV=R;o?r4WN?Efy&aE`=;O{*fImWbN zRxeyiHh}V)H#J(PA0Dk_fN|DpRdn11j{E!MCgN9-ui%uNKxej|4V-Qx45LEH%LxsJ zxd;<4yb_v#;wW{I@u!((d}6O0r&+$_3Z{COlQNS3y_HwJ{acDeW}(k1uM&M;R^Mt|o{!bZ5x_%7be##bs|L5Sob`6hnl+Xf2G^~|j=CU;ZTJ@FF}(X~$^CYm*)$H1Xu+G?`EeLL6 zk{?acYlLi_bMecRbZ4I1B@DHtgCT@YzN6Ne=sI$12q;AFG{lAl7RHtSN?BQqUy3u= z`7zDW{kA&KQ8g67`dFR`lS~!CzkTGB|IycV`K!+Zvs%OLuhPU}pw0SIs!m6T4;6d0((b}X@E;c7&qPOYD1~xa zgf#`VO>!yurw~1`0HSnG8;RDecbH`J?P&78MB~(3UZ9LLWTwqpK-b7x*0W^Yv*2b` zzJ~&G*(zuCUq_<&!CuA<^Lzb%+AG(2fM@qRateJ;;@@?DC&v6CMV65zD%XJ1a%8~v|`n;95Wj9E}t@|A0Hay#KG_j`+YA(>$}n&(;PLB}{Z4gd~B*VV#!=(yHuq+J^*bC(W(t z-}sWtMhYJmDF|1!@>_|iz~)}@r&#MYhugn`Fu0lT_JQkr&S&?W=@?qVSalk$`S3Vk zd^~s-Y;<#I#Ivn?wq?tfy==>KxKV5?L+lO({Z`_atWY*F-3z*v=F48&So|ZpyP6v= zj@CF6wvhv0uNo<9GGDcR9p+Om4eQXRdg}=39sa*JVxeL4rk0HN!E9L#daiu z7yxAx@y=1SPqh5tXyrA`UDpTAgq1ljh`ZdY=;zpnt!rJoffHO_@4b01QG2pyIl^?` zTn^X9K*q8pk17`?NHj4W;up9@HH!Xf?f*%pv*x+E&MlMx)Vi$A<>)J5PxRG(fZFBb z4@1uEind16?}BXZTTFCKkH@YPTVL7Ocks=*Jf2pt=*x#Fce~ng)mf|7TYJ-D)~5Aq zK&VB=Z>?JYMpn_VcGA!w+UHaStMzcPwqY+ep;f7nK*Am+C|ZKypkyJTj;%$J>D1ec z4iHOGnv{eGG%%C>oNpeh>=>?8FDB~BiMA1*qD);?wIywZq0jJW5a_w ze4n<9yU@P)X*>+J)p%caVSlH`wwS=r_zE@BM=67a%VC%<>wo816Ajr}wdc_$?d5=J zS%v(_aoha-Cheek`;%1{@$zoHBz}~%rR9r4O^_?#>)2J2n@`cWU)D<$RRA38=fqd403~M zn!8}v+Zs*%&RExZfw6q@7A^K8pd0|StOD&=Mg%xWawMl&@3@XpGy-` zhxL^b=-?mAH;m>>+Wg!%Cji)+EHt@&gl2Xqy^+#jwHS*3{YrT6q`^{_ z3O(wnbtZ2p+7E1hzVOWZZ;r+SM9W3);gCe`k(`M%Ml8Al^Ej>QeI6WXu8aW_B8rjh%jok37Gg@mxRwd7QBK@=$36X<| z(bhU0Uebl=rMcYPL$04`ZeuactDgLvXYvakG_laJwEc4u+=__Xf_;>W zC3U5}T3+@NZN6I?Z9Or{(`9B$Px~K#(www#E~+@P4bP3|xtrQ1n&G*U9iPojYmWB( zI4swQ@@p)=p=ibbS6uis0L{k*T3I-dLFKe-&C5p|cyMAG(MG;uZ7-s{u-Hy35pn-C zqA+@}{|&Lq|9ATT!T-4bzdr2!FWR(%YMTydI`uN?vgp9BB7Mhu?hJ%aZO!Kv)tmT#;2ww7>>->f7W|j-yq=X=H%!M^GSH zAZm(*=|2ZSX1@DAJ~?pzUcEZMro^ryB1QclaIDK=OuYXnr_v$C`!;T!{m+^FjH064 zYSZpG$6xEt)pxYo_a9boTX&+qFS8v7z1D5j_g4SrweA3mztrO|-L`JEzR@UAe!SK# z)iQ{~;4{Dt0f$l|>6|!kKM?_27I3x`(5J0$I3f~&SIZI@jZzc1s+c078 zQ9`*Yy|xX37ck{!f5Vq;Zgl@3sOkn}_iI6>#wg}ye=E1@Yx;Hj1pPXJJ*Z!I5P2K@npNJrI3FtOC;hq& z)MGdIlv^Qvoj4`-J&4Ir4|L)J$X$V4%y$K?+kOV)qnE0#Ze+Ev`5Pp{aw-NKv@)A_ zQja@!5wGNvm5fozZfV?^my@9A<|1`)#GQ5)thV9VMKj&)EXp?jz%X^+`1erbkYz(= z`Fn&L1KqlP-VcWDQ)(Z@ap|&I?ruZFT-Uo|HY;q@43l&_aJFtlb~Ti>s9owSShb`( zH3HOB3jOHnmQ|W;7B4Fdn0O55BcBr;`)QYR@N+qjz+$b`dPOLDRqgpK1D{nLMp;Div2Gt1?~j z9nNSO z<*7sNA@*kRbPO{2BkbO(*X&<;wqXsO$w48^eB$5Gi^*?!EZ?*jr0CDRxb^sV_*!CT z^k$V$6M3NCFS`KC^p*q451*uao8uuhoartTwoz9$fINdP!YCcAWlx~cIGnWhJ*&?h z-MWR8CqvWb4>me3wT2o0#NTqg_uV`0_XNRb5=fK4X2;LAJ5R z0wwtwzT6-2dvFK-@d+yamKkEtT{S1MDX3f#ob*8j}7tMkX0H5Ld}|6PF}!y z`^BcmLfNOsAaILfjlb>DAs==5XfE0_`p|8uT0l9v>pox8Xx^-Y16Qlh4d^XZK3#CL zch}on%UO@;!eE zX~2e+<`hPKb{&hhOV2r3t{dM2*DPLKoDotl+DK$S89eAQ+IU=L!9fpK-8quAI!imV zUv8?_Orw|MQR?I&sM%vNIV%-!D)JS$=~VxIa{-( z>-R5wA(|0ARQvpq$>(2apNVjfuvaWJi=zrY}fmhT@ZdJQZnB`AG-JLWNAxK zjqRXdX-G0mc4o)SR4sQA*3-HiEBGQ+O%*?xyvK{}>7wNSmeE0EWIF-jEbH0C;7+hF z04cS9_7a%7_D}g3FPGYtjZB7D;Uyt+^C+7fv39wMCNepRAD9@1h+v`9)_j@Dr4i>< zA2CbFe~wZ7QZgT@jaN7C39gmLs&-vq@+y2W3cZHn<2m3RAFi~I>V1q<+P6?24;dXB zc1k0j6}OB%&9Ekm?7$^P&xg&iYS+9ZHPEuLF*MHhAO((cvadUqC2P%5OZK++049$)CRd>%jDl_Dx+6{Dj{qZvAO*y}=t^g>h+X z>0y@S|3b@2=*w%^+intmEKzgY~^=O&$abOd~)V97k`&bM=LYmrd51# zrY#cUvp{qTV*QSc&bD=R>GSREe6(T6+zYdF%mV7IE?U5m} zQB^a$;f2diU8ev-ipXZBlQBfgqO`otNI@;oUpL0$$PF=$iQ-dEAjW1dE?l0qRor`k z>kI7e&is&X&%g(=u*tvs3%Hrj;>os}4$&+tV+iMdQ3Z5PeaMyl3O!vpdkw2R(2fhkKexd9nUWv zH#lufoQ~s38Gr3TY$BgmfXi+^sXCNDsbFYu5{I~FmK(~g0>5jAA>$N!E{eY+oPRcx zA#BlEbn0_(%0}b~^t4@$)jZnoCvpNhlLmbpsq5OIp%ZtxiuV+@ibwIkZ1_js;z?U? z7(A;`bTcxg#^dSxm_yIfxw@QMvcwB z#MNEdkE36)7Z}R2Th+MHv-DslEmVEE!Lyz^3$>HEf0V48a4p^}^Uh#n4wy!)4aSRQ z-N9QxFz`d-%{)NY`!zCU8wq(#e*ZuLUnGF@iZ<18i=uR~Nt-b%kLSbiY~ZOOG+tsq z$el7eu3qCFv~Tia{DzGyCL{@d$I6p^HfgNlQ3_RI%b&=8EF&t~B9bg4AFeWPM!MBSn{VyG zG4tO&X9lFhbczv+oSW7Mxb{!sS_!PX0qt7SWSR%F3!#0q-sGBxf6zYMO5+8w!TmjA z`|w=Sm_XlL!*hIuVvEorL7%Fme|JzNJ*7v#UOnQi!D;7$ zmg6`k<3A35-cQ)8g`Z5u-07s}aIue{TKHkcXJ!;mI!21w@MwAK z_!6ipjBIWXJC98kj)smy`3yQ%{9|o{GK4Q{%lOD)RxYf$i?+NMKkVcyMaN-fc$-an~jhz?K8?7=Di;zgf|@#1o~?Zo-_#!@CU_Jz`&UpScd3%i6Ag{m zIx|5uw3yJY9*Bm9Z%;kVu_zlBh71is2wy$j_G&7Fk&^yHAWiK3pSv)f1WAaHl9aW zjf+y36EzUhAPGELw@`?tlDAOCYt=@Mm4_6~;?()K5(FnQLdr5*3Z%5Uztu-zKwS>b#aY_lS0zPh59KO?S_%Yq2V$O4pK;U;OY;j$KjpH z*o(~wrdlYYSQ#CAzKb@%1?@+oU1`+TPXuj(k_byA zp4VG@lGEGU4}wBn_DRqI3V{~t#(CR zWcXy%g7u7lL1xKfT=HLH{(8Fq(%`R6g1qm|SbVKb6<;RD^7i!jTB^!l_Q&$}bbqZ} z!?&i=*1;h&`wH@QZi;y$aB#Z^Hop+qtXBruT>MMgHg7kxi8VL8ceXpB zAHZ)L9^cb)H=2CZDzI6+19FL)3eH(6dmnmdcPv3WuN$uX(q;0C|v%5s`CM^dxRSyoC zg`Cuqt+%J8Tke_m9I#yilp1H+4*1ANd>24;UQ6-UYYbef3M{1aM+7>rdUf?M8onja zZ~>RnaBr^%lb=ts%5N82r!uW;Z8aa-U7FUl0{U};68fB=BTRyuIU#@;pyQ;^F(7-+ z7EIk6e5|_)*$x})^0G^fhZ_x6PM6Yzhz9(o2R#GH<~l>M_E?IA^82X++s3>ZDvKKX zD|$%l@$$A{fzFzkb|l(-q@x+wWH6i>z~T-I%7+SlM351hzU8fBN)G&x=I4*f>q3Mh zzZdC|Wug`fTlq4gh#=NaIC>QCH&C~{g(W3|h8ufPw=ymnY3irfoe>h~5?CRyb+^~% zzk0P%o@pJX5Ar&+vmoe(dIzCO25WUBK%dDlUt!Gr2YL9ISx$e2F(W?oa(<8D*LWUC zpfCnZjaMJ;?xcL{7T9<&14iFgk1p!wim#Vds5>E#NsAgrhGpqVtahJDi!r~QwO%y` zM@Bj>uDfn!=Hh5m*c_;=#L8} z?2ik<&A1342Iy#Z;mRj?d*4ivCPU9&OTbh4ZGI&W+D*YU_a3}5-Lp!*bqj19L-*+0 zyJw|BX7x<|0D|Ra_r$qLxA~Z#P_Vl~aV9Nw=rJqBbFm(KXIirPWm;jd$NIGFgCFeo z8TE>|O%Ph9Y!~*~NukeFr>-7AxtH7m)%x$a(0>AScm1clchi6U+GHT#W&c?L{r*$J z{+6feK>r1B9nySPkop$q(bV%g)wAC*egwqEyASu&@|Y~Z=wy+#Za6;F8wU6E)z@@n zKRrIAd0{hUuvwa#g1}mL`%AD@VW+PBo1S}^xpqXPq{8}54nGa|=RnEwT}1j)EyH|- zosmVjqEntX+2>Ff%QiwN>=K}1W|n5YigOy0V{1%%m{ip0c`SiGhm!Ix4~r!+0-TfK4^}wIA$c3&R5ZE!Q;?0nsRTFfr9he|g zzK+luAeu1*xp|lak2I!ovH)`sAeha=9C)ar=3x#z)b8eC4m?zI^DqY6LvSLNDYEJx2+y|tJ%iD|oV zIxz`h)6?hMLUaZ=h3Ww7zBj=<3^xufE!Ypvhhs*22g859vpNntq5WWx^vjZ=>o%Kk z7M?{>{|prc`5at|j(t?R-J3U6$85Qqc3V31+BSVcLHgur@frY~tJho>yG2 zyu*)9%gaS?qMkli><#V7%;N}(%$7;x*^q06LFM=1W$n@3R~~iq#|mn0R^Qe@-8CLn zukLEOCoNV`7PO2!w!wH)nz{K&$(LEM{;Z=unn+>k{UQeuEo%#6|9F769UVgjR=DGWrf*p!nuEXTiTm^!R4x zd&BR>fx#=B82@Z9U{AkG(sMOKP@Xo}Jov4ZI#y`C6vMKw1bOqxPw*NpZFvOR0zMY= zX6ojNHWpiup)(SSiFtM2$wfk!INDbmkIN^&q)PQoC-~@TpQKcV)N6bU6gn-M3NfJ@ zI`}-T&gs$k)uN)4WV{IzYM#l}tOXaP*$YLh#nzjrt2t9gdonQoyI?dRQq*{^P@~Y; zKu>6gXE<-=2aG7hpHmlC(AZF`B@YJ<_G-K8R44rcnn@N*(M>|}5IEhs2j z+sCga)9EvU1r9hc&g#=6-TQg<%wx>TGyZQtn%=?n2z<2aP;kY;elob-IhsdT0UoSq z_w6FuX^N%*4@Ofjp1})sz2xD%B|ptYZ>4Q~epw6c%gis^2{@5o<5GyK!hm6aUItMz z2KID0<)KMNfi}tL+b)gj#tO;J>eby(?n#RkCK=0Z)?)W2nZBRMwuLR2WYRh24R08n zWBx<9d#Q3*ILACb%rOGJtB1`oXM{OMu$2byQQ|2=S83Kx9WNc?rqPYx?K&;$6Nlo_i^OGYAeK z!63NX*--YfreVcAU&*=e1;0=lAy!%lG4u|0Ha;85##V(Tmi-kighEQZEoJImoAy;q z`$-}@6HX3oZkJr^?V=Zjq0XNf_&WaUJ>fJ@yRGj~cy{h@U$v0t$txvFViT&36H}VE zHPF0w^k^Q&ZZ+>0I)4<+gUqSOe}c@t%jD=SWUBuOOr7PVs@fAB4h>UOZGHdNh9(m7 z8lEM4mXp6y7DmBNL)og1H|nGlkm&Y*167d09a>42<5h4K+I3tAJxRpi={)p!fh`)P zW0!S~NxUomPL{$Exvo;%OyaI zmsNJw;E#fEy66e3T>Mn^gvBxw=OU%4dKz8)RL!PIHF*CbVfV;b=Io^Aup^!b?(;s7 zAI|9Y{6_fcPyX-XhbmQcE5F73^e6ux@LS2RkdbA}e}dl#eyjPV`AD5rns@&toH0B} z=OF8!q0K6k`oG86leSR8r=hax@RgFP+EYwIxqb2&rw)@c9^<-Td{3GwFd){ICFV1% zLf|`^Z+|<@$P6J^^LoE|UQB#GpM~{^=Ce%e^rpMOd7SwVI1eUYlkuM$9oAF%n26r_ z>6G_yiE3VkPb7!cw(AevBMsWD&GJ zH^+JT7P69DoRKHn63m1a?eA;E?L`aOG5bU4r+4+RXb&9&_w~-*abM}WeIh#j zX^wxIKUV|ayMfQlUtR_*t#OxFS*1ncRb`o8$l2w09ydM%h^iRRJ(0H^`PY~q$fv2p zUjiJ%1!3d1Ha*qek9tl|i*oRH|KZcs`gBz@j{X-f_ILW6GOPoSHJptv%SY#t>^*`v zX|Z*itOPjQ`CWyBt&+8Prt*!oD1Pxd5kG-v6RCr~k}|AYAxJ<9=yRr5cMk0QPV|ml zOZIr|DZZWpR+|SUe|#@66mlo!vB=q&ER~ZD(C=!YaAJ|mGMaqnw&dR;y;*e3Ii}Z~N|E zIy*L6JgG!_;hE^|`+#Zt|KK*or1){<-r3vQrLzw&Y~-xr)!s=S$*-WATxPocXGBM# z7=IgLW}Ld5?8kTOyCMDoU+u-;;!$mZ*FF)Fn_P;L9?NiL&=zL)ea8#ie@f;$(0`mr zv}eji(8VUA0Gsc&|AYwbQ^>#FRw0V#e)_b4jNeP;cjI6@eYO=~@#>eU_F>O{dGxZk zc)v+5aYa6g-cS21E{X4HAT$dY;Wo z3dwpQaC>oZTo4=vumf=+nT~q!JYP+5Gc}5<%q-;zE7G|Zu;LzUm3iL|;P-%}2jJ_L zq|`R8XWwVH^}Jg3)M2k)HdDQNzPMk{o@eu-P`#(6^?brWJ*`O9a~xCFY7nnz-y6l^ z<^d?HH*w6X6AHp~hFQZM|eBjWDe7?2!xu6l2=Y~#nngEQlUDyS!j_$dp~} zFl{O!QD7KWY8ZYErwt=11x1LgIYg>QYM3dwBTT| zd1R>L<-~6tOq+_pjH960oW|<2hC%zpr4T`*KRV7d?g`M+eSwPLcx8>-I(oB$uMt}z zR$Ih8EE`dwQ#ZEHC%fR)E01$JlvnlgKB=K<<#FnuSKe@@Jmb554^jWn{PEL6Z=beG z>e?`yf%8_mkusiTg9YjBTj;x0OV3%gbQ5Pk8Ed8ZMXFZ%@#4$}C*}vfp4b24jx{yr znjtG;=4?P)TyV57HjuT%~PqMbHHXjzo?;#=QLkY5Kwe}4@ zPwDxj0KYo*39UUbj+p`A^#ojU>w^s0PY(pc0c*yy^Nvk7_F*vlAfm0s=q5Vg2BS62 zN}*ZIH}g3<-FX;TpGDJQ><d=Uoc_BVRrN(ymH$EjD7QrhsEFR${X8ZW4bQrR#Yi=GJnm;Tw-?N2jg%*8S&_t9t zQgW(egEHq+?BSuvKD80C$jqBzzTO?Nn3v4}&B;!`oKBcebIKW-6SCP5py^M(tBR%g zWwhIPrBAFXnS{0`{}0*}rB>EHTIN`L_-4XH@Uc0_wFM`p^X;3#isV9w{6%#$3)Fh* z#PGyOeYDO2=Hz0DN@&{T(d5-EaJAE(90GqBwxM-yD@G+>4ALl4q@(Z~;o<`e(_nWSBe2VJcq>@KrCem^_`lZN4kozA(r2fZ14`W3#NnAp?_Fu1$X@*Y2Sr79-j_Q)0r+f$iF@DfJo6wb!K|p|V>0qigGB zFDS7$`79_=Yt5gK?&HAhM>9BtKg%L_V%W%54kpAX77{aPm_ow&tIB5WiNO;}Z=752 zjcqv^urL}TwqcBru(XxMjNuaOU{<0p`MecT~KWmYSqSQ)-db6z6WtO`Rgy_{`@re*0I6ox}MKL!RMBq&%VKDXU}I@@Y!-( zzzau(ZMo!n0NrB~_rMwtCz#S9!90>TT??2;m z)5Z3)`d@n%+pp_?EiSe{*85U<&J=}|8VJV5G}ji}a~ALUYAaIxtoPNd=Hr(#Y+63) z2{*UVUY{^}kdY4^$+c)83YcgW5Sa`TAckZ{Mzm)}M$|6fp2liruPXascIVx;-Fy4) zC!Uqc8}iWu!0}0g!xosLM#hXW_;D9A9GAvS#f*1}I?NxKDm>=ornx9ILd`_<%{OI}BfA7hwHOvN!K8nFs7L znbY|X1Hq?&*RSKjya-wmMyW5_&d?t&jaM)%0J*7*RT-?AQ9O#}TWtsQXNL*V259D&vXy}9j$?0OwDC}28QmeMv)MsUmE9^N6&!)2638o9ATnh2 zg{9(<|0uN?l_dmfb3-wCA92PPHy(iSEkCI-JcVS{hnXw zHPrp3UW>5=$6LEL3e{V|dMjLS3*XtxpO_?f&|`pBOVeVSD^NsAzkgvHmBIv4*N&-hu(xqT%gtepd|N?nXk6=c-J z_q9f%iPcW?$S!I&qbid9MQqc*$?|zKPYTqvE{7=se-4W_vISFuB(TaxwnHgM6k-sq z10q7?)*Ud%5wWjF5Jd+al*R@jck|l0dlgkJ~q>W0R=Cw&58ms3L z_j3lLmGNNwha2ll$$>bkx*O;q9PzVB)^nZkjyX7rV2Pd z5*>0(e=gcW*{lWOG2cpuYW^l&-5exBcD8y6+k|Di2S&;K@sxFVfsp=AFdDJQrjHQ8@(QI z(Q?{KP;vy1;l}b(@=zSrd@)1;bU^~J86fhYY@UN zV!NfWxQKfA!zkzWYfJUhhf7l%e;yiVq^!nqxXPTlr&d;}#+TB197!@=8d!+$ke0DF zU%xKLLG@ba)exi0{-j1yJ%^&tQ_s(19s?*wq`H`pDsWFM8eDF} z2+MOAHp7#vHZc`hOwh$-0o&g6dma7O|T9B;`y`=jznnoYp44Acrp+ zZW@SIt#_$p<3dMc=4q~(=YeiR0IU}$)GNM$1!}nNkSQvy5y$CGv$S6?uWI~F;K0mT3DetawYfnGsB8oGS_j}MVcFM}KO!L*>P^SU0XAA~AH|KlUsL?712?V-~-oLFqH z{Cbb2oy_{jJ%8s(nQ*_N#OONcji}6M@QN#1^) z@>IfN{58^zuu6u=z8z;s#DOGs^xum|7GH{nqFm}_6SYU}+zXG_{fqiKH>+3jeR-&A zn2zKb=7OuDz25FPCK_}cmHx8YAbBKEjLaPlBscah1QR_-9z_8305iJ9OR&-U;a;fF zJq-ulzre7##MZ_}2M`TbqLrKvV)*0UKiXTofXX}p%78H<$~=**#g;Cr-b+VB>`0%4 zPiyr+DNDze_DWgmV0gTd^2JJvaj)xWMjNL65%>_h2#oRg5K)W`%%FC?mWc}P>?@pO zKdTm>OrclDWOe=6m{+6HzP*m*?76q{$npHTLB(*%~+*o zi(u5P9!>7eW!RiM1;_ZZWy|8n$WcaemH}jZY`ivB4p5AzP#kbaS}~*+?Nj)gif^Jq ztrJV}2j~dD@M7HTZ7HtV+ZyIMX_0YQPFgKwx^;Z{*z#VJE)Pwb?bzB_truPk9oqyC zZI@omdNy)>tlo=U_sGR|AMnLvi?e_~hD&*@cCF{?$xCD)*K8Gn)? zXEZW|Uv1%5K889n;lcscZ4v$WRqB?H&!LcuE(etA+@6rG?+%hKuBZ-FtC*ZiOuN5m z)w<+!pv`h@3r{4E$G6CA@O4@z{sxcaJoAZfmir0r{;J$hlpDLNyqE*-#4C__V-7gU z@0uS@>%E@FTU;^_5}!}{lq0TKlb3>Uu1ehR8T4EddU{i=F^2?_E1mF}aR5%}Nf0XX#bKAIDwc$E4Py)uQ3A z=65JR=@VD^=}-RWf*TSSK7;p&Jo%IVcldpiAA2VQ{$gTTV+o&o`ABXv0UZ?_q8ClV zZUx`!Rh!Z=@mT152ySO2mwcPoa5=t@8dUH74e>`S7ypuKx5|}^A7FGf_sp%P86taF zhuNwvxs!B_soZMRN+WyB3(F;U6QdIU1tb9tjD=uH^fYT|G##EUM~O{H+ts*`ujDQg zcQvsQoj;fpWbR_=)ml1w@M9K&1yF8^RRsbc9JGS5V&o zSu8eoL8Cb~R!6Z1{BepaCm-Q?PkA~uBe)-J@(O-8@H>Z}=1yKV$4XwZFF&=L{MApI zXUoJ`!B1}esSjSp`!}ttps_ab@qK-49V<+3I)qD=`CwPTiq%rsizU`~6>F-v8Vg&IJ?5cu-PRQ{lDguR z(H=x%tv?hk!SQu#qkDlES^7P^hGR{4BeAAK%vHtjrcF#UAh#O(SCKvDlKh8lNGXQWmQsErOsD@ z;}X=}+REk3e*nx_9~g}@aHU)a&-`9FTUumdXmAmuq8Jq~!>{eqn7Bi26L%<(L!7L+ ze$$%*B;Y}|V?34Ho6;CzEww^CmG~uuL-vdQulcDp)dNhgoxsc@VW3mL(wdR@-AzeMw(O3 z+8;czDzD76KW3zth91C@w0D7K5}LX-)jpEWwF}5)VD%n`UHo(cP#&Kc$r-0$jkz{w z{GbyTU%_${RKJhMwMw=qS|D2)6<-Pe+z5~NPv;XrJ3f@Tg_Y*Q>b(gjWF*rB67k-! zPgwY7(5Sb^E7pDERqJW?<}1!$iL)>5EVhBRa}lE?IY<0O`JW8T=8~LE%H(mDob9`U zHolUF0tAM9lMeZp_`ZlYbpHoH^p8+Q+)$dg7@o{LJc1TrNd|zyNmP)=zf0a zI}G^Wg5O{HAyXRgXH6B!&fGWW`HOEj0KXq({PBv;=BGJ94AdUDQ~qHKV`G?anZ(S( zgQj7$3IFrv`70mvi6OS0C!a>&uHg+VTr#WWq+xzKy0X-brLIL_k?TXt(f(gR`{7($ zE7gId1A|7~iAB*eGn<;W$st~@luP;elVH(wxfI{1_a$MsfL**o0kPdscStX`0*kz- z&oGr;Y<%*OT#EH^QwU>A@@z&qv_?99@1S0szhm#DVdrvtrbC}Zz-HB&W6BERtaXc5 z<4H&hn>dV%cjv4XZoXDl@Kv$7StYs}PJ2`|0TeuaL+q%c1 zJE|OWvwF2Zy_nw7-4y{i)y$e|i%1YEEMA57i;3rvb+tv;!PV2Qp3u>+CzQ(lTPI-h zt>1ND04IiZUjQa;i5}Eh_6`8Cp=Z!oqZB(+8d9q8-0E5(nV9zRJc!0G<>Mxb??c_;Z76PGs)khbkQBDduGw07cY`%fjG5A z-B-DLs(qP=<#B6~D8W zmoB+5mFN5M3M$WoN57hg@RIb<{U6(nCXaD!Odr^9hC<2lDs1&pryc! zhW+4&MbG@8v(lO?t5CH23~zd;qcbSuS@_fl_e{@;ifnn5ocZ|oAQjCfof)6tZH8&9 z&dF=(m65?I!{e0u^IbW)f>=Ihz6Y0=mi!0K5Tv$B6jXE;R6&`d%FB~io6oK~|K5#2 zIhu;ArTg*_F;bP)AC5|w#UEweWXI4}#OEXA(OwCHEX|;maQRBPUcdUSaPG{d+}kS^ z2wW&!2r+R@m5c`B+QYHm)N4{dlU8-sL2Oc?KeM1TcRJ6a8#OH^&sKj*x8~lDLrwzw zv%gY+2;P#5u?T1_iPU{y_O&}EjBn6P!AjE_(#ESdq$X}_$dJ_-yBfQ1s_FQrJtk7~ ztOV}Se@3mlqIVz{TEr=%T_FejaKU8o_k%y)cP%arg-qRn$z_fClBL_z{^y9rTd;b02G5)p~9S&V{{`Nq43HaMQ%_sg= z@&O5MHm@QEJgtIZ{0`=2GJ=C}1XfngS%YZSoCejbVmej+mQ|@2$L-~r;-PFJ@e@E zddjoU>!}=gy^v+d?LPws+zV8W0ktqx3<2crBBBX~xFbt1YO~nB5;UJ~uU*FTPK=v_ zOUftl6x)=VLeMA{oeiyuS;46KKg8d#5a&r98uP+O-tq+vJS#Ep0*P44=4D zQ-B-7REzl`8#x{n=G30>rICcP`VyDN1*kQ`c3t3|gkS`&Um#`+tw5o||59KvGnTF1 zdE1}97CB5POhXS-b9UsO+nSYe5ck}-`zFkcacq5QjAQ4^#yFO}B=U38r;p?%WaIt0 zBj4uW86;8u=CqqNFVeh|8S;UCjvr8tE(B&D_lJO2;YuNRJ-1!>7zVuj8B2%iWlw7- zxJLQR3b={jR-wkVwLc3GzWm&xWOd8LhPQHKnDo{}-?MRIzN>b|H73ecJ2w?_T$@(w zTpq@W3hL@%bUXUOTuk<;XR%sjJ-e5^hq@RmDoj_WGz~XFKzIvZKYm|r zHLFl7grk(jRqK=IvPp^l`8sxT>Zd0ixB|9uP$>2Lea?q!BSVKLX^~ZO5e+=rSi%J+ z7mFvs=B8$7KA**B>qi`j;WCp)AzJs10kK^wuYJFo z-+kl?34Wa>Fx=zpESB5k7tZFY)DUy!H$&E$nDSc~bMr1@%5P!Jr|cr8{1(RS-9DQs zU49E=zIYdT$}bZ$@WiqOwP&nh<#JgqFfd<8-(gp&uw|_#(#~UP@UFf?kBT#Ad;i_M z;Al7hnY6{SPf%jjkrTd+mx<*n$-8j2uMgSFRr4Ig|1>&+B+BIGevkv@@b_f z$x8E*U=Rr*iw-mmWJW}{_bL}edu$R_xx#*|+{NA$H;8(}u#5LN8pRp)Bmd4~$LK`a z^!9#4`*oh9r4SQ5#;Ve0yOLsDRlo;^zEKx`BCiq7s$Wp5cpE-R;81pQ4GwR*H^_?> zmNi}T5Cl8Qm)Tt}sgwD9V1sm4V|0T38ZD;CMI_eg7-5&g^(3QGxSbfqw zfpdC|L$L=pRx&8!2a%dnZws^blt^QhzvYPz!s(K*%9>n^=fNN8?ZHb2>c@spq8JjW z>upOxDH$p@C`9e|%M~lO(zJrTj7=kW#tq`IpeP&UrHyx$TkGRyPm$9Vxcii*C&vgC zd^r{5atsQcKmFQ1^=Zr>KLI``smU|c`Nho>__E48S9GW7Hk33Z9T|@EoZUanj-tKy zB6C6gd-Z6#7Uw8~^~+?*6sm0LYzt;vA-|W{A#V{I%e!@K@DWjQpM!#rh==>^8++J&*>OTd+@?}v6Ks@vwA2tg*#cn!V6z2`rn zf3yB3Z6BH2GFn;vqM;y@Xkr>=xWC+!9LE8Z@`|7Al?IDxi|m{#8^!Puj=+4rvWDPB-w&DD1K$mbnaxp}$m|mA$@^G->-b3q z!7JLACrj+;MBX~nCV!Amy1&sOyvuwTamFqGQGWa5crd?o?^rgcj>rF}8fQi{K-wLE ztCJ({kzB{8qz|ju+_9a{FXNGXj7Q#afT&K*k}u(T@HcDX6>IT6bTg#Qc%VIj>1Q^U zZJrg@P8fDL0?%j`A$b;wk?q3kA;0V&=v4 zTVeS+T zGQ9Gu6p^)HffK85vY2$db!@#9Nysc@k`p0*x6UZQI-=fc@m-l#JK>0h> zBXF$?b`gu+2FV#!dUZBxH+EVcvw9{6^1XJhfp*b{dyJPI;#KTa(Q`OHkx9PP;doi~ z63rQYmbMnHIxt%K9h>iPKRO!C!~ScZW&)acu#LNi(&m}F(SA;1ZSQaXF%OpY3I=EF zm79GSUk=tm0`q7E*1E^=@);yIYhJVR+0i{x!MRzzl6@8bD0%qzetbjp&kmpa^V!}= zO9l0Sqe-X2kQwM@U5eYXT0`8f__7NQ zf21Z4ui?NYJ4e7QpdVv@!?crrsNUIMy2k#MjRCdF!ZGlQFa`v8R}UKlSB5blK+`dx zxjh%HCTI8zXrS_2co#x|QS{Xk_s5Ik_s5H1V!VXnL&qUAY1u?4_4^7pYpv&tSBB`!M{Ageax*AjMuVVkvd8>li{MuLT?}USE7>lh3WBr`? z$q&n*nLB@qv$bdZ@!lxpz*f$3y*_NOlA-o@G$(t1KHU1#WaRLSreG*S)VP2yRTxNq zoL=@!9z%g`YZcSTI94Hbi)Yk&VFE$ezLci$Az%q62NPsvXxKxCZY!IGIQ#m5vjV59 zhc)Oc1I{Yv6lWDMYaV?(RGxi2R5{>b$TH+cwPjC9ZG%o`(08+2mk^xx_XF)7rR;*R z(0CB*XsrgZH1#!Nit$;Oq{Nrb(sg+_~BA#DUFldMXX}-4W6as zcSP#9#0D;kHlS! z&y#bOWjZ$L@qh-Mh29yB`avg5ZxD4{ys9dyWaRPaoOOb=X#6C{J&lLAQHIaMk6;XC z?ge@t0W3(PMi*M4Fi3&DtQEVDluxbuC|->tAtUxZtIr+X6BL%4)vNOa0PP+xk4Z}& z?jp6Eau%PtQOW$nGooE}IjJHIOpJh|@uIo$+G|sLIr(T6-)vn&TP($(e7;oc{F~7h zHN}oVPXtg(Pv*~o%43&vpaMjDEODRqn78#;HNXMw2}K^1%R50mTP?2r-eZWPznsqI z7Tdq2y8_2CeCz#G&rU_LaJSIacV|M^qr2guw`!Zjos?U!d)aLMSdeEiewwDHh1qeA zA`@_Izno%xp#tL1GugTtre+z-_4@X85dYVQf|2pD0M4B z?Dx_|Sj1f`lEMM_w8~f%vIQH3_dq?0a zlzUeX<14NYbU-<$binuu^XQLl<=N*eR1RZ1WEpa!O2U=b@^(3bT5{$pKE2&cDJ!)4 zb21&$elv|{f{z6q?oDdyPJ>7K>=+iX8# zh6}d#kj+K*64aZ>w@lVSKP!sXuaEZJhfiJbW5sI0;l&$$J(Rc{&>ZWmm&DA&WI*%t zYRLoeTiX~Zwr9VcesT7VZU3SNx%~nRTGir<)dJ)t+PNQi>9~3deT^JMlgkjlkMX-1 z0`PZ!n(CJB!pi!(Cb3T=)W%|NRuPl;!HIMqt%P-h)ke#FpnHb> zXBt#30MyfmGyA)K>B2}q*c3fwvOag|nJP%|&iu?OXWxR@soP!hY)@dfxAR7Nq z&L7=ok`Ta56Owu!Q>X%w{x%0yA4>5_&vN}mj7-^zVyqX+R z=&$ZFpx3kBeeg%~L-9)mg_mk{=aH20H`+T$GBkj^`r2Y~JL1(`-Ry}E7vnux|6sCR zuhDXIsG^OSax2g2%6$A{QJ#GK5+^|72d@b5XROS6dt96|u!9ZhC;OK*TecEe?|vm_ za;7!UwCdXP)*`}l&w46&&%d~Vh6g(w#}8)k?-Y*DYtEU~q6!(%W|s6k=0it0eY(o?#(s*tlh46KUb~vR;=?@)cQ^9WZ}*K z8ID}xIC7<4{~nsZ*DlTFxvXvFb=oVi0!5cTM0reCX`l5H&4}d;=`!tjL~cP7HlO{^ zx8Ebwe)F5|;2=r+XIqR-ozP-a?Mt0nech?mWqPGDwN$wGV-xPJ)x9pSQv38>s{fa$ zCL5*Maq1GsbAzPuTJ@t}Dl_vY;=1Uj{eHY%yf>ra7$R%BOND_KyD-pa;-?@dg)0eL z!%awIdMu>R4}dK;=z6R`b7RO>vwoWG%51h0zs}1RU?jI^<)@8d>ZMB#{DK4QYgzPU zAIi6@uG1U1AfE<}3+LbS{w^kQ>eCQW=sKWofXvqBZ8cl}tk^Kdnha!PIbJ~o z#EizIqR+62ahn`W_tb~yhSt`G=OW#E=jRm0qor%2A!I*`rsBJOEWE^C?He^f&d$XN zsXJ^fR=et%Aa=eX6*~`}ru`y}{orX@I9&J$;g#&b6oAo0>hRMFaW3uyY8m_XrEjN# z@DOz+R>Z~T@mQ9)mQL2$B@R$=4Jq&LktCjb)JQp_`mwqkub;>GTf!dqzjG?y+>ZeD zL|aop^iBd~E#l5S0vo28)1k=EdeMu%ns8tf3DB|skclg`6RV|kP3$Op-s=zq@}^xl zy(p&I(E-sO$43Vs`eMk%(M8urRrzwgS@g=cM|*31a(4Uo^hA)4N_JWE6PO1T;6Lbw zg!@ZfhBp*xx*Vd77335kG+ys8b$V=nMMes3z0jnc-#|N8bIBWdNpnH=$D4_t-U8SWNljhU9u~ztfy$1cEM7IzldJ}KwX}YV!5@Fs zme%pLT2qV8$WGK=%**v_V12mtvetQ@y1}`BB|$i=`dGzXIGb&b!_*uXX2kLB(-pbR zBN>K`1}MqKG^X<=dntl%h$&V7M`i0TpZHD+OfI9nh8rtO$>lg0`3k{y5<&j7DhIRF zcV`EoM-8+}66)y_e0)r`4NSGd`&Ff>_-oz@*Qphpr(D<$pCIaBJ6P3}ReUxCeR^F+ z);Z;($*I_+h1nLmR4p`R62a*gXB+BT0=UY6M!H(!Q=_|%ClA+<<`1#6+KFYBQB}he z`M7`k1~RZmKmrA|Z}e>)JQ)Lf8Xq+ogNV@kgZw}x4ag77 zqc1;DJ}y7dgr>ZaAB1cq6%anmovA({UHd;pP529;-49wBmqWAV&x03rn zt!nRrv2c{nZh@o?i;?yyvUwd_XdV@Sc}M`Jw=(vO*Jfb+N4YyalRWZT?Kkw-$ev9c zRzbGj2q$VLoY!w(qSm?xz}>X>RQrW^KrZiaR_}7X(q+#&n2DiU`~VH1{@H^%Nf))1;w?URXo|B{dek-TtN(u_a`scsF=4x>=t^%Bl#_`#~ z5;Esk>ItUiLz9-1E2(bQF6!V^X$|#j3Tbw-B^2)qC5%?Q1TDb&WvI$&DZLz$p8`V2 zL^-mF%n9!5;F(2z%`I(R8$zo(TJbEltTRQz2pxEyo07~hT zgd{B20wkHm+T3{7Vi+d_w$PB%iylD-psl?8+(;w{_u*0NX{r0YQS%;Oo8_YGqho)P zx{q44_xX!PJpRFp9&(Yp_kpOYS2b3SqnkB8M8A$zME-iW%A8Il#>eCJ>YSpL%45xW z9+{Wh-PzicUGZsJ$v29U zha;=Fi2dG0U5iKpb%Um=LiB6O7^N-zEPAtKi@2qW(iN+~X<=EE%)(Vs9Krm5XnPYl zIg4uVzw>lYcTdkGVKS5HS&~d3Bs@&_gk-`p3CN-X3dk<939_&9z|(+`PDez=4RBYC zhyntlTvV>hRdK_8y|`YNFrwF8uU_@KU%CJ9?^HcY&m`#mzwet*rk|=)+o`Hkr%qL! zI;Gl_Z3w&db|rpIdP|;1%b3cY3}TCviPPW2SYjp16Mj7V4kekCVlUgBBb$ut0ZnY$ zu&5HBL@6%E#*@;J(-m@h7P4m=a;8Gg&O#Pfk|6gA6sxe4HS%4l)34^KU)vsV7e>@> zqFEYSG{H1hSVTLtj)qJz=^g#jn%9=`i{WdFjV}E&EcMR0qzrmWtsg@#opbQ?gi_0y z8Vg^7H0rlxv?9b%uD9*h%@loeC}Mz~ij!H5ChJ|xOUOA;bP|bpDi0Mcy)eSS z;9_xCu9(5qXh9IGX$whX8p@N(E+X`gNi!7;O?nK@RA#;m&CHJ2`zoXLu#cERUwKPu zO>%>_dM+WaU5uxwb(&o7)i=B+?dv|-S23)W;~oA+j?d_sWMo$|`?-=CbYIB~vMZTE z{`ySvB+S8uWv5FbcjC(}(CU7wQ~P|xQPho+(g)W^w(Rn24TqM9y=VJG{M4z@r+G3zBf+%UZxiu+I zO%b#$K+L{#sSW@hFPc+%Ug(*swCF-0x%M#QrKJJe`)n^_3m@xZ6zeEwL$r8nF zlj?}XE!UKvsa+KTQEK`(IXk{{M7D=1s~DDO;-L-@1w@u+$% zDNy3|jeOxd(5H=sU(wc5#nr_WQ|NbaKP)b$+lT8diRV#=Io<`9Z=RT|HG|hGAVyuW3AMj8 zwV^sPYTSQeF*<-cNwVloOz7rxk@GJ)XzVQ0*!f+d_P0db{zYMB-+~&=#~jpCfW!-2 zh}GO?g(j5t|DpwTcxCJHn^UzK9%(g5dU;^u?I7k)(x9vKH1DN=T@$$!?qrXFu}=Ma z4z1}W39qd!o=!_Cb5p3c<}&?U(n`m)#q8DxND!2XwzHAbF!?qOTtr9-Q z!nbH=F|XvCzScJu-=-+FAvX?6g`d(sJaY~;UJftJUAK9NfYIot zJ2C$FAuXuLA@F3VCe|WP(S_%o;R|w#4`U%pH zK=EvrvaMlht+N!<+$b!(rm!L8a(OwqOi3{~gFQC?7OlWbR4y@rQ}!xus!JaT#*ua>~I{S(~>V5d}1bZdDt zygsZB+o~pf1?|}!tG3Ppyrx(kie3p|ws*}e_q~d1W;wKSD-^x{`{BHacw{?O9!YNC zDTU(iZLY?BWTAMsZNuO`+C3x6Vyke{v)sIOU}jK+S9EC1_*KvmCmU^fn*+9I?L6+f z;=G$|_bYzN+gZ$eS@LSyDo4|63HTf6&FqPTK2R`(_Z&Xa3Q^(~0qO>y`7RL&6v&Jn zcCK}?^@*gL*4ZpTTfbAf6=ne``ZcyT{VL^n#NEmER7=l4QW0 zAfCy9HlB3zSL4YF$;OisXX8n@GoCz}9ieG-r8!T0g2T>%p}?&5J2vhtV}{FNQmx<8 z+**V0N#lpB_<@v-G4EZB9K`WOsfa{4jk zJEs1L|3FUBWkkC21Wv$+f^wKtFF4IV0o11w4YoC2gN>Kc5G>2hB`qkHWu|3Nj-E{t zT1Yq_Ox|d>%~NX%!jKgG*jA}Di&d>xhk5$zFd9Oa?Db{KdttR)>1~~@M!KH$6&2I- zYT=#$I`Vl~ri#{6_#@>Zq_9W2fml-uIARYcy{oOJX^zf2A*k^7){(^V0n)X$=G=HU zdAUvgjc-hyPRL;2_;TJVh8b?WP9++4(Rt(&U9IAfJcXe_LikIq^;)_rdX5!idScR* zOmuq=F1b5}`;x2IIg)jeeJ80vcV_li4-f*)Q z{i{-V7{~?I{!`;goa~6EDjhBLK!8H!QNA9f!mHpT%d@^LqUf3Qrnz1FoKJi^bmEA~ zlu&g|#_29@oCnz>Ift_2eA84N^5;;p_~ep7Pf1?a(^3Z9$X(=u&n^T0idH}!))WIx z_7quI{HYCH@LN;(co+P>1itZ3W#v%G?>IKK){h0@9j2cBrW6e?e&4FFlfSR)|NXtimaeu`z9`aZ-b0ARxP+rhQRRuY`N6oJu(D zKKogzszoJyGH$0{p);`w^3{4M8_F@^&2yXvfu!bnfhHO+Z0vynGl{}|0hfv;^cKUX zk`$K998lwZD=&i)&1Bt&ot?7}B_b|X=Ed)(mdq=hH;`Ea8=8JUWS_#`7rA{m9gC#u z4sI-KoVxCGW@3!c)$a3v;+!7H_NGRKJGZ1Abi{Vu4%_2OwZ|npX%7YdUuzF)y^m_` z_JFcF3%6UqZ6$qG%v2psMN;OrVChWa&gfJmv+sQzis(ra?)AQ&9%?=byF!g=?1DK% zG_ql#^8z!d6@N7u;xZ1_6CMBtjU|b+%kQuGI*cIh0txvybmKVut+D}Q= z0R4sMzucMp7tUXXCG85%ty|`j(KTweHvk>1%}5&KVcu;brPdqy?XN^o&o#0(^!dyjh<9#{NtC!?(zZZMBSyHOo=O)A(Rj>UP3;_Ltoe{8OwT z2)Y9pN$=z{^&rIA|Jd*+Q{rTDvg{W&>Pr^7>^aj=u^4oID@oP>wxo}ebYVWJ$L=oW zTdDR&cdMMf@E$&!HXyYUzwfbOc&4}aS9LXAL`jRRnuCmFwE(A)Z?lpXS>h>`v?!m_ zH`KjW68mj$S4p+-9V+Qw_DP9fdu;e)X-U4#7dLiYve+7Yus7di>J=VMy3fj7Y}rhG zlROsZ^MJP=@*0USg~A#9>4;Kd2=cD|6I`orR%eCp^OuJ|0sq(e(;jyoz6XBA7bWE3 z%Yku}P-xGAqw{E{r#_m4i{8FLd^CvJ7s$xKDD9urK*rGzriwwhuYPwDse6E7XzCJ2 z^ZqFj8(#C$8Y!0=tCp0kS-E}vEQ)Z0&?|;iD!t(hK%%IBroK+Ymhug2Myt99*b8$5 zjJmn~t!oPF-sYMqfD=Cdi`jV7+8NDe%;h&u3%t=Ojdg72rvqvsNEVICSVBM3kd#@y z6iJ>I7Lr9raY7Q?lo_ph(@~x&Y)j5XmKWAN&Ecdqywo~&H#}y30!mI7+2bR7MBHw- zi#RXG%{Ey!mdi7*Cq6H3YB7drMO$-Sg?YGjMh7ng)#HxwId;0!Lq7)vjghmd5=h4h1##`~scx*=T7 z5Ba27%p%sS$osN`%0y$VI9@(oc>DIGeR^zsa8+*yyc|9~^8%W{kzB&B9ZPR6nZwmt zfA}es`#4AH<(N&VtmjxfLYQOmds7uBIxY!{1D-B>!~JPqSbg#oOv36vm@@x7w?F7Y z)jMPOVCm}CUwGSl91TiMNn#?eYx*%b99>Eo(BpI6&EPH~aJZ$bndUPp@r6Rv$f6RP zNGkWjYSvv-)9&e>_{GHZ^f1vy4*@6N>fM1-4|lK*qq24PH89K#4QEHA1MU_hrzK^_I z8oOXPhyq1QnNtg~sc_#{X%IU}$0H(k9>;)OMQxE~&jOu5Wt&aN{^>ZJ6n3=CV4B}0 z?1dyyukbXz&NDJew#`*UJPF6t7)9Nm7S)x)HKl7L-;|$EOolqMG@-R+U@8aewNuwu zYA&iI_Y6wq{@LA2QwHc~Xf*{GRIUllNsRyO(n-5YtN!@`ow6r+_T*bu_b=44y%C&A zD-Sgq+dpFaC2J3un_6SzQ%F9%aA>e(*K7xS&;lYw^H^BId(tZ6`C`sf&9xUnvt2tXme7<+6WIIcDJcS{g$jPy2_LJr&FlT-0}${fB~&5$s@>e{M@p^+Bp_j(SZ z!zNSy5nVvRo3sV$3U^ZY{jlNaLPCns=`46q*UR1ld%LZLnCvUDt}8`1Lm8Zwh%&0N zt}EG~HG+vQCX3;PGY@J&+qm~4wB{(ASYCo-j_HEIo=mrTuq;!vCoy4&?_+NEv+zVS zdmxJ{bDsUMA_sdDxS{e+k~w&damsQxI)Xuw7@^hMT-k&&eT#2@HHpkBMjZV*Be)3Z zS-gYRd*0SlK>xeY$l5a9{Mn=f6rY=bu14wpk89QVN{GZQHq@rrc$m43WbW~kTvg|C z@oR?qhuA3-Lb+JE34eZ=c9pDKxMI4ox4CZ)HQQLqi2yDLnOZF;+R3(<+yy3=yXQ^E zxH(udiT2&N-IlF&FQMXg!zDZjm!tP)B063Ks5bLH(hT*L@>0cKiB!>F<$aL77EJ21 zVRf!+O6-rl69R26uGoVnY@z9*%haW8AP&{4!`m?N>O@cL$RxTbHhMP^*(M1wa@w7R zeZJ-75bdj;NBwl3Jyi3<9X*~*a=x5&yx=tlQuOs{t}QnkWn&^!tL8;2`O5^#t!^>^ z!<+q9XHH{EG--{K>JA64k$K^BVy`!OwvH9in=dNfe9?OCpY}JFm#f=~RsYBgyM9xp zk-kPry>5~-arY`$i9Y>r70*kgg0t53x!d_vmF&i@BXQ)=%)E(+oco0f=%$&sk+5nc z{10&iR?WsOFAuU}26~c)IyH!FejQ`}x2->uTj@)8A4k@B{baq47%OG|!D7JL-MtL6 z*ITk{F)jq=QZ}K~t;rpxp5za8ByaoXBUIxf=zkPjw{km=J=k)1I4z*>Q$!S^f!*fD zv2BqgqW4&Ax2Klud9geu&-ekDgcrlQNJX1S-FwWD2CMdyqLy&Tk(J^)};BNUkDN;W6D#c_U~o4&>94`cOGM}32~k2QH+$)eFy>{aHF;7HtEpNS8!NOc9IVatq-D~^ z#ub*A{E0+vZ?YGdHYZ_5Oh3oEqZchQ(&L!?RqGATlcys@V@F5*)!dR}>DmR8F0L}| zJ`?b}q8B8k*+GxL?13q1@o|^b=36?{_R+u(qjFB9cKh_u-olDoIzNv#8!VNIrDJWm zo*1388!cVsYoX`MKQk%+8@cCO7UgTphP`i){P`3DM-^GeVUm!o^=Ro>7c>-IOOJGw ztFsMP?#3ITq9osZ(OvoOmc-C1HR+0-Ag4MdQMxjjgB)3=RwW#whNsTSiiP)s73R^q z=w;lU;F`fD-)LCZ_SE9vm$VJ=U%|;-gsG7{T-L69Lf+`?!A8jU`>39F!rX~0_;APvedcG& z6SVd56wZ2NSc>i?1lbCAIB;GQl}sJqRnSmQGGyvO7|~6@ z@yJr0UCEE2$@Ev} z3WcCnpsML>G5Mtg=((!^^jNfG5_lVJ3i=KtvE@7tK?}5RI&pB#THCoK_^M2Ly68cikPH&jy!FF z*eoPeu?5pt(8*V&QLk0hQfIS1J)O2bTuOVcA`w|&eFfK7vGq;Dx5%$cE9M}elK{*C z;JO504ggydfH{r`?DVDcLZA*OW&gY+jyV8uP1TiS4gk+j0OkO|wNe+u8~~J~)1kN; zdf1ooYh#~1?T{gYVK7XkAu1fQt zT*>7s*FZKy7sxMK-_3%-0_y zmnyB(iHv0tcb?N@#8R&{`oZHJq}p^T;yMW{`GbJ+RK4g^w$4=YGSAW2*$#DeX8?y5 z_S=%20gM&i_+ICJz%f;*n|(Ms(a~G=utF^fMw;EV8t98RJK1FvwA6 zdJ6S6XVXL-6kP`v%|_5xLif}q_x^Jcuw?0NmZY|uCBy5yCzt2mTv^GoLt5&}&V}tD zCx_qvmAs%@wS`82+CpD7(PSLdYw)8cjbn`jL8UFQTsw~u!lz1-(v`y+Dx0}?~k}={>%@0 zXNm@Y;nxkmR6$|mYGV43Q~@a1@_fZK6L~!rZhi?{@lmRxZHfPa@_fpi4JDJpAI^eu zcK5PO-=%QajY=^Qj*hN%UMM7Oeb%`_&bEHzb1Bfxb?^WHdTnXHYVRwVpcHO*?Bh#` zl)DpFzVWXN8d(Hkx1;7~N_#nqCD11*`FYBDGl^U#ZbQ<{=5Y%`I*4j8yX`K=%s*$1 zWW4JIX(POFPEB8@JhSH0bpdO2YlgR2;0wsnnM*vf8xsq#M%GN2Z=OCKNM-1a&OuKv z5#)RKJt=yB$f}SsbhB53HtXhc~av z*T%L@&dE1S;m2yVtYM_2n(Lx}xM9Y+8%EdAOs0Mk-;EkCThyI%bUnHA^KGx|`65C) z`eCc$I=R(%xUZL62$>G(SG^9XNF~t$RY2PSnZBmVa=LF5zI^mGeNnEIVn?N5?ob6t z2Q#E0kewfbd+=c~q5Yat;bPKrMxL4lhEL0APv=!|hM=uq6Q0H*PUz90T)JT-h>s_$ z4um8@S}{7W=4aA-c)zlqF77nku=`W-y_6SNf#mor@C0!CWzhJn_~E20PZx+vcMPxx9GVBc(|9Q`vv z+bhv~_)K*bpwr%@fJ$0`w~SO7j^0a({$hMGjZlr=hbMbBu^4NRR-^ZKK`W!S4vGE+ zC{~*Gr**i>AID@cP#QPuNM>Sb_6Qx~UG)d}%M_=mSN%YaUK~Hg(QL3QSk0P2hk;4u zt6=FGq}uunxo>`KY|_o^M--NxnW`oie*gQz5v#~c@{Qgv+@E%CeE_U5l@PvO4O1~= zX_fvNY5#Fl{y_rQNSOH$j){ZAHxr4o{9E}vUZocmnZ@(Z|6qdWavk4y(~8aG;|n znhX4{UkPHaRijS=nwlM&to$SC)nq$OFWNYb@=+DdndLHK&0bXH;=HESJ|i9;d9YTP z7>+)roQ)LS5M0xjE@oKB&S5L#S?y(-0Ivw z9<>*zkbPed9>~78@F8>Y%+-`3IW#;KP4iTK4cdw+fwQf+i9vYJ?xg+xO1c={TNCfa zA`;^t-<@;sDV@X}!SL(4vFBMa$}3C;W`>Jrs~p!9%-sV47xmeb`95TKGZo}kwT&SB z7)3%};k)@Z(8_-o-`N%P-*S*}CI%eK2v-1bw(v|}P!H;jtS$^Xe&Osc94s1+?k9_& zZKXVq2CIiJKo-T&2deF5_uy>S2X^P625R6K*xdo;5r3Vk&(DHaFCP$kT{*eFtQUG$ zx_dIBlVS2RTu|D6FDd30?$Y!YfuBN7mIm`6cUGtec%m5`R-9L$|KS@ejr==?s zUCFV`ghF@e?@vpAmGT|SN|)c2ev?9iwmz=(@uc+ksySR5BoZZo}>_pZxv8dDqN1uZ&#VbWi{{d@o=r2#u zM`S1@xg~v~Oc7RSmd?vn*a}~mJZWJ}uURiDB+AWuhX;R(^ILODp6Z z{mp1^)5YtnjGS^PR9;B_8q2x7pA4>fJx;25WVzk!0l3jF%2d1A=v0gP zEEo1JbBu#(q=p0%_oORU8&xY#!Gu+YuF!6r(SVCp<`dNtWw5#)2&+Bb; z!H*IahZKS*IU5E+;W>ri+Qc0eE_+?#-em!o2gX5^`2SVdf3L*-jly$|a&B$es6(^0 zlp4#)X#=Daov@bjB;lz6xaP03_&$m7V!W1t7=abySTigSMNh}cjS1`*NQb1~O_J5{ zd3Z|3Nx7A>2WMNeyJfTF!rrU6g1KO-+I!V*^h2{p;lX1Z>)ZSZP3sBrbqBaPjG_yN z9ab1wMO4iPE9tQPv~Fv^7W_3I^jAjr|1_~?{+l0IzTgbf*Yh#PVfc35AZXnMw&mHV znUQ#MyNYzSDNb9z8(-%F<+iGI-l#Co+2po5`q|=Eg^l>U z%h6t=#G{s&8=8kD`6Q?+iHO;fdiG#7G{hC63e0B@dES62-h%$}yn!|>JlS}Ia+}W^ ze&%_DuO}jhCHNpYdX} zvri$|FBuoh3Nt45`)a!y7dxtP*`CQP!Ui1O-3E;PL3Wjl z^Bu|eb2RQ9{wo5N|Bd|3e3BnXQb~~e_}%z`AVK@hxIIw_?1*AhI?cUF3F?*(8Q~?l zTwGF@S@gkl^1n+7Ml6Ae9`d_6>kfqkZGAeH?P!wiw6b++g0>~_lYfG+V4^S!GurDa z{R3&~cdLxCtaSNZ>31q5XzSxjA5Thu5AEgC1Z_(&r*y$ox`oXz{lT>KdsN0USNdKQ zCci8FtqKX+`nb}U`_gAO`UF0<75&Myr<8+=wwzRSml=Vsd6(yZ3i_KnwwUplch&Lp z$JTHB*b)(R^uyS?U2c(rjjf;iv84{{9$O-_b8KuWZ_E+yU^3ci|1l9d>fO=YnxvZ7 z?mkt2mFbgFkWQV>29Kldc`ddbX1*Y#i!o&oj3?vqm_l$|;(kFPxFH>zR?%#1D${Ii zsx29tzS&%h6+3D%jZJ6n_As?~e3<4ZO-js9L-FzW%C^vOjJkhze5il6-dFJxP{mC^ zC4kI7Rloj2kA06qJ(+KAr^0UB-%EMko`71R&7X|_HLith6b7NagHQM`5e-6fRF2|cLK}x)$<5=7JrTB(pL(jFW${3eg$nm z9DYbW_Rj*>U1(b#>#=t!mRpVp=6X!2+;Zf8B^t3rzQ-(gUx>?w9#x7~{t|9G>o4WKlm4;_%*T8u{bhw@{iVcN zf2khymq*!QTkHs1^;fBI9bF>1lAQ=IQy!Vglm~m6veX=p-$H{IZ9krEP?pDTI3qSb z(Im1R2K_I@PA4~13n!eG$(-k%=VVUPp@hFXI)AUV+o59iTJ?an83+3!Ury-?NAY(f ze=|4p1F0!G2CzP$Ptbm!KJEAO8_!aq=))pA3v27w%tOo3d5LHTE6L1i))eD*HqVn;c~l-}N5nhK6dc8Sbk0!|;@y~ZKP(ZV^@-4w!P=k913FX5>{M*_H7o< zuJEvuG0ugvi}Kr@LzBI>_Otn*TKM;0xN)el_cB`HNcESqCmIBkL43fFRPPvYwPxsi z^|9zvc1}0E{>-3WuAgFOaU4y!R7a93ul2Sv(R%B%vvHk&?^dn!CR)k1;&Ul0?q$B#58UJc}{#703;OO)0Vl~Hlqc8Af;TwHX{#tMJ zCBCq+IgO!}u-nV+FC6d`*B09UeF|khO=a4Cr76Nq?6KEAdGEyfHA~ocv0dsflR2+% z#KF&)uKpEIM__wgX0|ZQnTg84B0^!+A4(ij&KNyvp6U#de@fSucDZlrmZ5aVB>8eHq)7AEwRpvB#ecaGCA+H>(^R zd`h^KVu4$aqTkPHz%qA;@PH)^?{bF-yD%Qzi^d*tojQEnDiV%&C3ve6)K;YNb2=bB zg%(`f@%axiE_2TWJY75;dw}BU3WBG9OrQ3H{JM?xZ%6 zJ?8R(t2#WL zc0e=d3?r4zQa#Ih40S0EA0LF@Q_^nB8|5RutB18}AJEuF%_)fzNQe5bH6oCP;yG-lxaMk1)Cl z!e0`_YdtVze}az#$Y2ZR8A{>z<NLycHWyK7#aU5)FL#b6r z-bJc+l#RER`mHW&scvl)6b1{;gFxQexMcRQj!Vm_d5!Qa%ZVWT1vpJ{+LpElJB~7h zjOm2h=5SjI=IN4h@=`MWS1}t3j+cBAqJftbDO57!#r$dOapt}Jz)uv+VEGgut8VAh z0+>Hi>AY;{e10h9f@N3Q$5gwvj-eNwHQ`SvkGkb;gG`0U@SUD)dr$c7&maehE_yP+lxel1NiK}^zfk!# z7Ds#L4-)4@qjO_KmEoJ1b{6oo`N!BVs7HT;mTO$&X+4aL(1(`oFt7G?bTt<9knuFg z_?dk-=gTJbmD&|`Px5?)v(%8BF9fU|}0jCr^xn4cre7v);4uffBVlD7JCjigISYT9S` zrPA(x_P7CDOu=F*dF^u;PT*87(7qef`(@!DQ(DoeKyy%FbZhIC%a@z`vBB$9oG+E@x#e(Ain42h17$lF(e^0g&fXv4 zTrm9}fZMiApXF+>u<^`ltov22c?RwIdDrk^FS6po#uKc<3mf|s!>R$A)tCj2PvAy9 zmZg%=Md3lT>_Xp83wtM72ZUu3W)AiLPrw7VI#66)+xR)$)Fo64p0(V!;1_n!TJU;m zp0uEJkdhYE^pUjSkBFbN;5EcgT2L~xYe8B~Mfj3T{ty@nL;Q{L zx01g#{52-SA@Tcgsr?SyZ{2=J?03|D$MhS-FKZ@^!^6@Q)x7BDP==qAO;^{NN0;Ld zPx^RMdzRyEDb4QYrbS1<>^8hD4H;^Tgn!apWj!((It>0SNWeRBMv?AiXX`o}X9rUz zI&}j)Kxcz$ucA{;*DN%(TW%ESoryatbr*a`#U7ok`CeqsWO_fGB$FqhU=9t7Bc<%j z@uN~hfEtathe92^jlQ()l^}t zC(N_(2kFaA_4TkwUP(Z$!P9AVri>6HoaLs$R~x)nQ5tgUZIYhwYZ5q19aI^S_dBQ% zOMu%&d86$|&!l4h3SeH$r##7E=zJAU7SA101u=36z%z5Pf^=~Hag#>sd^BE>QGm(z53fxfD4|?Re(O0 zym>UU(kb+H5KgN$T-GnwY#nOeXX9;N>B5Gi7QX1upv!Hs!?**+St=SO&RD?p}z~T zx2mR0hiH7yt|PMH`1#q(RFW~U<1rM*Qxt=Cf`BbTsh;Zua2N}r6~bY`HZ?uS=WuR>hK zF4jnWIR2&>{S+nLQLV4skGUxR6+1~IBfJTm_Ms0SSvjL{HF|yG+0e? z=!CnZ>&eikVk}!mmw;2*tXl11R;@hvIe>FTRiXm`4LFN(V8zD0BtAhNS`NUj%%I6+JVL2 z*}RhxaWk0yKL!YE@O?Bhj>YeR$+T$aL=iU<^_=}wc ze3AeJvZN{0xByt(Gk5Jj$;wv$9z95Jeyu5C5c$JP4b!73l@#AHyu%mj z!?gZvtYsj4wYZT{>u{kZxtUBBS|3Y%e5U%WtuR>}`Zpp@4Hctr@#V&Xfy>di)ikuj z___slqHcPcSu)9W#MC>+WU%)?8y|uTM6QD>`s+^XySV-zD;i< znAdB#np6spp*8%4QQcKb;@v?!-BUY(uiaE)@Lt(FvHRMd-icKk_D)itl%>|rP7JgY)77x*GydA+Z7FF4Aqn1NRT zj@~TEq_=SZCKBHwCw6p@0Nzf#sW3s|X&DM!z8W6jal~4_VA7g?*@w7e)!VG#t-xcp zSDJg2o4Z%TQ?ul{s^tlmt65JKf$s`!XLHRH7CiL^cMnVUyFWnd>tE33s+5#Y+uVmL zHIMRs&LQHTi&&otx*bJv5qPfG2b`e*rEw{mm=L!dU=8a3iN*C>gEqIXEN?D3S>EPX z7E6AacEKuVU}@t^3G()d*sZ7yA9yW*@J%FkMld(X&g?c`=s?77V6Tw? zzp@#0V-i#5!0NX?axe)K3zq}3L-r|u9m`BkEpW%nNHi>xl$Y&-4j))c0bU-|FQfi$23t)fa!JV57h`|1fR6BLy1+Hl4-WPcY2z43C*qXlEhuBWX5C zSB;Cah|Mx)F(+A@RPO7eq~N2o3{TrZ!H4gl;0<#MX293$hJ!nxxE^_AY#K|?R%(wc z)zQ|u&dwC=%laW$fM!Nqq_COoZOh*CiU0|FQwOI4^!3| zD5Q%lz9gBrSa=a-p06_FORa6M7kl*c{KW1IoML=;7T~*Sxxv4c!IK0l70|khvXBO^ z=F^-iN6+CK=lU9(_?ku1u68ke!waX+f)o6ncDHtT@JmwbSqowt-%ZGHt<;<-`Qe$Z zo>6%^pD5uT5=Dy{oEzpT+|HVA5n4l~CZ@LKobu?@>$lQOZ^#1WOaezNa9b8AXA(GS zfp5$LMM}OieStlMh|WrdOR3d`S$)rbIH_;*l7<+;|vnU|yqny37C^Yxv>wKge(@5;e zSy4%i2Stgr?R^fl1h-5CU`W|X%8~iW>+Uqay}hu6LHClAmYz*bytHJZj)j=4VG=uyp0(L@Sev=Hw!n_05UkeGxQ)>|=c+JGRmcYNG!tuCXL=J+Z#pWS4Qz zVMtzGSYr3mqK)>tXeAd7``=S#3?pfIJo#IX=UcF|=VsMCePisJZ;T(N)kqqZ-bv6A;@Qb zST6JYh)4Ws%*$ELjG9<3XDNe7;B~xjBj~);WCtte=UFkUbH%VxkTMW79+S3MMO%!8 z-$h90^J4qNrT=6#{t$}aTKELE=D7Kyn;wN@cf|4hQ<=B3VCZPJ$=m4r3%FcDd%7cy zO$4DQG+I)&`BYjwqsdrF7 z^cf~uFn1$enp?C*lU9!n;|{)1=un0+aT3SYDmv%QFb1t zG_AN*s=kRIS|p^t z$1KrddnD84sgks52m^dL*)lk!zy6VOp>U~<-PQ^8 zHI@h0LKyCacV?{qvWmeC8T2)&e z{#3qRwzz*L)VF~8MzQBg{7{;Zg|e$_Z}@XXGHh${b|NI{Hj{2}&5|{C2ICsT=QyV^ z_MkELaE(D1WR1~3(C-?f&u2f-?;B%}tTFbWG4@CrW1x!Zc&jG0_yu@vTI*V4^<%?d z&b3A#QghZE!Eb!057N`3t>~9(fN`@;OzD6zkLu=XL6ombe}na6PhkV2SUMM%E(@dZdx|$ijiezDL6FH(;{q9qv7*@Uh{CyL)6|)+76- zt--1(>yhS+p0QZcbUiY(WGL4oYZc-F>XGK2d7tl)p}8Hh(K=*|sOqVFhden&Vd=oq z_*iv_i{#qPmt-wJwPY&kkUV(plC`cwhRMJ>WO#muxR6|j_#EbR$X;~FUamvx`3@Nw z7;zm^cO9~HV8nOGURj6iMThK_cF5qsQr{s>*CF@04r$Kokio1&PEK26G-!+6=6Kn< z#=3!Z4mZq%Uzx@n9~h7KWuY}NX1LXB1ET}u9=ml8yU)PQ)`8tRhaG3v)q&Bh)SJ`1 zmIZAwamRw!&%8!_YQ1B@%efno##=G4A~w6l%X2Jv`3_m|G)+3~(B|QsjK)_EtaME} z;hJ>Cz)Fwwbk?NPAU&Nn>9T%r&JZq2EeFcdHKU=0dsCU_7o8{Rg9(x$F>jMx=tmG+x-Bzx(;?=TH9xpW^Rs z{=UZFBL4JG@aq^eivJ4Jit12Mok zkRO~w&2I)})zY+~*0a*Fc{cKZ-htGNuM?Nw!WX6*Ey*W9zYesyxTGgoHA3CqhmTy2 zen;HNokXGtTSLB{?`4w54?PwzXPc=l*qm*q3j~|9&2)l)XuxkXG4JO#9u{%eh)NEH zuLRe|n)s7=ym(sS(4I-oozrn*xdD%hSD#eL2fi$aS8f;TIXl4XoE_kGOgCQa%go<{ z+A~8)8x_4>C?Q?vaY}WqF9a`7Tg!^B7^E?L`cT5W(h1DNg1_^TP9Xff9QSDNIvWE;dcXMpb;;5!+Bxt$p6 zexD|h{!kFVI0M{ofL~^SHyL2rM__>)6ox6``zGXqY^v`Kb=b#VCt_U~!VxcuGb zY-6(2?4<}rZd7pO;x6tCA+G@z=6MRr)a^R}GZ)C$tymO@TW`CugwLs8Ti#HF$ZrW0PPX+&$>Web0)&naPI4U=_<0XvAALa zjQD=|A`F8bmvUX!ua9YdDfd4+gEnC^THV&JFrogw6od^ zgOt|ZSPZun(4W8;@g&o#ilZN;606pIHCvs@^;`lOz)>tsyWN3XGYOgvL z-yg((OMTU0qv08u@TvGm39i?8sRfm4_-awpR@Sgt$ag1^KKS z2UhaC=<9s?3dYDiqLqC5jdRn}G}gJ_c9Js>gJw&ape>=Jxm(bd6w(|+9pP}&Cv&ZN zT!#d02_uRr>BM5T@-gK}yUuKuNM@7#qqWW^{t}r-vdbC3uc9BjclD1hS*P?vj=p9= zTC+wrjrF0~uHFBxnanBNm#l}d$R@tx<)i~C>uRGJ6xK^paFE0#w|K>$>1$oiC`W%W zSAEi=@QRi8Mx|?>>`4pn0`+)~@aENu_1gB6h*h-Hk{OPG3wB__hSu%0hCj;c=P3up zvUkbK@q6wX#Wd|K7E$Oj}HWyVnr0%KKql#A8d$?Vz|Di~X-8b2s z@gYevc5D8d-0~+p2aUob*iCagQ_LM_);E~W$Yfw9(DksxWPqi02b~Vwbta2~=ioCZ z4t619TiKIBqjxL2Pk!#{DSQl~!RFz>#Oj+mR12Nz_zN_cJyFoQoj&J&OZ-WVv9}gLeuN6d(H+jf-{NIa#=*L5r#rG(VemrEkjYj+NkQMPK6h}WE zGSM4W`l;kbV--!uTqI^pk)V#Tr`nlYkc6xU`=H zv`egmV*5!z1My3gmwpn^lK3kE=_dgV+Ih46B%q=AXNskt1hh0>@HasENkGGKT_F7= zpnANYK>A5QBk?f;=_dh=##acWp9C}(KVKmIB%pBr^W~+&n9=0rgu3)Oz#I7E;Jic8p4X$AiS`j~DAn16a*TW$0 zMqz;)6U!1x*v^Oe1bIf%V6q5KQB8B!MlA|0a$+C>E{cy?0MMyA zB*4Y-a|BdBPOM0PyTo@1sDU+6OMnCMmjo1XPApA;OXA-MC?cL1N`Qm$(g2|7e_}}j z9E#V^2QG~-5>O;FF_FX^wu5#f`H7^}ChGC46;nh%kv7Lj{C)w&CQ{r-<1fsEjm19^ zOzX#qabL{jN#SkK#&u$k;hW_$4*5aHa@jCoi(YDs?A^fi^_$%I9yYnK!}hqHcPJkE zfLRp11?0{WE@s9#SaaeQMYc(H>bQ7SaRHZ3%+PRoYEh8Ot`P}u;QJZq|c*FkE86C78$*UO!r#DR9OWqSd( z^d3&%^P5=f?+vmZPo94=RQ-b7Ry?!4Yi7%9W{YcPkt=fdRL_%?-etbIuwZY{EgV!h z_fBV9!`yclig$Bo-rV;Via$kq;gr4b-jBNW&+a}C&_>+Q7z$sequ{>ywa|e-B5W(H z7+p=k?~12y2ifQb54VR>CYjB>b}NM_y8RP3E29Q4Tr*F^aGUJCnw;n zEZ%CHv6gEWRs9W9yY8&Tn{GPmJ=FIo2h4d4IhW7t$$WS5d2LVgDz;uiDug^CQZkcl zyI}R{`2e9}q2;t*m!mD+S1ComLG`{ed0WuZXb(ZSW(;4QYx6s1( zi_pR&h%Wmqf!RuFi>8`S4%*6KbuGm9KPZggL61crZC>dcy-(LKqb^!5@Q2)is7P-%)~W z2hkh=l+MJQW}Si2hHeL2LZ5MEpVLr#XO!yfbU6^A7~>egrr3(F@RZse;LoBVvp zb=h)rGNjYXytngF&}&_WTe``$D??VlVFPdcPRJ>|4cFwCU6Q^WXnyLa(sEg9sjZ8j z^_Z^9R<(b$fc#f7K%N@~xQbDc-{FY8+gh>peXxM0dcs*W*%!_pfWe|OGj&)UILBWB zA6*dm3`e2QV#SnM!E-#n^- z94a3k6Lzfr@Kw&}zOG&tSDXa$lC;^w#qZ(C zQu(-g+L~~xM~Oib?yB~f4#FSdwdj){3I7v!lNDU}Yje~m!(ZV*Ii{`H(Z^}Bs0zM{ zQzx+l_X3%`EFY%^B>uy8aD0Zw&SCkmKE>vp%)o>J>lQdJoyU^zw`d& zLc?w<4HjeH1G#r*_a3k>2CX_%PcT4ny%4TfWA?W@kHrvH=fmN+waN2Sa@t*$2#*(o zTcy1B4T_c|{EJG40u&*FW7ZN`C>--cHQCo>m1@-?S>U{nc<278D57~0i#miiJcVrp_L6mO4#?yaQ(1nUpj923I{h zYYlp#lI$gCTX{rJ$B#k$)}4yIClHmd5RFKSaiH!V091N?RbCqSR0Sq6kIZ`x%6ksU zd!8iEY|s|A#prSn=PH`_Q6f{Y^OT}1bWf|>=VX;Z+G8O+N;^iD4Le4!hg`6Bk|6W6 ze37bU8gfkDb6nnYf;G&(0D(GLU_)W`$!@DpbKr5Fo=kEK6Iri#)s-xWn`?t`H5Eh1C~C4U zhimXTm;g%c6s^K7g*G}dDAj+KF8nl@wOH;c9 zD?z_t?;&*rad5{{Dk^T@AY5t49iiDRndQ$2+UpfNTuWH|M~N~U6ISP;nKnBxborY;WijgWU9xQ`HZ9wY>1={&aO zcZ7e93Hy5CCbdn#-bi3?%h=rSqLzkg+}bP}_RNot*InRgCum{Nw%pl|jDzq~a?Y3& zi&EvzMsr5gu>~2_I-BHgH59bJobigU@rv4ka*lQm)@QtPh(0T^^it?NQBJp&X>#N( ztd^c{^Y#8@A*wx`=19~f?s0b)Mh= z{{-M+T@G|JDuh_OOJ2jS7=J>+TNz$i@RjnyfK=`1E#SrF^~I=!L8&ZPhok3k;S{fF z-2D_Cl`85URj;Em*gHH}YpfdR9jI+%`JpVTDD&PyF3k#O!Irkh;u00P0hIfvzX8rK z+oy2(!>CiZedb6gUMa7&b}|0`PEeF>gN5ZCqd(YFjQ87FSb2D`(irDH0hdvvM7Yhi z(ZjPqGTnMc1$Fune-`zY!m$_PIM=<^JXY${-aJ4Z$wozrIO{-! zxd0>Od%o56OHlZ2;VGNk-9Z?R#;#^IeWSamfF?hAiqYNjB|-Oe1!0{#3&J*cE)}N3 zv!Hi$1!15&3&Lb|F4eo`10D6a@iub+P>&nH900^H3}6lbq8j*;?o}KHUt&jy{iD4$ zg{!z!J$4fmxIp$_5))kUIkeCn`P79{HU@{jBwYini{&Qw|&oM zZLL_v(Do5nZjN{4pUeUZB)l>U(3ziP;uoo0H&^wApP|p)8*YB4>kFTjf`YcDAe}5i z-?ga~#nv0BHS9v*a&)`Kpg2Q0qD!>F<*d#0M6V&l>`_XeZ9lDx+n>cIAq?K$oOv}^ z%>0laj5rETRX)eZvW@7(T0{Z0&KDI_w-__5)3ElsMW7HmsC7Q?(&-azqqxqO1Q@Z{ zjRVM0eq$(|FDRs~UuOqr1)=hFKBIt9OTxv_vwUiw)Y#nnefbWiTVIxK1y1OZVc69+ zoy{gqQWwMVvEgqeQf1cz7?LYXRONsEC)xjUZ%w_JJ_)v{E#}*T+|}EHR1Ii|?Su+h<32R>|#*dB->By&*G7 zxdo`!5Y6^!RleIh86aHs$3~^Es;?!xJ4SycBR?qLErl8JA-v76g6pYkM6N`fB~Ps} zZ&cy@b8=Dltcq~(XNJ6!fu00K1E^FIz>^(dQ~(%ft#haYtWRSc<^V^gfWsZ&q7?8H z2Y68mcq#zf`?$fOWwr=2smvi1w1teH)`d{e7BU_ngo3t^iC}w7>q01K3mG3n2nB5+ z;{ie_XbTw+5JEv)$QVF8MMbh*vDzHD#guw1y?c9)E$g$W*W(5r;#k0zroX% z@64igsq0Zd>cFD?y3Pb-U1-0q9|5TwiuUWe1dw{NXuqyk0jU#<_Uk$nkh-GiddhVV zizeHCX)$ZnI!6&Kc}d@5#Kc|`4=5FM&+?_>fj$Hgg?0Pz^dbjfYJnhYli^ynxKjfq zMQoE`{I2yPnr5@(eHW9@%al*Ca|A`OuXCh6mTN@SF~+htH#DiSq+UgdwlQ}%M{=I% zCPB)rbCoTp57@(zF(aC!HuVW-vgJDob2q*RPuC9cA*Z>$0@;E&B*7zJvdq9($*CC_ z%hQ{I$@28*(%`fXeAV*rFO2Wu@`vD6sh#jc}D=p^REE9KKx16K~OZ$t_&14SDZ> zqV_&t$rwxkN0qELqRg2KtP@r|OHe8gh3566U8ahw;hanxIhHtKLy=1c|0Hq;j7 z6TX4MriSCcQgS(psDvHRwbU+~AwDZaWlU4XO)BH6*O4QVT@B6Af5xKIi5Qu_Y8lvS zW4Ty~uy~LL6qlZ8JDVy=yw!4}$LReUVqQJGjbe%zpesg;;6)s;9=q6=Rleae3vs|~!wpe&Ag&U~8MRbXR3XIj( z@_VA$ZHxKFM15gnyciyd1l=6;NgQgvpy=m9xxDEpDRQwztx88nQ{5XMVTkSkf=r=? zVC(o8wc`6E65RH!WHZkPnowJejwOc6vKSqw*p9~_&lX-zdxiJF7^1g=K!0OtHM+|% z39n|!+=m^EJ856PkMZx=9BJZ_)Cj|H#XWSN76l zK`k;1`>2h}0Q62)nHXd0$ie3{`GKF3z~umbx`&^tukAsJufIZcU+f4NwC#6`G6=RP zI?R>#n@3qLZAwosSth{Rol$GamGD3PTe-3@ioKf!6r3QC6ljeC{0tQ=K4cEkXwCCn zzNpnQx2Rq0`3mB(!UslkFC1Sm^(Wm!`ZN2l}q$tZ! z>mAEjl)J-q%suyH>lmHmzfyg@Maa%s$6zUMPg}=m%Gu4YU4&2f+9i7zO?m9(oh@sN z`3Ponao4+OR!Fw)P-4gTYaUKKUAPb8n$tL%k2_rpHJtja*tRn-vgG9i)}rirxY`odcbm;*8^@`Xf65L*LL^8tE>-{ z$NWB6pZ39|?*n19vp!HBJL!X+ptzGhutKsvP~xl)gfD&IQBxlj3rAD0SF0Yd=QqQT z{H}GRbG7K5{4{qDhFTRIH6B_25R+zK1)lz49J3?oLC^MLxEUUOTq$H7n0N_$JB7>OB^DKF#78$dLUX)yfrRt9 zE0QTi6AY=68hBlxqUi#aOW}hm&G9LzJ-x=)Ij8^A)dIz#)}EwT6F9A)GAcwLRSv?9 zY)pShclI6+u4ika6$`mxK>|?Favk(|l zm5vG`ZUIS#H@6HQ;`V}u>zRc?#d@SR!!87EtAcGt<;j%2G0c&*xW9w9xw`Td${(f25XIHnMJQjXj-S@<;=V~rwPo&)XnE-0z`>EsWY2(%v z)aE)(8X?atLFjI05$pY*(oC)TWEQ_&7>0WeKxUc>%9Ci~w~%;h{jJUswNApDo{yDfou4h1o$Hr@oON>!2vXB-YG#(FeiWc*n>Uxf^?E*K`&|SIDY_; zMAPfe0{fYNg&dMN3)47tn-6_NE<;e+nY(f^*QYVl+|*bz)H}^h2TiWTMM;Tg6Q}X4 zq&OW$%!zQ0A{>-NI3z74&EY&nSiv^2iJwbVeTl3-McM$8KxKep)8Dw0qA}&F5LaQFp6EvpBry_=CLYNal`y z1`4}vaQsW-ehGQMfxNe>ksS?vL!~6+TjARjt|oEeZ=(FJ@HZ-4E#ks=LyGrjmqDth zv-JYPrw+(Wja(;yLF4jnNIw{Ft2yuI_UQ87*cBQ$4c4)(&my_;AimK0t-|3<+?)Oj zj9bW>wd>^Fs*c$BC@^#RRm$g6ztQO_^q)6?)3InfS*?s&pw)8js>LPK!vndMi(ll- zOQvX!1Po;^h9d*l)-)O}e#*kGze27lEPHi+~ z4b8$XS;Afpkk#dd`m|1=)jOA%6XCknxfCbM_@QF>1#uFjV#U+<+4@R4HV1%<5`Z}X zT$}*R0YLdGsb$LdvLu2z07MDE8~}vdKVpRi*_dpw#nuyG&)#M%kuH_7zlBsv3(95 zuvyBaSU+?8RquS=M%rL%+(;pPwae@n@N$ zN|u|e!pn{SLSe7H3d?rGJB^w*Ik|O!H*}2ZfRvY_~_fGtNf8ayesAJJDYmM2^`Twy$aNOhV5A;rPvMOXN5sa>e z09XnClWPBC8w5vcgFrMB*xN^MQNR1D!xps}=-L4uC|xQwK{;ZcsjabdEUo!(Cr$Xa z9j*EQ9W=D&{}tbVY|RgCGx$Z@*HY5t1BtgSufdA#YjE;bpmVf#LGnG7PNnVK}ke9`_hKc~9l&j*hPtiIeG{O+*6bWM?>FiMOX0uTV#Z1u;F zKlZsp_Uy?dW?gZE~l^>s3t1+H2gcY=q*H=)z*&AFUvZNkjct4kKyV3A1Q| z5O$mlSx1e8sIVkNZhv#&?JQfj$h)-DF{o$VZFx$a=jzjAL8hCT=+f;tRa>b#mbBPb zt}g3hTUopOi|ws)>xU7d?5zw<9!jU#LJ60y4Mxy0`*h+%!%M+t2++ZzE2(94ni|1} z>4hjv)cN$g?j*$}N_K~$8p~sQELdStDjdJ8k}{hHjaj$O#d#j^Ifaq224k)U6yVzMj&VXWW95)Mu}3KrY$su zl_TbS@%O;q-uyfHox)knUOUWSn{TH%Sfu3)yK>G?nzJ|QaavoEWV=r6f+sX5T?_gY z?{m#jv_{#m+@*KaumROPRnyS}Tx8gI^iyb;w;C@HRn(wdeap>t6~^uNw)~M^$hZnwM;rr< zj!CANpnWSLx_w|VzDW#PRc^GLLhTMjdPvjrykp4!9?O3lF@{2W$Bv24;(eQVwenDS zBZ)X|;{Za#41INeTc`5VQKF#jlIqQ?HO_-n6E@8oYW0nVvBtR73gJm1(zr7GzUy$& z+WB|j@;1ZewPd^L`*?#^MC6YAyy1~6{jwC?R$%KsRBq`@_ZXkOzBK@%_8Qj3M70N( zg77N{0=ko~lFQL|C>q_f++rWo#qX5v?k$ARo{MzgT&MD2fO8$o!$J05fnMo=BlH@$ z5j-|FyU&`(#s*6(!h6%xPMKUEX61PSgsEMIffB#r8`(QY)6nII4Gy8t8u2J9TX%@((lIm)jQZB zQ3~#cxxv%ft_XF@t??{^<+st)`Hn(d0oH(HMyi5F8(6qXPRydXao`}GZz|=8(9L3VXOKX5p*6=rlYRf4lR$I5&pkJ8PQtNjaWiw zR*}bCt+Y)nzpK@E6@m#AJ`T@ukLTs5Ehk}^qA$c0qOWnbt}T4C zYoYyP{rfb1q(9QzKkX}Ur>$_W#?Th^=$yUe!Qs|M+e>zJ?Wj3yIWz6|mDSYU`^tBd z-#IpKDZg}I89Ed#78=WE$5YhR@J!-YHx@l~^f&et%HMZ8`oIxpAV@t7+9e$_}rt0`aKhmMk zF9fJtuvy?BP@w3?3jC3aZJ+k{@r1jH<^5RTw*9VdE63IS$Qg1}J8y!M1Z}0T1M4Z~ zUnO)`P2G4?LO0%4QJQ?6@A1R%5|RwB?HczErv_d5|MB)FU~*Pf{{P$WTYE1_rIYGT zCnSN8@X}QkmLPP3?3*CSA|i;au0-+0DuO^$h^V+l9UVo*Wt@zR zxEfIGDGWSWQub~(#P5u2r7~Qz*>A;VLS$1Ldx~-();QUA!v~IVSKBHMplA zsDssXp(oNdezH066VcY5_=(Ei6F=DlX~9nvvnPI{xIOU`FHyK#fJ5ge9=QwJ{+Im3 z8av=8D%APObigP4B%sc*mh^-*)AmX3>x)D`mq-MI5?S>FCF%7)bVr|3NKVnyq`RBq z`B(6bhwpg9IQ6;}bD^AbmtGzP)V?Pa7!o{hjsRYfVOU~b?gGhLP zKOwg1Az`kfbYYaGxJev$lA(q$T43kN=lyWkj@gl26HSEsbsiGiHkvJ8>6{}02vtim z*lyEZi0M%ZMyF9=CiMNyWM_W{q&nJC2@e(d^%ftnGc1FBNclt+^IMbwCO{8lOaM1qgCQQ+TqE)x83`P3+gL=h{|Li2@c=t_g|8j5#M0}Y1b_Iw^ zOJ@f9+G@SpD2L3|!97uNy;$T@#q?N`bAh_gbNgwAndhgPy`GXA2OS<_(iaZk(!Et4 zA4;tam1>QtW_wWvUGX+66rP9ai3IqF47pY0rh!?E~`CrUq@q zdw0K$V*_aJ`gc0;t`G1tSu($*L+D)bh$Ce7P%mMBdJH(&^mlx%UNgJ`8Ly8wIQ{cD zhQ;>!_*9*}!}0VLtUz)IzBxe3M17)B&(S<#_J&-ksxj0_Y9m)v7S!Cm4JEzZ*5$!V z4PW`Y8a*|7*S&xG^PgE6Em&fer_LRnyN!s_>@nIr=kG@TrAhHlD!vs7jUUWjg|thcEwr=C#&uW1N%&tXx*4RRWsX6n~!_{Wv9`x~pU`}{2^ zqj|N5t}iEX_HeSSFK1V1IdgH6-mb-Fp#)*u=y)ncFC5?@Vv2}tj-Pfjp!@agQ~Cbw za%UQyK}Z?%%HseER~^|6WV+KCh{4Eh5s>{?fNR$6`p=6NJ>F3#|B0`EmrwI*x9pAI zZtb=fYITPS;i^(r(1n>#@@Mu%jwLq^x|ri*3O(1K*=ms5IOvpN@HYU-@VAbPc2Uc- z@r|w#aJ|4#00LlX*zJhqcH?uGL^JbI4bbSDIMSZQI}FB$fl{9j<%-ui<}cxxI>Bq~ zQy&?Z5|nfca6cqKq)wI1H_Aeb+xjVQ?c!2)X@e}4QX{*F7ovyMKr4e9s63AS=<&jM z&Cn}>>dv49x^saNC`nHsS$-DnhN$`+Z%fS0t?8@tc9m_3@XkTIj69Zet0kF-MpR~; ztOM)~?lO#xoX|d~aixs2qu^WboGS-8nJ#Y~2Cy-@)#dQ7R#mW>2vk&=kw7%HM%1zZ+?<(%s7p0j8>oJZPN{=hg=+;D?Nqo zV*Dfhr*?AoUj3J(4-vct12{c{_jUu#lw_Df(%8~{xw>f!Dd`8*JhcauTt&J7n^1(A zCyBEwc-;k2p|b3r-C@VU`afZ3>MvsF8j0=RurLm|+{tko<0Nw;rznAPe6rTUe=C#_TTIIa)}{yWnzW54gN?&$t|GKyAju zih~4Bxtg;!SW42%qq)xN<*^CM=dfWh~o>hfFMtfcg*W#0l=RQPmeX%XRWitf|wXk(tg`cmpx>UB(xJDJzf|E!zbX~d2H z#Su4dBW^mb59b;Txx1bW7MaGPV_pKS0G;+GkKsS#KQJ*1e-{LNAYu3Nl=@45N-uTJ zm%_(z_|piJ4IqAZ7o_JHx9wTqF%+)s@8MhJqb!Rq;;C`2HI42(AkNk*4~FD@Jz_?A zI`+yUzto-@viAt4>1G+iwZs|PGBpnwBZ*$f6MY`*KjT>YDDPGN(Y;iY-db@;SAk=X zE+OgUQuaPXECkM@%GqN`GierQS&UeeV^rl-x*Jr$6Zv8280FrvlK?nSt&dmN4}p-| zj2#&@FLPAsjMyo_s=s*tWz3m!G-AGR^x;7RA2SMr)KRpp4^e#|GZq!TwD+8tLNxa= zqgak3SPepE@HK<^!Y>SKk{w?L4DU0X`5uptq_8d2-+p;U5=F#RkZ{ZMn=jhb|vy5!8E)ir#%wf~G=E8EYO_v8Ie-#cTUwtUA<+BzqRW!J2KNWRSYs zLN2kiukrxyAU?ilf%rJIjn=v_FMXqLsO?(COet9aY=1khxexTJ9XYFR_i2JKZHi0Y z)#*L`l%{&xJS0d`nTck+ORsF2PezT)>BmH;|DEHOd%R64QcTQj!?|7uuIJ9qjJ{5S zUOph)JGqx#y5UZcCr;3h5TGPJTW7we+`kbIy@Aw2ovZi8DzVF3#@0r2wy|aQ#&}+R zh1;1R^?a8StouAdIw@nm8m~+5PtcE~(njO`Fg-^Fy+;eAsa=BKtKbGYwn1*`*3^14 zz_XXz0;DehQm0lnG&N7(ekrxN%M>ixY941EXa<|S|4dPA^1fb=V((v6Ftr&qi+DI5 zmOhauCtB@SWR(@9Roh)eQ4zrgCokpMDkcB8g3*scFWHLu6BkV@N+$;GWkYz8Igj2S zPi*77+!<<9{^0BH)NLPJ0B z@0Ef;!v;?wM^1;d?~A3?8-=Sv?@bClCGKK-SnIt(VPIPXX}Ye4>j*TJ74h<{BS2V^MmD+a+M?qRNx(DT2!9qEkutp`GDcwR^bA@=rLr zL$L&RAXE-IwV#Wh*cy@%yB$0Li~XAm=1K@VJr){&37ow>E2Z{G4%I8C}B!>Hj% zb}j44bBOYwYcz9R^Ua#bvwIck(XyB0?)&wkN&J7#^Nu{v2Rsi);tE~8<7k-Q*<<D`$ zlcD`Li_QzZx9Cyqy_H8{>suJh+y=33UZ2w!Td2m8hEev9{LJ1QKK_XhM?5N+wuWAu zK2u?b(`D*l6|bjCl97{`N60JIaf$JcH;Q-soyryOuov+Qz2v;(MfUEz!{42E=-qgS z2ae1p^e=nK_V-t?5y6vW`rW{hkHOb@u$aNuMdtq>W|Rp9iT!4;R@FwkvKRia(V(Ic zXb@(b*u#Ijzbr5{zu2#BEf^kOYhTm1b2un?!4gZ)w*ib@sZ%trMStiPBRoKIPWV1D z$Y92Lvzpw$OeHjCIW~+TVeM)9nliM$NoakIpgcIvR9$A=S~#{);aD#@j{m{l9moD2 z8*2T1WcHu`XM83BD-N@Cs6VxR{kPGQ_JOfcR=W~!D{wUz=7V>i? zP$}yvQ*6YX*zZQoHTL#`%RJ--mu*vI26XyA#^KoTxmd^%OuN?ox&)%el8#%Bl=wd9!&Q@ROd;p{$S`=s1f+89_C z%8JvQRLT-G8+u8fr7Xm0oaFWO)3{rVC#f{W%h%<{L=ztVY!y`Miqi_5&*tDfM@0&p z=j!FqMI-6ul;A*FJ&OkI5`Y|2K3i4v;Zz-Q`aBgcIQ5clQ&~fBE=c3>JYPu!=LG4P z(SY+>$_2zP2M}-1L41Ld3d9%cWflC=0>Idd^b+b3&QwmEzL-#hMK3A4xgpJnon2gz z#;%8z2iYA|hJI6Wb0O0fWcm$NkMQd;MgP7zUY>ieeJ3N9LHQm%ioJL1!Lg2aX&i%_ zLWDDm=;MZ)J1NQb=4EPBVCcQQoq|zDjipzxL(Lpvpr})xV-(owh3O+yQzeJcpn*=-ruiBvG)Nz=#CFsaeZ3-g!%*h zf3s35-?CmztIWN92meA%Pyu?X1U*%Ro>s*5>D!p%(l_bnB(z!SL)mNWew(UqaEP4; ztODlSf%*3R0oIl;Nx0QV0nqk+0EMJV2k(Cyj2fSg5Ue?c<~9 zV))tMW3;qQrIqbBWud8jBUmSR-3cS~FdL!HCu)Q<#>AI4+WF zSH&|<-bwHO(R}dvAw7z{e-$!RUcv5q`n2Gix43yFgg%ra{V$qT^9UP6n9V5K-pA4l z5bxc&o)MzOnAWg5Ro-5mu57O^&t-k;k`3z}=ovmkUG9{i&{~;f`%%Tx^ilk_Cj84* z7^6);)q!463tdx`OqT2#FLrFDEg55@Mr#rGvfX}aYzaLK7n)mDVzpYybpJ*B64Z&< zjWrIcmR7fde*;hIE)A*ygiWPR4^sC*D^)EU;bs;uDP%j|E-MQ@(?>Fdy@cRJa`S~! zvMz8W>413)Djd&r4GEk21~AGmwSpU<1aW)KZU7BQLOnq{@_s5A_9SZUYhPV#T^5^~ z!FD@*`_*1IoLTC;f~Ex*4#Ulq0l`qFZCJOCY_C_RhH~d&Lk(_@l{$xW1~nAuga>W< zzSmszhI?E$7e~L3PCapCj3}dlBcOrLir!p?x*d87qJQ>Fy0td<2@)pR&v>^}Yo;r} zyNZXri6*%AU=7mLcS)4~2E6sYKrwgSNY2ruQ0~5ot(I#;j`#F)Oy)U0L$CF|NRH-1 zLn3zY^24+tQSVEN-x%UQ)-PltFXY!$+Z=ds5xjl|GRaWmGVyIb3{pt4@AI)9*K-ud zsl0deEhHE-9l_Q=m6!gO5_ii2x1p7H0dEN7U3f9%@cwUl*AMUN z$ew=SM~QWc8Qc7dM#0Yt(FMT54#}?l4zpKX!CB)ligdr2p{NwhhYE6`TJ+mIcLycIzkr(Tp z>x{~-Gy1wtl$HJt)U`*`HGu8SqF)?8$O%V8>pukd5xu+>I6n`5uwyAS&Mr32mcg8L znHD^q&uc_ty~jXnHMkv6TDJ*Y#_`Plz|YJElKJ;k_A`b4CqH|cu$rW3fNQNIJ$icQ z=z>SD_UPq1M;9$x3f<(Cse@|;eu~9YI83DbEAl1ZRq;GWCppPDHJfl((>nW_I)ebQoIf)-BI>Y zYW0Frs)~By{?c*8bzezCN9%=RC|u#k=i%7XO%$zQ1)q=yk8@ssoZ>k5X%8-V9n)vk zKeGuwSf(3ONU|}BCc00p#6Hv)fvHhjI*NMDw-P(w-~g@h>rKZ&?@1<$N34&QFfa4g znUJE`d@*2SBr&}+HJYDnuGsu&o<>~7T|qg)zOO01C20;q*#`N z*t8XXTEB4iX$^q?=-<<@H$hgk&ioFFmI<9aM~ya*&-2{S&$A}avk)AzJPjr?+RW>{ ztY0t6z(3H;O%oH6I9Vzr2oe$qiaamk*}a}0+lxPQ?p87dyx#uB9It<8 zfx@fg6?|Hhy=6ypE8arX{(T>cQ18N)c4~`5nXRK@N)g5k*w%r4NTq>uNGm|<5>%1r zPLR6pu@o(ZCcb1eF`$T#35q*G&n8*5IYqErxFmr6WkoNbh%9euC&zXo zAGI-vgYq2`S2K~3cfwN)0PBJi$hV~6QsdHqo+l_Q$YsiE9IbUMeXb%pJ)&JB(VEJ` zp4AWAJVW6~Zb}+Bx-PSMSHZKi`de`Pm= zUXw3r2VHCM|2?o;N3=yV7W9rhsC7|H1p^8=BcMe6&)Ch23Mg3$1?<$$)+%e{U!V}J zjV`89{|0>wCf@W+xOC0d2cxC&2AjtZUF&bPHmj?id=|tX0+^yQdfSaYGnpuyF>DJrRhv82##86p zP=}x8Nm*o;Mt2Sv!*dzKWxSkmhDT;Y@MtuwJK3BL+X#l1ZJeB7-CQhB6w?|QI&NBgmKPW1~Uv;pCrmVa}Nq#rxow^CIXxwTCs6FE=;hA^G6`4 zHCKD+$~^Q>78-=lz1DMc4&eG4?&DGI3;7!EgVCCA`kuDN?Hp;o3?2A7e%WYqX*p%r zxi*H(fEvHHzOuTuVKT`c$6#)=gnvBGb)(BR-r*Maa!OPiw=_|e-H3;%P6QJdpsM&wnD(%uJfNzMCW&6 z8eavMlf`oO_ux2tEmf?+t5~$oh~g%V}J#kCg2>>r7rELYkSy5zzQ7Ld`# z_{fk*Yh`Ow>vPR!Ir}XTVy#uE>vjjrSLL-jlYWwfo~de?D(x$)tz)2;0) zL%h9SL*Jry+EC_m+5rrU?waZ7&TJk?0XOx9eKWAn3m9Ekz^LaKw)+^qkdjf4aNu1U6VRHA z{?*Rt_{bGptx*lZ$UF=NJ}_;pWp5w{8O@sL!zf6`u?QRY&1fiG3)Sq6N>a$)q_QiG z$!c@e6jpT=8;LgduEcTEi0)e{WN%j5ijSu|>ecpvEHj6CKt}@d9++6z1Aai@%wY?b zqH~_na(y&A97+VdQNSAwMsdZRyQH?`SJcJc4o3`A$Is0d7b`!wD+&}{7&RwHx`&uhNt>n=dkYQzcJLm3YR<68c*4+<>~n} zpZ}*5hFy7dGT&#86R4fr)4TM< z?q}p{&=c+@39E6nt>waLB%gRVz~l5H2CNmr8HTseNA2lS8UGNho0MiS&JX@1o>IJI z*PY@M(R8QFI0fa!mW*#@Z>5xw+j!RE@L`Orwrt~9T!(!X`TxDo_hRE~R=_B0CS!c% z)wPWktyibcZayg4!oF+Hbf&hPcff(=)#DqRarQQYhsH`OPM_T@ z6{b{D;F^95U!BJ5P?IZmi@mSYWH9{=9uipesi%FP!aa}3zj3;ROs~? zl?>A`VSJFuMEUeAs2ax(rYh4xHZE@+*3Rw)J9k02>XnTC1)VBp;>V*?jZ0-~=8iG0 zt->1H3l#obC%QRWb#8Q&*d-DM$5Em&@g}zZ99sp)(IoQh7fA7S;V9{Shpxfa66}pt zPSB>F*44)le|mU|_f=LM{!)VG9>7n~SFY<=6Yl7b8L7tld(@DI!Y$+$VFXJOT{t;oDMyi*dQ_ zNIl1!DO1rLF76YWcc0c2bk)=fJ5*}BAFC{ntuD0tvAVVGBcPJk>6ryF%Lg$t(+gtK zx5Mjl0=U+INe9S6e5y18gw7VMrRZCSXiNJOe}T5Du7-sN-V0vD`_z|u+Bb$h8Xl|f zzex5Adc`IN!#>%%Z3J=Op#PH^$EIyR!fA0W2VP0Y*^>0@{f;%XvI*q)<9v{aMVK>k z(Xv4Q{~Vq&A*q*EZ5Wv?V};g(2sVF~p!EBc=iJB;Y@15gzr%1;p1z*_R*+S8b+?X~ zG^r!|2j&nim77Kud97Xx2tDC)*#a`G#1|8JzP)fysM}Cm#RHv}qya}|0%@IcLw-tCQiZ|8IsS|`)o9rRg9ckcJ|bnpw?dg?7vk|B0_ zRG*vmlPpyd$y%Y5hxe1@J4wA|Bx!a-{8M&~pHzIlQzZ?IL)*{aQ2bxmsXC3;`~|Mc zPSr2uAYon&b}?Ib85{=@xD}pXfZ!WhxyQsGTZ^=6ojUp(gVw#M5B(H4nqVPX=>CF5 zT6!=r%)M=p@NK(ExDRR46O~YF=zxy_O7}}TUniFhQ@^gkdjZ4c&17PoaSGrxPur!t z_TM=pN@VRE>bky7WNh|DOBcTrPMKfJ5kd-~yB1H(s0GOxkV-J5pVut?@LQnFVtX2zS#xvb(A-jH<_ zTI&9izR6xr2obO3(cXcjY;u3&73h1y!em~9Cwm7B3}xKjTxh|eMJ>z~j4ZCT84p{2 z3I8PE#7M3E9~4x$zj4h_K^m1_P?3U)RuJkU1;Zk(Al%QB*?NNn{ep_a1u@aPADeeY z>+f*8-8lO1Xv01uGCg7~bHvDoC;0oNk_{)=<=FO#TuGK51ZK2FX>?>;loo=1tq|Ry z0{HV?!@m{JL00cG6lN*)ClamoB0{D0a-%n;P*(UFtg~l%|0LEm>_wifz*F)->}$d; z-RI;%?unfNY&?~yB6xx)Nto7^tvcEJ4fw`jlyT;Xx8n( zN2C1?cGbiGT(^zEVR3b9w>~)(HFaK-x975$KAp7R!+Qto8R{q0LEq zof%vYNo%y-g2ED}i-{GYZQ|4Kl##If29!)^aHr&|z&GZkSO~0xg@_G3XrRxT@V5RB zO2O8u_*6CfGkj^UjhC0(Tb4w|8LAl;B&AeaD6MmDam)?O@2zqr zUCBX0?&sOT=a}d7t4yAu_~n(sN1JVhBA1-lZXHRz*6C3AaFvCnqs=kE6OY{dFq!yF zEP*Kv*krl23a1Auplr}o%9#}EU70`FVtRk&-R!zHl7M+ zb0w0Or{(+`ljD1Rj4j&9)Dgz$z9hU$IQJ#L4c{Pq^#`6*`x0Y($c5Pc&`_+V+t{X= z5G&!tiHcYWFY&yBLaca)b`vDEI47})LW{+&5ifC)So|ww>W>mHm#qrhZWxRnPiG`+ zOWW4EB;x>4ts|+y?!Ld3k(EI4F^6&)Y@`l$_X&%o7cB%)V!eA5ztsbr7yr#rR*lMa5m}zZ} zv#O9hysnDZ^)BkFEU0T}kW`!PB~=?Ctb4sO2`XM0x@&d`N**hdAzy`YgBQ(83bZbZCjBH&NN*_!yY((1h;9`&mo$3VY(vSyja;i*> zHa%#))1%8$wxish41Cxr?U5Akb&CDD4#ha3y~;nUg-fgALX|661eIqq_Jvt#Ey!4U zmDPz)rP({-6^Tnvdi5BSfjp-Fs+dNt$xfgNWf>N#p~#ZGXT?w@-WcQsw_oqUUkp{5 zbXIC^Mi1^Jzd$;RZDwwx?JnN+LO4et_KM-DT_ku1ICcX3S7@cQkN^!%tD)SS3xjGr zak0%Qn~ihL{a)08fxyvR7^MRZr4;bcQ()FTT9faO6j*zfT zryb981{t4meSeYchDW#=UDi`Lw}Y}6>)~a+&^#UyL@(Ln6oj9B`B_vVhGs}Th<6^n zJkNrSu$SURwBOygNm@;HcdJjXQ&Btl#pAB5)37h%P#OkOC-No%Q#I%Q?*;)JhzWZL zDn~L7s0wA{BW_U4L+L9swKnOP@+3klzy*=#dO3mZj0Ho$)k;GWdmb96=Tk^Lzeb_` zuf6p}d6wpskmkBogr?Xy+o{nm=FzpDf=qXdMk2b$+HR>nOyuU92#eXQ?xze8sIKs; zio6=r4o+o%f?{jogwDg|JmMA{J7ers8@qlV(sGwT_7Tc%J%HU4)ihbEa=&URRfX*_ zW{zb)Ltw90nu`ehD1r6z#RC8q9O(JSc+jH8mW?B`L*G+d(hI;#3jz0HID60FOrNY* z!_-jH=|R#<21z@+OS)>1^wL4n?(UMVUOY(qs6pB*cbj(2Anl_EX}9h+?a_m@j~S%B zYIkYZNPRp={8;@q^^o>^^y6IQeCR8;O@2f4 z@w{|4s~$T@{*-?5OI@}|wK7XG{rX}-hXgNbY}sH3(Y2O37e4bH#<8msKgIy6-7d|6 z*#z5u#%S5k&oymyjtycl3TDT=cB_()mnzll;~IX$N9exDdC&AhD!)Nv8C_Bmt)jkr zsV`YRm5yR0Q;SPU`Y4hNZ`U*D`5aSaX7hD1vOfnFNQV5Q zzN&~i)Hdzwf0w$#J<^Ho%46cHNiyaxv`4ErOIwWY=80bs)^B!mR?w))+TTs{`ie3I z<%%-DYIQqV6EkO-I$FX;$a`l0wyLFl#bBEnQ#k->a&Xb?{YMYYm7B-!a`%caBnH~Q zF>Y5)(kGCe>p~0Z;p|0~9TX0I9IsM$Z=4_WdFM)>cVav*lx5EWdE0PyX$RzY3Smud zA)f@HGJ6$Hlk8LBOHoPo=>>70(bwjXvXFgNpT5_61_&{^ATdcJ-2#}cmFd%=)V}!a zQMvex*L9$AcVW=ki+r;kU{hnkF9FrJYTI)SmDZ_|OM-T*g$tupU zo~f-bEw!?NP5$I$7l3bN_Qm@M7-b$ANuNud9NV?Dd_IrQ_74%`M(%G2Wv(U+xv*jh z@MRd-**QI@-LYt8>PuJE^+f9W!GIS19Lb4BiG$ja;?}ZiR`nb;5dqmsXPmM1AevsT zhE-0%LHZgXp>Q04#7f+jK~Cf0tpDohz|$QL1d#^|#O?VA`e*9zwZKsrL0HPwdTsl@ zhWbP-ip?-1scrj3AeNm%pbzCpvfEWOG+=0F}2TB=+ zAK_jjiM?-R9HjIoUJnT$ZBCT!-cs1BK@l9|{Ak!fD$vJhG_%fmEOrG0zp?4ODB#*4 zw{0+@a4EI>3SxQ(5E91GL#h8qf;q8Fh1P>GZZs$`8T%!&EIu^;o;>o!_za$+~!PZ zY~>bfX_=>*X-->pWbc`$kw^{4iQy+_wnd9&V}Czm7y3wPsO3&O=G!@B(`mXTbHNC9OM-sxDaX1D{X zS*?ys7M=Z&e82T|(NXvMIuq8RPG+1Gqhshh%_~X!fPs^YbQ{x(@BOl#OiW+hMB~Y6 zeP)-ya+KXZE*<{3NFV*X!R9xTn$tF(GRZC`wx=)}@c>0ptE$n{zO}Zrm%Q*tsXTD6 zHUI5Af2#3gjkJ5MllZzh@@HFt4xejB_0465eXhk_OtosgLshSfZrC{0dWYG!`XO6G zE!ejrW5Y~$qZMXL zw_-iFV)m9iTEj8Pc96(nOtNq5eJVAQq-RyT`f$a8BWB0=p9b?LLY=<*O&x14Wt;MD za?=SnQ*5h%k0E(Rx`(j#y~rQjxg-qvsBY+H;aqlaM0*DxLy~`vCH&{&a}1cIr@9zO z{fb=d@`{p7q>b2Rbp)|%PzM#bd^HuV40k#)S}&KcuGzJZwZHElr90gI*+b*&kD)TI zY`Q_u-qHNzTci`E^bJ&{QL6l~{&@&0yHsT*zn|8{j=>DzAf?`B$_P6IV|XsI zu)_%}y5?vsE_&Dl3B!K21=m6G#hax(LZKlkp&{*&3e_pWuS3S+@Z&_OcND?!yK?kQ z;P@}$k9p!bKr5^h zE`%GBurm?q>F{&ioV2A~%9-jO-~+_S!cv z$NmC1@$nj`?;vA#Dg|E&XT~|t=0_77&#O;c9O=;051hGa5I34N7M#ehG>^sj=wjFk z+j;8s7CLr4!{K_J4s2oftIk)Ho_K%jSEy& zh`qmvN2TgnHPm^jSBFFU+i4iH_Pofc&G;AnaPWeLDWpz}LfmxU9Nh$a|G84TWS7v^ zs&>2r+c7k4cJiMo{Us{3%(qTp)S1N1t5Nhj6T3Ws0vlGbpvj1G-Du zgUOfsAU`oW{iQyi$I-i^w_Z9TGecXCJ(wrrh2+S$diOrClwGNYH)mM*ZsiT-pjFV_42v-jR{6s$$5o;b%b*3JxQ!8}#H>Cf$j00CkF z_Cmmkd4Ro$?-lK?MUy>^wYP%Nz`$&BPeudBsw~R1CpeG{^$?z>AF)t}%q9LK5sh_h zPq1doC3dCH>WetqE*Zo~(6#)zr8UxtWt&kp>WR&M8~>N#{F1l4JyGhs6vX-|LV341 zWpVz6b-t}TSX-htvEGNz`rhcTGdG(93%3Z}QQ zG8Wv~yr=9yFvw2+B%;9R*Mec|mry-&8orEID3u;>y_W!v)|SiN2btq|Yed|AuhpF# zSdFG~+6!h<6QzlA_w_`lmS!`uLHA#VKdpqsV=s)SgL4_Tu|k0Of=a$|DBRAd7VXfV zrZ-RUL1dm&=|{x(lk_O|9;64hP$%27*gM6ZrQU;iN`?}iq?;9Oq>p9jtTYp4>vxr8 zU9PhH`~dd+^C}XTLh-!H++LcA=T&I1_g@jutLX6M<~#Bse0GkH&PZLuS!D;;M&*!|G-De(ie{@$oplmuD9%=vwbIS`d~MnBdlW53z41d%tA+ zJIcWLP_hggTyw7W_2EDaa!u{2j5sq1UrLX1ctP9`^#ymalw7{4&(L>|41Fhg?M#pp zbP%4@hn8}q3f;k=9#Vzcsv!6NF_b*XenfhQJIQ{msxI`Jv!C=MvY#qE*CYK#V_7E^E}|IijU@D2^5hn;6MP3XmzrR6?xwHPuw69OW#lAfA!I(*Xta(3* zu8%gnIU3uCPpxreH}X61mvX0ODSI6g_gHgTCA*au_}{0fL!MF9h+w^b@9=54T$UJ( z_HMbZYv%gX=^Z3y6?Ji5IBzr%lw&P{9g;u2yKJdd~Z`p-Rh@(qJ zJlww0pNkwyZ4Ru8-U{{`d=0W^)BP@`-H=yqI^*{a{A!&6P%yGH^(gkv(gQ~JP;$Key);|~xDv_~7NKpCgeKft7UU$A`F5pyziJ05v2TlcTyBpMQufW_am$}-i zEH7`b%;1X#mL^aP_WXpEof(&Wr@z=n-cYK*tX`Uk)Aef$p|6J~hH7;dcJrXw52r4g z{V+X>y>s-S+2`^c9`oK_CCb}t8RnIqDO<_S$Jl84JsR%^sjTsq#Tz(9u0eJ7-Xqf2MlKk z=lA+;>=zc=_#vYmfnpTvZA8*jI!Sygn>)g%dI+FQPMVC62oO~Bnd-k7k39rh3ByV= zi^WD^D*Zj7FJ($#-ua(%LVc7dAa*{;LxZ z-AUxa>=&SW?j?{{DC$rBj2Cv6FB!SQgKfPguXXZn22y>;_8{U14YcV_L3so1m<3l# zt9mphI;_{PvYCT!Wnl7JYp=gM~Ha{h|RiKBwoXma{d&^R3w z=RQN?&YQo&mWGM)Y(@LC^GST)gm-RPRqu+ACCp=3gW2CgT65A`urSMm-k=VCG6I{F z>qgZ@r}RSl2cuxk2Z{N6{S!3YT|pmc<3IalPWDo;3uD=T6O#RkpKZTqA-|_!qKF9xOK-)X6pM*f2H=jjUyCZBVujP*vn0E z=SSj9zh=P2t`=T030o5LNk^2$WU_CEIw9@H0*}u{TBMlBZev*b7Fn?8BihXIdXG}- zg1!Hj7`+|+9$(mv`+g_8~)2KLpt%QoY0(gJRSBEOF8qV7k>T4EdGabTbLa zAy2dJy;XW)Z^89DHEkW~py)EDx z8S)8w6njtPp}9ox3UJKGB)Vb0Ce#wz1-;M<{VI5TY#7#ys~xZ%=v?fE!wyv%P%!&z=~T0U7W z%W}{A5^b*9f$UP@V76q?tVrWH5`C_`#MHTf?%-z_|1a3torHERv|ljm0cHaglaT;GW_laT>MS17vu zDxX*H@AGL#XUU8ThLBn%G4MO@UK2h3+0MJK>YNSoug?IQJJfE_)AVKOgAv3?FFE`i z`Voma*O4?&4hj;9K*1tmk14t>}8TMT`F4DRLrvzNuPaS^X) z-%EqRFb<-JPDRugk(KKj>k}`y?5MXOg)dO-9CIpTAG#Uie}DcT5Z-xMxa^SD(+~11 zr8N3e`m^}QPfhf%{MQu7AGQhoLA6bUE^CFILXeIvq$V=YKSuR|sH_-#nCgp7a+7Oc zPPxS}hNtO3pZE)n14cXh>hl6g_DMEQo~Z*TlNVf8IA~nI_-cUm&OKn=(1A&o(jAo% z6f*Yit~?40`GI!Xj2|Q=Hs@>Q?fD=MyKI9&9PHGd813~OAE*6ROe|=Vc$Do?$Zr?6 zgy_hotixmkr%}T2qP@jv3(t~x@c?mS&7+X_1P_)DVneM1SS^(F!lGAK0hWwy`PQ)e zR_*RZv|Z2}j3SH&y&oQgtT+JQjUt@aj76uOo6GXWNb8C7ffILdNw%2rGS)n{lD!Q( ztsIDr+UJtA-P)gx?sy20*u;U@rtSrRG=gsNy~89p3_~q?$hl5V8`k`Q6C1|oG^t*W znh+a`TVA2R510)FM?n>z?@I0(R&LX2n-fQUBWYu7PI#?4N`@$^`4p>89>8)15kIuTGC zXK`1DwOv^ju&?p(BD;9g%wa z2r`+|PZnA=bMd@-thG4t`qE>;T6-VdPMhEyfROaerXRNxDx&^RYf&j1OmU~f=hq4zYUW_vI@jo>7GD8J&_T321kv!Xfb z`i~pNSfnBRJOJsgmk0LYFsy~(*8+gf9mTd zZ&i)s>x9Ie&Q(q}x(~B+m5!*MFf4UQ`jBwOQmD<(SZcnHqbn%y&HcWsm8Q=-fq74d z-TMEqC-2wg=k-sMN(5`}wPVGe+kYpKc~7gU3z~dqIOF?(C_c=t)J3LS8O@#T?~D-x zbTEWezw=YcFKRz$KSNVPD+$*abZLLag>q{~6VA`-6x7Wu!gV(T|szLuv!h6zt zmL6#))W{Zr_1;p}bPs2?Vp`JPZk(ad>aX+eUAWG3P$}RF6|e(^RH?-VQz5;8@8%&> z>?NeMksG23yNED~=XEN5Jn!wQLN8HhRmQo6^gP~&fthGFxXE0=$g(%FOHnyZrwXdQQzb$)F^P2i1JG#!&QZ5~I%nR@BPvFry zROW`+sl2xF2PQ#$bu}dEE+f?BZ;#0KgYL7d`O*BQq^thNlvHfoYu?Ql7cs#vayG?8 z{}{@jT--c^yW?Xmm@7*s@u_QLPS9fpYLH?kDe(3W;K_fk!uJebxShWJdeAm>HT`fa zuAvo;gCKh0aH!7g0}{vQHADxjp4IM5y>7f+`kCx>fTJf_BR@f4*1ePNqP9Bit9$!~ zYSSD$auKwrZP(3&frO`R?3 z47>#E5RK;c2qL5S#qgNWl@13IhW8d94o3JI4sg#Cog;K!(7(soVjn?lC@TA&6uph$ z;N3nf$@xm6Ve?46h;QPaJ{p5>CfRwaZi)9-A?ZGt6xmt)6ilkZ*&-IQPvg4=oHy`f zi{#ln)|d0gbNSlzOWIh5XfvlMLbNvh-qt=$=ffax$hKXwo(nuqNe)9EKD4(=u7N^ zs&GUE?P;>VldmB|;81aB+T4B&waVmZUJ+@BoI>Y`ViJ|D$*t5IItfViQomtCXNkQ0 z_BR|wt^G=dn8`9XdU#u?0+T@8nHz9kMf;B7b7l(D~ur*gy^^^Fc-LHJYoR=v;NDI6VCbU9(K z|#w`{L-we{dAX9Q^-tdBo5yoUR3@6T87_DccKt zJpXPuDI;^0kXSR@{Ux<@HD9{eL$}agDUbVW6kUqzrD}SqFawI(2Td_@2?f00(MEWI6sc>;2nG;V;`m!_yeHr4J2;6 zKe42Cf1}**NBN0gfouQ2YcGmRnDh%|?|R&+o{Rr@mfvde!Qa|5l5@Q$bAsJ%^%b5I z{OeD2yO{q!^3UwBfSy^BM~ey5Z8;ekY#1^oxXLrP%|vY!BnV%L|dy;ITQXXP|?ZB%=P5BWH{JlgO|e^(nHr?&60 zjbqINpnKP0{B>;%+CbV^X~F581GdV*cD%zzCk(?TUv@77hPuH}7@d-_kFa54X|Z`W z0`&Qsx0=$KMMKLlvg_Fi%u+I!&kCnJ2%Q3eE z{+O}LS1RXFSEfrtQ14eQZJ2SOE7cMzTi}F}Vd-N?jrhhHOBe3iY-gL0x7NS?%aV>&Io$@#i^z6CdNeQ?v{?hC3^)3eeX&4*ZB)VNUY`2+$EX zIJ?XU9FvSsp{!kQjNhem^2Jss?=ibQcZDY#!hNPgGn;Ruyj{BJumxFJtnIGDSas@% zn{|$x7H%qP1IWq5DxKbarER2=a=}TYRcMUwcubfTHt*w0%b}qkTHm3jaMn++(qrSO zAG6D`xMIwvwYtLjUK9XY$?S5wt*O1MbbG-6+UR=~U%R1ieKIt}HAFB_yKc(uQ!b6? zrR_pU~pTY4Px^vjrGbrX|(1Zh9C0qw-| zPp69ZWpVdw&|yy>=_dginl>fUi)p0IOXJOha>6c~CY|}nju=dM5tU3v_f0H^RYuvq z0!4pjn4&#C@TJ-4h{riSvxRDl{+l&0^N-gIe@LAr^|zAgDXos4QtRj`9h@C2vzPU< zp}SUDc$@M!jTsIvMN`)9KcWj{Cw0SEW%=PZ5jyt~eo!?k998b0cw}u6g=Caoag@+0 zi=2C+62|iiGO4APD6-Kj=rOMkr>1YQn4P|8^R1wotRDMk6+6T&p5jQQmqy6f;&xEu z8S_f#WyRMiXZASArn%Q1qp^fSXQ7nseFF@dtq3#Vtn}`G<*cSJmpyG^*C_uc4Q&Uf zjm4-n$0nH5!iOmmf5jLIHvljLH$v1#;p=&-#g5q6mGD-8MLd@Xc?b9mBImUrP%*tf zsG-XZv25|49B_=)h1a}}5(BCwzHEL58~=GHSr14bY&{{dt1;SFfpcy&zkBLgH0bI4 z*XXwzPyOY(@oy5Qe{$QO#?EoPO^ZgZ6D{nd8^`D11wl7{Ke0X02@tZFEcDcAyvKT1 zcbd-poS-vTLl^4IH&c)1op@gL)JjtWow?M{Ko!lJ_S;Bu*Vf(%WAb@nWfZUK>%6U^ zfzDf*o!`ipqS}SdJ2auECX|w%pf44A0$iLbNv~$)bbA^;`jV*bU$Tu{%k;<&(p36X zg5&fQkSd-s60zKimQ#MxIxtSPJi|o}hPqmsu}P?&pi&m`j z<%{^^BFdXlKR7(KQujtdWV~}IPSE9XTcDp8!w7O^ybs}Sb5+QMLE`O^w{F%h?rI5a8!1l+mzQU!D`WkB^_u7bdSftdpN zMEDxcu+V4>{|i?z(`0StklxKIBnLfEjvj+m_updE-s2Pi-l;-E=L=yY&{jck5@OHMNHL1 zyzEq^Wf61&&(1di!-c+U-3U_i59SRg^gW>1rb3-dNWwM(D-s<*+pMv~`v;VMUtT`s z8Sh@Wqo9moJAv}EyGaz!t7+uWBN5^R!{5BhMcbDO`1s=hs_ zYP>$)P*vl;bCFloyf74Pr#tQhEv;2`n*LLo-aQH2qHS|%d~$7W2Ez zgRaBV`_v4sje|a0rc)?+w%Ud}x6Prpo5q(+lxR4VXbK$&5O|2S`-Sc z`h0&<|I>~#->D=U7lsLs&DDAS1}}ya>>UiZUQpO1Xy3$AZ)k^Lh{pSr^;=P6pR(e4 z4FJCf(0z+Mn)+s?7t!BC_?Ikn3IF2#5W-Z_bOkY}ZM95UOmNvTFvoJxAhHbV41s^U}%plh4T`A_j!UpEr28q5dG0}wrHV?|^`n+4$PzJ_YTQ1OK7rj| z^1KCtET$G{dWXHijqPa_`-coBax?Le+>0fh_P`#=b1#j-tsmp6N;DIPr57;;_(4w{ zO~m6%{^P5mx+@T~rl4(?i_P$nzU>ytyD`n=wX8I|}JZMeq`s>+) zhhk;UpS~CT4PJzkIKtf4?(0a_)mjfJb&kYHz!%pHEo7zeu@5njoX4yvbspXSSlXOU z-w!rs(<%G?fc?Hozlr*{R^@FbUCS<+=}bklLFrB4iEZyum&=lH|rRfLAh2y5)zX`81hPK&H z$LTM%KR9JA@{bH*p)_sR+0T0Lyy_1jZi|XpcC=cs&Z{&)Nnc63oYtgeXZ4~y`PF6F zTh-P$y$ukubyQd@E!((yI1hU&I0gP3@!VnNvv{1|N6KuBq1HYSlX#lh+4tKV@ad`R z-$IFrVcU*{P8qxwI)_;|o`6*rdSJ5(A2;ixrJOBT{mASZhK_jivJI=t4djpxJW6am z#ano0|+S~q{jk`_LI`Xm7c>08<#pz95(1f)SRgX`)k>yA56;i+BP~+ zFLI$+#|CTjmGE~5y=n|{2zE+@%u3z+Xkz#2c{_I;qBDKM^!+pNTz|!~ddQfm9j({&*XCa~OONNj#```tZ4bgbgeyJ7I5N|HAEVLA?OT^zERITA3=jwKksj8Wbjf zmZgmDXvXvQ-JFNmrgX>Z zB0l344yx?x^zERIDJGuR!|Pue>ff;`WC*FP@=x|FR|%@zN>b$utmU9R=KEYHus?L9 zf02*=q!ZBo?;7!t>qIO&=>)KsdrZ&?h=_Xnv9Jy=5rx(5|Hu(uQb&^-iH1uOx?iUVuWeym-Y*TF}fJVRp_ zhkSC%7p($ZJum0~qx{d|(N$wt$+^shUmv@i=V93BduZ$`15{(FZfCf3xfQw8n^e{* zFM(@a1_gap!~2P%{TFE@uTadirJH-BI*B`62+Cfp$fb(p>KFx}i!Jq*DPT|)SI7_` zF|;J}R7-aa=~gekX!YU^NuxP3)oUor(jln*)w6~?UGgwdS^llObN3Osx<3Kb-eTon zZUDkwv_uKu20%3yHlGM1&s%Hoi=?a_HWt$Z`es1ps-cf7a}*-vWS3K|-yZM28hTTz zcYterX(*)oZJ}>(cxJzQlzo#}x}(`vn{&;6Pi0>w$L1CK4w$pK_b}?q9xf!WR7Er1 z1Gjk(C@4Euk<*Ht*RRdij@WZ3NkLb>n?ifbm1K7aRz$Y1p;NEj3z5Ygohx#5zEJgf z-OV%eQs1LeXZBR8B0{Np?Mj&OQdfpjcRVl@$;Eg|Y(2DIJ(N?lg4IJ7y(_~S=2ysJ zlErr6S9=@3(g4|&UtJ#fmAbj7ALCb#4g5+3wUA$l?wwz$yuPlIaW&vs56uTJ#=i?9 zWZ)ad*{+o52EIOwMJH;skz3$&iW#fS40NNA$q?W2jJsfKz_$*K;<=nx?G?>EEPvk? z#V_ddEo<i7$-x40-TLEPOTL2-Q+sQmXu00$K&0LI2kB6LE$TyKHqk`&|gi^SwnU*NqR-#@d%F(NyX*IrQTK(p`m7MW;?>^oTDzZ1JK?v?^IEvHPY)*Nzd{AYLjLGdW@TQ+Y>E0y z@8xjRY+ZW$f(gnZnVUSv_KGjVud#B6F)lwjxB;$hdSNGH1_8VN|+VXKQ0IvTCEW+=08Y^SOJS*bVvU89m zJAmO(@pJ4;?Hs!uTvzCVbLQWT?Z8hq&d7kuj$w5v9@c(f2|cwHvXmugAzzKMtX#HX znoU0xbhaFoL4}s1T88qj_8?0-Ai(k}r*`^qVnFGj*=1@ihD7~s^z zQRVJIG!7N*!92!0_tPcSzEwtT#{rXtRh>!$cX@WiTnMw>fMUwEpQRm(xw4NvbfaCZ z@1UhFG*;`W>Hxr(`4+wSJh47nbE1zg)KSu7NG+x1w`un5g|3WsSu+08V}Rfc+swsz+JH0pDEvZ@?q0kU;g|ZaA0|RmDPCnS9Bg0 z>fP^y8azsLe_&4(Q?Hh$YNqpx`yw3Gm`R?nUw!=A^+Nin^UTts|L2{zo0eE|EILi?)NF9HyZOmXf@SChw~S&J_=wv07vdsChMZWv3~f(KWNj#s&>p*rQzZ?8^QT#&CW*R3e} zduj;qemo`ah)$+_y1PeX;l$XKcOLQ>A$3daW?eX5_nG8A(zzMTp{D$b-RFytM*B6K z(2rKl-bw(vu1_9Z_Rpj&r<~HTZr8f`V_?Y3)a~CKM zF&Re4Q=aYYCg{|XDGm{I1#7dpAhBr~L*nW#iQ{=?*?bW21#k{ur+0_*f3H(~r;uy4 z)uu*Gr#LqEG{TmSmvSZ!k6yN6r7?K%@bPM2p(vELVv>gH2l_JzB*R{56o8s}p^{Wk{XqibG)n#i34?>lFtTLyALJygJTn zeZ`^nYNF_0qW^luNNpcm8}R;5BeO0$7o$gj%jQn~estdN7lj^vAk@-6D@otiAIn+> zdzbB|d(+{R46cxJk9~WGy2Od<@GtV7bgteT|KI7Kp`Q$zFLj@qqtVr>Axa|2P72nf zbK@W@ytUMQTAp>7Vy1Shg>JST(w#e(T`&m`t}q^S>5hHZ-#>!`!vR(_yXURVZFv}A z-Ur*FH#}e@@jl>vZe(xuK@#Rr^-^NuxMO0Qr0`vp$`Zrlc@6MwlD>CMAfZ3LPSjye zY=%fE>1dS@&x;KV1$$|_WH|j9_|^jIr+R++uiH=%a|s&?Go6pZ7FimPO141Qw9$gF zsb>&2l{^Hl`it4F z9NiHGpZLP(;>FRre2s_#IJ!bU0@C}*;4>YoGgZ)}CqtLC4>g-1v0;)GfO^2tiuiBEgrH-D+JQ!3cU?ZfFZ!294fFx;j-zOU=*RkV^M_z@ zVJYqkC`Rm5Cn)m;mdkA6KEbVl^zZ_Lko#u8oa)o{*XkQ@39$4>2V?jLro=$ zoA^EVX{+5^;|5n@qS!=d~1Rz+?sP3 zC$S#N1qwVfE!(iFKGDFEM-s*4;`(A=)G^Modq8=UdEHc8$6QB?X*CO}sKNht`Oj@_ z6#i-ckLO?Znt3>%5xz5`i+IlSJc_4yjne;w?}zg|j*sE=1j)Ct{a?zv^QJgLkdF>9 z-Xsw*toujHtABgZSf#w7tizgwOGi+&Gg7c8mc-8m@ijbV{E;OH+ik^Cq5CIZ{RGHt zVe36W(>gZ23&Ys3w1b=*#qDguvWO~;4#%)oZ4}e3Fx>43IEtp`Libk4?An5%cr&ZP zsIYZ^u)XO8dQETb3nox@rBQOb21L)#NPa7<8BpSiYWl`OVu_wWQSE+(MclQ+F_NZ; zsTly1h2bde(B=S+dOXq}r)=!bfNL9w^yx2wb`Mja=HGk@)VuB^Nuo1ohyLPuN#*Th zoS6^t`AK+_xa>f5Z%SXH;V=mD-06=9^jEE7H7n?;$xTlQ2j-{hJnGxm_LY91I#0=q zlg6i~pm<)tL#m&ZLjtFkb5?!sFUeDz63AbrU-*tn7NA8&jO!N^N(Lc=I-ZzBwwZ82o zA>_I{f&otOPBmkOUzB^NkTa7$M-R%rTt`FB!X&q}4;g|A;wKOfk*;Tlf{x>J(h6 zQ!V=ctIq$qooZlc?*FBolD83yA|wfP(LZ3GS|4}LhH?i!=!4h#%`YQap>rv5rR)?E zCZ*0zeE56k1>eQ>TK~J0J{P!fefn}z7&jj)bpD0+iYKphzBb7EGhPSZp^)jC&gKBBvMj=M93?xU*B`^rH7n&&?$%y zK7n=xl2ecH@qXd?plMgo5?d&m+@Lb`su+hmf9kqTFOt^~5>VZlKvNUC9bI z#e;=wqyti)l5cQSt3^2KtBUho66SoIBdkI^{Kv%^_x_YJ!a~~3fCZ~J8)Ky@h(oKB zZnjG^fMj#J`XPEX_KiNkrz2Ln-1us=OHbEZtCfdl6=JLsel~=u|6)dbJ_B> z2wnXLqU*hgf$}ZbHMtj}$rdK5@M~H_;h}-3U--~cX`t}#&`|iegdf@~{g4umfx^EQ z4xbnxd`KC}K;f?+7D_)kK=_ax`9R_44-bXMfg$qWoBohYc(3r;at_7l&WD_ESb0^X z^vbIoHCfWlUKf^>;cX*T$>qJ!cd8$;ej3wp;i=&$pcD>HDhlsF_BWB_$3wSr^Tke@ zt1nsaI1nM%T&f=<5VkYeqMAEP?l-xt9b^v=wT671Jv@}T|AJImb-E{Dl&pSAdZ0oM zAMXfQl%gZJDaHoteVHCUfeCH928Xe>wa98%p_WZHv=TJj>6>4)8uXjcxG7cBFxr=c zUsThu!Z%-4({QIU zk2C(^43LvVp$T54o?oe>P<63XBNh_gqE{#sGlZ~&S{5%-5i|XkTjTwcYVMts(qGT{ z8)Tbsp2*Dim(5wHWpfyHl|M2$JXOo)FblqH4jn3DVPsbrr;%M@I*?t_QR>)`KF{|c zbYykGU2lX?PQ+}4q#R+Hip>`B94ebn*s8nikn0)kQP?jpZ9qvo?%7~v1mPf67Cwarz*DzGy772efZKAP@o=P zS7an}Vx=mJ=H_3OfvWUFM62cs5ew1@7KGLG zdmK(_6!*O3l%w~Hj-|H{NIQ7l;4NdFw)VDKZ;BXq9PEQoFcJ(Z?(eez!MGH$cz?8; z?Z`b4y}H5LKIAcU>MTzQ_k{&C(N!T6MpnR2&fO1|Jyh)HxN~6~D>71p$pZ#kBgW$n zDE?uunx17~V}7ao1LyD-c7f5CZ8#Nh4UOLpySxW7Ql;50rP{!l-T8(`ojl*V`>O{1CiuWwCrbOFE1)}Y>RQ_6~1CALsehZUTZ<8REW*mEZ z$?`#{8E;Rdji`qqLeWW|+@3u#SPm%P-d^zI?TsHO@}B`sJX2}J?4Km#U}_p6B?}Hg zgvF6CEQW#igv3L_n+^{Jh{WS=&|z>v3^QO;d>pF}DDtTd6#1wCS{LQ6)`_>M^@nYJ z%UY1G0UKn0i(2jY7RVDLm_51kq^#vSO|*{6+-D5u*{-#T7S#=N$~Mjj<-A9`z1|xzGfzCnoWu+@aYFYCPSU^a~c&{Rkoh?X0No zyI_u&>LD+q={N>-82{caAg*)~?8xd&``-n(5)JBv7I8uB4cUqD(k&7Iyimoo4^ozx z!h!lkfvHp|iuv)<_X0v@`N89*w*t%A#`2$mD#fyfk^VpR2j_ zQr}SD&&$HV%YO7Ss9{h)FDC|G=F!XGhQa;3ToicOpI$NzcrCaOE%yXo=F>|;CMosX6Fa8bXk%6KWdlOOd$#?sW# z)Grp9HM3Q!+FL|_I2i~H)kE_8H4KrV8XXLe-pE*u1y8Af*mXl%3?p1rs(il+x&!gp z2dI&EO2ppVic}DjjLZ*Ws2ma=nei4ANmia}Wjvko(LZq`y}kiD4$Y7n_7~?pBup!0 zE(G4->-Bg6?VRU6IIU3wF3hm9_Qu~}*c}kEzeI0#;;x)rxrlMr5~)V`iB+Tca4Jp6 zuaD`A*x`2+{EMNV+!JLKzew&0IyBU+MqV#4cN~d$$FYI2p94SsP0B&A;7!WG@{Lt9 z^q}@4K1AMdmWjC-Lls7a#Zctl2E%A+Sap%nmozyAsqH}0M4Y}r(nQ?T*i1-~bW6a3vyrW-GD~kSMTlW-fORw2(oZJD(7Qa6DDT{QUv} z0?M0DISA1x0{aONbiqll3jcip0;c&tAwa-%d;tQQ{|x~G5n84Iff%s0&v5^j1PE|s z->W@kfS8;K-h~lmqaO?4gK+NA|T@s6m%`6pr(EaAa>yKUVS9JJAMtcJ>YY z)#8u;$a8PT-#++z4S&8pjMn@3TaG_yX9&*hX&=SkwXnMpf5*VgHqCR%Q80fG8&0+x zFr}1(lX+}ukB4LgE#vxlUe+Q*5FSh6|M~NIPGR-={53TGH_qqV`=8HiS%Cld59wE+ zz&akn#Vl~H;xL?1vk|DnbXq9~eV#4D%sIHAOTRqNJ{5k|c{Z(-1JAR`9Yg2Y!Yuy> z&$G+S(eJ^l|)DM&nmql`^_Jr)g^ngHb(@_z}r4T#A7#C-lo{HJw@PRte(ymBiTfD2gT= z?a!arr|I21&D1W`qS1X}Z(RD;3w)CTlgd=l3nf}OCIm#)OqhaMAp%N^eLWh5@!>F> z`i8@xv-F|buCO$^e?p4v3Ur@EOSf~DF4m=|Ii>yzltNTT!UY@BEJ4|jmZH=FUN-@( zF}(sb_YUAb#nS_58B+-z^9GMJn0~3fces|`;rswIOn_;<1GM%Ip!Tn4B2&{i@7X|V z`|n>@_5StFaINwOTW&ki%xZ@j_voTk7K!X@pQiV!?Qe`U8W5)!zqk9xGgU!<)sk6q@_&F8&T`9=w{sKRk&^M8>MXN*bk+}}{cBeCM z6}otT8G=dke6BeUz)w2An@n9&YZEx;z=~uREalKp$-(3z%F6Mec0OgKsN+iY^0Pge z_&NszU9Hg*&3>=s7P8j#LzPN8?7>RnZ>oLitC@>bQ%9;5+hF2?)r9vt9q;k62-t;a z7NT%}oOyu83#ErgJW&xTV~=>RF^0n-3oS(vt!811wNMTpiYya)*N`=}mX3sSU3F)U zd(KcUg7Ojf8{m#x-}K6@2ib$kZT=4Ogj+#v6Sl@>`&N~ax+#DRlh5G}lZC5WemplK z9`9!S;JvA)T1Sq|sPfu<7Zm`ZRJnS|f=~sWP&Qb1k}{>KN(It-pcF_drBDha6u`Ab z5oA{MOS-op-SV4A2x6&XjqR4}Vb?d=LVHGg@R;xNx%lA*b|fYxn~8N~xJSf?p>e1&4ucU9a<1PAPP;o619l~k#vOVa zi-$OeAR&HV#<$B-Jel6mzYF+O7>_rLkwd_Y?1qk1SF(ZFolTb_UF-@!Rd8l1JfJV= z6Ts0V)s;wuD!?2B5OpQSZhLl+za8$U%8aN~cVT=jD%Gh-l~|=Zo-TGpK0>Q0Sw%&w zrlMze9f1xlBzzTPk0OCFhDhkG+#`Hfz5}JhKU^-Cf4*)Hh;oCUF|z*r?0n77Se8}( z2;bVM`4$Vy=Uc2RH5b8tr>?91x;=*Wv;>5+0z!mCM+a#LG<$$j)+h9Unjn4h>c4>{ z`Z-#dDH|_m*aui*#^!|(X!t1OH|K-QH~6T|qRt)SU>~JqGR|$04>s3`I#96fjwb1( z5qSu*Rh~qyOF}~s?FOG-0NpEk3;>_zGy&Waji2-t;W(b z;^nK+o3I}*UL0>Od?X6Be1Z_##;>KD-hZ`4KkIDJ1qJ*2!J7)>&4ba~A3y2*Al#&z z4->?7z3UJZ@BqN#AF;~>wWAGwOT_`0;=Rq*uwB&_(pMtX3Fio3Q5lAwLbl|Hw*XP# z#Gai=1C$T@I@dk?2aOYO!^Bw13tkDOL91dIz(LAT`Io(RInPBXj72evC**Tj{_>Qc zZ8ym-n-o;F9iD6vG^n=GSmAHZ+XkI$${h7DIZJ`#j0l{Ct76nLS~z3*5_aD))lw=r z({Yha!0?3U$z^OKdsW3SF(G4$XyinZF#TjsDuzdO2}lVtAz`D!Jo9+&o1Xf+AVn~% zRPlUhp^V9R$c=Vrp>#a-N~m8|b+Xht>o-a@;}jKBBrD0Wh?rS^nWP$*4nSG$i?Y(1 z-}{_p$E2Jcb(|4b0~EHGFhC_`fI`zGt#Os1+DIZ+-i&tBYg29~c;KeoX!*vfqaH44KW_me;votM}vBpEk#pF=6H z-`*f#~+ z?2TURN+*6LS*ZZkl8y$$7kie7+Bn|Aa@bWu@V6UNc21k=OBW2SRr6=XR43AJP7=Wg z^+%+ylkDQeBAh^o22YZKqIVF+-)<_^u*-{3x>c+nw5?sCS@;Ix5%Yoc(M2E4l4KrY zogpP*VKs zJD$xY-`K!P=s%uq*5etAx5^(G&o0p88H={}ct*8sYCXvK)`tD1& z-KqKrb5dY_#_#NY3yaMbrQw0sfYejsxC@j^;HNo> zpYnxZ@at81M?}}c{z4;La%y89&5QTs@-29`WJ?-qP~7h!=0Y@A+cOAy^$+8yo4kDG zq}Tb13G-?5PJlI^anxq<_+%ov1&7k#L)$1up%=dvlQPI8BE(xcJj=p)FXcvXMwV&b ze2?52goXeohX(-N?=w&h9?lc#NcUN`*RfGNmi>d?rqo0wrXkyT2lnEm}g#DP5FoIN-h8xLP# zwfwjrIEgtl=_OT#*KehQI(dmJX=}z#| zRp}I1?jzm5hoe#?=-U-aESYy4ViuOZdW@U`zJ_&L1Qs#;-Go01H+Nl&AMklPBPV;{ zqbMGSIZ<^l+UCSDKNo`xvFp+W7bJcEqJqJ$(1x$3rb=DNjQcL8t<`S&YL@W16vh}8 zm5v9)bE^1dKW&M7dv+gRXsY)Z!#No0&-&We)X?IulNPXjZ6NXe$Cc~!xWYVD`6J`X z<$7EpX*(KM7+t0opo3t0g#z!HZO6hl!nOq|Dx&#eh>EiB~_5%;^P zWkxmGKvznW-y)6p;m_FBTHW`hXO)g*b8U4WB##T-L!!D|eQ2yC;5*UwMJDV6 zszNKZ{ut^uBE0Gjq-|dig`;BOL!mxY7#0#`mqXa!gBBdZQpd&mEOJ2X9>+b$@lb=K zAT&5R#j^WKFyqvU0wgRH1?W^HD0?nMJ*gU~*cR%eq6|mHw=EM>L6o=L#I!pH#Fx({ z)3oEb(15^I<}Fg1I1WQYc@y}i%#4HiD_w(wUg_}aUI}FChIF4BR&3z0)<967RbX1Gfrn6q>gMXuXYQU zVb&=&COnd%Y;*3Rm}PYMR~UiWUKoz%S>${ zayw_SusO`Y9q5<$_$^I(#ecZFuv1?S7|g7Bn51}O4YX&(+`oaIh64V2K-*eub!=4T2&Odqa3H`xop-24}1nOOT9-;cjM*bNn`GC}P!EKD6ZI8nl*jZya>lDFRJh{K1*0q3DA zs-T26;UG&#jyV2qy#D3QzFq^$B-Rg%*9S0LH*tJy9B%35@QHC)WU_=*KQ#`my+V8h z2N@P-p)7CVluGGkI0{7T>2P5eHTRW${OrV05v?B3yA~}AjYYX)BFmFD?+RG5{y1Ga z2j7D^)OhpZl;X_Mkz0s`g!+obR_siz;AkN^c*7ekW`2y|MWkD7CtnRE3Nw{R(cZ8{t*F= zcOkRml$wI`!ooz1lRU=2IEh`Ng!f%^>va6`l|v`xBF*vEEh>U^1V&AT9G(6U)4fB( zX&*n>KY}dOJEg;33=sNJ`4+qkj29DYI^y1KFqXc8rqb$R>Wukj+`Ctv4_0I}Hf9=y zhPq?~%2!yOI?S190Xoc1Dhvl+9jYnQB%$P#!u>oH>@Adu4mJX1LMU14P9g^p!Ma#< zI^V*ns|wJ~Eta@<7swNC$K5+6Z#WJdfGp3wfo-N0@&4pfzpQH`0#u~%a-;9%v#=L} zz{^d(m(ibvVj&2;Z1KG;2zwz2yxa^g-JRI506Ay+zPd-zLa_4a7w7iB_}MJv!+C^U zaVU?Fob1Mci^){P{VY_f-+pi4(2!UTg@$s4?rjX6?H&40CiJv$+7Q_Zg@)8l_pu0# z>~wDTYmKs15y8E)W4#*?#A+r~)jUc95cdvn9yqIR7kM;vQ_CvYpHcOZkZo480^LZC z`MDpuo9i8SebPwiI8N&Yj6&FwSLinJfn5r~S&l z-}Id!PHFXj1Z*N6$$1x`-N-VTIXUeAgufj!0Dqg&i@)uveM|<|#%LuRuss>(fDM}E zY0Ha1oMwCHDL(92IOnyN1a#sJ)f&tp-$n@(66z}!0Uw62e{VkAjYDlbZ-wI`r*z`) zf`Os?BILi<*s#8tPjZPr4onR(MetP2JGgD4dG;6xb_gi ztpISX@whoKN^Bw6Ub!4O&aVt7tG00p2lt|FjzXm;QMEeJU3H*eLSWjT zmba@N9!+Wknlvd_iFubGsf3IvQ+|ravQ+s-c5rjrUi zx)*x2{t*fZ-I&9w;CSq$saa}0sj6ZPu3(6I$QdXD{l;QZ@cz6V5b-QyJSaCjy~UU4_sHPwxB+4t&e-DFEp?GZHd%Taa|D_8=?wc1%4ecr zR!?CPKaEQr?2WyRRVj7~7NI2dTnEQ7){#gv;vIxKEDm!Q1uJ~)OsMH?pqte@1b)0H zu)&6%Y`%hps6UZ4l{>w63agj`w|tf({^f|j2@6=JP|&YCdtaAWic=${i{UrCOe*F} z!_wGwt{{PQTs?N|J_X9rA!LH6f;h59(JQJ}_ftj3j4&O6P@1ZzGr^wJF~n5aE)pH{ z+*(@-hpuJ#!PXX??8-F!sYNm&NTsn^tT7;P!S8WoyWA)b{@BGm_D}ibW$pnNR_ET{EG>&pFGJ{ z-0J>VHLcV6;hK_dn*RdPoZY$1j#j()iB-G#!8z{~`Npby$k(avDc^W?FZm{_d&@Uj zohsi{bsE3!*DzLAr^CqY;2Jp&x}NK;3hfHW7QbE_FY4KD28TaAgPj6~ayj`{HY{g# z1m0vNhWTsZlo2Va2*DMhw<6?LgxHFZS`k7kLS{vXtO$t}66oH=jid`SISrbeXVBCj zze&>c`=&F@#$t6QtWlb5Gf^5>ZkL7KCeRJ9#iM-W=2_V7P`Kd~ zr%Ilx-uEigrWYZb8D1|OcyrD8MkTY3@ffw$HrXn0Z!xkr{oI zccYnqb8lW-vJCoJvK;zZvMh|H%G)`ZG3ba`9ADtf68QpW7K(A!QLKin?G`qwBh~HF?MpWy9Wa51^}yn* z??M^#$P7Ds)-hV?kk1?}jN(_f!_0iex7g2dePR-ZiqT1142DB!{ zjk7PMCkVSL3H3reB8nlR;zPZ6UpcQ){G-)6WVPC7-P>0C&ttFw)3iMzdqF(rIu^9r z0Ug7Y5t><3wh&=^Cxb+%d>(!~Z0{s~T1$_zNTHF8?{|j2>gWzz>~GcMB2%^_;;n&V zp@OSNVs0VomE{nnGfA}0X)E}zcc22QQ~td<70JA#YVI|~zAxj)KOdBReAXYuQIA6& z+;4;L7AE1%_nFu{#m%H~jyD^oLK}v$+2m_Vft0&DY6NC#krFd*^+o#_xTm!z;+3Pv z3Ii89H_pOGO{cu;aeW%+fzjaAVVrI%C-*uynL|eRr;7A5RZDEiqu3_d-e?rth~?Ss zH62GbZFlwnLFGr#|EPw?*~D~$Y>v{xxhRb33=AP)(8VW3=itkKw!06)M@q}!Y;Tx@ zzymX@s<`jF19y(A5qai7&9C;u01B~x>;z$R){=KJPR2LC8WSwK*%jUH_xUyY-xd zaaQ>wZRJ)yw;)Nq<`!aM<`#@o%`GxI9n39slsY!pQw;Z5e5dhxQe{7sCEnsGZAHmu z-Sbqd>$0J-0E(uvqMXzF9MyXF578T|%sJdXq36DCtd$-#*~x{27qR!)&&fygP0LHx@XzMccqL7emG$l&y=GMh8~pR71w^l!*?9i~`p4 z>QZ_px}#` zO&vJkP<*bzx@e0M6@-ku9K%12Je@dDo?>0+!%6Kxd||daj~XajUH@LT!sVfI80nQo znJ{SfJ;hUb`~p$P2J6NztNc+t+$C6J5ZHtBdHA6CYiFLoj%wm8$S4BnhhvRA7FT(yE2DsPMP@X@*eovRNrxX;fYn zx3vq)b*joi`IO$S1F?;U!k4M2DHMrP*M!qIiZd`15cA_bJ56wYA4IRHVb=buh^rD& zi;k#gzK%s_SX$b4?DUxOVnIlos~$)aD*WZcWc*6=>n$x|g+Z{#Nsg&tjV7lhC%5x{5^rckMY-y#*h6j>q-3m6MuW5BW%Rq zci15u+~vXFIrw`Pe^Jy3##ieC{5^-i1k#?3zw_|dbvu4gUL?;hjgI(Cy^1{(_7btL z5a5k%X#uaE$`E$tVAx6fD^0}Vg)M%>=q^B$E-&QRhOHB}V@85@JdFW$l;QCI#NN9O zPh;QkEq-`w2jTC<>4pwZW8d(te)y-6_kq&q;foGWW8d&Y{qUQ15dK+{K8=0D5A(xg zAv$3CKQZBH>>GZ#AD%sHAo^Qyu&3##v2XYhe)y-+76uBxn+Z>2-|%foKZ3J%5CPAf zGyydBiy-Ak0G(6=QgE=LfX03ir2Pm!NAn&i3+qe-H1><2){o#@JBXlc+5nCHBB=8t zsO%tuIVJ)c`$bUiM=)gv5%5e(7b1=QA{gXH@Cmy6KxJ^TDFYh&MKIWp;Ojex;6)Pw zjr}6X_z|4Gg9vz<2(U0Imu)u-Jpa#congSa8MbP9& z@YNkekTVg`*e?RbDZ$LjJBWY>f0_as`$drTDS&q00kg2cL_lM|2owVa1@B{67^n=^ zm7eT;}AK5_!=b8v;>=!}6ki8v5aO>ZKGN7?v1OZ1Lzk>+wHWbj;Nq>iBHq=AyByn;@i#(tqk`Jtgf zNR0k0L}n74baK`)z@#%g=bVB075^|Y%0FLR_avEfa^BH@&iS~Wb8-Sx<&VrcAJTJ9 zPFZ@-IkB~^=bVgB=A5Hog=+i%#a{;=8P@Z+{w0U$t=<#6(XzJ$&;Cj#&HR@6GV@!O z9p<;Xm~;spZ%0B4_?%kHV^c8|zDd1^Ynxd0Kzy)ubF`iZ_e8X~Ii1Z;aHMo0JlGrP zTdj@%%H5z~UzxfO{VUoBF-FYG<;&e5?o~mAPCW>}W9Wq8X!^IYW#N9r+452JkBjNBh>66d`zfs5zu|}bU(EBV_@2zR9c+CZk3cc^ z6Zpa5CQs$Z+K%@Ze5;Jz{i^Ju)99_m!DOM`Z9r)?%MA^jl*YEjq4kN*{%I-baa6j7 zCbjn37iqU3?MPuCyK)SI6!uhKZv>=q(|O!6b=zP99Z+(>%cmoOitnh)r*Z#I*DE-2 zVQ9UFk+X(QV)wEv*3ofvI3VJ+fb61;4ID`KeXR4(^%S2nJcaqM9ELV4a?|7MGO?CD z_JTv#-DIUhs&v8vWeGkKk%xUQ#~p;Ns_HW3g!iHGj6IrL^=Mk;B#62}j?$pxHFP{u z`R1pJJ!`Co8Qxn;;bW%@=UY~T;~pVdR>|2F`t{xe#ooCnZrLghTb>O|$O|-aixy8X z{ujQ_gYWVN{NR-w?;Lz>C@z#Re?$ava;`yeAxRgX49xs!EAA&5x zj&u~?1QGEt5jZC6iL2%0E22AK`u?anl;^qlyAOXnq?SejGwrVg9*OUxA$!ar<=^*U z$G`9xFcU7T*iJT(`u=0UQ+fe`a9CpLqt%e1SjfEGX(DRZ@>LU=j{) z!982ty|7MY8K_$j?V(!`==th&Q9Z(>F7n8&>Xco&8En}@MWpy@+n!*ixQlMft?K+p z7$jR?b;MDC3Awp*r(wLK_YS^uvPLEbzwyWOQ7&IMfm=UYgfpBi|vm0KI3h+aft)|RRqe?jUcRVO)liUkBY+$f3kFM zIC9~kwW0?R#DtJv*jato zVHQ>c@vV#-!;zG-D}M)@^L3G=sDR9OKzNWDc6SeE2o&0dFt^MRaEkpLnuqx9S&~pE zg+p;tSlA`vPBuZ<{P1ckBJwUpAqrE+`(@@i+n!;dn}gkyJr&1|ZO@wVj$^ly_aANj z;vfE9kU=#+`HfPM&GXay;YaOluRsS5U7tH24omRYwFy7qBXq{tb}T-s$T{{_kEd-; z9P_*3`W&$oWc4`ZpPwcnyCQzYUm4#HuF4tuL$nTfRZbExe3b#s zyq9!?uWAxCbx5D}vmM_O+^GU2LU|4k*X;ZYMx3m4^Rlh(OvEzh@Qy=s0Y^Fx$2v9` z2b%TnY(RKR5c1;r-EpK7g%J{||3YlTJICUAn$KV=3{QGB@K~siD}(zZ9`oV~%}m&) z5sV$G_%wP`=wL{n9Tl&Jb?9aj-q>c8LvU|Jn($?aLM9d9b_qu@PaIvT2?j1yT?}_j ztfIm|f@dj*^UT|C$NO9RTZlp2)uPf_mfQ1F?4p5%crE#8Vp`6MQH7`Yi|M-Z0?CSA%6j};0x zFR#NJ=y+b9=_kCSK}vC=kB$L~tjnX@*Ch)>lPaKxV;bH?a$|@bWl;g2AQNWlX{ ztj^V$u&)v*E3A4B#h{|rC+#Q$94J6WkwsoA7jQo6VXc}^IXF_68}T22fkH^53%mwF zALW8c$(r#zc6j)iwsIDPY@_GL=()bl+$#rJCy}fJBcS3$(jpwH{C7riAj07^6dI)c8k1ak7dFs zhz<*_Rs6)Nr!o<>J}M%QJE6>78$*J+ht50LjEQ%=D-4KB*mi|M{YT>d!`6yFXz4m= zDt77E5!}6?cWtr%pJ>6P!~)O4yT9RyKGfL0gl~rp*^(N$S`L|DJ?Fw}Z^{#t2ifkA z(BAcXWJQ|+Kr3ZAn(_Uogpmm8xBN2-$~oSB_@LRjbJ+Z3;mNn5kmc2&BY3xoK-SG@ zL%i!HW#L%wVV<#;eNaysZT9_uZk{iU6 zcz-z)udYEJI+E^2772Ct--yXy4hR3r)H1%+J<248TOC9EXYy zRr;$%dnSeOHdqngxCOmSP{?}ri~AppVz7=P?HSQ@(36yD%i1yEUy3r>Cs>3wrN+$@ zW!w~*VJ@U_P1DMEVSuMSI_*k+`sf^dAk$XBr%-Tm-fS2Yv_*!|I~;9F8I`r;ZRFIuR@o_;Kb3|f%8$sj z$rl=t{^v*k)?UaQmJfut>cun)6Jghn7AG{} zA70D3o>Hj$)F#>&*F-nD&~EA!AhmffID7b^ukEdoSTWKBrGriRB)+J zDr!l^Fgp@=_l6_LhOMV1}PA+LDFYUQCON^Jk8;Fc|-t3b@Fvnn2(OtGSu9Azy&l5 z;xHHogBrvN?fOKH`-rF6JlG#wAGg-X0-OIEg$QOpNnVpCY@m^#FSdpb6xSc#Z$vl7+iQ>wbv zQ_7Lro;Oe<+O96Ds9VHcvMxj*_4hTkqh;#P7it==7P+A}*`rO1vZ5eUtpPV%2mDr* zuWi*?fBHzxow>I=9XZ+`r8 zNI^+t$|=uBT-efK*5h6YQDR?hLM(B7T|Nrp>y*~iJGgX=CUM8Aq`acxmEo8B8o~e^ zJ(1#?Q+inEOy5OKqRL2-mzCwNsD4=p)0iw?3X0?1GAt>xn2K;>g=tC@^NRu|I{wux zm8Q2ADNdz~B9=y@IY;IAvnTQ?>Hty0Gmwd%iK!9pqF^2__p-+Bha$oIiYLQV1+IpZB5O5yQ{!h(SP zIL7JowR5Gdl65LJEv+7_gbS#GprcOj9D|8%Yy8cZZqZU8+O* z-^={aVmRI|Lj*BZ-3;5{XzdCe#Q$FI2N44jq;E)>Z@dy;_cVk@n~Yj3P=4pL{35ZO ztJ!HVs$&DB6*piwB4Ab_BZ4p$tUBs?#=}Ke{i|U0P*rPKeYCtUvV)ONaU^#BL`TwB zshYFK?QO1T{yCCJ^s%oDRYqZ+HII^&FCpx62Uxb#%GHl%`s|N=PvR>L38 z%yQKmka(i5XAD@$k+4HQxsg=4%K_?o)V2MHq*&Kup(zFZuA{>`gglG&H^Djr_dYuC zoX7?|7qTawds=EOv+~wn)*kp@u%=<>V=Vk}{|(K@x(In`YZPrBV}9O|M7NlNqQleY z-Ukp=PRECgA7{J6utHL&!C(auaDfPv!IJrJOSntHldD@mD9@83)^UjQV#L{$DxZeQ z6^3Ogobpzw$+!opFbqxMD`nm;aKhw5m0Bl&6dhFgW$TimqKjgLx3{q;T%E0NM{=z35@hM!D!q42~h zDXk}*jCNmu(z4ytX!{pFrmzC0!dhjMRaVEssy0y`iE^t;mPbkPaX^Kk^b;;Q-zVAB zZ8Zi~g**&9!BF0caL{yBTKozgB6EbPi$anRJw2&p0cTioP{Jcdeg4p5OA!f0blM_qJeS>*%KR!y?)FVF-;5FVlrvPph{21Kl^G^j=W7p$nMF^H$W-fHpVsj)5VGR9Lm8EgL9ge>Yf$^9)V6Ej;YF?5eF z!PxZzez0pnU)YwzZ{>P4%qi%3ltre67u0mML|-}aoIexCA;ePg)m3y+{;>xLP<{f1 zSv{53Dq42c0@SF|(JThtZI;Ax=~pL_AeFREm+ffE>6k0| z;*bA6h8_RVu;rhB z=Cqk@XaieE|1+mw>b)p7k}7{>fc=@?i(&@+y(rZePDIQPurElP49=X;Qe}~!S8D8~ zCHAdKsIjMgI^McOcHBUzmI0s|dljTlDd3!H7$e@H8hato%$*pC*&AcNu{Wl(sB`y_ z?XE}N;Mt=JM?Fti6DOCDV1m6;xUS5|`4U*k`t1x5dpXNdLKnP+F3_6J zfHBT{%wod(oGx~mQ^i;^6C2;=P7MYVIc9aJ_Z2&>j=$5&u|!S*inxJIpnl8H?19PV zerlkwg_U|!NEWhvGQOAzu(x+$*(!Od8SjtD1yIY;MF;9;Ag);-M_#T#UbLb!GtDWe zX->gzf^3n|;bCs%s=-?tH)c9xISVps(pKmow}A7SAWC|TN}y7AkaE-0`bFq?u}IS*s>Ai?_fU}8!7-NU*7Zpj zhZUl(mus0oPMg|tfNS$v zv4T-%Jhgd8CWp09s?6~-SH_kOcGf(O;z^HOQB<&y2R7DqJqhaYC@T4&h<~a59!K_j zy17q;rr0Fa$3?D0f)%Y-W;EQbm#IK~{z$x<%Bg^C#fuU$*#~mJhY_<1 zULTR264fd(Vo0lm)CRw7ah(6&g~GcUbt|I}y1i*#IPUHuB`xS@#@5>lcHWsBbWUx; z+?aD6)zC2Yy#-T(9ZYRp3ykcZf$F! zweO8)-}X$j&1*>idXO|A{d4sG54UvjH2QEnY|h0Wj^(+To9nE_29qoUE3k#5tp9$4 zD#WYj&A}cjj_xF{nC-I}xSYoEZFeYsNXlf6%uh|{*aBrbmk;us=(-Q(jD~2Ya(s_g zn&4dcQZo(g#Bn9z)#9X}Q1RWfn0hLAJgSJ*>oLB=_7{8yD3pr%wq{FftZ!vDwiYh9JhiVGk}Jr>3KZsnPaKcKr|>5=mbq5Pf&M)6TH<0=se@nj3gOP9&==Id;k_?UV}`9LMw1P(I*68E(GFg?cptl|o$K)mG#edT};H zTP+Q^4e#PBZeD+b6&ZL zx>`C=zZ<>mO{_$f_Gs0Gy!U7z?Ud+`pp1`?CW9rDua^JF@WM?Se7W_aUISk9+jI z2dC~8lsDe94b^&X01R_|_D&~&8qmhV+Wn^Up!tvqWJU)aD0tA(| z8I|V|D3{T^xd)RriWV^5@_9q(ljtO0^Q&fuwLZj#99BShjE6O=dvNvXlEUsAH~ zj`3JzK>n??o@82nLP%jU^0Jo79# zyWfK4Cie$%5c@Uuomlm8ey}O?gnVPwujAWsb+8NgRa(2ZGDwAH?*SOAkI|DltJn*9 z!)xDK&uc{HXep=3h2R%u-v(TpwtwXH6MkplFTWfKaUv}7%3i&yVc(kN?4k}+{jK}k_}hYVPN4D@0XT3tv zWjLk|#FN?nPe560375s|(4lOm9cDJKN@Bp~27;eK?gtE|i|e@^xwCCYN-y?u#vw!L zx4mpaWJuqTyl}>wTO#k0vV2?cHxhr`Wk$t71ts=Qk4N#jT#SUv*U`n-t8}%cvP-)+ zAz<9wh_;Qg!-E;kOUj2}8djGy2eVSt5R1!1`;|9m+r3I$3&^f--S`dmPw;%{r}(mg z5woE9W&ZeO!SE}co`(rykiH0sN$Y0TnJNaPrHg@0O@!t2mqj7x%qkk$7sD{anAUPO z@0$-~pW6dD?#NOUU3u6D%f>_&r(n5EB9q+0`QT3QlRNCNR0i*eaIui#QzCCTxx-S9 zY^_3yN+OrAscd5!$`4bS^cJNEF`JB!$sLxaIz*9P+Ug&qVba8yC%vXTWVdG0h##^) znG}^DCga(yQXxqXm#*b>Pf;s(pKR+!Wb>AwJZcl6M!_wUR{Zgs=ii!tyD0RYsmYLN zh8(S4Vo_VB2`B4;Kj9U-xY{-iD}?-&-n?zXA;f*?%A2I-Ifpu93@E`r&40?9kg4i7 zQ7N_@ytaQMZCUP@5yY0W*Y-bPgGb{NF}H1Bh`~_fH_%PmPf7&%6XFJgGrIua*&Mjf zCEjN6S;Ti3{2=k|2ER>wo57ihz|g4Ur$3b#3iy1yiue|TuOXgq=zW6t!l8lxmxwPg z_(L%d%qM&H!Th{37kN@$l%+E7aIJ1;spl3Lma^vpbN0B6Bz0TeY`vI zbp|gbzSiKgiJMFT-$x8BL4Np`i8mNrw=3`|22UhD+2DhSPcpbdywc#iiBB~6dEyfc z{*d^1gNN@1e4N2^iH|k7OuWM2n~0Aw_$lI}4StRID1&2@ftMTHNqnTiONf^ld=~K$ z2H#D*)Zk}{uQ2!x;=>L87x9CTBGvWPwmb0E#(frX#o!gh>kYn;_)LTEB|gL8Ul5;e z@F&El8C=%|yw2c>#A^*cl(=kgmAGW^4a92r)OoQJho@VgBh^HDn zWG~=L44yzd-Qan|n?eMykN_c;c_A(CGDY?c;*ShZev^2!;khk)1K(-<&n3RhxUVAK zJS1oWn~5(n_+jF^P576Iw;B9C@f`*yrvl$@@KEAM(B=Iq;OhqMXMpGW76;MC=^=}A zX|c|5uH(C5M@jQcDrUCC~@I2zRCj1)WvcWeK-_jUl`6=R?4St7si@|Nvfxm5V zH!&Xc^SRh^V!Vmx;|qzgYW4AB#NRad55zYaoSOlBqru(8HyC^z@%08@MZEHnApVDm z=b2H^#%iYhfZ>7rpV-Uh8~lCxf5DW;d&ECCI5!h`=~sgA-Nc6*yp(u}!E1;QGx%cS zFFzWDzmNDngP$Y*lEH5h-)nHqKEU@FJev4!gJ%-oWiTGWMH4sp3gT@BKT3Ru!M`NF z-Qf3#Z!>uGEZ|!WUPQdr;4<+o25%<5+2E&$w;233@l6KT%m%*E;L*f47(9pgdV`N9 zzRuvYiLW*IVd85Hev$ZUgWn^*%HWzgz*idFMttX$L4D06zR2KZ#2XE+5T9o7O~mUA zevKMZkv{ zyc_YM1}`ICVsM3cnZY*@UuN(V#1|XjXcNjeAAmCk%|4!nJabG|@Xk5^~k0bs#65uNFrv_g`{7-|QB>v1` zo}0;es%9|P)WZE=#{EtD|HR7Et5>GdH z74am4FC`vr@MFZI4E``h+k0ajA;OWE#gO?KzHuZBB@d3vD8^qHL{sZyO2G=bG z-qYZ{h$-}<+ruj2L8iX%CLV0?bHo#k|M!UZHF(Goz;g_~hzp7BQ-ALHtJ(M-8qL?_%P+ zmUGTUAW+kD8{Ka=JB>eQgSg+|@nrE;(?A}k|NBDQ6fe-?OCgK*Y4PQdMdlb-+#9mk zjTTp$JReMa4?Jj^)(}5n@Mhw>4ZfTBAIO8>ioZdNyNri7i0?G`bK-{$p0EP=4ucmF z-;xOkIGcEj!Osw1XYjkkHyYe>Ebt8mPba?K;5EcI8GJYK6{Y~bLp;({(jSQ14Ne~i zy!MfRzTw1s8+R&;Z9msk(mcAim|nGp_=9JH@HY^@{&aw!A^w%YZxg?4aO`;C8iPBD ze{1kT#IG8>hWIxIUq$?TgC8UQqroo{zh&?z#D6e&& zHT8Ecv2E)2Ug8rB{t@v5ras>z{+_|ZR{}q6a3}G14PHuozrmLhf7#&g5Z`C;`@~-{ zc<4#Mj~Kic@q-2*NBoe%=Mq0^@Ds$}Huz=YyA1w>_!)!wmT3Du1{Y6;`@IJ9rP6k) zPuC1%8Qs5R@WsT>8hkhLQwBdryv^Vbi61t2%qhTk8oYq`1Jgdr#2ZchTt|GI!H*Ij zYw+{Lmze(kF7b5+$5#PgYjB?U8iVH$&$%+l@0r9`8+X2*+TLvFy`S!%#smL9Hjl>UnAabaO70r&kY_&yusveF7axER}p&#UqyVeq4z%G$tFKf5;qzA z4)JEwU(z0M{kR}M-NfsS`x4?>}Uv239i0*R? z-gzzX)yDr+;+qUUfq09-n~85W_%Y(5DZgJ5{~h`F8%%s1ERHuGMiO6&(N;6D(T3{Ia8 ze4N2~;7h3ml!C8F!(Cs)doLC z>>2zT@lggR&jdcz;5~>}8N7@22UqG-rzF@n-+aD zF<GLB1@YbnfBR2}pv&MrN#FvLz{T`G*|^_Fe3B`E=ZQ}?xRnc$^Gz4Kkp!M+@Q3t& zfx#m;0AFs#n7xSiG(GN6;;W4N*~AkJJ>Ma|-o*DRaokkMXT%AEhgX3egQpU2Ht{bb zo@wG=M;tT$FD8x}d>irQ=7gIU0opG$^d#^^cRM85{RZ&_{eKh>@EgRZAw9nWa~omt zx1dHvcLDbPt*ww5i3w{ji>iD7CN0K)o3k}g>o$&q@c<*q$ zNBPNxbZb9DVXTn|I@(Y6W+5&!sDTv^xGV{ZVmBAb)o)LeYf3z z;p|yt1Y*+PV+PL|&`mTgC=Z8=c&}ZdZ@F3GYlq`aHqaBZ-UdClp$@YtCHbrU-p;y$ z@*t5RWepm2>`MMu`@0kVE;|x(wIW{`_C%>+?dcA9s>M~H0VAXAu=cl&kx@vuPh_FA z+6FIg8{8Rnaz~-vNUlf$m0Lue)}vC+h@+4Xb;C|v?}e))kE(fmq7=6rzXqF*TkQ(V z(UUt&%6L5Nb(GA!w+H==#kFSj@@9|iJ_8#(cn4J$x48E*w}Y_tQMu6B{VC|uW_@A37EhfR#%S-`m&O-X;ru7r20|`b00mO-$#cgKUbkA>CnceJ*xClG=ruI6w@Dsq@QDn zsZZJ|%!?QH)lXdVDqsQ6i+gh+d_QcLiSCoQBvj~dO1FbW!g?00jy=5a!``7g}q8Lwy@6~(C$wV9JbVt(fzJ5hl}!8VlCwd^-Z@S zFC|l2N9&xV|Jt{)w9v-g7@xm9| zCENL(C`a&gNk#6BBqsh&`~ES!#G$kbzGToI^Cf}}~CMB5nXo61KnkssdM{v-I! z-I5}fwNU12&4C|Gi{(;+jk}JMk1GAGfhXxV`;)#iSQ z*rAMCD1%4FVQB4IfGjh?Wl6t`ae+V=ttvVRBV{+KE0JsJL&*SX^hx1eJWP?y?)?@% z7!AhgNOzdXo=?GJLN`=DV@(4j!>oidasl7JkS^o3qJ*HxJA;=shSC^=_J1i~SPX+j z@h#jE#ycArXSJdj|BmuEYexK9-NELZ0HeNjkF)_Y0n9RvK_7-fQL0+WjgLCboU7Uu z<(TzOge%5=btnH`hVw2#YUuFeKa~5nytn;N#Q7zbOI!E*(98+_bktLmj?2a7T00^4 znyW9uy{9!^z-AQ^r4{WxpLdUYS%w!UH&UsJjjaqpPf zC_v`~zux7@E)-ePtTk4u`+hj0;iVby8#+bs2G14nsqQs%oTJX0S>n#pjd)kWwb&X} zs#2j(2#US!ia0smOjH88y^N1o7D_m-dBhp3r936VF`*BZVnpEI=>`9=6o{| z_C9GZQZeN_P^cJ2-@;YdLaXCFj`5ZGVjVl)V{ml5tC+nCt2%7sVA0e(evmz4eA;eH zj(6;~v|M-IVpskHUJJOo#qVW!jN2~V5fm(@ptP1YI2N=>8&n|%s}NMvMK4r5L$cjh zP~lQ&Y@0`bV|`iLCffn7m`-~DvDoFGg48sW1_Leq1TA=*qMN0$43xFN3<|J-WX5B%fAH@tDf`2D)QrviFV$F-254SdATW`%qA~i z>FtAiZfuUl_g+1a+$({mmhhxSJMLScyl^mX*1ZiwWJo900`4DRY>YKQRkV~en(O1t z0^aQ)U3eZOr>#^bGMoGkks;%F2!6ZX0e5j)I!7VKgpRxeEShEL%?3U0pOHq_v+(6Y z2e+>b8aL3gj?~h&Oj2DdRd?=JS@jjw-fim=Yo~{dUeO<-#P3HPbUn(VmktRvPrv_U57?4;x)lI)zE-^Ur+nekH` zg2!W#!F*ddcc_9OcTtr)Rlwf0DAy@dQ8!J}FS?Nx_6znYQp|k>DS8Jw85Nzgf--l! zhe4b6s9H`($>)RBmk=C`@7MgqsxRZi9!Oh$Y0aD!uw-6%u06jen%2SBtez$Jgu%gA{NH-UfyOP$ zA$~+}=V8dp1HxlS_?TLEESQsBAytLRcmV;Sa^4LfRGGaSVa%m_#-`c^yMGI|GjKr} zcaq&3uy*OOsM;yv;!TCrE6_1BjHNXMb0BLdcBG*4tInFSz(VihyvVi|;Y)oFc16-p zh0_ObBOTsNOuk7pGg;hi=e!YV^=5kMH8p88m#Cs1#rIvxvHo3Z0)P=ideaLBQP-5=G}zXCZlbgZO2s@ zQ)yvMC|a%c&%2L|`7vmG2sDUm;}Uysye9Yxfx-=_mr0Hp58BzK*eQpi=|~EhL8?r$Ga8YREXjaddB95hC-`q;FEK`yuB)KYhlCDw%V+*vwYrI zwNe-Q<~r;8J4I!pjMFoa|5MNovnQeTvlkXH#PJIiciuf5X-7KQlg4Lb5mCACy^2Bj z;Mo3-QohB{u<+ZV$^Pa>n+KXzZ;4-h!w?TIMUJuMhc$%P8_cEbG>4vF%|*!)_* zy%l3(#G6DSTxLGh(iUEI>jQAS-{&+ zV<1+u0gSDe_I|FWqh=cGX0p|~kPmzF-{IDvl~xOR1hk`AL+-PNDSq(_tK)O!$F|P5 zE=VhVGUOdcAk-tmyT}(K?q|q02DfihN4+Ll^D`;V;US9c4P>eADQL-c&}_B}U$TP~ zTI;_MOTfUiuAz}u=VHY}xTgO;(tVWac4Pm^l6%wXNNu(*KRvOo2>RKg3z)KccOXWk zvZS7~S3>VZFsHEzZzVp(RAL=s{GEaPZXn<#z@?|GptvlCn5vR9H6?fd0z2rKVf zrSe(#BQV~6_Ra3M!K{@=WKoVKinX@k&bfOjvUeFeLk&=K1V6&5Me#Iw1Iuy(zWw>I zlv_)v+#;$O`drx8ds}C`CNchK){AY_w2| zw-%tPl`OP~9Yao4GI(u)y;wlbyA$TF>##T*z%{E}PlqcKz=Vn6o4>F;!bG$?%{X=t zey#{fC_)k#*wL)$hSwya7#MgOF`6;wcw-vt(Tr)z)T0sO1!AXIZ&x_sOLz}qoGCJf zb`^u<`L`HpnwK|s#+kD4p3*p_i-O!sI9L{(Hnh{S{d0sYc>P zky{Cd{L>q?I%`ciDW`oC8v0SGJd&J7N46k|6D5^zLF&>-fkuktjSYm)}m* zj#AmAU62l3@Y~tIcWbblm2%I4o;c}>2nq7xj^EC9TRLq-z1}AsH)Us1rsJy2!8fwl z*{WYQ+l+kz@zR*KGig6o6g~Xm7xW0(iBM<7Dvzy2^+<0uGTAsNKPNNDI|{@#*4mj` z53hhK3JFY4)xf(maF)nnjptPz?{373Xyl!?M=HPoj_AX#@ z6jl3pZ_j;ZXOr34o!Lv0-2}2UJF|ggA?yYS0l5Z5z!<|V;if{wbnHnGGE4|jkxM{8 zM2vtK0TsDOKtM!5Ktx0ch>D2IMMOkEMN~e(@PFS^-7`I#6ZQLk&-2fdovwbn>eQ)w z)v2m;usA&h4YBfFMXZA&w94H~r;f&u=sD`^yW?G=7CLWVzyQ_xrIVQhPIJPVJNbJ2b) z=i#UJ8b4O~TXa#_Xj62%=fjE0!McI|#-I0*=Ja6w&A1|N0@Ug&?qHslwc2_c?d%wY zznyLNE=XCrj&%0HRMV~stw5GQTIo<4>XU0pRtCpDQi#V*;s<*nOiu%_6Ey;*tIQm+ z+v*rHaZiJ4x`_yZjq;*#Fg-ErIq-7__^EUwL(}q`kzZKcYGJpYkjjpUf{iz>hEgH3 zoXOHc3<@;Mi5WBu+41YH=sI$cNvFjAW~CjGLdR!Jtaf$}rxRHBeg|=tCi&Rp;WSi$ z8Z3$Rnz%q!MuV?mGziHT!3N;ov?QX;mq-?j~5h=rbVA7X) z?_wRlK3LE8SnF>MnJlwv;NFStoBzvAPjp0PxeXNe_w^? z&)MfWWDLeDodTXQ^nD4?$F}i|h`W+ooLsruP8UAfPB(td=5D1MzQl?#dZxdCuCE%> z`M06smB~Rco=J*;k6(ii{xf_;jRn>ZnKxsG6$@kGQQnL#)}5jKHN=tV<&B9h;4S!S z^HT;@y*SZ;1$gEiRVgRkP#eI zq+sx5LGhi%$0y4#WVz*UJ}l3{ZHDFF&-b8COAJn?{q>;Nyc6}#D4=W@!p+h$H=7&; zIqyTdo;RmQE(o6#Q+@+tXRWVdqS#$!OWWF84U4Q6=Q35 z2sB!g9nL!Xgp`ncB;BLIlHXiz2san7P?yJic&VwMoG0u8{9f`T;oTJoo+(X0k*{Q% zhFKXNwZrQvcpZA#)PN5lIcC)p%pF>-NscLhuPFgwi^*|e?to=J%cNYS?zFYbY%uFy zE@bPUOY}X(c4y!-!BKj<16f;txh?#{=8Xxmc#F8-^FIk~_66+lSRm-|B2EdUY^O}Z zQ+&31DyLv|vHvH&j`5%6Z5A0zTfOn+d)Du#y6Bjf={G5YW)dmzEA2N z)=bek&*Igtk_Y!ssBOmSP0CoyMdHbQ@$~2|bx+<+Xq)B>70W|F{C>ofu@j>BxW;I( zY#}-C{wAL_Cd~h`pctls>MH(!)8wDqog`gj>U_2R2|HP1^85hrGzH+WXT-xvDpi#% zF4mYvraNL?hcp~3>%u6oIak(`wDokCSNbvSSqd0tc9a+U@X>Wx^1?@JO(<-{VKtf_ z;%==R-(8D2eT~Ip4zA)uBJ?57yF1tba`W32;Yse!Th zz*uBp%&P1Mx->G>!UY)q!45^_TFAr2U9cj5H|sAe-)%*94)94<b{jI(#5*qv!HrE>QKa6kLwD)g8eSc$0}>k=%n|Gc)Np;?JPhU zt~)hoS|Phip-|->qo6+H9E{mQ<X=eq7q7ZcUE<5XmWIN4|ka(mfkC-cz#Q?S27H z*+@GF4mkks;?^^4h!cyG9sT~H@JSzI}~tGj>IiBj7orId+dvqj_J#cjbmKJhS0tRnI^e{Dz^xk z5ITgtIIPE=1ypcHaN1_D3I7W4PB%>)*vB)Kg06 zdl3qeYv7R|;uQz=Ol3NpMaxr~AA%#cZdK3}Ox+p%JpAJ0hv_Tckx#^6x4>BpqWOgL z5FSQ1d_JGc7sfZH4Y_5v_m#hmjY(&4K4D3H%3N1<=uig*{t z&;+FZrDH><(O&7|T-y6KYvt$31{5cIkJaB=A%}%hf%r8)MyCNw@R`sXti$(DL zD12xOoIrDJi~7&TX|1JD^jwPNl1uZn_a1=_ROcx0G;#?lMyzXiKSsV|Q*^NM9*O`4 z+kL8AkShqaBSEcnK&&{tPe7`Xj$AGmBGsO2-x{f|I;pYa2R8Q@Sw$|oH03Tr!k6u_ zBTfztI-3xczaiL>>wrbJTt_ifo_Os_u4A>3Nd#WERxX3qo^p-@HujJWnDSZgv0UKB z12*BJRt0tO!A863MB_q}c@&D~rG%s-%EUctTW-x97H=G(#o{ELZ%gK~GS?aX8}cQEublXdzJwRlN4B*5 z1g7bJ0uzGdNLxdlk+$aT2^RcT#)C$HrIqEJpQ0p(B}1Pd`*M2m#mn~^4P+{R(pBe}Y8e%uH{xk4)JJy8US#MX=1jH^-W z2BiHVCGFBlw?>lA(TF5l>Q0q$#=xYm`BQx8#Z-Am=Sg@o*VRN2LjEOk|IjP0WyqYP z&il`sd5^e#n4U|!1Ka-v?_6hM9$~@6Gvt=rA#k=dFED$EElL2mbI=JRqci}P!P-`q z7C8Dpwi7@xIQRmVo?$zK&jeNwZ^wrwD~JV1QBhgsTvWF;ZCA4{wIN=9|AIh95#c=6 z`U&#Vw~N)73DGe5Ofx7a8+{8;LrF#X06UZV6ilpH$+du`P2>1I6fa=jVfMZrX8)Ov z%k~U6Ab2J@gTGQ&q&OoI8Ojw0Bi+Lp{K~5=sZOac%C_NDCR*E;kHXU0bUX(iw5xpD zRes!sr^^F?-j*#AUv`x*BDpVOwJoz?nNvH9qnJa@*u=T8NIM|mINeA%Ht_+!oOm_) zeF#|^_^lehkIBQ#(x*kDm4i`DaE>#|JCT-yG)LrH<)@fLW6Z#eaCt;b@tA8(KL?JTb z8M@#qvhl$XK>A`k`nX^nhkb%UR#og1l<-6$lJuZ&_qR$cSkZBx=aZ;AKV^Gy)}rkF zsias;gQQzd*Ld4v^Sg07wKOH}LL8JXIAU-JNavhK*Z?k*-t)a-ynP; zS!0b_oOYETDyM*K?KFDn5{kw2Z~GZ*oj!@+bP6A~P&CvpIBC|G0*=ER;<#_Rwwj*1 z0}lCC`wXE%?X!4{tVhzpq(D_7>uZp5QQ|@#C8c(ii2ET@!(v?f2GL!*b|$}Ri4%fV z30kG6%7yiW_V@`Mo73QtTp*Qv*us)w?}C%|_#oynenQ7>L(BY^`_TON2r`X-m{rKX zU{4x*HQ1A8!EU)H{d<2;nyIewNA{%0{5@$FN@Gu&U+{07WfCDUQmTh zed``)bJqV%L7EV6>_^joV?UZaV?Www&*u!wX12vLY{>HIR*|0`o3v>QrZpQkxL%2` zSdT_|&&B!~`*T^(p9#2FC^(`Gxqn|6BN~^0~F#|965oAJ|0Mn zO*^BMV7obi96D;PKpc-E4kI%#aTNVH{0RPnX*Z58*N@rZZVC3_;{#Ytw_$^)yK*Pu z%BGTT68Y$!10fX7zkFZfZ`@@H^Mbm}ChG6G_FJ`H3%UZgj=d{pdK9n&X0` zo$fG81DL60Pk`=N4BUPdqks`eZxeX%gUjko&L}c?-{j z2gL=;QGG{Uk#upu5MtK8qukS25->HN#8j;x`HY)EXW7*<@{)ESO-Sc62wx*+zWDTK z{V(VbV@EuWMTuKM)fybM3x$Z(2s5{eT1(JYH?dp>L~DiAW@G9m#Ib_CImoV|Y~1@r@KVmKzKgYLZ#YL*P9Eel+eK8h{M;so({{4n%^pxLV_#83ON>U^~RU8$#d@ z1;h@Olom2XPAL~`?6;b$HmUONiSnFCxeb>gQi(42J_(RY;ppWR$d_ztXmSiv&&JRw zXN<9EjQQb>9ob`%&c|6Vijhqi56xWAy&uHV((W>G_W_~Ym12cYulOlsG%$s{0v&3L z`y+hvccq>i>qxDP`+PPo|0Vh+xDUctFb>;RzqRe&awN{mpx>N|`1vnVh80fMDqij2 zQ+k^*-p}|IgifJ7Nz3Z$GH0>;DaYJMw8Ni(N;|>bbTg~GANh$n=J)va|JVHJzR>&# z(+rs(?d(5i$}?UYmS?Os3(ug=zaM!ZXPSI5Ii^?P;B8UAd8Xr?Gx{*;!gXb-;Wa~) zcgWEOYCDl6=VXL2Cu3)UIT?EfyGlO7b21lkKEblDl9Qn&wzHnKOQ>&eiSKNffi5$xTE6h?{Z~5Wz+z_jtXNbNl6G%(}5lyPI6?+wb?{TC`wxz&GlA3_m_OAi$_7}NTP8)N87 z(0-DAHRceTSQN6D^amssP-8qRIJjV%zJ{K77(vE+s)1?vaK3`F$3+=o(I1LilcpXb zkv|cZl4Xpyn98L?eZmpeM1Sv_`%Fd~%rEUKTf@+RU1du`|6&|6JCcS1sl6=MtD!)Qs7#&g=gyHZcjfB?K7s(RnI*s*2vBqA#du+gVy{yQ%0= zD!N8RH>l_fD%$lqjfcHe)Kk&RRrDzpji0T>HbX^^QqeUkdcBH1rJ~7mG#+NF=qW1t zO%;7wMJJuB#Wr6>m#XOXD*CjFPC8GGO+`;t(OXq?vx?4Nr^R-*iaw&EZRcwgmZ|8K zD*CF5_FSORU8tg0spv0N)cU+ecSJ>(s_2C(dZ&s$r=pWC)Oc8?qIan1ODbBpNTa)x zitewX3srQTiaxBO9T#gn%vI5)D!N`pA5_sdRdn_jG#*Y+(MweHK^5)4M5BA6ie93k zcdO`gDjNTy7TXLJJwip-s_306`l^b~x>V!AQ_<^H^cfY!evL9pPg2pnRrC}Uy*r3r}q@owA=+i3tu8Pk3 zx)$4UDteoWj;ZKQS8H?^tLSwq`htoMUZc@ns-hcJ^f?vnxK^V(M@3Io(MweHAr*~& zLyOH((Zwoyxr)B1qRuz9*iKN<%T)9g6&?AOMt6;hKCGfW*J%_^R?&?rYJXd!FruQ% zRrER)O<%9kov)&&sOUFU^bHl==>{#fBlmsGUtE{*PCD!N8RZ&T6DD!S7T zwAefqU9X~dspxYm+I6=U+rBD#nTp=2qOYiE*F9=%DtfMp-l3wesA$i|4*W=?aEyvxr=s?Q8ihktbc2e%t)hGXSfjg6MITYo)`v6-^Hp@Uiaw>H13%H| z9-*RFs_2-Cwmq!TJyAs;R?)&wH44Y6=#?t^mWuB6h(>pnir%N9@tM_p0byD(d_~i*1pLUZ|oEtLW=0 zy4x?c*iKc^yHxa572WAq8r{Vzx=uwOQqi|mbnmCM*iKZ@>r`};irT-{=+08ng(|vM zMQ>Hn7gRL)w8q066MW0a7H&k@n-)fv4r=n-8=#47+qKaB$T5R)G)Kk%mRrC%O-K?VXp4E6*rJ~&7MD%$=BjfdS-^fM~@h>A{pS);o^MXyrPS5LK zbQOIL*Qn^ND*Bv?rr*?fn5Uwiir%QAuc+vZziY91D!Nfc-%`=t{-M#m zQbk`^(Sd(z6c(xIdKG;{MdNR2bmyt)8Wp`uMdSaY(VeTJpHb1fRP-MzI{R%cwiPOR zql&(zqVwL-=$@^j_o-<7U5&zA6M_p0b-72WAyT5QWy^g0!NLq+Fo*65z9q7SHO z`aO-pTov_H^bQsMhl8x$trr8ir%H7FR5s`MT_lJ6}?qOUsTbFwni5^pOv(I zR7I~>(dSfjQbeP>Kt(T6(T7y@Z57=qs>ODcie8|i52$E5rqMk}MVG7SdKJA-MaNY1 zZ58d0Yn;tj(Pb*SMn$hx(T7#^O%?4)Xq+up(RC{Nx{6LpYIF}#(G4p4rixBWX>^ZL z(RC{Npo&6yq0+MYRdk_>UZ|pvs;HgOVmnAh&r;DFRrEO(wOX~<92MPLMOUckbt?L> zioU9%GqM_I%T@G76@6VrVR}g^&BIjmEET<4MPF3WNfWf#j#1IGRP-SgeOEDMXy)UH&t}UPL1v{DtfMp-m9WkL8E)Hie9Lq531-ZD%xJuV%teY7pv%JRCI%i z-m9WxDmt-C<7}>qo}i*ZEqDlT}7`} z(I-{3tyha}FBM&;q8n87Nfk{_(qfyTq6<~@VimnjMPF6Xw#ga~`>N=PDteiUKBc0Q zrf9J(Qqjv)^bQq$NkymiHN|Fh`|gT+$585!bFP7=F{7{!iUYj0Q1umY&cw}OXb-rE zx;^5~b#))q?BpwT$|MF4^9`%)j?2b@#syrM-WSmg?(1t7{v@=NicSEdW5MXJhutLT zK%tE;=%8}p11i>?<$OY=!ZBhBS@fmAx}VtiiFikWrtz9?x1341B;Qap;0K))@veM| zT8bH^b2#pLH@raStVDyG*YZ^~$>!`H=M~)B7L||AN`#`>27d1@IvMIrmwW6l&;|Vj z(1mayv{?CnNRO*v&W)3lc2-ZHR``}3k%%K0^wcBb5C z@POt{F+)k^22g2zFLV{dnn}onC*DE^yi@M8R1XTH(IyGs=527>@tA9^&?zgr67q?X z5h;LlkB zZ|)g!E_nJUJo&s#G?8chtg&-h|9j;$aOj+ZA3xGT=MoV0m2^T+tq{!#(VWo$BYM1T z>jPHih`=Vze%90z1NW=e4{vCpN<+)GUbUXQ*VyrdUam+Z)u^>y;n!(U*YYeY?Oapo zTx#qtz;^kvaP1H3(Qfovpa$qy;1U&r&1$08qXre+6qFf350UY-4w}Nfcl+up!3&7M zD3WgSQRuJx=&bu#Xgi-m2C>CcAJYCb`->{Ond!b|v+8bmQS4!6 ztyH05XK4z;W)O$j`T+lF*v%4HCh60V&_CTnJD4{NI zXM1E8f)2UIxf@jxswyty!|2aE z8fpBm^gRB*=to2x)O|ICCwlx`_xWR}%$Y=?vIb0UNEC(j%4&J(GB0Py3&w%;l)BEK z+icM$TH6PCad!sGXIAVGgNc=KgG~WOqcNf~&aN_51?OU9@=&xb zS~$$iPoh=~V?69s!-j4L6d&)50F5|B^;;;KVI`WrtwsY&L5L=57(4e@ekB{~^pSyf z9~u2Ak{eL2qeF!NS`KyKQmsZeh)3r*jBC`;!#3b2DTqt>hnYaTeCig#%O8mv!#W>B zcuY!;;qaI$?Tm|C$V zw}cKiG;1%K+|9^>|*Do&usNSCB-}qlqOaYU$`>X*&3yubra9%9d&1; z#+oSSP%od(&78IPv;`;GRQVH8=UA2(Yy*l)>Ue3d_PD5|#{3sn8+zPUmiLhJdZTox z%R2{U>j^0xzaki$2jsq#0tL}u{avW3j&CmPjYQX#QkgORpq3AOr3EV8ENgxQ(=}=C z2^f@O4h$|VL9?Cvee~-C^^dQ!AD}&{58{bg6!b)r-)w0p(5X#p@o~R~bwP{v4)Mxw zK`jG|L9JBYMa|m1fdcJ^RR!9Hw}drkPop!t$6Jk#9AoqEMC-Hjc|K0T@NMALjyw?W}!>4>P%0NN2C} zk^ee+2@tIbrHD{sbbRHLl=-AD(|5-#Cu&*Gq0IakS1?8xAvKRv%;Qsh7~^86(HSvz z#VVVy0IHoTAH}(b&SUB}I~$Q(m>ArH>b-)RjWM?W zvQdfIIXZ`-V)(Y?GnF5swya8Y&ASl2iXC_NMg228`fgz~?mkY2Y7#wv`_~|Im&osM z!tSW8;ujNnO%hraU$iZ;q@TYqjpBc|?loWYe)8-psldX`b4VI=A2Uj7 zc!Y2K4i|i4jbzqN50Qm(XL!W#aGxP-{J|834f_L7cX8! zG;#L{Cj3kgHjSl$OD`b2IXLdOnd)_z6hH-Jc@}7Ow346RR_ltrwMW43s^^U-+L}TLgXtF-^y;y<1=Xlry4cGe~ULHrlR7;lF z>b3ZhLK{rpI4-e3BL#VDnkIcN{Awty^bRzOQYBe@G4A zoEMU|tT!bxj!=f=7@3R@okx$oi#MudT#h;~6p=4s+B~Z$@0Wt%MwpMX{ z2|0@OJp1`k(Yjq-jlku0Tb}M^@P)QU%&xL?D36q;8JGJD@Z$awKd5N@o= zsN(|A$I#;lFWpL&J&FlWS0g-htqQ>K2|s+@hlJ-_SPQEeKP+p*1`BP|tmUXjkaD$x zU+EoEDqW*x?8k*{0_rPLa~AO3y$AmF}EP=zZ1Y81VGdy%Jo;gyvXG7(2jm=RW`PQ z`$y@1nBzl*$|(9q89j{k4AXULrBDAsNl_7FmHmgdC7m+)B4tm3(*B&Z)F_c@@%lJD9A1^^G<#TuZ zjhuiV3{&)KSI@?;)Sl7z6E^QG|55t&-&tDH-S|_$6qIeBgMd(QUK9tkYzm<>;IVct zzKnbpG5e@1g=;)W2UlfS_Z4J(4c#M{;BWb(w%|;=&>|D&llv5E>VQwpK<2l~k;eHm zYEA7d5-LifpfMi`Fvlg4oQ-~*s^blHX)wPA-NM{^8?2gk^fchw1ti!d1WO--L3O@6 zzu_0y=mcX-!#G~~VH~fFW;#8JAYrm`D0-SU<6Q z#RLl62U+&P#*O|#7;NbGC;f(gf2JGy{rx2RsXN6V0ou$nVrmu?!n4O8ghlll>-6Bc zkolSMg1;C^{ITl2ciww%iHud~o}33TS>*Fa<|%z2yDd(E_~aarPmXH!&i8lhd?~`) z4sv=t96qky^d=@*qVU&Q3(@=<&IdLn1KqO*ahDeIGYt2n|^b9>wPC1J;oPD%Kf%;567JYJWXD|lSZRYv5)fMnA@w4A2A9cn5 zV&`uy{QQpfx5^|;Z*>MZmQSyqg}36O6Ki~;8t`rA2mL4y>_jpo()VG)o*tVDHOSF)`1 z@xq{>?o0TD$**|(1Kh>*SRY0alPk;uShjZeM$HHd*-e>ct%Hv=ywm0eZ4UgN@dx$j z90W#p%=pcU$)7);OWbyzMqbs1g58|!OGibcb#NQy#| z{t7bTuOKH4!!7_90Q3HM_X0M5Zwtym1cZmzB33Qisa(=rn5UkVw1A zU)h_4ZECY2*=$_Il>amf+xPaFY(JI{9;%6s9i{RxA?*YZ8iBYVf+9wbVfrz444uk zv4q1UsAU@2C;Sn~04(7zJ)1;@zPZl$>_7(aq)Go(kJb=lUl$cOp<_IM}bC@7x4j;Cp&aN`0$ed&&bDF1Q zP4f#OeiAF#LJTzR0*SPDo-K^E)P?F~4ITVt(gmm!DIh!F|frcw%EZun*KQ z^s_W%i7g$^1g3gg<@o$gL0#=;H)m#{_=7p+2D+I+ z(kA}lw+S-W+$K0inmGb#*KLReHFpq|bE~Y&To3$mhHCfJ>!L)`sEed)>LTZ{Ob6nV@1yAEAh-8=r}5e4Jt)s^?^E0Gy~mrkEuXz! zWICUdyu0K%**kB5?^C=v+ws|#^8RKVY40vakc@ZE_Tp&u_8k;Q)_c!5+PoV}f=uwP zD2rpFclnSwa^Cqf#L@2UyMs9L-an0_!+T&yK{~z9%@jw$n>9-uMejA^=<==~7Npxd zZ6|T`c(ZmEN3ZvLWYaH8n z-`-V_ZN25YiDSCA-R|NT@SZe|?YuMR3gUP(_7KPR-tUZK(7R-wASG|VJ;hP>-Y||K z@2h(WGQ&IQed5@`%j_+V9leK*W2X1@eFT~1ow%c!qKj@`URjbnFj<-vl?^;$n5jy=4u8^=6v z=^=vb>1}hUIQH`H6~`LRIQk|?{ldWv@3h1483!}^Kgeg7_cM8RdzUWYdylu|Lwxpn z?F;#wi9-6B3wzy4wzY43Z73zG4c9U+cZZ|5V$k@em%jyCU}qlm2G zG{N~JCNpc;hvM{#nNta;O46LwA`-g+E+44sy$tf45L7A`|zIc4MQ;q#tD3Eze77CR% zc+J8{U=dH)4eG^%^I|i{KhUz@Z_cK+AfK^#*Qns`G zaxUVWnuBRqeDrMa8Uo!Bd?|m#6uiMJDXbx~VaCd%DeqeF={*>OMWr@;mUWyQ8EQ>& zha2p|zB5W${P_uh=|3y@+5&gM`2kYt-h-d?$X~#R(+7@*_G^j?UE&05c^(y%)!I+c zZ1~H^N^Rcui*0;!c9D0SFOB63EEH58KRf87uwgl;oujJ zD#~$0IcdmdC5_#Mz>233t6xFa(Bb@%;tejw-$S=hBWAt~zHOhrp54eR@GvwT9vZaR z7W>b^2qej1eh*$9rSzg4!>4*5>6ZYv}CY?uF>3YL-oGhwdWfSlkefa(` zPN!+$nG8#X3yeYEj(RU5I&@e6lFrL{9W9T3$xxHuV?%!5Hhy2FUz8lz0PT2Ul9;o- zlTgM5cMg()SqhGKf*7GDVpj!nKt%kmA@&-H`8^}g3ckfY)yOVb=U)fyh|u_VwxuJk zQZf)nJc(8!$xrwl+?(j3e9z5U-|BlNn%tsaWH2-TnF^k0zuKG|#Pp{UL)O!NbxNLH zl{R@If$vBHy<2e(3~%@HEp&izZg7$_Qu{iJ%;aa(;&WTHNatI~7jsgV2Rfa}CKlV7 z0*7q;Y%nJ~C9k3~2bFMtL_GEL6qss*wj7uNi~iee31v8tGifN1dzU;Ol<8 z+*dd8I#HK->9wMJ^$!f;^xTeweh*T{Q-q28e+k>;jV=+sUNU@LJdQ8Z4i_Q6{(}5! zi&Ksm$|8SHZnv0wBpG8C`Ox-lG0BItd1T@ahOT&PLLS+6JLTZKM7#`gZET?j7%u)` zxcEYti^Dj}c^z5l-@y1YyRG@Q^OtcDc;s28?eY98`;00*2D0!7W;1`qJ5DTR#xjLW zU1FVJn=s>a*2?#rbrJ4 zP7FE!%XIDtUd%ak;UzeS?);s(PwT2=YQT=hB=;I8(}ObTbsD^(&$0ft)v_FjH!?mk z7=&-@ZG>lC*m`(ez(LtX!$jaepcB*u^gS{bQ84)?c!?C8_rdfaPCp!ghtq>Ge5hqG zQWP|kFlf=BeoNVe`G9G!+e9mua~|egiQlAq6@EK}!i0E5*$d!-E+zFVjeS>IGJ{AXkUj-Rk zBUTAP|G_$bI>T-$--&gzvKf*!(v@*zvoF&jA1H$%XwS0+qk+9TfdxwJ!&uPH~`45njIeVibtl@X@ z#PZ`F4fcKIpRqfNz24j41BV-L;KNyjXvb0mwsQm=Qs`{&7R*B@Cs|nISS^%AE`j{^ zpDYvSSa@?r(1!e_Xh*IC^QGf~Zpd|1{)$Dj%rR`|a6pxRAhl^{CF)|vImHZjvZCuu zWaCM1{ztF_bt3$^|AfC%(Lr{{v+>lp4**VR@(JL|ae#9%>wBG6Jmq|$8F1f16#355 zXnUvgKXfAPOiM0Wy#pD6$L)B~1T2^fJ1lVRBz|z!i?Yu$TP;j z_Y_!?@RfH+AKP-yLZ!4r+L%on0!6j?7NqBSrMaI(JAl$a|F?zZ% z3LY|y3{vRFci=LOQMf706Wwb#pQjJw*|`V)YPU$WIgWu@e!`izHz?*Zh7cBW-eSJD zx|bVg*+H>u0l#cFFA=mB3;9PM9JHEV~%h$fkTGQ>ufet+n-nzkCx8V(M?Raaizvb|j ztG|WrAHrt}-%{q=pta{SkUOCD{SbfbTN7x2kVnfu;+QAN`y4!5L-+}J-x=>;9*6Uo zStoGZ#cc9Vxib22s|W2mOy_mrSW{ZgI2>Dx)}g>>kHde2_|Cu|L{v?5ZU^=i{2dm; z*^g`ljknN`R1(NG^rO*_p^VSLHi>BxaVH5pgOTAo$lbByT9f@VVu>}*9cUfp!;(%P zI>#P!d6XhB69^)(Vz}1cfLaR-*GZdeGO%vj`3Nd5g=RlSrC7DOXSIipGaoDD!q3IoNmS(PP>rpYLwlHLbU$^LbPmaqrmDY3fUiXW*>2QD1Nl);j`4CH*tz$gL<9)7QjHyCGNV zeNAgJpGbOVv6*DyXC)_|{`JA3SPD|!#pptCHxMT2u~(da24ST~`aa+|;JDxGq!VRK zti{V%f^)$%jxRayV8ZU-PiEzlcu)b05!S-9kn&YHThf9>yp0>2{l3iB#@5yWCz$4L zqc=Li3+9Hlb^2;6u?@RO%%Qoz^$y#58yHVVDiiR?*ok;$A{?zrIj6-_*YDC#j(+0Z zZabdwqMOIVcG;4R1h@<5k@@C!@Vo8aNOvdP-Zzmoe*2LwK?W@}aJlE6L2L#1YE8OD zJjQm+ruy%UqeJ-~JCy#E^Jip$9~#xPVEdtCCh=odvfl2Gv63fRJAP2o7L&g4K{-oP zLaj4dh@)YV4XI)jDiZ3`pa`zy?TYmUSF=mdHp)|skUbOS(LC^#knt1S$i^S%Y@B<3 z8qa^RUlDKUD;A-(c@MM3oQYz_Q4|v{DN_G(ERsAF^Jvj~kWG0{W61U;B*|3Ktsq1; z?mfxSoZqncQ+1c2B%*5WAe7^gTolA2B6B^oz$r9`d_FmGG;6;-!5>y%==W{}W+ul& zwsQiK=)D-kleXjD>%og%<$P0Otuc%VIe4F4y{S%N5`?VvKHGLU$8a~Iq-*qIJP!WS zuHIY^Fckqf*9ira5_FCPSffAVo6&5nhZ+|RnKseTi}5&ksa?GlZ$pJJOU}_GOWb^A zo-kE|xau8^Iw#@lAOz<7A-^%r=Cl&iY)&h2or-fw=*(FCLp%%ed%;OA=8$Q~-*{5h zvNp54E6YFxS~ot6$LjmwH|~C#WEWzgdNv&8bmWkty9%!2V1csgip$Rz<0{+T?Cr%)8SX}@_ojRI3j45=>FuNFFm>!pXxl{!fN6IMQ6Jj1kSX*tHIF zUR=&F*VxiM>qgMjWXQnKNgk)?W9Ag6#8qAjodHOjH?bb4dB4Z8FjihpCJgW_fOrUS zuc&_$28-FT!PcfTo*bNbr8Vv!^DJb?l9){-UG6tYKo-oY51S{i(sGqTZ@ z8&M26_;<3OeUrxJ@3CpzTXLU)$YtHt@F^t}%3Zk=A9tU|_b^IHP2BxWGb$zV+lQH3 zEAIlWOrrcjKh{Ad)`XkK*u3>v6K*@l?ncoI{jpE{n~D;3ZAjA_RV@_QW4(#G5quA! zLNdDYad3+xUsA!O64m9M$oD-Z-$mwUjUtct#UBP<`A6B(O>o(bd^fVmhOlX| zTG}V+cES;)%Nv)jOYk0d55|tgmdWz-nr+u-^Omi!>DT*i>(HeQK2JI&;4@;)NB(~o zeNn`@o7;_kGxbHprq4JCTX?1;Gw+Y@z)C;9W(87cwl&C1Y{*Pz>=nclv+hKLi!wi) z?{V33gmj|mc%=trj459)i#l1HSAn;LI|*;ne>%MRKDrp7^Ml6ZgiB`QiOXiWzLsz& zBTP0`oHw&UfvwfZNI#VD*i_vq@RW}xq+ObqSVC?BnwR({wqn_xL`Sq3abH6qpNQZt zCDucgU$M<{*JuRW69J=ao+g@o!_g$e(WF9@A+D%XPDiLkpwb!4vq!uJUDk9%_rnQ~ z)!Z^rI8|JVN;N`hmY>tC zdM2WwgvWYkC{ait1SFz~QHTT%;s)Bs8Jr!JADn}Z3BF&#`9nxz5n(@ItN-J{?ZENBE9$ zms#6}t50{XyIy^|gX+_Vnlb0Le?d!9cyZ8t=6g?>`x_a;1*m3U$6s1{GS+t^i})HG zH-&JFOdR4kIpW~X=be0FvQiVrYMDKF-(j|60gzt9IZar?nx z<83P65NB|973Tmk#(o>}T->pX-~-P_UVy)2@HZltuR3e|jG4^!c(`j2gF6jWYBv%s z%EuCPHCOrWZo@A(@Jp4y?s9l9Pr+Bd)vn`*E(wBzjH7;NKd4CIZigIOq7!mF5iDfc zjW(TXWM2^li{JjX=_@$jr_4LXzT$LJ*iz=5^<~~nM~y!s^Ns^$_L8?i=56w)agLGn zwsMYfE6i@?9HT_ikfSqjLyk_~AxHPw^f^SDn#<}t2=i~sil33)H{%g1t6PXdAcTjM z72i!+ZRD3Kf8EniRzoZ+zSVBxhb{@?mz9vNO3->)H87TyeEYAl{j(!!~kdTebr>K(i_s zg|ysNn{=cvwh?L& zvC9=OA(sj9jtO|&Ou!{QSdqJ{5tm!Tk6mR#v+*HF-o@GYRLTXA^eW;zDfyCe&tQ1= zGf>EP00cAaSh&76wR9IaPK6KWEc}$W$J;0280*i+ninAy$mC)W#Q3Wa5R$5UW3#{q zQp)b5(<3Q}rI7v>?7Q(~Nym<6&Tm;aTB+NuezQ(lXDxie$Za?e-5>swtjEF*)|{Us zLq%spUHXUPpwQ7}#*5WIVWF5s!s>_Mh7@Kx64sdcnmN!ct8HE|2QpCoE6vOkGKv9@N!(KEyU3PI*edmhtmZnO|90n8HT5& z=5o;X2)c%uP+`Si!>lp-sy=}{g+HORz=VWqS{D zF7a(Pkw-xWJ>AbpE#_U&@Rhf{d)uI(K|FLB47PYQ<$};k8XHs(d!J8XZ77yyb6K`N@!QzYDMVsO)!Bf{$*B+ucy+A{*ZB zeqgQOegwZO4??$7dmJGLO%3ascMDp8b0?269AZxn6|nOY#ORj6E=4R}5s8$8qLLZz zDtsi~o^U#tD^qicu33}p$)Orn$~L|Jhcp|dt5h9U`#BS4SNU*{0^rR=+$K}p>*(PL z@{fcdF*c;T?Z*f5?Tf7TuLthOt@hsq?p#azHbx&O{I|3pZ`_c0x8&RG{I=K=$nTi6 zeu*WAxli(48Qbgg)C2J0R{V|Jh968E`56LM{Q9kQXW|B6-i}V^yHSF8yZGg=_cA$Kd{8Fy0yO4s zq}iCeF&@m_e3Cvjw6;9%5WI`$2;~~)Bql{}ZiTD&q#P2KA;g@F8p`|K5l0mt8m+`R z3MA_CS?Yt{0eKyl9fu9cqP&@aK4gXlKR$Lpjrc0ZqBTRx@l!myhnM)B3g0Hr!d-a| z4eld&>)qjf<0HmCiuZm*oG=@PXTle@RRr<_4g)eQqznrjZlR)&$GBuDoD;#6@mxq4 zD(9jb!>O8u=qK^EfVXdH~a!E?gz?U%ZzP!gsr)=l}=e zef@o{?i_J?TMhPRC>Xf~3qL~6hEF7m40aCqz`YE}hz>(9#FLQdJ6j4F$m{k8kinAq z*T^bVTs{iUe1Kz+lj2gw0dNj9=Km9|DKo4L$XTv&YovdX?w#QPt7lOfDG81dq`70yPc3p0~YRdxs&k-l>92;1xaB+|b#e)`wk z|C1KyAbt$sj}VTcYi))rggJvYFxMwh>ult02JNphgaHiux1=jkp_*g!oU{EyF?QiN z7DjS!<3u(s8Nqi=_U-Q85AL$5&KWb3g_Mg!2eKmQk-a(SNE2c>(cpXl+~wmqbby^( z-Zck7>>a0vuEn9FL|DmT+&|yhV=X?FLk!E^yC`4@T0^{VgkQcNe))O$@Icb#Xsggv?c9o|2wRihO!;sHfCd^doyx32(pw^*uWb69G=rjSLpfi; zr)+8n2d8d=tAyQ=8}ZD*4??EKMfP=Ik_w63FVtdbq`hcVRYsGd9oT38=kSeL5rx7@ zZ_n*Fq9`zsb+t z?cG~^K2Sb?i=TVid$#y2vjCGJH!%5r(t1n#wD$&DIAg2tf>_GMZ6r*>ni6^vh@&=| zgnkh(-d(8M=G~;T*Q9eJ(%BnMr|n!vmUuW}2HK2^T9M9ADjm>1$=Q+4+g_5zts9l+qL(Z$iZ|d@*gttOt@V7OjMf?Ro}mjN~U=xs*Rzj`Vm#X zi3&|O6xAOXRckn^{zg>&TSk@iWa4OIxH%NVRKzgV#E@-@Ve(4EkPXK$wGqSAEn^7f zo6Jc~RJVkpnue&RnW);fjH)dh)wD)b)3zGb9=L92B|Vw(n%KS?ifx+_*cGtaw=oe; zNP6!_g8W*tVB41Exd|ph?bjgNU)J}^Vswx#{sw>7-uI3!O(dK+-4q}N@G{=D3l zYY+7n?M=D)Yea^VkJ4M13csz%&6`jQx7{)~F%EDI5U_C-*~sVehK=bcv+0J7j;2_o z^X&-7GQCk|)3sP+r4ht(En~r^iiu?au?(14Fs6j6dHxinr4Wu~pb^V}5{pUjHsWc{ zd)!)SYu{#T{(?S=rzFfdIGq2)!V%R<&P(irXA+eteE#!FydMVqFXM15m_Ax9R5A*#e4|<+v3gs z=i!}nR*b{1^>Jv(Yoh-)=t4wd;b3kZ$NiJL+u~&h_o?KL)gCA%cP=Fcoo)UVF)jkQ zu21{dsjl^}kjQdZycS~SGFiiCa4qdfki&HSj}V99@kKs@YiZ_e*1q6h=AcG1_Nw{? zwP9Os+POvSILbBR@>E;aVwla}gBn+E$I%?#oHPEMyMc*}E^2)rG_#m5MVxy9qB>Nt zgISpS4Zu<7M9c{@3DHoR5b1^OYzGK;C_V0TCQ3^&OI!gb)VOo42i5KFIan&EB!AqS z;B>!*AINc_Yump?J=+;Z(){zI6!;n6JpCt9XE{chG`3D4l)+B$k*KGu5YtM;G;}^{ zHs+%*W4dR=U4g80XX{hfo1zN#wJzsAop(&Uaapiv)}&_B7TTtSYo0mlz*;#kuUI(O`J{@=fG@8Zj#IRX4qzv<3gbH9Yu=;&vG+U^3p zmyfVbef!f)Z16%17B7F?d$zS@xnC82jq`{ZTPyUfjI@c z0k}Eg{sS<@hUMKMFgzY}%EHWHXKF*j%wxq7$&n4Yv|q_0(t5g3(;h*>WM3R7nip}l zmZP?&JQh7+gmFs7sl_cd7uiiwedNHl503YEX1 z9cII~z*7D?uGK1!n6l_`Hc(U$-1zD7&cdO9!Goz50LR9>mQSI7@?JhwdMS%OeO(yo z9)|fjx$N=wTZQlSFiZI69e28fc~7!Jmd=BrFbnI40HJ<@hX9{rKFqhP@>=DayAx8z zNanLW9brf1?i^$kP>aDcjxR6-#1DLR_d)u3pAJ!&H6h2XJt^xj-`|h#F3zB(Go@|B zURHVqM!Obv2Mii_KY-uH4K{!G>lb6W#7YbjEfAKYxl6OCmwV3IVV+Sb$ad}^K8SOJ z_)Y>jkyUfw0b6^*I17Xa$g6~1@7TT-cgbx?tZv@jT%4_)FtMZq--F!;sHJwZ_?FU1y_1bIA zXA|04*H34hTgo@5`|?e)T;q?_-6_6&lk5iaP1Xb3LTAhY0_8$_%6@nGf5ATlV5ZHB z&ZRO)TWGQpX+ws}cp5TPrUf!opKYIGgyWe=*3sK}uGC}<3HKOa z*u7@;iOT?MhA+9^=U39F!zXI|+7gJWH=|;tW1iH?g7r*9tST4@Ez!bm>1l=9)*0G=7~al ze+|g^E83&$1Z?;!uQq8lDLZFIeFyxbTco0Xcf65?mO(#C37(Ix{vBFh9+n0Zr7654 zx!&KRlvKod?R%^f^A*%>)b}{%4o^3VMe5^qV6TYuMSM$9&E*2L!MT)+j~MR5tJD3mjxMYHmCs1+Z}f$hhv_~3qYEG&j5z;JpECQ1dGiZG2qMAGdhJwjc zPX*UCWiBOa6Y|3I_}wVS`aJCKAP^BtFgTpE3%llvVEm1iVS)#4eTbo$&F~qx-wCe>Ir9h<>wCt15x96S1k%WA#J=PvU*ZMQ8jWD>I zyVdB`{ro7@q?igd$^Al&8E?l;E~IKwRJmwPimzZwD=E1WRxcxGgXNlOz*rNz`M3{L z?~LIW(w0&_5%_LOMn37or`CO!=o`a#KaP`~v2-RBSR9D9=p2vj(^auZE_ISSgoNjz z!)8}LVeV}=bWwTeL=g>MxO2$v1yb*Jd>%VF7dlU4%<0L(xV#^1wmIi9^V+;^pM@f` z3B~+GpC)=gq1g_a6Cr$ThxN9$+=R}hhGtjzYIVf>Y@Iz{C+wn@q8pscxW1)$zj5bL z2aqwWbJD1K#+5Hw2)h?Zx@oq*EMNju&1?Ek;PKiPxv}M5#axT_? z$bpfli@oA>tgpkp8f^kKpO5HJq)=*^l8(jYb%Ieg&Wjb_M+?nIaflw%0E|1WpgDk= z+tO~Enj1?RIth8;W;BM`wj`7iprAQPd>kjsn}RDPv|PZyXlDJOnH7nn`xw|SGfrnob+_d+$m}&3{Qyr3~z319YgU{up53_R*1o|R zeVm`NK7oGj5BO_kg~dNq6YG=s`wTE{NCY^BNpi{IlD!e1?2h35z6Hb zvz;P}AJPZ*nS&nHgV8TLD?T~4@X1b0#`x)ob28hSK*l4aplPXV7F1?t=t}VPLH$fW z^{q^iFdPdmIH^3}uF_SRi&{`QA9)L*0DJvRqJIGdFvC;KD=yE<5R#SRPss?BkB+s6 zr7Y6Q2Xj2)<*yfetsUk!WM4eD*(ZI&5p76k!nDUh8KiM#=h8;3Qja7iTPj*>0LA*+%I`B z6@>#;ban@Vam<=BoP_4R-Owt0V91USItO7;FjqNoPT15Z=#4cY*1ZT(M{sl)2_Y3$ z5SAy?&2*e9sX#hJi&3o=pMoy77MB;71-}_TwHV(k3()h_vUJ*2`jFaK*&W>0QsUt_ z9QmnDpfl>=>Rr6nCNO4J@mi8jyYd_sYPE@Q<6OHfdlZtF)hHmEDB#omG8=M7jc&Ud z@xSotz5r7ALbqMD{V#mF7nm?~`vNi$rcDU0eIX#s;Rf$0GuEz>*|@tGUNVWHe&@J) zM&jsG9A}+u$H6z;Blj0D$vGKm@LnIY%&3A!MR_xItzux1JH5D;=Kcy2T)WCpN%vd~lwsL(lXyc? zBjlu8D7fzfPuaLgh+*(kzT{AN69BvW;RhX9$g+J?D~)3=AVVG3bHWzaG7ZMKo(ovZ zfHkO3tMZ9m{AwCcv-F_lvNVPUZmc1)kah&Tg_I(gg76q=h;>YVVupDPJ@OGI?3=g` z9a08CST05Y5k%Tm*1gdOQQ*euehd||F!#FvyvaKUX~T6klQ!t64W$icYJ;?qjO!vS z72#kTToRNG5)?XQjQB%SEI&bvDV(4Qh>!AmZ0}AGHgXf26EqP?m}rtPHZ9k5hMHB? zJpiR90o~ov2hjExt6Ic86BW;yfsd%#B|IRDyM$xT4p!&hL4UT5HFQYeKF#X9AUHoe z$y#%Hfd9mr^-h3)-#R!I%-?3W6b=g98?A315xB2u+3u0R{iT-oJsr3cc44wDL!510 z&~in|xT#;cf)dyU?Vy5 z!aX)Co2qQUay;)R9&=S*jU4M?eKlXOGGVr0?JZv{0Wpj#C8BCF?l zbpM>oU4*^XZKaJeSG$W&hCJGF8S-kb zDswsQP1=}=p=PCP?0?WQ_;9gxnXc>&YR-Q6k)iFk6!?YvA_(qtOv~e#-se*$yD-<~ zsK8VW6}$&A%Tm6SOHHi!y)-Y?nv_n;g*qsc6W(7Di8;V8Ib&Bj0=fqxV?upKJ?`@U zO)+FD96&K^Z_Q;)H^3Y6=htaa<2g8SOi9HL%2D#MTi}3sC7FHi^Tf2lH3QdtoK{DM_c;0N87cn16w+l z1pUnoEwg_YxJT^V0YTrh-k$ML;C{)zd~HOIUT}Y5Ju1O;wDm~e4lvaLQ3~d?qO}Eb zeY?t84!5?i21^6U|BtxufRC!m{(lon=t_}}4oFEL8A7iDArJ@z2uY}-Fk~jlKr$0& zCP1k6F7__A71v%-?7ep^D{Dnp*S6O6XBYq9?>+C%dv8iIas7P$?uKOEyXV|o}h0 zAaZ-R3Ev(2fTLDV=np(0(b9c1=o*f{@M=#pKOSieUMl{X`(pTBBm?gs>>Pdza4JH# zi%f<7V=IZQ&J4`}GbNGe&_<=p9nn6_%o?t=IWshkw$g1p_Q#Aa-Lmre2`;jYYW38H z+!)o?s$|=mm26w7WZS}*9*Pkv^X7+M_78pRAA0ixD?twHX8*u^$*K`?mwrhq#mu(s zR!Ry_xPiE1ea4rN3+@773HOsnU4Q;z4a;x$Z?{moe2TaRW`GJqq!N-X=?N_SX zZGZRiw&RcNq1AT9SpvoRgU0^?0Yljp=R1QZ9YZ#r zceL}oVb;Xg1hIgq15^ z{UW@AnJ4n<0CEN0682KG<_QUzp#pGoPuBz6B1>X##rl0f=MKwEk~+w50g>3ooz_@w z&_;DLx_9ktbnXld!BL-yi1V#O@548?$il{W>-Q>n(9Z2P^c(MbbVh=~*PrEeY#EBZ zh-_Hj&Rw#;w?Y-YB3{_lT^@ya?@At@v)|{tBXGZmc|XN@5_=wwb7)U6k5lhnS3PpR z<4+}4xW?-!$&JHt?PC1c&z0SS&mHmeBnIj07;5mjr{4I@_lWXb8-1z$I=+WWy_n_$ z*a-2nS9dY4J%OKg9EksTeIR~r!nIf8uD8eaJ-GIc?K=0GQGXjl;J3K%NK5E2tQ*=~ zv;rKbWlJL$--5if9j;M7a{q-GkYQI2?&Hb+a$BSSP+8J)3G#T|ofYhdc4Ohiw4J|M z%JL0TEKPFzq7yt6C5Aj{7b-%(G>R<{*B0L8XgW~-W~AirO#Wukul~RV7O|j%HTp+b zPe<%ew@@dZax&E^jssol7ZL#`6gZFnA2{iDYS)LyQPg8CEwWC9UYq+vNH4k{vSJ5< zJY?0b16uIlYdd*Q7*APMaIbd+E*&y)RHw}FVo)zwh84u_tl*s$)}8Fwot3<^+PZT< zroI(IOC2v(G>>P=tRv6G3l|lM^1RO>D-Id10wY<$^^lP)#MP^~Ce!L!uBsSg7U;Y? zbgLBVxd_v;vCmgy|k@h1Hq-SCvqR3N}hvkt_sEG7U$JsI7xX``;=En({2T`h7m zar~t_pwNKp!e5~f$=-3)edK}}J zO&>I>b?Xk@+7COZb$5s@jH?}R1k3zpulC)#wrabH#J1_uDl`+64@Pc@&Q9l69W&cy z=HA^_(eNZ_z_*p*yC2lM;}U4#F|b2GLuQPIZXGjlxtQXho!hx3p2d$$0lQ*@+lC53@-TO1ZogJJ`0866cQO-nL|b|_ z^9wH9BH3t{Ik5(5oa(F5_Div*p;%MKrfyh%4j%8Lta3WwTRwRqGz*wB6iuPo_%l?5 zf7%c0lo^_XKiZ*=V@_k9==j{;@`(9_T%-3aaZgYL%9aX2+{%2_A0soe*u7D)i+8o! zP@Qm8N^Y{TBYU~@jl(ROQ5FzOJA9L)5RVL*iwF^CyJ3B^y2cp79$XexO?Tbsy0G`v z%6J~XbBGh_e&>WSO%dFo|>$5QEfWF2Y8*Gi*mmGuVt?%@NE=0nLI zjLhwkwK6sm4+^%r+LS{^EA#9Gf>vY@sM*pB0@oQNrNaU9HQ$YFQ7Q!8vuw+g9_oP0BqB4g-k%}?7z zq?ByuYq$H8MEutx2m78}KC=O}=)ssqee)@LY_0hOpBZAXjo(vV+W>K^k$D)&19j@d z2!6Ov=w|Ry^v~hNj7^-F*Z4c+1Jj0vdqY~p&7*MO5yLJ_L17|mGuTvW9a@aBX!YU{ z&qw&kgQ9HBF2H#HXHGUEV-s1I(?z{FN5E-*YG_PAKpb9 zBVIMCs0k>hxngx_j5v_+UZzII-zc5-B!9?=wr7V3*l>#=| zF%0=?R52;8-oXX+n7Z2P>}6#1k=JBr7{x}${Mgr|Dk7~TyF_Fi+2z`CWY=7#xk60J zmfA-Ao}s=*OZnEZkZbM$#|ch#U7greUcX0Z9LCs!YAA@lWs8s>|F$32FEf+@vFZrH zpxZj)!L3jY{xQ?Rx09xWg+_Kr(n01Uc#6V6xY98b0p_QvGLZfim9Kl4Tg*;HR zgubAgq+TOif0!@lmK(`T2B1Gn2aT{ zp*Za_gHmyYvO8}1&B_jQP7Px#-rfz$ao&N`b&8{E%_@~ zOtuQ^B($~fCZ0*?%{0>k&GVKZ73cf8yGYhrNnq|l=9Sp@@~QLVwrTa(U~Lo3@*tp! zwRpRPOvt!e(YeE_cR$9uF?#OEj3<2r3mV zI}9tZ&()Gg`iVaol9mxhU^{RdJTveiRH01@X~Ildh2SK#Ds8NHyvze4JgVtMqa8P+ ztb2NAJ%#!d-<+h5*s5<%x(7MSOV54%5O}PfG4#R3EPJM`C}K`n^7X zILBQZsR)H@0;_Y}i~Zq9AQU`oq$iL6%W)Uf*F@{X{=Y z{rEe79R2%%{>SbchzO)wK(SF zsc&9+^83f$a`Lh@AD%pZ-X|x|IdSMIc~Q?Pxuhl{Vk&y08bU-D*Y z&LuC8TYAaqW22Y6HSwuSviJOa$+B-+U3$>unoIM$jlArHXSeRC>~!{yE|=c1W6`7D z%fHUP_VWMh_}t~aX1{v*!9V_Zd54DzuQ=)USFd>T_3SH07LB~}z`HZA8b0%ps~&&j zw5x}=*nf4Gwy*zfz=|ub*^tY;TRwX7t=rCBu=MuG3#)IRGVZk7-4_+#aeTX*?_BlwU+-M{T8mvb?V7#o>B*(L zcKo(%*QPh`*wwB0@m=qBer?yl%Rk$7U!OmAHT*H{u1oL}xOnMZ#<$z=`nm9_yM}(h z{q8Q_C+?nCJ#6>fyTilM2mR}TVIQCQU|y%UAH4g9We<(rvgM&Iv!^_K-KO$~yDlqv z?~IpU-@KYrAJ>2Zubny65<3?+cy%Y;oar&lWX&_iVqGsm=8GT;*BQyV{J-z)eJ@?`Emx>$uymImARj-`pe&7}3y*7I~ zzni<~rn@Ka>9Bk9p7&NoU#^_xdeJ^s!0m$uuRe^sBocRWzAx8={*?A`p%eS5Fo^Wfem z9~$+~Wdkn#=iDm?zx7Jh;IZ|h6n+5LF?cTd=n^X{YLeD7ZP!$I%8 z`ri}YE4Zrt`v=~=?fu_BIPv}0whY_%;UCree%pA{zIXk5_O+em`k>*4%nz=+q3s7x ze1F#m#|{|tVVh-z|N8WlhyK;|v;iLlHl6ZO!KvSU^z!E4Kbl&Q`|-eAw|u<)-G6@k z&ky>4QZc^nlkN|E@yY%t`hWV*v1>j(>awFg?OS@;r@fXR_Ss>lKla&}v$ub~w$+=T zZ@seT7e^d=!dF*J`}!BrQe_eLKg_nV(59rW#xE|b1}D0tVmLq`1T+Z&3%{MP?|hwpq>jrnfO?Nh#6|I7>DUHtrO z-_1Mu?eE$y`slw;KlaG?6K)^&!*cw*XcYeN$e|@a{CwcXAI=+p_7DHMV#kl4oO$<; z?~nQB#~)v~{ik0#{`gaM8~@LF3nD+i@SjeGnd#ls8?aKZ&uYI3;OWKbf z|6u#yzx=HIg8HrOgrv07+cW-_Fz~iSDbgnoc-1*fXTXp$*M7u86xH@)icUz~fcaE#+ z`j5?*blu*0ch{eW&Fywq@AJD&Iq{-y9Xnsv?U$FX?RMI=XC3s^(%s#czV>wYLx(-r zeaYRgcOTGpP>+3`pX#xqVt3DW-`?BvvG4cx{Qkz@dbTURxYrLo@96cw^I!Mg_xDwO zj%efS)AjZ>eQx~nsy_Ga?$h_piP!a={NO`<3u-#_tLV_P-?PV^-EU$0YY%?!_PY-` ze#ZiLhx1ptt9th6zr1{G|C}$j^uPM+%li+_f3N>3`1!H-*Ztp~_DBD<51%+-^>c3y zxIF8oL;rj6-a`+1^|M14zQ1Om_mOW0em%M0paVWVXV6bKcO3liDTfR`;DH%~-|Dk> zu>0G>A>F>cFDtV2sjS0qo14Asx*M}I+dh@O_Jdcl*S+^<_K8Qe96GgO@zB5ZKXvHK z2j4&RrE9(#_WKJj=VW|%PwwQ4_vN^xF7t?Oq>0X6C-}`O$xmzxuA9#y|5$uL&RAaLI(+UvHdn*15M% zC|q>P#E;J0HE~GylPC3AaOtG`e%Lno^65`be(#&nht)i*Se-c06L{H2fTJ+R-x$d;WXo`p0?|j_MsKyeHUDc-iyU7IwSixx&s@O`ql8 zTQ_U{HJ{JA`;GRqbASG7cJWhR&z=^(r)ce6r_Fi$w=d>AJ326TU6zW&sbiOa_? z{V;sl(v9_ZE$uhw{-xLN>$_~-1rwJQw^_dIlALpwZ5(^SvI9nqTYkZshUGK9`P<>o zkKcLt&#mt~{FVovJACBNFCSjCylBOD7lc+!{c6RLOMk66GVi9XIu3GrUJa3Cl7kk&ex5NAIf86fvyYO}Ihi|^`opas`t9QMY zS+VESmA?Bv3HoxrztPw2tvh{Lbv^yB{kqdXtj9%Fx#68vi!1K0?tI_AzynLVtjXIm zdd)dYi`O1D{NAH8lrR*B-t1AGN3abZhXAj8}tCPWeYL z+V7*_n|oS>4*Q@C=aHWco$t=AoAt~5x*w)oRrgHJoplp#`FCCYnBGVI_uGb}uD|%3 zqfX175Pojoz2TvU_lUd@ydrXSQS0dPtl`mN6E;NijyXB{=!GXo&%5-%`kxP-UEku_ zh3mfGa^1RjMt5I-s(1DJ{(DxhKli&98>*}OZ+Pw2u^WEtH-5t*qnB(regCozue^HB zhC3#_xMAXb2Q`GJ4R2U5?(Bv|-kgn>J+*k_zFV%}*zv%ZH*S6M$4%AQxtp(=IeN2y z_MFYPbz8al{@1VA{Kw6YZtm5l#g=P(uiA2Gq+v_h;TLb2KJ)o4`Mz&>nFo5 z+IsWo>$g69a<^?4Rj=K)x5zNA&oYeL@YK?OCgJM_@Bl~{=biF#taK3e^FG~f7)Rn8 zny{l>S!1*tij$0#__#0uVB-=FE;0|7;6|G&%ket`38UQnTF0Wns&b) zhsR=D7{XPh6XY=Pi2S`WKbx?P0$DsFnJkZ5Xei zL9rO6ao2Ltgz?J@4C8BDFU8ntrx*sl$IAFJU>Mipr}%vE06V##U5?j7w#BP-P_!)W zX&6^tg<}-m48wbwVO*Dw*XYbKj2H3u>!9Hug@*A@;O+sKb?b2y0*%FQfpaSwjrZX9 zFF1$(8Tj-M^x@v`jISR6%ml1w&kDo1;RM{9k8wV%KWG?hf%`JhxaJV-wG1?j1=-*= zaI8EPv{x8L5IE+7&(CfK|AGITK8E4Pp4>%U@VcH>=(J<5^Qr)Y^A|(0?(ac&A!Kvm znK)818AnI3#&+$%H^}B`j63HP!#Mp!^znM2AF>dAJ*?$s@c3-ZQJx9DU@eEEL0W%2 zco{|SbP#9&UC(Ys!MqKPOwd{j-S{4`BNk!16Y|;ve3b*h+nI(j9rs@JtLvY3-^GZA(axnObwQji_Yq<>k zy#n(r0NfIcITyPM7a7J)=Rl31Pj5k1A3?r9w!k|(azP{TufTfNuY)c^_r5+FGVmJ4 zcZVCsnHON){UB5DVCs>EvC)OO0RJdt`?~>twgo@1j!&24QSu9c6XV`L3iAQ>YtT0j ze@~o;bxeQ`f+wd#CO;PgH`e}cfsC%f-#>T4{AjdpKglpo^FcQ;--(cU4(2%nbNnL&TWP@lSHLj# zg5SNtr@`PwN67oE8Tg9ORggW#{5%}Gb{b@L0&Eq(uK?bkAg86^VHkh!nh##|!coLy zp>the3!r5$aI6^*eZjabxOYF+{YoC}7<|HWiN@wj@rXk{dOVOpAK2^ty)h0t(zd-} zRD-sYA-`9_w`(!?r{F>M2JmE(VJyMtGfNEP?PD+}^z>oTT#kdCO(>=$- z9;(4_=*01t8Ac$8vH0l(*$vx-<5c}|A2`C$m4BaypH_yk=_1%xnPGf*zF|Ck2EHb- z9QF!6j0f)uz^k&Y(5WK~qDJ`Qw)|64K7Te!YB1RYoly9Y1Mm;LdmWC2LHBN01>J@m9?k(h zpnoamugB*vz|X@lUn%5W2b_Uv@Ud9`5m$lNu!Z|U(}uRt!MT_lYaO!DFzy`(Jq3RT zfVP#G;~wz31hOB~8+HR3j>tl+n2PnTgr5fO=R?L9PR0+`|LQXEZwTf(880-z^(zm+ zXV8#yC{9ZH4dbZ=hT+5fHIUC4u<56}0ncjC54sj&ty5s^-H-j(`qrfjwnFcX~jNFNY3*zvIB08%v>Uha1N8gAi|4fd9~o7eV7)3n9OA z4dZ3Zx$9K;81On5yxnjtz83I8*dX{eJOY{FXPFmkn}B%P(l9RQ2020J4<82K+ZA+T zeMdouZro@X#{vIt@U{)^{cQtyik~~d(@~=k4?)i-r@?0C!2Uqz7B}X_`j0pVcrbo7 z=JBk9?O=`lz=N+YHjHD>z#0J89ZYmx2_FoYpT-%+=eYg`_;!sp2!21^2XZTbUIWh)$AQ1#%Mj3a6l8EZ<~tAkzGOObkR#wv*XXcmUdh;KBF6^#SJC1>Qdm{J?4Ks9A>b9Oi5b*>~9re*zj8;P1PaLT4c3_26x<5unKh8A9IsE`iQ^F#j^> zNg>wK8a^B2w#M>_yt!*&wLgZ`U%gm|p={pcJkHH*}dCfvx!{;Yq;~Pf; zKlpJOt`|c0IzR^VVKbY@VGL+l33?ws9l8d7e31)&9f3JuOIfGFSAdpf_!*C%IhfOp zF?;*NzPBN_+=Lhbp56=m{7UOXz~f2a&qna&28>;C7W5wXc8R4p{5fcKCZf^b54^ z0FNrb|6NhQ-vhhL#|hhzF&{rsqsR#2S*57qHEQrbzu|+DV7h#x0{`>lR>Ua4z#xW% z@w>)YsX*2#fB=Ti#$Q4FCNPLHrsU&;4?xvM02h6D8>CnLMchm9R}^=O@jGa&#Sx(m z`0Q6S1k^NN07X_j3L&-3s5k2HzYr)Pkk6=a!STfpUVzoD!R-nRnup(9f*0RG>Nifn z@EjRFQ_)+Ci(J`EVC3q;aR7YzB_ci7Gap0O<1K8&7gf}I)o-%qO$>9(u+)>|jX9b( zWxx^!4)Q#J?PM;+;#X=E9-tU4^CUx&8jzL_sdF9VdzDdwxx@G&1IWs-f$yjwE6FBu zWIAs8aG=qThq>$VFBd%9zw_-S0nK(S61Vo+kI{@|p0CLp;6nq_qP)I_O9eY6w zcsy&cUB!GhVU?>jP)(h3z6ano;z}^gZ{%YgR6SW=05gjK$&R`3ZiB7)oXghwTd&X@ zhoLsy&Y>1_8z9<{;?_d|fDY+}6M&}FU@p51e+5BI3pi#Q|794b3ct-G0L;(R zoWsj783&UWMG9XCvaM4}PJne7?y-nigdtvoHcS)s!eD5<&V^nH5Zgit;LdyB0M-36@4bPmR+HB|q)z zSz|* z4Iw=wJ|H>LNy|KC#a?CEj0q%~VrB4HjGr(RR}3P(DK=vYI3v3%EWjrsvSMl(vIE*0 zulo#q)sRu_1SwIs{SY`s&kzt&#+n`ty^vSM>8}6^9Z`55Mr67#Iy5+30L1Ap&8Pwc z>7E#08nc&U0UoEnsll5vhR1-+6f{?_BN<&%{OZdfDLO4KgE>P~NsgbUbX3U%V+J#| zb+{Q1oZRcJ2O#ppFmTi>9iTQ8C{_g_1Lh8Xq)YYSN)66+hvEO|JIK;g0Sf=_1Z8xO zmnP(3)T<|etRhF^x^9vMz+*Yw8^*UpVzVvjXLV<4hCL8C*L81)Om zL+WxvN^)jkut~j6QW_&=6NV2K>QfEZWZa3NIWkndR6az=yqZEymN(*c{Km9IfJ8Ay zl$DCFlx)Wm;v}>@lFUl8b|%loTFC)m%0tMM2u}Avk4V57P$JgrtMNlkxDg5amn#=4x0ygdi(AK)QH)d70<|NSU_z-QCbcaU!=gQ8-S| zSAhl457GzLV>yd4Z2;3-$#BHTLa)SB2+fapRP^g~qFmhh7;c(M;_!IJy@J8+RAg#@ z`U?gPOf|^P61-AC>!M6e94zyOq?+R#{y%4br;2oeC-!uv<1+W8mK!4O>cd`)s{PQul{c|xu z2H5A*3Bgj3Sc7U>0`g`I>un##becsFMNn<*#BI}siP|uar5XD0JF41FQqR^Je_*J? z(90CFMPYQtFHy(F1FSkqt`vMZGZMvXf$&>_l2>IPGl8W6(8P?h{jxD2=( zutbKZa`ksKw%{*-2&@!Gk}OC@l=9jO={tHWHz^==R-9)&I8+10Wfsnvrz;g&tL{Dw z0LWSZC=?QsZUQ^75BBafZ~zR@DYPH6F;t5n=%TbpDUQPc21&`BPB5wl8K4Wg0ER;5 zR{bzX-C{F`YubU^;E-;R+6_uDC3ZS*1ITDb{{RS}H=clBYukEjUtaAKF6n;&j8V64y$!Uq)~X^ReH+S;^3qR#^N|edI-7$L3ttt z@xbI5x#I(!VH0%~yqFK(Gz1pt0>%n=*+2}fj$c|l;v#Uy@?yG1Sq)%FsVQLXcj(a* z4e?AMfoTwlbj<8ZtO-uk&RZ

    '; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testListItems() - { - $input = "[list][*]Foo*bar (item 1)\n[*]Item 2\n[*]Trimmed (Item 3)\n[/list]"; - $expected = "
    • Foo*bar (item 1)
    • Item 2
    • Trimmed (Item 3)
    "; - $this->assertEquals($expected, $this->_markup->render($input)); - - $this->assertEquals('
    • blaat
    ', $this->_markup->render('[list][*]blaat[/*][/list]')); - } - - public function testListDisallowingPlaintext() - { - $input = "[list]\ntest[*]Foo[/*]\n[/list]"; - $expected = "
    • Foo
    "; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testFailureAfterCodeTag() - { - $input = "[code][b][/code][list][*]Foo[/*][/list]"; - $expected = "\n[b]\n
    • Foo
    "; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testInvalidationAfterInvalidTag() - { - $input = "[b][list][*]Foo[/*][/list][/b]"; - $expected = "[list][*]Foo[/*][/list]"; - $this->assertEquals($expected, $this->_markup->render($input)); - } - - public function testListTypes() - { - $types = array( - '01' => 'decimal-leading-zero', - '1' => 'decimal', - 'i' => 'lower-roman', - 'I' => 'upper-roman', - 'a' => 'lower-alpha', - 'A' => 'upper-alpha', - 'alpha' => 'lower-greek' - ); - - foreach ($types as $type => $style) { - $input = "[list={$type}][*]Foobar\n[*]Zend\n[/list]"; - $expected = "
    1. Foobar
    2. Zend
    "; - $this->assertEquals($expected, $this->_markup->render($input)); - } - } - - public function testHtmlTags() - { - $m = $this->_markup; - - $this->assertEquals('foo', $m->render('[b]foo[/b]')); - $this->assertEquals('foo', - $m->render('[u]foo[/u]')); - $this->assertEquals('foo', $m->render('[i]foo[/i]')); - $this->assertEquals('foo', $m->render('[cite]foo[/cite]')); - $this->assertEquals('foo', $m->render('[del]foo[/del]')); - $this->assertEquals('foo', $m->render('[ins]foo[/ins]')); - $this->assertEquals('foo', $m->render('[sub]foo[/sub]')); - $this->assertEquals('foo', $m->render('[span]foo[/span]')); - $this->assertEquals('foo', $m->render('[acronym]foo[/acronym]')); - $this->assertEquals('

    F

    ', $m->render('[h1]F[/h1]')); - $this->assertEquals('

    R

    ', $m->render('[h2]R[/h2]')); - $this->assertEquals('

    E

    ', $m->render('[h3]E[/h3]')); - $this->assertEquals('

    E

    ', $m->render('[h4]E[/h4]')); - $this->assertEquals('
    A
    ', $m->render('[h5]A[/h5]')); - $this->assertEquals('
    Q
    ', $m->render('[h6]Q[/h6]')); - $this->assertEquals('foo', $m->render('[color=red]foo[/color]')); - $this->assertEquals('foo', $m->render('[color=#00FF00]foo[/color]')); - - $expected = '' . "\n" - . '<?php
    ' - . "exit;\n
    \n
    "; - - $this->assertEquals($expected, $m->render("[code]assertEquals('

    I

    ', $m->render('[p]I[/p]')); - $this->assertEquals('N', - $m->render('[ignore]N[/ignore]')); - $this->assertEquals('
    M
    ', $m->render('[quote]M[/quote]')); - - $this->assertEquals('
    foo
    bar[/hr]', $m->render('[hr]foo[hr]bar[/hr]')); - } - - public function testWrongNesting() - { - $this->assertEquals('foobar', - $this->_markup->render('[b]foo[i]bar[/b][/i]')); - $this->assertEquals('foobarkokx', - $this->_markup->render('[b]foo[i]bar[/b]kokx[/i]')); - } - - public function testHtmlAliases() - { - $m = $this->_markup; - - $this->assertEquals($m->render('[b]F[/b]'), $m->render('[bold]F[/bold]')); - $this->assertEquals($m->render('[bold]R[/bold]'), $m->render('[strong]R[/strong]')); - $this->assertEquals($m->render('[i]E[/i]'), $m->render('[i]E[/i]')); - $this->assertEquals($m->render('[i]E[/i]'), $m->render('[italic]E[/italic]')); - $this->assertEquals($m->render('[i]A[/i]'), $m->render('[emphasized]A[/emphasized]')); - $this->assertEquals($m->render('[i]Q[/i]'), $m->render('[em]Q[/em]')); - $this->assertEquals($m->render('[u]I[/u]'), $m->render('[underline]I[/underline]')); - $this->assertEquals($m->render('[cite]N[/cite]'), $m->render('[citation]N[/citation]')); - $this->assertEquals($m->render('[del]G[/del]'), $m->render('[deleted]G[/deleted]')); - $this->assertEquals($m->render('[ins]M[/ins]'), $m->render('[insert]M[/insert]')); - $this->assertEquals($m->render('[s]E[/s]'),$m->render('[strike]E[/strike]')); - $this->assertEquals($m->render('[sub]-[/sub]'), $m->render('[subscript]-[/subscript]')); - $this->assertEquals($m->render('[sup]D[/sup]'), $m->render('[superscript]D[/superscript]')); - $this->assertEquals($m->render('[url]google.com[/url]'), $m->render('[a]google.com[/a]')); - $this->assertEquals($m->render('[img]http://google.com/favicon.ico[/img]'), - $m->render('[image]http://google.com/favicon.ico[/image]')); - } - - public function testEmptyTagName() - { - $this->assertEquals('[]', $this->_markup->render('[]')); - } - - public function testStyleAlignCombination() - { - $m = $this->_markup; - $this->assertEquals('

    Foobar

    ', - $m->render('[h1 style="color: green" align=left]Foobar[/h1]')); - $this->assertEquals('

    Foobar

    ', - $m->render('[h1 style="color: green;" align=center]Foobar[/h1]')); - } - - public function testXssInAttributeValues() - { - $m = $this->_markup; - $this->assertEquals('foobar', - $m->render('[b class=\'">xss\']foobar[/b]')); - } - - public function testWrongNestedLists() - { - $m = $this->_markup; - // thanks to PadraicB for finding this - $input = <<render($input); - } - - public function testAttributeWithoutValue() - { - $m = $this->_markup; - - $this->assertEquals('foobar', $m->render('[b=]foobar[/b]')); - } - - public function testRemoveTag() - { - $this->_markup->removeMarkup('b'); - - $this->assertEquals('[b]bar[/b]', $this->_markup->render('[b]bar[/b]')); - } - - public function testClearTags() - { - $this->_markup->clearMarkups(); - - $this->assertEquals('[i]foo[/i]', $this->_markup->render('[i]foo[/i]')); - } - - public function testAddFilters() - { - $m = $this->_markup; - - $m->addDefaultFilter(new Zend_Filter_StringToUpper()); - - $this->assertEquals('HELLO', $m->render('[b]hello[/b]')); - } - - public function testProvideFilterChainToTag() - { - $m = $this->_markup; - - $filter = new Zend_Filter_HtmlEntities(); - - $this->_markup->addMarkup('suppp', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array('start' => '', 'end' => '', 'group' => 'inline', 'filter' => $filter)); - $this->assertEquals("filter
    \nfilter\n&\nfilter", - $m->render("filter\n[suppp]filter\n&\nfilter[/suppp]")); - } - - public function testSetFilterForExistingMarkup() - { - $m = $this->_markup; - - $filter = new Zend_Filter_StringToUpper(); - - $m->setFilter($filter, 'strong'); - - $this->assertEquals('FOO&BARbaz', $m->render('[b]foo&bar[/b]baz')); - } - - public function testAddFilterForExistingMarkup() - { - $m = $this->_markup; - - $filter = new Zend_Filter_StringToUpper(); - - $m->addFilter($filter, 'i', Zend_Filter::CHAIN_PREPEND); - - $this->assertEquals('FOO&BARbaz', $m->render('[i]foo&bar[/i]baz')); - } - - public function testValidUri() - { - $this->assertTrue(Zend_Markup_Renderer_Html::isValidUri("http://www.example.com")); - $this->assertTrue(!Zend_Markup_Renderer_Html::isValidUri("www.example.com")); - $this->assertTrue(!Zend_Markup_Renderer_Html::isValidUri("http:///test")); - $this->assertTrue(Zend_Markup_Renderer_Html::isValidUri("https://www.example.com")); - $this->assertTrue(Zend_Markup_Renderer_Html::isValidUri("magnet:?xt=urn:bitprint:XZBS763P4HBFYVEMU5OXQ44XK32OMLIN.HGX3CO3BVF5AG2G34MVO3OHQLRSUF4VJXQNLQ7A &xt=urn:ed2khash:aa52fb210465bddd679d6853b491ccce&")); - $this->assertTrue(!Zend_Markup_Renderer_Html::isValidUri("javascript:alert(1)")); - } - - public function testXssInImgAndUrl() - { - $this->assertEquals('...', - $this->_markup->render('[url=\'http://google.com/"\']...[/url]')); - $this->assertEquals('/script&gt;', - $this->_markup->render('[img]http://google.com/"[/img]')); - } - - public function testAddGroup() - { - $m = $this->_markup; - - $m->addGroup('table', array('block')); - $m->addGroup('table-row', array('table')); - $m->addGroup('table-cell', array('table-row'), array('inline', 'inline-empty')); - - $m->addMarkup( - 'table', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array( - 'tag' => 'table', - 'group' => 'table' - ) - ); - $m->addMarkup( - 'tr', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array( - 'tag' => 'tr', - 'group' => 'table-row' - ) - ); - $m->addMarkup( - 'td', - Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE, - array( - 'tag' => 'td', - 'group' => 'table-cell' - ) - ); - - $this->assertEquals('
    test
    ', - $m->render('[table][tr][td]test[/td][/tr][/table]')); - } - - /** - * Test for ZF-9220 - */ - public function testUrlMatchCorrectly() - { - $m = $this->_markup; - - $this->assertEquals('testtest', - $m->render('[url="http://framework.zend.com/"]test[/url][url="http://framework.zend.com/"]test[/url]')); - } - - /** - * Test for ZF-9463 - */ - public function testNoXssInH() - { - $m = $this->_markup; - $this->assertEquals('

    <script>alert("hi");</script>

    ', - $m->render('[h1][/h1]')); - } -} - -// Call Zend_Markup_BbcodeAndHtmlTest::main() -// if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Markup_BbcodeAndHtmlTest::main") { - Zend_Markup_BbcodeAndHtmlTest::main(); -} diff --git a/tests/Zend/Markup/FactoryTest.php b/tests/Zend/Markup/FactoryTest.php deleted file mode 100644 index 269d1c0f03..0000000000 --- a/tests/Zend/Markup/FactoryTest.php +++ /dev/null @@ -1,53 +0,0 @@ -getParser(); - - $value = '[b][s][i]foobar[/i][/s][/b]'; - $output = ''; - - $tree = $parser->parse($value); - - // iterate trough the tree and check if we can generate the original value - $iterator = new RecursiveIteratorIterator($tree, RecursiveIteratorIterator::SELF_FIRST); - - foreach ($iterator as $token) { - $output .= $token->getTag(); - - if ($token->getStopper() != '') { - $token->addChild(new Zend_Markup_Token( - $token->getStopper(), - Zend_Markup_Token::TYPE_NONE, - '', array(), $token) - ); - } - } - - $this->assertEquals($value, $output); - } - -} - -// Call Zend_Markup_BbcodeTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Markup_ParserIntegrityTest::main") { - Zend_Markup_BbcodeTest::main(); -} diff --git a/tests/Zend/Markup/Test/Parser/MockParser.php b/tests/Zend/Markup/Test/Parser/MockParser.php deleted file mode 100644 index 69e766d3d6..0000000000 --- a/tests/Zend/Markup/Test/Parser/MockParser.php +++ /dev/null @@ -1,88 +0,0 @@ -addChild($current); - - $token = new Zend_Markup_Token( - $value, - Zend_Markup_Token::TYPE_NONE, - '', - array(), - $current - ); - $current->addChild($token); - - return $tree; - } -} diff --git a/tests/Zend/Markup/Test/Renderer/Html/Bar.php b/tests/Zend/Markup/Test/Renderer/Html/Bar.php deleted file mode 100644 index 14b67c30ff..0000000000 --- a/tests/Zend/Markup/Test/Renderer/Html/Bar.php +++ /dev/null @@ -1,59 +0,0 @@ -getAttribute('bar'); - - if (!empty($bar)) { - $bar = '=' . $bar; - } - - return "[foo{$bar}]" . $text . '[/foo]'; - } - -} diff --git a/tests/Zend/Markup/Test/Renderer/MockRenderer.php b/tests/Zend/Markup/Test/Renderer/MockRenderer.php deleted file mode 100644 index 6a6d50b37b..0000000000 --- a/tests/Zend/Markup/Test/Renderer/MockRenderer.php +++ /dev/null @@ -1,54 +0,0 @@ -_defaultFilter = new Zend_Filter(); - } -} From a7af19e6e530950b376235f468d5879e1165e579 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:27:16 -0500 Subject: [PATCH 23/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Mobile Tests --- demos/Zend/Mobile/Push/ApnsFeedback.php | 21 -- demos/Zend/Mobile/Push/ApnsServer.php | 34 --- demos/Zend/Mobile/Push/GcmServer.php | 33 --- demos/Zend/Mobile/Push/MpnsServer.php | 39 --- tests/Zend/Mobile/AllTests.php | 57 ----- tests/Zend/Mobile/Push/AbstractTest.php | 74 ------ tests/Zend/Mobile/Push/AllTests.php | 66 ----- tests/Zend/Mobile/Push/ApnsTest.php | 228 ----------------- tests/Zend/Mobile/Push/GcmTest.php | 241 ------------------ .../Zend/Mobile/Push/Message/AbstractTest.php | 105 -------- tests/Zend/Mobile/Push/Message/AllTests.php | 63 ----- tests/Zend/Mobile/Push/Message/ApnsTest.php | 218 ---------------- tests/Zend/Mobile/Push/Message/GcmTest.php | 155 ----------- .../Mobile/Push/Message/Mpns/AllTests.php | 60 ----- .../Zend/Mobile/Push/Message/Mpns/RawTest.php | 139 ---------- .../Mobile/Push/Message/Mpns/TileTest.php | 234 ----------------- .../Mobile/Push/Message/Mpns/ToastTest.php | 161 ------------ tests/Zend/Mobile/Push/MpnsTest.php | 184 ------------- tests/Zend/Mobile/Push/Response/AllTests.php | 58 ----- tests/Zend/Mobile/Push/Response/GcmTest.php | 109 -------- tests/Zend/Mobile/Push/certificate.pem | 0 21 files changed, 2279 deletions(-) delete mode 100644 demos/Zend/Mobile/Push/ApnsFeedback.php delete mode 100644 demos/Zend/Mobile/Push/ApnsServer.php delete mode 100644 demos/Zend/Mobile/Push/GcmServer.php delete mode 100644 demos/Zend/Mobile/Push/MpnsServer.php delete mode 100644 tests/Zend/Mobile/AllTests.php delete mode 100644 tests/Zend/Mobile/Push/AbstractTest.php delete mode 100644 tests/Zend/Mobile/Push/AllTests.php delete mode 100644 tests/Zend/Mobile/Push/ApnsTest.php delete mode 100644 tests/Zend/Mobile/Push/GcmTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/AbstractTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/AllTests.php delete mode 100644 tests/Zend/Mobile/Push/Message/ApnsTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/GcmTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/Mpns/AllTests.php delete mode 100644 tests/Zend/Mobile/Push/Message/Mpns/RawTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/Mpns/TileTest.php delete mode 100644 tests/Zend/Mobile/Push/Message/Mpns/ToastTest.php delete mode 100644 tests/Zend/Mobile/Push/MpnsTest.php delete mode 100644 tests/Zend/Mobile/Push/Response/AllTests.php delete mode 100644 tests/Zend/Mobile/Push/Response/GcmTest.php delete mode 100644 tests/Zend/Mobile/Push/certificate.pem diff --git a/demos/Zend/Mobile/Push/ApnsFeedback.php b/demos/Zend/Mobile/Push/ApnsFeedback.php deleted file mode 100644 index e2b5489eb0..0000000000 --- a/demos/Zend/Mobile/Push/ApnsFeedback.php +++ /dev/null @@ -1,21 +0,0 @@ -setCertificate('/path/to/provisioning-certificate.pem'); - -try { - $apns->connect(Zend_Mobile_Push_Apns::SERVER_FEEDBACK_SANDBOX_URI); -} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) { - // you can either attempt to reconnect here or try again later - exit(1); -} catch (Zend_Mobile_Push_Exception $e) { - echo 'APNS Connection Error:' . $e->getMessage(); - exit(1); -} - -$tokens = $apns->feedback(); -while(list($token, $time) = each($tokens)) { - echo $time . "\t" . $token . PHP_EOL; -} -$apns->close(); diff --git a/demos/Zend/Mobile/Push/ApnsServer.php b/demos/Zend/Mobile/Push/ApnsServer.php deleted file mode 100644 index 9e7477166f..0000000000 --- a/demos/Zend/Mobile/Push/ApnsServer.php +++ /dev/null @@ -1,34 +0,0 @@ -setAlert('Zend Mobile Push Example'); -$message->setBadge(1); -$message->setSound('default'); -$message->setId(time()); -$message->setToken('ABCDEF0123456789'); - -$apns = new Zend_Mobile_Push_Apns(); -$apns->setCertificate('/path/to/provisioning-certificate.pem'); - -try { - $apns->connect(Zend_Mobile_Push_Apns::SERVER_SANDBOX_URI); -} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) { - // you can either attempt to reconnect here or try again later - exit(1); -} catch (Zend_Mobile_Push_Exception $e) { - echo 'APNS Connection Error:' . $e->getMessage(); - exit(1); -} - -try { - $apns->send($message); -} catch (Zend_Mobile_Push_Exception_InvalidToken $e) { - // you would likely want to remove the token from being sent to again - echo $e->getMessage(); -} catch (Zend_Mobile_Push_Exception $e) { - // all other exceptions only require action to be sent - echo $e->getMessage(); -} -$apns->close(); diff --git a/demos/Zend/Mobile/Push/GcmServer.php b/demos/Zend/Mobile/Push/GcmServer.php deleted file mode 100644 index 22794324b7..0000000000 --- a/demos/Zend/Mobile/Push/GcmServer.php +++ /dev/null @@ -1,33 +0,0 @@ -addToken('ABCDEF0123456789'); -$message->setData(array( - 'foo' => 'bar', - 'bar' => 'foo', -)); - -$gcm = new Zend_Mobile_Push_Gcm(); -$gcm->setApiKey('YOUR_API_KEY'); - -try { - $response = $gcm->send($message); -} catch (Zend_Mobile_Push_Exception $e) { - // exceptions require action or implementation of exponential backoff. - die($e->getMessage()); -} - -// handle all errors and registration_id's -foreach ($response->getResults() as $k => $v) { - if (isset($v['registration_id'])) { - printf("%s has a new registration id of: %s\r\n", $k, $v['registration_id']); - } - if (isset($v['error'])) { - printf("%s had an error of: %s\r\n", $k, $v['error']); - } - if (isset($v['message_id'])) { - printf("%s was successfully sent the message, message id is: %s", $k, $v['message_id']); - } -} diff --git a/demos/Zend/Mobile/Push/MpnsServer.php b/demos/Zend/Mobile/Push/MpnsServer.php deleted file mode 100644 index a076068fde..0000000000 --- a/demos/Zend/Mobile/Push/MpnsServer.php +++ /dev/null @@ -1,39 +0,0 @@ -setToken('http://sn1.notify.live.net/throttledthirdparty/01.00/THETOKEN'); -$message->setMessage(''); -$messages[] = $message; - -// toast message -$message = new Zend_Mobile_Push_Message_Mpns_Toast(); -$message->setToken('http://sn1.notify.live.net/throttledthirdparty/01.00/THETOKEN'); -$message->setTitle('Foo'); -$message->setMessage('Bar'); -$messages[] = $message; - -// tile message -$message = new Zend_Mobile_Push_Mpns_Tile(); -$message->setToken('http://sn1.notify.live.net/throttledthirdparty/01.00/THETOKEN'); -$message->setBackgroundImage('foo.bar'); -$message->setCount(1); -$message->setTitle('Bar Foo'); -$messages[] = $message; - -foreach ($messages as $m) { - try { - $mpns->send($m); - } catch (Zend_Mobile_Push_Exception_InvalidToken $e) { - echo 'Remove token: ' . $m->getToken() . PHP_EOL; - } catch (Zend_Mobile_Push_Exception $e) { - echo 'Error occurred, token: ' . $m->getToken() . ' - ' . $e->getMessage() . PHP_EOL; - } -} diff --git a/tests/Zend/Mobile/AllTests.php b/tests/Zend/Mobile/AllTests.php deleted file mode 100644 index fb769e0703..0000000000 --- a/tests/Zend/Mobile/AllTests.php +++ /dev/null @@ -1,57 +0,0 @@ -addTest(Zend_Mobile_Push_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Mobile_AllTests::main') { - Zend_Mobile_AllTests::main(); -} diff --git a/tests/Zend/Mobile/Push/AbstractTest.php b/tests/Zend/Mobile/Push/AbstractTest.php deleted file mode 100644 index 4aafd945fa..0000000000 --- a/tests/Zend/Mobile/Push/AbstractTest.php +++ /dev/null @@ -1,74 +0,0 @@ -adapter = new Zend_Mobile_Push_AbstractProxy(); - } - - public function testConnect() - { - $ret = $this->adapter->connect(); - $this->assertEquals($this->adapter, $ret); - $this->assertTrue($this->adapter->isConnected()); - } - - public function testSend() - { - $msg = new Zend_Mobile_Push_AbstractProxy_Message(); - $this->assertTrue($this->adapter->send($msg)); - } - - public function testClose() - { - $this->adapter->connect(); - $ret = $this->adapter->close(); - $this->assertNull($ret); - $this->assertFalse($this->adapter->isConnected()); - } -} - -class Zend_Mobile_Push_AbstractProxy extends Zend_Mobile_Push_Abstract -{ - -} - -class Zend_Mobile_Push_AbstractProxy_Message extends Zend_Mobile_Push_Message_Abstract -{ - -} diff --git a/tests/Zend/Mobile/Push/AllTests.php b/tests/Zend/Mobile/Push/AllTests.php deleted file mode 100644 index 5d56a9de74..0000000000 --- a/tests/Zend/Mobile/Push/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTest(Zend_Mobile_Push_Message_AllTests::suite()); - - $suite->addTestSuite('Zend_Mobile_Push_AbstractTest'); - $suite->addTestSuite('Zend_Mobile_Push_ApnsTest'); - $suite->addTestSuite('Zend_Mobile_Push_GcmTest'); - $suite->addTestSuite('Zend_Mobile_Push_MpnsTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Mobile_Push_AllTests::main') { - Zend_Mobile_Push_AllTests::main(); -} diff --git a/tests/Zend/Mobile/Push/ApnsTest.php b/tests/Zend/Mobile/Push/ApnsTest.php deleted file mode 100644 index 1d310818ea..0000000000 --- a/tests/Zend/Mobile/Push/ApnsTest.php +++ /dev/null @@ -1,228 +0,0 @@ -apns = new Zend_Mobile_Push_Test_ApnsProxy(); - $this->message = new Zend_Mobile_Push_Message_Apns(); - } - - protected function _setupValidBase() - { - $this->message->setToken('AF0123DE'); - $this->message->setId(time()); - $this->message->setAlert('bar'); - $this->apns->setCertificate('Zend/Mobile/Push/certificate.pem'); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testConnectThrowsExceptionOnInvalidEnvironment() - { - $this->apns->connect(5); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testConnectThrowsExceptionOnMissingCertificate() - { - $this->apns->connect(); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSetCertificateThrowsExceptionOnNonString() - { - $this->apns->setCertificate(array('foo')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSetCertificateThrowsExceptionOnMissingFile() - { - $this->apns->setCertificate('bar'); - } - - public function testSetCertificateReturnsInstance() - { - $ret = $this->apns->setCertificate('Zend/Mobile/Push/certificate.pem'); - $this->assertEquals($this->apns, $ret); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSetCertificatePassphraseThrowsExceptionOnNonString() - { - $this->apns->setCertificatePassphrase(array('foo')); - } - - public function testSetCertificatePassphraseReturnsInstance() - { - $ret = $this->apns->setCertificatePassphrase('foobar'); - $this->assertEquals($this->apns, $ret); - } - - public function testSetCertificatePassphraseSetsPassphrase() - { - $this->apns->setCertificatePassphrase('foobar'); - $this->assertEquals('foobar', $this->apns->getCertificatePassphrase()); - } - - public function testConnectReturnsThis() - { - $this->apns->setCertificate('Zend/Mobile/Push/certificate.pem'); - $ret = $this->apns->connect(); - $this->assertEquals($this->apns, $ret); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionOnInvalidMessage() - { - $this->apns->setCertificate('Zend/Mobile/Push/certificate.pem'); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_ServerUnavailable - */ - public function testSendThrowsServerUnavailableExceptionOnFalseReturn() - { - $this->_setupValidBase(); - $this->apns->setWriteResponse(false); - $this->apns->send($this->message); - } - - public function testSendReturnsTrueOnSuccess() - { - $this->_setupValidBase(); - $this->assertTrue($this->apns->send($this->message)); - } - - public function testSendReturnsTrueOnErr0() - { - $this->_setupValidBase(); - $this->assertTrue($this->apns->send($this->message)); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionOnProcessingError() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 1, 1, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionOnInvalidToken() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 2, 2, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidTopic - */ - public function testSendThrowsExceptionOnInvalidTopic() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 3, 3, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidPayload - */ - public function testSendThrowsExceptionOnInvalidPayload() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 4, 4, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionOnInvalidToken2() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 5, 5, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidTopic - */ - public function testSendThrowsExceptionOnInvalidTopic2() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 6, 6, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidPayload - */ - public function testSendThrowsExceptionOnMessageTooBig() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 7, 7, 012345)); - $this->apns->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionOnInvalidToken3() - { - $this->_setupValidBase(); - $this->apns->setReadResponse(pack('CCN*', 8, 8, 012345)); - $this->apns->send($this->message); - } -} diff --git a/tests/Zend/Mobile/Push/GcmTest.php b/tests/Zend/Mobile/Push/GcmTest.php deleted file mode 100644 index 6f6f3efabc..0000000000 --- a/tests/Zend/Mobile/Push/GcmTest.php +++ /dev/null @@ -1,241 +0,0 @@ - $id, - 'success' => $success, - 'failure' => $failure, - 'canonical_ids' => $ids, - 'results' => $results - )); - } - - public function setUp() - { - $this->adapter = new Zend_Http_Client_Adapter_Test(); - $this->client = new Zend_Http_Client(); - $this->client->setAdapter($this->adapter); - $this->gcm = new Zend_Mobile_Push_Gcm(); - $this->gcm->setApiKey('testing'); - $this->gcm->setHttpClient($this->client); - $this->message = new Zend_Mobile_Push_Message_Gcm(); - $this->message->addToken('testing'); - $this->message->addData('testKey', 'testValue'); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSetApiKeyThrowsExceptionOnNonString() - { - $this->gcm->setApiKey(array()); - } - - public function testSetApiKey() - { - $key = 'a-login-token'; - $this->gcm->setApiKey($key); - $this->assertEquals($key, $this->gcm->getApiKey()); - } - - public function testGetHttpClientReturnsDefault() - { - $gcm = new Zend_Mobile_Push_gcm(); - $this->assertEquals('Zend_Http_Client', get_class($gcm->getHttpClient())); - $this->assertTrue($gcm->getHttpClient() instanceof Zend_Http_Client); - } - - public function testSetHttpClient() - { - $client = new Zend_Http_Client(); - $this->gcm->setHttpClient($client); - $this->assertEquals($client, $this->gcm->getHttpClient()); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionWithNonValidMessage() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $this->gcm->send($msg); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionWithTtlNoId() - { - $msg = $this->message; - $msg->setTtl(300); - $this->gcm->send($msg); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_ServerUnavailable - */ - public function testSendThrowsExceptionWhenServerUnavailable() - { - $this->adapter->setResponse('HTTP/1.1 500 Internal Server Error' . "\r\n\r\n"); - $this->gcm->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidAuthToken - */ - public function testSendThrowsExceptionWhenInvalidAuthToken() - { - $this->adapter->setResponse('HTTP/1.1 401 Unauthorized' . "\r\n\r\n"); - $this->gcm->send($this->message); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidPayload - */ - public function testSendThrowsExceptionWhenInvalidPayload() - { - $this->adapter->setResponse('HTTP/1.1 400 Bad Request' . "\r\n\r\n"); - $this->gcm->send($this->message); - } - - public function testSendResultInvalidRegistrationId() - { - $body = $this->_createJSONResponse(101, 0, 1, 0, array(array('error' => 'InvalidRegistration'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('InvalidRegistration', $result['error']); - $this->assertEquals(0, $response->getSuccessCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - $this->assertEquals(1, $response->getFailureCount()); - } - - public function testSendResultMismatchSenderId() - { - $body = $this->_createJSONResponse(101, 0, 1, 0, array(array('error' => 'MismatchSenderId'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('MismatchSenderId', $result['error']); - $this->assertEquals(0, $response->getSuccessCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - $this->assertEquals(1, $response->getFailureCount()); - } - - public function testSendResultNotRegistered() - { - $body = $this->_createJSONResponse(101, 0, 1, 0, array(array('error' => 'NotRegistered'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('NotRegistered', $result['error']); - $this->assertEquals(0, $response->getSuccessCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - $this->assertEquals(1, $response->getFailureCount()); - } - - public function testSendResultMessageTooBig() - { - $body = $this->_createJSONResponse(101, 0, 1, 0, array(array('error' => 'MessageTooBig'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('MessageTooBig', $result['error']); - $this->assertEquals(0, $response->getSuccessCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - $this->assertEquals(1, $response->getFailureCount()); - } - - public function testSendResultSuccessful() - { - $body = $this->_createJSONResponse(101, 1, 0, 0, array(array('message_id' => '1:2342'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('1:2342', $result['message_id']); - $this->assertEquals(1, $response->getSuccessCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - $this->assertEquals(0, $response->getFailureCount()); - } - - public function testSendResultSuccessfulWithRegistrationId() - { - $body = $this->_createJSONResponse(101, 1, 0, 1, array(array('message_id' => '1:2342', 'registration_id' => 'testfoo'))); - $this->adapter->setResponse( - 'HTTP/1.1 200 OK' . "\r\n" . - 'Context-Type: text/html' . "\r\n\r\n" . - $body - ); - $response = $this->gcm->send($this->message); - $result = $response->getResults(); - $result = array_shift($result); - $this->assertEquals('1:2342', $result['message_id']); - $this->assertEquals('testfoo', $result['registration_id']); - $this->assertEquals(1, $response->getSuccessCount()); - $this->assertEquals(1, $response->getCanonicalCount()); - $this->assertEquals(0, $response->getFailureCount()); - } -} diff --git a/tests/Zend/Mobile/Push/Message/AbstractTest.php b/tests/Zend/Mobile/Push/Message/AbstractTest.php deleted file mode 100644 index 012e846426..0000000000 --- a/tests/Zend/Mobile/Push/Message/AbstractTest.php +++ /dev/null @@ -1,105 +0,0 @@ -msg = new Zend_Mobile_Push_Message_AbstractProxy(); - } - - public function testSetToken() - { - $token = 'a-token!'; - $ret = $this->msg->setToken($token); - $this->assertEquals($this->msg, $ret); - $this->assertEquals($token, $this->msg->getToken()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenThrowsExceptionOnNonStringToken() - { - $this->msg->setToken(array('dummy')); - } - - public function testSetId() - { - $id = 'wahooo'; - $ret = $this->msg->setId($id); - $this->assertEquals($this->msg, $ret); - $this->assertEquals($id, $this->msg->getId()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetIdThrowsExceptionOnNonScalar() - { - $this->msg->setId(array('foo')); - } - - public function testSetOptions() - { - $token = 'token'; - $id = 'id'; - - $ret = $this->msg->setOptions(array( - 'id' => $id, - 'token' => $token - )); - $this->assertEquals($this->msg, $ret); - $this->assertEquals($token, $this->msg->getToken()); - $this->assertEquals($id, $this->msg->getId()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetOptionsThrowsExceptionOnMissingMethod() - { - $this->msg->setOptions(array( - 'thisMethodDoesNotExist' => 'value' - )); - } - - public function testValidateReturnsTrue() - { - $this->assertTrue($this->msg->validate()); - } -} - -class Zend_Mobile_Push_Message_AbstractProxy extends Zend_Mobile_Push_Message_Abstract -{ - -} diff --git a/tests/Zend/Mobile/Push/Message/AllTests.php b/tests/Zend/Mobile/Push/Message/AllTests.php deleted file mode 100644 index dde4c4e446..0000000000 --- a/tests/Zend/Mobile/Push/Message/AllTests.php +++ /dev/null @@ -1,63 +0,0 @@ -addTest(Zend_Mobile_Push_Message_Mpns_AllTests::suite()); - - $suite->addTestSuite('Zend_Mobile_Push_Message_AbstractTest'); - $suite->addTestSuite('Zend_Mobile_Push_Message_ApnsTest'); - $suite->addTestSuite('Zend_Mobile_Push_Message_GcmTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Mobile_Push_Message_AllTests::main') { - Zend_Mobile_Push_Message_AllTests::main(); -} diff --git a/tests/Zend/Mobile/Push/Message/ApnsTest.php b/tests/Zend/Mobile/Push/Message/ApnsTest.php deleted file mode 100644 index 4a42e61cc1..0000000000 --- a/tests/Zend/Mobile/Push/Message/ApnsTest.php +++ /dev/null @@ -1,218 +0,0 @@ -message = new Zend_Mobile_Push_Message_Apns(); - } - - public function testSetAlertTextReturnsCorrectly() - { - $text = 'my alert'; - $ret = $this->message->setAlert($text); - $this->assertTrue($ret instanceof Zend_Mobile_Push_Message_Apns); - $checkText = $this->message->getAlert(); - $this->assertTrue(is_array($checkText)); - $this->assertEquals($checkText['body'], $text); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetAlertThrowsExceptionOnTextNonString() - { - $this->message->setAlert(array()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetAlertThrowsExceptionOnActionLocKeyNonString() - { - $this->message->setAlert('text', array()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetAlertThrowsExceptionOnLocKeyNonString() - { - $this->message->setAlert('text', 'button', array()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetAlertThrowsExceptionOnLocArgsNonArray() - { - $this->message->setAlert('text', 'button', 'action', 'whoa'); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetAlertThrowsExceptionOnLaunchImageNonString() - { - $this->message->setAlert('text', 'button', 'action', array('locale'), array()); - } - - public function testSetBadgeReturnsCorrectNumber() - { - $num = 5; - $this->message->setBadge($num); - $this->assertEquals($this->message->getBadge(), $num); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBadgeNonNumericThrowsException() - { - $this->message->setBadge('string!'); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBadgeNegativeNumberThrowsException() - { - $this->message->setBadge(-5); - } - - public function testSetBadgeAllowsNull() - { - $this->message->setBadge(null); - $this->assertNull($this->message->getBadge()); - } - - public function testSetExpireReturnsInteger() - { - $expire = 100; - $this->message->setExpire($expire); - $this->assertEquals($this->message->getExpire(), $expire); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetExpireNonNumericThrowsException() - { - $this->message->setExpire('sting!'); - } - - public function testSetSoundReturnsString() - { - $sound = 'test'; - $this->message->setSound($sound); - $this->assertEquals($this->message->getSound(), $sound); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetSoundThrowsExceptionOnNonString() - { - $this->message->setSound(array()); - } - - public function testAddCustomDataReturnsSetData() - { - $addKey1 = 'test1'; - $addValue1 = array('val', 'ue', '1'); - - $addKey2 = 'test2'; - $addValue2 = 'value2'; - - $expected = array($addKey1 => $addValue1); - $this->message->addCustomData($addKey1, $addValue1); - $this->assertEquals($this->message->getCustomData(), $expected); - - $expected[$addKey2] = $addValue2; - $this->message->addCustomData($addKey2, $addValue2); - $this->assertEquals($this->message->getCustomData(), $expected); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testAddCustomDataThrowsExceptionOnNonStringKey() - { - $this->message->addCustomData(array('key'), 'val'); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testAddCustomDataThrowsExceptionOnReservedKeyAps() - { - $this->message->addCustomData('aps', 'val'); - } - - public function testClearCustomDataClearsData() - { - $this->message->addCustomData('key', 'val'); - $this->message->clearCustomData(); - $this->assertEquals($this->message->getCustomData(), array()); - } - - public function testSetCustomData() - { - $data = array('key' => 'val', 'key2' => array(1, 2, 3, 4, 5)); - $this->message->setCustomData($data); - $this->assertEquals($this->message->getCustomData(), $data); - } - - public function testValidateReturnsFalseWithoutToken() - { - $this->assertFalse($this->message->validate()); - } - - public function testValidateReturnsFalseIdNotNumeric() - { - $this->message->setToken('abc'); - $this->message->setId('def'); - $this->assertFalse($this->message->validate()); - } - - public function testValidateReturnsTrueWhenProperlySet() - { - $this->message->setToken('abc'); - $this->assertTrue($this->message->validate()); - - $this->message->setId(12345); - $this->assertTrue($this->message->validate()); - } -} diff --git a/tests/Zend/Mobile/Push/Message/GcmTest.php b/tests/Zend/Mobile/Push/Message/GcmTest.php deleted file mode 100644 index 514c267915..0000000000 --- a/tests/Zend/Mobile/Push/Message/GcmTest.php +++ /dev/null @@ -1,155 +0,0 @@ -addData(array(), 'value'); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testAddDataThrowsExceptionOnNonScalarValue() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->addData('key', new stdClass); - } - - public function testSetData() - { - $data = array('key' => 'value'); - $data2 = array('key2' => 'value2'); - $msg = new Zend_Mobile_Push_Message_Gcm(); - - $msg->setData($data); - $this->assertEquals($data, $msg->getData()); - - $msg->setData($data2); - $this->assertEquals($data2, $msg->getData()); - } - - public function testTokens() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setToken('foo'); - $this->assertEquals(array('foo'), $msg->getToken()); - - $msg->setToken(array('foo', 'bar')); - $this->assertEquals(array('foo', 'bar'), $msg->getToken()); - - $msg->setToken('bar'); - $msg->addToken('foo'); - $this->assertEquals(array('bar', 'foo'), $msg->getToken()); - - $msg->clearToken(); - $this->assertEquals(array(), $msg->getToken()); - } - - public function testDelayWhileIdle() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setDelayWhileIdle(true); - $this->assertTrue($msg->getDelayWhileIdle()); - $msg->setDelayWhileIdle(false); - $this->assertFalse($msg->getDelayWhileIdle()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testDelayWhileIdleThrowsExceptionOnInvalidValue() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setDelayWhileIdle('true'); - } - - public function testTtl() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setTtl(10); - $this->assertEquals(10, $msg->getTtl()); - } - - public function testTtlSendMessageOnZero() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setTtl(0); - $this->assertEquals(0, $msg->getTtl()); - $this->assertEquals('{"time_to_live":0}', $msg->toJson()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testTtlThrowsExceptionOnInvalidValue() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setTtl('foo'); - } - - - public function testValidateWithoutTokenReturnsFalse() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $this->assertFalse($msg->validate()); - } - - public function testValidateToken() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setToken('a-token!'); - $this->assertTrue($msg->validate()); - } - - public function testValidateWithTtlAndNoIdReturnsFalse() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setToken('foo'); - $msg->setTtl(10); - $this->assertFalse($msg->validate()); - } - - public function testToJsonIntCollapseKeyEncodedAsString() - { - $msg = new Zend_Mobile_Push_Message_Gcm(); - $msg->setId(10); - $this->assertEquals('{"collapse_key":"10"}', $msg->toJson()); - } -} diff --git a/tests/Zend/Mobile/Push/Message/Mpns/AllTests.php b/tests/Zend/Mobile/Push/Message/Mpns/AllTests.php deleted file mode 100644 index 7afedaa54f..0000000000 --- a/tests/Zend/Mobile/Push/Message/Mpns/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Mobile_Push_Message_Mpns_RawTest'); - $suite->addTestSuite('Zend_Mobile_Push_Message_Mpns_TileTest'); - $suite->addTestSuite('Zend_Mobile_Push_Message_Mpns_ToastTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Mobile_Push_Message_Mpns_AllTests::main') { - Zend_Mobile_Push_Message_Mpns_AllTests::main(); -} diff --git a/tests/Zend/Mobile/Push/Message/Mpns/RawTest.php b/tests/Zend/Mobile/Push/Message/Mpns/RawTest.php deleted file mode 100644 index fcc7b6e8c2..0000000000 --- a/tests/Zend/Mobile/Push/Message/Mpns/RawTest.php +++ /dev/null @@ -1,139 +0,0 @@ -_msg = new Zend_Mobile_Push_Message_Mpns_Raw(); - } - - public function testSetToken() - { - $token = 'http://sn1.notify.live.net/throttledthirdparty/bogusdata'; - $this->_msg->setToken($token); - $this->assertEquals($token, $this->_msg->getToken()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenNonStringThrowsException() - { - $token = array('foo' => 'bar'); - $this->_msg->setToken($token); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenInvalidUrlThrowsException() - { - $token = 'notaurl'; - $this->_msg->setToken($token); - } - - public function testGetNotificationType() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns::TYPE_RAW, $this->_msg->getNotificationType()); - } - - public function testSetMessage() - { - $msg = ''; - $this->_msg->setMessage($msg); - $this->assertEquals($msg, $this->_msg->getMessage()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetMessageThrowsExceptionOnNonString() - { - $msg = array('foo' => 'bar'); - $this->_msg->setMessage($msg); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetMessageThrowsExceptionOnNonXml() - { - $msg = 'foo'; - $this->_msg->setMessage($msg); - } - - public function testGetDelayHasDefaultOfImmediate() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - public function testSetDelay() - { - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_450S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_450S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_900S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_900S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_IMMEDIATE); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Raw::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetDelayThrowsExceptionOnInvalidDelay() - { - $delay = 'foo'; - $this->_msg->setDelay($delay); - } - - public function testValidate() - { - $this->assertFalse($this->_msg->validate()); - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/bogusdata'); - $this->assertFalse($this->_msg->validate()); - $this->_msg->setMessage('foo'); - $this->assertTrue($this->_msg->validate()); - } - - public function testGetXmlPayload() - { - $raw = 'foo'; - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/abcdef1234567890'); - $this->_msg->setMessage($raw); - $this->assertEquals($this->_msg->getXmlPayload(), $raw); - } -} diff --git a/tests/Zend/Mobile/Push/Message/Mpns/TileTest.php b/tests/Zend/Mobile/Push/Message/Mpns/TileTest.php deleted file mode 100644 index a2813ee9c1..0000000000 --- a/tests/Zend/Mobile/Push/Message/Mpns/TileTest.php +++ /dev/null @@ -1,234 +0,0 @@ -_msg = new Zend_Mobile_Push_Message_Mpns_Tile(); - } - - public function testSetToken() - { - $token = 'http://sn1.notify.live.net/throttledthirdparty/bogusdata'; - $this->_msg->setToken($token); - $this->assertEquals($token, $this->_msg->getToken()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenNonStringThrowsException() - { - $token = array('foo' => 'bar'); - $this->_msg->setToken($token); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenInvalidUrlThrowsException() - { - $token = 'notaurl'; - $this->_msg->setToken($token); - } - - public function testGetNotificationType() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns::TYPE_TILE, $this->_msg->getNotificationType()); - } - - public function testGetDelayHasDefaultOfImmediate() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - public function testSetBackgroundImage() - { - $image = 'foo.bar'; - $this->_msg->setBackgroundImage($image); - $this->assertEquals($image, $this->_msg->getBackgroundImage()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBackgroundImageThrowsExceptionOnNonString() - { - $image = array('foo' => 'bar'); - $this->_msg->setBackgroundImage($image); - } - - public function testSetCount() - { - $negCount = -1; - $posCount = 1; - $this->_msg->setCount($negCount); - $this->assertEquals($negCount, $this->_msg->getCount()); - $this->_msg->setCount($posCount); - $this->assertEquals($posCount, $this->_msg->getCount()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetCountThrowsExceptionOnNonNumeric() - { - $count = 'five'; - $this->_msg->setCount($count); - } - - public function testSetTitle() - { - $title = 'foo'; - $this->_msg->setTitle($title); - $this->assertEquals($title, $this->_msg->getTitle()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTitleThrowsExceptionOnNonString() - { - $title = array('foo' => 'bar'); - $this->_msg->setTitle($title); - } - - public function testSetBackBackgroundImage() - { - $image = 'foo.bar'; - $this->_msg->setBackBackgroundImage($image); - $this->assertEquals($image, $this->_msg->getBackBackgroundImage()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBackBackgroundImageThrowsExceptionOnNonString() - { - $image = array('foo' => 'bar'); - $this->_msg->setBackBackgroundImage($image); - } - - public function testSetBackTitle() - { - $title = 'foo'; - $this->_msg->setBackTitle($title); - $this->assertEquals($title, $this->_msg->getBackTitle()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBackTitleThrowsExceptionOnNonString() - { - $title = array('foo' => 'bar'); - $this->_msg->setBackTitle($title); - } - - public function testSetBackContent() - { - $content = 'foo'; - $this->_msg->setBackContent($content); - $this->assertEquals($content, $this->_msg->getBackContent()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetBackContentThrowsExceptionOnNonString() - { - $content = array('foo' => 'bar'); - $this->_msg->setBackContent($content); - $this->assertEquals($content, $this->_msg->getBackContent()); - } - - public function testSetTileId() - { - $id = '?foo.bar'; - $this->_msg->setTileId($id); - $this->assertEquals($id, $this->_msg->getTileId()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTileIdThrowsExceptionOnNonString() - { - $id = array('foo' => 'bar'); - $this->_msg->setTileId($id); - } - - - public function testSetDelay() - { - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_450S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_450S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_900S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_900S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_IMMEDIATE); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Tile::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - public function testValidate() - { - $this->assertFalse($this->_msg->validate()); - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/bogusdata'); - $this->assertFalse($this->_msg->validate()); - $this->_msg->setBackgroundImage('foo.bar'); - $this->assertFalse($this->_msg->validate()); - $this->_msg->setTitle('foo'); - $this->assertTrue($this->_msg->validate()); - } - - public function testGetXmlPayload() - { - $title = 'foo'; - $backgroundImage = 'bar.jpg'; - $count = 5; - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/abcdef1234567890'); - $this->_msg->setTitle($title); - $this->_msg->setBackgroundImage($backgroundImage); - $this->_msg->setCount($count); - - $xml = new SimpleXMLElement($this->_msg->getXmlPayload(), 0, false, 'wp', true); - - $this->assertEquals($title, (string) $xml->Tile->Title); - $this->assertEquals($backgroundImage, (string) $xml->Tile->BackgroundImage); - $this->assertEquals($count, (int) $xml->Tile->Count); - } - -} diff --git a/tests/Zend/Mobile/Push/Message/Mpns/ToastTest.php b/tests/Zend/Mobile/Push/Message/Mpns/ToastTest.php deleted file mode 100644 index 835258b2af..0000000000 --- a/tests/Zend/Mobile/Push/Message/Mpns/ToastTest.php +++ /dev/null @@ -1,161 +0,0 @@ -_msg = new Zend_Mobile_Push_Message_Mpns_Toast(); - } - - public function testSetToken() - { - $token = 'http://sn1.notify.live.net/throttledthirdparty/bogusdata'; - $this->_msg->setToken($token); - $this->assertEquals($token, $this->_msg->getToken()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenNonStringThrowsException() - { - $token = array('foo' => 'bar'); - $this->_msg->setToken($token); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTokenInvalidUrlThrowsException() - { - $token = 'notaurl'; - $this->_msg->setToken($token); - } - - public function testGetNotificationType() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns::TYPE_TOAST, $this->_msg->getNotificationType()); - } - - public function testSetTitle() - { - $title = 'foo'; - $this->_msg->setTitle($title); - $this->assertEquals($title, $this->_msg->getTitle()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetTitleThrowsExceptionOnNonString() - { - $title = array('foo' => 'bar'); - $this->_msg->setTitle($title); - } - - public function testSetMessage() - { - $msg = 'foo'; - $this->_msg->setMessage($msg); - $this->assertEquals($msg, $this->_msg->getMessage()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetMessageThrowsExceptionOnNonString() - { - $msg = array('foo' => 'bar'); - $this->_msg->setMessage($msg); - } - - public function testSetParams() - { - $params = '?foo=bar'; - $this->_msg->setParams($params); - $this->assertEquals($params, $this->_msg->getParams()); - } - - /** - * @expectedException Zend_Mobile_Push_Message_Exception - */ - public function testSetParamsThrowsExceptionOnNonString() - { - $params = array('foo' => 'bar'); - $this->_msg->setParams($params); - } - - public function testGetDelayHasDefaultOfImmediate() - { - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - public function testSetDelay() - { - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_450S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_450S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_900S); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_900S, $this->_msg->getDelay()); - $this->_msg->setDelay(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_IMMEDIATE); - $this->assertEquals(Zend_Mobile_Push_Message_Mpns_Toast::DELAY_IMMEDIATE, $this->_msg->getDelay()); - } - - public function testValidate() - { - $this->assertFalse($this->_msg->validate()); - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/bogusdata'); - $this->assertFalse($this->_msg->validate()); - $this->_msg->setTitle('foo'); - $this->assertFalse($this->_msg->validate()); - $this->_msg->setMessage('bar'); - $this->assertTrue($this->_msg->validate()); - } - - public function testGetXmlPayload() - { - $title = 'Foo'; - $message = 'Bar'; - $this->_msg->setToken('http://sn1.notify.live.net/throttledthirdparty/abcdef1234567890'); - $this->_msg->setTitle($title); - $this->_msg->setMessage($message); - - $xml = new SimpleXMLElement($this->_msg->getXmlPayload(), 0, false, 'wp', true); - - $this->assertEquals($title, (string) $xml->Toast->Text1); - $this->assertEquals($message, (string) $xml->Toast->Text2); - } -} diff --git a/tests/Zend/Mobile/Push/MpnsTest.php b/tests/Zend/Mobile/Push/MpnsTest.php deleted file mode 100644 index 466b5acbd3..0000000000 --- a/tests/Zend/Mobile/Push/MpnsTest.php +++ /dev/null @@ -1,184 +0,0 @@ -adapter = new Zend_Http_Client_Adapter_Test(); - $this->client = new Zend_Http_Client(); - $this->client->setAdapter($this->adapter); - $this->mpns = new Zend_Mobile_Push_Mpns(); - $this->mpns->setHttpClient($this->client); - } - - public function getMessage($type) { - switch ($type) { - case 'tile': - $message = new Zend_Mobile_Push_Message_Mpns_Tile(); - break; - case 'toast': - $message = new Zend_Mobile_Push_Message_Mpns_Toast(); - break; - default: - $message = new Zend_Mobile_Push_Message_Mpns_Raw(); - $message->setMessage(''); - } - $message->setToken('http://this.is.a.url.com'); - return $message; - } - - public function testGetHttpClientReturnsDefault() - { - $mpns = new Zend_Mobile_Push_Mpns(); - $this->assertEquals('Zend_Http_Client', get_class($mpns->getHttpClient())); - $this->assertTrue($mpns->getHttpClient() instanceof Zend_Http_Client); - } - - public function testSetHttpClient() - { - $client = new Zend_Http_Client(); - $this->mpns->setHttpClient($client); - $this->assertEquals($client, $this->mpns->getHttpClient()); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionWithNonValidMessage() - { - $msg = new Zend_Mobile_Push_Message_Mpns_Tile(); - $this->mpns->send($msg); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_DeviceQuotaExceeded - */ - public function testSendThrowsExceptionWhenDeviceQuotaExceeded() - { - $this->adapter->setResponse('HTTP/1.1 200 OK' . "\r\n" . 'NotificationStatus: QueueFull' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidPayload - */ - public function testSendThrowsExceptionWhenInvalidPayload() - { - $this->adapter->setResponse('HTTP/1.1 400 Bad Request' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionWhenInvalidToken() - { - $this->adapter->setResponse('HTTP/1.1 401 Unauthorized' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionWhenDeviceNotRegistered() - { - $this->adapter->setResponse('HTTP/1.1 404 Not Found' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception - */ - public function testSendThrowsExceptionWhenMethodNotPost() - { - $this->adapter->setResponse('HTTP/1.1 405 Method Not Allowed' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_QuotaExceeded - */ - public function testSendThrowsExceptionWhenServiceQuotaExceeded() - { - $this->adapter->setResponse('HTTP/1.1 406 Not Acceptable'); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_InvalidToken - */ - public function testSendThrowsExceptionWhenInvalidToken2() - { - $this->adapter->setResponse('HTTP/1.1 412 Precondition Failed' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_ServerUnavailable - */ - public function testSendThrowsExceptionWhenServerUnavailable() - { - $this->adapter->setResponse('HTTP/1.1 503 Service Unavailable' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - } - - public function testAllOk() - { - $this->adapter->setResponse('HTTP/1.1 200 OK' . "\r\n\r\n"); - $this->mpns->send($this->getMessage('raw')); - - $toast = $this->getMessage('toast'); - $toast->setTitle('Foo'); - $toast->setMessage('Bar'); - $this->mpns->send($toast); - - $tile = $this->getMessage('tile'); - $tile->setBackgroundImage('red.jpg'); - $tile->setCount(1); - $tile->setTitle('Foo Bar'); - - // other optional attributes for wp7.1+ - $tile->setTileId('/SomeAction.xaml'); - $tile->setBackBackgroundImage('blue.jpg'); - $tile->setBackTitle('Bar'); - $tile->setBackContent('Foo'); - } -} diff --git a/tests/Zend/Mobile/Push/Response/AllTests.php b/tests/Zend/Mobile/Push/Response/AllTests.php deleted file mode 100644 index fb1381577e..0000000000 --- a/tests/Zend/Mobile/Push/Response/AllTests.php +++ /dev/null @@ -1,58 +0,0 @@ -addTest(Zend_Mobile_Push_Response_Mpns_AllTests::suite()); - - $suite->addTestSuite('Zend_Mobile_Push_Response_GcmTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Mobile_Push_Response_AllTests::main') { - Zend_Mobile_Push_Response_AllTests::main(); -} diff --git a/tests/Zend/Mobile/Push/Response/GcmTest.php b/tests/Zend/Mobile/Push/Response/GcmTest.php deleted file mode 100644 index 35b9023bad..0000000000 --- a/tests/Zend/Mobile/Push/Response/GcmTest.php +++ /dev/null @@ -1,109 +0,0 @@ -assertNull($response->getResponse()); - $this->assertNull($response->getMessage()); - - $message = new Zend_Mobile_Push_Message_Gcm(); - $response = new Zend_Mobile_Push_Response_Gcm(null, $message); - $this->assertEquals($message, $response->getMessage()); - $this->assertNull($response->getResponse()); - - $message = new Zend_Mobile_Push_Message_Gcm(); - $responseArr = json_encode(array( - 'results' => array( - array('message_id' => '1:1234'), - ), - 'success' => 1, - 'failure' => 0, - 'canonical_ids' => 0, - 'multicast_id' => 1, - )); - $response = new Zend_Mobile_Push_Response_Gcm($responseArr, $message); - $this->assertEquals(json_decode($responseArr, true), $response->getResponse()); - $this->assertEquals($message, $response->getMessage()); - } - - /** - * @expectedException Zend_Mobile_Push_Exception_ServerUnavailable - */ - public function testConstructorThrowsExceptionOnBadOrEmptyJsonString() - { - $response = new Zend_Mobile_Push_Response_Gcm('{bad'); - } - - public function testSetGetMessage() - { - $message = new Zend_Mobile_Push_Message_Gcm(); - $response = new Zend_Mobile_Push_Response_Gcm(); - $response->setMessage($message); - $this->assertEquals($message, $response->getMessage()); - } - - public function testResponse() - { - $responseArr = array( - 'results' => array( - array('message_id' => '1:234'), - ), - 'success' => 1, - 'failure' => 0, - 'canonical_ids' => 0, - 'multicast_id' => '123', - ); - $response = new Zend_Mobile_Push_Response_Gcm(); - $response->setResponse($responseArr); - $this->assertEquals($responseArr, $response->getResponse()); - $this->assertEquals(1, $response->getSuccessCount()); - $this->assertEquals(0, $response->getFailureCount()); - $this->assertEquals(0, $response->getCanonicalCount()); - // test results non correlated - $expected = array(array('message_id' => '1:234')); - $this->assertEquals($expected, $response->getResults()); - $expected = array(0 => '1:234'); - $this->assertEquals($expected, $response->getResult(Zend_Mobile_Push_Response_Gcm::RESULT_MESSAGE_ID)); - - $message = new Zend_Mobile_Push_Message_Gcm(); - $message->setToken(array('ABCDEF')); - $response->setMessage($message); - $expected = array('ABCDEF' => '1:234'); - $this->assertEquals($expected, $response->getResult(Zend_Mobile_Push_Response_Gcm::RESULT_MESSAGE_ID)); - } -} diff --git a/tests/Zend/Mobile/Push/certificate.pem b/tests/Zend/Mobile/Push/certificate.pem deleted file mode 100644 index e69de29bb2..0000000000 From 09901f8e173ebf2443b919551caac8d88d9a24c4 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:30:56 -0500 Subject: [PATCH 24/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Queue Tests and Demos --- tests/Zend/AllTests.php | 2 - .../Queue/Adapter/ActivemqOfflineTest.php | 95 -- tests/Zend/Queue/Adapter/ActivemqTest.php | 118 --- tests/Zend/Queue/Adapter/AdapterTest.php | 888 ------------------ tests/Zend/Queue/Adapter/ArrayTest.php | 129 --- tests/Zend/Queue/Adapter/DbTest.php | 164 ---- tests/Zend/Queue/Adapter/Iterator2.php | 41 - tests/Zend/Queue/Adapter/MemcacheqTest.php | 135 --- tests/Zend/Queue/Adapter/MessageTestClass.php | 33 - tests/Zend/Queue/Adapter/NullTest.php | 89 -- .../Queue/Adapter/PlatformJobQueueTest.php | 329 ------- tests/Zend/Queue/Adapter/WARNING.txt | 5 - tests/Zend/Queue/AllTests.php | 103 -- tests/Zend/Queue/Custom/DbForUpdate.php | 123 --- tests/Zend/Queue/Custom/Message.php | 119 --- tests/Zend/Queue/Custom/Messages.php | 178 ---- tests/Zend/Queue/Custom/Queue.php | 94 -- tests/Zend/Queue/CustomTest.php | 154 --- tests/Zend/Queue/FactoryTest.php | 116 --- tests/Zend/Queue/Message/IteratorTest.php | 164 ---- tests/Zend/Queue/MessageTest.php | 199 ---- tests/Zend/Queue/Queue1Test.php | 55 -- tests/Zend/Queue/Queue2Test.php | 53 -- tests/Zend/Queue/QueueBaseTest.php | 270 ------ tests/Zend/Queue/QueueTest.php | 240 ----- tests/Zend/Queue/Stomp/ClientTest.php | 167 ---- tests/Zend/Queue/Stomp/FrameTest.php | 151 --- 27 files changed, 4214 deletions(-) delete mode 100644 tests/Zend/Queue/Adapter/ActivemqOfflineTest.php delete mode 100644 tests/Zend/Queue/Adapter/ActivemqTest.php delete mode 100644 tests/Zend/Queue/Adapter/AdapterTest.php delete mode 100644 tests/Zend/Queue/Adapter/ArrayTest.php delete mode 100644 tests/Zend/Queue/Adapter/DbTest.php delete mode 100644 tests/Zend/Queue/Adapter/Iterator2.php delete mode 100644 tests/Zend/Queue/Adapter/MemcacheqTest.php delete mode 100644 tests/Zend/Queue/Adapter/MessageTestClass.php delete mode 100644 tests/Zend/Queue/Adapter/NullTest.php delete mode 100644 tests/Zend/Queue/Adapter/PlatformJobQueueTest.php delete mode 100644 tests/Zend/Queue/Adapter/WARNING.txt delete mode 100644 tests/Zend/Queue/AllTests.php delete mode 100644 tests/Zend/Queue/Custom/DbForUpdate.php delete mode 100644 tests/Zend/Queue/Custom/Message.php delete mode 100644 tests/Zend/Queue/Custom/Messages.php delete mode 100644 tests/Zend/Queue/Custom/Queue.php delete mode 100644 tests/Zend/Queue/CustomTest.php delete mode 100644 tests/Zend/Queue/FactoryTest.php delete mode 100644 tests/Zend/Queue/Message/IteratorTest.php delete mode 100644 tests/Zend/Queue/MessageTest.php delete mode 100644 tests/Zend/Queue/Queue1Test.php delete mode 100644 tests/Zend/Queue/Queue2Test.php delete mode 100644 tests/Zend/Queue/QueueBaseTest.php delete mode 100644 tests/Zend/Queue/QueueTest.php delete mode 100644 tests/Zend/Queue/Stomp/ClientTest.php delete mode 100644 tests/Zend/Queue/Stomp/FrameTest.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index f36d7b7480..def3301546 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -63,7 +63,6 @@ require_once 'Zend/Pdf/AllTests.php'; require_once 'Zend/ProgressBar/AllTests.php'; require_once 'Zend/RegistryTest.php'; -require_once 'Zend/Queue/AllTests.php'; require_once 'Zend/Search/Lucene/AllTests.php'; require_once 'Zend/Serializer/AllTests.php'; require_once 'Zend/Server/AllTests.php'; @@ -180,7 +179,6 @@ public static function suite() $suite->addTest(Zend_Pdf_AllTests::suite()); $suite->addTest(Zend_ProgressBar_AllTests::suite()); $suite->addTestSuite('Zend_RegistryTest'); - $suite->addTest(Zend_Queue_AllTests::suite()); $suite->addTest(Zend_Search_Lucene_AllTests::suite()); $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); diff --git a/tests/Zend/Queue/Adapter/ActivemqOfflineTest.php b/tests/Zend/Queue/Adapter/ActivemqOfflineTest.php deleted file mode 100644 index 7db5ba7f15..0000000000 --- a/tests/Zend/Queue/Adapter/ActivemqOfflineTest.php +++ /dev/null @@ -1,95 +0,0 @@ - 'foo')); - $adapter->receive(null, null, $queue); - $adapter->receive(null, null, $queue); - - // iterate through mock StompClient and ensure SUBSCRIBE is only sent once per queue - $subscribes = 0; - foreach ($stompClient->frameStack as $frame) { - if ($frame->getCommand() === 'SUBSCRIBE') { - $subscribes++; - } - } - - $this->assertEquals(1, $subscribes); - } -} - -class StompClientMock extends Zend_Queue_Stomp_Client -{ - public $frameStack = array(); - public $responseStack = array(); - - public function __construct() { - // spoof a successful connection in the response stack - $frame = new Zend_Queue_Stomp_Frame; - $frame->setCommand('CONNECTED'); - $this->responseStack[] = $frame; - } - public function __destruct() {} - - public function send(Zend_Queue_Stomp_FrameInterface $frame) - { - $this->frameStack[] = $frame; - return $this; - } - - public function receive() - { - return array_shift($this->responseStack); - } - - public function canRead() - { - return count($this->responseStack) > 0; - } - - public function createFrame() - { - return new Zend_Queue_Stomp_Frame; - } -} diff --git a/tests/Zend/Queue/Adapter/ActivemqTest.php b/tests/Zend/Queue/Adapter/ActivemqTest.php deleted file mode 100644 index f6fa62d771..0000000000 --- a/tests/Zend/Queue/Adapter/ActivemqTest.php +++ /dev/null @@ -1,118 +0,0 @@ -markTestSkipped('TESTS_ZEND_QUEUE_ACTIVEMQ_ENABLED is not enabled in TestConfiguration.php'); - } - parent::setUp(); - } - - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You must overload this method - * - * @return string - */ - public function getAdapterName() - { - return 'Activemq'; - } - - public function getTestConfig() - { - $driverOptions = array(); - if (defined('TESTS_ZEND_QUEUE_ACTIVEMQ_HOST')) { - $driverOptions['host'] = TESTS_ZEND_QUEUE_ACTIVEMQ_HOST; - } - if (defined('TESTS_ZEND_QUEUE_ACTIVEMQ_PORT')) { - $driverOptions['port'] = TESTS_ZEND_QUEUE_ACTIVEMQ_PORT; - } - if (defined('TESTS_ZEND_QUEUE_ACTIVEMQ_SCHEME')) { - $driverOptions['scheme'] = TESTS_ZEND_QUEUE_ACTIVEMQ_SCHEME; - } - return array('driverOptions' => $driverOptions); - } - - /** - * Stomped requires specific name types - */ - public function createQueueName($name) - { - return '/temp-queue/' . $name; - } - - public function testConst() - { - /** - * @see Zend_Queue_Adapter_Activemq - */ - require_once 'Zend/Queue/Adapter/Activemq.php'; - $this->assertTrue(is_string(Zend_Queue_Adapter_Activemq::DEFAULT_SCHEME)); - $this->assertTrue(is_string(Zend_Queue_Adapter_Activemq::DEFAULT_HOST)); - $this->assertTrue(is_integer(Zend_Queue_Adapter_Activemq::DEFAULT_PORT)); - } - - /** - * @group ZF-7650 - */ - public function testReceiveWillRetrieveZeroItems() - { - $options = array('driverOptions' => $this->getTestConfig()); - - $queue = new Zend_Queue('Activemq', $options); - $queue2 = $queue->createQueue('queue'); - - $queue->send('My Test Message 1'); - $queue->send('My Test Message 2'); - - $messages = $queue->receive(0); - $this->assertEquals(0, count($messages)); - } -} diff --git a/tests/Zend/Queue/Adapter/AdapterTest.php b/tests/Zend/Queue/Adapter/AdapterTest.php deleted file mode 100644 index 2cde6addbb..0000000000 --- a/tests/Zend/Queue/Adapter/AdapterTest.php +++ /dev/null @@ -1,888 +0,0 @@ -error = false; - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You must overload this method - * - * @return string - */ - public function getAdapterName() - { - die('You must overload this function: getAdapterName()'); - // example for Zend_Queue_Adatper_Array - return 'Array'; - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You may overload this method. The default return is - * 'Zend_Queue_Adapter_' . $this->getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function getTestConfig() - { - return array('driverOptions' => array()); - } - - /** - * for ActiveMQ it uses /queue/ /temp-queue/ /topic/ /temp-topic/ - */ - public function createQueueName($name) - { - return $name; - } - - /** - * This is a generic function that creates a queue - * - * @param array $config, $config['name'] must be set. - * - * or - * - * @param string $name - name of the queue to create - * @param array $config - a special config? - * @return Zend_Queue - */ - protected function createQueue($name, $config = null) - { - if (is_array($name)) { - $config = $name; - } - - if ($config === null) { - $config = $this->getTestConfig(); - $config['name'] = $name; - } - - if (is_string($name)) { - $config['name'] = $name; - } - - $config['name'] = $this->createQueueName($config['name']); - - $class = $this->getAdapterFullName(); - - // create queue - if (!class_exists($class)) { - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($class); - } - - set_error_handler(array($this, 'handleErrors')); - try { - $queue = new Zend_Queue($this->getAdapterName(), $config); - } catch (Zend_Queue_Exception $e) { - $this->markTestSkipped($e->getMessage()); - restore_error_handler(); - return false; - } - - // a PHP level error occurred, mark test as failed with error as reason - // (misconfigured test? undefined constant?) - if ($this->error) { - $err = error_get_last(); - $this->markTestFailed($err['message']); - restore_error_handler(); - return false; - } - - restore_error_handler(); - - return $queue; - } - - public function handleErrors($errno, $errstr) - { - $this->error = true; - } - - // test the constants - public function testConst() - { - $this->markTestSkipped('must be tested in each individual adapter'); - } - - public function testGetOptions() - { - $config = $this->getTestConfig(); - $config['setting'] = true; - - if (!$queue = $this->createQueue(__FUNCTION__, $config)) { - return; - } - $adapter = $queue->getAdapter(); - - $new = $adapter->getOptions(); - - $this->assertTrue(is_array($new)); - $this->assertEquals($new['setting'], $config['setting']); - - // delete the queue we created - $queue->deleteQueue(); - } - - // test the constructor - public function testZendQueueAdapterConstructor() - { - $class = $this->getAdapterFullName(); - /** - * @see Zend_Loader - */ - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($class); - - try { - $obj = new $class(true); - $this->fail('__construct() $config must be an array'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $obj = new $class( array()); - $this->fail('__construct() cannot accept an empty array for a configuration'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $obj = new $class(array('name' => 'queue1', 'driverOptions'=>true)); - $this->fail('__construct() $config[\'options\'] must be an array'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $obj = new $class(array('name' => 'queue1', 'driverOptions'=>array('opt'=>'val'))); - $this->fail('__construct() humm I think this test is supposed to work @TODO'); - } catch (Exception $e) { - $this->assertTrue(true); - } - try { - $config = new Zend_Config(array('driverOptions' => array() )); - $obj = new $class($config); - $this->fail('__construct() \'name\' is a required configuration value'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $config = new Zend_Config(array('name' => 'queue1', 'driverOptions' => array(), 'options' => array('opt1' => 'val1'))); - $obj = new $class($config); - $this->fail('__construct() is not supposed to accept a true value for a configuraiton'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - // try passing the queue to the $adapter - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $obj = new $class($queue->getOptions(), $queue); - $this->assertTrue($obj instanceof Zend_Queue_Adapter_AdapterInterface); - } - - // this tests the configuration option $config['messageClass'] - public function testZendQueueMessageTest() - { - $config = $this->getTestConfig(); - $config['messageClass'] = 'Zend_Queue_Message_Test'; - - if (!$queue = $this->createQueue(__FUNCTION__, $config)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - if (! ($adapter->isSupported('send') - && $adapter->isSupported('receive'))) { - - // delete the queue we created - $queue->deleteQueue(); - - $this->markTestSkipped('send() receive() are not supported'); - } - - $body = 'this is a test message'; - $message = $queue->send($body); - - $this->assertTrue($message instanceof Zend_Queue_Message); - - $list = $queue->receive(); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - foreach ( $list as $i => $message ) { - $this->assertTrue($message instanceof Zend_Queue_Message_Test); - $queue->deleteMessage($message); - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testFactory() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $this->assertTrue($queue->getAdapter() instanceof Zend_Queue_Adapter_AdapterInterface); - } - - public function testCreate() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'create'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - if ($adapter->isSupported('getQueues')) { - $this->assertTrue(in_array($queue->getName(), $adapter->getQueues())); - } - - // cannot recreate a queue. - $this->assertFalse($adapter->create($queue->getName())); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testDelete() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'delete'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $new = $this->createQueueName(__FUNCTION__ . '_2'); - $this->assertTrue($adapter->create($new)); - $this->assertTrue($adapter->delete($new)); - - if ($adapter->isSupported('getQueues')) { - if (in_array($new, $adapter->getQueues())) { - $this->fail('delete() failed to delete it\'s queue, but returned true: '. $new); - } - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testIsExists() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'isExists'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $this->assertFalse($adapter->isExists('perl')); - - $new = $this->createQueueName(__FUNCTION__ . '_2'); - $this->assertTrue($adapter->create($new)); - $this->assertTrue($adapter->isExists($new)); - $this->assertTrue($adapter->delete($new)); - - if ($adapter->isSupported('getQueues')) { - if (in_array($new, $adapter->getQueues())) { - $this->fail('delete() failed to delete it\'s queue, but returned true: '. $new); - } - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testSend() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'send'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $body = 'this is a test message'; - $message = $adapter->send($body); - $this->assertTrue($message instanceof Zend_Queue_Message); - - // receive the record we created. - if (! $adapter->isSupported('receive')) { - $messages = $adapter->receive(); - foreach ( $list as $i => $message ) { - $this->assertTrue($message instanceof Zend_Queue_Message_Test); - $queue->deleteMessage($message); - } - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testReceive() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'receive'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - // send the message - $body = 'this is a test message 2'; - $message = $adapter->send($body); - $this->assertTrue($message instanceof Zend_Queue_Message); - - // get it back - $list = $adapter->receive(1); - $this->assertEquals(1, count($list)); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - $this->assertTrue($list->valid()); - - $message = $list->current(); - if ($adapter->isSupported('deleteMessage')) { - $adapter->deleteMessage($list->current()); - } - - $this->assertTrue($message instanceof Zend_Queue_Message); - $this->assertEquals($message->body, $body); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testDeleteMessage() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'deleteMessage'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - // in order to test this we need to send and receive so that the - // test code can send a sample message. - if (! ($adapter->isSupported('send') && $adapter->isSupported('receive'))) { - $this->markTestSkipped('send() and receive() are not supported'); - } - - $body = 'this is a test message'; - $message = $adapter->send($body); - $this->assertTrue($message instanceof Zend_Queue_Message); - - $list = $adapter->receive(); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - $this->assertTrue($list->valid()); - - $message = $list->current(); - $this->assertTrue($message instanceof Zend_Queue_Message); - - $this->assertTrue($adapter->deleteMessage($message)); - - // no more messages, should return false - // stomp and amazon always return true. - $falsePositive = array('Activemq', 'Amazon'); - if (! in_array($this->getAdapterName(), $falsePositive)) { - $this->assertFalse($adapter->deleteMessage($message)); - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testGetQueues() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'getQueues'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - // get a listing of queues - $queues = $adapter->getQueues(); - - // this is an array right? - $this->assertTrue(is_array($queues)); - - // make sure our current queue is in this list. - $this->assertTrue(in_array($queue->getName(), $queues)); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testCount() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'count'; - if (! $adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - // for a test case, the count should be zero at first. - $this->assertEquals($adapter->count(), 0); - if (! $adapter->isSupported('send') && $adapter->isSupported('receive') ) { - $this->markTestSkipped('send() and receive() are not supported'); - } - - $body = 'this is a test message'; - - // send a message - $message = $adapter->send($body); - - // test queue count for being 1 - $this->assertEquals($adapter->count(), 1); - - // receive the message - $message = $adapter->receive(); - - /* we need to delete the messages we put in the queue before - * counting. - * - * not all adapters support deleteMessage, but we should remove - * the messages that we created if we can. - */ - if ( $adapter->isSupported('deleteMessage') ) { - foreach ( $message as $msg ) { - $adapter->deleteMessage($msg); - } - } - - // test the count for being 0 - $this->assertEquals($adapter->count(), 0); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testCapabilities() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - $list = $adapter->getCapabilities(); - $this->assertTrue(is_array($list)); - - // these functions must have an boolean answer - $func = array( - 'create', 'delete', 'send', 'receive', - 'deleteMessage', 'getQueues', 'count', - 'isExists' - ); - - foreach ( array_values($func) as $f ) { - $this->assertTrue(isset($list[$f])); - $this->assertTrue(is_bool($list[$f])); - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testIsSupported() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - $list = $adapter->getCapabilities(); - foreach ( $list as $function => $result ) { - $this->assertTrue(is_bool($result)); - if ( $result ) { - $this->assertTrue($adapter->isSupported($function)); - } else { - $this->assertFalse($adapter->isSupported($function)); - } - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testGetQueue() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - $this->assertTrue($queue === $queue->getAdapter()->getQueue()); - - // delete the queue we created - $queue->deleteQueue(); - } - - /* - * Send about 10 messages, read 5 back, then read 5 back 1 at a time. - * delete all messages and created queue - */ - public function testSampleBehavior() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $this->assertTrue($queue instanceof Zend_Queue); - - if ($queue->isSupported('send')) { - $msg = 1; - - for($i = 0; $i < 10; $i++) { - $queue->send("$msg"); - $msg ++; - } - } - - if ($queue->isSupported('receive')) { - $msg = 1; - $messages = $queue->receive(5); - - foreach($messages as $i => $message) { - $this->assertEquals($msg, $message->body); - $queue->deleteMessage($message); - $msg++; - } - - for($i = 0; $i < 5; $i++) { - $messages = $queue->receive(); - $message = $messages->current(); - $this->assertEquals($msg, $message->body); - $queue->deleteMessage($message); - $msg++; - } - } - - $this->assertEquals(0, count($queue)); - $this->assertTrue($queue->deleteQueue()); - - // delete the queue we created - $queue->deleteQueue(); - } - - /** - * This tests to see if a message is in-visibile for the proper amount of time - * - * adapters that support deleteMessage() by nature will support visibility - */ - public function testVisibility() - { - $debug = false; - $default_timeout = 3; // how long we tell the queue to keep the message invisible - $extra_delay = 2; // how long we are willing to wait for the test to finish before failing - // keep in mind that some queue services are on forigen machines and need network time. - - if (false) { // easy comment/uncomment, set to true or false - $this->markTestSkipped('Visibility testing takes ' . $default_timeout+$extra_delay . ' seconds per adapter, if you wish to test this, uncomment the test case in ' . __FILE__ . ' line ' . __LINE__); - return; - } - - $config = $this->getTestConfig(); - $config['timeout'] = 2; - - if (!$queue = $this->createQueue(__FUNCTION__, $config)) { - return; - } - $adapter = $queue->getAdapter(); - - $not_supported = array('Activemq'); - if ((! $queue->isSupported('deleteMessage')) || in_array($this->getAdapterName(), $not_supported)) { - $queue->deleteQueue(); - $this->markTestSkipped($this->getAdapterName() . ' does not support visibility of messages'); - return; - } - - $body = 'hello world'; - - $queue->send($body); - $messages = $queue->receive(1); // messages are deleted at the bottom. - - if ($queue->isSupported('count')) { - $this->assertEquals(1, count($queue)); - } - - $start = microtime(true); - $end = 0; - - $this->assertTrue($messages instanceof Zend_Queue_Message_Iterator); - - $timeout = $config['timeout'] + $start + $extra_delay; - $found = false; - $check = microtime(true); - - $end = false; - do { - $search = $queue->receive(1); - if ((microtime(true) - $check) > 0.1) { - $check = microtime(true); - if ($debug) echo "Checking - found ", count($search), " messages at : ", $check, "\n"; - } - if ( count($search) > 0 ) { - if ($search->current()->body == $body) { - $found = true; - $end = microtime(true); - } else { - $this->fail('sent message is not the message received'); - } - } - } while ($found === false && microtime(true) < $timeout); - - // record end time - if ($end === false) { - $end = microtime(true); - } - - $duration = sprintf("%5.2f seconds", $end-$start); - /* - There has to be some fuzzyness regarding comparisons because while - the timeout may be honored, the actual code time, database querying - and so on, may take more than the timeout time. - */ - if ($found) { - if (abs(($end-$start) - $config['timeout']) < $extra_delay) { // stupid Db Adapter responds in a fraction less than a second. - $this->assertTrue(true, 'message was invisible for the required amount of time'); - } else { - if ($debug) echo 'required duration of invisibility: ', $config['timeout'], ' seconds; actual duration: ', $duration, "\n"; - $this->fail('message was NOT invisible for the required amount of time'); - } - } else { - $this->fail('message never became visibile duration:' . $duration); - } - if ($debug) echo "duration $duration\n"; - - // now we delete the messages - if ( $adapter->isSupported('deleteMessage') ) { - foreach ( $messages as $msg ) { - $adapter->deleteMessage($msg); - } - } - - - // delete the queue we created - $queue->deleteQueue(); - } - - /** - * tests a function for an exception - * - * @param string $func function name - * @param array $args function arguments - * @return boolean - true if exception, false if not - */ - protected function try_exception($func, $args) - { - $return = false; - - } - - public function testIsSupportException() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - $functions = $adapter->getCapabilities(); - - if (! $functions['create']) { - try { - $adapter->create(__FUNCTION__ . '_2'); - $this->fail('unsupported create() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['delete']) { - try { - $adapter->delete(__FUNCTION__ . '_2'); - $this->fail('unsupported delete() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['send']) { - try { - $adapter->send(__FUNCTION__); - $this->fail('unsupported send() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['receive']) { - try { - $adapter->send(__FUNCTION__); - $this->fail('unsupported receive() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['receive']) { - try { - $adapter->receive(); - $this->fail('unsupported receive() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['deleteMessage']) { - try { - $message = new Zend_Queue_Message(); - $adapter->deleteMessage($message); - $this->fail('unsupported deleteMessage() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['getQueues']) { - try { - $adapter->getQueues(); - $this->fail('unsupported getQueues() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['count']) { - try { - $a = $adapter->count(); - $this->fail('unsupported count() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - if (! $functions['isExists']) { - try { - $a = $adapter->isExists(__FUNCTION__ . '_3'); - $this->fail('unsupported isExists() failed to throw an exception'); - } catch (Exception $e) { - $this->assertTrue(true, 'exception thrown'); - } - } - - // delete the queue we created - $queue->deleteQueue(); - } -} diff --git a/tests/Zend/Queue/Adapter/ArrayTest.php b/tests/Zend/Queue/Adapter/ArrayTest.php deleted file mode 100644 index 4f455f65d1..0000000000 --- a/tests/Zend/Queue/Adapter/ArrayTest.php +++ /dev/null @@ -1,129 +0,0 @@ -getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function getTestConfig() - { - return array('driverOptions' => array()); - } - - // test the constants - public function testConst() - { - $this->markTestSkipped('no constants to test'); - } - - // extra non standard tests - public function test_magic() - { - $queue = $this->createQueue(__FUNCTION__); - $adapter = $queue->getAdapter(); - - $this->assertTrue(is_array($adapter->__sleep())); - $data = serialize($adapter); - $new = unserialize($data); - $this->assertEquals($new->getData(), $adapter->getData()); - } - - public function test_get_setData() - { - $queue = $this->createQueue(__FUNCTION__); - $adapter = $queue->getAdapter(); - - $data = array('test' => 1); - $adapter->setData($data); - $got = $adapter->getData(); - $this->assertEquals($data['test'], $got['test']); - } - - /** - * @group ZF-7650 - */ - public function testReceiveWillRetrieveZeroItems() - { - // Zend_Queue_Adapter_Array - $queue = new Zend_Queue('Array'); - $queue2 = $queue->createQueue('queue'); - - $queue->send('My Test Message 1'); - $queue->send('My Test Message 2'); - - $messages = $queue->receive(0); - $this->assertEquals(0, count($messages)); - } -} diff --git a/tests/Zend/Queue/Adapter/DbTest.php b/tests/Zend/Queue/Adapter/DbTest.php deleted file mode 100644 index 558c699437..0000000000 --- a/tests/Zend/Queue/Adapter/DbTest.php +++ /dev/null @@ -1,164 +0,0 @@ -markTestSkipped('TESTS_ZEND_QUEUE_DB is not enabled in TestConfiguration.php'); - } - date_default_timezone_set('GMT'); - parent::setUp(); - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You must overload this method - * - * @return string - */ - public function getAdapterName() - { - return 'Db'; - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You may overload this method. The default return is - * 'Zend_Queue_Adapter_' . $this->getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function getTestConfig() - { - $driverOptions = array(); - if (defined('TESTS_ZEND_QUEUE_DB')) { - require_once 'Zend/Json.php'; - $driverOptions = Zend_Json::decode(TESTS_ZEND_QUEUE_DB); - } - - return array( - 'options' => array(Zend_Db_Select::FOR_UPDATE => true), - 'driverOptions' => $driverOptions, - ); - } - - // test the constants - public function testConst() - { - $this->markTestSkipped('no constants to test'); - } - - // additional non-standard tests - - public function test_constructor2() - { - try { - $config = $this->getTestConfig(); - /** - * @see Zend_Db_Select - */ - require_once 'Zend/Db/Select.php'; - $config['options'][Zend_Db_Select::FOR_UPDATE] = array(); - $queue = $this->createQueue(__FUNCTION__, $config); - $this->fail('FOR_UPDATE accepted an array'); - } catch (Exception $e) { - $this->assertTrue(true, 'FOR_UPDATE cannot be an array'); - } - - foreach (array('host', 'username', 'password', 'dbname') as $i => $arg) { - try { - $config = $this->getTestConfig(); - unset($config['driverOptions'][$arg]); - $queue = $this->createQueue(__FUNCTION__, $config); - $this->fail("$arg is required but was missing."); - } catch (Exception $e) { - $this->assertTrue(true, $arg . ' is required.'); - } - } - } - - /** - * @group ZF-7650 - */ - public function testReceiveWillRetrieveZeroItems() - { - $options = $this->getTestConfig(); - $options['name'] = '/temp-queue/ZF7650'; - - $queue = new Zend_Queue('Db', $options); - $queue2 = $queue->createQueue('queue'); - - $queue->send('My Test Message 1'); - $queue->send('My Test Message 2'); - - $messages = $queue->receive(0); - $this->assertEquals(0, count($messages)); - } -} - diff --git a/tests/Zend/Queue/Adapter/Iterator2.php b/tests/Zend/Queue/Adapter/Iterator2.php deleted file mode 100644 index ef0aa45ef5..0000000000 --- a/tests/Zend/Queue/Adapter/Iterator2.php +++ /dev/null @@ -1,41 +0,0 @@ -markTestSkipped('TESTS_ZEND_QUEUE_MEMCACHEQ_ENABLED is not enabled in TestConfiguration.php'); - } - if (!extension_loaded('memcache')) { - $this->markTestSkipped('memcache extension not loaded'); - } - date_default_timezone_set('GMT'); - parent::setUp(); - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You must overload this method - * - * @return string - */ - public function getAdapterName() - { - return 'Memcacheq'; - } - - /** - * getAdapterName() is an method to help make AdapterTest work with any - * new adapters - * - * You may overload this method. The default return is - * 'Zend_Queue_Adapter_' . $this->getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function getTestConfig() - { - $driverOptions = array(); - if (defined('TESTS_ZEND_QUEUE_MEMCACHEQ_HOST')) { - $driverOptions['host'] = TESTS_ZEND_QUEUE_MEMCACHEQ_HOST; - } - if (defined('TESTS_ZEND_QUEUE_MEMCACHEQ_PORT')) { - $driverOptions['port'] = TESTS_ZEND_QUEUE_MEMCACHEQ_PORT; - } - return array('driverOptions' => $driverOptions); - } - - // test the constants - public function testConst() - { - /** - * @see Zend_Queue_Adapter_Memcacheq - */ - require_once 'Zend/Queue/Adapter/Memcacheq.php'; - $this->assertTrue(is_string(Zend_Queue_Adapter_Memcacheq::DEFAULT_HOST)); - $this->assertTrue(is_integer(Zend_Queue_Adapter_Memcacheq::DEFAULT_PORT)); - $this->assertTrue(is_string(Zend_Queue_Adapter_Memcacheq::EOL)); - } - - /** - * @group ZF-7650 - */ - public function testReceiveWillRetrieveZeroItems() - { - $options = array('name' => 'ZF7650', 'driverOptions' => $this->getTestConfig()); - - $queue = new Zend_Queue('Memcacheq', $options); - $queue2 = $queue->createQueue('queue'); - - $queue->send('My Test Message 1'); - $queue->send('My Test Message 2'); - - $messages = $queue->receive(0); - $this->assertEquals(0, count($messages)); - } -} diff --git a/tests/Zend/Queue/Adapter/MessageTestClass.php b/tests/Zend/Queue/Adapter/MessageTestClass.php deleted file mode 100644 index 6e90b2e211..0000000000 --- a/tests/Zend/Queue/Adapter/MessageTestClass.php +++ /dev/null @@ -1,33 +0,0 @@ -getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function getTestConfig() - { - return array('driverOptions' => array()); - } - - // test the constants - public function testConst() - { - } -} diff --git a/tests/Zend/Queue/Adapter/PlatformJobQueueTest.php b/tests/Zend/Queue/Adapter/PlatformJobQueueTest.php deleted file mode 100644 index c83dd4fbb5..0000000000 --- a/tests/Zend/Queue/Adapter/PlatformJobQueueTest.php +++ /dev/null @@ -1,329 +0,0 @@ -markTestSkipped(); - } - } - - /** - * getAdapterName() is a method to help make AdapterTest work with any - * new adapters - * - * You must overload this method - * - * @return string - */ - public function getAdapterName() - { - return 'PlatformJobQueue'; - } - - public function getTestConfig() - { - return array('daemonOptions' => array( - 'host' => constant('TESTS_ZEND_QUEUE_PLATFORMJQ_HOST'), - 'password' => constant('TESTS_ZEND_QUEUE_PLATFORMJQ_PASS'), - )); - } - - /** - * getAdapterFullName() is a method to help make AdapterTest work with any - * new adapters - * - * You may overload this method. The default return is - * 'Zend_Queue_Adapter_' . $this->getAdapterName() - * - * @return string - */ - public function getAdapterFullName() - { - return 'Zend_Queue_Adapter_' . $this->getAdapterName(); - } - - public function testFailedConstructor() - { - try { - $queue = $this->createQueue(__FUNCTION__, array()); - $this->fail('The test should fail if no host and password are passed'); - } catch (Exception $e) { - $this->assertTrue( true, 'Job Queue host and password should be provided'); - } - - try { - $queue = $this->createQueue(__FUNCTION__, array('daemonOptions' => array())); - $this->fail('The test should fail if no host is passed'); - } catch (Exception $e) { - $this->assertTrue(true, 'Platform Job Queue host should be provided'); - } - - try { - $queue = $this->createQueue(__FUNCTION__, array('daemonOptions' => array('host' => 'localhost'))); - $this->fail('The test should fail if no password is passed'); - } catch (Exception $e) { - $this->assertTrue(true, 'Platform Job Queue password should be provided'); - } - } - - // this tests the configuration option $config['messageClass'] - public function testZendQueueMessageTest() - { - $config = $this->getTestConfig(); - - if (!$queue = $this->createQueue(__FUNCTION__, $config)) { - return; - } - - $message = $queue->send(array('script' => 'info.php')); - - $this->assertTrue($message instanceof Zend_Queue_Message); - - $list = $queue->receive(); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - foreach ( $list as $message ) { - $this->assertTrue($message instanceof Zend_Queue_Message_PlatformJob); - $queue->deleteMessage($message); - } - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testSend() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - $message = $adapter->send(array('script' => 'info.php')); - $this->assertTrue($message instanceof Zend_Queue_Message); - - $list = $queue->receive(); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - - foreach ($list as $message) { - $this->assertTrue($message instanceof Zend_Queue_Message_PlatformJob); - $queue->deleteMessage($message); - } - - // delete the queue we created - $queue->deleteQueue(); - - } - - public function testReceive() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'receive'; - if (!$adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $scriptName = 'info.php'; - - // send the message - $message = $adapter->send((array('script' => $scriptName))); - $this->assertTrue($message instanceof Zend_Queue_Message); - - // get it back - $list = $adapter->receive(1); - $this->assertEquals(1, count($list)); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - $this->assertTrue($list->valid()); - - $message = $list->current(); - if ($adapter->isSupported('deleteMessage')) { - $adapter->deleteMessage($list->current()); - } - - $this->assertTrue($message instanceof Zend_Queue_Message); - $this->assertEquals($message->getJob()->getScript(), $scriptName); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testDeleteMessage() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'receive'; - if (!$adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $scriptName = 'info.php'; - - // send the message - $message = $adapter->send((array('script' => $scriptName))); - $this->assertTrue($message instanceof Zend_Queue_Message); - - // get it back - $list = $adapter->receive(1); - $this->assertEquals(1, count($list)); - $this->assertTrue($list instanceof Zend_Queue_Message_Iterator); - $this->assertTrue($list->valid()); - - $message = $list->current(); - if ($adapter->isSupported('deleteMessage')) { - $adapter->deleteMessage($list->current()); - } - - $this->assertTrue($message instanceof Zend_Queue_Message); - $this->assertEquals($message->getJob()->getScript(), $scriptName); - - $id = $message->getJob()->getID(); - $this->assertFalse($adapter->isJobIdExist($id)); - - // delete the queue we created - $queue->deleteQueue(); - - } - - public function testCount() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $adapter = $queue->getAdapter(); - - // check to see if this function is supported - $func = 'count'; - if (!$adapter->isSupported($func)) { - $this->markTestSkipped($func . '() is not supported'); - return; - } - - $initCount = $adapter->count(); - - // send a message - $message = $adapter->send(array('script' => 'info.php')); - - // test queue count for being 1 - $this->assertEquals($adapter->count(), ($initCount + 1)); - - // receive the message - $message = $adapter->receive(); - - /* we need to delete the messages we put in the queue before - * counting. - * - * not all adapters support deleteMessage, but we should remove - * the messages that we created if we can. - */ - if ($adapter->isSupported('deleteMessage')) { - foreach ($message as $msg) { - $adapter->deleteMessage($msg); - } - } - - // test the count for being 0 - $this->assertEquals($adapter->count(), $initCount); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testSampleBehavior() - { - if (!$queue = $this->createQueue(__FUNCTION__)) { - return; - } - $this->assertTrue($queue instanceof Zend_Queue); - - $initCount = $queue->count(); - - $scriptName = 'info.php'; - - for ($i = 0; $i < 10; $i++) { - $queue->send(array('script' => $scriptName)); - } - - $messages = $queue->receive(5); - - foreach($messages as $i => $message) { - $this->assertEquals($message->getJob()->getScript(), $scriptName); - $queue->deleteMessage($message); - } - - for ($i = 0; $i < 5; $i++) { - $messages = $queue->receive(); - $message = $messages->current(); - $queue->deleteMessage($message); - } - - $this->assertEquals($initCount, count($queue)); - $this->assertTrue($queue->deleteQueue()); - - // delete the queue we created - $queue->deleteQueue(); - } - - public function testVisibility() - { - $this->markTestSkipped('testVisibility unsupported'); - } - - // test the constants - public function testConst() - { - $this->markTestSkipped('no constants to test'); - } -} diff --git a/tests/Zend/Queue/Adapter/WARNING.txt b/tests/Zend/Queue/Adapter/WARNING.txt deleted file mode 100644 index 8ff2b93e71..0000000000 --- a/tests/Zend/Queue/Adapter/WARNING.txt +++ /dev/null @@ -1,5 +0,0 @@ -A note to those who are writing test cases. - -Besure to receive() for every send() otherwise previous failed tests will interfere with future tests. - -If necessary you may have to delete the queue before creating it. diff --git a/tests/Zend/Queue/AllTests.php b/tests/Zend/Queue/AllTests.php deleted file mode 100644 index cc3ce5a327..0000000000 --- a/tests/Zend/Queue/AllTests.php +++ /dev/null @@ -1,103 +0,0 @@ -addTestSuite('Zend_Queue_FactoryTest'); - - // Queue testing - $suite->addTestSuite('Zend_Queue_Queue1Test'); // Zend_Queue_Adapter_Array - $suite->addTestSuite('Zend_Queue_Queue2Test'); // Zend_Queue_Adapter_Null - - // Message testing - $suite->addTestSuite('Zend_Queue_MessageTest'); - $suite->addTestSuite('Zend_Queue_Message_IteratorTest'); - - // Adapter testing - $suite->addTestSuite('Zend_Queue_Adapter_ArrayTest'); - $suite->addTestSuite('Zend_Queue_Adapter_MemcacheqTest'); - $suite->addTestSuite('Zend_Queue_Adapter_DbTest'); - $suite->addTestSuite('Zend_Queue_Adapter_NullTest'); - $suite->addTestSuite('Zend_Queue_Adapter_PlatformJobQueueTest'); - - // Stomp protocol testing - $suite->addTestSuite('Zend_Queue_Stomp_FrameTest'); - $suite->addTestSuite('Zend_Queue_Stomp_ClientTest'); - - // Message Queues dependent on Stomp - $suite->addTestSuite('Zend_Queue_Adapter_ActivemqTest'); - $suite->addTestSuite('Zend_Queue_Adapter_ActivemqOfflineTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Queue_AllTests::main') { - Zend_Queue_AllTests::main(); -} diff --git a/tests/Zend/Queue/Custom/DbForUpdate.php b/tests/Zend/Queue/Custom/DbForUpdate.php deleted file mode 100644 index 991815dc8b..0000000000 --- a/tests/Zend/Queue/Custom/DbForUpdate.php +++ /dev/null @@ -1,123 +0,0 @@ -_queue; - } - - $msgs = array(); - - $info = $this->_msg_table->info(); - - $microtime = microtime(true); // cache microtime - - $db = $this->_msg_table->getAdapter(); - - try { - // transaction must start before the select query. - $db->beginTransaction(); - - // changes: added forUpdate - $query = $db->select()->forUpdate(); - $query->from($info['name'], array('*')); - $query->where('queue_id=?', $this->getQueueId($queue->getName())); - $query->where('handle IS NULL OR timeout+' . (int)$timeout . ' < ' . (int)$microtime); - $query->limit($maxMessages); - - foreach ($db->fetchAll($query) as $data) { - // setup our changes to the message - $data['handle'] = md5(uniqid(rand(), true)); - - $update = array( - 'handle' => $data['handle'], - 'timeout' => $microtime - ); - - // update the database - $where = array(); - $where[] = $db->quoteInto('message_id=?', $data['message_id']); - - $count = $db->update($info['name'], $update, $where); - - // we check count to make sure no other thread has gotten - // the rows after our select, but before our update. - if ($count > 0) { - $msgs[] = $data; - } - } - $db->commit(); - } catch (Exception $e) { - $db->rollBack(); - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception($e->getMessage(), $e->getCode()); - } - - $config = array( - 'queue' => $queue, - 'data' => $msgs, - 'messageClass' => $queue->getMessageClass() - ); - - $classname = $queue->getMessageSetClass(); - Zend_Loader::loadClass($classname); - return new $classname($config); - } -} diff --git a/tests/Zend/Queue/Custom/Message.php b/tests/Zend/Queue/Custom/Message.php deleted file mode 100644 index 0b2b4d6708..0000000000 --- a/tests/Zend/Queue/Custom/Message.php +++ /dev/null @@ -1,119 +0,0 @@ -setBody($mixed); - $this->_connected = false; - } - } - - /** - * We need to get the underlying body as a string - * - * @return string - */ - public function __toString() { - return $this->_data['body']; - } - - /** - * Sets the message body - * - * @param serializable $mixed - */ - public function setBody($mixed) - { - $this->_data['body'] = serialize($mixed); - } - - /** - * Gets the message body - * - * @return $mixed - */ - public function getBody() - { - return unserialize($this->_data['body']); - } - - /** - * Deletes the message. - * - * Note you cannot be disconnected from queue. - * - * $throw is set to to true, because most of the time you want to know if - * there is an error. However, in Custom_Messages::__destruct() exceptions - * cannot be thrown. - * - * These does not create a circular reference loop. Because deleteMessage - * asks the queue service to delete the message, the message located here - * is NOT deleted. - * - * @param boolean $throw defaults to true. Throw a message if there is an error - * - * @throws Zend_Queue_Exception if not connected - */ - public function delete($throw = true) - { - if ($this->_connected) { - if ($this->getQueue()->getAdapter()->isSupported('deleteMessage')) { - $this->getQueue()->deleteMessage($this); - } - } elseif ($throw) { - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('Disconnected from queue. Cannot delete message from queue.'); - } - } -} diff --git a/tests/Zend/Queue/Custom/Messages.php b/tests/Zend/Queue/Custom/Messages.php deleted file mode 100644 index 03a1659571..0000000000 --- a/tests/Zend/Queue/Custom/Messages.php +++ /dev/null @@ -1,178 +0,0 @@ -array()); - */ - public function __construct(array $config=array()) - { - if (isset($config['queue'])) { - $this->_queue = $config['queue']; - $this->_queueClass = get_class($this->_queue); - $this->_connected = true; - } else { - $this->_connected = false; - } - - if (isset($config['messageClass'])) { - $this->_messageClass = $config['messageClass']; - } - - if (isset($config['data']) && ! is_array($config['data'])) { - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('array configuration must have $config[\'data\'] = array'); - } - - // load the message class - $class = $this->_messageClass; - Zend_Loader::loadClass($class); - - if (isset($config['data'])) { - // for each of the messages - foreach($config['data'] as $i => $data) { - // construct the message parameters - $message = array('data' => $data); - - // If queue has not been set, then use the default. - if (empty($message['queue'])) { - $message['queue'] = $this->_queue; - } - - // construct the message and add it to _data[]; - $this->_data[] = new $class($message); - } - } - } - - /** - * Our destruct will delete all the messages in the queue - * - * Notice: if anything throws a message we are doomed. - * You cannot throw an error in an destructor - */ - public function __destruct() - { - if ($this->_connected) { - foreach ($this->_data as $i => $value) { - $value->delete(false); - } - } else { - unset($this->_data); - } - } - - /* - * ArrayIterator - */ - - /** - * @see SPL ArrayIterator::append - */ - public function append($value) { - $this->_data[] = $value; - } - - /* - * ArrayAccess - */ - - /** - * @see SPL ArrayAccess::offsetSet - */ - public function offsetSet($offset, $value) { - if (! $value instanceof Custom_Message) { - $msg = '$value must be a child or an instance of Custom_Messag'; - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception($msg); - } - - $this->_data[$offset] = $value; - return $value; - } - - /** - * @see SPL ArrayAccess::offsetGet - */ - public function offsetGet($offset) { - return $this->_data[$offset]; - } - - /** - * @see SPL ArrayAccess::offsetUnset - */ - public function offsetUnset($offset) { - if (! $this->_connected) { - $msg = 'Cannot delete message after serialization'; - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception($msg); - } - - $this->_data[$offset]->delete(); // Custom_Message added this function - unset($this->_data[$offset]); - } - - /** - * @see SPL ArrayAccess::offsetExists - */ - public function offsetExists($offset) { - return isSet($this->_data[$offset]); - } - - /* - * SeekableIterator implementation - */ - - /** - * @see SPL SeekableIterator::seek - */ - public function seek($index) { - $this->_pointer = $index; - } -} diff --git a/tests/Zend/Queue/Custom/Queue.php b/tests/Zend/Queue/Custom/Queue.php deleted file mode 100644 index e7adc853dc..0000000000 --- a/tests/Zend/Queue/Custom/Queue.php +++ /dev/null @@ -1,94 +0,0 @@ -createQueue(); - * - * @param Zend_Queue_Adapter_Abstract|string $adapter adapter object or class name - * @param Zend_Config|array $config Zend_Config or an configuration array - */ - public function __construct() - { - $args = func_get_args(); - call_user_func_array(array($this, 'parent::__construct'), $args); - - $this->setMessageClass('Custom_Message'); - $this->setMessageSetClass('Custom_Messages'); - } - - /** - * Send a message to the queue - * - * @param Custom_Message|Custom_Messages $message message - * @return $this - * @throws Zend_Queue_Exception - */ - public function send($message) - { - if (! ($message instanceof Custom_Message || $message instanceof Custom_Messages) ) { - /** - * @see Zend_Queue_Exception - */ - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('$message must be an instance of Custom_Message or Custom_Messages'); - } - if ($message instanceof Custom_Message) { - $response = parent::send($message->__toString()); - } else { - foreach($message as $i => $one) { - $response = parent::send($one->__toString()); - } - } - - return $this; - } -} diff --git a/tests/Zend/Queue/CustomTest.php b/tests/Zend/Queue/CustomTest.php deleted file mode 100644 index d8e2e2fda3..0000000000 --- a/tests/Zend/Queue/CustomTest.php +++ /dev/null @@ -1,154 +0,0 @@ -a; - } - - public function setA($a) - { - $this->a = $a; - } - - public function __sleep() - { - return array('a'); // serialize only this variable - } -} - -class Zend_Queue_CustomTest extends PHPUnit_Framework_TestCase -{ - public function test_behavior() - { - $object_count = 10; - $objects = array(); - - $queue = new Custom_Queue('Array', array('name'=>'ObjectA')); - $this->assertTrue($queue instanceof Custom_Queue); - - // ------------------------------------------------ send - - // add items $objects[0-4] - $objects = array(); - for ($i = 0; $i < $object_count-5; $i++) { - $object = new Custom_Object(); - $queue->send(new Custom_Message($object)); - $objects[] = $object; - } - - // add items $objects[5-9] - $messages = new Custom_Messages(); - for ($i = 0; $i < 5; $i++) { - $object = new Custom_Object(); - $messages->append( new Custom_Message($object)); - $objects[] = $object; - } - $queue->send($messages); - - $this->assertEquals($object_count, count($queue)); - unset($messages); - - // ------------------------------------------------ receive - - // get the first 5 doing 0-4 - $receive = $queue->receive(5); - $this->assertTrue($receive instanceof Custom_Messages); - $this->assertEquals(5, count($receive)); - - // test them - for ($index = 0; $index < 5; $index++) { - $this->assertEquals($objects[$index]->getA(), $receive[$index]->getBody()->getA()); - try { - unset($receive[$index]); - $this->assertTrue(true, '$receive[$index] successfully deleted'); - } catch(Zend_Queue_Exception $e) { - $this->fail('$receive[$index] should have been deleted' . $e->getMessage()); - } - } - // there should only be 5 objects left - $this->assertEquals($object_count - $index, count($queue)); - - // get 1 doing $objects[5] - $receive = $queue->receive(); - $index++; - $this->assertTrue($receive instanceof Custom_Messages); - $this->assertEquals(1, count($receive)); - - // testing Custom_Messages::__deconstruct() - unset($receive); - $this->assertEquals($object_count - $index, count($queue)); - - - // get all the rest doing 6-20 - $receive = $queue->receive($object_count - $index); - $this->assertTrue($receive instanceof Custom_Messages); - $this->assertEquals($object_count - $index, count($receive)); - - // test them - $r_index = -1; - for (; $index < $object_count; $index++) { - $r_index++; - $this->assertEquals($objects[$index]->getA(), $receive[$r_index]->getBody()->getA()); - - try { - unset($receive[$r_index]); - $this->assertTrue(true, '$receive[$index] successfully deleted'); - } catch(Zend_Queue_Exception $e) { - $this->fail('$receive[$index] should have been deleted' . $e->getMessage()); - } - } - - // auto-delete should have been called on $receive - $this->assertEquals(0, count($queue)); - } -} diff --git a/tests/Zend/Queue/FactoryTest.php b/tests/Zend/Queue/FactoryTest.php deleted file mode 100644 index 37dbbaf95d..0000000000 --- a/tests/Zend/Queue/FactoryTest.php +++ /dev/null @@ -1,116 +0,0 @@ -markTestSkipped('Db setup required'); - } - - $options = json_decode(TESTS_ZEND_QUEUE_DB, true); - - $config = array('name' => 'queue1', - 'driverOptions' => array('host' => $options['host'], - 'username' => $options['username'], - 'password' => $options['password'], - 'dbname' => $options['dbname'], - 'type' => $options['type'], - 'port' => $options['port'])); // optional parameter - - $adapter = new Zend_Queue('Db', $config); - - $this->assertTrue($adapter instanceof Zend_Queue); - } - - public function testMemcacheq() - { - if ( TESTS_ZEND_QUEUE_MEMCACHEQ_HOST === false || - TESTS_ZEND_QUEUE_MEMCACHEQ_PORT === false ) { - $this->markTestSkipped('MemcacheQ setup required'); - } - - $config = array('name' => 'queue1', - 'driverOptions' => array('host' => TESTS_ZEND_QUEUE_MEMCACHEQ_HOST, - 'port' => TESTS_ZEND_QUEUE_MEMCACHEQ_PORT)); - - $adapter = new Zend_Queue('Memcacheq', $config); - - $this->assertTrue($adapter instanceof Zend_Queue); - } - - public function testActivemq() - { - if ( TESTS_ZEND_QUEUE_ACTIVEMQ_SCHEME === false || - TESTS_ZEND_QUEUE_ACTIVEMQ_HOST === false || - TESTS_ZEND_QUEUE_ACTIVEMQ_PORT === false ) { - $this->markTestSkipped('ActiveMQ setup required'); - } - - $config = array('name' => 'queue1', - 'driverOptions' => array('host' => TESTS_ZEND_QUEUE_ACTIVEMQ_HOST, - 'port' => TESTS_ZEND_QUEUE_ACTIVEMQ_PORT, - 'scheme' => TESTS_ZEND_QUEUE_ACTIVEMQ_SCHEME, - 'username' => '', - 'password' => '')); - - $adapter = new Zend_Queue('Activemq', $config); - - $this->assertTrue($adapter instanceof Zend_Queue); - } - - public function testArray() - { - $config = array('name' => 'queue1', - 'driverOptions' => array()); - - $adapter = new Zend_Queue('Array', $config); - - $this->assertTrue($adapter instanceof Zend_Queue); - } -} diff --git a/tests/Zend/Queue/Message/IteratorTest.php b/tests/Zend/Queue/Message/IteratorTest.php deleted file mode 100644 index 4a1ea9308b..0000000000 --- a/tests/Zend/Queue/Message/IteratorTest.php +++ /dev/null @@ -1,164 +0,0 @@ -options = array( - 'name' => 'queue1', - 'params' => array(), - ); - - $this->queue = new Zend_Queue('array', $this->options); - - // construct messages - $this->message_count = 5; - $data = array(); - $datum = array(); - for ($i = 0; $i < $this->message_count; $i++) { - $data[] = array( - 'id' => $i+1, - 'handle' => null, - 'body' => 'Hello world' // This is my 2524'th time writing that. - ); - } - - $options = array( - 'queue' => $this->queue, - 'data' => $data, - 'messageClass' => $this->queue->getMessageClass() - ); - - $classname = $this->queue->getMessageSetClass(); - if (!class_exists($classname)) { - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($classname); - } - $this->messages = new $classname($options); - } - - - public function test_setup() - { - $this->assertTrue($this->queue instanceof Zend_Queue); - $this->assertTrue(is_array($this->options)); - - foreach ($this->messages as $i => $message) { - $this->assertTrue($message instanceof Zend_Queue_Message); - $this->assertEquals('Hello world', $message->body); - } - } - - protected function tearDown() - { - } - - public function testConstruct() - { - $this->assertTrue($this->messages instanceof Zend_Queue_Message_Iterator); - - // parameter validation - try { - $config = $this->options; - $config['data']='ops'; - - $classname = $this->queue->getMessageSetClass(); - Zend_Loader::loadClass($classname); - $this->messages = new $classname($config); - $this->fail('config[data] must be an array. a message should have been thrown'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function test_count() - { - $this->assertEquals($this->message_count, count($this->messages)); - } - - public function test_magic() - { - $this->assertTrue(is_array($this->messages->__sleep())); - - $messages = serialize($this->messages); - $woken = unserialize($messages); - $this->assertEquals($this->messages->current()->body, $woken->current()->body); - } - - public function test_get_setQueue() - { - $queue = $this->messages->getQueue(); - $this->assertTrue($queue instanceof Zend_Queue); - - $this->assertTrue($this->messages->setQueue($queue)); - } - - public function test_getQueueClass() - { - $this->assertEquals(get_class($this->queue), $this->messages->getQueueClass()); - } - - public function test_iterator() - { - foreach ($this->messages as $i => $message) { - $this->assertEquals('Hello world', $message->body); - } - } - - public function test_toArray() - { - $array = $this->messages->toArray(); - $this->assertTrue(is_array($array)); - $this->assertEquals($this->message_count, count($array)); - $this->assertEquals('Hello world', $array[0]['body']); - } - -} diff --git a/tests/Zend/Queue/MessageTest.php b/tests/Zend/Queue/MessageTest.php deleted file mode 100644 index e001c4539f..0000000000 --- a/tests/Zend/Queue/MessageTest.php +++ /dev/null @@ -1,199 +0,0 @@ -options = array( - 'name' => 'queue1', - 'params' => array(), - ); - - $this->queue = new Zend_Queue('array', $this->options); - - $this->data = array( - 'id' => 123, - 'handle' => 567, - 'body' => 'Hello world' // This is my 2524'th time writing that. - ); - - $this->options = array( - 'queue' => $this->queue, - 'data' => $this->data, - ); - - $this->message = new Zend_Queue_Message($this->options); - } - - protected function tearDown() - { - } - - public function testConstruct() - { - try { - $message = new Zend_Queue_Message($this->options); - $this->assertTrue(true); - } catch (Exception $e) { - $this->fail('should have gotten a valid object'); - } - - // parameter verification - try { - $config2 = $this->options; - $config2['queue'] = 'weee'; - $message = new Zend_Queue_Message($config2); - $this->fail('should have thrown an exception bad queue var'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $config2 = $this->options; - $config2['data'] = 'weee'; - $message = new Zend_Queue_Message($config2); - $this->fail('should have thrown an exception bad queue var'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function testMagic() - { - $this->assertEquals(123, $this->message->__get('id')); - $this->assertEquals(123, $this->message->id); - $this->assertEquals('Hello world', $this->message->body); - $this->message->__set('id', 'abc'); - $this->assertEquals('abc', $this->message->__get('id')); - $this->assertTrue($this->message->__isset('id')); - - try { - $this->message->__get('hello world'); - $this->fail('key is NOT in variable, should have thrown an exception'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $this->message->__set('hello world', 'good bye'); - $this->fail('key is NOT in variable, should have thrown an exception'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $message = new Zend_Queue_Message($this->options); - $this->assertTrue(true); - } catch (Exception $e) { - $this->fail('should have gotten a valid object'); - } - - // parameter verification - try { - $config2 = $this->options; - $config2['queue'] = 'weee'; - $message = new Zend_Queue_Message($config2); - $this->fail('should have thrown an exception bad queue var'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $config2 = $this->options; - $config2['data'] = 'weee'; - $message = new Zend_Queue_Message($config2); - $this->fail('should have thrown an exception bad queue var'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function test_set_getQueue() - { - $this->assertTrue($this->message->getQueue() instanceof Zend_Queue); - - $class = $this->message->getQueueClass(); - $this->assertEquals('Zend_Queue', $class); - - $this->assertTrue($this->message->setQueue($this->message->getQueue())); - - // parameter verification - - try { - $null = new Zend_Queue('Null', array()); - $this->message->setQueue($null); - $this->fail('invalid class passed to setQueue()'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function test_array() - { - $array = $this->message->toArray(); - $this->assertTrue(is_array($array)); - - $array['id'] = 'hello'; - $this->message->setFromArray($array); - - $this->assertEquals('hello', $this->message->id); - } - - public function test_magic() - { - $this->assertTrue(is_array($this->message->__sleep())); - - $message = serialize($this->message); - $woken = unserialize($message); - $this->assertEquals($this->message->body, $woken->body); - } - -} diff --git a/tests/Zend/Queue/Queue1Test.php b/tests/Zend/Queue/Queue1Test.php deleted file mode 100644 index d78c852798..0000000000 --- a/tests/Zend/Queue/Queue1Test.php +++ /dev/null @@ -1,55 +0,0 @@ -config = array( - 'name' => 'queue1' - ); - - $this->queue = new Zend_Queue('Array', $this->config); - } -} diff --git a/tests/Zend/Queue/Queue2Test.php b/tests/Zend/Queue/Queue2Test.php deleted file mode 100644 index 12786519fd..0000000000 --- a/tests/Zend/Queue/Queue2Test.php +++ /dev/null @@ -1,53 +0,0 @@ -config = array( - 'name' => 'queue1' - ); - - $this->queue = new Zend_Queue('Null', $this->config); - } -} diff --git a/tests/Zend/Queue/QueueBaseTest.php b/tests/Zend/Queue/QueueBaseTest.php deleted file mode 100644 index 54f7403e5c..0000000000 --- a/tests/Zend/Queue/QueueBaseTest.php +++ /dev/null @@ -1,270 +0,0 @@ -config = array( - 'name' => 'queue1', - ); - - $this->queue = new Zend_Queue('Null', $this->config); - } - - protected function tearDown() - { - } - - public function testConst() - { - $this->assertTrue(is_string(Zend_Queue::TIMEOUT)); - $this->assertTrue(is_integer(Zend_Queue::VISIBILITY_TIMEOUT)); - $this->assertTrue(is_string(Zend_Queue::NAME)); - } - - /** - * Constructor - * - * @param string|Zend_Queue_Adapter_Abstract $adapter - * @param array $config - */ - public function testConstruct() - { - // Test Zend_Config - $config = array( - 'name' => 'queue1', - 'params' => array(), - 'adapter' => 'array' - ); - - $zend_config = new Zend_Config($config); - - $obj = new Zend_Queue($config); - $this->assertTrue($obj instanceof Zend_Queue); - - $obj = new Zend_Queue($zend_config); - $this->assertTrue($obj instanceof Zend_Queue); - - try { - $obj = new Zend_Queue('ops'); - $this->fail('Zend_Queue cannot accept a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function testDebugInfo() - { - $this->assertTrue(is_array($this->queue->debugInfo())); - // var_dump($this->queue->debugInfo()); - } - - public function testGetOptions() - { - $options = $this->queue->getOptions(); - $this->assertTrue(is_array($options)); - $this->assertEquals($this->config['name'], $options['name']); - } - - public function testSetAndGetAdapter() - { - $adapter = new Zend_Queue_Adapter_Array($this->config); - $this->assertTrue($this->queue->setAdapter($adapter) instanceof Zend_Queue); - $this->assertTrue($this->queue->getAdapter($adapter) instanceof Zend_Queue_Adapter_Array); - } - - public function testSetAndGetMessageClass() - { - $class = 'test'; - $this->assertTrue($this->queue->setMessageClass($class) instanceof Zend_Queue); - $this->assertEquals($class, $this->queue->getMessageClass()); - } - - public function testSetAndGetMessageSetClass() - { - $class = 'test'; - $this->assertTrue($this->queue->setMessageSetClass($class) instanceof Zend_Queue); - $this->assertEquals($class, $this->queue->getMessageSetClass()); - } - - public function testSetAndGetName() - { - $this->assertEquals($this->config['name'], $this->queue->getName()); - } - - public function testCreateAndDeleteQueue() - { - // parameter testing - try { - $this->queue->createQueue(array()); - $this->fail('createQueue() $name must be a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $this->queue->createQueue('test', 'test'); - $this->fail('createQueue() $timeout must be an integer'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - // isExists - $queue = 'test'; - $new = $this->queue->createQueue($queue); - $this->assertTrue($new instanceof Zend_Queue); - - // createQueue() will return true if the adapter cannot - // do isExist($queue); - // $this->assertFalse($this->queue->createQueue($queue)); - - if ($new->isSupported('deleteQueue')) { - $this->assertTrue($new->deleteQueue()); - } - } - - public function testSendAndCountAndReceiveAndDeleteMessage() - { - if (! $this->queue->isSupported('send') - && ! $this->queue->isSupported('receive') - && ! $this->queue->isSupported('count')) { - $this->markTestSkipped('send/count/receive are not supported'); - return; - } - - // ------------------------------------ send() - // parameter verification - try { - $this->queue->send(array()); - $this->fail('send() $mesage must be a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - $message = 'Hello world'; // never gets boring! - $this->assertTrue($this->queue->send($message) instanceof Zend_Queue_Message); - - // ------------------------------------ count() - $this->assertEquals($this->queue->count(), 1); - - // ------------------------------------ receive() - // parameter verification - try { - $this->queue->receive(array()); - $this->fail('receive() $maxMessages must be a integer or null'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $this->queue->receive(1, array()); - $this->fail('receive() $timeout must be a integer or null'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - $messages = $this->queue->receive(); - $this->assertTrue($messages instanceof Zend_Queue_Message_Iterator); - - // ------------------------------------ deleteMessage() - foreach ($messages as $i => $message) { - $this->assertTrue($this->queue->deleteMessage($message)); - } - } - - public function testCapabilities() - { - $list = $this->queue->getCapabilities(); - $this->assertTrue(is_array($list)); - - // these functions must have an boolean answer - $func = array( - 'create', 'delete', 'send', 'receive', - 'deleteMessage', 'getQueues', 'count', - 'isExists' - ); - - foreach ( array_values($func) as $f ) { - $this->assertTrue(isset($list[$f])); - $this->assertTrue(is_bool($list[$f])); - } - } - - public function testIsSupported() - { - $list = $this->queue->getCapabilities(); - foreach ( $list as $function => $result ) { - $this->assertTrue(is_bool($result)); - if ( $result ) { - $this->assertTrue($this->queue->isSupported($function)); - } else { - $this->assertFalse($this->queue->isSupported($function)); - } - } - } - - public function testGetQueues() - { - if ($this->queue->isSupported('getQueues')) { - $queues = $this->queue->getQueues(); - $this->assertTrue(is_array($queues)); - $this->assertTrue(in_array($this->config['name'], $queues)); - } else { - try { - $queues = $this->queue->getQueues(); - $this->fail('getQueues() should have thrown an error'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - } -} diff --git a/tests/Zend/Queue/QueueTest.php b/tests/Zend/Queue/QueueTest.php deleted file mode 100644 index 70f26e6f41..0000000000 --- a/tests/Zend/Queue/QueueTest.php +++ /dev/null @@ -1,240 +0,0 @@ -config = array( - 'name' => 'queue1', - 'params' => array(), - ); - - $this->queue = new Zend_Queue('array', $this->config); - } - - protected function tearDown() - { - } - - public function testConst() - { - $this->assertTrue(is_string(Zend_Queue::TIMEOUT)); - $this->assertTrue(is_integer(Zend_Queue::VISIBILITY_TIMEOUT)); - $this->assertTrue(is_string(Zend_Queue::NAME)); - } - - /** - * Constructor - * - * @param string|Zend_Queue_Adapter_Abstract $adapter - * @param array $config - */ - public function testConstruct() - { - // Test Zend_Config - $config = array( - 'name' => 'queue1', - 'params' => array(), - 'adapter' => 'array' - ); - - require_once "Zend/Config.php"; - $zend_config = new Zend_Config($config); - - $obj = new Zend_Queue($config); - $this->assertTrue($obj instanceof Zend_Queue); - - try { - $obj = new Zend_Queue('ops'); - $this->fail('Zend_Queue cannot accept a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - } - - public function test_getOptions() - { - $config = $this->queue->getOptions(); - $this->assertTrue(is_array($config)); - $this->assertEquals($this->config['name'], $config['name']); - } - - public function test_set_getAdapter() - { - $adapter = new Zend_Queue_Adapter_Array($this->config); - $this->assertTrue($this->queue->setAdapter($adapter) instanceof Zend_Queue); - $this->assertTrue($this->queue->getAdapter($adapter) instanceof Zend_Queue_Adapter_Array); - } - - public function test_set_getMessageClass() - { - $class = 'test'; - $this->assertTrue($this->queue->setMessageClass($class) instanceof Zend_Queue); - $this->assertEquals($class, $this->queue->getMessageClass()); - } - - public function test_set_getMessageSetClass() - { - $class = 'test'; - $this->assertTrue($this->queue->setMessageSetClass($class) instanceof Zend_Queue); - $this->assertEquals($class, $this->queue->getMessageSetClass()); - } - - public function test_set_getName() - { - // $this->assertTrue($this->queue->setName($new) instanceof Zend_Queue); - $this->assertEquals($this->config['name'], $this->queue->getName()); - } - - public function test_create_deleteQueue() - { - // parameter testing - try { - $this->queue->createQueue(array()); - $this->fail('createQueue() $name must be a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $this->queue->createQueue('test', 'test'); - $this->fail('createQueue() $timeout must be an integer'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - // isExists - $queue = 'test'; - $new = $this->queue->createQueue($queue); - $this->assertTrue($new instanceof Zend_Queue); - $this->assertFalse($this->queue->createQueue($queue)); - - $this->assertTrue($new->deleteQueue()); - } - - public function test_send_count_receive_deleteMessage() - { - // ------------------------------------ send() - // parameter verification - try { - $this->queue->send(array()); - $this->fail('send() $mesage must be a string'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - $message = 'Hello world'; // never gets boring! - $this->assertTrue($this->queue->send($message) instanceof Zend_Queue_Message); - - // ------------------------------------ count() - $this->assertEquals($this->queue->count(), 1); - - // ------------------------------------ receive() - // parameter verification - try { - $this->queue->receive(array()); - $this->fail('receive() $maxMessages must be a integer or null'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - try { - $this->queue->receive(1, array()); - $this->fail('receive() $timeout must be a integer or null'); - } catch (Exception $e) { - $this->assertTrue(true); - } - - $messages = $this->queue->receive(); - $this->assertTrue($messages instanceof Zend_Queue_Message_Iterator); - - // ------------------------------------ deleteMessage() - foreach ($messages as $i => $message) { - $this->assertTrue($this->queue->deleteMessage($message)); - } - } - - public function test_capabilities() - { - $list = $this->queue->getCapabilities(); - $this->assertTrue(is_array($list)); - - // these functions must have an boolean answer - $func = array( - 'create', 'delete', 'send', 'receive', - 'deleteMessage', 'getQueues', 'count', - 'isExists' - ); - - foreach ( array_values($func) as $f ) { - $this->assertTrue(isset($list[$f])); - $this->assertTrue(is_bool($list[$f])); - } - } - - public function test_isSupported() - { - $list = $this->queue->getCapabilities(); - foreach ( $list as $function => $result ) { - $this->assertTrue(is_bool($result)); - if ( $result ) { - $this->assertTrue($this->queue->isSupported($function)); - } else { - $this->assertFalse($this->queue->isSupported($function)); - } - } - } - - public function test_getQueues() - { - $queues = $this->queue->getQueues(); - $this->assertTrue(is_array($queues)); - $this->assertTrue(in_array($this->config['name'], $queues)); - } -} diff --git a/tests/Zend/Queue/Stomp/ClientTest.php b/tests/Zend/Queue/Stomp/ClientTest.php deleted file mode 100644 index 38faa8db6a..0000000000 --- a/tests/Zend/Queue/Stomp/ClientTest.php +++ /dev/null @@ -1,167 +0,0 @@ -write($frame)->read(); - * - * @param Zend_Queue_Stom_Frame $frame - * @return $this - */ - public function write(Zend_Queue_Stomp_FrameInterface $frame) - { - $this->_buffer[] = $frame; - } - - /** - * tests the socket to see if there is data for us - */ - public function canRead() - { - return count($this->_buffer) > 0; - } - - /** - * reads in a frame from the socket or returns false. - * - * @return Zend_Queue_Stomp_Frame|false - * @throws Zend_Queue_Exception - */ - public function read() - { - if (! $this->canRead()) return false; - return array_shift($this->_buffer); - } -} - -/** - * @category Zend - * @package Zend_Queue - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Queue - */ -class Zend_Queue_Stomp_ClientTest extends PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $client = new Zend_Queue_Stomp_Client('tcp', 'localhost', '11232', 'Zend_Queue_Stomp_Connection_Mock'); - $this->assertTrue($client->getConnection() instanceof Zend_Queue_Stomp_Client_ConnectionInterface); - } - - public function testAddConnection() - { - $client = new Zend_Queue_Stomp_Client(); - $client->addConnection('tcp', 'localhost', '11232', 'Zend_Queue_Stomp_Connection_Mock'); - $this->assertTrue($client->getConnection() instanceof Zend_Queue_Stomp_Client_ConnectionInterface); - - $client = new Zend_Queue_Stomp_Client(); - $this->assertFalse($client->addConnection('tcp', 'localhost', 0, 'Zend_Queue_Stomp_Connection_Mock')); - } - - public function testGetAndSetConnection() - { - $connection = new Zend_Queue_Stomp_Connection_Mock('tcp', 'localhost', '11232'); - - $client = new Zend_Queue_Stomp_Client(); - $this->assertTrue($client->setConnection($connection) instanceof Zend_Queue_Stomp_Client); - - $try = $client->getConnection(); - $this->assertEquals($connection, $try); - } - - public function testSendAndReceive() - { - $frame = new Zend_Queue_Stomp_Frame(); - $frame->setCommand('testing'); - $frame->setHeader('testing',1); - $frame->setBody('hello world'); - - $client = new Zend_Queue_Stomp_Client(); - $client->addConnection('tcp', 'localhost', '11232', 'Zend_Queue_Stomp_Connection_Mock'); - - $client->send($frame); - $this->assertTrue($client->canRead()); - $test = $client->receive(); - - $this->assertEquals('testing', $test->getCommand()); - $this->assertEquals(1, $test->getHeader('testing')); - $this->assertEquals('hello world', $test->getBody()); - } -} diff --git a/tests/Zend/Queue/Stomp/FrameTest.php b/tests/Zend/Queue/Stomp/FrameTest.php deleted file mode 100644 index cc53fb93cf..0000000000 --- a/tests/Zend/Queue/Stomp/FrameTest.php +++ /dev/null @@ -1,151 +0,0 @@ -body; - $correct .= Zend_Queue_Stomp_Frame::END_OF_FRAME; - - $frame = new Zend_Queue_Stomp_Frame(); - $frame->setCommand('SEND'); - $frame->setBody($this->body); - $this->assertEquals($frame->toFrame(), $correct); - - $frame = new Zend_Queue_Stomp_Frame(); - $frame->fromFrame($correct); - $this->assertEquals($frame->getCommand(), 'SEND'); - $this->assertEquals($frame->getBody(), $this->body); - - $this->assertEquals($frame->toFrame(), "$frame"); - - // fromFrame, but no body - $correct = 'SEND' . Zend_Queue_Stomp_Frame::EOL; - $correct .= 'testing: 11' . Zend_Queue_Stomp_Frame::EOL; - $correct .= Zend_Queue_Stomp_Frame::EOL; - $correct .= Zend_Queue_Stomp_Frame::END_OF_FRAME; - $frame->fromFrame($correct); - $this->assertEquals($frame->getHeader('testing'), 11); - } - - public function test_setHeaders() - { - $frame = new Zend_Queue_Stomp_Frame(); - $frame->setHeaders(array('testing' => 1)); - $this->assertEquals(1, $frame->getHeader('testing')); - } - - public function test_parameters() - { - $frame = new Zend_Queue_Stomp_Frame(); - - try { - $frame->setAutoContentLength(array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->setHeader(array(), 1); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->setHeader('testing', array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->getHeader(array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->setBody(array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->setCommand(array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->toFrame(); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - - try { - $frame->fromFrame(array()); - $this->fail('Exception should have been thrown'); - } catch(Exception $e) { - $this->assertTrue(true); - } - } - - public function test_constant() - { - $this->assertTrue(is_string(Zend_Queue_Stomp_Frame::END_OF_FRAME)); - $this->assertTrue(is_string(Zend_Queue_Stomp_Frame::CONTENT_LENGTH)); - $this->assertTrue(is_string(Zend_Queue_Stomp_Frame::EOL)); - } - -} From 2a0f4f9e763c92b5da329227f4d28c801907fca4 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:33:07 -0500 Subject: [PATCH 25/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Search Tests and Demos --- .../Lucene/feed-search/create-index.php | 57 -- .../Lucene/feed-search/search-index.php | 43 -- .../Search/Lucene/indexing/CreateIndex.php | 97 --- .../indexing/IndexSource/about-pear.html | 179 ----- .../Lucene/indexing/IndexSource/authors.html | 235 ------ .../IndexSource/contributing.bugs.html | 185 ----- .../contributing.documentation.html | 165 ----- .../indexing/IndexSource/contributing.html | 201 ----- .../IndexSource/contributing.newpackage.html | 151 ---- .../IndexSource/contributing.patches.html | 274 ------- .../IndexSource/contributing.wishlist.html | 158 ---- .../indexing/IndexSource/copyright.html | 196 ----- .../Lucene/indexing/IndexSource/core.html | 159 ---- tests/Zend/AllTests.php | 2 - tests/Zend/Search/AllTests.php | 57 -- tests/Zend/Search/Lucene/.gitignore | 4 - tests/Zend/Search/Lucene/AllTests.php | 108 --- tests/Zend/Search/Lucene/AnalysisTest.php | 383 ---------- tests/Zend/Search/Lucene/DocumentTest.php | 344 --------- tests/Zend/Search/Lucene/FSMTest.php | 205 ------ tests/Zend/Search/Lucene/FieldTest.php | 124 ---- .../Lucene/Index/DictionaryLoaderTest.php | 72 -- .../Search/Lucene/Index/FieldInfoTest.php | 49 -- .../Search/Lucene/Index/SegmentInfoTest.php | 562 -------------- .../Search/Lucene/Index/SegmentMergerTest.php | 76 -- .../Zend/Search/Lucene/Index/TermInfoTest.php | 53 -- tests/Zend/Search/Lucene/Index/TermTest.php | 87 --- .../Lucene/Index/TermsPriorityQueueTest.php | 694 ------------------ .../Index/_files/mergedSegment.cfs.sample | Bin 42605 -> 0 bytes .../Search/Lucene/Index/_source/_files/_0.cfs | Bin 8995 -> 0 bytes .../Search/Lucene/Index/_source/_files/_1.cfs | Bin 12507 -> 0 bytes .../Search/Lucene/Index/_source/_files/_1.sti | 1 - .../Search/Lucene/Index/_source/_files/_2.cfs | Bin 12913 -> 0 bytes .../Search/Lucene/Index/_source/_files/_3.cfs | Bin 8605 -> 0 bytes .../Search/Lucene/Index/_source/_files/_3.del | Bin 9 -> 0 bytes .../Search/Lucene/Index/_source/_files/_4.cfs | Bin 8205 -> 0 bytes .../Lucene/Index/_source/_files/deletable | Bin 4 -> 0 bytes .../Lucene/Index/_source/_files/segments | Bin 55 -> 0 bytes tests/Zend/Search/Lucene/LuceneTest.php | 581 --------------- .../Zend/Search/Lucene/PriorityQueueTest.php | 141 ---- tests/Zend/Search/Lucene/Search23Test.php | 579 --------------- .../Search/Lucene/SearchHighlightTest.php | 266 ------- tests/Zend/Search/Lucene/SearchTest.php | 489 ------------ .../Search/Lucene/Storage/DirectoryTest.php | 116 --- tests/Zend/Search/Lucene/Storage/FileTest.php | 137 ---- .../Search/Lucene/Storage/_files/sample_data | Bin 164 -> 0 bytes .../Lucene/_index23Sample/_files/_0.cfs | Bin 9154 -> 0 bytes .../Lucene/_index23Sample/_files/_1.cfs | Bin 12645 -> 0 bytes .../Lucene/_index23Sample/_files/_2.cfs | Bin 13036 -> 0 bytes .../Lucene/_index23Sample/_files/_3.cfs | Bin 8750 -> 0 bytes .../Lucene/_index23Sample/_files/_3_1.del | Bin 9 -> 0 bytes .../Lucene/_index23Sample/_files/_4.cfs | Bin 8313 -> 0 bytes .../Lucene/_index23Sample/_files/segments.gen | Bin 20 -> 0 bytes .../Lucene/_index23Sample/_files/segments_8 | Bin 125 -> 0 bytes .../Search/Lucene/_indexSample/_files/_0.cfs | Bin 8995 -> 0 bytes .../Search/Lucene/_indexSample/_files/_1.cfs | Bin 12507 -> 0 bytes .../Search/Lucene/_indexSample/_files/_2.cfs | Bin 12913 -> 0 bytes .../Search/Lucene/_indexSample/_files/_3.cfs | Bin 8605 -> 0 bytes .../Search/Lucene/_indexSample/_files/_3.del | Bin 9 -> 0 bytes .../Search/Lucene/_indexSample/_files/_4.cfs | Bin 8205 -> 0 bytes .../Lucene/_indexSample/_files/deletable | Bin 4 -> 0 bytes .../Lucene/_indexSample/_files/segments | Bin 55 -> 0 bytes .../_nonCompoundIndexFiles/_6.fdt | Bin 36136 -> 0 bytes .../_nonCompoundIndexFiles/_6.fdx | Bin 88 -> 0 bytes .../_nonCompoundIndexFiles/_6.fnm | 1 - .../_nonCompoundIndexFiles/_6.frq | Bin 2734 -> 0 bytes .../_nonCompoundIndexFiles/_6.nrm | 1 - .../_nonCompoundIndexFiles/_6.prx | Bin 6478 -> 0 bytes .../_nonCompoundIndexFiles/_6.tii | Bin 92 -> 0 bytes .../_nonCompoundIndexFiles/_6.tis | Bin 5972 -> 0 bytes .../_nonCompoundIndexFiles/segments.gen | Bin 20 -> 0 bytes .../_nonCompoundIndexFiles/segments_8 | Bin 41 -> 0 bytes .../_indexSource/_files/about-pear.html | 179 ----- .../Lucene/_indexSource/_files/authors.html | 235 ------ .../_files/contributing.bugs.html | 185 ----- .../_files/contributing.documentation.html | 165 ----- .../_indexSource/_files/contributing.html | 201 ----- .../_files/contributing.newpackage.html | 151 ---- .../_files/contributing.patches.html | 274 ------- .../_files/contributing.wishlist.html | 158 ---- .../Lucene/_indexSource/_files/copyright.html | 196 ----- .../Lucene/_indexSource/_files/core.html | 159 ---- .../Search/Lucene/_openXmlDocuments/test.docx | Bin 11065 -> 0 bytes .../Search/Lucene/_openXmlDocuments/test.pptx | Bin 41182 -> 0 bytes .../Search/Lucene/_openXmlDocuments/test.xlsx | Bin 27482 -> 0 bytes .../Lucene/_openXmlDocuments/test2.docx | Bin 15074 -> 0 bytes .../Lucene/_openXmlDocuments/test3.docx | Bin 72384 -> 0 bytes 87 files changed, 9135 deletions(-) delete mode 100644 demos/Zend/Search/Lucene/feed-search/create-index.php delete mode 100644 demos/Zend/Search/Lucene/feed-search/search-index.php delete mode 100644 demos/Zend/Search/Lucene/indexing/CreateIndex.php delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/about-pear.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/authors.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.bugs.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.documentation.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.newpackage.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.patches.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/contributing.wishlist.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/copyright.html delete mode 100644 demos/Zend/Search/Lucene/indexing/IndexSource/core.html delete mode 100644 tests/Zend/Search/AllTests.php delete mode 100644 tests/Zend/Search/Lucene/.gitignore delete mode 100644 tests/Zend/Search/Lucene/AllTests.php delete mode 100644 tests/Zend/Search/Lucene/AnalysisTest.php delete mode 100644 tests/Zend/Search/Lucene/DocumentTest.php delete mode 100644 tests/Zend/Search/Lucene/FSMTest.php delete mode 100644 tests/Zend/Search/Lucene/FieldTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/DictionaryLoaderTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/FieldInfoTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/SegmentInfoTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/SegmentMergerTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/TermInfoTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/TermTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/TermsPriorityQueueTest.php delete mode 100644 tests/Zend/Search/Lucene/Index/_files/mergedSegment.cfs.sample delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_0.cfs delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_1.cfs delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_1.sti delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_2.cfs delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_3.cfs delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_3.del delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/_4.cfs delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/deletable delete mode 100644 tests/Zend/Search/Lucene/Index/_source/_files/segments delete mode 100644 tests/Zend/Search/Lucene/LuceneTest.php delete mode 100644 tests/Zend/Search/Lucene/PriorityQueueTest.php delete mode 100755 tests/Zend/Search/Lucene/Search23Test.php delete mode 100644 tests/Zend/Search/Lucene/SearchHighlightTest.php delete mode 100644 tests/Zend/Search/Lucene/SearchTest.php delete mode 100644 tests/Zend/Search/Lucene/Storage/DirectoryTest.php delete mode 100644 tests/Zend/Search/Lucene/Storage/FileTest.php delete mode 100644 tests/Zend/Search/Lucene/Storage/_files/sample_data delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_0.cfs delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_1.cfs delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_2.cfs delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_3.cfs delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_3_1.del delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/_4.cfs delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/segments.gen delete mode 100755 tests/Zend/Search/Lucene/_index23Sample/_files/segments_8 delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_0.cfs delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_1.cfs delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_2.cfs delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_3.cfs delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_3.del delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/_4.cfs delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/deletable delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_files/segments delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdt delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdx delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fnm delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.frq delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.nrm delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.prx delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.tii delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.tis delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/segments.gen delete mode 100644 tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/segments_8 delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/about-pear.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/authors.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.bugs.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.documentation.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.newpackage.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.patches.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/contributing.wishlist.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/copyright.html delete mode 100644 tests/Zend/Search/Lucene/_indexSource/_files/core.html delete mode 100644 tests/Zend/Search/Lucene/_openXmlDocuments/test.docx delete mode 100644 tests/Zend/Search/Lucene/_openXmlDocuments/test.pptx delete mode 100644 tests/Zend/Search/Lucene/_openXmlDocuments/test.xlsx delete mode 100644 tests/Zend/Search/Lucene/_openXmlDocuments/test2.docx delete mode 100644 tests/Zend/Search/Lucene/_openXmlDocuments/test3.docx diff --git a/demos/Zend/Search/Lucene/feed-search/create-index.php b/demos/Zend/Search/Lucene/feed-search/create-index.php deleted file mode 100644 index e63277e174..0000000000 --- a/demos/Zend/Search/Lucene/feed-search/create-index.php +++ /dev/null @@ -1,57 +0,0 @@ -items as $item) { - $doc = new Zend_Search_Lucene_Document(); - - if ($item->link && $item->title && $item->description) { - - $link = htmlentities(strip_tags( $item->link() )); - $doc->addField(Zend_Search_Lucene_Field::UnIndexed('link', $link)); - - $title = htmlentities(strip_tags( $item->title() )); - $doc->addField(Zend_Search_Lucene_Field::Text('title', $title)); - - $contents = htmlentities(strip_tags( $item->description() )); - $doc->addField(Zend_Search_Lucene_Field::Text('contents', $contents)); - - echo "Adding {$item->title()}...\n"; - $index->addDocument($doc); - } -} - -$index->commit(); diff --git a/demos/Zend/Search/Lucene/feed-search/search-index.php b/demos/Zend/Search/Lucene/feed-search/search-index.php deleted file mode 100644 index ba59f94dc0..0000000000 --- a/demos/Zend/Search/Lucene/feed-search/search-index.php +++ /dev/null @@ -1,43 +0,0 @@ -count()} documents.\n"; - -$search = 'php'; -$hits = $index->find(strtolower($search)); -echo "Search for \"$search\" returned " .count($hits). " hits.\n\n"; - -foreach ($hits as $hit) { - echo str_repeat('-', 80) . "\n"; - echo 'ID: ' . $hit->id ."\n"; - echo 'Score: ' . sprintf('%.2f', $hit->score) ."\n\n"; - - foreach ($hit->getDocument()->getFieldNames() as $field) { - echo "$field: \n"; - echo ' ' . trim(substr($hit->$field,0,76)) . "\n"; - } -} diff --git a/demos/Zend/Search/Lucene/indexing/CreateIndex.php b/demos/Zend/Search/Lucene/indexing/CreateIndex.php deleted file mode 100644 index c642dbca55..0000000000 --- a/demos/Zend/Search/Lucene/indexing/CreateIndex.php +++ /dev/null @@ -1,97 +0,0 @@ -addField(Zend_Search_Lucene_Field::Text('path', $fileName)); - $this->addField(Zend_Search_Lucene_Field::Keyword( 'modified', filemtime($fileName) )); - - $f = fopen($fileName,'rb'); - $byteCount = filesize($fileName); - - $data = ''; - while ( $byteCount > 0 && ($nextBlock = fread($f, $byteCount)) != false ) { - $data .= $nextBlock; - $byteCount -= strlen($nextBlock); - } - fclose($f); - - if ($storeContent) { - $this->addField(Zend_Search_Lucene_Field::Text('contents', $data, 'ISO8859-1')); - } else { - $this->addField(Zend_Search_Lucene_Field::UnStored('contents', $data, 'ISO8859-1')); - } - } -} - - -// Create index -$index = new Zend_Search_Lucene('index', true); -// Uncomment next line if you want to have case sensitive index -// ZSearchAnalyzer::setDefault(new ZSearchTextAnalyzer()); - -setlocale(LC_CTYPE, 'en_US'); - -$indexSourceDir = 'IndexSource'; -$dir = opendir($indexSourceDir); -while (($file = readdir($dir)) !== false) { - if (is_dir($indexSourceDir . '/' . $file)) { - continue; - } - if (strcasecmp(substr($file, strlen($file)-5), '.html') != 0) { - continue; - } - - // Create new Document from a file - $doc = new FileDocument($indexSourceDir . '/' . $file, true); - // Add document to the index - $index->addDocument($doc); - - echo $file . "...\n"; - flush(); -} -closedir($dir); diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/about-pear.html b/demos/Zend/Search/Lucene/indexing/IndexSource/about-pear.html deleted file mode 100644 index 8a75445e75..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/about-pear.html +++ /dev/null @@ -1,179 +0,0 @@ -About PEAR
    PEAR Manual
    PrevNext


    PrevHomeNext
    Authors and Contributors Introduction
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/authors.html b/demos/Zend/Search/Lucene/indexing/IndexSource/authors.html deleted file mode 100644 index cac8abe956..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/authors.html +++ /dev/null @@ -1,235 +0,0 @@ -Authors and Contributors
    PEAR Manual
    PrevPrefaceNext

    Authors and Contributors

    The following is a list of people that are helping to maintain this - documentation. If you would like to contact one of them, please - write to pear-doc@lists.php.net. -

    • Lorenzo Alberton -

    • Gregory Beaver -

    • Daniel Convissor -

    • David Costa -

    • Thomas V.V. Cox -

    • Martin Jansen -

    • Alan Knowles -

    • Clay Loveless -

    • Alexander Merz -

    • Stefan Neufeind -

    • Jon Parise -

    • Tobias Schlitt -

    • Stephan Schmidt -

    • Mika Tuupola -

    • Michael Wallner -

    (In alphabetic order.) -


    PrevHomeNext
    The structure of the ManualUpAbout PEAR
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.bugs.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.bugs.html deleted file mode 100644 index 70035c2bb3..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.bugs.html +++ /dev/null @@ -1,185 +0,0 @@ -Reporting Bugs
    PEAR Manual
    PrevChapter 5. ContributingNext

    Reporting Bugs

    If you think that you have found a bug in a PEAR package, please - take care that you are using the latest version of the package and - that your system does meet the packages' requirements. -

    If the bug still persists with the latest version of the package, - don't hesitate to fill out a bug report. The easiest way is to click - to link "Package Bugs" on the package information page - for the package on the PEAR - Homepage, which you think contains a bug. This will take you - to a list of existing bugs of the package. Please double check if - the bug hasn't already been reported! If you are unable to find it - in the list, you can click on "Report a new bug" to - fill out the bug form. -

    More information and tips on how to report bugs in a proper way - can be found at http://bugs.php.net/how-to-report.php. -

    If you have already fixed a bug that you have found in a package, please - read this. -


    PrevHomeNext
    Submitting PatchesUpWriting & Translating Documentation
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.documentation.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.documentation.html deleted file mode 100644 index c9ba9c132e..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.documentation.html +++ /dev/null @@ -1,165 +0,0 @@ -Writing & Translating Documentation
    PEAR Manual
    PrevChapter 5. ContributingNext

    Writing & Translating Documentation

    Good documentation is essential for users to fully understand any - software. Several PEAR packages lack documentation or have docs which - need improvement. Writing documentation - provides more information about helping out on this front. -

    Translating documentation is another important task. - Not only does new documentation need to be translated - into the existing languages, additional languages are - welcome. Also, existing translations need to be brought - up to date because the English versions have been changed. - Help on how to perform the translation process is in the Revision Tracking - section of the manual. -


    PrevHomeNext
    Reporting BugsUpWishlists
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.html deleted file mode 100644 index e5e672a1f0..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.html +++ /dev/null @@ -1,201 +0,0 @@ -Contributing
    PEAR Manual
    PrevNext


    PrevHomeNext
    Sample File (including Docblock Comment standards)UpWriting New Packages
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.newpackage.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.newpackage.html deleted file mode 100644 index 8ad9c4f091..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.newpackage.html +++ /dev/null @@ -1,151 +0,0 @@ -Writing New Packages
    PEAR Manual
    PrevChapter 5. ContributingNext


    PrevHomeNext
    ContributingUpSubmitting Patches
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.patches.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.patches.html deleted file mode 100644 index d7d73f80f2..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.patches.html +++ /dev/null @@ -1,274 +0,0 @@ -Submitting Patches
    PEAR Manual
    PrevChapter 5. ContributingNext

    Submitting Patches

    If you have modified a package to expand its functionality or to fix a - bug, you should contribute your changes back to the community (some - licenses force you to do so, and it is generally considered immoral not to). -

    Before creating the patch, you must first obtain the latest sources of the - package you wish to patch from CVS by running the commands (the package - in this example is Foo_Bar): -
    
cvs -d:pserver:cvsread@cvs.php.net:/repository login
    -
    -password is phpfi
    -
cvs -d:pserver:cvsread@cvs.php.net:/repository co pear/Foo_Bar
    -
    - Now that you have the latest sources, you can edit the relevant file(s). - Make sure that your patch is fully compatible with the PEAR
    coding -standards.. -

    After you have finished adding/changing the code, TEST it: We will not - accept code that hasn't been carefully tested. - When you are absolutely sure the new code doesn't introduce bugs, create a - unified diff by running: -
    cd pear/Foo_Bar
    -cvs diff -u >Foo_Bar.diff
    - The resulting .diff file contains your patch. This diff makes it easy - for us to see what has been changed. -

    Next step is to submit the patch. Send a mail to pear-dev@lists.php.net and - Cc the maintainer(s) of the package. The subject of the mail should be - prefixed with '[Patch]' to make it clear you are submitting a patch. Also - include a verbose explanation of what the patch does. - Don't forget to attach the .diff file to the mail. The maintainers of - the package are usually listed in the header of each source file. Apart - from that their email adresses are available on the package information - page on http://pear.php.net/. -

    Note: - If you are using Outlook or Outlook Express, please change the file - extension of the diff file to .txt, because Outlook's MIME-Type - detection depends on the file extension and attachments with a - MIME-Type not equal to text/plain will be rejected - by our mailinglist software. -

    Note: - If your patch does break backwards compatibility, the chances are fairly - good that the maintainers won't be happy about it. Thus you should always - try to fix a bug in a way that does not seriously change the public API. - But if there is absolutely no way to keep backwards compatibility and/or - if your patch contains a groundbraking improvement, even API changes are - fine. -


    PrevHomeNext
    Writing New PackagesUpReporting Bugs
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.wishlist.html b/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.wishlist.html deleted file mode 100644 index f5d13cecb5..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/contributing.wishlist.html +++ /dev/null @@ -1,158 +0,0 @@ -Wishlists
    PEAR Manual
    PrevChapter 5. ContributingNext

    Wishlists

    Some of the PEAR developers have wishlists at Amazon or a similar - service. If you appreciate the work of a certain developer, feel - free to buy something for her from her wishlist. To find out if - a developer has one of those wishlists, go to the - account browser, - look for the details of the developer and there you'll see if she - has a wishlist. Buying something from people's wishlists may even - speed up the time in which annoying bugs are fixed ;-). -


    PrevHomeNext
    Writing & Translating DocumentationUpFAQ - Frequently Asked Questions
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/copyright.html b/demos/Zend/Search/Lucene/indexing/IndexSource/copyright.html deleted file mode 100644 index d4e082bd83..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/copyright.html +++ /dev/null @@ -1,196 +0,0 @@ -
    PEAR Manual

    Copyright

    Copyright © 2001 - 2006 by the PEAR Documentation Group. - This material may be distributed only subject to the terms and - conditions set forth in the Open Publication License, v1.0 or - later (the latest version is presently available at - http://www.opencontent.org/openpub/). -

    Distribution of substantively modified versions of this document - is prohibited without the explicit permission of the copyright - holder. -

    Distribution of the work or derivative of the work in any - standard (paper) book form is prohibited unless prior permission - is obtained from the copyright holder. -

    The PEAR Documentation Group consists of all the people that - have contributed documentation to the PEAR manual. - Representatives are listed on the front page of this manual. - In case you would like to contact the group, please write to - pear-doc@lists.php.net. -

    Copyright for the XML_RPC documentation -

    The documentation - of the XML_RPC package has originally been written by Edd Dumbill as an independent - document on his - homepage and is published as part of the PEAR Manual under - the following license restrictions: -

    Copyright © 1999,2000,2001 by Edd Dumbill, Useful Information Company -

    All rights reserved. -

    Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: -

    • Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -

    • Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -

    • Neither the name of the "XML-RPC for PHP" nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. -

    -

    - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - OF SUCH DAMAGE. -


     Home 
    \ No newline at end of file diff --git a/demos/Zend/Search/Lucene/indexing/IndexSource/core.html b/demos/Zend/Search/Lucene/indexing/IndexSource/core.html deleted file mode 100644 index cf811503a2..0000000000 --- a/demos/Zend/Search/Lucene/indexing/IndexSource/core.html +++ /dev/null @@ -1,159 +0,0 @@ -Core components
    PEAR Manual
    PrevNext


    PrevHomeNext
    Structure of a post-install script PEAR base classes
    \ No newline at end of file diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index def3301546..c5d8fb958a 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -63,7 +63,6 @@ require_once 'Zend/Pdf/AllTests.php'; require_once 'Zend/ProgressBar/AllTests.php'; require_once 'Zend/RegistryTest.php'; -require_once 'Zend/Search/Lucene/AllTests.php'; require_once 'Zend/Serializer/AllTests.php'; require_once 'Zend/Server/AllTests.php'; require_once 'Zend/Session/AllTests.php'; @@ -179,7 +178,6 @@ public static function suite() $suite->addTest(Zend_Pdf_AllTests::suite()); $suite->addTest(Zend_ProgressBar_AllTests::suite()); $suite->addTestSuite('Zend_RegistryTest'); - $suite->addTest(Zend_Search_Lucene_AllTests::suite()); $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); $suite->addTest(Zend_Tag_AllTests::suite()); diff --git a/tests/Zend/Search/AllTests.php b/tests/Zend/Search/AllTests.php deleted file mode 100644 index 587509478a..0000000000 --- a/tests/Zend/Search/AllTests.php +++ /dev/null @@ -1,57 +0,0 @@ -addTestSuite('Zend_Search_Lucene_AllTests'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Search_Lucene_AllTests::main') { - Zend_Search_AllTests::main(); -} - diff --git a/tests/Zend/Search/Lucene/.gitignore b/tests/Zend/Search/Lucene/.gitignore deleted file mode 100644 index 94647a0586..0000000000 --- a/tests/Zend/Search/Lucene/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -_index/* -_index23Sample/* -_indexSample/* -Index/_source/_files/ \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/AllTests.php b/tests/Zend/Search/Lucene/AllTests.php deleted file mode 100644 index 23af77c2bf..0000000000 --- a/tests/Zend/Search/Lucene/AllTests.php +++ /dev/null @@ -1,108 +0,0 @@ -addTestSuite('Zend_Search_Lucene_LuceneTest'); - - $suite->addTestSuite('Zend_Search_Lucene_DocumentTest'); - $suite->addTestSuite('Zend_Search_Lucene_FSMTest'); - $suite->addTestSuite('Zend_Search_Lucene_FieldTest'); - $suite->addTestSuite('Zend_Search_Lucene_PriorityQueueTest'); - - $suite->addTestSuite('Zend_Search_Lucene_AnalysisTest'); - - $suite->addTestSuite('Zend_Search_Lucene_Index_DictionaryLoaderTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_FieldInfoTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_TermsPriorityQueueTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_SegmentInfoTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_SegmentMergerTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_TermInfoTest'); - $suite->addTestSuite('Zend_Search_Lucene_Index_TermTest'); - /** - * SegmentWriter class, its subclasses and Writer class are completely tested within - * Lucene::addDocument and Lucene::optimize testing - */ - - $suite->addTestSuite('Zend_Search_Lucene_Storage_DirectoryTest'); - $suite->addTestSuite('Zend_Search_Lucene_Storage_FileTest'); - - $suite->addTestSuite('Zend_Search_Lucene_SearchHighlightTest'); - - $suite->addTestSuite('Zend_Search_Lucene_SearchTest'); - $suite->addTestSuite('Zend_Search_Lucene_Search23Test'); - - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Search_Lucene_AllTests::main') { - Zend_Search_Lucene_AllTests::main(); -} diff --git a/tests/Zend/Search/Lucene/AnalysisTest.php b/tests/Zend/Search/Lucene/AnalysisTest.php deleted file mode 100644 index 39814e933f..0000000000 --- a/tests/Zend/Search/Lucene/AnalysisTest.php +++ /dev/null @@ -1,383 +0,0 @@ -assertTrue($currentAnalyzer instanceof Zend_Search_Lucene_Analysis_Analyzer); - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php'; - - $newAnalyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num(); - Zend_Search_Lucene_Analysis_Analyzer::setDefault($newAnalyzer); - $this->assertTrue(Zend_Search_Lucene_Analysis_Analyzer::getDefault() === $newAnalyzer); - - // Set analyzer to the default value (used in other tests) - Zend_Search_Lucene_Analysis_Analyzer::setDefault($currentAnalyzer); - } - - public function testText() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text(); - - $tokenList = $analyzer->tokenize('Word1 Word2 anotherWord'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Word'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 4); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Word'); - $this->assertEquals($tokenList[1]->getStartOffset(), 6); - $this->assertEquals($tokenList[1]->getEndOffset(), 10); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'anotherWord'); - $this->assertEquals($tokenList[2]->getStartOffset(), 12); - $this->assertEquals($tokenList[2]->getEndOffset(), 23); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testTextCaseInsensitive() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive(); - - $tokenList = $analyzer->tokenize('Word1 Word2 anotherWord'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'word'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 4); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'word'); - $this->assertEquals($tokenList[1]->getStartOffset(), 6); - $this->assertEquals($tokenList[1]->getEndOffset(), 10); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'anotherword'); - $this->assertEquals($tokenList[2]->getStartOffset(), 12); - $this->assertEquals($tokenList[2]->getEndOffset(), 23); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testTextNum() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum(); - - $tokenList = $analyzer->tokenize('Word1 Word2 anotherWord'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Word1'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 5); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Word2'); - $this->assertEquals($tokenList[1]->getStartOffset(), 6); - $this->assertEquals($tokenList[1]->getEndOffset(), 11); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'anotherWord'); - $this->assertEquals($tokenList[2]->getStartOffset(), 12); - $this->assertEquals($tokenList[2]->getEndOffset(), 23); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testTextNumCaseInsensitive() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive(); - - $tokenList = $analyzer->tokenize('Word1 Word2 anotherWord'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'word1'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 5); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'word2'); - $this->assertEquals($tokenList[1]->getStartOffset(), 6); - $this->assertEquals($tokenList[1]->getEndOffset(), 11); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'anotherword'); - $this->assertEquals($tokenList[2]->getStartOffset(), 12); - $this->assertEquals($tokenList[2]->getEndOffset(), 23); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testUtf8() - { - if (@preg_match('/\pL/u', 'a') != 1) { - // PCRE unicode support is turned off - return; - } - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8(); - - // UTF-8 text with a cyrillic symbols - $tokenList = $analyzer->tokenize('Слово1 Слово2 ДругоеСлово', 'UTF-8'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Слово'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 5); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Слово'); - $this->assertEquals($tokenList[1]->getStartOffset(), 7); - $this->assertEquals($tokenList[1]->getEndOffset(), 12); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'ДругоеСлово'); - $this->assertEquals($tokenList[2]->getStartOffset(), 14); - $this->assertEquals($tokenList[2]->getEndOffset(), 25); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testUtf8Num() - { - if (@preg_match('/\pL/u', 'a') != 1) { - // PCRE unicode support is turned off - return; - } - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num(); - - // UTF-8 text with a cyrillic symbols - $tokenList = $analyzer->tokenize('Слово1 Слово2 ДругоеСлово', 'UTF-8'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Слово1'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 6); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Слово2'); - $this->assertEquals($tokenList[1]->getStartOffset(), 7); - $this->assertEquals($tokenList[1]->getEndOffset(), 13); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'ДругоеСлово'); - $this->assertEquals($tokenList[2]->getStartOffset(), 14); - $this->assertEquals($tokenList[2]->getEndOffset(), 25); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testUtf8CaseInsensitive() - { - if (@preg_match('/\pL/u', 'a') != 1) { - // PCRE unicode support is turned off - return; - } - if (!function_exists('mb_strtolower')) { - // mbstring extension is disabled - return; - } - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive(); - - // UTF-8 text with a cyrillic symbols - $tokenList = $analyzer->tokenize('Слово1 Слово2 ДругоеСлово', 'UTF-8'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Ñлово'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 5); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Ñлово'); - $this->assertEquals($tokenList[1]->getStartOffset(), 7); - $this->assertEquals($tokenList[1]->getEndOffset(), 12); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'другоеÑлово'); - $this->assertEquals($tokenList[2]->getStartOffset(), 14); - $this->assertEquals($tokenList[2]->getEndOffset(), 25); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testUtf8NumCaseInsensitive() - { - if (@preg_match('/\pL/u', 'a') != 1) { - // PCRE unicode support is turned off - return; - } - if (!function_exists('mb_strtolower')) { - // mbstring extension is disabled - return; - } - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php'; - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive(); - - // UTF-8 text with a cyrillic symbols - $tokenList = $analyzer->tokenize('Слово1 Слово2 ДругоеСлово', 'UTF-8'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Ñлово1'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 6); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Ñлово2'); - $this->assertEquals($tokenList[1]->getStartOffset(), 7); - $this->assertEquals($tokenList[1]->getEndOffset(), 13); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'другоеÑлово'); - $this->assertEquals($tokenList[2]->getStartOffset(), 14); - $this->assertEquals($tokenList[2]->getEndOffset(), 25); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testEncoding() - { - if (PHP_OS == 'AIX') { - $this->markTestSkipped('Test not available on AIX'); - } - - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8(); - - // UTF-8 text with a cyrillic symbols - $tokenList = $analyzer->tokenize(iconv('UTF-8', 'Windows-1251', 'Слово1 Слово2 ДругоеСлово'), 'Windows-1251'); - - $this->assertEquals(count($tokenList), 3); - - $this->assertEquals($tokenList[0]->getTermText(), 'Слово'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 5); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'Слово'); - $this->assertEquals($tokenList[1]->getStartOffset(), 7); - $this->assertEquals($tokenList[1]->getEndOffset(), 12); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[2]->getTermText(), 'ДругоеСлово'); - $this->assertEquals($tokenList[2]->getStartOffset(), 14); - $this->assertEquals($tokenList[2]->getEndOffset(), 25); - $this->assertEquals($tokenList[2]->getPositionIncrement(), 1); - } - - public function testStopWords() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; - - /** Zend_Search_Lucene_Analysis_TokenFilter_StopWords */ - require_once 'Zend/Search/Lucene/Analysis/TokenFilter/StopWords.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive(); - $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords(array('word', 'and', 'or')); - - $analyzer->addFilter($stopWordsFilter); - - $tokenList = $analyzer->tokenize('Word1 Word2 anotherWord'); - - $this->assertEquals(count($tokenList), 1); - - $this->assertEquals($tokenList[0]->getTermText(), 'anotherword'); - $this->assertEquals($tokenList[0]->getStartOffset(), 12); - $this->assertEquals($tokenList[0]->getEndOffset(), 23); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - } - - public function testShortWords() - { - /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ - require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; - - /** Zend_Search_Lucene_Analysis_TokenFilter_ShortWords */ - require_once 'Zend/Search/Lucene/Analysis/TokenFilter/ShortWords.php'; - - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive(); - $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_ShortWords(4 /* Minimal length */); - - $analyzer->addFilter($stopWordsFilter); - - $tokenList = $analyzer->tokenize('Word1 and anotherWord'); - - $this->assertEquals(count($tokenList), 2); - - $this->assertEquals($tokenList[0]->getTermText(), 'word'); - $this->assertEquals($tokenList[0]->getStartOffset(), 0); - $this->assertEquals($tokenList[0]->getEndOffset(), 4); - $this->assertEquals($tokenList[0]->getPositionIncrement(), 1); - - $this->assertEquals($tokenList[1]->getTermText(), 'anotherword'); - $this->assertEquals($tokenList[1]->getStartOffset(), 10); - $this->assertEquals($tokenList[1]->getEndOffset(), 21); - $this->assertEquals($tokenList[1]->getPositionIncrement(), 1); - } -} diff --git a/tests/Zend/Search/Lucene/DocumentTest.php b/tests/Zend/Search/Lucene/DocumentTest.php deleted file mode 100644 index 162aa05b9a..0000000000 --- a/tests/Zend/Search/Lucene/DocumentTest.php +++ /dev/null @@ -1,344 +0,0 @@ -assertEquals($document->boost, 1); - } - - public function testFields() - { - $document = new Zend_Search_Lucene_Document(); - - $document->addField(Zend_Search_Lucene_Field::Text('title', 'Title')); - $document->addField(Zend_Search_Lucene_Field::Text('annotation', 'Annotation')); - $document->addField(Zend_Search_Lucene_Field::Text('body', 'Document body, document body, document body...')); - - $fieldnamesDiffArray = array_diff($document->getFieldNames(), array('title', 'annotation', 'body')); - $this->assertTrue(is_array($fieldnamesDiffArray)); - $this->assertEquals(count($fieldnamesDiffArray), 0); - - $this->assertEquals($document->title, 'Title'); - $this->assertEquals($document->annotation, 'Annotation'); - $this->assertEquals($document->body, 'Document body, document body, document body...'); - - $this->assertEquals($document->getField('title')->value, 'Title'); - $this->assertEquals($document->getField('annotation')->value, 'Annotation'); - $this->assertEquals($document->getField('body')->value, 'Document body, document body, document body...'); - - $this->assertEquals($document->getFieldValue('title'), 'Title'); - $this->assertEquals($document->getFieldValue('annotation'), 'Annotation'); - $this->assertEquals($document->getFieldValue('body'), 'Document body, document body, document body...'); - - - if (PHP_OS == 'AIX') { - return; // tests below here not valid on AIX - } - - $wordsWithUmlautsIso88591 = iconv('UTF-8', 'ISO-8859-1', 'Words with umlauts: åãü...'); - $document->addField(Zend_Search_Lucene_Field::Text('description', $wordsWithUmlautsIso88591, 'ISO-8859-1')); - $this->assertEquals($document->description, $wordsWithUmlautsIso88591); - $this->assertEquals($document->getFieldUtf8Value('description'), 'Words with umlauts: åãü...'); - } - - public function testAddFieldMethodChaining() - { - $document = new Zend_Search_Lucene_Document(); - $this->assertTrue($document->addField(Zend_Search_Lucene_Field::Text('title', 'Title')) instanceof Zend_Search_Lucene_Document); - - $document = new Zend_Search_Lucene_Document(); - $document->addField(Zend_Search_Lucene_Field::Text('title', 'Title')) - ->addField(Zend_Search_Lucene_Field::Text('annotation', 'Annotation')) - ->addField(Zend_Search_Lucene_Field::Text('body', 'Document body, document body, document body...')); - } - - - public function testHtmlHighlighting() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTML('Page titleDocument body.'); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document_Html); - - $doc->highlight('document', '#66ffff'); - $this->assertTrue(strpos($doc->getHTML(), 'Document body.') !== false); - } - - public function testHtmlExtendedHighlighting() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTML('Page titleDocument body.'); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document_Html); - - $doc->highlightExtended('document', - array('Zend_Search_Lucene_DocumentTest_DocHighlightingContainer', - 'extendedHighlightingCallback'), - array('style="color:black;background-color:#ff66ff"', - '(!!!)')); - $this->assertTrue(strpos($doc->getHTML(), 'Document(!!!) body.') !== false); - } - - public function testHtmlWordsHighlighting() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTML('Page titleDocument body.'); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document_Html); - - $doc->highlight(array('document', 'body'), '#66ffff'); - $highlightedHTML = $doc->getHTML(); - $this->assertTrue(strpos($highlightedHTML, 'Document') !== false); - $this->assertTrue(strpos($highlightedHTML, 'body') !== false); - } - - public function testHtmlExtendedHighlightingCorrectWrongHtml() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTML('Page titleDocument body.'); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document_Html); - - $doc->highlightExtended('document', - array('Zend_Search_Lucene_DocumentTest_DocHighlightingContainer', - 'extendedHighlightingCallback'), - array('style="color:black;background-color:#ff66ff"', - '

    (!!!)' /* Wrong HTML here,

    tag is not closed */)); - $this->assertTrue(strpos($doc->getHTML(), 'Document

    (!!!)

    body.') !== false); - } - - public function testHtmlLinksProcessing() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTMLFile(dirname(__FILE__) . '/_indexSource/_files/contributing.documentation.html', true); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document_Html); - - $this->assertTrue(array_values($doc->getHeaderLinks()) == - array('index.html', 'contributing.html', 'contributing.bugs.html', 'contributing.wishlist.html')); - $this->assertTrue(array_values($doc->getLinks()) == - array('contributing.bugs.html', - 'contributing.wishlist.html', - 'developers.documentation.html', - 'faq.translators-revision-tracking.html', - 'index.html', - 'contributing.html')); - } - - - /** - * @group ZF-4252 - */ - public function testHtmlInlineTagsIndexing() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - $htmlString = 'Hello World' - . 'ZendFramework' . "\n" . '
    Foo
    Bar ' . "\n" - . ' Test'; - - $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString); - - $index->addDocument($doc); - - $hits = $index->find('FooBar'); - $this->assertEquals(count($hits), 0); - - $hits = $index->find('ZendFramework'); - $this->assertEquals(count($hits), 1); - - unset($index); - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - /** - * @group ZF-8740 - */ - public function testHtmlAreaTags() - { - $html = '' - . 'Page title' - . '' - . 'Document body.' - . 'some image' - . '' - . 'Link 3' - . 'Link 4' - . '' - . 'Link 1.' - . 'Link 1.' - . '' - . ''; - - $oldNoFollowValue = Zend_Search_Lucene_Document_Html::getExcludeNoFollowLinks(); - - Zend_Search_Lucene_Document_Html::setExcludeNoFollowLinks(false); - $doc1 = Zend_Search_Lucene_Document_Html::loadHTML($html); - $this->assertTrue($doc1 instanceof Zend_Search_Lucene_Document_Html); - $links = array('link1.html', 'link2.html', 'link3.html', 'link4.html'); - $this->assertTrue(array_values($doc1->getLinks()) == $links); - } - - public function testHtmlNoFollowLinks() - { - $html = '' - . 'Page title' - . '' - . 'Document body.' - . 'Link 1.' - . 'Link 1.' - . '' - . ''; - - $oldNoFollowValue = Zend_Search_Lucene_Document_Html::getExcludeNoFollowLinks(); - - Zend_Search_Lucene_Document_Html::setExcludeNoFollowLinks(false); - $doc1 = Zend_Search_Lucene_Document_Html::loadHTML($html); - $this->assertTrue($doc1 instanceof Zend_Search_Lucene_Document_Html); - $this->assertTrue(array_values($doc1->getLinks()) == array('link1.html', 'link2.html')); - - Zend_Search_Lucene_Document_Html::setExcludeNoFollowLinks(true); - $doc2 = Zend_Search_Lucene_Document_Html::loadHTML($html); - $this->assertTrue($doc2 instanceof Zend_Search_Lucene_Document_Html); - $this->assertTrue(array_values($doc2->getLinks()) == array('link1.html')); - } - - public function testDocx() - { - if (!class_exists('ZipArchive')) { - $this->markTestSkipped('ZipArchive class (Zip extension) is not loaded'); - } - - $docxDocument = Zend_Search_Lucene_Document_Docx::loadDocxFile(dirname(__FILE__) . '/_openXmlDocuments/test.docx', true); - - $this->assertTrue($docxDocument instanceof Zend_Search_Lucene_Document_Docx); - $this->assertEquals($docxDocument->getFieldValue('title'), 'Test document'); - $this->assertEquals($docxDocument->getFieldValue('description'), 'This is a test document which can be used to demonstrate something.'); - $this->assertTrue($docxDocument->getFieldValue('body') != ''); - - try { - $docxDocument1 = Zend_Search_Lucene_Document_Docx::loadDocxFile(dirname(__FILE__) . '/_openXmlDocuments/dummy.docx', true); - - $this->fail('File not readable exception is expected.'); - } catch (Zend_Search_Lucene_Document_Exception $e) { - if (strpos($e->getMessage(), 'is not readable') === false) { - // Passthrough exception - throw $e; - } - } - } - - public function testPptx() - { - if (!class_exists('ZipArchive')) { - $this->markTestSkipped('ZipArchive class (Zip extension) is not loaded'); - } - - $pptxDocument = Zend_Search_Lucene_Document_Pptx::loadPptxFile(dirname(__FILE__) . '/_openXmlDocuments/test.pptx', true); - - $this->assertTrue($pptxDocument instanceof Zend_Search_Lucene_Document_Pptx); - $this->assertEquals($pptxDocument->getFieldValue('title'), 'Test document'); - $this->assertEquals($pptxDocument->getFieldValue('description'), 'This is a test document which can be used to demonstrate something.'); - $this->assertTrue($pptxDocument->getFieldValue('body') != ''); - } - - public function testXlsx() - { - if (!class_exists('ZipArchive')) { - $this->markTestSkipped('ZipArchive class (Zip extension) is not loaded'); - } - - $xlsxDocument = Zend_Search_Lucene_Document_Xlsx::loadXlsxFile(dirname(__FILE__) . '/_openXmlDocuments/test.xlsx', true); - - $this->assertTrue($xlsxDocument instanceof Zend_Search_Lucene_Document_Xlsx); - $this->assertEquals($xlsxDocument->getFieldValue('title'), 'Test document'); - $this->assertEquals($xlsxDocument->getFieldValue('description'), 'This is a test document which can be used to demonstrate something.'); - $this->assertTrue($xlsxDocument->getFieldValue('body') != ''); - $this->assertTrue( strpos($xlsxDocument->getFieldValue('body'), 'ipsum') !== false ); - } - - /** - * @group ZF-10686 - */ - public function testLoadHtmlWithAttributesInTagHTML() - { - $doc = Zend_Search_Lucene_Document_Html::loadHTML('Page titleDocument body.'); - $this->assertEquals('Page title ', $doc->title); - } -} - - -class Zend_Search_Lucene_DocumentTest_DocHighlightingContainer { - public static function extendedHighlightingCallback($stringToHighlight, $param1, $param2) - { - return '' . $stringToHighlight . '' . $param2; - } -} diff --git a/tests/Zend/Search/Lucene/FSMTest.php b/tests/Zend/Search/Lucene/FSMTest.php deleted file mode 100644 index aa1138ca5e..0000000000 --- a/tests/Zend/Search/Lucene/FSMTest.php +++ /dev/null @@ -1,205 +0,0 @@ -action1Passed = true; } - public function action2() { $this->action2Passed = true; } - public function action3() { $this->action3Passed = true; } - public function action4() { $this->action4Passed = true; } - public function action5() { $this->action5Passed = true; } - public function action6() { $this->action6Passed = true; } - public function action7() { $this->action7Passed = true; } - public function action8() { $this->action8Passed = true; } -} - -/** - * @category Zend - * @package Zend_Search_Lucene - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Search_Lucene_FSM_testFSMClass extends Zend_Search_Lucene_FSM -{ - const OPENED = 0; - const CLOSED = 1; - const CLOSED_AND_LOCKED = 2; - - const OPENED_AND_LOCKED = 3; // Wrong state, should not be used - - - const OPEN = 0; - const CLOSE = 1; - const LOCK = 3; - const UNLOCK = 4; - - /** - * Object to trace FSM actions - * - * @var Zend_Search_Lucene_FSM_testClass - */ - public $actionTracer; - - public function __construct() - { - $this->actionTracer = new Zend_Search_Lucene_FSM_testClass(); - - $this->addStates(array(self::OPENED, self::CLOSED, self::CLOSED_AND_LOCKED)); - $this->addInputSymbols(array(self::OPEN, self::CLOSE, self::LOCK, self::UNLOCK)); - - $unlockAction = new Zend_Search_Lucene_FSMAction($this->actionTracer, 'action4'); - $openAction = new Zend_Search_Lucene_FSMAction($this->actionTracer, 'action6'); - $closeEntryAction = new Zend_Search_Lucene_FSMAction($this->actionTracer, 'action2'); - $closeExitAction = new Zend_Search_Lucene_FSMAction($this->actionTracer, 'action8'); - - $this->addRules(array( array(self::OPENED, self::CLOSE, self::CLOSED), - array(self::CLOSED, self::OPEN, self::OPEN), - array(self::CLOSED, self::LOCK, self::CLOSED_AND_LOCKED), - array(self::CLOSED_AND_LOCKED, self::UNLOCK, self::CLOSED, $unlockAction), - )); - - $this->addInputAction(self::CLOSED_AND_LOCKED, self::UNLOCK, $unlockAction); - - $this->addTransitionAction(self::CLOSED, self::OPENED, $openAction); - - $this->addEntryAction(self::CLOSED, $closeEntryAction); - - $this->addExitAction(self::CLOSED, $closeExitAction); - } -} - -/** - * @category Zend - * @package Zend_Search_Lucene - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Search_Lucene - */ -class Zend_Search_Lucene_FSMTest extends PHPUnit_Framework_TestCase -{ - public function testCreate() - { - $doorFSM = new Zend_Search_Lucene_FSM_testFSMClass(); - - $this->assertTrue($doorFSM instanceof Zend_Search_Lucene_FSM); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::OPENED); - } - - public function testSetState() - { - $doorFSM = new Zend_Search_Lucene_FSM_testFSMClass(); - - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::OPENED); - - $doorFSM->setState(Zend_Search_Lucene_FSM_testFSMClass::CLOSED_AND_LOCKED); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::CLOSED_AND_LOCKED ); - - $wrongStateExceptionCatched = false; - try { - $doorFSM->setState(Zend_Search_Lucene_FSM_testFSMClass::OPENED_AND_LOCKED); - } catch(Zend_Search_Exception $e) { - $wrongStateExceptionCatched = true; - } - $this->assertTrue($wrongStateExceptionCatched); - } - - public function testReset() - { - $doorFSM = new Zend_Search_Lucene_FSM_testFSMClass(); - - $doorFSM->setState(Zend_Search_Lucene_FSM_testFSMClass::CLOSED_AND_LOCKED); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::CLOSED_AND_LOCKED); - - $doorFSM->reset(); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::OPENED); - } - - public function testProcess() - { - $doorFSM = new Zend_Search_Lucene_FSM_testFSMClass(); - - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::CLOSE); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::CLOSED); - - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::LOCK); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::CLOSED_AND_LOCKED); - - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::UNLOCK); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::CLOSED); - - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::OPEN); - $this->assertEquals($doorFSM->getState(), Zend_Search_Lucene_FSM_testFSMClass::OPENED); - - $wrongInputExceptionCatched = false; - try { - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::LOCK); - } catch(Zend_Search_Exception $e) { - $wrongInputExceptionCatched = true; - } - $this->assertTrue($wrongInputExceptionCatched); - } - - public function testActions() - { - $doorFSM = new Zend_Search_Lucene_FSM_testFSMClass(); - - $this->assertFalse($doorFSM->actionTracer->action2Passed /* 'closed' state entry action*/); - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::CLOSE); - $this->assertTrue($doorFSM->actionTracer->action2Passed); - - $this->assertFalse($doorFSM->actionTracer->action8Passed /* 'closed' state exit action*/); - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::LOCK); - $this->assertTrue($doorFSM->actionTracer->action8Passed); - - $this->assertFalse($doorFSM->actionTracer->action4Passed /* 'closed&locked' state +'unlock' input action */); - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::UNLOCK); - $this->assertTrue($doorFSM->actionTracer->action4Passed); - - $this->assertFalse($doorFSM->actionTracer->action6Passed /* 'locked' -> 'opened' transition action action */); - $doorFSM->process(Zend_Search_Lucene_FSM_testFSMClass::OPEN); - $this->assertTrue($doorFSM->actionTracer->action6Passed); - } -} - diff --git a/tests/Zend/Search/Lucene/FieldTest.php b/tests/Zend/Search/Lucene/FieldTest.php deleted file mode 100644 index 5fb6f26592..0000000000 --- a/tests/Zend/Search/Lucene/FieldTest.php +++ /dev/null @@ -1,124 +0,0 @@ -assertEquals($field->boost, 1); - $this->assertEquals($field->encoding, ''); - $this->assertEquals($field->isBinary, true); - $this->assertEquals($field->isIndexed, false); - $this->assertEquals($field->isStored, true); - $this->assertEquals($field->isTokenized, false); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'value'); - } - - public function testKeyword() - { - $field = Zend_Search_Lucene_Field::Keyword('field', 'value'); - - $this->assertEquals($field->boost, 1); - $this->assertEquals($field->encoding, ''); - $this->assertEquals($field->isBinary, false); - $this->assertEquals($field->isIndexed, true); - $this->assertEquals($field->isStored, true); - $this->assertEquals($field->isTokenized, false); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'value'); - } - - public function testText() - { - $field = Zend_Search_Lucene_Field::Text('field', 'value'); - - $this->assertEquals($field->boost, 1); - $this->assertEquals($field->encoding, ''); - $this->assertEquals($field->isBinary, false); - $this->assertEquals($field->isIndexed, true); - $this->assertEquals($field->isStored, true); - $this->assertEquals($field->isTokenized, true); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'value'); - } - - public function testUnIndexed() - { - $field = Zend_Search_Lucene_Field::UnIndexed('field', 'value'); - - $this->assertEquals($field->boost, 1); - $this->assertEquals($field->encoding, ''); - $this->assertEquals($field->isBinary, false); - $this->assertEquals($field->isIndexed, false); - $this->assertEquals($field->isStored, true); - $this->assertEquals($field->isTokenized, false); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'value'); - } - - public function testUnStored() - { - $field = Zend_Search_Lucene_Field::UnStored('field', 'value'); - - $this->assertEquals($field->boost, 1); - $this->assertEquals($field->encoding, ''); - $this->assertEquals($field->isBinary, false); - $this->assertEquals($field->isIndexed, true); - $this->assertEquals($field->isStored, false); - $this->assertEquals($field->isTokenized, true); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'value'); - } - - public function testEncoding() - { - $field = Zend_Search_Lucene_Field::Text('field', 'Words with umlauts: åãü...', 'ISO-8859-1'); - - $this->assertEquals($field->encoding, 'ISO-8859-1'); - - $this->assertEquals($field->name, 'field'); - $this->assertEquals($field->value, 'Words with umlauts: åãü...'); - $this->assertEquals($field->getUtf8Value(), 'Words with umlauts: åãü...'); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/DictionaryLoaderTest.php b/tests/Zend/Search/Lucene/Index/DictionaryLoaderTest.php deleted file mode 100644 index cd62595201..0000000000 --- a/tests/Zend/Search/Lucene/Index/DictionaryLoaderTest.php +++ /dev/null @@ -1,72 +0,0 @@ -getFileObject('_1.sti'); - $stiFileData = $stiFile->readBytes($directory->fileLength('_1.sti')); - - // Load dictionary index data - list($termDictionary, $termDictionaryInfos) = unserialize($stiFileData); - - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - $tiiFile = $segmentInfo->openCompoundFile('.tii'); - $tiiFileData = $tiiFile->readBytes($segmentInfo->compoundFileLength('.tii')); - - // Load dictionary index data - list($loadedTermDictionary, $loadedTermDictionaryInfos) = - Zend_Search_Lucene_Index_DictionaryLoader::load($tiiFileData); - - $this->assertTrue($termDictionary == $loadedTermDictionary); - $this->assertTrue($termDictionaryInfos == $loadedTermDictionaryInfos); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/FieldInfoTest.php b/tests/Zend/Search/Lucene/Index/FieldInfoTest.php deleted file mode 100644 index 1740dc7a33..0000000000 --- a/tests/Zend/Search/Lucene/Index/FieldInfoTest.php +++ /dev/null @@ -1,49 +0,0 @@ -assertTrue($fieldInfo instanceof Zend_Search_Lucene_Index_FieldInfo); - - $this->assertEquals($fieldInfo->name, 'field_name'); - $this->assertEquals($fieldInfo->isIndexed, true); - $this->assertEquals($fieldInfo->number, 3); - $this->assertEquals($fieldInfo->storeTermVector, false); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/SegmentInfoTest.php b/tests/Zend/Search/Lucene/Index/SegmentInfoTest.php deleted file mode 100644 index 13afea265f..0000000000 --- a/tests/Zend/Search/Lucene/Index/SegmentInfoTest.php +++ /dev/null @@ -1,562 +0,0 @@ -assertTrue($segmentInfo instanceof Zend_Search_Lucene_Index_SegmentInfo); - } - - public function testOpenCompoundFile() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $file1 = $segmentInfo->openCompoundFile('.fnm'); - $this->assertTrue($file1 instanceof Zend_Search_Lucene_Storage_File); - - $file2 = $segmentInfo->openCompoundFile('.tii'); - $file3 = $segmentInfo->openCompoundFile('.tii'); - $file4 = $segmentInfo->openCompoundFile('.tii', false); - - $this->assertTrue($file2 instanceof Zend_Search_Lucene_Storage_File); - $this->assertTrue($file2 === $file3); - $this->assertTrue($file4 instanceof Zend_Search_Lucene_Storage_File); - $this->assertTrue($file2 !== $file4); - } - - - public function testCompoundFileLength() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertEquals($segmentInfo->compoundFileLength('.tii'), 58); - } - - public function testGetFieldNum() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertEquals($segmentInfo->getFieldNum('contents'), 2); - $this->assertEquals($segmentInfo->getFieldNum('non-presented-field'), -1); - } - - public function testGetField() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $fieldInfo = $segmentInfo->getField(2); - - $this->assertEquals($fieldInfo->name, 'contents'); - $this->assertTrue((boolean)$fieldInfo->isIndexed); - $this->assertEquals($fieldInfo->number, 2); - $this->assertFalse((boolean)$fieldInfo->storeTermVector); - } - - public function testGetFields() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertTrue($segmentInfo->getFields() == array('path' => 'path', 'modified' => 'modified', 'contents' => 'contents')); - $this->assertTrue($segmentInfo->getFields(true) == array('path' => 'path', 'modified' => 'modified', 'contents' => 'contents')); - } - - public function testGetFieldInfos() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $fieldInfos = $segmentInfo->getFieldInfos(); - - $this->assertEquals($fieldInfos[0]->name, 'path'); - $this->assertTrue((boolean)$fieldInfos[0]->isIndexed); - $this->assertEquals($fieldInfos[0]->number, 0); - $this->assertFalse((boolean)$fieldInfos[0]->storeTermVector); - - $this->assertEquals($fieldInfos[1]->name, 'modified'); - $this->assertTrue((boolean)$fieldInfos[1]->isIndexed); - $this->assertEquals($fieldInfos[1]->number, 1); - $this->assertFalse((boolean)$fieldInfos[1]->storeTermVector); - - $this->assertEquals($fieldInfos[2]->name, 'contents'); - $this->assertTrue((boolean)$fieldInfos[2]->isIndexed); - $this->assertEquals($fieldInfos[2]->number, 2); - $this->assertFalse((boolean)$fieldInfos[2]->storeTermVector); - } - - public function testCount() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertEquals($segmentInfo->count(), 2); - } - - public function testNumDocs() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - - $this->assertEquals($segmentInfo->count(), 2); - $this->assertEquals($segmentInfo->numDocs(), 1); - } - - public function testGetName() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertEquals($segmentInfo->getName(), '_1'); - } - - public function testGetTermInfo() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $termInfo = $segmentInfo->getTermInfo(new Zend_Search_Lucene_Index_Term('apart', 'contents')); - - $this->assertEquals($termInfo->docFreq, 1); - $this->assertEquals($termInfo->freqPointer, 29); - $this->assertEquals($termInfo->proxPointer, 119); - $this->assertEquals($termInfo->skipOffset, 0); - $this->assertEquals($termInfo->indexPointer, null); - - $termInfo1 = $segmentInfo->getTermInfo(new Zend_Search_Lucene_Index_Term('apart', 'contents')); - // test for requesting cached information - $this->assertTrue($termInfo === $termInfo1); - - // request for non-existing term - $this->assertTrue($segmentInfo->getTermInfo(new Zend_Search_Lucene_Index_Term('nonusedterm', 'contents')) === null); - } - - public function testTermFreqs() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $termPositions = $segmentInfo->termFreqs(new Zend_Search_Lucene_Index_Term('bgcolor', 'contents')); - $this->assertTrue($termPositions == array(0 => 3, 1 => 1)); - - $termPositions = $segmentInfo->termFreqs(new Zend_Search_Lucene_Index_Term('bgcolor', 'contents'), 10); - $this->assertTrue($termPositions == array(10 => 3, 11 => 1)); - } - - public function testTermPositions() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $termPositions = $segmentInfo->termPositions(new Zend_Search_Lucene_Index_Term('bgcolor', 'contents')); - $this->assertTrue($termPositions == array(0 => array(69, 239, 370), - 1 => array(58) - )); - - $termPositions = $segmentInfo->termPositions(new Zend_Search_Lucene_Index_Term('bgcolor', 'contents'), 10); - $this->assertTrue($termPositions == array(10 => array(69, 239, 370), - 11 => array(58) - )); - } - - public function testNorm() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertTrue(abs($segmentInfo->norm(1, 'contents') - 0.0546875) < 0.000001); - } - - public function testNormVector() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - - $this->assertEquals($segmentInfo->normVector('contents'), "\x69\x6B"); - } - - public function testHasDeletions() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2); - $this->assertFalse($segmentInfo->hasDeletions()); - - $segmentInfo1 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - $this->assertTrue($segmentInfo1->hasDeletions()); - } - - public function testDelete() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2, 0 /* search for _1.del file */); - $this->assertFalse($segmentInfo->hasDeletions()); - - $segmentInfo->delete(0); - $this->assertTrue($segmentInfo->hasDeletions()); - $delGen = $segmentInfo->getDelGen(); - // don't write changes - unset($segmentInfo); - - $segmentInfo1 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2, $delGen); - // Changes wasn't written, segment still has no deletions - $this->assertFalse($segmentInfo1->hasDeletions()); - - $segmentInfo1->delete(0); - $segmentInfo1->writeChanges(); - $delGen = $segmentInfo1->getDelGen(); - unset($segmentInfo1); - - $segmentInfo2 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2, $delGen); - $this->assertTrue($segmentInfo2->hasDeletions()); - unset($segmentInfo2); - - $directory->deleteFile('_1_' . base_convert($delGen, 10, 36) . '.del'); - - $segmentInfo3 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_1', 2, -1 /* no detetions file */); - $this->assertFalse($segmentInfo3->hasDeletions()); - } - - public function testIsDeleted() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_2', 2); - $this->assertFalse($segmentInfo->isDeleted(0)); - - $segmentInfo1 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - $this->assertTrue($segmentInfo1->isDeleted(0)); - $this->assertFalse($segmentInfo1->isDeleted(1)); - } - - public function testTermStreamStyleReading() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - - $this->assertEquals($segmentInfo->resetTermsStream(6, Zend_Search_Lucene_Index_SegmentInfo::SM_FULL_INFO), 8); - - $terms = array(); - - $terms[] = $segmentInfo->currentTerm(); - $firstTermPositions = $segmentInfo->currentTermPositions(); - - $this->assertEquals(count($firstTermPositions), 1); - - reset($firstTermPositions); // go to the first element - $this->assertEquals(key($firstTermPositions), 7); - - $this->assertTrue(current($firstTermPositions) == - array(105, 113, 130, 138, 153, 168, 171, 216, 243, 253, 258, 265, 302, 324, - 331, 351, 359, 366, 370, 376, 402, 410, 418, 425, 433, 441, 460, 467)); - - while (($term = $segmentInfo->nextTerm()) != null) { - $terms[] = $term; - } - - $this->assertTrue($terms == - array(new Zend_Search_Lucene_Index_Term('a', 'contents'), - new Zend_Search_Lucene_Index_Term('about', 'contents'), - new Zend_Search_Lucene_Index_Term('accesskey', 'contents'), - new Zend_Search_Lucene_Index_Term('align', 'contents'), - new Zend_Search_Lucene_Index_Term('alink', 'contents'), - new Zend_Search_Lucene_Index_Term('already', 'contents'), - new Zend_Search_Lucene_Index_Term('and', 'contents'), - new Zend_Search_Lucene_Index_Term('are', 'contents'), - new Zend_Search_Lucene_Index_Term('at', 'contents'), - new Zend_Search_Lucene_Index_Term('b', 'contents'), - new Zend_Search_Lucene_Index_Term('be', 'contents'), - new Zend_Search_Lucene_Index_Term('been', 'contents'), - new Zend_Search_Lucene_Index_Term('bgcolor', 'contents'), - new Zend_Search_Lucene_Index_Term('body', 'contents'), - new Zend_Search_Lucene_Index_Term('border', 'contents'), - new Zend_Search_Lucene_Index_Term('bottom', 'contents'), - new Zend_Search_Lucene_Index_Term('bug', 'contents'), - new Zend_Search_Lucene_Index_Term('bugs', 'contents'), - new Zend_Search_Lucene_Index_Term('can', 'contents'), - new Zend_Search_Lucene_Index_Term('care', 'contents'), - new Zend_Search_Lucene_Index_Term('cellpadding', 'contents'), - new Zend_Search_Lucene_Index_Term('cellspacing', 'contents'), - new Zend_Search_Lucene_Index_Term('center', 'contents'), - new Zend_Search_Lucene_Index_Term('chapter', 'contents'), - new Zend_Search_Lucene_Index_Term('charset', 'contents'), - new Zend_Search_Lucene_Index_Term('check', 'contents'), - new Zend_Search_Lucene_Index_Term('class', 'contents'), - new Zend_Search_Lucene_Index_Term('click', 'contents'), - new Zend_Search_Lucene_Index_Term('colspan', 'contents'), - new Zend_Search_Lucene_Index_Term('contains', 'contents'), - new Zend_Search_Lucene_Index_Term('content', 'contents'), - new Zend_Search_Lucene_Index_Term('contributing', 'contents'), - new Zend_Search_Lucene_Index_Term('developers', 'contents'), - new Zend_Search_Lucene_Index_Term('div', 'contents'), - new Zend_Search_Lucene_Index_Term('docbook', 'contents'), - new Zend_Search_Lucene_Index_Term('documentation', 'contents'), - new Zend_Search_Lucene_Index_Term('does', 'contents'), - new Zend_Search_Lucene_Index_Term('don', 'contents'), - new Zend_Search_Lucene_Index_Term('double', 'contents'), - new Zend_Search_Lucene_Index_Term('easiest', 'contents'), - new Zend_Search_Lucene_Index_Term('equiv', 'contents'), - new Zend_Search_Lucene_Index_Term('existing', 'contents'), - new Zend_Search_Lucene_Index_Term('explanations', 'contents'), - new Zend_Search_Lucene_Index_Term('ff', 'contents'), - new Zend_Search_Lucene_Index_Term('ffffff', 'contents'), - new Zend_Search_Lucene_Index_Term('fill', 'contents'), - new Zend_Search_Lucene_Index_Term('find', 'contents'), - new Zend_Search_Lucene_Index_Term('fixed', 'contents'), - new Zend_Search_Lucene_Index_Term('footer', 'contents'), - new Zend_Search_Lucene_Index_Term('for', 'contents'), - new Zend_Search_Lucene_Index_Term('form', 'contents'), - new Zend_Search_Lucene_Index_Term('found', 'contents'), - new Zend_Search_Lucene_Index_Term('generator', 'contents'), - new Zend_Search_Lucene_Index_Term('guide', 'contents'), - new Zend_Search_Lucene_Index_Term('h', 'contents'), - new Zend_Search_Lucene_Index_Term('hasn', 'contents'), - new Zend_Search_Lucene_Index_Term('have', 'contents'), - new Zend_Search_Lucene_Index_Term('head', 'contents'), - new Zend_Search_Lucene_Index_Term('header', 'contents'), - new Zend_Search_Lucene_Index_Term('hesitate', 'contents'), - new Zend_Search_Lucene_Index_Term('home', 'contents'), - new Zend_Search_Lucene_Index_Term('homepage', 'contents'), - new Zend_Search_Lucene_Index_Term('how', 'contents'), - new Zend_Search_Lucene_Index_Term('hr', 'contents'), - new Zend_Search_Lucene_Index_Term('href', 'contents'), - new Zend_Search_Lucene_Index_Term('html', 'contents'), - new Zend_Search_Lucene_Index_Term('http', 'contents'), - new Zend_Search_Lucene_Index_Term('if', 'contents'), - new Zend_Search_Lucene_Index_Term('in', 'contents'), - new Zend_Search_Lucene_Index_Term('index', 'contents'), - new Zend_Search_Lucene_Index_Term('information', 'contents'), - new Zend_Search_Lucene_Index_Term('is', 'contents'), - new Zend_Search_Lucene_Index_Term('iso', 'contents'), - new Zend_Search_Lucene_Index_Term('it', 'contents'), - new Zend_Search_Lucene_Index_Term('latest', 'contents'), - new Zend_Search_Lucene_Index_Term('left', 'contents'), - new Zend_Search_Lucene_Index_Term('link', 'contents'), - new Zend_Search_Lucene_Index_Term('list', 'contents'), - new Zend_Search_Lucene_Index_Term('manual', 'contents'), - new Zend_Search_Lucene_Index_Term('meet', 'contents'), - new Zend_Search_Lucene_Index_Term('meta', 'contents'), - new Zend_Search_Lucene_Index_Term('modular', 'contents'), - new Zend_Search_Lucene_Index_Term('more', 'contents'), - new Zend_Search_Lucene_Index_Term('n', 'contents'), - new Zend_Search_Lucene_Index_Term('name', 'contents'), - new Zend_Search_Lucene_Index_Term('navfooter', 'contents'), - new Zend_Search_Lucene_Index_Term('navheader', 'contents'), - new Zend_Search_Lucene_Index_Term('navigation', 'contents'), - new Zend_Search_Lucene_Index_Term('net', 'contents'), - new Zend_Search_Lucene_Index_Term('new', 'contents'), - new Zend_Search_Lucene_Index_Term('newpackage', 'contents'), - new Zend_Search_Lucene_Index_Term('next', 'contents'), - new Zend_Search_Lucene_Index_Term('of', 'contents'), - new Zend_Search_Lucene_Index_Term('on', 'contents'), - new Zend_Search_Lucene_Index_Term('out', 'contents'), - new Zend_Search_Lucene_Index_Term('p', 'contents'), - new Zend_Search_Lucene_Index_Term('package', 'contents'), - new Zend_Search_Lucene_Index_Term('packages', 'contents'), - new Zend_Search_Lucene_Index_Term('page', 'contents'), - new Zend_Search_Lucene_Index_Term('patches', 'contents'), - new Zend_Search_Lucene_Index_Term('pear', 'contents'), - new Zend_Search_Lucene_Index_Term('persists', 'contents'), - new Zend_Search_Lucene_Index_Term('php', 'contents'), - new Zend_Search_Lucene_Index_Term('please', 'contents'), - new Zend_Search_Lucene_Index_Term('prev', 'contents'), - new Zend_Search_Lucene_Index_Term('previous', 'contents'), - new Zend_Search_Lucene_Index_Term('proper', 'contents'), - new Zend_Search_Lucene_Index_Term('quote', 'contents'), - new Zend_Search_Lucene_Index_Term('read', 'contents'), - new Zend_Search_Lucene_Index_Term('rel', 'contents'), - new Zend_Search_Lucene_Index_Term('report', 'contents'), - new Zend_Search_Lucene_Index_Term('reported', 'contents'), - new Zend_Search_Lucene_Index_Term('reporting', 'contents'), - new Zend_Search_Lucene_Index_Term('requirements', 'contents'), - new Zend_Search_Lucene_Index_Term('right', 'contents'), - new Zend_Search_Lucene_Index_Term('sect', 'contents'), - new Zend_Search_Lucene_Index_Term('span', 'contents'), - new Zend_Search_Lucene_Index_Term('still', 'contents'), - new Zend_Search_Lucene_Index_Term('stylesheet', 'contents'), - new Zend_Search_Lucene_Index_Term('submitting', 'contents'), - new Zend_Search_Lucene_Index_Term('summary', 'contents'), - new Zend_Search_Lucene_Index_Term('system', 'contents'), - new Zend_Search_Lucene_Index_Term('t', 'contents'), - new Zend_Search_Lucene_Index_Term('table', 'contents'), - new Zend_Search_Lucene_Index_Term('take', 'contents'), - new Zend_Search_Lucene_Index_Term('target', 'contents'), - new Zend_Search_Lucene_Index_Term('td', 'contents'), - new Zend_Search_Lucene_Index_Term('text', 'contents'), - new Zend_Search_Lucene_Index_Term('th', 'contents'), - new Zend_Search_Lucene_Index_Term('that', 'contents'), - new Zend_Search_Lucene_Index_Term('the', 'contents'), - new Zend_Search_Lucene_Index_Term('think', 'contents'), - new Zend_Search_Lucene_Index_Term('this', 'contents'), - new Zend_Search_Lucene_Index_Term('tips', 'contents'), - new Zend_Search_Lucene_Index_Term('title', 'contents'), - new Zend_Search_Lucene_Index_Term('to', 'contents'), - new Zend_Search_Lucene_Index_Term('top', 'contents'), - new Zend_Search_Lucene_Index_Term('tr', 'contents'), - new Zend_Search_Lucene_Index_Term('translating', 'contents'), - new Zend_Search_Lucene_Index_Term('type', 'contents'), - new Zend_Search_Lucene_Index_Term('u', 'contents'), - new Zend_Search_Lucene_Index_Term('unable', 'contents'), - new Zend_Search_Lucene_Index_Term('up', 'contents'), - new Zend_Search_Lucene_Index_Term('using', 'contents'), - new Zend_Search_Lucene_Index_Term('valign', 'contents'), - new Zend_Search_Lucene_Index_Term('version', 'contents'), - new Zend_Search_Lucene_Index_Term('vlink', 'contents'), - new Zend_Search_Lucene_Index_Term('way', 'contents'), - new Zend_Search_Lucene_Index_Term('which', 'contents'), - new Zend_Search_Lucene_Index_Term('width', 'contents'), - new Zend_Search_Lucene_Index_Term('will', 'contents'), - new Zend_Search_Lucene_Index_Term('with', 'contents'), - new Zend_Search_Lucene_Index_Term('writing', 'contents'), - new Zend_Search_Lucene_Index_Term('you', 'contents'), - new Zend_Search_Lucene_Index_Term('your', 'contents'), - new Zend_Search_Lucene_Index_Term('1178009946', 'modified'), - new Zend_Search_Lucene_Index_Term('bugs', 'path'), - new Zend_Search_Lucene_Index_Term('contributing', 'path'), - new Zend_Search_Lucene_Index_Term('html', 'path'), - new Zend_Search_Lucene_Index_Term('indexsource', 'path'), - new Zend_Search_Lucene_Index_Term('newpackage', 'path'), - )); - - unset($segmentInfo); - - - $segmentInfo1 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - $this->assertEquals($segmentInfo1->resetTermsStream(6, Zend_Search_Lucene_Index_SegmentInfo::SM_MERGE_INFO), 7); - } - - public function testTermStreamStyleReadingSkipTo() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_source/_files'); - - $segmentInfo = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - - $this->assertEquals($segmentInfo->resetTermsStream(6, Zend_Search_Lucene_Index_SegmentInfo::SM_FULL_INFO), 8); - - $segmentInfo->skipTo(new Zend_Search_Lucene_Index_Term('prefetch', 'contents')); - - $terms = array(); - - $terms[] = $segmentInfo->currentTerm(); - $firstTermPositions = $segmentInfo->currentTermPositions(); - - $this->assertEquals(count($firstTermPositions), 1); - - reset($firstTermPositions); // go to the first element - $this->assertEquals(key($firstTermPositions), 7); - $this->assertTrue(current($firstTermPositions) == array(112, 409)); - - while (($term = $segmentInfo->nextTerm()) != null) { - $terms[] = $term; - } - - $this->assertTrue($terms == - array(new Zend_Search_Lucene_Index_Term('prev', 'contents'), - new Zend_Search_Lucene_Index_Term('previous', 'contents'), - new Zend_Search_Lucene_Index_Term('proper', 'contents'), - new Zend_Search_Lucene_Index_Term('quote', 'contents'), - new Zend_Search_Lucene_Index_Term('read', 'contents'), - new Zend_Search_Lucene_Index_Term('rel', 'contents'), - new Zend_Search_Lucene_Index_Term('report', 'contents'), - new Zend_Search_Lucene_Index_Term('reported', 'contents'), - new Zend_Search_Lucene_Index_Term('reporting', 'contents'), - new Zend_Search_Lucene_Index_Term('requirements', 'contents'), - new Zend_Search_Lucene_Index_Term('right', 'contents'), - new Zend_Search_Lucene_Index_Term('sect', 'contents'), - new Zend_Search_Lucene_Index_Term('span', 'contents'), - new Zend_Search_Lucene_Index_Term('still', 'contents'), - new Zend_Search_Lucene_Index_Term('stylesheet', 'contents'), - new Zend_Search_Lucene_Index_Term('submitting', 'contents'), - new Zend_Search_Lucene_Index_Term('summary', 'contents'), - new Zend_Search_Lucene_Index_Term('system', 'contents'), - new Zend_Search_Lucene_Index_Term('t', 'contents'), - new Zend_Search_Lucene_Index_Term('table', 'contents'), - new Zend_Search_Lucene_Index_Term('take', 'contents'), - new Zend_Search_Lucene_Index_Term('target', 'contents'), - new Zend_Search_Lucene_Index_Term('td', 'contents'), - new Zend_Search_Lucene_Index_Term('text', 'contents'), - new Zend_Search_Lucene_Index_Term('th', 'contents'), - new Zend_Search_Lucene_Index_Term('that', 'contents'), - new Zend_Search_Lucene_Index_Term('the', 'contents'), - new Zend_Search_Lucene_Index_Term('think', 'contents'), - new Zend_Search_Lucene_Index_Term('this', 'contents'), - new Zend_Search_Lucene_Index_Term('tips', 'contents'), - new Zend_Search_Lucene_Index_Term('title', 'contents'), - new Zend_Search_Lucene_Index_Term('to', 'contents'), - new Zend_Search_Lucene_Index_Term('top', 'contents'), - new Zend_Search_Lucene_Index_Term('tr', 'contents'), - new Zend_Search_Lucene_Index_Term('translating', 'contents'), - new Zend_Search_Lucene_Index_Term('type', 'contents'), - new Zend_Search_Lucene_Index_Term('u', 'contents'), - new Zend_Search_Lucene_Index_Term('unable', 'contents'), - new Zend_Search_Lucene_Index_Term('up', 'contents'), - new Zend_Search_Lucene_Index_Term('using', 'contents'), - new Zend_Search_Lucene_Index_Term('valign', 'contents'), - new Zend_Search_Lucene_Index_Term('version', 'contents'), - new Zend_Search_Lucene_Index_Term('vlink', 'contents'), - new Zend_Search_Lucene_Index_Term('way', 'contents'), - new Zend_Search_Lucene_Index_Term('which', 'contents'), - new Zend_Search_Lucene_Index_Term('width', 'contents'), - new Zend_Search_Lucene_Index_Term('will', 'contents'), - new Zend_Search_Lucene_Index_Term('with', 'contents'), - new Zend_Search_Lucene_Index_Term('writing', 'contents'), - new Zend_Search_Lucene_Index_Term('you', 'contents'), - new Zend_Search_Lucene_Index_Term('your', 'contents'), - new Zend_Search_Lucene_Index_Term('1178009946', 'modified'), - new Zend_Search_Lucene_Index_Term('bugs', 'path'), - new Zend_Search_Lucene_Index_Term('contributing', 'path'), - new Zend_Search_Lucene_Index_Term('html', 'path'), - new Zend_Search_Lucene_Index_Term('indexsource', 'path'), - new Zend_Search_Lucene_Index_Term('newpackage', 'path'), - )); - - unset($segmentInfo); - - - $segmentInfo1 = new Zend_Search_Lucene_Index_SegmentInfo($directory, '_3', 2); - $this->assertEquals($segmentInfo1->resetTermsStream(6, Zend_Search_Lucene_Index_SegmentInfo::SM_MERGE_INFO), 7); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/SegmentMergerTest.php b/tests/Zend/Search/Lucene/Index/SegmentMergerTest.php deleted file mode 100644 index ccfaf4b4bc..0000000000 --- a/tests/Zend/Search/Lucene/Index/SegmentMergerTest.php +++ /dev/null @@ -1,76 +0,0 @@ -addSource(new Zend_Search_Lucene_Index_SegmentInfo($segmentsDirectory, $segmentName, 2)); - } - - $mergedSegment = $segmentMerger->merge(); - $this->assertTrue($mergedSegment instanceof Zend_Search_Lucene_Index_SegmentInfo); - unset($mergedSegment); - - $mergedFile = $outputDirectory->getFileObject('mergedSegment.cfs'); - $mergedFileData = $mergedFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs')); - - $sampleFile = $outputDirectory->getFileObject('mergedSegment.cfs.sample'); - $sampleFileData = $sampleFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs.sample')); - - $this->assertEquals($mergedFileData, $sampleFileData); - - $outputDirectory->deleteFile('mergedSegment.cfs'); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/TermInfoTest.php b/tests/Zend/Search/Lucene/Index/TermInfoTest.php deleted file mode 100644 index 83aacc6342..0000000000 --- a/tests/Zend/Search/Lucene/Index/TermInfoTest.php +++ /dev/null @@ -1,53 +0,0 @@ -assertTrue($termInfo instanceof Zend_Search_Lucene_Index_TermInfo); - - $this->assertEquals($termInfo->docFreq, 0); - $this->assertEquals($termInfo->freqPointer, 1); - $this->assertEquals($termInfo->proxPointer, 2); - $this->assertEquals($termInfo->skipOffset, 3); - $this->assertEquals($termInfo->indexPointer, null); - - $termInfo = new Zend_Search_Lucene_Index_TermInfo(0, 1, 2, 3, 4); - $this->assertEquals($termInfo->indexPointer, 4); - } -} - diff --git a/tests/Zend/Search/Lucene/Index/TermTest.php b/tests/Zend/Search/Lucene/Index/TermTest.php deleted file mode 100644 index 520b99d85e..0000000000 --- a/tests/Zend/Search/Lucene/Index/TermTest.php +++ /dev/null @@ -1,87 +0,0 @@ -assertTrue($term instanceof Zend_Search_Lucene_Index_Term); - - $this->assertEquals($term->text, 'term_text'); - $this->assertEquals($term->field, null); - - $term = new Zend_Search_Lucene_Index_Term('term_text', 'field_name'); - $this->assertEquals($term->text, 'term_text'); - $this->assertEquals($term->field, 'field_name'); - } - - public function testKey() - { - $term1_1 = new Zend_Search_Lucene_Index_Term('term_text1', 'field_name1'); - $term2_1 = new Zend_Search_Lucene_Index_Term('term_text2', 'field_name1'); - $term2_2 = new Zend_Search_Lucene_Index_Term('term_text2', 'field_name2'); - $term2_1Dup = new Zend_Search_Lucene_Index_Term('term_text2', 'field_name1'); - - $this->assertEquals($term1_1->text > $term2_1->text, $term1_1->key() > $term2_1->key()); - $this->assertEquals($term1_1->text >= $term2_1->text, $term1_1->key() >= $term2_1->key()); - - $this->assertEquals($term1_1->field > $term2_2->field, $term1_1->key() > $term2_2->key()); - $this->assertEquals($term1_1->field >= $term2_2->field, $term1_1->key() >= $term2_2->key()); - - $this->assertEquals($term2_1->key(), $term2_1Dup->key()); - } - - public function testGetPrefix() - { - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('term_text', 10), 'term_text'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('term_text', 9), 'term_text'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('term_text', 4), 'term'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('term_text', 0), ''); - } - - public function testGetPrefixUtf8() - { - // UTF-8 string with non-ascii symbols (Russian alphabet) - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ', 64), 'абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ', 33), 'абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ', 4), 'абвг'); - $this->assertEquals(Zend_Search_Lucene_Index_Term::getPrefix('абвгдеёжзийклмнопрÑтуфхцчшщьыъÑÑŽÑ', 0), ''); - - - - } -} - diff --git a/tests/Zend/Search/Lucene/Index/TermsPriorityQueueTest.php b/tests/Zend/Search/Lucene/Index/TermsPriorityQueueTest.php deleted file mode 100644 index f259183786..0000000000 --- a/tests/Zend/Search/Lucene/Index/TermsPriorityQueueTest.php +++ /dev/null @@ -1,694 +0,0 @@ -resetTermsStream(); - - // Skip "empty" segments - if ($segmentInfo->currentTerm() !== null) { - $segmentInfoQueue->put($segmentInfo); - } - } - - $result = array(); - while (($segmentInfo = $segmentInfoQueue->pop()) !== null) { - if ($segmentInfoQueue->top() === null || - $segmentInfoQueue->top()->currentTerm()->key() != - $segmentInfo->currentTerm()->key()) { - // We got new term - $result[] = $segmentInfo->currentTerm(); - } - - $segmentInfo->nextTerm(); - // check, if segment dictionary is finished - if ($segmentInfo->currentTerm() !== null) { - // Put segment back into the priority queue - $segmentInfoQueue->put($segmentInfo); - } - } - - $this->assertTrue($result == - array(new Zend_Search_Lucene_Index_Term('a', 'contents'), - new Zend_Search_Lucene_Index_Term('about', 'contents'), - new Zend_Search_Lucene_Index_Term('above', 'contents'), - new Zend_Search_Lucene_Index_Term('absolutely', 'contents'), - new Zend_Search_Lucene_Index_Term('accept', 'contents'), - new Zend_Search_Lucene_Index_Term('accesskey', 'contents'), - new Zend_Search_Lucene_Index_Term('account', 'contents'), - new Zend_Search_Lucene_Index_Term('accounts', 'contents'), - new Zend_Search_Lucene_Index_Term('adding', 'contents'), - new Zend_Search_Lucene_Index_Term('additional', 'contents'), - new Zend_Search_Lucene_Index_Term('adresses', 'contents'), - new Zend_Search_Lucene_Index_Term('advised', 'contents'), - new Zend_Search_Lucene_Index_Term('after', 'contents'), - new Zend_Search_Lucene_Index_Term('alan', 'contents'), - new Zend_Search_Lucene_Index_Term('alberton', 'contents'), - new Zend_Search_Lucene_Index_Term('alexander', 'contents'), - new Zend_Search_Lucene_Index_Term('align', 'contents'), - new Zend_Search_Lucene_Index_Term('alink', 'contents'), - new Zend_Search_Lucene_Index_Term('all', 'contents'), - new Zend_Search_Lucene_Index_Term('alphabetic', 'contents'), - new Zend_Search_Lucene_Index_Term('already', 'contents'), - new Zend_Search_Lucene_Index_Term('also', 'contents'), - new Zend_Search_Lucene_Index_Term('always', 'contents'), - new Zend_Search_Lucene_Index_Term('amazon', 'contents'), - new Zend_Search_Lucene_Index_Term('an', 'contents'), - new Zend_Search_Lucene_Index_Term('and', 'contents'), - new Zend_Search_Lucene_Index_Term('annoying', 'contents'), - new Zend_Search_Lucene_Index_Term('another', 'contents'), - new Zend_Search_Lucene_Index_Term('any', 'contents'), - new Zend_Search_Lucene_Index_Term('apart', 'contents'), - new Zend_Search_Lucene_Index_Term('api', 'contents'), - new Zend_Search_Lucene_Index_Term('appreciate', 'contents'), - new Zend_Search_Lucene_Index_Term('are', 'contents'), - new Zend_Search_Lucene_Index_Term('arising', 'contents'), - new Zend_Search_Lucene_Index_Term('as', 'contents'), - new Zend_Search_Lucene_Index_Term('asked', 'contents'), - new Zend_Search_Lucene_Index_Term('at', 'contents'), - new Zend_Search_Lucene_Index_Term('attach', 'contents'), - new Zend_Search_Lucene_Index_Term('attachments', 'contents'), - new Zend_Search_Lucene_Index_Term('authors', 'contents'), - new Zend_Search_Lucene_Index_Term('available', 'contents'), - new Zend_Search_Lucene_Index_Term('b', 'contents'), - new Zend_Search_Lucene_Index_Term('back', 'contents'), - new Zend_Search_Lucene_Index_Term('backwards', 'contents'), - new Zend_Search_Lucene_Index_Term('bar', 'contents'), - new Zend_Search_Lucene_Index_Term('base', 'contents'), - new Zend_Search_Lucene_Index_Term('be', 'contents'), - new Zend_Search_Lucene_Index_Term('beaver', 'contents'), - new Zend_Search_Lucene_Index_Term('because', 'contents'), - new Zend_Search_Lucene_Index_Term('been', 'contents'), - new Zend_Search_Lucene_Index_Term('before', 'contents'), - new Zend_Search_Lucene_Index_Term('bgcolor', 'contents'), - new Zend_Search_Lucene_Index_Term('binary', 'contents'), - new Zend_Search_Lucene_Index_Term('blockquote', 'contents'), - new Zend_Search_Lucene_Index_Term('body', 'contents'), - new Zend_Search_Lucene_Index_Term('book', 'contents'), - new Zend_Search_Lucene_Index_Term('border', 'contents'), - new Zend_Search_Lucene_Index_Term('bottom', 'contents'), - new Zend_Search_Lucene_Index_Term('break', 'contents'), - new Zend_Search_Lucene_Index_Term('brought', 'contents'), - new Zend_Search_Lucene_Index_Term('browser', 'contents'), - new Zend_Search_Lucene_Index_Term('bug', 'contents'), - new Zend_Search_Lucene_Index_Term('bugs', 'contents'), - new Zend_Search_Lucene_Index_Term('business', 'contents'), - new Zend_Search_Lucene_Index_Term('but', 'contents'), - new Zend_Search_Lucene_Index_Term('buy', 'contents'), - new Zend_Search_Lucene_Index_Term('buying', 'contents'), - new Zend_Search_Lucene_Index_Term('by', 'contents'), - new Zend_Search_Lucene_Index_Term('c', 'contents'), - new Zend_Search_Lucene_Index_Term('can', 'contents'), - new Zend_Search_Lucene_Index_Term('care', 'contents'), - new Zend_Search_Lucene_Index_Term('carefully', 'contents'), - new Zend_Search_Lucene_Index_Term('case', 'contents'), - new Zend_Search_Lucene_Index_Term('caused', 'contents'), - new Zend_Search_Lucene_Index_Term('cc', 'contents'), - new Zend_Search_Lucene_Index_Term('cd', 'contents'), - new Zend_Search_Lucene_Index_Term('cellpadding', 'contents'), - new Zend_Search_Lucene_Index_Term('cellspacing', 'contents'), - new Zend_Search_Lucene_Index_Term('center', 'contents'), - new Zend_Search_Lucene_Index_Term('certain', 'contents'), - new Zend_Search_Lucene_Index_Term('chances', 'contents'), - new Zend_Search_Lucene_Index_Term('change', 'contents'), - new Zend_Search_Lucene_Index_Term('changed', 'contents'), - new Zend_Search_Lucene_Index_Term('changes', 'contents'), - new Zend_Search_Lucene_Index_Term('changing', 'contents'), - new Zend_Search_Lucene_Index_Term('chapter', 'contents'), - new Zend_Search_Lucene_Index_Term('charset', 'contents'), - new Zend_Search_Lucene_Index_Term('check', 'contents'), - new Zend_Search_Lucene_Index_Term('class', 'contents'), - new Zend_Search_Lucene_Index_Term('classes', 'contents'), - new Zend_Search_Lucene_Index_Term('clay', 'contents'), - new Zend_Search_Lucene_Index_Term('clear', 'contents'), - new Zend_Search_Lucene_Index_Term('click', 'contents'), - new Zend_Search_Lucene_Index_Term('co', 'contents'), - new Zend_Search_Lucene_Index_Term('code', 'contents'), - new Zend_Search_Lucene_Index_Term('coding', 'contents'), - new Zend_Search_Lucene_Index_Term('colspan', 'contents'), - new Zend_Search_Lucene_Index_Term('com', 'contents'), - new Zend_Search_Lucene_Index_Term('commands', 'contents'), - new Zend_Search_Lucene_Index_Term('comment', 'contents'), - new Zend_Search_Lucene_Index_Term('community', 'contents'), - new Zend_Search_Lucene_Index_Term('company', 'contents'), - new Zend_Search_Lucene_Index_Term('compatibility', 'contents'), - new Zend_Search_Lucene_Index_Term('compatible', 'contents'), - new Zend_Search_Lucene_Index_Term('components', 'contents'), - new Zend_Search_Lucene_Index_Term('conditions', 'contents'), - new Zend_Search_Lucene_Index_Term('consequential', 'contents'), - new Zend_Search_Lucene_Index_Term('considered', 'contents'), - new Zend_Search_Lucene_Index_Term('consists', 'contents'), - new Zend_Search_Lucene_Index_Term('contact', 'contents'), - new Zend_Search_Lucene_Index_Term('contains', 'contents'), - new Zend_Search_Lucene_Index_Term('content', 'contents'), - new Zend_Search_Lucene_Index_Term('contents', 'contents'), - new Zend_Search_Lucene_Index_Term('contract', 'contents'), - new Zend_Search_Lucene_Index_Term('contribute', 'contents'), - new Zend_Search_Lucene_Index_Term('contributed', 'contents'), - new Zend_Search_Lucene_Index_Term('contributing', 'contents'), - new Zend_Search_Lucene_Index_Term('contributors', 'contents'), - new Zend_Search_Lucene_Index_Term('convissor', 'contents'), - new Zend_Search_Lucene_Index_Term('copyright', 'contents'), - new Zend_Search_Lucene_Index_Term('core', 'contents'), - new Zend_Search_Lucene_Index_Term('costa', 'contents'), - new Zend_Search_Lucene_Index_Term('could', 'contents'), - new Zend_Search_Lucene_Index_Term('cox', 'contents'), - new Zend_Search_Lucene_Index_Term('create', 'contents'), - new Zend_Search_Lucene_Index_Term('creating', 'contents'), - new Zend_Search_Lucene_Index_Term('cvs', 'contents'), - new Zend_Search_Lucene_Index_Term('cvsread', 'contents'), - new Zend_Search_Lucene_Index_Term('d', 'contents'), - new Zend_Search_Lucene_Index_Term('damage', 'contents'), - new Zend_Search_Lucene_Index_Term('damages', 'contents'), - new Zend_Search_Lucene_Index_Term('daniel', 'contents'), - new Zend_Search_Lucene_Index_Term('data', 'contents'), - new Zend_Search_Lucene_Index_Term('date', 'contents'), - new Zend_Search_Lucene_Index_Term('david', 'contents'), - new Zend_Search_Lucene_Index_Term('depends', 'contents'), - new Zend_Search_Lucene_Index_Term('derivative', 'contents'), - new Zend_Search_Lucene_Index_Term('derived', 'contents'), - new Zend_Search_Lucene_Index_Term('describes', 'contents'), - new Zend_Search_Lucene_Index_Term('details', 'contents'), - new Zend_Search_Lucene_Index_Term('detection', 'contents'), - new Zend_Search_Lucene_Index_Term('dev', 'contents'), - new Zend_Search_Lucene_Index_Term('developer', 'contents'), - new Zend_Search_Lucene_Index_Term('developers', 'contents'), - new Zend_Search_Lucene_Index_Term('diff', 'contents'), - new Zend_Search_Lucene_Index_Term('different', 'contents'), - new Zend_Search_Lucene_Index_Term('direct', 'contents'), - new Zend_Search_Lucene_Index_Term('disclaimed', 'contents'), - new Zend_Search_Lucene_Index_Term('disclaimer', 'contents'), - new Zend_Search_Lucene_Index_Term('distributed', 'contents'), - new Zend_Search_Lucene_Index_Term('distribution', 'contents'), - new Zend_Search_Lucene_Index_Term('div', 'contents'), - new Zend_Search_Lucene_Index_Term('dl', 'contents'), - new Zend_Search_Lucene_Index_Term('do', 'contents'), - new Zend_Search_Lucene_Index_Term('doc', 'contents'), - new Zend_Search_Lucene_Index_Term('docblock', 'contents'), - new Zend_Search_Lucene_Index_Term('docbook', 'contents'), - new Zend_Search_Lucene_Index_Term('docs', 'contents'), - new Zend_Search_Lucene_Index_Term('document', 'contents'), - new Zend_Search_Lucene_Index_Term('documentation', 'contents'), - new Zend_Search_Lucene_Index_Term('does', 'contents'), - new Zend_Search_Lucene_Index_Term('doesn', 'contents'), - new Zend_Search_Lucene_Index_Term('don', 'contents'), - new Zend_Search_Lucene_Index_Term('double', 'contents'), - new Zend_Search_Lucene_Index_Term('dt', 'contents'), - new Zend_Search_Lucene_Index_Term('dumbill', 'contents'), - new Zend_Search_Lucene_Index_Term('each', 'contents'), - new Zend_Search_Lucene_Index_Term('easiest', 'contents'), - new Zend_Search_Lucene_Index_Term('easy', 'contents'), - new Zend_Search_Lucene_Index_Term('edd', 'contents'), - new Zend_Search_Lucene_Index_Term('edit', 'contents'), - new Zend_Search_Lucene_Index_Term('eeeeee', 'contents'), - new Zend_Search_Lucene_Index_Term('email', 'contents'), - new Zend_Search_Lucene_Index_Term('endorse', 'contents'), - new Zend_Search_Lucene_Index_Term('english', 'contents'), - new Zend_Search_Lucene_Index_Term('equal', 'contents'), - new Zend_Search_Lucene_Index_Term('equiv', 'contents'), - new Zend_Search_Lucene_Index_Term('essential', 'contents'), - new Zend_Search_Lucene_Index_Term('even', 'contents'), - new Zend_Search_Lucene_Index_Term('event', 'contents'), - new Zend_Search_Lucene_Index_Term('everyone', 'contents'), - new Zend_Search_Lucene_Index_Term('example', 'contents'), - new Zend_Search_Lucene_Index_Term('exemplary', 'contents'), - new Zend_Search_Lucene_Index_Term('existing', 'contents'), - new Zend_Search_Lucene_Index_Term('expand', 'contents'), - new Zend_Search_Lucene_Index_Term('explanation', 'contents'), - new Zend_Search_Lucene_Index_Term('explanations', 'contents'), - new Zend_Search_Lucene_Index_Term('explicit', 'contents'), - new Zend_Search_Lucene_Index_Term('express', 'contents'), - new Zend_Search_Lucene_Index_Term('extension', 'contents'), - new Zend_Search_Lucene_Index_Term('fairly', 'contents'), - new Zend_Search_Lucene_Index_Term('faq', 'contents'), - new Zend_Search_Lucene_Index_Term('feature', 'contents'), - new Zend_Search_Lucene_Index_Term('feedback', 'contents'), - new Zend_Search_Lucene_Index_Term('feel', 'contents'), - new Zend_Search_Lucene_Index_Term('ff', 'contents'), - new Zend_Search_Lucene_Index_Term('ffffff', 'contents'), - new Zend_Search_Lucene_Index_Term('file', 'contents'), - new Zend_Search_Lucene_Index_Term('fill', 'contents'), - new Zend_Search_Lucene_Index_Term('financial', 'contents'), - new Zend_Search_Lucene_Index_Term('find', 'contents'), - new Zend_Search_Lucene_Index_Term('fine', 'contents'), - new Zend_Search_Lucene_Index_Term('finished', 'contents'), - new Zend_Search_Lucene_Index_Term('first', 'contents'), - new Zend_Search_Lucene_Index_Term('fitness', 'contents'), - new Zend_Search_Lucene_Index_Term('fix', 'contents'), - new Zend_Search_Lucene_Index_Term('fixed', 'contents'), - new Zend_Search_Lucene_Index_Term('following', 'contents'), - new Zend_Search_Lucene_Index_Term('foo', 'contents'), - new Zend_Search_Lucene_Index_Term('footer', 'contents'), - new Zend_Search_Lucene_Index_Term('for', 'contents'), - new Zend_Search_Lucene_Index_Term('force', 'contents'), - new Zend_Search_Lucene_Index_Term('forget', 'contents'), - new Zend_Search_Lucene_Index_Term('form', 'contents'), - new Zend_Search_Lucene_Index_Term('forms', 'contents'), - new Zend_Search_Lucene_Index_Term('forth', 'contents'), - new Zend_Search_Lucene_Index_Term('found', 'contents'), - new Zend_Search_Lucene_Index_Term('free', 'contents'), - new Zend_Search_Lucene_Index_Term('frequently', 'contents'), - new Zend_Search_Lucene_Index_Term('from', 'contents'), - new Zend_Search_Lucene_Index_Term('front', 'contents'), - new Zend_Search_Lucene_Index_Term('fully', 'contents'), - new Zend_Search_Lucene_Index_Term('functionality', 'contents'), - new Zend_Search_Lucene_Index_Term('generally', 'contents'), - new Zend_Search_Lucene_Index_Term('generator', 'contents'), - new Zend_Search_Lucene_Index_Term('giving', 'contents'), - new Zend_Search_Lucene_Index_Term('go', 'contents'), - new Zend_Search_Lucene_Index_Term('good', 'contents'), - new Zend_Search_Lucene_Index_Term('goods', 'contents'), - new Zend_Search_Lucene_Index_Term('gregory', 'contents'), - new Zend_Search_Lucene_Index_Term('groundbraking', 'contents'), - new Zend_Search_Lucene_Index_Term('group', 'contents'), - new Zend_Search_Lucene_Index_Term('guide', 'contents'), - new Zend_Search_Lucene_Index_Term('h', 'contents'), - new Zend_Search_Lucene_Index_Term('happy', 'contents'), - new Zend_Search_Lucene_Index_Term('has', 'contents'), - new Zend_Search_Lucene_Index_Term('hasn', 'contents'), - new Zend_Search_Lucene_Index_Term('have', 'contents'), - new Zend_Search_Lucene_Index_Term('head', 'contents'), - new Zend_Search_Lucene_Index_Term('header', 'contents'), - new Zend_Search_Lucene_Index_Term('help', 'contents'), - new Zend_Search_Lucene_Index_Term('helping', 'contents'), - new Zend_Search_Lucene_Index_Term('her', 'contents'), - new Zend_Search_Lucene_Index_Term('hesitate', 'contents'), - new Zend_Search_Lucene_Index_Term('his', 'contents'), - new Zend_Search_Lucene_Index_Term('holder', 'contents'), - new Zend_Search_Lucene_Index_Term('holders', 'contents'), - new Zend_Search_Lucene_Index_Term('home', 'contents'), - new Zend_Search_Lucene_Index_Term('homepage', 'contents'), - new Zend_Search_Lucene_Index_Term('how', 'contents'), - new Zend_Search_Lucene_Index_Term('however', 'contents'), - new Zend_Search_Lucene_Index_Term('hr', 'contents'), - new Zend_Search_Lucene_Index_Term('href', 'contents'), - new Zend_Search_Lucene_Index_Term('html', 'contents'), - new Zend_Search_Lucene_Index_Term('http', 'contents'), - new Zend_Search_Lucene_Index_Term('i', 'contents'), - new Zend_Search_Lucene_Index_Term('if', 'contents'), - new Zend_Search_Lucene_Index_Term('immoral', 'contents'), - new Zend_Search_Lucene_Index_Term('implied', 'contents'), - new Zend_Search_Lucene_Index_Term('important', 'contents'), - new Zend_Search_Lucene_Index_Term('improvement', 'contents'), - new Zend_Search_Lucene_Index_Term('improving', 'contents'), - new Zend_Search_Lucene_Index_Term('in', 'contents'), - new Zend_Search_Lucene_Index_Term('incidental', 'contents'), - new Zend_Search_Lucene_Index_Term('include', 'contents'), - new Zend_Search_Lucene_Index_Term('including', 'contents'), - new Zend_Search_Lucene_Index_Term('independent', 'contents'), - new Zend_Search_Lucene_Index_Term('index', 'contents'), - new Zend_Search_Lucene_Index_Term('indirect', 'contents'), - new Zend_Search_Lucene_Index_Term('information', 'contents'), - new Zend_Search_Lucene_Index_Term('install', 'contents'), - new Zend_Search_Lucene_Index_Term('installation', 'contents'), - new Zend_Search_Lucene_Index_Term('installer', 'contents'), - new Zend_Search_Lucene_Index_Term('interruption', 'contents'), - new Zend_Search_Lucene_Index_Term('into', 'contents'), - new Zend_Search_Lucene_Index_Term('introduce', 'contents'), - new Zend_Search_Lucene_Index_Term('introduction', 'contents'), - new Zend_Search_Lucene_Index_Term('is', 'contents'), - new Zend_Search_Lucene_Index_Term('iso', 'contents'), - new Zend_Search_Lucene_Index_Term('it', 'contents'), - new Zend_Search_Lucene_Index_Term('its', 'contents'), - new Zend_Search_Lucene_Index_Term('jansen', 'contents'), - new Zend_Search_Lucene_Index_Term('jon', 'contents'), - new Zend_Search_Lucene_Index_Term('keep', 'contents'), - new Zend_Search_Lucene_Index_Term('knowles', 'contents'), - new Zend_Search_Lucene_Index_Term('lack', 'contents'), - new Zend_Search_Lucene_Index_Term('languages', 'contents'), - new Zend_Search_Lucene_Index_Term('later', 'contents'), - new Zend_Search_Lucene_Index_Term('latest', 'contents'), - new Zend_Search_Lucene_Index_Term('left', 'contents'), - new Zend_Search_Lucene_Index_Term('legalnotice', 'contents'), - new Zend_Search_Lucene_Index_Term('li', 'contents'), - new Zend_Search_Lucene_Index_Term('liability', 'contents'), - new Zend_Search_Lucene_Index_Term('liable', 'contents'), - new Zend_Search_Lucene_Index_Term('license', 'contents'), - new Zend_Search_Lucene_Index_Term('licenses', 'contents'), - new Zend_Search_Lucene_Index_Term('like', 'contents'), - new Zend_Search_Lucene_Index_Term('limited', 'contents'), - new Zend_Search_Lucene_Index_Term('link', 'contents'), - new Zend_Search_Lucene_Index_Term('list', 'contents'), - new Zend_Search_Lucene_Index_Term('listed', 'contents'), - new Zend_Search_Lucene_Index_Term('lists', 'contents'), - new Zend_Search_Lucene_Index_Term('literal', 'contents'), - new Zend_Search_Lucene_Index_Term('ll', 'contents'), - new Zend_Search_Lucene_Index_Term('login', 'contents'), - new Zend_Search_Lucene_Index_Term('look', 'contents'), - new Zend_Search_Lucene_Index_Term('lorenzo', 'contents'), - new Zend_Search_Lucene_Index_Term('loss', 'contents'), - new Zend_Search_Lucene_Index_Term('loveless', 'contents'), - new Zend_Search_Lucene_Index_Term('mail', 'contents'), - new Zend_Search_Lucene_Index_Term('mailinglist', 'contents'), - new Zend_Search_Lucene_Index_Term('mailto', 'contents'), - new Zend_Search_Lucene_Index_Term('maintain', 'contents'), - new Zend_Search_Lucene_Index_Term('maintainer', 'contents'), - new Zend_Search_Lucene_Index_Term('maintainers', 'contents'), - new Zend_Search_Lucene_Index_Term('make', 'contents'), - new Zend_Search_Lucene_Index_Term('makes', 'contents'), - new Zend_Search_Lucene_Index_Term('manual', 'contents'), - new Zend_Search_Lucene_Index_Term('martin', 'contents'), - new Zend_Search_Lucene_Index_Term('material', 'contents'), - new Zend_Search_Lucene_Index_Term('materials', 'contents'), - new Zend_Search_Lucene_Index_Term('may', 'contents'), - new Zend_Search_Lucene_Index_Term('mean', 'contents'), - new Zend_Search_Lucene_Index_Term('means', 'contents'), - new Zend_Search_Lucene_Index_Term('meet', 'contents'), - new Zend_Search_Lucene_Index_Term('merchantability', 'contents'), - new Zend_Search_Lucene_Index_Term('merz', 'contents'), - new Zend_Search_Lucene_Index_Term('met', 'contents'), - new Zend_Search_Lucene_Index_Term('meta', 'contents'), - new Zend_Search_Lucene_Index_Term('michael', 'contents'), - new Zend_Search_Lucene_Index_Term('migrating', 'contents'), - new Zend_Search_Lucene_Index_Term('mika', 'contents'), - new Zend_Search_Lucene_Index_Term('mime', 'contents'), - new Zend_Search_Lucene_Index_Term('modification', 'contents'), - new Zend_Search_Lucene_Index_Term('modified', 'contents'), - new Zend_Search_Lucene_Index_Term('modular', 'contents'), - new Zend_Search_Lucene_Index_Term('more', 'contents'), - new Zend_Search_Lucene_Index_Term('must', 'contents'), - new Zend_Search_Lucene_Index_Term('n', 'contents'), - new Zend_Search_Lucene_Index_Term('name', 'contents'), - new Zend_Search_Lucene_Index_Term('names', 'contents'), - new Zend_Search_Lucene_Index_Term('navfooter', 'contents'), - new Zend_Search_Lucene_Index_Term('navheader', 'contents'), - new Zend_Search_Lucene_Index_Term('navigation', 'contents'), - new Zend_Search_Lucene_Index_Term('nbsp', 'contents'), - new Zend_Search_Lucene_Index_Term('need', 'contents'), - new Zend_Search_Lucene_Index_Term('negligence', 'contents'), - new Zend_Search_Lucene_Index_Term('neither', 'contents'), - new Zend_Search_Lucene_Index_Term('net', 'contents'), - new Zend_Search_Lucene_Index_Term('neufeind', 'contents'), - new Zend_Search_Lucene_Index_Term('new', 'contents'), - new Zend_Search_Lucene_Index_Term('newpackage', 'contents'), - new Zend_Search_Lucene_Index_Term('next', 'contents'), - new Zend_Search_Lucene_Index_Term('no', 'contents'), - new Zend_Search_Lucene_Index_Term('nor', 'contents'), - new Zend_Search_Lucene_Index_Term('not', 'contents'), - new Zend_Search_Lucene_Index_Term('note', 'contents'), - new Zend_Search_Lucene_Index_Term('notice', 'contents'), - new Zend_Search_Lucene_Index_Term('now', 'contents'), - new Zend_Search_Lucene_Index_Term('obtain', 'contents'), - new Zend_Search_Lucene_Index_Term('obtained', 'contents'), - new Zend_Search_Lucene_Index_Term('of', 'contents'), - new Zend_Search_Lucene_Index_Term('on', 'contents'), - new Zend_Search_Lucene_Index_Term('one', 'contents'), - new Zend_Search_Lucene_Index_Term('only', 'contents'), - new Zend_Search_Lucene_Index_Term('open', 'contents'), - new Zend_Search_Lucene_Index_Term('opencontent', 'contents'), - new Zend_Search_Lucene_Index_Term('openpub', 'contents'), - new Zend_Search_Lucene_Index_Term('or', 'contents'), - new Zend_Search_Lucene_Index_Term('order', 'contents'), - new Zend_Search_Lucene_Index_Term('org', 'contents'), - new Zend_Search_Lucene_Index_Term('originally', 'contents'), - new Zend_Search_Lucene_Index_Term('other', 'contents'), - new Zend_Search_Lucene_Index_Term('otherwise', 'contents'), - new Zend_Search_Lucene_Index_Term('our', 'contents'), - new Zend_Search_Lucene_Index_Term('out', 'contents'), - new Zend_Search_Lucene_Index_Term('outlook', 'contents'), - new Zend_Search_Lucene_Index_Term('p', 'contents'), - new Zend_Search_Lucene_Index_Term('package', 'contents'), - new Zend_Search_Lucene_Index_Term('packages', 'contents'), - new Zend_Search_Lucene_Index_Term('page', 'contents'), - new Zend_Search_Lucene_Index_Term('paper', 'contents'), - new Zend_Search_Lucene_Index_Term('parise', 'contents'), - new Zend_Search_Lucene_Index_Term('part', 'contents'), - new Zend_Search_Lucene_Index_Term('particular', 'contents'), - new Zend_Search_Lucene_Index_Term('password', 'contents'), - new Zend_Search_Lucene_Index_Term('patch', 'contents'), - new Zend_Search_Lucene_Index_Term('patches', 'contents'), - new Zend_Search_Lucene_Index_Term('pear', 'contents'), - new Zend_Search_Lucene_Index_Term('people', 'contents'), - new Zend_Search_Lucene_Index_Term('perform', 'contents'), - new Zend_Search_Lucene_Index_Term('permission', 'contents'), - new Zend_Search_Lucene_Index_Term('permitted', 'contents'), - new Zend_Search_Lucene_Index_Term('persists', 'contents'), - new Zend_Search_Lucene_Index_Term('php', 'contents'), - new Zend_Search_Lucene_Index_Term('phpfi', 'contents'), - new Zend_Search_Lucene_Index_Term('plain', 'contents'), - new Zend_Search_Lucene_Index_Term('please', 'contents'), - new Zend_Search_Lucene_Index_Term('possibility', 'contents'), - new Zend_Search_Lucene_Index_Term('post', 'contents'), - new Zend_Search_Lucene_Index_Term('postinstall', 'contents'), - new Zend_Search_Lucene_Index_Term('ppm', 'contents'), - new Zend_Search_Lucene_Index_Term('pre', 'contents'), - new Zend_Search_Lucene_Index_Term('preface', 'contents'), - new Zend_Search_Lucene_Index_Term('prefixed', 'contents'), - new Zend_Search_Lucene_Index_Term('presently', 'contents'), - new Zend_Search_Lucene_Index_Term('prev', 'contents'), - new Zend_Search_Lucene_Index_Term('previous', 'contents'), - new Zend_Search_Lucene_Index_Term('prior', 'contents'), - new Zend_Search_Lucene_Index_Term('process', 'contents'), - new Zend_Search_Lucene_Index_Term('procurement', 'contents'), - new Zend_Search_Lucene_Index_Term('products', 'contents'), - new Zend_Search_Lucene_Index_Term('profits', 'contents'), - new Zend_Search_Lucene_Index_Term('prohibited', 'contents'), - new Zend_Search_Lucene_Index_Term('project', 'contents'), - new Zend_Search_Lucene_Index_Term('promote', 'contents'), - new Zend_Search_Lucene_Index_Term('proper', 'contents'), - new Zend_Search_Lucene_Index_Term('provided', 'contents'), - new Zend_Search_Lucene_Index_Term('provides', 'contents'), - new Zend_Search_Lucene_Index_Term('pserver', 'contents'), - new Zend_Search_Lucene_Index_Term('public', 'contents'), - new Zend_Search_Lucene_Index_Term('publication', 'contents'), - new Zend_Search_Lucene_Index_Term('published', 'contents'), - new Zend_Search_Lucene_Index_Term('purpose', 'contents'), - new Zend_Search_Lucene_Index_Term('questions', 'contents'), - new Zend_Search_Lucene_Index_Term('quote', 'contents'), - new Zend_Search_Lucene_Index_Term('read', 'contents'), - new Zend_Search_Lucene_Index_Term('redistribution', 'contents'), - new Zend_Search_Lucene_Index_Term('redistributions', 'contents'), - new Zend_Search_Lucene_Index_Term('regents', 'contents'), - new Zend_Search_Lucene_Index_Term('rejected', 'contents'), - new Zend_Search_Lucene_Index_Term('rel', 'contents'), - new Zend_Search_Lucene_Index_Term('relevant', 'contents'), - new Zend_Search_Lucene_Index_Term('report', 'contents'), - new Zend_Search_Lucene_Index_Term('reported', 'contents'), - new Zend_Search_Lucene_Index_Term('reporting', 'contents'), - new Zend_Search_Lucene_Index_Term('repository', 'contents'), - new Zend_Search_Lucene_Index_Term('representatives', 'contents'), - new Zend_Search_Lucene_Index_Term('reproduce', 'contents'), - new Zend_Search_Lucene_Index_Term('requests', 'contents'), - new Zend_Search_Lucene_Index_Term('requirements', 'contents'), - new Zend_Search_Lucene_Index_Term('reserved', 'contents'), - new Zend_Search_Lucene_Index_Term('restrictions', 'contents'), - new Zend_Search_Lucene_Index_Term('resulting', 'contents'), - new Zend_Search_Lucene_Index_Term('retain', 'contents'), - new Zend_Search_Lucene_Index_Term('revision', 'contents'), - new Zend_Search_Lucene_Index_Term('right', 'contents'), - new Zend_Search_Lucene_Index_Term('rights', 'contents'), - new Zend_Search_Lucene_Index_Term('rpc', 'contents'), - new Zend_Search_Lucene_Index_Term('running', 'contents'), - new Zend_Search_Lucene_Index_Term('s', 'contents'), - new Zend_Search_Lucene_Index_Term('sample', 'contents'), - new Zend_Search_Lucene_Index_Term('schlitt', 'contents'), - new Zend_Search_Lucene_Index_Term('schmidt', 'contents'), - new Zend_Search_Lucene_Index_Term('screen', 'contents'), - new Zend_Search_Lucene_Index_Term('script', 'contents'), - new Zend_Search_Lucene_Index_Term('sect', 'contents'), - new Zend_Search_Lucene_Index_Term('section', 'contents'), - new Zend_Search_Lucene_Index_Term('see', 'contents'), - new Zend_Search_Lucene_Index_Term('send', 'contents'), - new Zend_Search_Lucene_Index_Term('seriously', 'contents'), - new Zend_Search_Lucene_Index_Term('service', 'contents'), - new Zend_Search_Lucene_Index_Term('services', 'contents'), - new Zend_Search_Lucene_Index_Term('set', 'contents'), - new Zend_Search_Lucene_Index_Term('several', 'contents'), - new Zend_Search_Lucene_Index_Term('shall', 'contents'), - new Zend_Search_Lucene_Index_Term('she', 'contents'), - new Zend_Search_Lucene_Index_Term('should', 'contents'), - new Zend_Search_Lucene_Index_Term('similar', 'contents'), - new Zend_Search_Lucene_Index_Term('so', 'contents'), - new Zend_Search_Lucene_Index_Term('software', 'contents'), - new Zend_Search_Lucene_Index_Term('some', 'contents'), - new Zend_Search_Lucene_Index_Term('something', 'contents'), - new Zend_Search_Lucene_Index_Term('source', 'contents'), - new Zend_Search_Lucene_Index_Term('sources', 'contents'), - new Zend_Search_Lucene_Index_Term('span', 'contents'), - new Zend_Search_Lucene_Index_Term('special', 'contents'), - new Zend_Search_Lucene_Index_Term('specific', 'contents'), - new Zend_Search_Lucene_Index_Term('speed', 'contents'), - new Zend_Search_Lucene_Index_Term('standard', 'contents'), - new Zend_Search_Lucene_Index_Term('standards', 'contents'), - new Zend_Search_Lucene_Index_Term('stefan', 'contents'), - new Zend_Search_Lucene_Index_Term('step', 'contents'), - new Zend_Search_Lucene_Index_Term('stephan', 'contents'), - new Zend_Search_Lucene_Index_Term('still', 'contents'), - new Zend_Search_Lucene_Index_Term('strict', 'contents'), - new Zend_Search_Lucene_Index_Term('structure', 'contents'), - new Zend_Search_Lucene_Index_Term('stylesheet', 'contents'), - new Zend_Search_Lucene_Index_Term('subject', 'contents'), - new Zend_Search_Lucene_Index_Term('submit', 'contents'), - new Zend_Search_Lucene_Index_Term('submitting', 'contents'), - new Zend_Search_Lucene_Index_Term('substantively', 'contents'), - new Zend_Search_Lucene_Index_Term('substitute', 'contents'), - new Zend_Search_Lucene_Index_Term('such', 'contents'), - new Zend_Search_Lucene_Index_Term('summary', 'contents'), - new Zend_Search_Lucene_Index_Term('support', 'contents'), - new Zend_Search_Lucene_Index_Term('sure', 'contents'), - new Zend_Search_Lucene_Index_Term('system', 'contents'), - new Zend_Search_Lucene_Index_Term('t', 'contents'), - new Zend_Search_Lucene_Index_Term('table', 'contents'), - new Zend_Search_Lucene_Index_Term('take', 'contents'), - new Zend_Search_Lucene_Index_Term('target', 'contents'), - new Zend_Search_Lucene_Index_Term('task', 'contents'), - new Zend_Search_Lucene_Index_Term('td', 'contents'), - new Zend_Search_Lucene_Index_Term('terms', 'contents'), - new Zend_Search_Lucene_Index_Term('test', 'contents'), - new Zend_Search_Lucene_Index_Term('tested', 'contents'), - new Zend_Search_Lucene_Index_Term('text', 'contents'), - new Zend_Search_Lucene_Index_Term('th', 'contents'), - new Zend_Search_Lucene_Index_Term('that', 'contents'), - new Zend_Search_Lucene_Index_Term('the', 'contents'), - new Zend_Search_Lucene_Index_Term('their', 'contents'), - new Zend_Search_Lucene_Index_Term('them', 'contents'), - new Zend_Search_Lucene_Index_Term('theory', 'contents'), - new Zend_Search_Lucene_Index_Term('there', 'contents'), - new Zend_Search_Lucene_Index_Term('think', 'contents'), - new Zend_Search_Lucene_Index_Term('this', 'contents'), - new Zend_Search_Lucene_Index_Term('thomas', 'contents'), - new Zend_Search_Lucene_Index_Term('those', 'contents'), - new Zend_Search_Lucene_Index_Term('thus', 'contents'), - new Zend_Search_Lucene_Index_Term('time', 'contents'), - new Zend_Search_Lucene_Index_Term('tips', 'contents'), - new Zend_Search_Lucene_Index_Term('title', 'contents'), - new Zend_Search_Lucene_Index_Term('titlepage', 'contents'), - new Zend_Search_Lucene_Index_Term('to', 'contents'), - new Zend_Search_Lucene_Index_Term('tobias', 'contents'), - new Zend_Search_Lucene_Index_Term('toc', 'contents'), - new Zend_Search_Lucene_Index_Term('top', 'contents'), - new Zend_Search_Lucene_Index_Term('tort', 'contents'), - new Zend_Search_Lucene_Index_Term('tr', 'contents'), - new Zend_Search_Lucene_Index_Term('tracking', 'contents'), - new Zend_Search_Lucene_Index_Term('translated', 'contents'), - new Zend_Search_Lucene_Index_Term('translating', 'contents'), - new Zend_Search_Lucene_Index_Term('translation', 'contents'), - new Zend_Search_Lucene_Index_Term('translations', 'contents'), - new Zend_Search_Lucene_Index_Term('translators', 'contents'), - new Zend_Search_Lucene_Index_Term('try', 'contents'), - new Zend_Search_Lucene_Index_Term('tt', 'contents'), - new Zend_Search_Lucene_Index_Term('tuupola', 'contents'), - new Zend_Search_Lucene_Index_Term('txt', 'contents'), - new Zend_Search_Lucene_Index_Term('type', 'contents'), - new Zend_Search_Lucene_Index_Term('u', 'contents'), - new Zend_Search_Lucene_Index_Term('ul', 'contents'), - new Zend_Search_Lucene_Index_Term('unable', 'contents'), - new Zend_Search_Lucene_Index_Term('under', 'contents'), - new Zend_Search_Lucene_Index_Term('understand', 'contents'), - new Zend_Search_Lucene_Index_Term('unified', 'contents'), - new Zend_Search_Lucene_Index_Term('unless', 'contents'), - new Zend_Search_Lucene_Index_Term('up', 'contents'), - new Zend_Search_Lucene_Index_Term('us', 'contents'), - new Zend_Search_Lucene_Index_Term('use', 'contents'), - new Zend_Search_Lucene_Index_Term('used', 'contents'), - new Zend_Search_Lucene_Index_Term('useful', 'contents'), - new Zend_Search_Lucene_Index_Term('usefulinc', 'contents'), - new Zend_Search_Lucene_Index_Term('userinput', 'contents'), - new Zend_Search_Lucene_Index_Term('users', 'contents'), - new Zend_Search_Lucene_Index_Term('using', 'contents'), - new Zend_Search_Lucene_Index_Term('usually', 'contents'), - new Zend_Search_Lucene_Index_Term('v', 'contents'), - new Zend_Search_Lucene_Index_Term('valign', 'contents'), - new Zend_Search_Lucene_Index_Term('verbose', 'contents'), - new Zend_Search_Lucene_Index_Term('version', 'contents'), - new Zend_Search_Lucene_Index_Term('versions', 'contents'), - new Zend_Search_Lucene_Index_Term('vlink', 'contents'), - new Zend_Search_Lucene_Index_Term('wallner', 'contents'), - new Zend_Search_Lucene_Index_Term('warranties', 'contents'), - new Zend_Search_Lucene_Index_Term('way', 'contents'), - new Zend_Search_Lucene_Index_Term('ways', 'contents'), - new Zend_Search_Lucene_Index_Term('we', 'contents'), - new Zend_Search_Lucene_Index_Term('webservices', 'contents'), - new Zend_Search_Lucene_Index_Term('welcome', 'contents'), - new Zend_Search_Lucene_Index_Term('what', 'contents'), - new Zend_Search_Lucene_Index_Term('when', 'contents'), - new Zend_Search_Lucene_Index_Term('whether', 'contents'), - new Zend_Search_Lucene_Index_Term('which', 'contents'), - new Zend_Search_Lucene_Index_Term('width', 'contents'), - new Zend_Search_Lucene_Index_Term('will', 'contents'), - new Zend_Search_Lucene_Index_Term('wish', 'contents'), - new Zend_Search_Lucene_Index_Term('wishlist', 'contents'), - new Zend_Search_Lucene_Index_Term('wishlists', 'contents'), - new Zend_Search_Lucene_Index_Term('with', 'contents'), - new Zend_Search_Lucene_Index_Term('without', 'contents'), - new Zend_Search_Lucene_Index_Term('won', 'contents'), - new Zend_Search_Lucene_Index_Term('work', 'contents'), - new Zend_Search_Lucene_Index_Term('would', 'contents'), - new Zend_Search_Lucene_Index_Term('write', 'contents'), - new Zend_Search_Lucene_Index_Term('writing', 'contents'), - new Zend_Search_Lucene_Index_Term('written', 'contents'), - new Zend_Search_Lucene_Index_Term('www', 'contents'), - new Zend_Search_Lucene_Index_Term('xml', 'contents'), - new Zend_Search_Lucene_Index_Term('xmlrpc', 'contents'), - new Zend_Search_Lucene_Index_Term('you', 'contents'), - new Zend_Search_Lucene_Index_Term('your', 'contents'), - new Zend_Search_Lucene_Index_Term('1178009946', 'modified'), - new Zend_Search_Lucene_Index_Term('about', 'path'), - new Zend_Search_Lucene_Index_Term('authors', 'path'), - new Zend_Search_Lucene_Index_Term('bugs', 'path'), - new Zend_Search_Lucene_Index_Term('contributing', 'path'), - new Zend_Search_Lucene_Index_Term('copyright', 'path'), - new Zend_Search_Lucene_Index_Term('core', 'path'), - new Zend_Search_Lucene_Index_Term('documentation', 'path'), - new Zend_Search_Lucene_Index_Term('html', 'path'), - new Zend_Search_Lucene_Index_Term('indexsource', 'path'), - new Zend_Search_Lucene_Index_Term('newpackage', 'path'), - new Zend_Search_Lucene_Index_Term('patches', 'path'), - new Zend_Search_Lucene_Index_Term('pear', 'path'), - new Zend_Search_Lucene_Index_Term('wishlist', 'path') - )); - - } -} - diff --git a/tests/Zend/Search/Lucene/Index/_files/mergedSegment.cfs.sample b/tests/Zend/Search/Lucene/Index/_files/mergedSegment.cfs.sample deleted file mode 100644 index e75828a2fca7602f01be3ab4402f1843c1547e8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42605 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 diff --git a/tests/Zend/Search/Lucene/Index/_source/_files/_0.cfs b/tests/Zend/Search/Lucene/Index/_source/_files/_0.cfs deleted file mode 100644 index 6ec3d076b26dd50d220271da74c22b9b321ee7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8995 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 diff --git a/tests/Zend/Search/Lucene/Index/_source/_files/_1.cfs b/tests/Zend/Search/Lucene/Index/_source/_files/_1.cfs deleted file mode 100644 index 99e466752288c56e84fb350c6cef9b3d95399ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12507 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 CiU?f* diff --git a/tests/Zend/Search/Lucene/Index/_source/_files/_1.sti b/tests/Zend/Search/Lucene/Index/_source/_files/_1.sti deleted file mode 100644 index 1e455fb5d3..0000000000 --- a/tests/Zend/Search/Lucene/Index/_source/_files/_1.sti +++ /dev/null @@ -1 +0,0 @@ -a:2:{i:0;a:3:{i:0;a:2:{i:0;i:-1;i:1;s:0:"";}i:1;a:2:{i:0;i:2;i:1;s:4:"head";}i:2;a:2:{i:0;i:2;i:1;s:3:"toc";}}i:1;a:3:{i:0;a:5:{i:0;i:0;i:1;i:0;i:2;i:0;i:3;i:0;i:4;i:20;}i:1;a:5:{i:0;i:2;i:1;i:224;i:2;i:572;i:3;i:0;i:4;i:1259;}i:2;a:5:{i:0;i:1;i:1;i:485;i:2;i:1239;i:3;i:0;i:4;i:2471;}}} \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/Index/_source/_files/_2.cfs b/tests/Zend/Search/Lucene/Index/_source/_files/_2.cfs deleted file mode 100644 index 3756c3f2715dec510f3e375de016faef31e78bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12913 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 F{u|rHCrkhU diff --git a/tests/Zend/Search/Lucene/Index/_source/_files/_3.cfs b/tests/Zend/Search/Lucene/Index/_source/_files/_3.cfs deleted file mode 100644 index aa6b9d8dd7f516e2468981c91186fd1a30a1f98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8605 zcmeHMd2Afld7tmi?Ck9DSdx+@QF5&DDzYlcK$(!{YrbVbP6>&&$r$XT#zH8W$_ox(#8iVw6>d zzHg?Scea9x@)z-EwA^NotqUqw_&e4{l#FjM2a~$cwuN@;Nr#ej|uvP zuHosGxmj~`csiSzz++`*Wj1S$UaPt+ZOuD3t;JB>A5KS&!*kh{j5(i~%Z{X`vh&%c z%*w)2${b&qU&+p|jHKqge63_xtqCtT=6M?yk6fwLW?*@sJ3u4q?%Cm5MoUg#Sddh}x7ApA;4nH*b~ zxM7aZW|o&nQofT522)Cfq|j( zDKoRDeROzY=4yS6`OH-wISV8JMwv0dXnA#RF0*t4S#|8ZQ?<(Wmb-2Tocq9DE5WO4 zGZQP*BdNiGfs-(AVF}_RsR4MKot<6GOiawoPwkeM7c=AaGDcY9VWxq)Sv1U#q|QnE zrtp?S)SN2JXu=P`I}L$!C?;hm8lz)y_{Op&rx3vLsI=wTC_CGjcFFqjtv`VkaZbbsP7MG+wkTu-K5EJTR#u$=Yg(f>%)Mh!+c_uSgJcPo1FyWoAZb0G8|e!5djZ^gLRzjR@Ik~mXJ1< ztJK>pLeMliyl9R-bYk$_CCjq1+m(`CmZJs2{S!X;^X>zcCpm7Zz5+ z$?(oW+cQ-rJ&)7>-cOZX7@j-VfMF}#1F!O4Vg20s#vpsKzGs-GCA}Gq(=cV)+YDp9 z5B|+g?1BFt^)2xF4zM4t8222#cbv5EA}TFr%Pp%pII9TGYNdIiVtI%r<9{2P{rgiC z-aV5&n$BstlkmnOnF82G>TTJ^T5Ua?HG6qR@7;OEl2h@ja;F@FB+Llu$M-zL*q?%X zp$H9{)WSFFWbGkqrD~V`64pXcH?XhTCU!!(GTv2tzPZQ$(~$348uGS_+IIyVxeE%L zSGxZTq=Z+s)ac%|YA+F)DOfvR4Wz;?Z{XVwWU**()ftCvK@sx~+mg&Q;w2ATm6Buo zl8OZOh69>Xbs7q|Q1f|4gRWSZ+>ReuThS59E6CbNlV#cEJTsd5=vB+#@dIbm%6pD) zZSvuZmDCB*DXZ!{TXU-puM>WQ&or?s3tq7ZTkZ#Lsbn!Ra{a)!Zn{BHw!NcG4_j;y z3@D!pEF6VgEJ*OqvkI(?*;*Kus@w_strZN0Xt?a{c$is# zol{;}1=qrsm|6_asuu4iso}KjGivd9qv19(Q1Ggo;W?y&gR#_$s+LZX%q}-920`Tm z>2$@htNoQ?1?TD@jq_7xX)22o)H5OJ;Iv9@Ok7yC+@T+~ZWi5Ku?Zc#x!Z0Te3b*s zPQ%Tc91sZrz^Lx44Q~+%%!jiuM@*ChsV3yh(wv87S7y^PFC5>yrz4y) z@RDgb>~5qa@TAgR5Y#conPDJC%(@AQa~>u_bLxO~D{w1_McFEPH`(6MoiIXjo>i($ zC>6 ziLIt3By=hSdGor#DQ&pZ!W~<8hfyp~;8{4HHm3XjW83%M@uf8i_k3i37li$P^BD6T z@0suNFteYg?mvj#`$4Y-mhbJ6W|sn=I5%|Z?P>74Ip=I|Klfbe`&A9dDUz}2<=uko z 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 diff --git a/tests/Zend/Search/Lucene/LuceneTest.php b/tests/Zend/Search/Lucene/LuceneTest.php deleted file mode 100644 index 4c8408112e..0000000000 --- a/tests/Zend/Search/Lucene/LuceneTest.php +++ /dev/null @@ -1,581 +0,0 @@ -_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testCreate() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - $this->assertTrue($index instanceof Zend_Search_Lucene_Interface); - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testOpen() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue($index instanceof Zend_Search_Lucene_Interface); - } - - public function testOpenNonCompound() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_nonCompoundIndexFiles'); - - $this->assertTrue($index instanceof Zend_Search_Lucene_Interface); - } - - public function testDefaultSearchField() - { - $currentDefaultSearchField = Zend_Search_Lucene::getDefaultSearchField(); - $this->assertEquals($currentDefaultSearchField, null); - - Zend_Search_Lucene::setDefaultSearchField('anotherField'); - $this->assertEquals(Zend_Search_Lucene::getDefaultSearchField(), 'anotherField'); - - Zend_Search_Lucene::setDefaultSearchField($currentDefaultSearchField); - } - - public function testCount() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals($index->count(), 10); - } - - public function testMaxDoc() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals($index->maxDoc(), 10); - } - - public function testNumDocs() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals($index->numDocs(), 9); - } - - public function testIsDeleted() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertFalse($index->isDeleted(3)); - $this->assertTrue($index->isDeleted(6)); - } - - public function testMaxBufferedDocs() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $currentMaxBufferedDocs = $index->getMaxBufferedDocs(); - - $index->setMaxBufferedDocs(234); - $this->assertEquals($index->getMaxBufferedDocs(), 234); - - $index->setMaxBufferedDocs($currentMaxBufferedDocs); - } - - public function testMaxMergeDocs() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $currentMaxMergeDocs = $index->getMaxMergeDocs(); - - $index->setMaxMergeDocs(34); - $this->assertEquals($index->getMaxMergeDocs(), 34); - - $index->setMaxMergeDocs($currentMaxMergeDocs); - } - - public function testMergeFactor() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $currentMergeFactor = $index->getMergeFactor(); - - $index->setMergeFactor(113); - $this->assertEquals($index->getMergeFactor(), 113); - - $index->setMergeFactor($currentMergeFactor); - } - - public function testFind() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting'); - $this->assertEquals(count($hits), 3); - } - - public function testGetFieldNames() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue(array_values($index->getFieldNames()) == array('path', 'modified', 'contents')); - } - - public function testGetDocument() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $doc = $index->getDocument(3); - - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document); - $this->assertEquals($doc->path, 'IndexSource/about-pear.html'); - } - - public function testHasTerm() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue($index->hasTerm(new Zend_Search_Lucene_Index_Term('packages', 'contents'))); - $this->assertFalse($index->hasTerm(new Zend_Search_Lucene_Index_Term('nonusedword', 'contents'))); - } - - public function testTermDocs() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue(array_values( $index->termDocs(new Zend_Search_Lucene_Index_Term('packages', 'contents')) ) == - array(0, 2, 6, 7, 8)); - } - - public function testTermPositions() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue($index->termPositions(new Zend_Search_Lucene_Index_Term('packages', 'contents')) == - array(0 => array(174), - 2 => array(40, 742), - 6 => array(6, 156, 163), - 7 => array(194), - 8 => array(55, 190, 405))); - } - - public function testDocFreq() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals($index->docFreq(new Zend_Search_Lucene_Index_Term('packages', 'contents')), 5); - } - - public function testGetSimilarity() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue($index->getSimilarity() instanceof Zend_Search_Lucene_Search_Similarity); - } - - public function testNorm() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue(abs($index->norm(3, 'contents') - 0.054688) < 0.000001); - } - - public function testHasDeletions() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertTrue($index->hasDeletions()); - } - - public function testDelete() - { - // Copy index sample into _files directory - $sampleIndexDir = dirname(__FILE__) . '/_indexSample/_files'; - $tempIndexDir = dirname(__FILE__) . '/_files'; - if (!is_dir($tempIndexDir)) { - mkdir($tempIndexDir); - } - - $this->_clearDirectory($tempIndexDir); - - $indexDir = opendir($sampleIndexDir); - while (($file = readdir($indexDir)) !== false) { - if (!is_dir($sampleIndexDir . '/' . $file)) { - copy($sampleIndexDir . '/' . $file, $tempIndexDir . '/' . $file); - } - } - closedir($indexDir); - - - $index = Zend_Search_Lucene::open($tempIndexDir); - - $this->assertFalse($index->isDeleted(2)); - $index->delete(2); - $this->assertTrue($index->isDeleted(2)); - - $index->commit(); - - unset($index); - - $index1 = Zend_Search_Lucene::open($tempIndexDir); - $this->assertTrue($index1->isDeleted(2)); - unset($index1); - - $this->_clearDirectory($tempIndexDir); - } - - public function testAddDocument() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - $indexSourceDir = dirname(__FILE__) . '/_indexSource/_files'; - $dir = opendir($indexSourceDir); - while (($file = readdir($dir)) !== false) { - if (is_dir($indexSourceDir . '/' . $file)) { - continue; - } - if (strcasecmp(substr($file, strlen($file)-5), '.html') != 0) { - continue; - } - - // Create new Document from a file - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Text('path', 'IndexSource/' . $file)); - $doc->addField(Zend_Search_Lucene_Field::Keyword( 'modified', filemtime($indexSourceDir . '/' . $file) )); - - $f = fopen($indexSourceDir . '/' . $file,'rb'); - $byteCount = filesize($indexSourceDir . '/' . $file); - - $data = ''; - while ( $byteCount > 0 && ($nextBlock = fread($f, $byteCount)) != false ) { - $data .= $nextBlock; - $byteCount -= strlen($nextBlock); - } - fclose($f); - - $doc->addField(Zend_Search_Lucene_Field::Text('contents', $data, 'ISO-8859-1')); - - // Add document to the index - $index->addDocument($doc); - } - closedir($dir); - - unset($index); - - $index1 = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - $this->assertTrue($index1 instanceof Zend_Search_Lucene_Interface); - unset($index1); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testOptimize() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - $index->setMaxBufferedDocs(2); - - $indexSourceDir = dirname(__FILE__) . '/_indexSource/_files'; - $dir = opendir($indexSourceDir); - while (($file = readdir($dir)) !== false) { - if (is_dir($indexSourceDir . '/' . $file)) { - continue; - } - if (strcasecmp(substr($file, strlen($file)-5), '.html') != 0) { - continue; - } - - // Create new Document from a file - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Keyword('path', 'IndexSource/' . $file)); - $doc->addField(Zend_Search_Lucene_Field::Keyword( 'modified', filemtime($indexSourceDir . '/' . $file) )); - - $f = fopen($indexSourceDir . '/' . $file,'rb'); - $byteCount = filesize($indexSourceDir . '/' . $file); - - $data = ''; - while ( $byteCount > 0 && ($nextBlock = fread($f, $byteCount)) != false ) { - $data .= $nextBlock; - $byteCount -= strlen($nextBlock); - } - fclose($f); - - $doc->addField(Zend_Search_Lucene_Field::Text('contents', $data, 'ISO-8859-1')); - - // Add document to the index - $index->addDocument($doc); - } - closedir($dir); - unset($index); - - $index1 = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - $this->assertTrue($index1 instanceof Zend_Search_Lucene_Interface); - $pathTerm = new Zend_Search_Lucene_Index_Term('IndexSource/contributing.html', 'path'); - $contributingDocs = $index1->termDocs($pathTerm); - foreach ($contributingDocs as $id) { - $index1->delete($id); - } - $index1->optimize(); - unset($index1); - - $index2 = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - $this->assertTrue($index2 instanceof Zend_Search_Lucene_Interface); - - $hits = $index2->find('submitting'); - $this->assertEquals(count($hits), 3); - unset($index2); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testTerms() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals(count($index->terms()), 607); - } - - public function testTermsStreamInterface() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $terms = array(); - - $index->resetTermsStream(); - while ($index->currentTerm() !== null) { - $terms[] = $index->currentTerm(); - $index->nextTerm(); - } - - $this->assertEquals(count($terms), 607); - } - - public function testTermsStreamInterfaceSkipTo() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $terms = array(); - - $index->resetTermsStream(); - $index->skipTo(new Zend_Search_Lucene_Index_Term('one', 'contents')); - - while ($index->currentTerm() !== null) { - $terms[] = $index->currentTerm(); - $index->nextTerm(); - } - - $this->assertEquals(count($terms), 244); - } - - public function testTermsStreamInterfaceSkipToTermsRetrieving() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $terms = array(); - - $index->resetTermsStream(); - $index->skipTo(new Zend_Search_Lucene_Index_Term('one', 'contents')); - - $terms[] = $index->currentTerm(); - $terms[] = $index->nextTerm(); - $terms[] = $index->nextTerm(); - - $index->closeTermsStream(); - - $this->assertTrue($terms == - array(new Zend_Search_Lucene_Index_Term('one', 'contents'), - new Zend_Search_Lucene_Index_Term('only', 'contents'), - new Zend_Search_Lucene_Index_Term('open', 'contents'), - )); - } - - public function testTermsStreamInterfaceSkipToTermsRetrievingZeroTermsCase() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - // Zero terms - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Text('contents', '')); - $index->addDocument($doc); - - unset($index); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - - $index->resetTermsStream(); - $index->skipTo(new Zend_Search_Lucene_Index_Term('term', 'contents')); - - $this->assertTrue($index->currentTerm() === null); - - $index->closeTermsStream(); - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testTermsStreamInterfaceSkipToTermsRetrievingOneTermsCase() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - // Zero terms - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Text('contents', 'someterm')); - $index->addDocument($doc); - - unset($index); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - - $index->resetTermsStream(); - $index->skipTo(new Zend_Search_Lucene_Index_Term('term', 'contents')); - - $this->assertTrue($index->currentTerm() === null); - - $index->closeTermsStream(); - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - public function testTermsStreamInterfaceSkipToTermsRetrievingTwoTermsCase() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - // Zero terms - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Text('contents', 'someterm word')); - $index->addDocument($doc); - - unset($index); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - - $index->resetTermsStream(); - $index->skipTo(new Zend_Search_Lucene_Index_Term('term', 'contents')); - - $this->assertTrue($index->currentTerm() == new Zend_Search_Lucene_Index_Term('word', 'contents')); - - $index->closeTermsStream(); - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - /** - * @group ZF-7518 - */ - public function testTermsStreamInterfaceSkipToMatchedTerm() - { - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - $doc = new Zend_Search_Lucene_Document(); - $doc->addField(Zend_Search_Lucene_Field::Keyword('test', 'f')); - $index->addDocument($doc); - - unset($index); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index/_files'); - - $hits = $index->find('test:[a TO t]'); - $this->assertEquals(1, count($hits)); - $this->assertEquals(0, reset($hits)->id); - - $hits = $index->find('test:f'); - $this->assertEquals(1, count($hits)); - $this->assertEquals(0, reset($hits)->id); - - $hits = $index->find('test:g'); - $this->assertEquals(0, count($hits)); - - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } - - /** - * @group ZF-9680 - */ - public function testIsDeletedWithoutExplicitCommit() - { - //$this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - - $index = Zend_Search_Lucene::create(dirname(__FILE__) . '/_index/_files'); - - $document = new Zend_Search_Lucene_Document; - $document->addField(Zend_Search_Lucene_Field::Keyword('_id', 'myId')); - $document->addField(Zend_Search_Lucene_Field::Keyword('bla', 'blubb')); - $index->addDocument($document); - - $this->assertFalse($index->isDeleted(0)); - unset($index); - - $this->_clearDirectory(dirname(__FILE__) . '/_index/_files'); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Search_Lucene_LuceneTest::main') { - Zend_Search_Lucene_LuceneTest::main(); -} diff --git a/tests/Zend/Search/Lucene/PriorityQueueTest.php b/tests/Zend/Search/Lucene/PriorityQueueTest.php deleted file mode 100644 index 851637d972..0000000000 --- a/tests/Zend/Search/Lucene/PriorityQueueTest.php +++ /dev/null @@ -1,141 +0,0 @@ -assertTrue($queue instanceof Zend_Search_Lucene_PriorityQueue); - } - - public function testPut() - { - $queue = new Zend_Search_Lucene_PriorityQueue_testClass(); - - $queue->put(1); - $queue->put(100); - $queue->put(46); - $queue->put(347); - $queue->put(11); - $queue->put(125); - $queue->put(-10); - $queue->put(100); - } - - public function testPop() - { - $queue = new Zend_Search_Lucene_PriorityQueue_testClass(); - - $queue->put( 1); - $queue->put( 100); - $queue->put( 46); - $queue->put( 347); - $queue->put( 11); - $queue->put( 125); - $queue->put(-10); - $queue->put( 100); - - $this->assertEquals($queue->pop(), -10); - $this->assertEquals($queue->pop(), 1 ); - $this->assertEquals($queue->pop(), 11 ); - $this->assertEquals($queue->pop(), 46 ); - $this->assertEquals($queue->pop(), 100); - $this->assertEquals($queue->pop(), 100); - $this->assertEquals($queue->pop(), 125); - - $queue->put( 144); - $queue->put( 546); - $queue->put( 15); - $queue->put( 125); - $queue->put( 325); - $queue->put(-12); - $queue->put( 347); - - $this->assertEquals($queue->pop(), -12); - $this->assertEquals($queue->pop(), 15 ); - $this->assertEquals($queue->pop(), 125); - $this->assertEquals($queue->pop(), 144); - $this->assertEquals($queue->pop(), 325); - $this->assertEquals($queue->pop(), 347); - $this->assertEquals($queue->pop(), 347); - $this->assertEquals($queue->pop(), 546); - } - - public function testClear() - { - $queue = new Zend_Search_Lucene_PriorityQueue_testClass(); - - $queue->put( 1); - $queue->put( 100); - $queue->put( 46); - $queue->put(-10); - $queue->put( 100); - - $this->assertEquals($queue->pop(), -10); - $this->assertEquals($queue->pop(), 1 ); - $this->assertEquals($queue->pop(), 46 ); - - $queue->clear(); - $this->assertEquals($queue->pop(), null); - - $queue->put( 144); - $queue->put( 546); - $queue->put( 15); - - $this->assertEquals($queue->pop(), 15 ); - $this->assertEquals($queue->pop(), 144); - $this->assertEquals($queue->pop(), 546); - } -} - - -class Zend_Search_Lucene_PriorityQueue_testClass extends Zend_Search_Lucene_PriorityQueue -{ - /** - * Compare elements - * - * Returns true, if $el1 is less than $el2; else otherwise - * - * @param mixed $el1 - * @param mixed $el2 - * @return boolean - */ - protected function _less($el1, $el2) - { - return ($el1 < $el2); - } -} diff --git a/tests/Zend/Search/Lucene/Search23Test.php b/tests/Zend/Search/Lucene/Search23Test.php deleted file mode 100755 index e10dee1d82..0000000000 --- a/tests/Zend/Search/Lucene/Search23Test.php +++ /dev/null @@ -1,579 +0,0 @@ -)', - '', - '', - '((pathkeyword:"jakarta apache") (path:"jakarta apache") (modified:"jakarta apache") (contents:"jakarta apache")) -((pathkeyword:"apache lucene") (path:"apache lucene") (modified:"apache lucene") (contents:"apache lucene"))', - '+((pathkeyword:jakarta path:jakarta modified:jakarta contents:jakarta) (pathkeyword:apache path:apache modified:apache contents:apache)) +(pathkeyword:website path:website modified:website contents:website)', - '+((pathkeyword:jakarta path:jakarta modified:jakarta contents:jakarta) (pathkeyword:apache path:apache modified:apache contents:apache)) +(pathkeyword:website path:website modified:website contents:website)', - '(+(title:return) +(title:"pink panther"))', - '(+(+title:return +title:value) +(title:"pink panther") +(body:cool))', - '+(contents:apache) +() +()', - '+(contents:apache) +() +()', - '(f1:word) (+(f1:word) +(f1:word))', - '(f1:word) (-(f1:word) +(f1:word))'); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - foreach ($queries as $id => $queryString) { - $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString); - - $this->assertTrue($query instanceof Zend_Search_Lucene_Search_Query); - $this->assertEquals($query->rewrite($index)->__toString(), $rewrittenQueries[$id]); - } - - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($wildcardMinPrefix); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($defaultPrefixLength); - } - - public function testQueryParserExceptionsHandling() - { - $this->assertTrue(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - - try { - $query = Zend_Search_Lucene_Search_QueryParser::parse('contents:[business TO by}'); - } catch (Zend_Search_Lucene_Exception $e) { - $this->fail('exception raised while parsing a query'); - } - - $this->assertEquals('contents business to by', $query->__toString()); - - Zend_Search_Lucene_Search_QueryParser::dontSuppressQueryParsingExceptions(); - $this->assertFalse(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - - try { - $query = Zend_Search_Lucene_Search_QueryParser::parse('contents:[business TO by}'); - - $this->fail('exception wasn\'t raised while parsing a query'); - } catch (Zend_Search_Lucene_Exception $e) { - $this->assertEquals('Syntax error at char position 25.', $e->getMessage()); - } - - - Zend_Search_Lucene_Search_QueryParser::suppressQueryParsingExceptions(); - $this->assertTrue(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - } - - public function testEmptyQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find(''); - - $this->assertEquals(count($hits), 0); - } - - public function testTermQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('submitting'); - - $this->assertEquals(count($hits), 3); - $expectedResultset = array(array(2, 0.114555, 'IndexSource/contributing.patches.html'), - array(7, 0.112241, 'IndexSource/contributing.bugs.html'), - array(8, 0.112241, 'IndexSource/contributing.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testMultiTermQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('submitting AND wishlists'); - - $this->assertEquals(count($hits), 1); - - $this->assertEquals($hits[0]->id, 8); - $this->assertTrue( abs($hits[0]->score - 0.141633) < 0.000001 ); - $this->assertEquals($hits[0]->path, 'IndexSource/contributing.html'); - } - - public function testPraseQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('"reporting bugs"'); - - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testQueryParserKeywordsHandlingPhrase() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - - $query = Zend_Search_Lucene_Search_QueryParser::parse('"IndexSource/contributing.wishlist.html" AND Home'); - - $this->assertEquals($query->__toString(), '+("IndexSource/contributing.wishlist.html") +(Home)'); - $this->assertEquals($query->rewrite($index)->__toString(), - '+((pathkeyword:IndexSource/contributing.wishlist.html) (path:"indexsource contributing wishlist html") (modified:"indexsource contributing wishlist html") (contents:"indexsource contributing wishlist html")) +(pathkeyword:home path:home modified:home contents:home)'); - $this->assertEquals($query->rewrite($index)->optimize($index)->__toString(), '+( (path:"indexsource contributing wishlist html") (pathkeyword:IndexSource/contributing.wishlist.html)) +(contents:home)'); - - - $hits = $index->find('"IndexSource/contributing.bugs.html"'); - - $this->assertEquals(count($hits), 1); - $expectedResultset = array(array(7, 1, 'IndexSource/contributing.bugs.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testQueryParserKeywordsHandlingTerm() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - - $query = Zend_Search_Lucene_Search_QueryParser::parse('IndexSource\/contributing\.wishlist\.html AND Home'); - - $this->assertEquals($query->__toString(), '+(IndexSource/contributing.wishlist.html) +(Home)'); - $this->assertEquals($query->rewrite($index)->__toString(), - '+(pathkeyword:IndexSource/contributing.wishlist.html path:indexsource path:contributing path:wishlist path:html modified:indexsource modified:contributing modified:wishlist modified:html contents:indexsource contents:contributing contents:wishlist contents:html) +(pathkeyword:home path:home modified:home contents:home)'); - $this->assertEquals($query->rewrite($index)->optimize($index)->__toString(), '+(pathkeyword:IndexSource/contributing.wishlist.html path:indexsource path:contributing path:wishlist path:html contents:contributing contents:wishlist contents:html) +(contents:home)'); - - - $hits = $index->find('IndexSource\/contributing\.wishlist\.html AND Home'); - - $this->assertEquals(count($hits), 9); - $expectedResultset = array(array(1, 1.000000, 'IndexSource/contributing.wishlist.html'), - array(8, 0.167593, 'IndexSource/contributing.html'), - array(0, 0.154047, 'IndexSource/contributing.documentation.html'), - array(7, 0.108574, 'IndexSource/contributing.bugs.html'), - array(2, 0.104248, 'IndexSource/contributing.patches.html'), - array(3, 0.048998, 'IndexSource/about-pear.html'), - array(9, 0.039942, 'IndexSource/core.html'), - array(5, 0.038530, 'IndexSource/authors.html'), - array(4, 0.036261, 'IndexSource/copyright.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('submitting AND (wishlists OR requirements)'); - - $this->assertEquals(count($hits), 2); - $expectedResultset = array(array(7, 0.095697, 'IndexSource/contributing.bugs.html'), - array(8, 0.075573, 'IndexSource/contributing.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQueryWithPhraseSubquery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('"PEAR developers" AND Home'); - - $this->assertEquals(count($hits), 1); - $expectedResultset = array(array(1, 0.168270, 'IndexSource/contributing.wishlist.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQueryWithNonExistingPhraseSubquery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $query = Zend_Search_Lucene_Search_QueryParser::parse('"Non-existing phrase" AND Home'); - - $this->assertEquals($query->__toString(), '+("Non-existing phrase") +(Home)'); - $this->assertEquals($query->rewrite($index)->__toString(), - '+((pathkeyword:"non existing phrase") (path:"non existing phrase") (modified:"non existing phrase") (contents:"non existing phrase")) +(pathkeyword:home path:home modified:home contents:home)'); - $this->assertEquals($query->rewrite($index)->optimize($index)->__toString(), ''); - } - - public function testFilteredTokensQueryParserProcessing() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $this->assertEquals(count(Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize('123456787654321')), 0); - - - $hits = $index->find('"PEAR developers" AND Home AND 123456787654321'); - - $this->assertEquals(count($hits), 1); - $expectedResultset = array(array(1, 0.168270, 'IndexSource/contributing.wishlist.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testWildcardQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $wildcardMinPrefix = Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength(); - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0); - - $hits = $index->find('*cont*'); - - $this->assertEquals(count($hits), 9); - $expectedResultset = array(array(8, 0.328087, 'IndexSource/contributing.html'), - array(2, 0.318592, 'IndexSource/contributing.patches.html'), - array(7, 0.260137, 'IndexSource/contributing.bugs.html'), - array(0, 0.203372, 'IndexSource/contributing.documentation.html'), - array(1, 0.202366, 'IndexSource/contributing.wishlist.html'), - array(4, 0.052931, 'IndexSource/copyright.html'), - array(3, 0.017070, 'IndexSource/about-pear.html'), - array(5, 0.010150, 'IndexSource/authors.html'), - array(9, 0.003504, 'IndexSource/core.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($wildcardMinPrefix); - } - - public function testFuzzyQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $defaultPrefixLength = Zend_Search_Lucene_Search_Query_Fuzzy::getDefaultPrefixLength(); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength(0); - - $hits = $index->find('tesd~0.4'); - - $this->assertEquals(count($hits), 9); - $expectedResultset = array(array(2, 0.037139, 'IndexSource/contributing.patches.html'), - array(0, 0.008735, 'IndexSource/contributing.documentation.html'), - array(7, 0.002449, 'IndexSource/contributing.bugs.html'), - array(1, 0.000483, 'IndexSource/contributing.wishlist.html'), - array(3, 0.000483, 'IndexSource/about-pear.html'), - array(9, 0.000483, 'IndexSource/core.html'), - array(5, 0.000414, 'IndexSource/authors.html'), - array(8, 0.000414, 'IndexSource/contributing.html'), - array(4, 0.000345, 'IndexSource/copyright.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($defaultPrefixLength); - } - - public function testInclusiveRangeQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('[xml TO zzzzz]'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(4, 0.156366, 'IndexSource/copyright.html'), - array(2, 0.080458, 'IndexSource/contributing.patches.html'), - array(7, 0.060214, 'IndexSource/contributing.bugs.html'), - array(1, 0.009687, 'IndexSource/contributing.wishlist.html'), - array(5, 0.005871, 'IndexSource/authors.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testNonInclusiveRangeQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('{xml TO zzzzz}'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(2, 0.1308671, 'IndexSource/contributing.patches.html'), - array(7, 0.0979391, 'IndexSource/contributing.bugs.html'), - array(4, 0.0633930, 'IndexSource/copyright.html'), - array(1, 0.0157556, 'IndexSource/contributing.wishlist.html'), - array(5, 0.0095493, 'IndexSource/authors.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testDefaultSearchField() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $storedDefaultSearchField = Zend_Search_Lucene::getDefaultSearchField(); - - Zend_Search_Lucene::setDefaultSearchField('path'); - $hits = $index->find('contributing'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(8, 0.847922, 'IndexSource/contributing.html'), - array(0, 0.678337, 'IndexSource/contributing.documentation.html'), - array(1, 0.678337, 'IndexSource/contributing.wishlist.html'), - array(2, 0.678337, 'IndexSource/contributing.patches.html'), - array(7, 0.678337, 'IndexSource/contributing.bugs.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene::setDefaultSearchField($storedDefaultSearchField); - } - - public function testQueryHit() - { - // Restore default search field if it wasn't done by previous test because of failure - Zend_Search_Lucene::setDefaultSearchField(null); - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('submitting AND wishlists'); - $hit = $hits[0]; - - - $this->assertTrue($hit instanceof Zend_Search_Lucene_Search_QueryHit); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $doc = $hit->getDocument(); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document); - - $this->assertEquals($doc->path, 'IndexSource/contributing.html'); - } - - public function testDelayedResourceCleanUp() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('submitting AND wishlists'); - unset($index); - - $hit = $hits[0]; - $this->assertTrue($hit instanceof Zend_Search_Lucene_Search_QueryHit); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $doc = $hit->getDocument(); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $this->assertEquals($doc->path, 'IndexSource/contributing.html'); - } - - public function testSortingResult() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('"reporting bugs"', 'path'); - - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testSortingResultByScore() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $hits = $index->find('"reporting bugs"', 'score', SORT_NUMERIC, SORT_ASC, - 'path', SORT_STRING, SORT_ASC); - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(2, 0.176996, 'IndexSource/contributing.patches.html'), - array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - $hits = $index->find('"reporting bugs"', 'score', SORT_NUMERIC, SORT_ASC, - 'path', SORT_STRING, SORT_DESC); - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(2, 0.176996, 'IndexSource/contributing.patches.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testLimitingResult() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_index23Sample/_files'); - - $storedResultSetLimit = Zend_Search_Lucene::getResultSetLimit(); - - Zend_Search_Lucene::setResultSetLimit(3); - - $hits = $index->find('"reporting bugs"', 'path'); - - $this->assertEquals(count($hits), 3); - $expectedResultset = array(array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene::setResultSetLimit($storedResultSetLimit); - } -} diff --git a/tests/Zend/Search/Lucene/SearchHighlightTest.php b/tests/Zend/Search/Lucene/SearchHighlightTest.php deleted file mode 100644 index 26630fbe5f..0000000000 --- a/tests/Zend/Search/Lucene/SearchHighlightTest.php +++ /dev/null @@ -1,266 +0,0 @@ -_wildcardMinPrefix = Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength(); - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0); - - require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; - $this->_defaultPrefixLength = Zend_Search_Lucene_Search_Query_Fuzzy::getDefaultPrefixLength(); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength(0); - } - - public function tearDown() - { - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($this->_wildcardMinPrefix); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($this->_defaultPrefixLength); - } - - - public function testHtmlFragmentHighlightMatches() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('title:"The Right Way" AND text:go'); - - $highlightedHtmlFragment = $query->htmlFragmentHighlightMatches('Text highlighting using Zend_Search_Lucene is the right way to go!'); - - $this->assertEquals($highlightedHtmlFragment, - 'Text highlighting using Zend_Search_Lucene is the right way to go!'); - } - -// public function testHtmlFragmentHighlightMatchesCyrillic() -// { -// $query = Zend_Search_Lucene_Search_QueryParser::parse('title:"некоторый текÑÑ‚" AND text:поехали'); -// -// $highlightedHtmlFragment = $query->htmlFragmentHighlightMatches('ПодÑвечиваем некоторый текÑÑ‚ Ñ Ð¸Ñпользованием Zend_Search_Lucene. Поехали!'); -// -// $this->assertEquals($highlightedHtmlFragment, -// 'Text highlighting using Zend_Search_Lucene is the right way to go!'); -// } -// -// public function testHtmlFragmentHighlightMatchesCyrillicWindows() -// { -// $query = Zend_Search_Lucene_Search_QueryParser::parse('title:"Ðекоторый текÑÑ‚" AND text:поехали'); -// -// $highlightedHtmlFragment = -// $query->htmlFragmentHighlightMatches(iconv('UTF-8', -// 'Windows-1251', -// 'ПодÑвечиваем некоторый текÑÑ‚ Ñ Ð¸Ñпользованием Zend_Search_Lucene. Поехали!'), -// 'Windows-1251'); -// -// $this->assertEquals($highlightedHtmlFragment, -// 'Text highlighting using Zend_Search_Lucene is the right way to go!'); -// } - - public function testHighlightPhrasePlusTerm() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('title:"The Right Way" AND text:go'); - - $html = '' - . 'Page title' - . '' - . 'Text highlighting using Zend_Search_Lucene is the right way to go!' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'the') !== false); - $this->assertTrue(strpos($highlightedHTML, 'right') !== false); - $this->assertTrue(strpos($highlightedHTML, 'way') !== false); - $this->assertTrue(strpos($highlightedHTML, 'go') !== false); - } - - public function testHighlightMultitermWithProhibitedTerms() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('+text +highlighting -using -right +go'); - - $html = '' - . 'Page title' - . '' - . 'Text highlighting using Zend_Search_Lucene is the right way to go!' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'Text') !== false); - $this->assertTrue(strpos($highlightedHTML, 'highlighting') !== false); - $this->assertTrue(strpos($highlightedHTML, 'using Zend_Search_Lucene is the right way to') !== false); - $this->assertTrue(strpos($highlightedHTML, 'go') !== false); - } - - public function testHighlightWildcard1() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('te?t'); - - $html = '' - . 'Page title' - . '' - . 'Test of text highlighting using wildcard query with question mark. Testing...' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'Test') !== false); - $this->assertTrue(strpos($highlightedHTML, 'text') !== false); - // Check that 'Testing' word is not highlighted - $this->assertTrue(strpos($highlightedHTML, 'mark. Testing...') !== false); - } - - public function testHighlightWildcard2() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('te?t*'); - - $html = '' - . 'Page title' - . '' - . 'Test of text highlighting using wildcard query with question mark. Testing...' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'Test') !== false); - $this->assertTrue(strpos($highlightedHTML, 'text') !== false); - // Check that 'Testing' word is also highlighted - $this->assertTrue(strpos($highlightedHTML, 'Testing') !== false); - } - - public function testHighlightFuzzy1() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('test~'); - - $html = '' - . 'Page title' - . '' - . 'Test of text fuzzy search terms highlighting. ' - . 'Words: test, text, latest, left, list, next, ...' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'Test') !== false); - $this->assertTrue(strpos($highlightedHTML, 'test') !== false); - $this->assertTrue(strpos($highlightedHTML, 'text') !== false); - // Check that other words are not highlighted - $this->assertTrue(strpos($highlightedHTML, 'latest, left, list, next, ...') !== false); - } - - public function testHighlightFuzzy2() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('test~0.4'); - - $html = '' - . 'Page title' - . '' - . 'Test of text fuzzy search terms highlighting. ' - . 'Words: test, text, latest, left, list, next, ...' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'Test') !== false); - $this->assertTrue(strpos($highlightedHTML, 'test') !== false); - // Check that other words are also highlighted - $this->assertTrue(strpos($highlightedHTML, 'text') !== false); - $this->assertTrue(strpos($highlightedHTML, 'latest') !== false); - $this->assertTrue(strpos($highlightedHTML, 'left') !== false); - $this->assertTrue(strpos($highlightedHTML, 'list') !== false); - $this->assertTrue(strpos($highlightedHTML, 'next') !== false); - } - - public function testHighlightRangeInclusive() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('[business TO by]'); - - $html = '' - . 'Page title' - . '' - . 'Test of text using range query. ' - . 'It has to match "business", "by", "buss" and "but" words, but has to skip "bus"' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'business') !== false); - $this->assertTrue(strpos($highlightedHTML, 'by') !== false); - $this->assertTrue(strpos($highlightedHTML, 'buss') !== false); - $this->assertTrue(strpos($highlightedHTML, 'but') !== false); - // Check that "bus" word is skipped - $this->assertTrue(strpos($highlightedHTML, 'has to skip "bus"') !== false); - } - - public function testHighlightRangeNonInclusive() - { - $query = Zend_Search_Lucene_Search_QueryParser::parse('{business TO by}'); - - $html = '' - . 'Page title' - . '' - . 'Test of text using range query. ' - . 'It has to match "buss" and "but" words, but has to skip "business", "by" and "bus"' - . '' - . ''; - - $highlightedHTML = $query->highlightMatches($html); - - $this->assertTrue(strpos($highlightedHTML, 'buss') !== false); - $this->assertTrue(strpos($highlightedHTML, 'but') !== false); - // Check that "bus" word is skipped - $this->assertTrue(strpos($highlightedHTML, 'has to skip "business", "by" and "bus"') !== false); - } -} diff --git a/tests/Zend/Search/Lucene/SearchTest.php b/tests/Zend/Search/Lucene/SearchTest.php deleted file mode 100644 index 6dd9f952f5..0000000000 --- a/tests/Zend/Search/Lucene/SearchTest.php +++ /dev/null @@ -1,489 +0,0 @@ -)', - '', - '', - '((path:"jakarta apache") (modified:"jakarta apache") (contents:"jakarta apache")) -((path:"apache lucene") (modified:"apache lucene") (contents:"apache lucene"))', - '+((path:jakarta modified:jakarta contents:jakarta) (path:apache modified:apache contents:apache)) +(path:website modified:website contents:website)', - '+((path:jakarta modified:jakarta contents:jakarta) (path:apache modified:apache contents:apache)) +(path:website modified:website contents:website)', - '(+(title:return) +(title:"pink panther"))', - '(+(+title:return +title:value) +(title:"pink panther") +(body:cool))', - '+(contents:apache) +() +()', - '+(contents:apache) +() +()', - '(f1:word) (+(f1:word) +(f1:word))', - '(f1:word) (-(f1:word) +(f1:word))'); - - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - foreach ($queries as $id => $queryString) { - $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString); - - $this->assertTrue($query instanceof Zend_Search_Lucene_Search_Query); - $this->assertEquals($query->rewrite($index)->__toString(), $rewrittenQueries[$id]); - } - - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($wildcardMinPrefix); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($defaultPrefixLength); - } - - public function testQueryParserExceptionsHandling() - { - $this->assertTrue(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - - try { - $query = Zend_Search_Lucene_Search_QueryParser::parse('contents:[business TO by}'); - } catch (Zend_Search_Lucene_Exception $e) { - $this->fail('exception raised while parsing a query'); - } - - $this->assertEquals('contents business to by', $query->__toString()); - - Zend_Search_Lucene_Search_QueryParser::dontSuppressQueryParsingExceptions(); - $this->assertFalse(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - - try { - $query = Zend_Search_Lucene_Search_QueryParser::parse('contents:[business TO by}'); - - $this->fail('exception wasn\'t raised while parsing a query'); - } catch (Zend_Search_Lucene_Exception $e) { - $this->assertEquals('Syntax error at char position 25.', $e->getMessage()); - } - - - Zend_Search_Lucene_Search_QueryParser::suppressQueryParsingExceptions(); - $this->assertTrue(Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed()); - } - - public function testEmptyQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find(''); - - $this->assertEquals(count($hits), 0); - } - - public function testTermQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting'); - - $this->assertEquals(count($hits), 3); - $expectedResultset = array(array(2, 0.114555, 'IndexSource/contributing.patches.html'), - array(7, 0.112241, 'IndexSource/contributing.bugs.html'), - array(8, 0.112241, 'IndexSource/contributing.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testMultiTermQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting AND wishlists'); - - $this->assertEquals(count($hits), 1); - - $this->assertEquals($hits[0]->id, 8); - $this->assertTrue( abs($hits[0]->score - 0.141633) < 0.000001 ); - $this->assertEquals($hits[0]->path, 'IndexSource/contributing.html'); - } - - public function testPraseQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('"reporting bugs"'); - - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting AND (wishlists OR requirements)'); - - $this->assertEquals(count($hits), 2); - $expectedResultset = array(array(7, 0.095697, 'IndexSource/contributing.bugs.html'), - array(8, 0.075573, 'IndexSource/contributing.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQueryWithPhraseSubquery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('"PEAR developers" AND Home'); - - $this->assertEquals(count($hits), 1); - $expectedResultset = array(array(1, 0.168270, 'IndexSource/contributing.wishlist.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testBooleanQueryWithNonExistingPhraseSubquery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $query = Zend_Search_Lucene_Search_QueryParser::parse('"Non-existing phrase" AND Home'); - - $this->assertEquals($query->__toString(), '+("Non-existing phrase") +(Home)'); - $this->assertEquals($query->rewrite($index)->__toString(), - '+((path:"non existing phrase") (modified:"non existing phrase") (contents:"non existing phrase")) +(path:home modified:home contents:home)'); - $this->assertEquals($query->rewrite($index)->optimize($index)->__toString(), ''); - } - - public function testFilteredTokensQueryParserProcessing() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $this->assertEquals(count(Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize('123456787654321')), 0); - - - $hits = $index->find('"PEAR developers" AND Home AND 123456787654321'); - - $this->assertEquals(count($hits), 1); - $expectedResultset = array(array(1, 0.168270, 'IndexSource/contributing.wishlist.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testWildcardQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $wildcardMinPrefix = Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength(); - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0); - - $hits = $index->find('*cont*'); - - $this->assertEquals(count($hits), 9); - $expectedResultset = array(array(8, 0.125253, 'IndexSource/contributing.html'), - array(4, 0.112122, 'IndexSource/copyright.html'), - array(2, 0.108491, 'IndexSource/contributing.patches.html'), - array(7, 0.077716, 'IndexSource/contributing.bugs.html'), - array(0, 0.050760, 'IndexSource/contributing.documentation.html'), - array(1, 0.049163, 'IndexSource/contributing.wishlist.html'), - array(3, 0.036159, 'IndexSource/about-pear.html'), - array(5, 0.021500, 'IndexSource/authors.html'), - array(9, 0.007422, 'IndexSource/core.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength($wildcardMinPrefix); - } - - public function testFuzzyQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $defaultPrefixLength = Zend_Search_Lucene_Search_Query_Fuzzy::getDefaultPrefixLength(); - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength(0); - - $hits = $index->find('tesd~0.4'); - - $this->assertEquals(count($hits), 9); - $expectedResultset = array(array(2, 0.037139, 'IndexSource/contributing.patches.html'), - array(0, 0.008735, 'IndexSource/contributing.documentation.html'), - array(7, 0.002449, 'IndexSource/contributing.bugs.html'), - array(1, 0.000483, 'IndexSource/contributing.wishlist.html'), - array(3, 0.000483, 'IndexSource/about-pear.html'), - array(9, 0.000483, 'IndexSource/core.html'), - array(5, 0.000414, 'IndexSource/authors.html'), - array(8, 0.000414, 'IndexSource/contributing.html'), - array(4, 0.000345, 'IndexSource/copyright.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength($defaultPrefixLength); - } - - public function testInclusiveRangeQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('[xml TO zzzzz]'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(4, 0.156366, 'IndexSource/copyright.html'), - array(2, 0.080458, 'IndexSource/contributing.patches.html'), - array(7, 0.060214, 'IndexSource/contributing.bugs.html'), - array(1, 0.009687, 'IndexSource/contributing.wishlist.html'), - array(5, 0.005871, 'IndexSource/authors.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testNonInclusiveRangeQuery() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('{xml TO zzzzz}'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(2, 0.1308671, 'IndexSource/contributing.patches.html'), - array(7, 0.0979391, 'IndexSource/contributing.bugs.html'), - array(4, 0.0633930, 'IndexSource/copyright.html'), - array(1, 0.0157556, 'IndexSource/contributing.wishlist.html'), - array(5, 0.0095493, 'IndexSource/authors.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testDefaultSearchField() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $storedDefaultSearchField = Zend_Search_Lucene::getDefaultSearchField(); - - Zend_Search_Lucene::setDefaultSearchField('path'); - $hits = $index->find('contributing'); - - $this->assertEquals(count($hits), 5); - $expectedResultset = array(array(8, 0.847922, 'IndexSource/contributing.html'), - array(0, 0.678337, 'IndexSource/contributing.documentation.html'), - array(1, 0.678337, 'IndexSource/contributing.wishlist.html'), - array(2, 0.678337, 'IndexSource/contributing.patches.html'), - array(7, 0.678337, 'IndexSource/contributing.bugs.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene::setDefaultSearchField($storedDefaultSearchField); - } - - public function testQueryHit() - { - // Restore default search field if it wasn't done by previous test because of failure - Zend_Search_Lucene::setDefaultSearchField(null); - - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting AND wishlists'); - $hit = $hits[0]; - - $this->assertTrue($hit instanceof Zend_Search_Lucene_Search_QueryHit); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $doc = $hit->getDocument(); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document); - - $this->assertEquals($doc->path, 'IndexSource/contributing.html'); - } - - public function testDelayedResourceCleanUp() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('submitting AND wishlists'); - unset($index); - - - $hit = $hits[0]; - $this->assertTrue($hit instanceof Zend_Search_Lucene_Search_QueryHit); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $doc = $hit->getDocument(); - $this->assertTrue($doc instanceof Zend_Search_Lucene_Document); - $this->assertTrue($hit->getIndex() instanceof Zend_Search_Lucene_Interface); - - $this->assertEquals($doc->path, 'IndexSource/contributing.html'); - } - - public function testSortingResult() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $hits = $index->find('"reporting bugs"', 'path'); - - $this->assertEquals(count($hits), 4); - $expectedResultset = array(array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(8, 0.212395, 'IndexSource/contributing.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - } - - public function testLimitingResult() - { - $index = Zend_Search_Lucene::open(dirname(__FILE__) . '/_indexSample/_files'); - - $storedResultSetLimit = Zend_Search_Lucene::getResultSetLimit(); - - Zend_Search_Lucene::setResultSetLimit(3); - - $hits = $index->find('"reporting bugs"', 'path'); - - $this->assertEquals(count($hits), 3); - $expectedResultset = array(array(7, 0.212395, 'IndexSource/contributing.bugs.html'), - array(0, 0.247795, 'IndexSource/contributing.documentation.html'), - array(2, 0.176996, 'IndexSource/contributing.patches.html')); - - foreach ($hits as $resId => $hit) { - $this->assertEquals($hit->id, $expectedResultset[$resId][0]); - $this->assertTrue( abs($hit->score - $expectedResultset[$resId][1]) < 0.000001 ); - $this->assertEquals($hit->path, $expectedResultset[$resId][2]); - } - - Zend_Search_Lucene::setResultSetLimit($storedResultSetLimit); - } -} diff --git a/tests/Zend/Search/Lucene/Storage/DirectoryTest.php b/tests/Zend/Search/Lucene/Storage/DirectoryTest.php deleted file mode 100644 index eba6754a75..0000000000 --- a/tests/Zend/Search/Lucene/Storage/DirectoryTest.php +++ /dev/null @@ -1,116 +0,0 @@ -assertTrue($directory instanceof Zend_Search_Lucene_Storage_Directory); - $this->assertEquals(count($directory->fileList()), 0); - - $fileObject = $directory->createFile('file1'); - $this->assertTrue($fileObject instanceof Zend_Search_Lucene_Storage_File); - unset($fileObject); - $this->assertEquals($directory->fileLength('file1'), 0); - - $this->assertEquals(count(array_diff($directory->fileList(), array('file1'))), 0); - - $directory->deleteFile('file1'); - $this->assertEquals(count($directory->fileList()), 0); - - $this->assertFalse($directory->fileExists('file2')); - - $fileObject = $directory->createFile('file2'); - $this->assertEquals($directory->fileLength('file2'), 0); - $fileObject->writeBytes('0123456789'); - unset($fileObject); - $this->assertEquals($directory->fileLength('file2'), 10); - - $directory->renameFile('file2', 'file3'); - $this->assertEquals(count(array_diff($directory->fileList(), array('file3'))), 0); - - $modifiedAt1 = $directory->fileModified('file3'); - clearstatcache(); - $directory->touchFile('file3'); - $modifiedAt2 = $directory->fileModified('file3'); - sleep(1); - clearstatcache(); - $directory->touchFile('file3'); - $modifiedAt3 = $directory->fileModified('file3'); - - $this->assertTrue($modifiedAt2 >= $modifiedAt1); - $this->assertTrue($modifiedAt3 > $modifiedAt2); - - $fileObject = $directory->getFileObject('file3'); - $this->assertEquals($fileObject->readBytes($directory->fileLength('file3')), '0123456789'); - unset($fileObject); - - $fileObject = $directory->createFile('file3'); - $this->assertEquals($fileObject->readBytes($directory->fileLength('file3')), ''); - unset($fileObject); - - $directory->deleteFile('file3'); - $this->assertEquals(count($directory->fileList()), 0); - - $directory->close(); - } - - public function testFilesystemSubfoldersAutoCreation() - { - $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_tempFiles/_files/dir1/dir2/dir3'); - $this->assertTrue($directory instanceof Zend_Search_Lucene_Storage_Directory); - $directory->close(); - - rmdir(dirname(__FILE__) . '/_tempFiles/_files/dir1/dir2/dir3'); - rmdir(dirname(__FILE__) . '/_tempFiles/_files/dir1/dir2'); - rmdir(dirname(__FILE__) . '/_tempFiles/_files/dir1'); - } -} - diff --git a/tests/Zend/Search/Lucene/Storage/FileTest.php b/tests/Zend/Search/Lucene/Storage/FileTest.php deleted file mode 100644 index bf62a24127..0000000000 --- a/tests/Zend/Search/Lucene/Storage/FileTest.php +++ /dev/null @@ -1,137 +0,0 @@ -assertTrue($file instanceof Zend_Search_Lucene_Storage_File); - - $fileSize = filesize(dirname(__FILE__) . '/_files/sample_data'); - - $this->assertEquals($file->size(), $fileSize); - - $file->seek(0, SEEK_END); - $this->assertEquals($file->tell(), $fileSize); - - $file->seek(2, SEEK_SET); - $this->assertEquals($file->tell(), 2); - - $file->seek(3, SEEK_CUR); - $this->assertEquals($file->tell(), 5); - - $file->seek(0, SEEK_SET); - $this->assertEquals($file->tell(), 0); - - $this->assertEquals($file->readByte(), 10); - $this->assertEquals($file->readBytes(8), "\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - $this->assertEquals($file->readInt(), 49057123); - $this->assertEquals($file->readLong(), 753823522); - $this->assertEquals($file->readVInt(), 234586758); - $this->assertEquals($file->readString(), "UTF-8 string with non-ascii (Cyrillic) symbols\nUTF-8 Ñтрока Ñ Ð½Ðµ-ASCII (кирилличеÑкими) Ñимволами"); - $this->assertEquals($file->readBinary(), "\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - - $file->seek(0); - $fileData = $file->readBytes($file->size()); - - $file->close(); - unset($file); - - - $testFName = dirname(__FILE__) . '/_files/sample_data_1'; - $file = new Zend_Search_Lucene_Storage_File_Filesystem($testFName, 'wb'); - $file->lock(LOCK_EX); - $file->writeByte(10); - $file->writeBytes("\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - $file->writeInt(49057123); - $file->writeLong(753823522); - $file->writeVInt(234586758); - $file->writeString("UTF-8 string with non-ascii (Cyrillic) symbols\nUTF-8 Ñтрока Ñ Ð½Ðµ-ASCII (кирилличеÑкими) Ñимволами"); - $file->writeVInt(8); $file->writeBytes("\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - $file->flush(); - $file->unlock(); - $file->close(); - - $fh = fopen($testFName, 'rb'); - $this->assertEquals($fileData, fread($fh, filesize($testFName))); - fclose($fh); - - unlink($testFName); - } - - public function testMemory() - { - $file = new Zend_Search_Lucene_Storage_File_Filesystem(dirname(__FILE__) . '/_files/sample_data'); - $fileData = $file->readBytes($file->size()); - $file->close(); - unset($file); - - $file = new Zend_Search_Lucene_Storage_File_Memory($fileData); - $this->assertTrue($file instanceof Zend_Search_Lucene_Storage_File); - - $fileSize = strlen($fileData); - - $file->seek(0, SEEK_END); - $this->assertEquals($file->tell(), $fileSize); - - $file->seek(2, SEEK_SET); - $this->assertEquals($file->tell(), 2); - - $file->seek(3, SEEK_CUR); - $this->assertEquals($file->tell(), 5); - - $file->seek(0, SEEK_SET); - $this->assertEquals($file->tell(), 0); - - $this->assertEquals($file->readByte(), 10); - $this->assertEquals($file->readBytes(8), "\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - $this->assertEquals($file->readInt(), 49057123); - $this->assertEquals($file->readLong(), 753823522); - $this->assertEquals($file->readVInt(), 234586758); - $this->assertEquals($file->readString(), "UTF-8 string with non-ascii (Cyrillic) symbols\nUTF-8 Ñтрока Ñ Ð½Ðµ-ASCII (кирилличеÑкими) Ñимволами"); - $this->assertEquals($file->readBinary(), "\xFF\x00\xAA\x11\xBB\x44\x66\x99"); - - // these methods do nothing, but should be provided by object - $file->lock(LOCK_EX); - $file->unlock(); - } -} - diff --git a/tests/Zend/Search/Lucene/Storage/_files/sample_data b/tests/Zend/Search/Lucene/Storage/_files/sample_data deleted file mode 100644 index 9eded067b5af2fce049d719004c39460b433fbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmd=3&#+2xw@cbgrZ>IG3_zgsE?=pw^<92qXo#Dxg+g&jQD$DcLV0FMhC*I`o^E1s za%QH2hI3_6W=>9KvZg|DWo}Y_PB9lm`NhVIO&1$3?7Oh*!UlzljS3g`Uf8PZ80_rn vsh|NA+X0l@abY(Q?zq@~Ve7?4kl2Mi7j|d@6@yuufO>ad*Z>mafH@5S$I(%I diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/_0.cfs b/tests/Zend/Search/Lucene/_index23Sample/_files/_0.cfs deleted file mode 100755 index 9fc93fc4b5b50e35595c9713c43381eb4886c79c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9154 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 P(@6z;7eE7BR#E;7x)km2 diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/_1.cfs b/tests/Zend/Search/Lucene/_index23Sample/_files/_1.cfs deleted file mode 100755 index b687228817ae2b51401cfacc8d86e5df2d3b5a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12645 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 Gp#2xXPIS2d diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/_3_1.del b/tests/Zend/Search/Lucene/_index23Sample/_files/_3_1.del deleted file mode 100755 index f9f8fea01bd11a193bd9b33b6dfe6d609a6b46fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9 QcmZQzU|?ckU|?hf000;O1poj5 diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/_4.cfs b/tests/Zend/Search/Lucene/_index23Sample/_files/_4.cfs deleted file mode 100755 index e15f00b845e90fce9f26bd2caa55bc9163da7fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8313 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 NYFWTjDAI8j{sSA~^@{)i diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/segments.gen b/tests/Zend/Search/Lucene/_index23Sample/_files/segments.gen deleted file mode 100755 index e76c9033a6adb8854f5974cedc48b3ffa36d7dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20 QcmezW|NlP*2;hLx07?l23;+NC diff --git a/tests/Zend/Search/Lucene/_index23Sample/_files/segments_8 b/tests/Zend/Search/Lucene/_index23Sample/_files/segments_8 deleted file mode 100755 index dbd01e42f6800832346833b2535c8115b909c67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 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 diff --git a/tests/Zend/Search/Lucene/_indexSample/_files/_1.cfs b/tests/Zend/Search/Lucene/_indexSample/_files/_1.cfs deleted file mode 100644 index 99e466752288c56e84fb350c6cef9b3d95399ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12507 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 CiU?f* diff --git a/tests/Zend/Search/Lucene/_indexSample/_files/_2.cfs b/tests/Zend/Search/Lucene/_indexSample/_files/_2.cfs deleted file mode 100644 index 3756c3f2715dec510f3e375de016faef31e78bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12913 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 F{u|rHCrkhU diff --git a/tests/Zend/Search/Lucene/_indexSample/_files/_3.cfs b/tests/Zend/Search/Lucene/_indexSample/_files/_3.cfs deleted file mode 100644 index aa6b9d8dd7f516e2468981c91186fd1a30a1f98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8605 zcmeHMd2Afld7tmi?Ck9DSdx+@QF5&DDzYlcK$(!{YrbVbP6>&&$r$XT#zH8W$_ox(#8iVw6>d zzHg?Scea9x@)z-EwA^NotqUqw_&e4{l#FjM2a~$cwuN@;Nr#ej|uvP zuHosGxmj~`csiSzz++`*Wj1S$UaPt+ZOuD3t;JB>A5KS&!*kh{j5(i~%Z{X`vh&%c z%*w)2${b&qU&+p|jHKqge63_xtqCtT=6M?yk6fwLW?*@sJ3u4q?%Cm5MoUg#Sddh}x7ApA;4nH*b~ zxM7aZW|o&nQofT522)Cfq|j( zDKoRDeROzY=4yS6`OH-wISV8JMwv0dXnA#RF0*t4S#|8ZQ?<(Wmb-2Tocq9DE5WO4 zGZQP*BdNiGfs-(AVF}_RsR4MKot<6GOiawoPwkeM7c=AaGDcY9VWxq)Sv1U#q|QnE zrtp?S)SN2JXu=P`I}L$!C?;hm8lz)y_{Op&rx3vLsI=wTC_CGjcFFqjtv`VkaZbbsP7MG+wkTu-K5EJTR#u$=Yg(f>%)Mh!+c_uSgJcPo1FyWoAZb0G8|e!5djZ^gLRzjR@Ik~mXJ1< ztJK>pLeMliyl9R-bYk$_CCjq1+m(`CmZJs2{S!X;^X>zcCpm7Zz5+ z$?(oW+cQ-rJ&)7>-cOZX7@j-VfMF}#1F!O4Vg20s#vpsKzGs-GCA}Gq(=cV)+YDp9 z5B|+g?1BFt^)2xF4zM4t8222#cbv5EA}TFr%Pp%pII9TGYNdIiVtI%r<9{2P{rgiC z-aV5&n$BstlkmnOnF82G>TTJ^T5Ua?HG6qR@7;OEl2h@ja;F@FB+Llu$M-zL*q?%X zp$H9{)WSFFWbGkqrD~V`64pXcH?XhTCU!!(GTv2tzPZQ$(~$348uGS_+IIyVxeE%L zSGxZTq=Z+s)ac%|YA+F)DOfvR4Wz;?Z{XVwWU**()ftCvK@sx~+mg&Q;w2ATm6Buo zl8OZOh69>Xbs7q|Q1f|4gRWSZ+>ReuThS59E6CbNlV#cEJTsd5=vB+#@dIbm%6pD) zZSvuZmDCB*DXZ!{TXU-puM>WQ&or?s3tq7ZTkZ#Lsbn!Ra{a)!Zn{BHw!NcG4_j;y z3@D!pEF6VgEJ*OqvkI(?*;*Kus@w_strZN0Xt?a{c$is# zol{;}1=qrsm|6_asuu4iso}KjGivd9qv19(Q1Ggo;W?y&gR#_$s+LZX%q}-920`Tm z>2$@htNoQ?1?TD@jq_7xX)22o)H5OJ;Iv9@Ok7yC+@T+~ZWi5Ku?Zc#x!Z0Te3b*s zPQ%Tc91sZrz^Lx44Q~+%%!jiuM@*ChsV3yh(wv87S7y^PFC5>yrz4y) z@RDgb>~5qa@TAgR5Y#conPDJC%(@AQa~>u_bLxO~D{w1_McFEPH`(6MoiIXjo>i($ zC>6 ziLIt3By=hSdGor#DQ&pZ!W~<8hfyp~;8{4HHm3XjW83%M@uf8i_k3i37li$P^BD6T z@0suNFteYg?mvj#`$4Y-mhbJ6W|sn=I5%|Z?P>74Ip=I|Klfbe`&A9dDUz}2<=uko z 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 diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdt b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdt deleted file mode 100644 index c22318f12f4b831eaff6d2e3365668b1aa542990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36136 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 diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdx b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fdx deleted file mode 100644 index 8ca623de8bcf42c94f5234bfc765156417798f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 tcmZQzKnC1S5T58_2(9@OLL2izXjgRz9k35VM}|Y_v@8f+R0W}{MF8-+2HpSw diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fnm b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fnm deleted file mode 100644 index 7ac6798265..0000000000 --- a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.fnm +++ /dev/null @@ -1 +0,0 @@ -contentspathmodified \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.frq b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.frq deleted file mode 100644 index 535c80e0f659e78c5702d716a04e50072ecf0f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2734 zcmai$;gX~_41}>H+kgicW|K>$l1ioSN8bMt^R*dfxZG~V-dPOTveas|8Fu@y-|aWs z?9T5``@?qIQZ|q5;iKIwEDy!hv-is}bk8YIOKzRnV=e3WMznaXn)ly#a;?snk zFtcV{JesF8=3CC(B)1yjVI`(z^qU)-)>?BeIXvfu37a_&-MKJeRm8&wW0hww-cnAu z%o^tY;6cQ|u0OYF>CffT4{bQMz;54)|CkJ$$3Z~MqdDORp*d3`ZlN&qBpVyZ@G^g4 zSW|x9j!1gfyR)-rfExh;=LBvSRJS2pCS8@;8r9z85iPGKxTc&z^wqk1cRXB}|F98{ z@exP8g|#!uyq;3=ZI@g62L^%5*bHo>2NF% zgqUPqY)SGgUwzwMmDGs(<`j{isW^EDgwAqTu!HiFi`TE*W!|%;J&~~O1pV^`Q>|$w z$DhBYvKxKvxo@^05+rQ6^JFt9)UTWUq8WrPR#2MMBG;-LL?qXqla#XZ2|QDu5fcd* zQJDC0_YPFC`hX!Hx+!&z!690u)T3T=lL?i4ww7BOfSts$vR8;|16N+XtJ+xXueo#P zz$a4$ongm3vfJk)dL)e%(j;vFS0Fx7W{2iYRpx9e>SywHG_5&XX4Uq!{?LNUfP|CzOFr~;9s!2b`>7T04^e=vVg0N(i+JUx;CMj z;vpdD^6Zjgc7pr37Dwqp;l#A+_61)0$IOKh2^$%)U`i>C#Pg; zINA_U%It6ZhtUl5j3qFIydm%1xs1pIXEEeODit$cXU)Z993ge1Nsc9r(AF!5gKBJA zHU)}{7L*djsIv}R4}17WpyL*#_?@RW=mJ-VPv?*VqAME2ZIfvoJ;zhFrAW@=%fq4Q zJx4gF&N#1m10%d+%PtmT2(f7I|H=T^r z>`CV)ZM?z~UaCmoa;9Y1bk5^dlRDKQ0W-Q^Z!q-a-5^WY7T~3(M z#Aw{y-N-Je(8>GMNrR3YlBgM`7e^*TCK zPiNdg#N-PwE(rI=ukt&4<;a&{feysj1Shp83iA<#GpHJWiq43a_9|QvaKfzJsG6w; hf{P2iC@Au_U3_AQ*iRqn$7iR@|NC^w_1Ehc%)c_5GtU43 diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.nrm b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.nrm deleted file mode 100644 index 74016c222a..0000000000 --- a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.nrm +++ /dev/null @@ -1 +0,0 @@ -NRMÿkkikijljjkiuuuuvvuuvvv||||||||||| \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.prx b/tests/Zend/Search/Lucene/_indexSample/_nonCompoundIndexFiles/_6.prx deleted file mode 100644 index d529bf5b25b689570a11b87d3ac13cf750760c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6478 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 z!About PEAR

    PEAR Manual
    PrevNext


    PrevHomeNext
    Authors and Contributors Introduction
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/authors.html b/tests/Zend/Search/Lucene/_indexSource/_files/authors.html deleted file mode 100644 index cac8abe956..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/authors.html +++ /dev/null @@ -1,235 +0,0 @@ -Authors and Contributors
    PEAR Manual
    PrevPrefaceNext

    Authors and Contributors

    The following is a list of people that are helping to maintain this - documentation. If you would like to contact one of them, please - write to pear-doc@lists.php.net. -

    • Lorenzo Alberton -

    • Gregory Beaver -

    • Daniel Convissor -

    • David Costa -

    • Thomas V.V. Cox -

    • Martin Jansen -

    • Alan Knowles -

    • Clay Loveless -

    • Alexander Merz -

    • Stefan Neufeind -

    • Jon Parise -

    • Tobias Schlitt -

    • Stephan Schmidt -

    • Mika Tuupola -

    • Michael Wallner -

    (In alphabetic order.) -


    PrevHomeNext
    The structure of the ManualUpAbout PEAR
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.bugs.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.bugs.html deleted file mode 100644 index 70035c2bb3..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.bugs.html +++ /dev/null @@ -1,185 +0,0 @@ -Reporting Bugs
    PEAR Manual
    PrevChapter 5. ContributingNext

    Reporting Bugs

    If you think that you have found a bug in a PEAR package, please - take care that you are using the latest version of the package and - that your system does meet the packages' requirements. -

    If the bug still persists with the latest version of the package, - don't hesitate to fill out a bug report. The easiest way is to click - to link "Package Bugs" on the package information page - for the package on the PEAR - Homepage, which you think contains a bug. This will take you - to a list of existing bugs of the package. Please double check if - the bug hasn't already been reported! If you are unable to find it - in the list, you can click on "Report a new bug" to - fill out the bug form. -

    More information and tips on how to report bugs in a proper way - can be found at http://bugs.php.net/how-to-report.php. -

    If you have already fixed a bug that you have found in a package, please - read this. -


    PrevHomeNext
    Submitting PatchesUpWriting & Translating Documentation
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.documentation.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.documentation.html deleted file mode 100644 index c9ba9c132e..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.documentation.html +++ /dev/null @@ -1,165 +0,0 @@ -Writing & Translating Documentation
    PEAR Manual
    PrevChapter 5. ContributingNext

    Writing & Translating Documentation

    Good documentation is essential for users to fully understand any - software. Several PEAR packages lack documentation or have docs which - need improvement. Writing documentation - provides more information about helping out on this front. -

    Translating documentation is another important task. - Not only does new documentation need to be translated - into the existing languages, additional languages are - welcome. Also, existing translations need to be brought - up to date because the English versions have been changed. - Help on how to perform the translation process is in the Revision Tracking - section of the manual. -


    PrevHomeNext
    Reporting BugsUpWishlists
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.html deleted file mode 100644 index e5e672a1f0..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.html +++ /dev/null @@ -1,201 +0,0 @@ -Contributing
    PEAR Manual
    PrevNext


    PrevHomeNext
    Sample File (including Docblock Comment standards)UpWriting New Packages
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.newpackage.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.newpackage.html deleted file mode 100644 index 8ad9c4f091..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.newpackage.html +++ /dev/null @@ -1,151 +0,0 @@ -Writing New Packages
    PEAR Manual
    PrevChapter 5. ContributingNext


    PrevHomeNext
    ContributingUpSubmitting Patches
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.patches.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.patches.html deleted file mode 100644 index d7d73f80f2..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.patches.html +++ /dev/null @@ -1,274 +0,0 @@ -Submitting Patches
    PEAR Manual
    PrevChapter 5. ContributingNext

    Submitting Patches

    If you have modified a package to expand its functionality or to fix a - bug, you should contribute your changes back to the community (some - licenses force you to do so, and it is generally considered immoral not to). -

    Before creating the patch, you must first obtain the latest sources of the - package you wish to patch from CVS by running the commands (the package - in this example is Foo_Bar): -
    
cvs -d:pserver:cvsread@cvs.php.net:/repository login
    -
    -password is phpfi
    -
cvs -d:pserver:cvsread@cvs.php.net:/repository co pear/Foo_Bar
    -
    - Now that you have the latest sources, you can edit the relevant file(s). - Make sure that your patch is fully compatible with the PEAR
    coding -standards.. -

    After you have finished adding/changing the code, TEST it: We will not - accept code that hasn't been carefully tested. - When you are absolutely sure the new code doesn't introduce bugs, create a - unified diff by running: -
    cd pear/Foo_Bar
    -cvs diff -u >Foo_Bar.diff
    - The resulting .diff file contains your patch. This diff makes it easy - for us to see what has been changed. -

    Next step is to submit the patch. Send a mail to pear-dev@lists.php.net and - Cc the maintainer(s) of the package. The subject of the mail should be - prefixed with '[Patch]' to make it clear you are submitting a patch. Also - include a verbose explanation of what the patch does. - Don't forget to attach the .diff file to the mail. The maintainers of - the package are usually listed in the header of each source file. Apart - from that their email adresses are available on the package information - page on http://pear.php.net/. -

    Note: - If you are using Outlook or Outlook Express, please change the file - extension of the diff file to .txt, because Outlook's MIME-Type - detection depends on the file extension and attachments with a - MIME-Type not equal to text/plain will be rejected - by our mailinglist software. -

    Note: - If your patch does break backwards compatibility, the chances are fairly - good that the maintainers won't be happy about it. Thus you should always - try to fix a bug in a way that does not seriously change the public API. - But if there is absolutely no way to keep backwards compatibility and/or - if your patch contains a groundbraking improvement, even API changes are - fine. -


    PrevHomeNext
    Writing New PackagesUpReporting Bugs
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.wishlist.html b/tests/Zend/Search/Lucene/_indexSource/_files/contributing.wishlist.html deleted file mode 100644 index f5d13cecb5..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/contributing.wishlist.html +++ /dev/null @@ -1,158 +0,0 @@ -Wishlists
    PEAR Manual
    PrevChapter 5. ContributingNext

    Wishlists

    Some of the PEAR developers have wishlists at Amazon or a similar - service. If you appreciate the work of a certain developer, feel - free to buy something for her from her wishlist. To find out if - a developer has one of those wishlists, go to the - account browser, - look for the details of the developer and there you'll see if she - has a wishlist. Buying something from people's wishlists may even - speed up the time in which annoying bugs are fixed ;-). -


    PrevHomeNext
    Writing & Translating DocumentationUpFAQ - Frequently Asked Questions
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/copyright.html b/tests/Zend/Search/Lucene/_indexSource/_files/copyright.html deleted file mode 100644 index d4e082bd83..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/copyright.html +++ /dev/null @@ -1,196 +0,0 @@ -
    PEAR Manual

    Copyright

    Copyright © 2001 - 2006 by the PEAR Documentation Group. - This material may be distributed only subject to the terms and - conditions set forth in the Open Publication License, v1.0 or - later (the latest version is presently available at - http://www.opencontent.org/openpub/). -

    Distribution of substantively modified versions of this document - is prohibited without the explicit permission of the copyright - holder. -

    Distribution of the work or derivative of the work in any - standard (paper) book form is prohibited unless prior permission - is obtained from the copyright holder. -

    The PEAR Documentation Group consists of all the people that - have contributed documentation to the PEAR manual. - Representatives are listed on the front page of this manual. - In case you would like to contact the group, please write to - pear-doc@lists.php.net. -

    Copyright for the XML_RPC documentation -

    The documentation - of the XML_RPC package has originally been written by Edd Dumbill as an independent - document on his - homepage and is published as part of the PEAR Manual under - the following license restrictions: -

    Copyright © 1999,2000,2001 by Edd Dumbill, Useful Information Company -

    All rights reserved. -

    Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: -

    • Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -

    • Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -

    • Neither the name of the "XML-RPC for PHP" nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. -

    -

    - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - OF SUCH DAMAGE. -


     Home 
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_indexSource/_files/core.html b/tests/Zend/Search/Lucene/_indexSource/_files/core.html deleted file mode 100644 index cf811503a2..0000000000 --- a/tests/Zend/Search/Lucene/_indexSource/_files/core.html +++ /dev/null @@ -1,159 +0,0 @@ -Core components
    PEAR Manual
    PrevNext


    PrevHomeNext
    Structure of a post-install script PEAR base classes
    \ No newline at end of file diff --git a/tests/Zend/Search/Lucene/_openXmlDocuments/test.docx b/tests/Zend/Search/Lucene/_openXmlDocuments/test.docx deleted file mode 100644 index 286c58a89265855790206b771ad41b8960e96e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11065 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ˇf5dz;xHOL_*nqznGZ#8{USV{{H=7i|u)qO40zs z-BkZEWl}-X%3TX?BpczkK0aeIs|~ap(e>MX0ZlyK1~>Y$o>*(61yLol2}hK9pJjy8 z4yZV$uN{e|XfBLhUKIGx!?`=g;8QX6Eop`WlAuN9K-O~Y0ZAT#33Zb-jEvvl3_17Y3`d9^#)d&&XWQ?|XX@b0bgXaK14- z4-O&djV6028eb}RePe7+`jN~RyW9kD^TV(f15QWm=3(9YnCqO(c`6?<{zC2_r&BOQ$?hnMh&p>?t%J)% zf5)Egs}Ou$bl}z#|%#bt0F%z_u3H$(z~X zRVC#u(YTv$!!MY4R}`!Fqogp|+7)Ti`Z;LXrf$XZDezW{R0KBhlL9%~6^HCVKb()f zdr&2GwrTM;tYfjR%Rb&JwRI%;-P3D6F6w zwm=K&^4W|Oa8r}MnaS{O(xDeQ?20Zh+=rnrd{!Irws^wyuqB_)W@wj^X?(M=*lp{* zJ}A1|!dz{;T{A|#`Bah3Hq#O*wxd;Wwb-IhG3)G4-+*eZ!m@Y8l6|D_^=7PVtdF%A zE`NxVCL}klxs>Bsv{|otq%gP=AJ^iod0rEwKg03o9EhZx{e8iqP z*@3md`H1;>s<_^iwg8UZZ`>{fx5H6Ng@-z&9*O?lav@?}ePS^|pAylIu5eMS&{ewe zm?{??=pjO7oB6kL3!l$=ZJ-CI%qkWdGeX!{0Q8}?A;z{?rkOWo89ZW1YML z(5>1lsSHv%^q0x&s7}mcj|bEJ`hGz7eEFs7UKarKr(J$PyNqFtMa0JxUR#Cxd5)3r z&j>&hOjCrxr$F5bkC{SBy;|_*&Z9ISB88|b;4LEk9JKyHlxLo=lm^J0$Z^pIjB)N* zqxlp7G~`^#rf7U}we^_-Px*=I2^Z2izGVs(|4G%iT1OMYKX%H+ z6pds$+Xq?@2pb_#_=*fWiC=0TVmzmu7X5Kez5$oX7iJ+no&Vbbq0V*m_&9SEx|Ypp z56KH*`90=D-7`#;8Mun{Y9cJ0t`<*(8w97Wt`owg2Fe{hlyf^U?(^I*)iyRT-xftJL zn3W0mH*6s!?L9GNjyz{hA>ZYeTSq9|X|M3ZTcSAT!g<(Q)xM8j9%ded61ZTo-Z*k{ zw{rJy#~ATZ7y_Hu_Xe&i@BM*f{4G;mSQy^ocM^hKA;v(iV8l!|mn{LbAc$%nDLw?Y z7NhZxaIIOh!uhk7kT^J=byCcv{hlr5nM<6=h{9JZR8r0YX9PrvzJ1zl1oVjvyELWu zuu1}##Y2)#!6=z>X6+1Yx9406R`_{&8dYgx-_5f}yPur)9`qrx%+SjBiLbVG=w+Fv zPu5pTOf0cpNj8?g=NGaNDg#T|&SAM%f>Pvv5^T;Gf~^hWQ9AvY=zsDA*%qMXk#16i zqIHmmFBAfZO({axKUslR$BzySuFJ=8#urxSCY2Cb=!+$B5vuhJZ^c6jE==X*$Q_(X zjc_qiiekw(8Axs1pX=?PQV9H_p+pJ&1-f0I@M@f4x|2N~Oy7Xa>A|Xf6xOwobcnB0 zO3kE_W=K`T-t&@6GAMJ;hPegzq@DE17HIn(F;P1eVVlb~%s$|&vy~Qb>@It3 zaQ;USE%~o<2n?Jav={&99>ZTH?r*n$=r~l6{=0y`cR~Gz1!RIMu-|&3{sjKLHRN|- z59mDb|J5k+r=&j{1^$xt0xI?Xqix_%_@76Rf5Ep9{}=w}f#jbe{v?0@5>bZ!?;`Uz z%HvP?pOn^La4Zn5@@oKpBe?#=|4Fm_h404sU;H1W%bybd&RzV42LLK?0f0Z5j6czT z-#z}0wj%fq{qMcxpYT76^1lQqgDAjX!~d&9SCEDRxyR3rI|M)%h-opR{`vGj$C+`Q diff --git a/tests/Zend/Search/Lucene/_openXmlDocuments/test.pptx b/tests/Zend/Search/Lucene/_openXmlDocuments/test.pptx deleted file mode 100644 index 1f92af38abb01a44dd9c39f16b89f35ac8c9bfcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41182 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

    A3-U85+HA=~ER9x1IdejlbKT!= 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 I)n9A>50*hA{Qv*} diff --git a/tests/Zend/Search/Lucene/_openXmlDocuments/test2.docx b/tests/Zend/Search/Lucene/_openXmlDocuments/test2.docx deleted file mode 100644 index 3e885adb167b9264452dc2c77c167560e1688eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15074 zcmeHuRdgLquI@I(%*@Qp%nUIzQ_RfF%*@ObGseu!3^6-)95b_hojEgi{>jX`>%O0< zhhDY2>Qh&1ORbVhl9vVnMFD^TAOHXWAzsdJh^9^3FLM)%w^`X`ku( zpgu~2j=%(Kg1Xs@CkuvEPzg-ucIA3bL$__7QBL)EDEuCU;;UJxqGgUf!4Ww|5TEtq z4f`Y9fPNfH7&aUpK~glZhC^2GO{#Exq;b3!aLek1aD=E7U`a|nuG>J;Ek=}u)htOz z+&S1${TBjZ9ZuQWV^3ns0@b)^(E&9BNie;~veqjH1M`pq>;pepJrzx%b-lvipQJ@1 zIa*4MsML+?$NUwr zpU1Ti*(&-axo%H3_%?&XPDqYL_=Jb2VR2-ht6gdSOe9ie@a|4~-s))&YJ5!Od+UvQ zbyjf2m%z0>YuQ2nkgWH25Pk>wneqf3Yt9 z<<+AS)}=rMVM5M7Z5fPsv#&!D&8==qi27810{uj?M%9FEH^ zWd>$0aF_Cc)fi|j=B;Gvi*H%FS+_)j%WI5iWdxYQici&=+t@DA^Ta3R^F%RL7VI{J z2$Jv-nK0KDY6p*WDYwPpNJ1*b#!q11Mpd?T4d1ANWTcm@X~3GBo(nV$tF!4X!RfGL z`9PVRuZ)MIj({83uF@G&SxF8#L|aha(qLIJOp|8E8-9gi+cqy)ycK!Zi;M}Tfy{>t zpT72T&H~ZYg?Cyla38MW#wXOELG$)}77lEnH{<&-RR69c)5c0p;~yipU;qFP00PL> z*5M2N|0v2ATO()d4{P?@jQvAtfIe*5$L#;zZ9!$-W}N}X8^6{U;)ae|cG(5@7fO4h z06rItWt*#5i8Wz8N!Zxw`7p+0v1KYyaGe1?7{w@0=suyldy~bfzJGj_Yw$=zK1SYr z7fUtWK>xm27dnX4wp8t=0pXIwuEopUF_@v zO0MdH2TZ=I0C)qj7R@+#lrCpNG59YzTWO&YZKa2Dzk(3IueQ`s6<$UzU!&=G012sV z7DIlftyciV;w>4#Ea8m~>^BmbdM25((=BARX)e7?`(k3` zErTgPfiB5Nk_uFVQKDg&pB_3yDyFzGp@KAsLV$L=*Kb88OBr=Swq-Y{=psb00nBQN%y*_U_CXX~)m~FI3TgceAES z^3RT3(p^c&?kB5Mg~M5u1upVO$E9_l~|BynE&ZH%HN! z9f)C7O(Ljc1;_J!3q60Ac)d9BMyZdV5vyoD#btxzAv4tb#B|ou>6&W#EXQj?6AOY@ zq2AaT&al}~*!_MQYELcy#(-33OhLp}g?I+{RYr5NWzNga?m~{9TCAxvKSoOf@j3pciK)W$C^_ZVZ4rGv{v)JkR;FfPF@-dKc3IVO+8M8?$FRP}RiolS5o$e* zz)JF?$%29YKx1c95D8Hf+plv$4%zO~M09%v7zr`o9_h(y{6{TIoY~9E%*7ed#N&#q zp~!BS4ffE!FuJYZ!NK8W8t zI;PSz*yuu?EOpA&ZuSryY1se zmNOo&PXe3g&P7LlF!mcw+Yv&#U>tljK2)_ik{2q~1T?;;D847tKyA)9{$l$@Q>tb# zIlDdS)jJ;~u5HFrSFqu_^l!T+{a!t=?4qG^4P*RHKX2!nzKwcZzA%#?pJ9i7BlTWp zg1oP@L86VCA>P5&DU+z3`)=e%7Cw_7Rg-2jns<7n)=P}VvEE`z!fAcJOc$~{23x|S zdIYKLP8IDoQB~@6=|xl8)`+Kjz-sL1dYCB2luH33x#O*Z1x6EUi1Xd!^~?0q?89JU z+pumt;-V@j4df%JMP_s{E(14$RX&kfts3JVBl5X>l7L?46P;lf8iSfWe(_G?Vl_r3 z20XA!NV3IU`}aJsMDsW?jTi}cYv+;WJmC)6ksa&@T|zB}PP70pV5{6^wg)j|?}fmN`QRKM%qof>CAQs~~jdL*ygV>b#)H{NmktEW&U&JS~4Q`_O3Gc)=siL1g=!1Io7*h)$J}$XZ8tq8DaLYzN!iai50BMF8;aA}T;G>R@It)I z@H!$3eQ#UM`v|%|Zd?jlevZke@XoBe1xi)L#1fsQ#34%?r)dyGxin^U>vR0fRkarF zOl;Z-b98n^Qd&4z2@rP2LSbkpnH(v_2#^+k-!uPxj^Kuj7C$L%><2x#B7bx`qC*63 z1_+-PLJomPK60<6le)8+dUXwsnTrirZM~gJ4uZoqI0%Bcl>D^#8RQV`PC~+1HZTJ zeL0?k!Wq7%-Hr9-iTpO;*F1=nCx0`JmXJ{2l9czfp@ZjaREaTkq~_%f~Y|7hNKw`P0Iu2 zs1W46_?8-g%y&&73}{Apr`3EajDgZ;RZ6qWTp_%9MAN3Izc#P0W_n2QbW}Pa?RJQ4 z=vtZe<-Mu-!Xe2TIQ}Bj;A8C844#(T2<1hYpH1Y?{b{Aa(QBtJTa>5?npw0O9Y-Sf zc$C>Cr=n^>FX@h37^;*VM$$Ciq@c(shm1gcHsby+v;J|-LrE`^-5JuKKo80Vl2N3G zz;u6}7^{}FvM2-|9q;@vLh1IDpQ->=hGM{8Zi7DdO zj-vN8^(_R8Qah7n6u25;SL%x^bzR$*l zYqDp!xX%M47FmA$Vy#1$%C2E~I_^5jD1(dY;PB{{kTe@VC>ylww91ZE;YEMQPEdx* zHQ!2);W``MZ{2r5(}9D%4ge4fDYdm=JfiKVG+WdrG&<}qmY(>ZB;&ilu zv#cwh?tk-~=FT=9LVp%bG7#QfR%3;-JVf78-$gaQL_8Y2(_mZY%^}-r)eqV29U3gwY`s4#bgd<_=XV#-sxS%$bb8P-8h1~F(E^d!S zvc#j+?;#zd9#+hrn{@F&LW-`Z1SZF5&AQ+6!QByyVEARp57;n+ntCe%vK(YBzMh5p zzL2k>hX_ar1BpRDCI%ciH5@KZvXn+9!m}8@Xh7)S*Lp7(DdwxNSjv#iSMj;-OpErWnk?uT4`)&t(F>jRJ5wnK)8}V>WJL(!flt zCFkR=K_C|C&XDY}&dPNZ|030I@Xigg({UH;8yEv*8{@TL+IuPa{y!iV&7+**vtX9r0Xf+_PgOn5DDi3^+?#4~ z%d!lnMO6?>C%TnUrnahBifCq?aH!_EY3D}iJ538Q!My9OLemV?;{nTrvbqy>qM-_G zRuLfO^uj2Xmvs3G!OVuVXmkwWf;hYa#Th_IXvo9X@kHQbkUJvax2Y6HU8e1fu<)7P zIJ{v|p;n705LA5R%gf9WCdp${u~^{JU1~|i0c`qh$d#ouws_l-8x_n+?cgRS(^jOs zv-`?+NOw&jz>0M-+mgzvHXSj*$rbjI{qYUsMKdAFQ*wOst^oU*xP+K= zyEQ{OZ2^eT+~@t9m1rLSa#27^EqqMvdXt*FlO=k^KF*+F5S44W7;vJD$#s*Ei+e26 zbh4*XJEVhmI+-q&YZ>2sgR$aryrd4&1J}MoW4(N>p^_3OcnOWdGC%(JfJ%2-C z+k3A?1&x!VYGKI{JFyw}4jwnD_@(;&PO`N+7{tx@K4y@}m?nEJu&ITGX!O3WgCQ<_ zU(-}RzG1=e!3OU3Ooy^%L%%20vT@d0m-?1`X-Dur&2N^@%+3x< z4z&!BPJ)o5TQq)l?G<0m-_@WnYwY)lW=01bc_1=Ms1WK_yM8 z>4any1?A==vC`-Gc3s#Xr=@Vq;b&^ucs^pr|2euj>Ru4iK{@WxxaGAigmQ!E9V@Lk zDx^J6Yace``EMVS?mL!*^a&6=ks#lp`;(frU2 zJu4F2_p+DULXa&3p?As{lD?NqMjNK`3Vd?I&5fU^eCm{`oG&<=M3>QLY(JmVbXR!C z|Ltk)tG(J}G9dV(4(OFHkQS9+HTfsixFj}1vi<_$umiI6i$7(NEbSW4F_vp?01`}8 z#?o4hp?g7mK6&1aX@9mJ_M*H;#8|(?4Y#^pPkH8T*z@WMq)w6W2N!WmT04j$4GuArZsKix1bSPHgN;qHCHBq*P+&m0; zVyA178OM_G2t1ltAjed)R^mlt)Kxb)(lf9Zq&;~>#*fm$i58XOshvy;1o(iL7QPtk(a5#mUx#|Yq|Of%Qif}9Gol964@is`TQB%PzH0`M)mEJfZ`d9=Bi)FcXttzv zp33o&B#e1KQ-|+-XCU|aj7&vBo?vf~!_HrpV4HWO;5@a-{yn&$kHejj5?b67j#2Vu zDbxPa3DMi^Ep;F9C>VCSpIkF*Rx_YwM;!v48(y*8BNJd-$NkLj;dxrdXR(2^tA83?YWukHFEme!6z{YOIF8yZsntR7#g)k>DfD?6?UIN34|ns>d{3!SN~a z2+V7&H!!RFI zcK*`L$EWUcLiJd{id8X)9f46-FI;7rN25XI*jzJd;jVwe654CyKlvfS3EPE0s#uS5 zl)B-67Y0TsMb%7AMjAQp4SGCg4lw{eFbrZ@=C&L)I>xpl(K*>4cp(IIjZ;8{7JcG% zpyT*!Pf`Tgj*`t`{p6Mv*&~;;T5llY(X&$^MJ8&y=kepT;@^GWl%}fPl#d{gJT?G; z`VZgN$;{Z=nEr29#@}I}6Ad}rbvBf4_!UrewNf3%h2XO>kiE8LlyT5-jML3P~(wv~t~J`$wIz2|p4 z{PN1>vtbxqBtlBLHQiT-Nnw&pcY(y((+#{k`YLw`sw~j7%b>7-e{pwlPLF zv0}^RX5@1A!|${(==?-7R@ub$SR+ z18UC$OH@;sCdGWKHb>1<1n%r}Tw0dCvTA#Uzl~*0RLPdkTN&4@7l3`i$98;ZTC*^6 zTIA3tDb2HM9~+aklG5La_vM!PQ%g$-O`Rjc^iL zQg24NsS{oa29vSy{@3GuO%A{4FnkU!|HIM4PX8V_zoyVsg>_cY4;A|E*OTdC{6hX5 zpX;kx^hGy~q4%eL^6r-xcUFWsQ?jW@`rMbhlhMc;zSq}wanuVLe{ti7xFL~(%zcQ{ zYYY@-ReMr$V*4)Ceu(+2h)I$pj@}IEPp>%Ki1 zST%TpJ9AXdc|_v0NsK^EPzB*59i&}yyrpHgdgbe=HoC@3>LO7h@RVme{5k1~TOI`2`|LG?ac4-VjQHcg5ehI) z?NvT){jdr7>3RVoi`MoGM;g;ER|D2!{xggP8iAJ?aV=H8A{z>4e*b)ou~0tN8b({2 zGX(fy_jnjJ{8u(VDB)vR@y4m2UiHA$ z{M>obmXBj>mobCOt@O0Tgby+AoU27xEL@K+#N*>dTqXr8GZ7B#0 zRB#!@ z!`nmYpmUxM)qp@3?m}Wak&`h={K0J7>@fJ9q^zGcxam2oPZn1qSXoP5jE!YN84Z|b zHtXxlxD3OwD5XB}D{GOuMxg$~auI;Lt(tU?@ls`VwHVQw`#B?7kxxMcreGT)dPU^K z$gUesWrjQtshaGw=nTDGY)O@M$@kqXQk}=UvF#HM6Z4=3he{=u=`Yai?%E^zn^L>} zHp%taKc;FTBp;y_i*bhDnN@ClfZ0D$```J&FSh~{XV+NALZjN337Lz$cKHqUF2IGM zwMGV;Lr}GTW_$m{x$tg1rGZ6OwbN62XC4L`{3;D8jFjj4#GL+p@AYi zm^Z0PY}V}3(6cMmy5KdiqFvQ^@s>40pG+U08Xb&eaWOF%UUIR@FYj$2S3(IHdK4Vu z81kB<@^#)V^xXbQ+q#v@Kq|w~%TDT_e~XjG ze+l9`8ap|e+n753Hey+-)*nU;;f+uKy?5r2bE(~`N|tbRHiJzvkV?bfyO3m!Oeh{$ za`4jUH6{tAI8zhlndB;`{ZLn8^JwEaHH0pwE-t8{>WB8q5^zJrau9Cw(w=aawia|b zLM7r47~3l5l%?l!Jzsa%2vSw3g?(U(w5Z3WU!al3&I7Os;~~lc(p_rf5$udx=aRvp zv8?K0RnE#4(Q1{wKLc9QfYx&&!6@B(2Mrdr&fFGR)5?=A*LS4!BTztTVvCZAwXS_v zdlv0U+}{+CreSe!Wn*56CkZ!@(QhjUr-MpiHG8RPNR^xOz1v`ktcv1qOx>P5Hscft z?0tkCAcybR4<~m~TGW;0v$QRdAXetZdV46zVas66+iK&cYukzamgI*yl)^SDJI$|yj=2FUXv==V= z6*y-Si=@|pRUoskvz(+3ctt2t0KN{YkPDK0Ti8GdQSzUiPmM7&w-ce{KdQYr^!CTH z>d7jRQ4PwNoH`%yKs*dUP@WUUndVq3SNTiP5Mi{ z5!q~Fa{yYUDx{3OSPiUfNczzbpd&*zN=}2Z@Q5cUE2c~6w&px!9zkK4T>bqQO8+q) z9HNH=?XCH*LG-Cbx0~kd(CXCI*K$iIp%dr0hkn>+^n_qb_N)eboGti54U!v>=}h78 z3y_7AGzshNUMZ7~rx#S&4VS#@?HSRNu>}k1lM7p%N3JW?Co*iueppc*jvKMszZjmt{B|yWPj`QWa3&YApc=SC5Emj zV#b_G-7YzJ9=h049##gH8R&whbQwi*cA(e&ovop7HG^o=*8D(8Vab^_(r8SIMF728 zXuPh^9fXztN#-O%$oOHyI2Ozrmt0YI5RY}?#hOY*v|xHEE1}Asucl)>E-aFjYo9sq zYuf#y=;TDePDN_o;#wu0yuWi0ag4QKsSue1DgEPSbvRCoD`E>~Jra*Wr>_FoH$dUd zwQR8%Vz5B*udm;av@W2Qu!O@FLO^00Q_9sPx)SiI5t9_C$f^ix&OJ$Y3Z5#}hH8?( zjw9=SJG!dvbH8hEec^b?WhcQ)5{&RMM1FMu1FmQhL2@4?p-UH+HsJ{iJHK)Pl_TjB ziyJlc@FrmL_I?9FbTJyfW%6q6>1GYf~g9#kfI) zyFUqo%=K-VS|`pu4&(pnSUZe^C;=+hC^97{L`LsvwDlt&8LqRp@Y%PM(MglWoq-$n z243mAQwjzjNA&pYx+|G!ehve_w^dF#>(is;^?$ZF>QbDlqaR{mjQ{|k{6h>}jSZFl zVsuW@6yyRK5Qev8Uf_z(;c#q>L`;~X<@kj6C)b!znS6Xjc(kwYKs?hZ)hRK%(ZUi|D2ksx{0fj`K{c z&Vw|d(MAU=e-WYuB6*9e zrRmjLLPUgT5AA5xd05$4><+Z5w$7;zeWk?h!Yk*5IO+315hO7)V-?XA5g9cU=In_Z z2oRCTrA;yq(=^%O$;HBSzFxeIceQtJ>8KP$->*@kOR&ArYuvf#J%6W?M@e&2v(;9D zKa{{z{T1CTUaqGUT=ITVfTsU*nTR0J6()4H&vt(I9cs3i?7Egxh_r2Ab+q>c5d;S5)c?Y>~Q3n3) z{=Hn+*Vm2EWgD`SZ%yjs1P$6(uf<~a z;Uj(G4dP>3+lxrq|DyB_F5%7POQB%?oD29Zp1DwX4?&888xmd9r!B8fIG>IyxXbt ze&Msb8pqdPiE&=FQo*N@LeV?uFHFlAjvNv*by_aotm+0S&*Faa9D2q;h>Vf>LD!3gqLRql&4N##aNEQXw(2)Cg~Io{qb~6=9xoJFU6Qb@m|etH5W%m&Tk825z(yx(c?6 z8Qf9GfGSnE<*Z<6kxRY^ptBWU#=7_iEIp z!=XQYY2GLQkDF#RaMInT4>{%r`MqiWiyRx-I{eL${a27b`1aAF5_*5<{)C)^+`$E$ zHGf5;)+AQ&xA|!f1U1ngv7sCuy||V@IO}|USC};*9fAw>Q|M~BG`C2#<=lIClYk8U zC1bpP7p4Pp>G3q<-RdmTatg`9))}4W>mwXew@NO5)r5Q|!VX~w5D}L|lmy?RiTX8~ zeOa(XNw98d0!mKAG~pcyz=0bRu}sT;pFiv=Q(NCUzvkhzRcoKba|KuZum z^T1;zM-(HvHG@`4-*wZd$;UQ#Z1Qs8T;x`lP9h_pc)y8q$S85@OtFo0qr_&O^B<@} zA6|cjv1_U?5evmF14ClMo=BUl9!QvuVBzcZ6J#w-^@Ab{7(!SSI}Y1k%|7EQ9X3b9 zi*yICsm&B>3`a0UWTYWM-tcSGSZt(Y0 zST{dnPr9Bjop|voMYj3b!oywb%6+R(XM+D;)WFo2IiCA@)FOq3ane9{qRZ4lps@Nr zl2g@3$LDqFyQAoQ7af&`GJABAvuNp4wsrQ#bm12HQ(zrDg7M-==F|8h=Ox4n{QXON zCI81C_U{fNqsDwX#fNimXD*8yOr_Z+`|QJtq;!#$>;p@JBYa4Ay3iL zU~|^zx=&U1VQ6aQplyYIkx@tHl8Fm9Myl}0r{gdt_;_uQ-cG#prQVwg^WN7xSUnnp;f`0^?U&K_s=xFc1Fg+)Y zO1lU1SI-xXbPluo;EBvyG2HK&rHg`K82IRFAH?fnYU`1?J8Q;GgSpOv-Pn!ebxt1* z$$^n;JH5dMdEM@<>hsWvAK+9lp*@d!a}Fh_>7l8Zu{K5t_1re7MM~41fZi*;E!;J! zw4*dwNC8v=chURo@`#$-Bm=?G=%88|vHdRXFUE)EG?GjdE_tv!d}zVZt&qLL`r_>Q zDapx>DZcpDXk3w+?)bdaST?pLVHC9&0eG|IW*O}9x_qHlQnYX{kbFUAT3$dH(Xsa; zioR-t3@)A)yv_{>SVM9=bR+qaDElHfOnRLi;Mp9s7skBDcgnsYF3f{j^hc?paXZqS zf3NE(H*)XkZEF2l$`5lCF^o@MBLN~l8<^zIAjKJysct@Ohm3iOG0DLZvbDyTQMZFv zh)I9On8CRJ(NX*8)E%G^UoggV8HTl&g=q*cF;asK5!tuV=yu5Y9Bi4sxtv~ROpGE; z_}8z{MxJ-gi^dm^b|z*kBtQE!=sdfFIy=+)b`*)8zZg$+Y&B3g0b4fjmaf3Ba77EJ zxVxS}W}7TifKTRj%XAJd!RLYPLtCprE``agDsz7qxj*jH`dYVr0?N&f(tMB&@yM$1>g^z`GByX%{o_eNmo__7@y`gmySA*us z$eIA_*Sb%t{MAi>da{k_6Uzbo$Tc#M3E+yXQ<%eWL6C*D-5MQD{n5=acO#HP1qD8` zi+u)DJXmYPFdnLm8}fysXy#jKFSMxzdJs*(t#mM&0N6W&nhh2CoZu6=I5dr=rm6Atf3lo{3D3-?y4y$EOoWLm!9g;mvUtk-e zon)I+si~b0YS=~_U4I)r(U3rO+K*$(zC8PCcFbueF?0>fU<&E{~Mt#a2)m(8Q@vy$>_8(KcqnoI^Nd7NxCC~w*T|2%gKGjZS7dqWTBTxT6%wTS z8rWqa#Uq)1!Ae$Hf`<8y>sDj1{~znN^pOAis&@$7jTpK(+>w8?gv1s&qRH7JsKPDA z&)7N-D}~4w80|^g_G7g>Nk;xwf8z(YgYd_jv+v6Qe#vca5S)EH-FOlCbyO2o>dzh4k!u@+?!vG#i$I}ikJ1N#T_?8XoU zFhto*J}3v_{^ra7gB_MO+vh*}+6$j7E33ZpGI0Ri@&;a2fiZ2b=#x<8ecv{1HpIMH ztvhQG_5e=dZWLf?1$T~AGk@AHzaP<>WM|}nz@*X~Qi!mP=HJue(sW$;vNreRe1G`; znP9COD_1zRqN@$=)Wzcvr}_R8k4xS3vLpDc$@=k%D-}$~x#PI@M1K#NU&uD=#BLA& zfYz1)ksIg-!`p^x!S4A?JZ6exNdNqO|ME3;9r4f0e$+6vRD+mqDvTRFA#T#pSmMo6 z&KyIptH|kg46qlS_^~BHN&pwpH=NE-jNy7Zov95MY$rJDJlxGujt^wTisCCjOKlyu ztU}who@VGD$Zg*(DG2@9zrjcMtKyAaBAImEG3O_FgD7!=W1({=adoC;rA($PlEX(? z+Zq5pNcz}=KuugysXgg3nOS^F&e6^5D}D+ErrSW(K4RC~b0BmBLD5k0Tr%U`5I8KK zrfs$5t#VE2lUWR)DuK3+ct14E2lCBt1kKIL)#*;riPMz+6|8RcCSxf%$XL~IgV7%w z9g-?jYXigI%-Uh*BFw4+a_r&b!IlkejdSH+vN&AYwzxB0MbTvLqU=$+O5c01az}Mq zQSEM2*UF*43o%S&esQk996no(T<6Q~lKldG5)tzvHOFKZ?t z`pbHgIB~BGFW)Ch;Br*Wjm`tS_(=x z3^5}cA-cUjyMcwA6ZQC^r}KGTeIodt+raVGKTM)oq;7i&?FVy;kx zeSOG$g2w~}Ks}B`O!Y!G*&uJ9Ofas$996HmFcKv`%QuG_w$9r2Tbi`2bhE7;7i5Lj z6<$0pmx7hQ*LI)BcJ~x3S6JwU=+VKgU}@`^NYlR|5?0lwE$>d*=p~QRW2hTwqU)BM zYhj5PnIKwk8R9A*C_M&5W(?rL7{WuN~VcqxR_ zS)`5GmW^oT9aVvoC8or|wWFICpdik#Jd`d022Y~|zEZ~}@6R?sQm*sc`MeO4D}9wJ6wK9I!x@SvD=a2W%4#m8BI diff --git a/tests/Zend/Search/Lucene/_openXmlDocuments/test3.docx b/tests/Zend/Search/Lucene/_openXmlDocuments/test3.docx deleted file mode 100644 index 53df1ed7e07ae523b54fc812d5df8001714073a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72384 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 From 6b8ca6aa7b4e2f14b7b192ca78f01e52a562e585 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:35:08 -0500 Subject: [PATCH 26/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Stdlib Tests --- tests/Zend/Stdlib/AllTests.php | 60 ------- tests/Zend/Stdlib/CallbackHandlerTest.php | 149 ------------------ tests/Zend/Stdlib/PriorityQueueTest.php | 146 ----------------- tests/Zend/Stdlib/SplPriorityQueueTest.php | 103 ------------ .../SignalHandlers/InstanceMethod.php | 8 - .../TestAsset/SignalHandlers/Invokable.php | 8 - .../SignalHandlers/ObjectCallback.php | 8 - .../TestAsset/SignalHandlers/Overloadable.php | 8 - 8 files changed, 490 deletions(-) delete mode 100644 tests/Zend/Stdlib/AllTests.php delete mode 100644 tests/Zend/Stdlib/CallbackHandlerTest.php delete mode 100644 tests/Zend/Stdlib/PriorityQueueTest.php delete mode 100644 tests/Zend/Stdlib/SplPriorityQueueTest.php delete mode 100644 tests/Zend/Stdlib/TestAsset/SignalHandlers/InstanceMethod.php delete mode 100644 tests/Zend/Stdlib/TestAsset/SignalHandlers/Invokable.php delete mode 100644 tests/Zend/Stdlib/TestAsset/SignalHandlers/ObjectCallback.php delete mode 100644 tests/Zend/Stdlib/TestAsset/SignalHandlers/Overloadable.php diff --git a/tests/Zend/Stdlib/AllTests.php b/tests/Zend/Stdlib/AllTests.php deleted file mode 100644 index be9bf3ba6b..0000000000 --- a/tests/Zend/Stdlib/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Stdlib_CallbackHandlerTest'); - $suite->addTestSuite('Zend_Stdlib_PriorityQueueTest'); - $suite->addTestSuite('Zend_Stdlib_SplPriorityQueueTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Stdlib_AllTests::main') { - Zend_Stdlib_AllTests::main(); -} diff --git a/tests/Zend/Stdlib/CallbackHandlerTest.php b/tests/Zend/Stdlib/CallbackHandlerTest.php deleted file mode 100644 index bbbce75442..0000000000 --- a/tests/Zend/Stdlib/CallbackHandlerTest.php +++ /dev/null @@ -1,149 +0,0 @@ -args)) { - unset($this->args); - } - $this->error = false; - } - - public function testCallbackShouldStoreMetadata() - { - $handler = new Zend_Stdlib_CallbackHandler('rand', array('event' => 'foo')); - $this->assertEquals('foo', $handler->getMetadatum('event')); - $this->assertEquals(array('event' => 'foo'), $handler->getMetadata()); - } - - public function testCallbackShouldBeStringIfNoHandlerPassedToConstructor() - { - $handler = new Zend_Stdlib_CallbackHandler('rand'); - $this->assertSame('rand', $handler->getCallback()); - } - - public function testCallbackShouldBeArrayIfHandlerPassedToConstructor() - { - $handler = new Zend_Stdlib_CallbackHandler(array('Zend_Stdlib_TestAsset_SignalHandlers_ObjectCallback', 'test')); - $this->assertSame(array('Zend_Stdlib_TestAsset_SignalHandlers_ObjectCallback', 'test'), $handler->getCallback()); - } - - public function testCallShouldInvokeCallbackWithSuppliedArguments() - { - $handler = new Zend_Stdlib_CallbackHandler(array( $this, 'handleCall' )); - $args = array('foo', 'bar', 'baz'); - $handler->call($args); - $this->assertSame($args, $this->args); - } - - public function testPassingInvalidCallbackShouldRaiseInvalidCallbackExceptionDuringInstantiation() - { - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $handler = new Zend_Stdlib_CallbackHandler('boguscallback'); - } - - public function testCallShouldReturnTheReturnValueOfTheCallback() - { - $handler = new Zend_Stdlib_CallbackHandler(array('Zend_Stdlib_TestAsset_SignalHandlers_ObjectCallback', 'test')); - if (!is_callable(array('Zend_Stdlib_TestAsset_SignalHandlers_ObjectCallback', 'test'))) { - echo "\nClass exists? " . var_export(class_exists('Zend_Stdlib_TestAsset_SignalHandlers_ObjectCallback'), 1) . "\n"; - echo "Include path: " . get_include_path() . "\n"; - } - $this->assertEquals('bar', $handler->call(array())); - } - - public function testStringCallbackResolvingToClassDefiningInvokeNameShouldRaiseException() - { - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $handler = new Zend_Stdlib_CallbackHandler('Zend_Stdlib_TestAsset_SignalHandlers_Invokable'); - } - - public function testStringCallbackReferringToClassWithoutDefinedInvokeShouldRaiseException() - { - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $class = new Zend_Stdlib_TestAsset_SignalHandlers_InstanceMethod(); - $handler = new Zend_Stdlib_CallbackHandler($class); - } - - public function errorHandler($errno, $errstr) - { - $this->error = true; - } - - public function testCallbackConsistingOfStringContextWithNonStaticMethodShouldRaiseException() - { - if (version_compare(PHP_VERSION, '5.3.0', '>=')) { - $this->markTestSkipped('Behavior of is_callable changes between 5.2 and 5.3'); - } - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $handler = new Zend_Stdlib_CallbackHandler(array('Zend_Stdlib_TestAsset_SignalHandlers_InstanceMethod', 'handler')); - } - - public function testStringCallbackConsistingOfNonStaticMethodShouldRaiseException() - { - if (version_compare(PHP_VERSION, '5.3.0', '>=')) { - $this->markTestSkipped('Behavior of is_callable changes between 5.2 and 5.3'); - } - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $handler = new Zend_Stdlib_CallbackHandler('Zend_Stdlib_TestAsset_SignalHandlers_InstanceMethod::handler'); - } - - public function testCallbackToClassImplementingOverloadingButNotInvocableShouldRaiseException() - { - $this->setExpectedException('Zend_Stdlib_Exception_InvalidCallbackException'); - $handler = new Zend_Stdlib_CallbackHandler('foo', array( 'Zend_Stdlib_TestAsset_SignalHandlers_Overloadable', 'foo' )); - } - - public function handleCall() - { - $this->args = func_get_args(); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Stdlib_CallbackHandlerTest::main') { - Zend_Stdlib_CallbackHandlerTest::main(); -} diff --git a/tests/Zend/Stdlib/PriorityQueueTest.php b/tests/Zend/Stdlib/PriorityQueueTest.php deleted file mode 100644 index 02438d961e..0000000000 --- a/tests/Zend/Stdlib/PriorityQueueTest.php +++ /dev/null @@ -1,146 +0,0 @@ -queue = new Zend_Stdlib_PriorityQueue(); - $this->queue->insert('foo', 3); - $this->queue->insert('bar', 4); - $this->queue->insert('baz', 2); - $this->queue->insert('bat', 1); - } - - public function testSerializationAndDeserializationShouldMaintainState() - { - $s = serialize($this->queue); - $unserialized = unserialize($s); - $count = count($this->queue); - $this->assertSame($count, count($unserialized), 'Expected count ' . $count . '; received ' . count($unserialized)); - - $expected = array(); - foreach ($this->queue as $item) { - $expected[] = $item; - } - $test = array(); - foreach ($unserialized as $item) { - $test[] = $item; - } - $this->assertSame($expected, $test, 'Expected: ' . var_export($expected, 1) . "\nReceived:" . var_export($test, 1)); - } - - public function testRetrievingQueueAsArrayReturnsDataOnlyByDefault() - { - $expected = array( - 'foo', - 'bar', - 'baz', - 'bat', - ); - $test = $this->queue->toArray(); - $this->assertSame($expected, $test, var_export($test, 1)); - } - - public function testCanCastToArrayOfPrioritiesOnly() - { - $expected = array( - 3, - 4, - 2, - 1, - ); - $test = $this->queue->toArray(Zend_Stdlib_PriorityQueue::EXTR_PRIORITY); - $this->assertSame($expected, $test, var_export($test, 1)); - } - - public function testCanCastToArrayOfDataPriorityPairs() - { - $expected = array( - array('data' => 'foo', 'priority' => 3), - array('data' => 'bar', 'priority' => 4), - array('data' => 'baz', 'priority' => 2), - array('data' => 'bat', 'priority' => 1), - ); - $test = $this->queue->toArray(Zend_Stdlib_PriorityQueue::EXTR_BOTH); - $this->assertSame($expected, $test, var_export($test, 1)); - } - - public function testCanIterateMultipleTimesAndReceiveSameResults() - { - $expected = array('bar', 'foo', 'baz', 'bat'); - - for ($i = 1; $i < 3; $i++) { - $test = array(); - foreach ($this->queue as $item) { - $test[] = $item; - } - $this->assertEquals($expected, $test, 'Failed at iteration ' . $i); - } - } - - public function testCanRemoveItemFromQueue() - { - $this->queue->remove('baz'); - $expected = array('bar', 'foo', 'bat'); - $test = array(); - foreach ($this->queue as $item) { - $test[] = $item; - } - $this->assertEquals($expected, $test); - } - - public function testCanTestForExistenceOfItemInQueue() - { - $this->assertTrue($this->queue->contains('foo')); - $this->assertFalse($this->queue->contains('foobar')); - } - - public function testCanTestForExistenceOfPriorityInQueue() - { - $this->assertTrue($this->queue->hasPriority(3)); - $this->assertFalse($this->queue->hasPriority(1000)); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Stdlib_PriorityQueueTest::main') { - Zend_Stdlib_PriorityQueueTest::main(); -} diff --git a/tests/Zend/Stdlib/SplPriorityQueueTest.php b/tests/Zend/Stdlib/SplPriorityQueueTest.php deleted file mode 100644 index 1519cc72cd..0000000000 --- a/tests/Zend/Stdlib/SplPriorityQueueTest.php +++ /dev/null @@ -1,103 +0,0 @@ -queue = new Zend_Stdlib_SplPriorityQueue(); - $this->queue->insert('foo', 3); - $this->queue->insert('bar', 4); - $this->queue->insert('baz', 2); - $this->queue->insert('bat', 1); - } - - public function testMaintainsInsertOrderForDataOfEqualPriority() - { - $queue = new Zend_Stdlib_SplPriorityQueue(); - $queue->insert('foo', 1000); - $queue->insert('bar', 1000); - $queue->insert('baz', 1000); - $queue->insert('bat', 1000); - - $expected = array('foo', 'bar', 'baz', 'bat'); - $test = array(); - foreach ($queue as $datum) { - $test[] = $datum; - } - $this->assertEquals($expected, $test); - } - - public function testSerializationAndDeserializationShouldMaintainState() - { - $s = serialize($this->queue); - $unserialized = unserialize($s); - $count = count($this->queue); - $this->assertSame($count, count($unserialized), 'Expected count ' . $count . '; received ' . count($unserialized)); - - $expected = array(); - foreach ($this->queue as $item) { - $expected[] = $item; - } - $test = array(); - foreach ($unserialized as $item) { - $test[] = $item; - } - $this->assertSame($expected, $test, 'Expected: ' . var_export($expected, 1) . "\nReceived:" . var_export($test, 1)); - } - - public function testCanRetrieveQueueAsArray() - { - $expected = array( - 'bar', - 'foo', - 'baz', - 'bat', - ); - $test = $this->queue->toArray(); - $this->assertSame($expected, $test, var_export($test, 1)); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Stdlib_SplPriorityQueueTest::main') { - Zend_Stdlib_SplPriorityQueueTest::main(); -} diff --git a/tests/Zend/Stdlib/TestAsset/SignalHandlers/InstanceMethod.php b/tests/Zend/Stdlib/TestAsset/SignalHandlers/InstanceMethod.php deleted file mode 100644 index 5c1e7df629..0000000000 --- a/tests/Zend/Stdlib/TestAsset/SignalHandlers/InstanceMethod.php +++ /dev/null @@ -1,8 +0,0 @@ - Date: Fri, 6 Apr 2018 11:36:06 -0500 Subject: [PATCH 27/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Tag Tests --- tests/Zend/AllTests.php | 2 - tests/Zend/Tag/AllTests.php | 60 --- tests/Zend/Tag/Cloud/AllTests.php | 59 --- tests/Zend/Tag/Cloud/CloudTest.php | 345 ------------------ tests/Zend/Tag/Cloud/Decorator/AllTests.php | 59 --- .../Tag/Cloud/Decorator/HtmlCloudTest.php | 104 ------ .../Zend/Tag/Cloud/Decorator/HtmlTagTest.php | 203 ----------- tests/Zend/Tag/Cloud/_classes/CloudDummy.php | 45 --- tests/Zend/Tag/Cloud/_classes/CloudDummy1.php | 45 --- tests/Zend/Tag/Cloud/_classes/CloudDummy2.php | 45 --- tests/Zend/Tag/Cloud/_classes/TagDummy.php | 45 --- tests/Zend/Tag/ItemListTest.php | 160 -------- tests/Zend/Tag/ItemTest.php | 176 --------- 13 files changed, 1348 deletions(-) delete mode 100644 tests/Zend/Tag/AllTests.php delete mode 100644 tests/Zend/Tag/Cloud/AllTests.php delete mode 100644 tests/Zend/Tag/Cloud/CloudTest.php delete mode 100644 tests/Zend/Tag/Cloud/Decorator/AllTests.php delete mode 100644 tests/Zend/Tag/Cloud/Decorator/HtmlCloudTest.php delete mode 100644 tests/Zend/Tag/Cloud/Decorator/HtmlTagTest.php delete mode 100644 tests/Zend/Tag/Cloud/_classes/CloudDummy.php delete mode 100644 tests/Zend/Tag/Cloud/_classes/CloudDummy1.php delete mode 100644 tests/Zend/Tag/Cloud/_classes/CloudDummy2.php delete mode 100644 tests/Zend/Tag/Cloud/_classes/TagDummy.php delete mode 100644 tests/Zend/Tag/ItemListTest.php delete mode 100644 tests/Zend/Tag/ItemTest.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index c5d8fb958a..5af039b407 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -67,7 +67,6 @@ require_once 'Zend/Server/AllTests.php'; require_once 'Zend/Session/AllTests.php'; require_once 'Zend/Soap/AllTests.php'; -require_once 'Zend/Tag/AllTests.php'; require_once 'Zend/Test/AllTests.php'; require_once 'Zend/Text/AllTests.php'; require_once 'Zend/TimeSyncTest.php'; @@ -180,7 +179,6 @@ public static function suite() $suite->addTestSuite('Zend_RegistryTest'); $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); - $suite->addTest(Zend_Tag_AllTests::suite()); $suite->addTest(Zend_Test_AllTests::suite()); $suite->addTest(Zend_Text_AllTests::suite()); $suite->addTest(Zend_Tool_AllTests::suite()); diff --git a/tests/Zend/Tag/AllTests.php b/tests/Zend/Tag/AllTests.php deleted file mode 100644 index 78d7330f25..0000000000 --- a/tests/Zend/Tag/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Tag_ItemTest'); - $suite->addTestSuite('Zend_Tag_ItemListTest'); - $suite->addTest(Zend_Tag_Cloud_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_AllTests::main') { - Zend_Tag_AllTests::main(); -} diff --git a/tests/Zend/Tag/Cloud/AllTests.php b/tests/Zend/Tag/Cloud/AllTests.php deleted file mode 100644 index 33e1e0c602..0000000000 --- a/tests/Zend/Tag/Cloud/AllTests.php +++ /dev/null @@ -1,59 +0,0 @@ -addTestSuite('Zend_Tag_Cloud_CloudTest'); - $suite->addTest(Zend_Tag_Cloud_Decorator_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_Cloud_AllTests::main') { - Zend_Tag_Cloud_AllTests::main(); -} diff --git a/tests/Zend/Tag/Cloud/CloudTest.php b/tests/Zend/Tag/Cloud/CloudTest.php deleted file mode 100644 index c0d5a13165..0000000000 --- a/tests/Zend/Tag/Cloud/CloudTest.php +++ /dev/null @@ -1,345 +0,0 @@ -_getCloud(); - $this->assertTrue($cloud->getItemList() instanceof Zend_Tag_ItemList); - - $cloud->setItemList(new Zend_Tag_ItemListDummy); - $this->assertTrue($cloud->getItemList() instanceof Zend_Tag_ItemListDummy); - } - - public function testSetCloudDecoratorViaArray() - { - $cloud = $this->_getCloud(); - - $cloud->setCloudDecorator(array('decorator' => 'CloudDummy', 'options' => array('foo' => 'bar'))); - $this->assertTrue($cloud->getCloudDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_CloudDummy); - $this->assertEquals('bar', $cloud->getCloudDecorator()->getFoo()); - } - - public function testGetAndSetCloudDecorator() - { - $cloud = $this->_getCloud(); - $this->assertTrue($cloud->getCloudDecorator() instanceof Zend_Tag_Cloud_Decorator_HtmlCloud); - - $cloud->setCloudDecorator(new Zend_Tag_Cloud_Decorator_Dummy_CloudDummy()); - $this->assertTrue($cloud->getCloudDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_CloudDummy); - } - - public function testSetInvalidCloudDecorator() - { - $cloud = $this->_getCloud(); - - try { - $cloud->setCloudDecorator(new stdClass()); - $this->fail('An expected Zend_Tag_Cloud_Exception was not raised'); - } catch (Zend_Tag_Cloud_Exception $e) { - $this->assertEquals('Decorator is no instance of Zend_Tag_Cloud_Decorator_Cloud', $e->getMessage()); - } - } - - public function testSetTagDecoratorViaArray() - { - $cloud = $this->_getCloud(); - - $cloud->setTagDecorator(array('decorator' => 'TagDummy', 'options' => array('foo' => 'bar'))); - $this->assertTrue($cloud->getTagDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_TagDummy); - $this->assertEquals('bar', $cloud->getTagDecorator()->getFoo()); - } - - public function testGetAndSetTagDecorator() - { - $cloud = $this->_getCloud(); - $this->assertTrue($cloud->getTagDecorator() instanceof Zend_Tag_Cloud_Decorator_HtmlTag); - - $cloud->setTagDecorator(new Zend_Tag_Cloud_Decorator_Dummy_TagDummy()); - $this->assertTrue($cloud->getTagDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_TagDummy); - } - - public function testSetInvalidTagDecorator() - { - $cloud = $this->_getCloud(); - - try { - $cloud->setTagDecorator(new stdClass()); - $this->fail('An expected Zend_Tag_Cloud_Exception was not raised'); - } catch (Zend_Tag_Cloud_Exception $e) { - $this->assertEquals('Decorator is no instance of Zend_Tag_Cloud_Decorator_Tag', $e->getMessage()); - } - } - - public function testSetPrefixPathViaOptions() - { - $cloud = $this->_getCloud(array( - 'prefixPath' => array( - 'prefix' => 'Zend_Tag_Cloud_Decorator_Dummy_', - 'path' => dirname(__FILE__) . '/_classes' - ), - 'cloudDecorator' => array( - 'decorator' => 'CloudDummy1', - 'options' => array( - 'foo' => 'bar' - ) - ) - ), false); - - $this->assertTrue($cloud->getCloudDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_CloudDummy1); - $this->assertEquals('bar', $cloud->getCloudDecorator()->getFoo()); - } - - public function testSetPrefixPathsViaOptions() - { - $cloud = $this->_getCloud(array( - 'prefixPath' => array( - array( - 'prefix' => 'Zend_Tag_Cloud_Decorator_Dummy_', - 'path' => dirname(__FILE__) . '/_classes' - ) - ), - 'cloudDecorator' => array( - 'decorator' => 'CloudDummy2', - 'options' => array( - 'foo' => 'bar' - ) - ) - ), false); - - $this->assertTrue($cloud->getCloudDecorator() instanceof Zend_Tag_Cloud_Decorator_Dummy_CloudDummy2); - $this->assertEquals('bar', $cloud->getCloudDecorator()->getFoo()); - } - - public function testSetPrefixPathsSkip() - { - $cloud = $this->_getCloud(array( - 'prefixPath' => array( - array( - 'prefix' => 'foobar', - ) - ), - ), false); - - $this->assertEquals(1, count($cloud->getPluginLoader()->getPaths())); - } - - public function testSetPluginLoader() - { - $loader = new Zend_Loader_PluginLoader(array('foo_' => 'bar/')); - $cloud = $this->_getCloud(array(), null); - $cloud->setPluginLoader($loader); - $paths = $cloud->getPluginLoader()->getPaths(); - - $this->assertEquals('bar/', $paths['foo_'][0]); - } - - public function testSetPluginLoaderViaOptions() - { - $loader = new Zend_Loader_PluginLoader(array('foo_' => 'bar/')); - $cloud = $this->_getCloud(array('pluginLoader' => $loader), null); - $paths = $cloud->getPluginLoader()->getPaths(); - - $this->assertEquals('bar/', $paths['foo_'][0]); - } - - public function testAppendTagAsArray() - { - $cloud = $this->_getCloud(); - $list = $cloud->getItemList(); - - $cloud->appendTag(array('title' => 'foo', 'weight' => 1)); - - $this->assertEquals('foo', $list[0]->getTitle()); - } - - public function testAppendTagAsItem() - { - $cloud = $this->_getCloud(); - $list = $cloud->getItemList(); - - $cloud->appendTag(new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1))); - - $this->assertEquals('foo', $list[0]->getTitle()); - } - - public function testAppendInvalidTag() - { - $cloud = $this->_getCloud(); - - try { - $cloud->appendTag('foo'); - $this->fail('An expected Zend_Tag_Cloud_Exception was not raised'); - } catch (Zend_Tag_Cloud_Exception $e) { - $this->assertEquals('Tag must be an instance of Zend_Tag_Taggable or an array', $e->getMessage()); - } - } - - public function testSetTagsAsArray() - { - $cloud = $this->_getCloud(); - $list = $cloud->getItemList(); - - $cloud->setTags(array(array('title' => 'foo', 'weight' => 1), - array('title' => 'bar', 'weight' => 2))); - - $this->assertEquals('foo', $list[0]->getTitle()); - $this->assertEquals('bar', $list[1]->getTitle()); - } - - public function testSetTagsAsItem() - { - $cloud = $this->_getCloud(); - $list = $cloud->getItemList(); - - $cloud->setTags(array(new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)), - new Zend_Tag_Item(array('title' => 'bar', 'weight' => 2)))); - - $this->assertEquals('foo', $list[0]->getTitle()); - $this->assertEquals('bar', $list[1]->getTitle()); - } - - public function testSetTagsMixed() - { - $cloud = $this->_getCloud(); - $list = $cloud->getItemList(); - - $cloud->setTags(array(array('title' => 'foo', 'weight' => 1), - new Zend_Tag_Item(array('title' => 'bar', 'weight' => 2)))); - - $this->assertEquals('foo', $list[0]->getTitle()); - $this->assertEquals('bar', $list[1]->getTitle()); - } - - public function testSetInvalidTags() - { - $cloud = $this->_getCloud(); - - try { - $cloud->setTags(array('foo')); - $this->fail('An expected Zend_Tag_Cloud_Exception was not raised'); - } catch (Zend_Tag_Cloud_Exception $e) { - $this->assertEquals('Tag must be an instance of Zend_Tag_Taggable or an array', $e->getMessage()); - } - } - - public function testConstructorWithArray() - { - $cloud = $this->_getCloud(array('tags' => array(array('title' => 'foo', 'weight' => 1)))); - $list = $cloud->getItemList(); - - $this->assertEquals('foo', $list[0]->getTitle()); - } - - public function testConstructorWithConfig() - { - $cloud = $this->_getCloud(new Zend_Config(array('tags' => array(array('title' => 'foo', 'weight' => 1))))); - $list = $cloud->getItemList(); - - $this->assertEquals('foo', $list[0]->getTitle()); - } - - public function testSetOptions() - { - $cloud = $this->_getCloud(); - $cloud->setOptions(array('tags' => array(array('title' => 'foo', 'weight' => 1)))); - $list = $cloud->getItemList(); - - $this->assertEquals('foo', $list[0]->getTitle()); - } - - public function testSkipOptions() - { - $cloud = $this->_getCloud(array('options' => 'foobar')); - // In case would fail due to an error - } - - public function testRender() - { - $cloud = $this->_getCloud(array('tags' => array(array('title' => 'foo', 'weight' => 1), array('title' => 'bar', 'weight' => 3)))); - $expected = '

    '; - $this->assertEquals($expected, $cloud->render()); - } - - public function testRenderEmptyCloud() - { - $cloud = $this->_getCloud(); - $this->assertEquals('', $cloud->render()); - } - - public function testRenderViaToString() - { - $cloud = $this->_getCloud(array('tags' => array(array('title' => 'foo', 'weight' => 1), array('title' => 'bar', 'weight' => 3)))); - $expected = ''; - $this->assertEquals($expected, (string) $cloud); - } - - protected function _getCloud($options = null, $setPluginLoader = true) - { - $cloud = new Zend_Tag_Cloud($options); - - if ($setPluginLoader) { - $cloud->getPluginLoader()->addPrefixPath('Zend_Tag_Cloud_Decorator_Dummy_', dirname(__FILE__) . '/_classes'); - } - - return $cloud; - } -} - -class Zend_Tag_ItemListDummy extends Zend_Tag_ItemList {} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_Cloud_CloudTest::main') { - Zend_Tag_Cloud_CloudTest::main(); -} diff --git a/tests/Zend/Tag/Cloud/Decorator/AllTests.php b/tests/Zend/Tag/Cloud/Decorator/AllTests.php deleted file mode 100644 index dc0f5879a7..0000000000 --- a/tests/Zend/Tag/Cloud/Decorator/AllTests.php +++ /dev/null @@ -1,59 +0,0 @@ -addTestSuite('Zend_Tag_Cloud_Decorator_HtmlCloudTest'); - $suite->addTestSuite('Zend_Tag_Cloud_Decorator_HtmlTagTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_Cloud_Decorator_AllTests::main') { - Zend_Tag_Cloud_Decorator_AllTests::main(); -} diff --git a/tests/Zend/Tag/Cloud/Decorator/HtmlCloudTest.php b/tests/Zend/Tag/Cloud/Decorator/HtmlCloudTest.php deleted file mode 100644 index 36641107a9..0000000000 --- a/tests/Zend/Tag/Cloud/Decorator/HtmlCloudTest.php +++ /dev/null @@ -1,104 +0,0 @@ -assertEquals('
      foo bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testNestedTags() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(); - $decorator->setHtmlTags(array('span', 'div' => array('id' => 'tag-cloud'))); - - $this->assertEquals('
    foo bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testSeparator() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(); - $decorator->setSeparator('-'); - - $this->assertEquals('
      foo-bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testConstructorWithArray() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(array('htmlTags' => array('div'), 'separator' => ' ')); - - $this->assertEquals('
    foo bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testConstructorWithConfig() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(new Zend_Config(array('htmlTags' => array('div'), 'separator' => ' '))); - - $this->assertEquals('
    foo bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testSetOptions() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(); - $decorator->setOptions(array('htmlTags' => array('div'), 'separator' => ' ')); - - $this->assertEquals('
    foo bar
    ', $decorator->render(array('foo', 'bar'))); - } - - public function testSkipOptions() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlCloud(array('options' => 'foobar')); - // In case would fail due to an error - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_Cloud_Decorator_HtmlCloudTest::main') { - Zend_Tag_Cloud_Decorator_HtmlCloudTest::main(); -} -/** - * - */ diff --git a/tests/Zend/Tag/Cloud/Decorator/HtmlTagTest.php b/tests/Zend/Tag/Cloud/Decorator/HtmlTagTest.php deleted file mode 100644 index 53ac038f50..0000000000 --- a/tests/Zend/Tag/Cloud/Decorator/HtmlTagTest.php +++ /dev/null @@ -1,203 +0,0 @@ -foo', - '
  • bar
  • ', - '
  • baz
  • '); - - $this->assertEquals($decorator->render($this->_getTagList()), $expected); - } - - public function testNestedTags() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - $decorator->setHtmlTags(array('span' => array('class' => 'tag'), 'li')); - $expected = array('
  • foo
  • ', - '
  • bar
  • ', - '
  • baz
  • '); - - $this->assertEquals($decorator->render($this->_getTagList()), $expected); - } - - public function testFontSizeSpread() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - $decorator->setFontSizeUnit('pt') - ->setMinFontSize(5) - ->setMaxFontSize(50); - - $expected = array('
  • foo
  • ', - '
  • bar
  • ', - '
  • baz
  • '); - - $this->assertEquals($decorator->render($this->_getTagList()), $expected); - } - - public function testClassListSpread() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - $decorator->setClassList(array('small', 'medium', 'large')); - - $expected = array('
  • foo
  • ', - '
  • bar
  • ', - '
  • baz
  • '); - - $this->assertEquals($decorator->render($this->_getTagList()), $expected); - } - - public function testEmptyClassList() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - - try { - $decorator->setClassList(array()); - $this->fail('An expected Zend_Tag_Cloud_Decorator_Exception was not raised'); - } catch (Zend_Tag_Cloud_Decorator_Exception $e) { - $this->assertEquals($e->getMessage(), 'Classlist is empty'); - } - } - - public function testInvalidClassList() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - - try { - $decorator->setClassList(array(array())); - $this->fail('An expected Zend_Tag_Cloud_Decorator_Exception was not raised'); - } catch (Zend_Tag_Cloud_Decorator_Exception $e) { - $this->assertEquals($e->getMessage(), 'Classlist contains an invalid classname'); - } - } - - public function testInvalidFontSizeUnit() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - - try { - $decorator->setFontSizeUnit('foo'); - $this->fail('An expected Zend_Tag_Cloud_Decorator_Exception was not raised'); - } catch (Zend_Tag_Cloud_Decorator_Exception $e) { - $this->assertEquals($e->getMessage(), 'Invalid fontsize unit specified'); - } - } - - public function testInvalidMinFontSize() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - - try { - $decorator->setMinFontSize('foo'); - $this->fail('An expected Zend_Tag_Cloud_Decorator_Exception was not raised'); - } catch (Zend_Tag_Cloud_Decorator_Exception $e) { - $this->assertEquals($e->getMessage(), 'Fontsize must be numeric'); - } - } - - public function testInvalidMaxFontSize() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - - try { - $decorator->setMaxFontSize('foo'); - $this->fail('An expected Zend_Tag_Cloud_Decorator_Exception was not raised'); - } catch (Zend_Tag_Cloud_Decorator_Exception $e) { - $this->assertEquals($e->getMessage(), 'Fontsize must be numeric'); - } - } - - public function testConstructorWithArray() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(array('minFontSize' => 5, 'maxFontSize' => 10, 'fontSizeUnit' => 'pt')); - - $this->assertEquals(5, $decorator->getMinFontSize()); - $this->assertEquals(10, $decorator->getMaxFontSize()); - $this->assertEquals('pt', $decorator->getFontSizeUnit()); - } - - public function testConstructorWithConfig() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(new Zend_Config(array('minFontSize' => 5, 'maxFontSize' => 10, 'fontSizeUnit' => 'pt'))); - - $this->assertEquals(5, $decorator->getMinFontSize()); - $this->assertEquals(10, $decorator->getMaxFontSize()); - $this->assertEquals('pt', $decorator->getFontSizeUnit()); - } - - public function testSetOptions() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(); - $decorator->setOptions(array('minFontSize' => 5, 'maxFontSize' => 10, 'fontSizeUnit' => 'pt')); - - $this->assertEquals(5, $decorator->getMinFontSize()); - $this->assertEquals(10, $decorator->getMaxFontSize()); - $this->assertEquals('pt', $decorator->getFontSizeUnit()); - } - - public function testSkipOptions() - { - $decorator = new Zend_Tag_Cloud_Decorator_HtmlTag(array('options' => 'foobar')); - // In case would fail due to an error - } - - protected function _getTagList() - { - $list = new Zend_Tag_ItemList(); - $list[] = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1, 'params' => array('url' => 'http://first'))); - $list[] = new Zend_Tag_Item(array('title' => 'bar', 'weight' => 3, 'params' => array('url' => 'http://second'))); - $list[] = new Zend_Tag_Item(array('title' => 'baz', 'weight' => 10, 'params' => array('url' => 'http://third'))); - - return $list; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_Cloud_Decorator_HtmlTagTest::main') { - Zend_Tag_Cloud_Decorator_HtmlTagTest::main(); -} diff --git a/tests/Zend/Tag/Cloud/_classes/CloudDummy.php b/tests/Zend/Tag/Cloud/_classes/CloudDummy.php deleted file mode 100644 index 5bef9f5764..0000000000 --- a/tests/Zend/Tag/Cloud/_classes/CloudDummy.php +++ /dev/null @@ -1,45 +0,0 @@ -_foo = $value; - } - - public function getFoo() - { - return $this->_foo; - } -} diff --git a/tests/Zend/Tag/Cloud/_classes/CloudDummy1.php b/tests/Zend/Tag/Cloud/_classes/CloudDummy1.php deleted file mode 100644 index 299556a8f8..0000000000 --- a/tests/Zend/Tag/Cloud/_classes/CloudDummy1.php +++ /dev/null @@ -1,45 +0,0 @@ -_foo = $value; - } - - public function getFoo() - { - return $this->_foo; - } -} diff --git a/tests/Zend/Tag/Cloud/_classes/CloudDummy2.php b/tests/Zend/Tag/Cloud/_classes/CloudDummy2.php deleted file mode 100644 index 9cc0e66a4d..0000000000 --- a/tests/Zend/Tag/Cloud/_classes/CloudDummy2.php +++ /dev/null @@ -1,45 +0,0 @@ -_foo = $value; - } - - public function getFoo() - { - return $this->_foo; - } -} diff --git a/tests/Zend/Tag/Cloud/_classes/TagDummy.php b/tests/Zend/Tag/Cloud/_classes/TagDummy.php deleted file mode 100644 index 9772f17bfc..0000000000 --- a/tests/Zend/Tag/Cloud/_classes/TagDummy.php +++ /dev/null @@ -1,45 +0,0 @@ -_foo = $value; - } - - public function getFoo() - { - return $this->_foo; - } -} diff --git a/tests/Zend/Tag/ItemListTest.php b/tests/Zend/Tag/ItemListTest.php deleted file mode 100644 index aaa23e2d79..0000000000 --- a/tests/Zend/Tag/ItemListTest.php +++ /dev/null @@ -1,160 +0,0 @@ -_getItem('foo'); - $list[] = $this->_getItem('bar'); - $list[] = $this->_getItem('baz'); - $this->assertEquals(count($list), 3); - - unset($list[2]); - $this->assertEquals(count($list), 2); - - $list[5] = $this->_getItem('bat'); - $this->assertTrue(isset($list[5])); - - $this->assertEquals($list[1]->getTitle(), 'bar'); - } - - public function testSeekableIterator() - { - $list = new Zend_Tag_ItemList(); - - $values = array('foo', 'bar', 'baz'); - foreach ($values as $value) { - $list[] = $this->_getItem($value); - } - - foreach ($list as $key => $item) { - $this->assertEquals($item->getTitle(), $values[$key]); - } - - $list->seek(2); - $this->assertEquals($list->current()->getTitle(), $values[2]); - - try { - $list->seek(3); - $this->fail('An expected OutOfBoundsException was not raised'); - } catch (OutOfBoundsException $e) { - $this->assertEquals($e->getMessage(), 'Invalid seek position'); - } - } - - public function testInvalidItem() - { - $list = new Zend_Tag_ItemList(); - - try { - $list[] = 'test'; - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Item must implement Zend_Tag_Taggable'); - } - } - - public function testSpreadWeightValues() - { - $list = new Zend_Tag_ItemList(); - - $list[] = $this->_getItem('foo', 1); - $list[] = $this->_getItem('bar', 5); - $list[] = $this->_getItem('baz', 50); - - $list->spreadWeightValues(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); - - $weightValues = array(); - foreach ($list as $item) { - $weightValues[] = $item->getParam('weightValue'); - } - - $expectedWeightValues = array(1, 2, 10); - - $this->assertEquals($weightValues, $expectedWeightValues); - } - - public function testSpreadWeightValuesWithSingleValue() - { - $list = new Zend_Tag_ItemList(); - - $list[] = $this->_getItem('foo', 1); - $list[] = $this->_getItem('bar', 5); - $list[] = $this->_getItem('baz', 50); - - $list->spreadWeightValues(array('foobar')); - - $weightValues = array(); - foreach ($list as $item) { - $weightValues[] = $item->getParam('weightValue'); - } - - $expectedWeightValues = array('foobar', 'foobar', 'foobar'); - - $this->assertEquals($weightValues, $expectedWeightValues); - } - - public function testSpreadWeightValuesWithEmptyValuesArray() - { - $list = new Zend_Tag_ItemList(); - - try { - $list->spreadWeightValues(array()); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Value list may not be empty'); - } - } - - protected function _getItem($title = 'foo', $weight = 1) - { - return new Zend_Tag_Item(array('title' => $title, 'weight' => $weight)); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_ItemListTest::main') { - Zend_Tag_ItemListTest::main(); -} diff --git a/tests/Zend/Tag/ItemTest.php b/tests/Zend/Tag/ItemTest.php deleted file mode 100644 index 278e953b11..0000000000 --- a/tests/Zend/Tag/ItemTest.php +++ /dev/null @@ -1,176 +0,0 @@ - 'foo', - 'weight' => 10, - 'params' => array( - 'bar' => 'baz' - ) - )); - - $this->assertEquals('foo', $tag->getTitle()); - $this->assertEquals(10, $tag->getWeight()); - $this->assertEquals('baz', $tag->getParam('bar')); - } - - public function testSetOptions() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)); - $tag->setOptions(array( - 'title' => 'bar', - 'weight' => 10, - 'params' => array( - 'bar' => 'baz' - ) - )); - - $this->assertEquals('bar', $tag->getTitle()); - $this->assertEquals(10, $tag->getWeight()); - $this->assertEquals('baz', $tag->getParam('bar')); - } - - public function testSetParam() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)); - $tag->setParam('bar', 'baz'); - - $this->assertEquals('baz', $tag->getParam('bar')); - } - - public function testSetTitle() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)); - $tag->setTitle('baz'); - - $this->assertEquals('baz', $tag->getTitle()); - } - - public function testInvalidTitle() - { - try { - $tag = new Zend_Tag_Item(array('title' => 10, 'weight' => 1)); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Title must be a string'); - } - } - - public function testSetWeight() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)); - $tag->setWeight('10'); - - $this->assertEquals(10.0, $tag->getWeight()); - $this->assertTrue(is_float($tag->getWeight())); - } - - public function testInvalidWeight() - { - try { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 'foobar')); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Weight must be numeric'); - } - } - - public function testSkipOptions() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1, 'param' => 'foobar')); - // In case would fail due to an error - } - - public function testInvalidOptions() - { - try { - $tag = new Zend_Tag_Item('test'); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Invalid options provided to constructor'); - } - } - - public function testMissingTitle() - { - try { - $tag = new Zend_Tag_Item(array('weight' => 1)); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Title was not set'); - } - } - - public function testMissingWeight() - { - try { - $tag = new Zend_Tag_Item(array('title' => 'foo')); - $this->fail('An expected Zend_Tag_Exception was not raised'); - } catch (Zend_Tag_Exception $e) { - $this->assertEquals($e->getMessage(), 'Weight was not set'); - } - } - - public function testConfigOptions() - { - $tag = new Zend_Tag_Item(new Zend_Config(array('title' => 'foo', 'weight' => 1))); - - $this->assertEquals($tag->getTitle(), 'foo'); - $this->assertEquals($tag->getWeight(), 1); - } - - public function testGetNonSetParam() - { - $tag = new Zend_Tag_Item(array('title' => 'foo', 'weight' => 1)); - - $this->assertNull($tag->getParam('foo')); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tag_ItemTest::main') { - Zend_Tag_ItemTest::main(); -} From 7d56527d1d3cf6b3e7870af795b872fac275e9fe Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:37:36 -0500 Subject: [PATCH 28/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Test Tests --- tests/Zend/AllTests.php | 1 - tests/Zend/Test/AllTests.php | 60 -- tests/Zend/Test/DbAdapterTest.php | 171 ---- tests/Zend/Test/DbStatementTest.php | 164 ---- tests/Zend/Test/PHPUnit/AllTests.php | 61 -- .../Zend/Test/PHPUnit/Constraint/AllTests.php | 57 -- .../Test/PHPUnit/Constraint/DomQueryTest.php | 94 -- .../Test/PHPUnit/ControllerTestCaseTest.php | 881 ------------------ tests/Zend/Test/PHPUnit/Db/AllTests.php | 70 -- tests/Zend/Test/PHPUnit/Db/ConnectionTest.php | 91 -- .../Zend/Test/PHPUnit/Db/DataSet/AllTests.php | 64 -- .../PHPUnit/Db/DataSet/DataSetTestCase.php | 56 -- .../Test/PHPUnit/Db/DataSet/DbRowsetTest.php | 98 -- .../PHPUnit/Db/DataSet/DbTableDataSetTest.php | 72 -- .../Test/PHPUnit/Db/DataSet/DbTableTest.php | 87 -- .../PHPUnit/Db/DataSet/QueryDataSetTest.php | 82 -- .../PHPUnit/Db/DataSet/QueryTableTest.php | 126 --- .../Db/Integration/AbstractTestCase.php | 147 --- .../Db/Integration/MysqlIntegrationTest.php | 69 -- .../Db/Integration/SqLiteIntegrationTest.php | 53 -- .../_files/sqliteIntegrationFixture.xml | 6 - .../Test/PHPUnit/Db/Metadata/GenericTest.php | 111 --- .../Test/PHPUnit/Db/Operation/AllTests.php | 60 -- .../PHPUnit/Db/Operation/DeleteAllTest.php | 86 -- .../Test/PHPUnit/Db/Operation/InsertTest.php | 86 -- .../PHPUnit/Db/Operation/TruncateTest.php | 110 --- .../Db/Operation/_files/insertFixture.xml | 6 - .../Db/Operation/_files/truncateFixture.xml | 5 - .../Zend/Test/PHPUnit/Db/SimpleTesterTest.php | 81 -- tests/Zend/Test/PHPUnit/Db/TestCaseTest.php | 119 --- .../controllers/ErrorController.php | 56 -- .../controllers/IndexController.php | 37 - .../ZendTestPhpUnitFooController.php | 45 - .../ZendTestRedirectFromInitController.php | 42 - ...dTestRedirectFromPreDispatchController.php | 42 - .../RedirectFromDispatchLoopStartup.php | 36 - .../plugins/RedirectFromPreDispatch.php | 36 - .../plugins/RedirectFromRouteShutdown.php | 36 - .../plugins/RedirectFromRouteStartup.php | 36 - .../views/scripts/error/error.phtml | 7 - .../scripts/zend-test-php-unit-foo/bar.phtml | 1 - .../scripts/zend-test-php-unit-foo/baz.phtml | 20 - tests/Zend/Test/PHPUnit/_files/bootstrap.php | 42 - 43 files changed, 3610 deletions(-) delete mode 100644 tests/Zend/Test/AllTests.php delete mode 100644 tests/Zend/Test/DbAdapterTest.php delete mode 100644 tests/Zend/Test/DbStatementTest.php delete mode 100644 tests/Zend/Test/PHPUnit/AllTests.php delete mode 100644 tests/Zend/Test/PHPUnit/Constraint/AllTests.php delete mode 100644 tests/Zend/Test/PHPUnit/Constraint/DomQueryTest.php delete mode 100644 tests/Zend/Test/PHPUnit/ControllerTestCaseTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/AllTests.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/ConnectionTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/AllTests.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/DataSetTestCase.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/DbRowsetTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSetTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/DbTableTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/QueryDataSetTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/DataSet/QueryTableTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Integration/AbstractTestCase.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Integration/MysqlIntegrationTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Integration/SqLiteIntegrationTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Integration/_files/sqliteIntegrationFixture.xml delete mode 100644 tests/Zend/Test/PHPUnit/Db/Metadata/GenericTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/AllTests.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/DeleteAllTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/InsertTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/TruncateTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/_files/insertFixture.xml delete mode 100644 tests/Zend/Test/PHPUnit/Db/Operation/_files/truncateFixture.xml delete mode 100644 tests/Zend/Test/PHPUnit/Db/SimpleTesterTest.php delete mode 100644 tests/Zend/Test/PHPUnit/Db/TestCaseTest.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/controllers/ErrorController.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/controllers/IndexController.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestPhpUnitFooController.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromInitController.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromPreDispatchController.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromDispatchLoopStartup.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromPreDispatch.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteShutdown.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteStartup.php delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/views/scripts/error/error.phtml delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/bar.phtml delete mode 100644 tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/baz.phtml delete mode 100644 tests/Zend/Test/PHPUnit/_files/bootstrap.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 5af039b407..74055f564b 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -179,7 +179,6 @@ public static function suite() $suite->addTestSuite('Zend_RegistryTest'); $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); - $suite->addTest(Zend_Test_AllTests::suite()); $suite->addTest(Zend_Text_AllTests::suite()); $suite->addTest(Zend_Tool_AllTests::suite()); $suite->addTestSuite('Zend_TimeSyncTest'); diff --git a/tests/Zend/Test/AllTests.php b/tests/Zend/Test/AllTests.php deleted file mode 100644 index 5d2e35e0d3..0000000000 --- a/tests/Zend/Test/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Test_DbAdapterTest'); - $suite->addTestSuite('Zend_Test_DbStatementTest'); - $suite->addTest(Zend_Test_PHPUnit_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_AllTests::main') { - Zend_Test_AllTests::main(); -} diff --git a/tests/Zend/Test/DbAdapterTest.php b/tests/Zend/Test/DbAdapterTest.php deleted file mode 100644 index b770e9a191..0000000000 --- a/tests/Zend/Test/DbAdapterTest.php +++ /dev/null @@ -1,171 +0,0 @@ -_adapter = new Zend_Test_DbAdapter(); - } - - public function testAppendStatementToStack() - { - $stmt1 = Zend_Test_DbStatement::createSelectStatement( array() ); - $this->_adapter->appendStatementToStack($stmt1); - - $stmt2 = Zend_Test_DbStatement::createSelectStatement( array() ); - $this->_adapter->appendStatementToStack($stmt2); - - $this->assertSame($stmt2, $this->_adapter->query("foo")); - $this->assertSame($stmt1, $this->_adapter->query("foo")); - } - - public function testAppendLastInsertId() - { - $this->_adapter->appendLastInsertIdToStack(1); - $this->_adapter->appendLastInsertIdToStack(2); - - $this->assertEquals(2, $this->_adapter->lastInsertId()); - $this->assertEquals(1, $this->_adapter->lastInsertId()); - } - - public function testLastInsertIdDefault() - { - $this->assertFalse($this->_adapter->lastInsertId()); - } - - public function testListTablesDefault() - { - $this->assertEquals(array(), $this->_adapter->listTables()); - } - - public function testSetListTables() - { - $this->_adapter->setListTables(array("foo", "bar")); - $this->assertEquals(array("foo", "bar"), $this->_adapter->listTables()); - } - - public function testDescribeTableDefault() - { - $this->assertEquals(array(), $this->_adapter->describeTable("foo")); - } - - public function testDescribeTable() - { - $this->_adapter->setDescribeTable("foo", array("bar")); - $this->assertEquals(array("bar"), $this->_adapter->describeTable("foo")); - } - - public function testConnect() - { - $this->assertFalse($this->_adapter->isConnected()); - $this->_adapter->query("foo"); - $this->assertTrue($this->_adapter->isConnected()); - $this->_adapter->closeConnection(); - $this->assertFalse($this->_adapter->isConnected()); - } - - public function testAppendLimitToSql() - { - $sql = $this->_adapter->limit("foo", 10, 20); - $this->assertEquals( - "foo LIMIT 20,10", $sql - ); - } - - public function testQueryProfiler_EnabledByDefault() - { - $this->assertTrue($this->_adapter->getProfiler()->getEnabled()); - } - - public function testQueryPRofiler_PrepareStartsQueryProfiler() - { - $stmt = $this->_adapter->prepare("SELECT foo"); - - $this->assertEquals(1, $this->_adapter->getProfiler()->getTotalNumQueries()); - - $qp = $this->_adapter->getProfiler()->getLastQueryProfile(); - /* @var $qp Zend_Db_Profiler_Query */ - - $this->assertFalse($qp->hasEnded()); - } - - public function testQueryProfiler_QueryStartEndsQueryProfiler() - { - $stmt = $this->_adapter->query("SELECT foo"); - - $this->assertEquals(1, $this->_adapter->getProfiler()->getTotalNumQueries()); - - $qp = $this->_adapter->getProfiler()->getLastQueryProfile(); - /* @var $qp Zend_Db_Profiler_Query */ - - $this->assertTrue($qp->hasEnded()); - } - - public function testQueryProfiler_QueryBindWithParams() - { - $stmt = $this->_adapter->query("SELECT * FROM foo WHERE bar = ?", array(1234)); - - $qp = $this->_adapter->getProfiler()->getLastQueryProfile(); - /* @var $qp Zend_Db_Profiler_Query */ - - $this->assertEquals(array(1 => 1234), $qp->getQueryParams()); - $this->assertEquals("SELECT * FROM foo WHERE bar = ?", $qp->getQuery()); - } - - public function testQueryProfiler_PrepareBindExecute() - { - $var = 1234; - - $stmt = $this->_adapter->prepare("SELECT * FROM foo WHERE bar = ?"); - $stmt->bindParam(1, $var); - - $qp = $this->_adapter->getProfiler()->getLastQueryProfile(); - /* @var $qp Zend_Db_Profiler_Query */ - - $this->assertEquals(array(1 => 1234), $qp->getQueryParams()); - $this->assertEquals("SELECT * FROM foo WHERE bar = ?", $qp->getQuery()); - } - - public function testGetSetQuoteIdentifierSymbol() - { - $this->assertEquals('', $this->_adapter->getQuoteIdentifierSymbol()); - $this->_adapter->setQuoteIdentifierSymbol('`'); - $this->assertEquals('`', $this->_adapter->getQuoteIdentifierSymbol()); - } -} diff --git a/tests/Zend/Test/DbStatementTest.php b/tests/Zend/Test/DbStatementTest.php deleted file mode 100644 index 7162a454a4..0000000000 --- a/tests/Zend/Test/DbStatementTest.php +++ /dev/null @@ -1,164 +0,0 @@ -assertEquals(0, $stmt->rowCount()); - } - - public function testSetRowCount() - { - $stmt = new Zend_Test_DbStatement(); - $stmt->setRowCount(10); - $this->assertEquals(10, $stmt->rowCount()); - } - - public function testCreateSelectStatementWithRows() - { - $rows = array("foo", "bar"); - - $stmt = Zend_Test_DbStatement::createSelectStatement($rows); - - $this->assertTrue($stmt instanceof Zend_Test_DbStatement); - $this->assertEquals($rows, $stmt->fetchAll()); - } - - public function testCreateInsertStatementWithRowCount() - { - $stmt = Zend_Test_DbStatement::createInsertStatement(1234); - - $this->assertTrue($stmt instanceof Zend_Test_DbStatement); - $this->assertEquals(1234, $stmt->rowCount()); - } - - public function testCreateUpdateStatementWithRowCount() - { - $stmt = Zend_Test_DbStatement::createUpdateStatement(1234); - - $this->assertTrue($stmt instanceof Zend_Test_DbStatement); - $this->assertEquals(1234, $stmt->rowCount()); - } - - public function testCreateDeleteStatementWithRowCount() - { - $stmt = Zend_Test_DbStatement::createDeleteStatement(1234); - - $this->assertTrue($stmt instanceof Zend_Test_DbStatement); - $this->assertEquals(1234, $stmt->rowCount()); - } - - public function testSetFetchRow() - { - $row = array("foo"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - - $this->assertEquals($row, $stmt->fetch()); - } - - public function testFetchDefault() - { - $stmt = new Zend_Test_DbStatement(); - $this->assertFalse($stmt->fetch()); - } - - public function testFetchResult_FromEmptyResultStack() - { - $row = array("foo"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - $stmt->append($row); - - $this->assertTrue($stmt->fetch() !== false); - $this->assertTrue($stmt->fetch() !== false); - $this->assertFalse($stmt->fetch()); - } - - public function testFetchColumnDefault() - { - $stmt = new Zend_Test_DbStatement(); - $this->assertFalse($stmt->fetchColumn()); - } - - public function testFetchColumn() - { - $row = array("foo" => "bar", "bar" => "baz"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - - $this->assertEquals("baz", $stmt->fetchColumn(1)); - } - - public function testFetchColumn_OutOfBounds() - { - $this->setExpectedException("Zend_Db_Statement_Exception"); - - $row = array("foo" => "bar", "bar" => "baz"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - - $stmt->fetchColumn(1234); - } - - public function testFetchObject() - { - $row = array("foo" => "bar", "bar" => "baz"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - - $object = $stmt->fetchObject(); - $this->assertTrue($object instanceof stdClass); - $this->assertEquals('bar', $object->foo); - $this->assertEquals('baz', $object->bar); - } - - public function testFetchObject_ClassNotExists_ThrowsException() - { - $this->setExpectedException("Zend_Db_Statement_Exception"); - - $row = array("foo" => "bar", "bar" => "baz"); - - $stmt = new Zend_Test_DbStatement(); - $stmt->append($row); - - $object = $stmt->fetchObject("anInvalidClassName"); - } -} diff --git a/tests/Zend/Test/PHPUnit/AllTests.php b/tests/Zend/Test/PHPUnit/AllTests.php deleted file mode 100644 index 69758de2d3..0000000000 --- a/tests/Zend/Test/PHPUnit/AllTests.php +++ /dev/null @@ -1,61 +0,0 @@ -addTestSuite('Zend_Test_PHPUnit_ControllerTestCaseTest'); - $suite->addTest(Zend_Test_PHPUnit_Db_AllTests::suite()); - $suite->addTest(Zend_Test_PHPUnit_Constraint_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_PHPUnit_AllTests::main') { - Zend_Test_PHPUnit_AllTests::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Constraint/AllTests.php b/tests/Zend/Test/PHPUnit/Constraint/AllTests.php deleted file mode 100644 index 4debdab57c..0000000000 --- a/tests/Zend/Test/PHPUnit/Constraint/AllTests.php +++ /dev/null @@ -1,57 +0,0 @@ -addTestSuite('Zend_Test_PHPUnit_Constraint_DomQueryTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_PHPUnit_Constraint_AllTests::main') { - Zend_Test_PHPUnit_Constraint_AllTests::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Constraint/DomQueryTest.php b/tests/Zend/Test/PHPUnit/Constraint/DomQueryTest.php deleted file mode 100644 index 993fa84986..0000000000 --- a/tests/Zend/Test/PHPUnit/Constraint/DomQueryTest.php +++ /dev/null @@ -1,94 +0,0 @@ - - - - ZF Issue ZF-4010 - - -
    -
    Inputs -
      -
    1. -
    2. -
    3. -
    -
    -
    - -'; - $assertion = new Zend_Test_PHPUnit_Constraint_DomQuery('input#input-0 @value'); - $result = $assertion->evaluate($html, - Zend_Test_PHPUnit_Constraint_DomQuery::ASSERT_CONTENT_CONTAINS, 'value1'); - $this->assertTrue($result); - } - - /** - * @group issue-303 - */ - public function testShouldAllowMatchingZeroCounts() - { - $html = ' - - - ZF Issue ZF-4010 - - -
    -
    Inputs -
      -
    1. -
    2. -
    3. -
    -
    -
    - -'; - $assertion = new Zend_Test_PHPUnit_Constraint_DomQuery('input#input-3 @value'); - $result = $assertion->evaluate($html, - Zend_Test_PHPUnit_Constraint_DomQuery::ASSERT_CONTENT_COUNT, 0); - $this->assertTrue($result); - } -} diff --git a/tests/Zend/Test/PHPUnit/ControllerTestCaseTest.php b/tests/Zend/Test/PHPUnit/ControllerTestCaseTest.php deleted file mode 100644 index 6c860a2484..0000000000 --- a/tests/Zend/Test/PHPUnit/ControllerTestCaseTest.php +++ /dev/null @@ -1,881 +0,0 @@ -setExpectedException(null); - $this->testCase = new Zend_Test_PHPUnit_ControllerTestCaseTest_Concrete(); - $this->testCase->reset(); - $this->testCase->bootstrap = array($this, 'bootstrap'); - } - - /** - * Tears down the fixture, for example, close a network connection. - * This method is called after a test is executed. - * - * @return void - */ - public function tearDown() - { - $registry = Zend_Registry::getInstance(); - if (isset($registry['router'])) { - unset($registry['router']); - } - if (isset($registry['dispatcher'])) { - unset($registry['dispatcher']); - } - if (isset($registry['plugin'])) { - unset($registry['plugin']); - } - if (isset($registry['viewRenderer'])) { - unset($registry['viewRenderer']); - } - Zend_Session::$_unitTestEnabled = false; - session_id(uniqid()); - } - - public function bootstrap() - { - } - - public function testGetFrontControllerShouldReturnFrontController() - { - $controller = $this->testCase->getFrontController(); - $this->assertTrue($controller instanceof Zend_Controller_Front); - } - - public function testGetFrontControllerShouldReturnSameFrontControllerObjectOnRepeatedCalls() - { - $controller = $this->testCase->getFrontController(); - $this->assertTrue($controller instanceof Zend_Controller_Front); - $test = $this->testCase->getFrontController(); - $this->assertSame($controller, $test); - } - - public function testGetRequestShouldReturnRequestTestCase() - { - $request = $this->testCase->getRequest(); - $this->assertTrue($request instanceof Zend_Controller_Request_HttpTestCase); - } - - public function testGetRequestShouldReturnSameRequestObjectOnRepeatedCalls() - { - $request = $this->testCase->getRequest(); - $this->assertTrue($request instanceof Zend_Controller_Request_HttpTestCase); - $test = $this->testCase->getRequest(); - $this->assertSame($request, $test); - } - - public function testGetResponseShouldReturnResponseTestCase() - { - $response = $this->testCase->getResponse(); - $this->assertTrue($response instanceof Zend_Controller_Response_HttpTestCase); - } - - public function testGetResponseShouldReturnSameResponseObjectOnRepeatedCalls() - { - $response = $this->testCase->getResponse(); - $this->assertTrue($response instanceof Zend_Controller_Response_HttpTestCase); - $test = $this->testCase->getResponse(); - $this->assertSame($response, $test); - } - - public function testGetQueryShouldReturnQueryTestCase() - { - $query = $this->testCase->getQuery(); - $this->assertTrue($query instanceof Zend_Dom_Query); - } - - public function testGetQueryShouldReturnSameQueryObjectOnRepeatedCalls() - { - $query = $this->testCase->getQuery(); - $this->assertTrue($query instanceof Zend_Dom_Query); - $test = $this->testCase->getQuery(); - $this->assertSame($query, $test); - } - - public function testOverloadingShouldReturnRequestResponseAndFrontControllerObjects() - { - $request = $this->testCase->getRequest(); - $response = $this->testCase->getResponse(); - $frontController = $this->testCase->getFrontController(); - $this->assertSame($request, $this->testCase->request); - $this->assertSame($response, $this->testCase->response); - $this->assertSame($frontController, $this->testCase->frontController); - } - - public function testOverloadingShouldPreventSettingRequestResponseAndFrontControllerObjects() - { - try { - $this->testCase->request = new Zend_Controller_Request_Http(); - $this->fail('Setting request object as public property should raise exception'); - } catch (Exception $e) { - $this->assertContains('not allow', $e->getMessage()); - } - - try { - $this->testCase->response = new Zend_Controller_Response_Http(); - $this->fail('Setting response object as public property should raise exception'); - } catch (Exception $e) { - $this->assertContains('not allow', $e->getMessage()); - } - - try { - $this->testCase->frontController = Zend_Controller_Front::getInstance(); - $this->fail('Setting front controller as public property should raise exception'); - } catch (Exception $e) { - $this->assertContains('not allow', $e->getMessage()); - } - } - - public function testResetShouldResetMvcState() - { - require_once 'Zend/Controller/Action/HelperBroker.php'; - require_once 'Zend/Controller/Dispatcher/Standard.php'; - require_once 'Zend/Controller/Plugin/ErrorHandler.php'; - require_once 'Zend/Controller/Router/Rewrite.php'; - $request = $this->testCase->getRequest(); - $response = $this->testCase->getResponse(); - $router = new Zend_Controller_Router_Rewrite(); - $dispatcher = new Zend_Controller_Dispatcher_Standard(); - $plugin = new Zend_Controller_Plugin_ErrorHandler(); - $controller = $this->testCase->getFrontController(); - $controller->setParam('foo', 'bar') - ->registerPlugin($plugin) - ->setRouter($router) - ->setDispatcher($dispatcher); - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); - $this->testCase->reset(); - $test = $controller->getRouter(); - $this->assertNotSame($router, $test); - $test = $controller->getDispatcher(); - $this->assertNotSame($dispatcher, $test); - $this->assertFalse($controller->getPlugin('Zend_Controller_Plugin_ErrorHandler')); - $test = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); - $this->assertNotSame($viewRenderer, $test); - $this->assertNull($controller->getRequest()); - $this->assertNull($controller->getResponse()); - $this->assertNotSame($request, $this->testCase->getRequest()); - $this->assertNotSame($response, $this->testCase->getResponse()); - } - - public function testBootstrapShouldSetRequestAndResponseTestCaseObjects() - { - $this->testCase->bootstrap(); - $controller = $this->testCase->getFrontController(); - $request = $controller->getRequest(); - $response = $controller->getResponse(); - $this->assertSame($this->testCase->getRequest(), $request); - $this->assertSame($this->testCase->getResponse(), $response); - } - - public function testBootstrapShouldIncludeBootstrapFileSpecifiedInPublicBootstrapProperty() - { - $this->testCase->bootstrap = dirname(__FILE__) . '/_files/bootstrap.php'; - $this->testCase->bootstrap(); - $controller = $this->testCase->getFrontController(); - $this->assertSame(Zend_Registry::get('router'), $controller->getRouter()); - $this->assertSame(Zend_Registry::get('dispatcher'), $controller->getDispatcher()); - $this->assertSame(Zend_Registry::get('plugin'), $controller->getPlugin('Zend_Controller_Plugin_ErrorHandler')); - $this->assertSame(Zend_Registry::get('viewRenderer'), Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer')); - } - - public function testBootstrapShouldInvokeCallbackSpecifiedInPublicBootstrapProperty() - { - $this->testCase->bootstrap = array($this, 'bootstrapCallback'); - $this->testCase->bootstrap(); - $controller = $this->testCase->getFrontController(); - $this->assertSame(Zend_Registry::get('router'), $controller->getRouter()); - $this->assertSame(Zend_Registry::get('dispatcher'), $controller->getDispatcher()); - $this->assertSame(Zend_Registry::get('plugin'), $controller->getPlugin('Zend_Controller_Plugin_ErrorHandler')); - $this->assertSame(Zend_Registry::get('viewRenderer'), Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer')); - } - - public function bootstrapCallback() - { - require_once 'Zend/Controller/Action/HelperBroker.php'; - require_once 'Zend/Controller/Dispatcher/Standard.php'; - require_once 'Zend/Controller/Front.php'; - require_once 'Zend/Controller/Plugin/ErrorHandler.php'; - require_once 'Zend/Controller/Router/Rewrite.php'; - require_once 'Zend/Registry.php'; - $router = new Zend_Controller_Router_Rewrite(); - $dispatcher = new Zend_Controller_Dispatcher_Standard(); - $plugin = new Zend_Controller_Plugin_ErrorHandler(); - $controller = Zend_Controller_Front::getInstance(); - $controller->setParam('foo', 'bar') - ->registerPlugin($plugin) - ->setRouter($router) - ->setDispatcher($dispatcher); - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); - Zend_Registry::set('router', $router); - Zend_Registry::set('dispatcher', $dispatcher); - Zend_Registry::set('plugin', $plugin); - Zend_Registry::set('viewRenderer', $viewRenderer); - } - - public function testDispatchShouldDispatchSpecifiedUrl() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/bar'); - $request = $this->testCase->getRequest(); - $response = $this->testCase->getResponse(); - $content = $response->getBody(); - $this->assertEquals('zend-test-php-unit-foo', $request->getControllerName(), $content); - $this->assertEquals('bar', $request->getActionName()); - $this->assertContains('FooController::barAction', $content, $content); - } - - public function testAssertQueryShouldDoNothingForValidResponseContent() - { - $this->testCase->getFrontController()->setControllerDirectory(realpath(dirname(__FILE__)) . '/_files/application/controllers', 'default'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $body = $this->testCase->getResponse()->getBody(); - $this->testCase->assertQuery('div#foo legend.bar', $body); - $this->testCase->assertQuery('div#foo legend.baz', $body); - $this->testCase->assertQuery('div#foo legend.bat', $body); - $this->testCase->assertNotQuery('div#foo legend.bogus', $body); - $this->testCase->assertQueryContentContains('legend.bat', 'La di da', $body); - $this->testCase->assertQueryContentContains('legend.numeric', 42, $body); - $this->testCase->assertNotQueryContentContains('legend.numeric', 31, $body); - $this->testCase->assertNotQueryContentContains('legend.bat', 'La do da', $body); - $this->testCase->assertQueryContentRegex('legend.bat', '/d[a|i]/i', $body); - $this->testCase->assertNotQueryContentRegex('legend.bat', '/d[o|e]/i', $body); - $this->testCase->assertQueryCountMin('div#foo legend.bar', 2, $body); - $this->testCase->assertQueryCount('div#foo legend.bar', 2, $body); - $this->testCase->assertQueryCountMin('div#foo legend.bar', 2, $body); - $this->testCase->assertQueryCountMax('div#foo legend.bar', 2, $body); - } - - /** - * @group ZF-4673 - */ - public function testAssertionsShouldIncreasePhpUnitAssertionCounter() - { - $this->testAssertQueryShouldDoNothingForValidResponseContent(); - $this->assertTrue(0 < $this->testCase->getNumAssertions()); - $this->assertTrue(12 <= $this->testCase->getNumAssertions()); - } - - public function testAssertQueryShouldThrowExceptionsForInValidResponseContent() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - try { - $this->testCase->assertNotQuery('div#foo legend.bar'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQuery('div#foo legend.bogus'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertNotQueryContentContains('legend.bat', 'La di da'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryContentContains('legend.bat', 'La do da'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertNotQueryContentRegex('legend.bat', '/d[a|i]/i'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryContentRegex('legend.bat', '/d[o|e]/i'); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryCountMin('div#foo legend.bar', 3); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryCount('div#foo legend.bar', 1); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryCountMin('div#foo legend.bar', 3); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertQueryCountMax('div#foo legend.bar', 1); - $this->fail('Invalid assertions should throw exceptions'); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - } - - public function testAssertXpathShouldDoNothingForValidResponseContent() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->assertXpath("//div[@id='foo']//legend[contains(@class, ' bar ')]"); - $this->testCase->assertXpath("//div[@id='foo']//legend[contains(@class, ' baz ')]"); - $this->testCase->assertXpath("//div[@id='foo']//legend[contains(@class, ' bat ')]"); - $this->testCase->assertNotXpath("//div[@id='foo']//legend[contains(@class, ' bogus ')]"); - $this->testCase->assertXpathContentContains("//legend[contains(@class, ' bat ')]", "La di da"); - $this->testCase->assertNotXpathContentContains("//legend[contains(@class, ' bat ')]", "La do da"); - $this->testCase->assertXpathContentRegex("//legend[contains(@class, ' bat ')]", "/d[a'i]/i"); - $this->testCase->assertNotXpathContentRegex("//legend[contains(@class, ' bat ')]", "/d[o'e]/i"); - $this->testCase->assertXpathCountMin("//div[@id='foo']//legend[contains(@class, ' bar ')]", 2); - $this->testCase->assertXpathCount("//div[@id='foo']//legend[contains(@class, ' bar ')]", 2); - $this->testCase->assertXpathCountMin("//div[@id='foo']//legend[contains(@class, ' bar ')]", 2); - $this->testCase->assertXpathCountMax("//div[@id='foo']//legend[contains(@class, ' bar ')]", 2); - } - - public function testAssertXpathShouldThrowExceptionsForInValidResponseContent() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - try { - $this->testCase->assertNotXpath("//div[@id='foo']//legend[contains(@class, ' bar ')]"); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bar ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpath("//div[@id='foo']//legend[contains(@class, ' bogus ')]"); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bogus ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertNotXpathContentContains("//legend[contains(@class, ' bat ')]", "La di da"); - $this->fail("Invalid assertions should throw exceptions; assertion against //legend[contains(@class, ' bat ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathContentContains("//legend[contains(@class, ' bat ')]", 'La do da'); - $this->fail("Invalid assertions should throw exceptions; assertion against //legend[contains(@class, ' bat ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertNotXpathContentRegex("//legend[contains(@class, ' bat ')]", '/d[a|i]/i'); - $this->fail("Invalid assertions should throw exceptions; assertion against //legend[contains(@class, ' bat ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathContentRegex("//legend[contains(@class, ' bat ')]", '/d[o|e]/i'); - $this->fail("Invalid assertions should throw exceptions; assertion against //legend[contains(@class, ' bat ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathCountMin("//div[@id='foo']//legend[contains(@class, ' bar ')]", 3); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bar ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathCount("//div[@id='foo']//legend[contains(@class, ' bar ')]", 1); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bar ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathCountMin("//div[@id='foo']//legend[contains(@class, ' bar ')]", 3); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bar ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - try { - $this->testCase->assertXpathCountMax("//div[@id='foo']//legend[contains(@class, ' bar ')]", 1); - $this->fail("Invalid assertions should throw exceptions; assertion against //div[@id='foo']//legend[contains(@class, ' bar ')] failed"); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - } - } - - public function testRedirectAssertionsShouldDoNothingForValidAssertions() - { - $this->testCase->getResponse()->setRedirect('/foo'); - $this->testCase->assertRedirect(); - $this->testCase->assertRedirectTo('/foo', var_export($this->testCase->getResponse()->sendHeaders(), 1)); - $this->testCase->assertRedirectRegex('/FOO$/i'); - - $this->testCase->reset(); - $this->testCase->assertNotRedirect(); - $this->testCase->assertNotRedirectTo('/foo'); - $this->testCase->assertNotRedirectRegex('/FOO$/i'); - $this->testCase->getResponse()->setRedirect('/foo'); - $this->testCase->assertNotRedirectTo('/bar'); - $this->testCase->assertNotRedirectRegex('/bar/i'); - } - - public function testHeaderAssertionShouldDoNothingForValidComparison() - { - $this->testCase->getResponse()->setHeader('Content-Type', 'x-application/my-foo'); - $this->testCase->assertResponseCode(200); - $this->testCase->assertNotResponseCode(500); - $this->testCase->assertHeader('Content-Type'); - $this->testCase->assertNotHeader('X-Bogus'); - $this->testCase->assertHeaderContains('Content-Type', 'my-foo'); - $this->testCase->assertNotHeaderContains('Content-Type', 'my-bar'); - $this->testCase->assertHeaderRegex('Content-Type', '#^[a-z-]+/[a-z-]+$#i'); - $this->testCase->assertNotHeaderRegex('Content-Type', '#^\d+#i'); - } - - public function testHeaderAssertionShouldThrowExceptionForInvalidComparison() - { - $this->testCase->getResponse()->setHeader('Content-Type', 'x-application/my-foo'); - try { - $this->testCase->assertResponseCode(500); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertNotResponseCode(200); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertNotHeader('Content-Type'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertHeader('X-Bogus'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertNotHeaderContains('Content-Type', 'my-foo'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertHeaderContains('Content-Type', 'my-bar'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertNotHeaderRegex('Content-Type', '#^[a-z-]+/[a-z-]+$#i'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - try { - $this->testCase->assertHeaderRegex('Content-Type', '#^\d+#i'); - $this->fail(); - } catch (Zend_Test_PHPUnit_Constraint_Exception $e) { - $this->assertContains('Failed', $e->getMessage()); - } - } - - public function testModuleAssertionShouldDoNothingForValidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->assertModule('default'); - $this->testCase->assertNotModule('zend-test-php-unit-foo'); - } - - public function testModuleAssertionShouldThrowExceptionForInvalidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->setExpectedException('PHPUnit_Framework_AssertionFailedError'); - $this->testCase->assertModule('zend-test-php-unit-foo'); - $this->testCase->assertNotModule('default'); - } - - public function testControllerAssertionShouldDoNothingForValidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->assertController('zend-test-php-unit-foo'); - $this->testCase->assertNotController('baz'); - } - - public function testControllerAssertionShouldThrowExceptionForInvalidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->setExpectedException('PHPUnit_Framework_AssertionFailedError'); - $this->testCase->assertController('baz'); - $this->testCase->assertNotController('zend-test-php-unit-foo'); - } - - public function testActionAssertionShouldDoNothingForValidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->assertAction('baz'); - $this->testCase->assertNotAction('zend-test-php-unit-foo'); - } - - public function testActionAssertionShouldThrowExceptionForInvalidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/foo/baz'); - $this->setExpectedException('PHPUnit_Framework_AssertionFailedError'); - $this->testCase->assertAction('foo'); - $this->testCase->assertNotAction('baz'); - } - - public function testRouteAssertionShouldDoNothingForValidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->assertRoute('default'); - $this->testCase->assertNotRoute('zend-test-php-unit-foo'); - } - - public function testRouteAssertionShouldThrowExceptionForInvalidComparison() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/foo/baz'); - $this->setExpectedException('PHPUnit_Framework_AssertionFailedError'); - $this->testCase->assertRoute('foo'); - $this->testCase->assertNotRoute('default'); - } - - public function testResetShouldResetSessionArray() - { - $this->assertTrue(empty($_SESSION)); - $_SESSION = array('foo' => 'bar', 'bar' => 'baz'); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz'), $_SESSION, var_export($_SESSION, 1)); - $this->testCase->reset(); - $this->assertTrue(empty($_SESSION)); - } - - public function testResetShouldUnitTestEnableZendSession() - { - $this->testCase->reset(); - $this->assertTrue(Zend_Session::$_unitTestEnabled); - } - - public function testResetResponseShouldClearResponseObject() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $response = $this->testCase->getResponse(); - $this->testCase->resetResponse(); - $test = $this->testCase->getResponse(); - $this->assertNotSame($response, $test); - } - - /** - * @group ZF-4511 - */ - public function testResetRequestShouldClearRequestObject() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $request = $this->testCase->getRequest(); - $this->testCase->resetRequest(); - $test = $this->testCase->getRequest(); - $this->assertNotSame($request, $test); - } - - public function testResetResponseShouldClearAllViewPlaceholders() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - $viewRenderer->initView(); - $view = $viewRenderer->view; - $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); - $view->dojo()->setCdnVersion('1.1.0') - ->requireModule('dojo.parser') - ->enable(); - $view->headTitle('Foo'); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $response = $this->testCase->getResponse(); - $this->testCase->resetResponse(); - - $view = new Zend_View(); - $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); - $this->assertFalse($view->dojo()->isEnabled(), 'Dojo is enabled? ', $view->dojo()); - $this->assertNotContains('Foo', $view->headTitle()->__toString(), 'Head title persisted?'); - } - - /** - * @group ZF-4070 - */ - public function testQueryParametersShouldPersistFollowingDispatch() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $request = $this->testCase->request; - $request->setQuery('mr', 'proper') - ->setQuery('james', 'bond'); - - $this->assertEquals('proper', $request->getQuery('mr'), '(pre) Failed retrieving mr parameter: ' . var_export($request->getQuery(), 1)); - $this->assertEquals('bond', $request->getQuery('james'), '(pre) Failed retrieving james parameter: ' . var_export($request->getQuery(), 1)); - - $this->testCase->dispatch('/'); - - $this->assertEquals('proper', $request->getQuery('mr'), '(post) Failed retrieving mr parameter: ' . var_export($request->getQuery(), 1)); - $this->assertEquals('bond', $request->getQuery('james'), '(post) Failed retrieving james parameter: ' . var_export($request->getQuery(), 1)); - } - - /** - * @group ZF-4070 - */ - public function testQueryStringShouldNotOverwritePreviouslySetQueryParameters() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $request = $this->testCase->request; - $request->setQuery('mr', 'proper') - ->setQuery('james', 'bond'); - - $this->assertEquals('proper', $request->getQuery('mr'), '(pre) Failed retrieving mr parameter: ' . var_export($request->getQuery(), 1)); - $this->assertEquals('bond', $request->getQuery('james'), '(pre) Failed retrieving james parameter: ' . var_export($request->getQuery(), 1)); - - $this->testCase->dispatch('/?spy=super'); - - $this->assertEquals('super', $request->getQuery('spy'), '(post) Failed retrieving spy parameter: ' . var_export($request->getQuery(), 1)); - $this->assertEquals('proper', $request->getQuery('mr'), '(post) Failed retrieving mr parameter: ' . var_export($request->getQuery(), 1)); - $this->assertEquals('bond', $request->getQuery('james'), '(post) Failed retrieving james parameter: ' . var_export($request->getQuery(), 1)); - } - - /** - * @group ZF-3979 - */ - public function testSuperGlobalArraysShouldBeClearedDuringSetUp() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $request = $this->testCase->request; - $request->setQuery('mr', 'proper') - ->setPost('foo', 'bar') - ->setCookie('bar', 'baz'); - - $this->testCase->setUp(); - $this->assertNull($request->getQuery('mr'), 'Retrieved mr get parameter: ' . var_export($request->getQuery(), 1)); - $this->assertNull($request->getPost('foo'), 'Retrieved foo post parameter: ' . var_export($request->getPost(), 1)); - $this->assertNull($request->getCookie('bar'), 'Retrieved bar cookie parameter: ' . var_export($request->getCookie(), 1)); - } - - /** - * @group ZF-4511 - */ - public function testResetRequestShouldClearPostAndQueryParameters() - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->getRequest()->setPost(array( - 'foo' => 'bar', - )); - $this->testCase->getRequest()->setQuery(array( - 'bar' => 'baz', - )); - $this->testCase->dispatch('/zend-test-php-unit-foo/baz'); - $this->testCase->resetRequest(); - $this->assertTrue(empty($_POST)); - $this->assertTrue(empty($_GET)); - } - - /** - * @group ZF-7839 - */ - public function testTestCaseShouldAllowUsingApplicationObjectAsBootstrap() - { - require_once 'Zend/Application.php'; - $application = new Zend_Application('testing', array( - 'resources' => array( - 'frontcontroller' => array( - 'controllerDirectory' => dirname(__FILE__) . '/_files/application/controllers', - ), - ), - )); - $this->testCase->bootstrap = $application; - $this->testCase->bootstrap(); - $this->assertEquals( - $application->getBootstrap()->getResource('frontcontroller'), - $this->testCase->getFrontController() - ); - } - - /** - * @group ZF-8193 - */ - public function testWhenApplicationObjectUsedAsBootstrapTestCaseShouldExecuteBootstrapRunMethod() - { - require_once 'Zend/Application.php'; - $application = new Zend_Application('testing', array( - 'resources' => array( - 'frontcontroller' => array( - 'controllerDirectory' => dirname(__FILE__) . '/_files/application/controllers', - ), - ), - )); - $this->testCase->bootstrap = $application; - $this->testCase->bootstrap(); - $this->testCase->dispatch('/'); - $front = $application->getBootstrap()->getResource('frontcontroller'); - $boot = $front->getParam('bootstrap'); - $type = is_object($boot) - ? get_class($boot) - : gettype($boot); - $this->assertTrue($boot === $this->testCase->bootstrap->getBootstrap(), $type); - } - - /** - * @group ZF-7496 - * @dataProvider providerRedirectWorksAsExpectedFromHookMethodsInActionController - */ - public function testRedirectWorksAsExpectedFromHookMethodsInActionController($dispatchTo) - { - $this->testCase->getFrontController()->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers'); - $this->testCase->dispatch($dispatchTo); - $this->testCase->assertRedirectTo('/login'); - $this->assertNotEquals('action body', $this->testCase->getResponse()->getBody()); - } - - /** - * Data provider for testRedirectWorksAsExpectedFromHookMethodsInActionController - * @return array - */ - public function providerRedirectWorksAsExpectedFromHookMethodsInActionController() - { - return array( - array('/zend-test-redirect-from-init/baz'), - array('/zend-test-redirect-from-pre-dispatch/baz') - ); - } - - /** - * @group ZF-7496 - * @dataProvider providerRedirectWorksAsExpectedFromHookMethodsInFrontControllerPlugin - */ - public function testRedirectWorksAsExpectedFromHookMethodsInFrontControllerPlugin($pluginName) - { - require_once dirname(__FILE__) . "/_files/application/plugins/RedirectFrom{$pluginName}.php"; - $className = "Application_Plugin_RedirectFrom{$pluginName}"; - - $fc = $this->testCase->getFrontController(); - $fc->setControllerDirectory(dirname(__FILE__) . '/_files/application/controllers') - ->registerPlugin(new $className()); - $this->testCase->dispatch('/'); - $this->testCase->assertRedirectTo('/login'); - $this->assertNotEquals('action body', $this->testCase->getResponse()->getBody()); - } - - /** - * @group ZF-12492 - * @internal Since header value is being cast into a string, we should only - * need to check 0 and 0.0 - */ - public function testHeaderAssertionShouldDoNothingForValidComparisonWithZeroForValue() - { - $this->testCase->getResponse()->setHeader('Expires', '0', true); - $this->testCase->assertResponseCode(200); - $this->testCase->assertNotResponseCode(500); - $this->testCase->assertHeader('Expires'); - $this->testCase->assertNotHeader('X-Bogus'); - $this->testCase->assertHeaderContains('Expires', '0'); - $this->testCase->assertNotHeaderContains('Expires', 'my-bar'); - $this->testCase->assertHeaderRegex('Expires', '#^\d#i'); - $this->testCase->assertNotHeaderRegex( - 'Expires', '#^[a-z-]+/[a-z-]+$#i' - ); - - $this->testCase->getResponse()->setHeader('Expires', '0.0', true); - $this->testCase->assertResponseCode(200); - $this->testCase->assertNotResponseCode(500); - $this->testCase->assertHeader('Expires'); - $this->testCase->assertNotHeader('X-Bogus'); - $this->testCase->assertHeaderContains('Expires', '0.0'); - $this->testCase->assertNotHeaderContains('Expires', 'my-bar'); - $this->testCase->assertHeaderRegex('Expires', '#^\d+#i'); - $this->testCase->assertNotHeaderRegex( - 'Expires', '#^[a-z-]+/[a-z-]+$#i' - ); - } - - /** - * Data provider for testRedirectWorksAsExpectedFromHookMethodsInFrontControllerPlugin - * @return array - */ - public function providerRedirectWorksAsExpectedFromHookMethodsInFrontControllerPlugin() - { - return array( - array('RouteStartup'), - array('RouteShutdown'), - array('DispatchLoopStartup'), - array('PreDispatch') - ); - } -} - -// Concrete test case class for testing purposes -class Zend_Test_PHPUnit_ControllerTestCaseTest_Concrete extends Zend_Test_PHPUnit_ControllerTestCase -{ -} - -// Call Zend_Test_PHPUnit_ControllerTestCaseTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Test_PHPUnit_ControllerTestCaseTest::main") { - Zend_Test_PHPUnit_ControllerTestCaseTest::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Db/AllTests.php b/tests/Zend/Test/PHPUnit/Db/AllTests.php deleted file mode 100644 index 3478b53316..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/AllTests.php +++ /dev/null @@ -1,70 +0,0 @@ -addTestSuite('Zend_Test_PHPUnit_Db_TestCaseTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_ConnectionTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_SimpleTesterTest'); - $suite->addTest(Zend_Test_PHPUnit_Db_DataSet_AllTests::suite()); - $suite->addTest(Zend_Test_PHPUnit_Db_Operation_AllTests::suite()); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_Metadata_GenericTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_Integration_SqLiteIntegrationTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_Integration_MysqlIntegrationTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_PHPUnit_Db_AllTests::main') { - Zend_Test_PHPUnit_Db_AllTests::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Db/ConnectionTest.php b/tests/Zend/Test/PHPUnit/Db/ConnectionTest.php deleted file mode 100644 index 6c4c04b504..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/ConnectionTest.php +++ /dev/null @@ -1,91 +0,0 @@ -adapterMock = $this->getMock('Zend_Test_DbAdapter'); - } - - /** - * @return Zend_Test_PHPUnit_Db_Connection - */ - public function createConnection() - { - $connection = new Zend_Test_PHPUnit_Db_Connection($this->adapterMock, "schema"); - return $connection; - } - - public function testCloseConnection() - { - $this->adapterMock->expects($this->once()) - ->method('closeConnection'); - - $connection = $this->createConnection(); - $connection->close(); - } - - public function testCreateQueryTable() - { - $connection = $this->createConnection(); - $ret = $connection->createQueryTable("foo", "foo"); - - $this->assertTrue($ret instanceof Zend_Test_PHPUnit_Db_DataSet_QueryTable); - } - - public function testGetSchema() - { - $fixtureSchema = "schema"; - $connection = new Zend_Test_PHPUnit_Db_Connection($this->adapterMock, $fixtureSchema); - - $this->assertEquals($fixtureSchema, $connection->getSchema()); - } - - public function testGetMetaData() - { - $connection = $this->createConnection(); - $metadata = $connection->getMetaData(); - - $this->assertTrue($metadata instanceof Zend_Test_PHPUnit_Db_Metadata_Generic); - } - - public function testGetTruncateCommand() - { - $connection = $this->createConnection(); - - $this->assertEquals("DELETE", $connection->getTruncateCommand()); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/AllTests.php b/tests/Zend/Test/PHPUnit/Db/DataSet/AllTests.php deleted file mode 100644 index 3d56646460..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/AllTests.php +++ /dev/null @@ -1,64 +0,0 @@ -addTestSuite('Zend_Test_PHPUnit_Db_DataSet_DbRowsetTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_DataSet_QueryDataSetTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_DataSet_QueryTableTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_DataSet_DbTableTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_DataSet_DbTableDataSetTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_PHPUnit_Db_DataSet_AllTests::main') { - Zend_Test_PHPUnit_Db_DataSet_AllTests::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/DataSetTestCase.php b/tests/Zend/Test/PHPUnit/Db/DataSet/DataSetTestCase.php deleted file mode 100644 index c38d48ae2b..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/DataSetTestCase.php +++ /dev/null @@ -1,56 +0,0 @@ -connectionMock = $this->getMock('Zend_Test_PHPUnit_Db_Connection', array(), array(), '', false); - } - - public function decorateConnectionMockWithZendAdapter() - { - $this->decorateConnectionGetConnectionWith(new Zend_Test_DbAdapter()); - } - - public function decorateConnectionGetConnectionWith($returnValue) - { - $this->connectionMock->expects($this->any()) - ->method('getConnection') - ->will($this->returnValue($returnValue)); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/DbRowsetTest.php b/tests/Zend/Test/PHPUnit/Db/DataSet/DbRowsetTest.php deleted file mode 100644 index fd2543d292..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/DbRowsetTest.php +++ /dev/null @@ -1,98 +0,0 @@ - 'stdClass', - 'data' => array(array('foo' => 'bar'), array('foo' => 'baz')), - ); - $rowset = new Zend_Db_Table_Rowset($config); - return $rowset; - } - - public function testRowsetCountInITableRepresentation() - { - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($this->getRowSet(), "fooTable"); - $this->assertEquals(2, $rowsetTable->getRowCount()); - } - - public function testRowsetGetSpecificValue() - { - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($this->getRowSet(), "fooTable"); - $this->assertEquals("bar", $rowsetTable->getValue(0, "foo")); - } - - public function testRowsetGetSpecificRow() - { - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($this->getRowSet(), "fooTable"); - $this->assertEquals(array("foo" => "baz"), $rowsetTable->getRow(1)); - } - - public function testRowset_ConstructWithDisconnectedRowset_NoTableName_ThrowsException() - { - $this->setExpectedException("Zend_Test_PHPUnit_Db_Exception"); - - $rowset = $this->getMock('Zend_Db_Table_Rowset_Abstract', array(), array(), '', false); - $rowset->expects($this->once()) - ->method('getTable') - ->will($this->returnValue(null)); - - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($rowset); - } - - public function testRowset_WithNoRows_GetColumnsFromTable() - { - $columns = array("foo", "bar"); - - $tableMock = $this->getMock('Zend_Db_Table_Abstract', array(), array(), '', false); - $tableMock->expects($this->once()) - ->method('info') - ->with($this->equalTo('cols')) - ->will($this->returnValue($columns)); - - $rowset = $this->getMock('Zend_Db_Table_Rowset_Abstract', array(), array(), '', false); - $rowset->expects($this->exactly(2)) - ->method('getTable') - ->will($this->returnValue($tableMock)); - $rowset->expects($this->once()) - ->method('toArray') - ->will($this->returnValue( array() )); - - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($rowset, "tableName"); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSetTest.php b/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSetTest.php deleted file mode 100644 index 39d4e70965..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSetTest.php +++ /dev/null @@ -1,72 +0,0 @@ -getMock('Zend_Db_Table', array(), array(), '', false); - $table->expects($this->at(0))->method('info')->with('name')->will($this->returnValue($fixtureTable)); - $table->expects($this->at(1))->method('info')->with('name')->will($this->returnValue($fixtureTable)); - $table->expects($this->at(2))->method('info')->with('cols')->will($this->returnValue(array())); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); - $dataSet->addTable($table); - - $this->assertEquals(array($fixtureTable), $dataSet->getTableNames()); - } - - public function testAddTableCreatesDbTableInstance() - { - $fixtureTable = "foo"; - - $table = $this->getMock('Zend_Db_Table', array(), array(), '', false); - $table->expects($this->at(0))->method('info')->with('name')->will($this->returnValue($fixtureTable)); - $table->expects($this->at(1))->method('info')->with('name')->will($this->returnValue($fixtureTable)); - $table->expects($this->at(2))->method('info')->with('cols')->will($this->returnValue(array())); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); - $dataSet->addTable($table); - - $this->assertTrue($dataSet->getTable($fixtureTable) instanceof Zend_Test_PHPUnit_Db_DataSet_DbTable); - } - - public function testGetUnknownTableThrowsException() - { - $this->setExpectedException('InvalidArgumentException'); - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); - $dataSet->getTable('unknown'); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableTest.php b/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableTest.php deleted file mode 100644 index 61e31ec087..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/DbTableTest.php +++ /dev/null @@ -1,87 +0,0 @@ -getMock('Zend_Db_Table', array(), array(), '', false); - $table->expects($this->once()) - ->method('fetchAll') - ->with($fixtureWhere, $fixtureOrderBy, $fixtureLimit, $fixtureOffset) - ->will($this->returnValue(array())); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTable($table, $fixtureWhere, $fixtureOrderBy, $fixtureLimit, $fixtureOffset); - $count = $dataSet->getRowCount(); - } - - public function testGetTableMetadata() - { - $fixtureTableName = "foo"; - - $table = $this->getMock('Zend_Db_Table', array(), array(), '', false); - $table->expects($this->at(0)) - ->method('info') - ->with($this->equalTo('name')) - ->will($this->returnValue($fixtureTableName)); - $table->expects($this->at(1)) - ->method('info') - ->with($this->equalTo('cols')) - ->will($this->returnValue( array("foo", "bar") )); - $table->expects($this->once()) - ->method('fetchAll') - ->will($this->returnValue(array( array("foo" => 1, "bar" => 2) ))); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTable($table); - - $this->assertEquals($fixtureTableName, $dataSet->getTableMetaData()->getTableName()); - $this->assertEquals(array("foo", "bar"), $dataSet->getTableMetaData()->getColumns()); - } - - public function testLoadDataOnlyCalledOnce() - { - $table = $this->getMock('Zend_Db_Table', array(), array(), '', false); - $table->expects($this->once()) - ->method('fetchAll') - ->will($this->returnValue(array( array("foo" => 1, "bar" => 2) ))); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTable($table); - $dataSet->getRow(0); - $dataSet->getRow(0); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/QueryDataSetTest.php b/tests/Zend/Test/PHPUnit/Db/DataSet/QueryDataSetTest.php deleted file mode 100644 index c39144f0ab..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/QueryDataSetTest.php +++ /dev/null @@ -1,82 +0,0 @@ -getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - $this->setExpectedException('Zend_Test_PHPUnit_Db_Exception'); - $queryDataSet = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet($connectionMock); - } - - public function testCreateQueryDataSetWithZendDbAdapter() - { - $this->decorateConnectionMockWithZendAdapter(); - $queryDataSet = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet($this->connectionMock); - } - - public function testAddTableWithoutQueryParameterCreatesSelectWildcardAll() - { - $fixtureTableName = "foo"; - - $adapterMock = $this->getMock('Zend_Test_DbAdapter'); - $selectMock = $this->getMock('Zend_Db_Select', array(), array($adapterMock)); - - $adapterMock->expects($this->once()) - ->method('select') - ->will($this->returnValue($selectMock)); - $this->decorateConnectionGetConnectionWith($adapterMock); - - $selectMock->expects($this->once()) - ->method('from') - ->with($fixtureTableName, Zend_Db_Select::SQL_WILDCARD); - $selectMock->expects($this->once()) - ->method('__toString') - ->will($this->returnValue('SELECT * FOM foo')); - - $queryDataSet = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet($this->connectionMock); - $queryDataSet->addTable('foo'); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/DataSet/QueryTableTest.php b/tests/Zend/Test/PHPUnit/Db/DataSet/QueryTableTest.php deleted file mode 100644 index c7bd4f4f82..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/DataSet/QueryTableTest.php +++ /dev/null @@ -1,126 +0,0 @@ -getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - - $this->setExpectedException('Zend_Test_PHPUnit_Db_Exception'); - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", "SELECT * FROM foo", $connectionMock); - } - - public function testCreateQueryTableWithZendDbConnection() - { - $this->decorateConnectionMockWithZendAdapter(); - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", "SELECT * FROM foo", $this->connectionMock); - } - - public function testLoadDataExecutesQueryOnZendAdapter() - { - $statementMock = new Zend_Test_DbStatement(); - $statementMock->append(array('foo' => 'bar')); - $adapterMock = new Zend_Test_DbAdapter(); - $adapterMock->appendStatementToStack($statementMock); - - $this->decorateConnectionGetConnectionWith($adapterMock); - - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", "SELECT * FROM foo", $this->connectionMock); - $data = $queryTable->getRow(0); - - $this->assertEquals( - array("foo" => "bar"), $data - ); - } - - public function testGetRowCountLoadsData() - { - $statementMock = new Zend_Test_DbStatement(); - $statementMock->append(array('foo' => 'bar')); - $adapterMock = new Zend_Test_DbAdapter(); - $adapterMock->appendStatementToStack($statementMock); - - $this->decorateConnectionGetConnectionWith($adapterMock); - - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", "SELECT * FROM foo", $this->connectionMock); - $count = $queryTable->getRowCount(); - - $this->assertEquals(1, $count); - } - - public function testDataIsLoadedOnlyOnce() - { - $fixtureSql = "SELECT * FROM foo"; - - $statementMock = new Zend_Test_DbStatement(); - $statementMock->append(array('foo' => 'bar')); - $adapterMock = $this->getMock('Zend_Test_DbAdapter'); - $adapterMock->expects($this->once()) - ->method('query') - ->with($fixtureSql) - ->will($this->returnValue($statementMock)); - - $this->decorateConnectionGetConnectionWith($adapterMock); - - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", $fixtureSql, $this->connectionMock); - $this->assertEquals(1, $queryTable->getRowCount()); - $this->assertEquals(1, $queryTable->getRowCount()); - $row = $queryTable->getRow(0); - $this->assertEquals(array('foo' => 'bar'), $row); - } - - public function testQueryTableWithoutRows() - { - $statementMock = new Zend_Test_DbStatement(); - $adapterMock = new Zend_Test_DbAdapter(); - $adapterMock->appendStatementToStack($statementMock); - - $this->decorateConnectionGetConnectionWith($adapterMock); - $queryTable = new Zend_Test_PHPUnit_Db_DataSet_QueryTable("foo", null, $this->connectionMock); - - $metadata = $queryTable->getTableMetaData(); - $this->assertTrue($metadata instanceof PHPUnit_Extensions_Database_DataSet_ITableMetaData); - $this->assertEquals(array(), $metadata->getColumns()); - $this->assertEquals(array(), $metadata->getPrimaryKeys()); - $this->assertEquals("foo", $metadata->getTableName()); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Integration/AbstractTestCase.php b/tests/Zend/Test/PHPUnit/Db/Integration/AbstractTestCase.php deleted file mode 100644 index c7508d8306..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Integration/AbstractTestCase.php +++ /dev/null @@ -1,147 +0,0 @@ -addTable($this->createFooTable()); - $dataSet->addTable($this->createBarTable()); - - $this->assertEquals( - "foo", $dataSet->getTableMetaData('foo')->getTableName() - ); - $this->assertEquals( - "bar", $dataSet->getTableMetaData("bar")->getTableName() - ); - - $this->assertEquals(array("foo", "bar"), $dataSet->getTableNames()); - } - - public function testZendDbTableEqualsXmlDataSet() - { - $fooTable = $this->createFooTable(); - $fooTable->insert(array("id" => null, "foo" => "foo", "bar" => "bar", "baz" => "baz")); - $fooTable->insert(array("id" => null, "foo" => "bar", "bar" => "bar", "baz" => "bar")); - $fooTable->insert(array("id" => null, "foo" => "baz", "bar" => "baz", "baz" => "baz")); - - $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); - $dataSet->addTable($fooTable); - - $xmlDataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet( - dirname(__FILE__)."/_files/sqliteIntegrationFixture.xml" - ); - - if (method_exists($xmlDataSet, 'assertEquals')) { - $this->assertTrue($xmlDataSet->assertEquals($dataSet)); - } else { - $this->assertTrue($xmlDataSet->matches($dataSet)); - } - } - - /** - * @return Zend_Test_PHPUnit_Db_Connection - */ - public function getConnection() - { - return new Zend_Test_PHPUnit_Db_Connection($this->dbAdapter, 'foo'); - } - - public function testSimpleTesterSetupAndRowsetEquals() - { - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet( - dirname(__FILE__)."/_files/sqliteIntegrationFixture.xml" - ); - $fooDataTable = $dataSet->getTable("foo"); - - $tester = new Zend_Test_PHPUnit_Db_SimpleTester($this->getConnection()); - $tester->setUpDatabase($dataSet); - - $fooTable = $this->createFooTable(); - $rows = $fooTable->fetchAll(); - - $this->assertEquals(3, count($rows)); - - $rowsetTable = new Zend_Test_PHPUnit_Db_DataSet_DbRowset($rows); - if (method_exists($rowsetTable, 'assertEquals')) { - $rowsetTable->assertEquals($fooDataTable); - } else { - $rowsetTable->matches($fooDataTable); - } - } - - /** - * @return Zend_Test_PHPUnit_Db_TableFoo - */ - public function createFooTable() - { - $table = new Zend_Test_PHPUnit_Db_TableFoo(array('db' => $this->dbAdapter)); - return $table; - } - - /** - * @return Zend_Test_PHPUnit_Db_TableBar - */ - public function createBarTable() - { - $table = new Zend_Test_PHPUnit_Db_TableBar(array('db' => $this->dbAdapter)); - return $table; - } -} - -class Zend_Test_PHPUnit_Db_TableFoo extends Zend_Db_Table_Abstract -{ - protected $_name = "foo"; - - protected $_primary = "id"; -} - -class Zend_Test_PHPUnit_Db_TableBar extends Zend_Db_Table_Abstract -{ - protected $_name = "bar"; - - protected $_primary = "id"; -} diff --git a/tests/Zend/Test/PHPUnit/Db/Integration/MysqlIntegrationTest.php b/tests/Zend/Test/PHPUnit/Db/Integration/MysqlIntegrationTest.php deleted file mode 100644 index 8f81712440..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Integration/MysqlIntegrationTest.php +++ /dev/null @@ -1,69 +0,0 @@ -markTestSkipped('Database tests are not enabled.'); - return; - } - - if (!extension_loaded('pdo')) { - $this->markTestSkipped('PDO is required for this test.'); - return; - } - - if (!in_array('mysql', PDO::getAvailableDrivers())) { - $this->markTestSkipped('Mysql is not included in PDO in this PHP installation.'); - return; - } - - $params = array( - 'host' => TESTS_ZEND_DB_ADAPTER_MYSQL_HOSTNAME, - 'username' => TESTS_ZEND_DB_ADAPTER_MYSQL_USERNAME, - 'password' => TESTS_ZEND_DB_ADAPTER_MYSQL_PASSWORD, - 'dbname' => TESTS_ZEND_DB_ADAPTER_MYSQL_DATABASE, - ); - - $this->dbAdapter = Zend_Db::factory('pdo_mysql', $params); - $this->dbAdapter->query("DROP TABLE IF EXISTS foo"); - $this->dbAdapter->query("DROP TABLE IF EXISTS bar"); - $this->dbAdapter->query( - 'CREATE TABLE foo (id INT(10) AUTO_INCREMENT PRIMARY KEY, foo VARCHAR(255), bar VARCHAR(255), baz VARCHAR(255)) AUTO_INCREMENT=1' - ); - $this->dbAdapter->query( - 'CREATE TABLE bar (id INT(10) AUTO_INCREMENT PRIMARY KEY, foo VARCHAR(255), bar VARCHAR(255), baz VARCHAR(255)) AUTO_INCREMENT=1' - ); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Integration/SqLiteIntegrationTest.php b/tests/Zend/Test/PHPUnit/Db/Integration/SqLiteIntegrationTest.php deleted file mode 100644 index bc7963f70b..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Integration/SqLiteIntegrationTest.php +++ /dev/null @@ -1,53 +0,0 @@ -markTestSkipped('PDO is required for this test.'); - } - - if(!in_array('sqlite', PDO::getAvailableDrivers())) { - $this->markTestSkipped('SqLite is not included in PDO in this PHP installation.'); - } - - $this->dbAdapter = Zend_Db::factory('pdo_sqlite', array('dbname' => ':memory:')); - $this->dbAdapter->query( - 'CREATE TABLE "foo" (id INTEGER PRIMARY KEY AUTOINCREMENT, foo VARCHAR, bar VARCHAR, baz VARCHAR)' - ); - $this->dbAdapter->query( - 'CREATE TABLE "bar" (id INTEGER PRIMARY KEY AUTOINCREMENT, foo VARCHAR, bar VARCHAR, baz VARCHAR)' - ); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Integration/_files/sqliteIntegrationFixture.xml b/tests/Zend/Test/PHPUnit/Db/Integration/_files/sqliteIntegrationFixture.xml deleted file mode 100644 index b8a64f21a8..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Integration/_files/sqliteIntegrationFixture.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Test/PHPUnit/Db/Metadata/GenericTest.php b/tests/Zend/Test/PHPUnit/Db/Metadata/GenericTest.php deleted file mode 100644 index 91a2370bd4..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Metadata/GenericTest.php +++ /dev/null @@ -1,111 +0,0 @@ -adapterMock = $this->getMock('Zend_Test_DbAdapter'); - $this->metadata = new Zend_Test_PHPUnit_Db_Metadata_Generic($this->adapterMock, "schema"); - } - - public function testGetSchema() - { - $this->assertEquals("schema", $this->metadata->getSchema()); - } - - public function testGetColumnNames() - { - $fixtureTableName = "foo"; - - $this->adapterMock->expects($this->once()) - ->method('describeTable') - ->with($fixtureTableName) - ->will($this->returnValue(array("foo" => 1, "bar" => 2))); - $data = $this->metadata->getTableColumns($fixtureTableName); - - $this->assertEquals(array("foo", "bar"), $data); - } - - public function testGetTableNames() - { - $this->adapterMock->expects($this->once()) - ->method('listTables') - ->will($this->returnValue(array("foo"))); - $tables = $this->metadata->getTableNames(); - - $this->assertEquals(array("foo"), $tables); - } - - public function testGetTablePrimaryKey() - { - $fixtureTableName = "foo"; - - $tableMeta = array( - array('PRIMARY' => false, 'COLUMN_NAME' => 'foo'), - array('PRIMARY' => true, 'COLUMN_NAME' => 'bar'), - array('PRIMARY' => true, 'COLUMN_NAME' => 'baz'), - ); - - $this->adapterMock->expects($this->once()) - ->method('describeTable') - ->with($fixtureTableName) - ->will($this->returnValue($tableMeta)); - - $primaryKey = $this->metadata->getTablePrimaryKeys($fixtureTableName); - $this->assertEquals(array("bar", "baz"), $primaryKey); - } - - public function testGetAllowCascading() - { - $this->assertFalse($this->metadata->allowsCascading()); - } - - public function testQuoteIdentifierIsDelegated() - { - $fixtureValue = "foo"; - - $this->adapterMock->expects($this->once()) - ->method('quoteIdentifier') - ->with($fixtureValue) - ->will($this->returnValue($fixtureValue)); - - $actualValue = $this->metadata->quoteSchemaObject($fixtureValue); - - $this->assertEquals($fixtureValue, $actualValue); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/AllTests.php b/tests/Zend/Test/PHPUnit/Db/Operation/AllTests.php deleted file mode 100644 index 2bb52776a9..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/AllTests.php +++ /dev/null @@ -1,60 +0,0 @@ -addTestSuite('Zend_Test_PHPUnit_Db_Operation_InsertTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_Operation_TruncateTest'); - $suite->addTestSuite('Zend_Test_PHPUnit_Db_Operation_DeleteAllTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Test_PHPUnit_Db_Operation_AllTests::main') { - Zend_Test_PHPUnit_Db_Operation_AllTests::main(); -} diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/DeleteAllTest.php b/tests/Zend/Test/PHPUnit/Db/Operation/DeleteAllTest.php deleted file mode 100644 index 3a96e3b085..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/DeleteAllTest.php +++ /dev/null @@ -1,86 +0,0 @@ -operation = new Zend_Test_PHPUnit_Db_Operation_DeleteAll(); - } - - public function testDeleteAll() - { - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/truncateFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->at(0)) - ->method('delete') - ->with('foo'); - $testAdapter->expects($this->at(1)) - ->method('delete') - ->with('bar'); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $this->operation->execute($connection, $dataSet); - } - - public function testDeleteQueryErrorTransformsException() - { - $this->setExpectedException('PHPUnit_Extensions_Database_Operation_Exception'); - - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/truncateFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->any()) - ->method('delete') - ->will($this->throwException(new Exception)); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $this->operation->execute($connection, $dataSet); - } - - public function testInvalidConnectionGivenThrowsException() - { - $this->setExpectedException("Zend_Test_PHPUnit_Db_Exception"); - - $dataSet = $this->getMock('PHPUnit_Extensions_Database_DataSet_IDataSet'); - $connection = $this->getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - - $this->operation->execute($connection, $dataSet); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/InsertTest.php b/tests/Zend/Test/PHPUnit/Db/Operation/InsertTest.php deleted file mode 100644 index 64423968a9..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/InsertTest.php +++ /dev/null @@ -1,86 +0,0 @@ -operation = new Zend_Test_PHPUnit_Db_Operation_Insert(); - } - - public function testInsertDataSetUsingAdapterInsert() - { - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/insertFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->at(0)) - ->method('insert') - ->with('foo', array('foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz')); - $testAdapter->expects($this->at(1)) - ->method('insert') - ->with('foo', array('foo' => 'bar', 'bar' => 'bar', 'baz' => 'bar')); - $testAdapter->expects($this->at(2)) - ->method('insert') - ->with('foo', array('foo' => 'baz', 'bar' => 'baz', 'baz' => 'baz')); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $this->operation->execute($connection, $dataSet); - } - - public function testInsertExceptionIsTransformed() - { - $this->setExpectedException('PHPUnit_Extensions_Database_Operation_Exception'); - - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/insertFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->any())->method('insert')->will($this->throwException(new Exception())); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - $this->operation->execute($connection, $dataSet); - } - - public function testInvalidConnectionGivenThrowsException() - { - $this->setExpectedException("Zend_Test_PHPUnit_Db_Exception"); - - $dataSet = $this->getMock('PHPUnit_Extensions_Database_DataSet_IDataSet'); - $connection = $this->getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - - $this->operation->execute($connection, $dataSet); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/TruncateTest.php b/tests/Zend/Test/PHPUnit/Db/Operation/TruncateTest.php deleted file mode 100644 index 04874cdef2..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/TruncateTest.php +++ /dev/null @@ -1,110 +0,0 @@ -operation = new Zend_Test_PHPUnit_Db_Operation_Truncate(); - } - - public function testTruncateTablesExecutesAdapterQuery() - { - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/truncateFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->at(0)) - ->method('quoteIdentifier') - ->with('bar')->will($this->returnValue('bar')); - $testAdapter->expects($this->at(1)) - ->method('query') - ->with('TRUNCATE bar'); - $testAdapter->expects($this->at(2)) - ->method('quoteIdentifier') - ->with('foo')->will($this->returnValue('foo')); - $testAdapter->expects($this->at(3)) - ->method('query') - ->with('TRUNCATE foo'); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $this->operation->execute($connection, $dataSet); - } - - public function testTruncateTableInvalidQueryTransformsException() - { - $this->setExpectedException('PHPUnit_Extensions_Database_Operation_Exception'); - - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/insertFixture.xml"); - - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->any())->method('query')->will($this->throwException(new Exception())); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $this->operation->execute($connection, $dataSet); - } - - public function testInvalidConnectionGivenThrowsException() - { - $this->setExpectedException("Zend_Test_PHPUnit_Db_Exception"); - - $dataSet = $this->getMock('PHPUnit_Extensions_Database_DataSet_IDataSet'); - $connection = $this->getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - - $this->operation->execute($connection, $dataSet); - } - - /** - * @group ZF-7936 - */ - public function testTruncateAppliedToTablesInReverseOrder() - { - $testAdapter = new Zend_Test_DbAdapter(); - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $dataSet = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(dirname(__FILE__)."/_files/truncateFixture.xml"); - - $this->operation->execute($connection, $dataSet); - - $profiler = $testAdapter->getProfiler(); - $queries = $profiler->getQueryProfiles(); - - $this->assertEquals(2, count($queries)); - $this->assertContains('bar', $queries[0]->getQuery()); - $this->assertContains('foo', $queries[1]->getQuery()); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/_files/insertFixture.xml b/tests/Zend/Test/PHPUnit/Db/Operation/_files/insertFixture.xml deleted file mode 100644 index a5029f6fb7..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/_files/insertFixture.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/Zend/Test/PHPUnit/Db/Operation/_files/truncateFixture.xml b/tests/Zend/Test/PHPUnit/Db/Operation/_files/truncateFixture.xml deleted file mode 100644 index a0a57a2e14..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/Operation/_files/truncateFixture.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tests/Zend/Test/PHPUnit/Db/SimpleTesterTest.php b/tests/Zend/Test/PHPUnit/Db/SimpleTesterTest.php deleted file mode 100644 index 87419cfbaf..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/SimpleTesterTest.php +++ /dev/null @@ -1,81 +0,0 @@ -getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->any()) - ->method('delete') - ->will($this->throwException(new Exception)); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $databaseTester = new Zend_Test_PHPUnit_Db_SimpleTester($connection); - - $this->assertSame($connection, $databaseTester->getConnection()); - } - - public function testSetupDatabase() - { - $testAdapter = $this->getMock('Zend_Test_DbAdapter'); - $testAdapter->expects($this->any()) - ->method('delete') - ->will($this->throwException(new Exception)); - - $connection = new Zend_Test_PHPUnit_Db_Connection($testAdapter, "schema"); - - $databaseTester = new Zend_Test_PHPUnit_Db_SimpleTester($connection); - - $dataSet = $this->getMock('PHPUnit_Extensions_Database_DataSet_IDataSet'); - $dataSet->expects($this->any()) - ->method('getIterator') - ->will($this->returnValue($this->getMock('Iterator'))); - $dataSet->expects($this->any()) - ->method('getReverseIterator') - ->will($this->returnValue($this->getMock('Iterator'))); - $databaseTester->setUpDatabase($dataSet); - } - - public function testInvalidConnectionGivenThrowsException() - { - $this->setExpectedException("Zend_Test_PHPUnit_Db_Exception"); - - $connection = $this->getMock('PHPUnit_Extensions_Database_DB_IDatabaseConnection'); - - $databaseTester = new Zend_Test_PHPUnit_Db_SimpleTester($connection); - } -} diff --git a/tests/Zend/Test/PHPUnit/Db/TestCaseTest.php b/tests/Zend/Test/PHPUnit/Db/TestCaseTest.php deleted file mode 100644 index a2d6f99470..0000000000 --- a/tests/Zend/Test/PHPUnit/Db/TestCaseTest.php +++ /dev/null @@ -1,119 +0,0 @@ -_connectionMock == null) { - $this->_connectionMock = $this->getMock( - 'Zend_Test_PHPUnit_Db_Connection', array(), array(new Zend_Test_DbAdapter(), "schema") - ); - } - return $this->_connectionMock; - } - - /** - * Returns the test dataset. - * - * @return PHPUnit_Extensions_Database_DataSet_IDataSet - */ - protected function getDataSet() - { - return new PHPUnit_Extensions_Database_DataSet_CompositeDataSet(array()); - } - - public function testDatabaseTesterIsInitialized() - { - $this->assertTrue($this->databaseTester instanceof PHPUnit_Extensions_Database_ITester); - } - - public function testDatabaseTesterNestsDefaultConnection() - { - $this->assertTrue($this->databaseTester->getConnection() instanceof PHPUnit_Extensions_Database_DB_IDatabaseConnection); - } - - public function testCheckZendDbConnectionConvenienceMethodReturnType() - { - $mock = $this->getMock('Zend_Db_Adapter_Pdo_Sqlite', array('delete'), array(), "Zend_Db_Adapter_Mock", false); - $this->assertTrue($this->createZendDbConnection($mock, "test") instanceof Zend_Test_PHPUnit_Db_Connection); - } - - public function testCreateDbTableDataSetConvenienceMethodReturnType() - { - $tableMock = $this->getMock('Zend_Db_Table', array(), array(), "", false); - $tableDataSet = $this->createDbTableDataSet(array($tableMock)); - $this->assertTrue($tableDataSet instanceof Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet); - } - - public function testCreateDbTableConvenienceMethodReturnType() - { - $mock = $this->getMock('Zend_Db_Table', array(), array(), "", false); - $table = $this->createDbTable($mock); - $this->assertTrue($table instanceof Zend_Test_PHPUnit_Db_DataSet_DbTable); - } - - public function testCreateDbRowsetConvenienceMethodReturnType() - { - $mock = $this->getMock('Zend_Db_Table_Rowset', array(), array(array())); - $mock->expects($this->once())->method('toArray')->will($this->returnValue(array("foo" => 1, "bar" => 1))); - - $rowset = $this->createDbRowset($mock, "fooTable"); - - $this->assertTrue($rowset instanceof Zend_Test_PHPUnit_Db_DataSet_DbRowset); - } - - public function testGetAdapterConvenienceMethod() - { - $this->_connectionMock->expects($this->once()) - ->method('getConnection'); - $this->getAdapter(); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/controllers/ErrorController.php b/tests/Zend/Test/PHPUnit/_files/application/controllers/ErrorController.php deleted file mode 100644 index 37e8b9e2eb..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/controllers/ErrorController.php +++ /dev/null @@ -1,56 +0,0 @@ -_getParam('error_handler'); - - switch ($errors->type) { - case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: - case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: - // 404 error -- controller or action not found - $this->getResponse()->setHttpResponseCode(404); - $this->view->message = 'Page not found'; - $this->view->request = $errors->request; - $this->view->info = $errors->exception; - break; - default: - // application error - $this->getResponse()->setHttpResponseCode(500); - $this->view->message = 'Application error'; - $this->view->request = $errors->request; - $this->view->info = $errors->exception; - break; - } - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/controllers/IndexController.php b/tests/Zend/Test/PHPUnit/_files/application/controllers/IndexController.php deleted file mode 100644 index 4aa84991b1..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/controllers/IndexController.php +++ /dev/null @@ -1,37 +0,0 @@ -_helper->viewRenderer->setNoRender(true); - $_SESSION = array('foo' => 'bar', 'bar' => 'baz'); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromInitController.php b/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromInitController.php deleted file mode 100644 index 5c2efdacb5..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromInitController.php +++ /dev/null @@ -1,42 +0,0 @@ -_redirect('/login'); - } - - public function bazAction() - { - $this->_helper->viewRenderer->setNoRender(true); - echo 'action body'; - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromPreDispatchController.php b/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromPreDispatchController.php deleted file mode 100644 index d640927e9f..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/controllers/ZendTestRedirectFromPreDispatchController.php +++ /dev/null @@ -1,42 +0,0 @@ -_redirect('/login'); - } - - public function bazAction() - { - $this->_helper->viewRenderer->setNoRender(true); - echo 'action body'; - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromDispatchLoopStartup.php b/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromDispatchLoopStartup.php deleted file mode 100644 index 2d3d9fd477..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromDispatchLoopStartup.php +++ /dev/null @@ -1,36 +0,0 @@ -getResponse()->setRedirect('/login'); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromPreDispatch.php b/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromPreDispatch.php deleted file mode 100644 index 125096014e..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromPreDispatch.php +++ /dev/null @@ -1,36 +0,0 @@ -getResponse()->setRedirect('/login'); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteShutdown.php b/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteShutdown.php deleted file mode 100644 index 8b7256fcbb..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteShutdown.php +++ /dev/null @@ -1,36 +0,0 @@ -getResponse()->setRedirect('/login'); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteStartup.php b/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteStartup.php deleted file mode 100644 index 51638f1f8e..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/plugins/RedirectFromRouteStartup.php +++ /dev/null @@ -1,36 +0,0 @@ -getResponse()->setRedirect('/login'); - } -} diff --git a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/error/error.phtml b/tests/Zend/Test/PHPUnit/_files/application/views/scripts/error/error.phtml deleted file mode 100644 index 99fc904ef6..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/error/error.phtml +++ /dev/null @@ -1,7 +0,0 @@ -Error occurred while performing action: info->getMessage() ?> - -Original request parameters: -request->getParams(), 1) ?> - -BackTrace: -info->getTraceAsString() ?> diff --git a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/bar.phtml b/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/bar.phtml deleted file mode 100644 index 6b93c92d7b..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/bar.phtml +++ /dev/null @@ -1 +0,0 @@ -FooController::barAction() diff --git a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/baz.phtml b/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/baz.phtml deleted file mode 100644 index 701eb4be83..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/application/views/scripts/zend-test-php-unit-foo/baz.phtml +++ /dev/null @@ -1,20 +0,0 @@ - - -
    -
    - Some Legend -
    - -
    - Something else -
    - -
    - La di da -
    -
    - 42 -
    -
    - - diff --git a/tests/Zend/Test/PHPUnit/_files/bootstrap.php b/tests/Zend/Test/PHPUnit/_files/bootstrap.php deleted file mode 100644 index 0120133d01..0000000000 --- a/tests/Zend/Test/PHPUnit/_files/bootstrap.php +++ /dev/null @@ -1,42 +0,0 @@ -setParam('foo', 'bar') - ->registerPlugin($plugin) - ->setRouter($router) - ->setDispatcher($dispatcher); -$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); -Zend_Registry::set('router', $router); -Zend_Registry::set('dispatcher', $dispatcher); -Zend_Registry::set('plugin', $plugin); -Zend_Registry::set('viewRenderer', $viewRenderer); - From 5750f5930f1a0fac2f914b983d6dff322d591d64 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:38:43 -0500 Subject: [PATCH 29/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Tool Tests --- tests/Zend/AllTests.php | 3 - tests/Zend/Tool/AllTests.php | 59 ---- tests/Zend/Tool/Framework/Action/BaseTest.php | 57 ---- .../Tool/Framework/Action/RepositoryTest.php | 143 --------- .../Zend/Tool/Framework/Action/_files/Foo.php | 40 --- tests/Zend/Tool/Framework/AllTests.php | 80 ----- .../Client/Console/ArgumentParserTest.php | 23 -- .../Client/Console/HelpSystemTest.php | 23 -- .../Tool/Framework/Client/RequestTest.php | 114 ------- .../Tool/Framework/Client/ResponseTest.php | 151 --------- .../Loader/IncludePathLoaderTest.php | 82 ----- .../Manifest/ProviderMetadataTest.php | 132 -------- .../Framework/Manifest/RepositoryTest.php | 260 --------------- .../Framework/Manifest/_files/ActionOne.php | 38 --- .../Framework/Manifest/_files/ActionTwo.php | 38 --- .../Manifest/_files/ManifestBadMetadata.php | 46 --- .../Manifest/_files/ManifestBadProvider.php | 48 --- .../Manifest/_files/ManifestGoodOne.php | 66 ---- .../Manifest/_files/ManifestGoodTwo.php | 83 ----- .../Framework/Manifest/_files/ProviderOne.php | 44 --- .../Framework/Manifest/_files/ProviderTwo.php | 35 --- .../Framework/Metadata/ActionMetadataTest.php | 116 ------- .../Tool/Framework/Metadata/MetadataTest.php | 154 --------- .../Tool/Framework/Provider/AbstractTest.php | 66 ---- .../Framework/Provider/RepositoryTest.php | 174 ---------- .../Tool/Framework/Provider/SignatureTest.php | 184 ----------- .../Provider/_files/ProviderAltName.php | 38 --- .../Provider/_files/ProviderFullFeatured.php | 78 ----- .../Provider/_files/ProviderFullFeatured2.php | 81 ----- .../ProviderFullFeaturedBadSpecialties.php | 38 --- .../ProviderFullFeaturedBadSpecialties2.php | 41 --- .../Framework/Provider/_files/ProviderOne.php | 35 --- .../Framework/Provider/_files/ProviderTwo.php | 40 --- tests/Zend/Tool/Framework/RegistryTest.php | 149 --------- .../Tool/Framework/_files/EmptyClient.php | 54 ---- .../Tool/Framework/_files/EmptyLoader.php | 38 --- tests/Zend/Tool/Project/AllTests.php | 59 ---- .../Tool/Project/Context/RegistryTest.php | 91 ------ tests/Zend/Tool/Project/ProfileTest.php | 296 ------------------ .../Tool/Project/Provider/ControllerTest.php | 52 --- .../Tool/Project/_files/.zfproject.xml.orig | 48 --- .../Tool/Project/_files/project1/.gitignore | 2 - 42 files changed, 3399 deletions(-) delete mode 100644 tests/Zend/Tool/AllTests.php delete mode 100644 tests/Zend/Tool/Framework/Action/BaseTest.php delete mode 100644 tests/Zend/Tool/Framework/Action/RepositoryTest.php delete mode 100644 tests/Zend/Tool/Framework/Action/_files/Foo.php delete mode 100644 tests/Zend/Tool/Framework/AllTests.php delete mode 100644 tests/Zend/Tool/Framework/Client/Console/ArgumentParserTest.php delete mode 100644 tests/Zend/Tool/Framework/Client/Console/HelpSystemTest.php delete mode 100644 tests/Zend/Tool/Framework/Client/RequestTest.php delete mode 100644 tests/Zend/Tool/Framework/Client/ResponseTest.php delete mode 100644 tests/Zend/Tool/Framework/Loader/IncludePathLoaderTest.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/ProviderMetadataTest.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/RepositoryTest.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ActionOne.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ActionTwo.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ManifestBadMetadata.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ManifestBadProvider.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ManifestGoodOne.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ManifestGoodTwo.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ProviderOne.php delete mode 100644 tests/Zend/Tool/Framework/Manifest/_files/ProviderTwo.php delete mode 100644 tests/Zend/Tool/Framework/Metadata/ActionMetadataTest.php delete mode 100644 tests/Zend/Tool/Framework/Metadata/MetadataTest.php delete mode 100644 tests/Zend/Tool/Framework/Provider/AbstractTest.php delete mode 100644 tests/Zend/Tool/Framework/Provider/RepositoryTest.php delete mode 100644 tests/Zend/Tool/Framework/Provider/SignatureTest.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderAltName.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeatured.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeatured2.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeaturedBadSpecialties.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeaturedBadSpecialties2.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderOne.php delete mode 100644 tests/Zend/Tool/Framework/Provider/_files/ProviderTwo.php delete mode 100644 tests/Zend/Tool/Framework/RegistryTest.php delete mode 100644 tests/Zend/Tool/Framework/_files/EmptyClient.php delete mode 100644 tests/Zend/Tool/Framework/_files/EmptyLoader.php delete mode 100644 tests/Zend/Tool/Project/AllTests.php delete mode 100644 tests/Zend/Tool/Project/Context/RegistryTest.php delete mode 100644 tests/Zend/Tool/Project/ProfileTest.php delete mode 100644 tests/Zend/Tool/Project/Provider/ControllerTest.php delete mode 100644 tests/Zend/Tool/Project/_files/.zfproject.xml.orig delete mode 100644 tests/Zend/Tool/Project/_files/project1/.gitignore diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 74055f564b..659ba7378c 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -67,12 +67,10 @@ require_once 'Zend/Server/AllTests.php'; require_once 'Zend/Session/AllTests.php'; require_once 'Zend/Soap/AllTests.php'; -require_once 'Zend/Test/AllTests.php'; require_once 'Zend/Text/AllTests.php'; require_once 'Zend/TimeSyncTest.php'; require_once 'Zend/TranslateTest.php'; require_once 'Zend/Translate/Adapter/AllTests.php'; -require_once 'Zend/Tool/AllTests.php'; require_once 'Zend/UriTest.php'; require_once 'Zend/Uri/AllTests.php'; require_once 'Zend/ValidateTest.php'; @@ -180,7 +178,6 @@ public static function suite() $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); $suite->addTest(Zend_Text_AllTests::suite()); - $suite->addTest(Zend_Tool_AllTests::suite()); $suite->addTestSuite('Zend_TimeSyncTest'); $suite->addTestSuite('Zend_TranslateTest'); $suite->addTest(Zend_Translate_Adapter_AllTests::suite()); diff --git a/tests/Zend/Tool/AllTests.php b/tests/Zend/Tool/AllTests.php deleted file mode 100644 index f8d9bcc390..0000000000 --- a/tests/Zend/Tool/AllTests.php +++ /dev/null @@ -1,59 +0,0 @@ -addTestSuite('Zend_Tool_Framework_AllTests'); - $suite->addTestSuite('Zend_Tool_Project_AllTests'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tool_AllTests::main') { - Zend_Tool_AllTests::main(); -} - diff --git a/tests/Zend/Tool/Framework/Action/BaseTest.php b/tests/Zend/Tool/Framework/Action/BaseTest.php deleted file mode 100644 index e1bc0021aa..0000000000 --- a/tests/Zend/Tool/Framework/Action/BaseTest.php +++ /dev/null @@ -1,57 +0,0 @@ -assertEquals('Foo', $baseAction->getName()); - } - - public function testBaseActionCanGetAndSetName() - { - $baseAction = new Zend_Tool_Framework_Action_Base(); - $this->assertEquals('Base', $baseAction->getName()); - $baseAction->setName('Foo'); - $this->assertEquals('Foo', $baseAction->getName()); - } - - -} diff --git a/tests/Zend/Tool/Framework/Action/RepositoryTest.php b/tests/Zend/Tool/Framework/Action/RepositoryTest.php deleted file mode 100644 index 352827fe53..0000000000 --- a/tests/Zend/Tool/Framework/Action/RepositoryTest.php +++ /dev/null @@ -1,143 +0,0 @@ -_repository = new Zend_Tool_Framework_Action_Repository(); - } - - public function teardown() - { - $this->_repository = null; - } - - public function testRepositoryIsEmpty() - { - $this->assertEquals(0, count($this->_repository)); - } - - public function testAddActionCanHandleActionObjects() - { - $fooAction = new Zend_Tool_Framework_Action_Base(); - $fooAction->setName('Foo'); - $this->_repository->addAction($fooAction); - - $this->assertEquals(1, count($this->_repository)); - $this->assertEquals('Zend_Tool_Framework_Action_Base', get_class($this->_repository->getAction('Foo'))); - } - - public function testAddActionWillParseNameFromClassNameOnExtendedActions() - { - $this->_repository->addAction(new Zend_Tool_Framework_Action_Foo()); - $this->assertEquals('Zend_Tool_Framework_Action_Foo', get_class($this->_repository->getAction('Foo'))); - } - - /** - * @expectedException Zend_Tool_Framework_Action_Exception - */ - public function testAddActionThrowsExceptionOnDuplicateNameAction() - { - $this->_repository->addAction(new Zend_Tool_Framework_Action_Foo()); - $this->_repository->addAction(new Zend_Tool_Framework_Action_Foo()); - } - - /** - * @expectedException Zend_Tool_Framework_Action_Exception - */ - public function testAddActionThrowsExceptionOnActionWithNoName() - { - $this->_repository->addAction(new Zend_Tool_Framework_Action_Base()); - } - - public function testGetActionReturnsNullOnNonExistentAction() - { - $this->assertNull($this->_repository->getAction('Foo')); - } - - public function testRepositoryIsCountable() - { - $this->assertTrue($this->_repository instanceof Countable); - } - - public function testRepositoryIsIterable() - { - $this->assertTrue($this->_repository instanceof Traversable); - } - - public function testRepositoryCanIterate() - { - $this->_repository->addAction(new Zend_Tool_Framework_Action_Base('Foo')); - $this->_repository->addAction(new Zend_Tool_Framework_Action_Base('Bar')); - $i=0; - foreach ($this->_repository as $action) { - $i++; - $this->assertEquals('Zend_Tool_Framework_Action_Base', get_class($action)); - } - $this->assertEquals(2, $i); - } - - public function testGetActionsReturnsAnArrayOfActions() - { - $this->_repository->addAction(new Zend_Tool_Framework_Action_Base('Foo')); - $this->_repository->addAction(new Zend_Tool_Framework_Action_Base('Bar')); - $i=0; - foreach ($this->_repository->getActions() as $action) { - $i++; - $this->assertEquals('Zend_Tool_Framework_Action_Base', get_class($action)); - } - $this->assertEquals(2, $i); - } - - public function testProcessMethodReturnsNull() - { - $this->assertNull($this->_repository->process()); - } - - - -} diff --git a/tests/Zend/Tool/Framework/Action/_files/Foo.php b/tests/Zend/Tool/Framework/Action/_files/Foo.php deleted file mode 100644 index 7cb03d065c..0000000000 --- a/tests/Zend/Tool/Framework/Action/_files/Foo.php +++ /dev/null @@ -1,40 +0,0 @@ -addTestSuite('Zend_Tool_Framework_RegistryTest'); - $suite->addTestSuite('Zend_Tool_Framework_Action_BaseTest'); - $suite->addTestSuite('Zend_Tool_Framework_Action_RepositoryTest'); - $suite->addTestSuite('Zend_Tool_Framework_Client_RequestTest'); - $suite->addTestSuite('Zend_Tool_Framework_Client_ResponseTest'); - //$suite->addTestSuite('Zend_Tool_Framework_Manifest_MetadataTest'); - //$suite->addTestSuite('Zend_Tool_Framework_Manifest_ProviderMetadataTest'); - //$suite->addTestSuite('Zend_Tool_Framework_Manifest_ActionMetadataTest'); - $suite->addTestSuite('Zend_Tool_Framework_Manifest_RepositoryTest'); - $suite->addTestSuite('Zend_Tool_Framework_Provider_AbstractTest'); - $suite->addTestSuite('Zend_Tool_Framework_Provider_RepositoryTest'); - $suite->addTestSuite('Zend_Tool_Framework_Provider_SignatureTest'); - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tool_Framework_AllTests::main') { - Zend_Tool_Framework_AllTests::main(); -} diff --git a/tests/Zend/Tool/Framework/Client/Console/ArgumentParserTest.php b/tests/Zend/Tool/Framework/Client/Console/ArgumentParserTest.php deleted file mode 100644 index d3c64ea8c5..0000000000 --- a/tests/Zend/Tool/Framework/Client/Console/ArgumentParserTest.php +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/tests/Zend/Tool/Framework/Client/Console/HelpSystemTest.php b/tests/Zend/Tool/Framework/Client/Console/HelpSystemTest.php deleted file mode 100644 index d3c64ea8c5..0000000000 --- a/tests/Zend/Tool/Framework/Client/Console/HelpSystemTest.php +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/tests/Zend/Tool/Framework/Client/RequestTest.php b/tests/Zend/Tool/Framework/Client/RequestTest.php deleted file mode 100644 index e9ef05d57a..0000000000 --- a/tests/Zend/Tool/Framework/Client/RequestTest.php +++ /dev/null @@ -1,114 +0,0 @@ -_request = new Zend_Tool_Framework_Client_Request(); - } - - public function testProviderNameGetterAndSetter() - { - $this->_request->setProviderName('foo'); - $this->assertEquals('foo', $this->_request->getProviderName()); - } - - public function testSpecialtyNameGetterAndSetter() - { - $this->_request->setSpecialtyName('foo'); - $this->assertEquals('foo', $this->_request->getSpecialtyName()); - } - - public function testActionNameGetterAndSetter() - { - $this->_request->setActionName('foo'); - $this->assertEquals('foo', $this->_request->getActionName()); - } - - public function testActionParametersGetterAndSetter() - { - $this->_request->setActionParameter('foo', 'bar'); - $this->_request->setActionParameter('bar', 'baz'); - $this->assertEquals('bar', $this->_request->getActionParameter('foo')); - $this->assertArrayHasKey('foo', $this->_request->getActionParameters()); - $this->assertArrayHasKey('bar', $this->_request->getActionParameters()); - $this->assertEquals(2, count($this->_request->getActionParameters())); - } - - public function testProviderParameterGetterAndSetter() - { - $this->_request->setProviderParameter('foo', 'bar'); - $this->_request->setProviderParameter('bar', 'baz'); - $this->assertEquals('bar', $this->_request->getProviderParameter('foo')); - $this->assertArrayHasKey('foo', $this->_request->getProviderParameters()); - $this->assertArrayHasKey('bar', $this->_request->getProviderParameters()); - $this->assertEquals(2, count($this->_request->getProviderParameters())); - } - - public function testPretendGetterAndSetter() - { - $this->assertFalse($this->_request->isPretend()); - $this->_request->setPretend(true); - $this->assertTrue($this->_request->isPretend()); - } - - public function testDispatchableGetterAndSetter() - { - $this->assertTrue($this->_request->isDispatchable()); - $this->_request->setDispatchable(false); - $this->assertFalse($this->_request->isDispatchable()); - } - - /* - protected $_providerName = null; - protected $_specialtyName = null; - protected $_actionName = null; - protected $_actionParameters = array(); - protected $_providerParameters = array(); - protected $_isPretend = false; - protected $_isDispatchable = true; - */ - -} diff --git a/tests/Zend/Tool/Framework/Client/ResponseTest.php b/tests/Zend/Tool/Framework/Client/ResponseTest.php deleted file mode 100644 index bf6d83598e..0000000000 --- a/tests/Zend/Tool/Framework/Client/ResponseTest.php +++ /dev/null @@ -1,151 +0,0 @@ -_response = new Zend_Tool_Framework_Client_Response(); - } - - public function testContentGetterAndSetter() - { - $this->_response->setContent('foo'); - $this->assertEquals('foo', $this->_response->getContent()); - - $this->_response->setContent('bar'); - $this->assertEquals('bar', $this->_response->getContent()); - } - - public function testContentCanBeAppended() - { - $this->_response->setContent('foo'); - $this->assertEquals('foo', $this->_response->getContent()); - - $this->_response->setContent('bar'); - $this->assertEquals('bar', $this->_response->getContent()); - - $this->_response->appendContent('foo'); - $this->assertEquals('barfoo', $this->_response->getContent()); - } - - public function testContentCallback() - { - $this->_response->setContentCallback(array($this, '_responseCallback')); - $this->_response->appendContent('foo'); - $this->assertEquals('foo', implode('', $this->_responseBuffer)); - $this->_response->appendContent('bar'); - $this->_response->appendContent('baz'); - $this->assertEquals('foo-bar-baz', implode('-', $this->_responseBuffer)); - } - - public function testExceptionHandling() - { - $this->assertFalse($this->_response->isException()); - $this->_response->setException(new Exception('my response exception')); - $this->assertTrue($this->_response->isException()); - $this->assertEquals('my response exception', $this->_response->getException()->getMessage()); - } - - /** - * @expectedException Zend_Tool_Framework_Client_Exception - */ - public function testSetCallbackThrowsExceptionOnInvalidCallback() - { - $this->_response->setContentCallback(5); - } - - public function testCastingToString() - { - $this->_response->appendContent('foo'); - $this->_response->appendContent('boo'); - $this->assertEquals('fooboo', $this->_response->__toString()); - } - - public function testAddContentDecoratorPersistsDecorators() - { - $separator = new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator(); - $this->_response->addContentDecorator($separator); - $decorators = $this->_response->getContentDecorators(); - $this->assertArrayHasKey('separator', $decorators); - $this->assertContains($separator, $decorators); - } - - public function testResponseWillApplyDecorator() - { - $separator = new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator(); - $this->_response->addContentDecorator($separator); - $this->_response->appendContent('foo', array('separator' => true)); - $this->_response->appendContent('boo', array('separator' => true)); - $this->assertEquals('foo' . PHP_EOL . 'boo' . PHP_EOL, $this->_response->__toString()); - } - - public function testResponseWillIgnoreUnknownDecoratorOptions() - { - $separator = new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator(); - $this->_response->addContentDecorator($separator); - $this->_response->appendContent('foo', array('foo' => 'foo')); - $this->_response->appendContent('boo', array('bar' => 'bar')); - $this->assertEquals('fooboo', $this->_response->__toString()); - } - - public function testResponseWillApplyDecoratorWithDefaultOptions() - { - $separator = new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator(); - $this->_response->addContentDecorator($separator); - $this->_response->setDefaultDecoratorOptions(array('separator' => true)); - $this->_response->appendContent('foo'); - $this->_response->appendContent('boo'); - $this->assertEquals('foo' . PHP_EOL . 'boo' . PHP_EOL, $this->_response->__toString()); - } - - public function _responseCallback($content) - { - $this->_responseBuffer[] = $content; - } -} diff --git a/tests/Zend/Tool/Framework/Loader/IncludePathLoaderTest.php b/tests/Zend/Tool/Framework/Loader/IncludePathLoaderTest.php deleted file mode 100644 index ba9633e50c..0000000000 --- a/tests/Zend/Tool/Framework/Loader/IncludePathLoaderTest.php +++ /dev/null @@ -1,82 +0,0 @@ -load(); - $files = $loader->getLoadRetrievedFiles(); - foreach ($files as $index => $file) { - $files[$index] = substr($file, strpos($file, 'Zend')); - } - $this->assertContains('Zend/Tool/Framework/System/Manifest.php', $files); - } - - public function testLoaderFindsIncludePathFilesAreLoaded() - { - $loader = new Zend_Tool_Framework_Loader_IncludePathLoader(); - $loader->load(); - $classes = $loader->getLoadLoadedClasses(); - $this->assertContains('Zend_Tool_Framework_System_Manifest', $classes); - } - - */ - -} diff --git a/tests/Zend/Tool/Framework/Manifest/ProviderMetadataTest.php b/tests/Zend/Tool/Framework/Manifest/ProviderMetadataTest.php deleted file mode 100644 index 18d210724e..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/ProviderMetadataTest.php +++ /dev/null @@ -1,132 +0,0 @@ -_metadata = new Zend_Tool_Framework_Manifest_ProviderMetadata(); - } - - public function teardown() - { - $this->_metadata = null; - } - - public function testInitialTypeNameIsCorrect() - { - $this->assertEquals('Provider', $this->_metadata->getType()); - } - - public function testConstructorWillAcceptAndPersistValues() - { - $obj1 = new ArrayObject(); - - $metadata = new Zend_Tool_Framework_Manifest_ProviderMetadata(array( - 'name' => 'Foo', - 'providerName' => 'FooBar', - 'actionName' => 'BarBaz', - 'specialtyName' => 'FooBarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $metadata->getName()); - $this->assertEquals('FooBar', $metadata->getProviderName()); - $this->assertEquals('BarBaz', $metadata->getActionName()); - $this->assertEquals('FooBarBaz', $metadata->getSpecialtyName()); - $this->assertEquals('Bar', $metadata->getValue()); - $this->assertTrue($obj1 === $metadata->getReference()); - } - - public function testSetOptionsPersistValues() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'providerName' => 'FooBar', - 'actionName' => 'BarBaz', - 'specialtyName' => 'FooBarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $this->_metadata->getName()); - $this->assertEquals('FooBar', $this->_metadata->getProviderName()); - $this->assertEquals('BarBaz', $this->_metadata->getActionName()); - $this->assertEquals('FooBarBaz', $this->_metadata->getSpecialtyName()); - $this->assertEquals('Bar', $this->_metadata->getValue()); - $this->assertTrue($obj1 === $this->_metadata->getReference()); - } - - public function testSettersPersistValuesAndAreRetievableThroughGetters() - { - $this->_metadata->setProviderName('Foo'); - $this->assertEquals('Foo', $this->_metadata->getProviderName()); - - $this->_metadata->setActionName('Bar'); - $this->assertEquals('Bar', $this->_metadata->getActionName()); - - $this->_metadata->setSpecialtyName('FooBar'); - $this->assertEquals('FooBar', $this->_metadata->getSpecialtyName()); - } - - public function testMetadataObjectCanCastToStringRepresentation() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'providerName' => 'FooBar', - 'actionName' => 'BarBaz', - 'specialtyName' => 'FooBarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Type: Provider, Name: Foo, Value: Bar (ProviderName: FooBar, ActionName: BarBaz, SpecialtyName: FooBarBaz)', (string) $this->_metadata); - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/RepositoryTest.php b/tests/Zend/Tool/Framework/Manifest/RepositoryTest.php deleted file mode 100644 index 39e2517982..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/RepositoryTest.php +++ /dev/null @@ -1,260 +0,0 @@ -_repository = new Zend_Tool_Framework_Manifest_Repository(); - - // setup the registry components required to test with - $this->_registry = new Zend_Tool_Framework_Registry(); - $this->_registry->setProviderRepository(new Zend_Tool_Framework_Provider_Repository()); - $this->_registry->setActionRepository(new Zend_Tool_Framework_Action_Repository()); - $this->_registry->setManifestRepository($this->_repository); - } - - public function teardown() - { - $this->_registry->reset(); - $this->_repository = null; - } - - public function testAddManfestsWillPersistManifests() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodTwo()); - $this->assertEquals(2, count($this->_repository->getManifests())); - - $actionRepository = $this->_registry->getActionRepository(); - $actionRepository->process(); - - $providerRepository = $this->_registry->getProviderRepository(); - $providerRepository->process(); - - $actions = $actionRepository->getActions(); - $this->assertArrayHasKey('actionone', $actions); - $this->assertArrayHasKey('actiontwo', $actions); - $this->assertArrayHasKey('foo', $actions); - - $providers = $providerRepository->getProviders(); - $this->assertArrayHasKey('providerone', $providers); - $this->assertArrayHasKey('providertwo', $providers); - - } - - public function testAddManfestsWillPersistManifestsAndObeyIndex() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodTwo()); - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - - - $manifests = $this->_repository->getManifests(); - - $this->assertEquals(2, count($manifests)); - $this->assertTrue(array_shift($manifests) instanceof Zend_Tool_Framework_Manifest_ManifestGoodOne); - $this->assertTrue(array_shift($manifests) instanceof Zend_Tool_Framework_Manifest_ManifestGoodTwo); - - } - - /** - * @expectedException Zend_Tool_Framework_Manifest_Exception - */ - public function testAddManifestThrowsExceptionOnBadGetProviders() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestBadProvider()); - } - - public function testProcessAddsMetadataToManifest() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodTwo()); - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - $this->_repository->process(); - - //die(); // @todo ensure that we check whats actually in the repository - $this->assertEquals(3, count($this->_repository)); - $this->assertEquals(2, count($this->_repository->getManifests())); - } - - /** - * @expectedException Zend_Tool_Framework_Manifest_Exception - */ - public function testProcessThrowsExceptionOnBadMetadata() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestBadMetadata()); - $this->_repository->process(); - } - - public function testRepositoryIsCastableToString() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodTwo()); - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - $this->_repository->process(); - - $expected = 'Basic' . PHP_EOL . ' Type: Basic, Name: FooOne, Value: Bar' . PHP_EOL - . ' Type: Basic, Name: FooTwo, Value: Baz1' . PHP_EOL - . ' Type: Basic, Name: FooThree, Value: Baz2' . PHP_EOL; - - $this->assertEquals($expected, (string) $this->_repository); - } - - public function testRepositoryIsCountable() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - $this->_repository->process(); - - $this->assertTrue($this->_repository instanceof Countable); - $this->assertEquals(1, count($this->_repository)); - } - - public function testRepositoryIsIterable() - { - $this->_repository->addManifest(new Zend_Tool_Framework_Manifest_ManifestGoodOne()); - $this->_repository->process(); - - $this->assertTrue($this->_repository instanceof Traversable); - foreach ($this->_repository as $thing) { - $this->assertTrue(true); - } - } - - public function testManifestGetMetadatasCollectionSearchWorks() - { - $metadata1 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Foo', - 'value' => 'Bar', - )); - - $metadata2 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Bar', - 'value' => 'Baz', - )); - - $metadata3 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Baz', - 'value' => 'Foo', - )); - - $this->_repository->addMetadata($metadata1); - $this->_repository->addMetadata($metadata2); - $this->_repository->addMetadata($metadata3); - - $resultMetadatas = $this->_repository->getMetadatas(array('name' => 'Bar')); - $this->assertEquals(1, count($resultMetadatas)); - $this->assertTrue($metadata2 === array_shift($resultMetadatas)); - - - } - - public function testManifestGetMetadataSingularSearchWorks() - { - $metadata1 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Foo', - 'value' => 'Bar', - )); - - $metadata2 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Bar', - 'value' => 'Baz', - )); - - $metadata3 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Baz', - 'value' => 'Foo', - )); - - $this->_repository->addMetadata($metadata1); - $this->_repository->addMetadata($metadata2); - $this->_repository->addMetadata($metadata3); - - $resultMetadata = $this->_repository->getMetadata(array('name' => 'Baz')); - $this->assertTrue($metadata3 === $resultMetadata); - - } - - public function testManifestGetMetadatasCollectionSearchWorksWithNonExistentProperties() - { - $metadata1 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Foo', - 'value' => 'Bar', - )); - - $metadata2 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Bar', - 'value' => 'Baz', - )); - - $metadata3 = new Zend_Tool_Framework_Metadata_Basic(array( - 'name' => 'Baz', - 'value' => 'Foo', - )); - - $this->_repository->addMetadata($metadata1); - $this->_repository->addMetadata($metadata2); - $this->_repository->addMetadata($metadata3); - - $resultMetadatas = $this->_repository->getMetadatas(array('name' => 'Bar', 'blah' => 'boo')); - $this->assertEquals(1, count($resultMetadatas)); - - $resultMetadatas = $this->_repository->getMetadatas(array('name' => 'Bar', 'blah' => 'boo'), false); - $this->assertEquals(0, count($resultMetadatas)); - //$this->assertTrue($metadata2 === array_shift($resultMetadatas)); - - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/_files/ActionOne.php b/tests/Zend/Tool/Framework/Manifest/_files/ActionOne.php deleted file mode 100644 index 4d7fe71d93..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/_files/ActionOne.php +++ /dev/null @@ -1,38 +0,0 @@ - 'FooTwo', 'value' => 'Baz1')), - new ArrayObject() - ); - - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/_files/ManifestBadProvider.php b/tests/Zend/Tool/Framework/Manifest/_files/ManifestBadProvider.php deleted file mode 100644 index 275dd5e8bf..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/_files/ManifestBadProvider.php +++ /dev/null @@ -1,48 +0,0 @@ - 'FooOne', 'value' => 'Bar')); - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/_files/ManifestGoodTwo.php b/tests/Zend/Tool/Framework/Manifest/_files/ManifestGoodTwo.php deleted file mode 100644 index ff5e02046f..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/_files/ManifestGoodTwo.php +++ /dev/null @@ -1,83 +0,0 @@ -_registry = $registry; - } - - public function getIndex() - { - return 10; - } - - public function getProviders() - { - return array( - new Zend_Tool_Framework_Manifest_ProviderTwo() - ); - } - - public function getActions() - { - return array( - new Zend_Tool_Framework_Manifest_ActionTwo(), - 'Foo' - ); - } - - public function getMetadata() - { - return array( - new Zend_Tool_Framework_Metadata_Basic(array('name' => 'FooTwo', 'value' => 'Baz1')), - new Zend_Tool_Framework_Metadata_Basic(array('name' => 'FooThree', 'value' => 'Baz2')) - ); - - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/_files/ProviderOne.php b/tests/Zend/Tool/Framework/Manifest/_files/ProviderOne.php deleted file mode 100644 index 54f687929e..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/_files/ProviderOne.php +++ /dev/null @@ -1,44 +0,0 @@ -_registry = $registry; - } - -} diff --git a/tests/Zend/Tool/Framework/Manifest/_files/ProviderTwo.php b/tests/Zend/Tool/Framework/Manifest/_files/ProviderTwo.php deleted file mode 100644 index b5b0c2dcaf..0000000000 --- a/tests/Zend/Tool/Framework/Manifest/_files/ProviderTwo.php +++ /dev/null @@ -1,35 +0,0 @@ -_metadata = new Zend_Tool_Framework_Manifest_ActionMetadata(); - } - - public function teardown() - { - $this->_metadata = null; - } - - public function testInitialTypeNameIsCorrect() - { - $this->assertEquals('Action', $this->_metadata->getType()); - } - - public function testConstructorWillAcceptAndPersistValues() - { - $obj1 = new ArrayObject(); - - $metadata = new Zend_Tool_Framework_Manifest_ActionMetadata(array( - 'name' => 'Foo', - 'actionName' => 'BarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $metadata->getName()); - $this->assertEquals('BarBaz', $metadata->getActionName()); - $this->assertEquals('Bar', $metadata->getValue()); - $this->assertTrue($obj1 === $metadata->getReference()); - } - - public function testSetOptionsPersistValues() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'actionName' => 'BarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $this->_metadata->getName()); - $this->assertEquals('BarBaz', $this->_metadata->getActionName()); - $this->assertEquals('Bar', $this->_metadata->getValue()); - $this->assertTrue($obj1 === $this->_metadata->getReference()); - } - - public function testSettersPersistValuesAndAreRetievableThroughGetters() - { - $this->_metadata->setActionName('Bar'); - $this->assertEquals('Bar', $this->_metadata->getActionName()); - } - - public function testMetadataObjectCanCastToStringRepresentation() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'actionName' => 'BarBaz', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Type: Action, Name: Foo, Value: Bar (ActionName: BarBaz)', (string) $this->_metadata); - } - -} diff --git a/tests/Zend/Tool/Framework/Metadata/MetadataTest.php b/tests/Zend/Tool/Framework/Metadata/MetadataTest.php deleted file mode 100644 index de970df537..0000000000 --- a/tests/Zend/Tool/Framework/Metadata/MetadataTest.php +++ /dev/null @@ -1,154 +0,0 @@ -_metadata = new Zend_Tool_Framework_Manifest_Metadata(); - } - - public function teardown() - { - $this->_metadata = null; - } - - public function testConstructorWillAcceptAndPersistValues() - { - $obj1 = new ArrayObject(); - - $metadata = new Zend_Tool_Framework_Manifest_Metadata(array( - 'name' => 'Foo', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $metadata->getName()); - $this->assertEquals('Bar', $metadata->getValue()); - $this->assertTrue($obj1 === $metadata->getReference()); - } - - public function testSetOptionsPersistValues() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Foo', $this->_metadata->getName()); - $this->assertEquals('Bar', $this->_metadata->getValue()); - $this->assertTrue($obj1 === $this->_metadata->getReference()); - } - - public function testGetTypeHasDefaultValue() - { - $this->assertEquals('Global', $this->_metadata->getType()); - } - - public function testTypeIsModifiable() - { - $this->_metadata->setType('foo'); - $this->assertEquals('foo', $this->_metadata->getType()); - } - - public function testSettersPersistValuesAndAreRetievableThroughGetters() - { - $this->_metadata->setName('Foo'); - $this->assertEquals('Foo', $this->_metadata->getName()); - $this->_metadata->setValue('Bar'); - $this->assertEquals('Bar', $this->_metadata->getValue()); - } - - public function testGetAttributesReturnsProperValues() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'value' => null, - 'reference' => $obj1 - )); - - $attributes = $this->_metadata->getAttributes(); - - $this->assertEquals(4, count($attributes)); - - $this->assertEquals('Global', $attributes['type']); - $this->assertEquals('Foo', $attributes['name']); - $this->assertEquals(null, $attributes['value']); - $this->assertTrue($obj1 === $attributes['reference']); - - $attributes = $this->_metadata->getAttributes(Zend_Tool_Framework_Manifest_Metadata::ATTRIBUTES_NO_PARENT); - - $this->assertEquals(0, count($attributes)); - - - $attributes = $this->_metadata->getAttributes(Zend_Tool_Framework_Manifest_Metadata::ATTRIBUTES_ALL, true); - - $this->assertEquals(4, count($attributes)); - - $this->assertEquals('Global', $attributes['type']); - $this->assertEquals('Foo', $attributes['name']); - $this->assertEquals('(null)', $attributes['value']); - $this->assertEquals('(object)', $attributes['reference']); - - } - - public function testMetadataObjectCanCastToStringRepresentation() - { - $obj1 = new ArrayObject(); - - $this->_metadata->setOptions(array( - 'name' => 'Foo', - 'value' => 'Bar', - 'reference' => $obj1 - )); - - $this->assertEquals('Type: Global, Name: Foo, Value: Bar', (string) $this->_metadata); - } - -} diff --git a/tests/Zend/Tool/Framework/Provider/AbstractTest.php b/tests/Zend/Tool/Framework/Provider/AbstractTest.php deleted file mode 100644 index b4ab8d0842..0000000000 --- a/tests/Zend/Tool/Framework/Provider/AbstractTest.php +++ /dev/null @@ -1,66 +0,0 @@ -_request = new Zend_Tool_Framework_Client_Request(); - $this->_response = new Zend_Tool_Framework_Client_Response(); - $this->_registry = new Zend_Tool_Framework_Registry(); - - $this->_registry->setRequest($this->_request); - $this->_registry->setResponse($this->_response); - } - - public function testAbsractReturnsRequestAndResponse() - { - $provider = new Zend_Tool_Framework_Provider_ProviderFullFeatured(); - $provider->setRegistry($this->_registry); - $returnInternals = $provider->_testReturnInternals(); - $this->assertTrue(array_shift($returnInternals) === $this->_request); - $this->assertTrue(array_shift($returnInternals) === $this->_response); - } - -} diff --git a/tests/Zend/Tool/Framework/Provider/RepositoryTest.php b/tests/Zend/Tool/Framework/Provider/RepositoryTest.php deleted file mode 100644 index b47ef2298e..0000000000 --- a/tests/Zend/Tool/Framework/Provider/RepositoryTest.php +++ /dev/null @@ -1,174 +0,0 @@ -_repository = new Zend_Tool_Framework_Provider_Repository(); - - // setup the registry components required to test with - $this->_registry = new Zend_Tool_Framework_Registry(); - $this->_registry->setProviderRepository($this->_repository); - $this->_registry->setActionRepository(new Zend_Tool_Framework_Action_Repository()); - } - - public function teardown() - { - $this->_registry->reset(); - $this->_repository = null; - } - - public function testRepositoryIsEmpty() - { - $this->assertEquals(0, count($this->_repository)); - } - - public function testAddProviderCanHandleProviderObjects() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->process(); - $this->assertEquals(2, count($this->_repository)); - } - - public function testAddProviderCanHandleProviderWithAlternateName() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderAltName()); - $this->_repository->process(); - $this->assertEquals(3, count($this->_repository)); - $this->assertEquals('FooBar', $this->_repository->getProviderSignature('FooBar')->getName()); - } - - /** - * @expectedException Zend_Tool_Framework_Provider_Exception - */ - public function testAddProviderThrowsExceptionOnDuplicateName() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - } - - public function testAddProviderWillProcessOnCall() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->process(); - $this->_repository->setProcessOnAdd(true); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderAltName()); - $this->assertEquals(3, count($this->_repository)); - $this->assertEquals('FooBar', $this->_repository->getProviderSignature('FooBar')->getName()); - } - - public function testGetProvidersReturnsProviders() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->process(); - $this->assertEquals(2, count($this->_repository)); - foreach ($this->_repository->getProviders() as $provider) { - $this->assertTrue($provider instanceof Zend_Tool_Framework_Provider_Interface); - } - - } - - public function testGetProviderSignaturesReturnsProviderSignatures() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->process(); - $this->assertEquals(2, count($this->_repository)); - foreach ($this->_repository->getProviderSignatures() as $providerSignature) { - $this->assertTrue($providerSignature instanceof Zend_Tool_Framework_Provider_Signature); - } - - } - - public function testHasProviderReturnsCorrectValues() - { - $this->_repository->addProvider(($providerOne = new Zend_Tool_Framework_Provider_ProviderOne())); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - - $this->assertTrue($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderOne', false)); - $this->assertTrue($this->_repository->hasProvider($providerOne, false)); - $this->assertTrue($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderTwo', false)); - $this->assertFalse($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderThree', false)); - $this->assertFalse($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderOne')); - - $this->_repository->process(); - $this->assertTrue($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderOne', false)); - $this->assertTrue($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderOne')); - $this->assertFalse($this->_repository->hasProvider('Zend_Tool_Framework_Provider_ProviderThree')); - } - - public function testGetProviderReturnsProvider() - { - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderOne()); - $this->_repository->addProvider(new Zend_Tool_Framework_Provider_ProviderTwo()); - $this->_repository->process(); - $this->assertTrue($this->_repository->getProvider('ProviderOne') instanceof Zend_Tool_Framework_Provider_Interface); - } - - - public function testRepositoryIsCountable() - { - $this->assertTrue($this->_repository instanceof Countable); - } - - public function testRepositoryIsIterable() - { - $this->assertTrue($this->_repository instanceof Traversable); - foreach ($this->_repository as $provider) { - $this->assertTrue(true); - } - } - -} diff --git a/tests/Zend/Tool/Framework/Provider/SignatureTest.php b/tests/Zend/Tool/Framework/Provider/SignatureTest.php deleted file mode 100644 index 2cdd848b75..0000000000 --- a/tests/Zend/Tool/Framework/Provider/SignatureTest.php +++ /dev/null @@ -1,184 +0,0 @@ -_registry = new Zend_Tool_Framework_Registry(); - $this->_registry->setActionRepository(new Zend_Tool_Framework_Action_Repository()); - $this->_targetSignature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderFullFeatured()); - $this->_targetSignature->setRegistry($this->_registry); - $this->_targetSignature->process(); - } - - public function teardown() - { - $this->_registry->reset(); - } - - public function testSignatureCanBeCreatedFromProvider() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderOne()); - $signature->setRegistry($this->_registry); - $signature->process(); - $signature->process(); - $this->assertEquals('ProviderOne', $signature->getName()); - } - - public function testSignatureCanBeCreatedFromProviderWhenOverridingName() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderFullFeatured()); - $signature->setRegistry($this->_registry); - $signature->process(); - $this->assertEquals('FooBarBaz', $signature->getName()); - } - - public function testGetProviderReturnsProvider() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderOne()); - $signature->setRegistry($this->_registry); - $signature->process(); - $this->assertTrue($signature->getProvider() instanceof Zend_Tool_Framework_Provider_ProviderOne); - } - - public function testGetProviderReflectionWillReturnZendReflectionClassObject() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderOne()); - $signature->setRegistry($this->_registry); - $signature->process(); - $this->assertTrue($signature->getProviderReflection() instanceof Zend_Reflection_Class); - } - - public function testGetSpecialtiesReturnsParsedSpecialties() - { - $this->assertEquals(array('_Global', 'Hi', 'BloodyMurder', 'ForYourTeam'), $this->_targetSignature->getSpecialties()); - } - - public function testGetSpecialtiesReturnsParsedSpecialtiesFromMethodInsteadOfProperty() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderFullFeatured2()); - $signature->setRegistry($this->_registry); - $signature->process(); - $this->assertEquals(array('_Global', 'Hi', 'BloodyMurder', 'ForYourTeam'), $signature->getSpecialties()); - } - - /** - * @expectedException Zend_Tool_Framework_Provider_Exception - */ - public function testGetSpecialtiesReturnsParsedSpecialtiesThrowsExceptionOnBadPropertyValue() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderFullFeaturedBadSpecialties()); - $signature->setRegistry($this->_registry); - $signature->process(); - } - - /** - * @expectedException Zend_Tool_Framework_Provider_Exception - */ - public function testGetSpecialtiesReturnsParsedSpecialtiesThrowsExceptionOnBadReturnValue() - { - $signature = new Zend_Tool_Framework_Provider_Signature(new Zend_Tool_Framework_Provider_ProviderFullFeaturedBadSpecialties2()); - $signature->setRegistry($this->_registry); - $signature->process(); - } - - public function testGetActionsWillReturnProperActions() - { - $actionArray = $this->_targetSignature->getActions(); - $action = array_shift($actionArray); - $this->assertTrue($action instanceof Zend_Tool_Framework_Action_Base); - $this->assertEquals('Say', $action->getName()); - $action = array_shift($actionArray); - $this->assertTrue($action instanceof Zend_Tool_Framework_Action_Base); - $this->assertEquals('Scream', $action->getName()); - } - - public function testGetActionableMethodsReturnsAllActionableMethods() - { - $this->assertEquals(5, count($this->_targetSignature->getActionableMethods())); - - $actionableMethods = $this->_targetSignature->getActionableMethods(); - $actionableMethod = array_shift($actionableMethods); - $this->assertEquals('say', $actionableMethod['methodName']); - $actionableMethod = array_shift($actionableMethods); - $this->assertEquals('scream', $actionableMethod['methodName']); - $actionableMethod = array_shift($actionableMethods); - $this->assertEquals('sayHi', $actionableMethod['methodName']); - $actionableMethod = array_shift($actionableMethods); - $this->assertEquals('screamBloodyMurder', $actionableMethod['methodName']); - $actionableMethod = array_shift($actionableMethods); - $this->assertEquals('screamForYourTeam', $actionableMethod['methodName']); - } - - public function testGetActionableMethodReturnsCorrectActionableMethod() - { - $actionableMethod = $this->_targetSignature->getActionableMethod('scream'); - $this->assertEquals('Scream', $actionableMethod['actionName']); - - $this->assertFalse($this->_targetSignature->getActionableMethod('Foo')); - } - - public function testGetActionableMethodByActionNameReturnsCorrectActionableMethod() - { - $actionableMethod = $this->_targetSignature->getActionableMethodByActionName('Scream'); - $this->assertEquals('scream', $actionableMethod['methodName']); - - $this->assertFalse($this->_targetSignature->getActionableMethodByActionName('Foo')); - } - -} diff --git a/tests/Zend/Tool/Framework/Provider/_files/ProviderAltName.php b/tests/Zend/Tool/Framework/Provider/_files/ProviderAltName.php deleted file mode 100644 index c8a11fe1b3..0000000000 --- a/tests/Zend/Tool/Framework/Provider/_files/ProviderAltName.php +++ /dev/null @@ -1,38 +0,0 @@ -_registry->getRequest(), $this->_registry->getResponse()); - } - -} - diff --git a/tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeatured2.php b/tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeatured2.php deleted file mode 100644 index 4f30fffa7c..0000000000 --- a/tests/Zend/Tool/Framework/Provider/_files/ProviderFullFeatured2.php +++ /dev/null @@ -1,81 +0,0 @@ -_registry = new Zend_Tool_Framework_Registry(); - } - - public function teardown() - { - $this->_registry->reset(); - } - - public function testRegistryCanGetAndSetClient() - { - $this->assertNull($this->_registry->getClient()); - $this->_registry->setClient($client = new Zend_Tool_Framework_EmptyClient()); - $this->assertTrue($this->_registry->getClient() === $client); - } - - public function testRegistryCanGetAndSetLoader() - { - $this->assertTrue($this->_registry->getLoader() instanceof Zend_Tool_Framework_Loader_Abstract); - $this->_registry->setLoader($loader = new Zend_Tool_Framework_EmptyLoader()); - $this->assertTrue($this->_registry->getLoader() === $loader); - } - - public function testRegistryCanGetAndSetActionRepository() - { - $this->assertTrue($this->_registry->getActionRepository() instanceof Zend_Tool_Framework_Action_Repository); - $this->_registry->setActionRepository($repo = new Zend_Tool_Framework_Action_Repository()); - $this->assertTrue($this->_registry->getActionRepository() === $repo); - } - - public function testRegistryCanGetAndSetProviderRepository() - { - $this->assertTrue($this->_registry->getProviderRepository() instanceof Zend_Tool_Framework_Provider_Repository); - $this->_registry->setProviderRepository($repo = new Zend_Tool_Framework_Provider_Repository()); - $this->assertTrue($this->_registry->getProviderRepository() === $repo); - } - - public function testRegistryCanGetAndSetManifestRepository() - { - $this->assertTrue($this->_registry->getManifestRepository() instanceof Zend_Tool_Framework_Manifest_Repository); - $this->_registry->setManifestRepository($repo = new Zend_Tool_Framework_Manifest_Repository()); - $this->assertTrue($this->_registry->getManifestRepository() === $repo); - } - - public function testRegistryCanGetAndSetRequest() - { - $this->assertTrue($this->_registry->getRequest() instanceof Zend_Tool_Framework_Client_Request); - $this->_registry->setRequest($req = new Zend_Tool_Framework_Client_Request()); - $this->assertTrue($this->_registry->getRequest() === $req); - } - - public function testRegistryCanGetAndSetResponse() - { - $this->assertTrue($this->_registry->getResponse() instanceof Zend_Tool_Framework_Client_Response); - $this->_registry->setResponse($resp = new Zend_Tool_Framework_Client_Response()); - $this->assertTrue($this->_registry->getResponse() === $resp); - } - - public function testMagicGetAndSetOfRegistryItems() - { - $this->assertTrue($this->_registry->request instanceof Zend_Tool_Framework_Client_Request); - $this->_registry->request = new Zend_Tool_Framework_Client_Request(); - $this->assertTrue($this->_registry->request instanceof Zend_Tool_Framework_Client_Request); - } - - /** - * @expectedException Zend_Tool_Framework_Exception - */ - public function testMagicGetThrowsExceptionOnNonExistentItem() - { - $foo = $this->_registry->foo; - } - - /** - * @expectedException Zend_Tool_Framework_Exception - */ - public function testMagicSetThrowsExceptionOnNonExistentItem() - { - $this->_registry->foo = 'foo'; - } - - /** - * @expectedException Zend_Tool_Framework_Exception - */ - public function testIsObjectRegistryEnablableWillThrowExceptionsOnNonObject() - { - $this->_registry->isObjectRegistryEnablable('foo'); - } - - /** - * @expectedException Zend_Tool_Framework_Exception - */ - public function testEnableRegistryOnObjectWillThrowExceptionsOnNonObject() - { - $this->_registry->enableRegistryOnObject(new ArrayObject()); - } - -} - diff --git a/tests/Zend/Tool/Framework/_files/EmptyClient.php b/tests/Zend/Tool/Framework/_files/EmptyClient.php deleted file mode 100644 index c0bb8d90c4..0000000000 --- a/tests/Zend/Tool/Framework/_files/EmptyClient.php +++ /dev/null @@ -1,54 +0,0 @@ -_registry = $registry; - } - -} diff --git a/tests/Zend/Tool/Framework/_files/EmptyLoader.php b/tests/Zend/Tool/Framework/_files/EmptyLoader.php deleted file mode 100644 index f38272f3a0..0000000000 --- a/tests/Zend/Tool/Framework/_files/EmptyLoader.php +++ /dev/null @@ -1,38 +0,0 @@ -addTestSuite('Zend_Tool_Project_ProfileTest'); - $suite->addTestSuite('Zend_Tool_Project_Context_RepositoryTest'); - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Tool_Project_AllTests::main') { - Zend_Tool_Project_AllTests::main(); -} diff --git a/tests/Zend/Tool/Project/Context/RegistryTest.php b/tests/Zend/Tool/Project/Context/RegistryTest.php deleted file mode 100644 index 57e598f253..0000000000 --- a/tests/Zend/Tool/Project/Context/RegistryTest.php +++ /dev/null @@ -1,91 +0,0 @@ -assertEquals('Zend_Tool_Project_Context_Repository', get_class(Zend_Tool_Project_Context_Repository::getInstance())); - } - - public function testNewRegistryHasSystemContexts() - { - $this->assertEquals(3, Zend_Tool_Project_Context_Repository::getInstance()->count()); - } - - public function testRegistryReturnsSystemContext() - { - $this->assertEquals('Zend_Tool_Project_Context_System_ProjectProfileFile', get_class(Zend_Tool_Project_Context_Repository::getInstance()->getContext('projectProfileFile'))); - } - - public function testRegistryLoadsZFContexts() - { - $this->_loadZfSystem(); - // the number of initial ZF Components - $count = Zend_Tool_Project_Context_Repository::getInstance()->count(); - $this->assertGreaterThanOrEqual(32, $count); - } - - /** - * @expectedException Zend_Tool_Project_Context_Exception - */ - public function testRegistryThrowsExceptionOnUnallowedContextOverwrite() - { - - Zend_Tool_Project_Context_Repository::getInstance()->addContextClass('Zend_Tool_Project_Context_System_ProjectDirectory'); - } - - /** - * @expectedException Zend_Tool_Project_Context_Exception - */ - public function testRegistryThrowsExceptionOnUnknownContextRequest() - { - Zend_Tool_Project_Context_Repository::getInstance()->getContext('somethingUnknown'); - } - - - protected function _loadZfSystem() - { - $conextRegistry = Zend_Tool_Project_Context_Repository::getInstance(); - $conextRegistry->addContextsFromDirectory(dirname(__FILE__) . '/../../../../../library/Zend/Tool/Project/Context/Zf/', 'Zend_Tool_Project_Context_Zf_'); - } -} diff --git a/tests/Zend/Tool/Project/ProfileTest.php b/tests/Zend/Tool/Project/ProfileTest.php deleted file mode 100644 index e9844893ed..0000000000 --- a/tests/Zend/Tool/Project/ProfileTest.php +++ /dev/null @@ -1,296 +0,0 @@ -_projectDirectory = dirname(__FILE__) . '/_files/project1/'; - $this->_projectProfileFile = dirname(__FILE__) . '/_files/.zfproject.xml.orig'; - - $this->_removeProjectFiles(); - - Zend_Tool_Project_Context_Repository::resetInstance(); - - $contextRegistry = Zend_Tool_Project_Context_Repository::getInstance(); - $contextRegistry->addContextsFromDirectory(dirname(__FILE__) . '/../../../../library/Zend/Tool/Project/Context/Zf/', 'Zend_Tool_Project_Context_Zf_'); - - $this->_standardProfileFromData = new Zend_Tool_Project_Profile(); - $this->_standardProfileFromData->setAttribute('profileData', file_get_contents($this->_projectProfileFile)); - $this->_standardProfileFromData->setAttribute('projectDirectory', $this->_projectDirectory); - } - - public function teardown() - { - $this->_removeProjectFiles(); - } - - public function testAttibuteGettersAndSettersWork() - { - - $profile = new Zend_Tool_Project_Profile(array('foo' => 'bar')); - $profile->setAttributes(array('baz' => 'BAZ')); - $profile->setAttribute('boof', 'foob'); - - $this->assertEquals('foob', $profile->getAttribute('boof')); - $this->assertContains('bar', $profile->getAttributes()); - $this->assertContains('BAZ', $profile->getAttributes()); - - } - - public function testProfileLoadsFromExistingFileGivenProjectDirectory() - { - copy($this->_projectProfileFile, $this->_projectDirectory . '/.zfproject.xml'); - - $profile = new Zend_Tool_Project_Profile(); - $profile->setAttribute('projectDirectory', $this->_projectDirectory); - $profile->loadFromFile(); - - // first item in here should be 'projectDirectory' - $projectDirectoryResource = $profile->current(); - - $this->assertEquals(1, count($profile)); - $this->assertEquals('Zend_Tool_Project_Profile_Resource', get_class($projectDirectoryResource)); - $this->assertEquals('Zend_Tool_Project_Context_System_ProjectDirectory', get_class($projectDirectoryResource->getContext())); - } - - public function testProfileLoadsFromExistingFileGivenProfileFile() - { - - $profile = new Zend_Tool_Project_Profile(array( - 'projectProfileFile' => $this->_projectProfileFile, - 'projectDirectory' => $this->_projectDirectory - )); - $profile->loadFromFile(); - - $projectDirectoryResource = $profile->current(); - - $this->assertEquals('Zend_Tool_Project_Profile_Resource', get_class($projectDirectoryResource)); - $this->assertEquals('Zend_Tool_Project_Context_System_ProjectDirectory', get_class($projectDirectoryResource->getContext())); - } - - public function testProfileFromVariousSourcesIsLoadableFromFile() - { - - $profile = new Zend_Tool_Project_Profile(); - - // no options, should return false - $this->assertFalse($profile->isLoadableFromFile()); - - // invalid file path, should be false - $profile->setAttribute('projectProfileFile', $this->_projectProfileFile . '.invalid-file'); - $this->assertFalse($profile->isLoadableFromFile()); - - // valid file path, shoudl be true - $profile->setAttribute('projectProfileFile', $this->_projectProfileFile); - $this->assertTrue($profile->isLoadableFromFile()); - - // just project directory - $profile = new Zend_Tool_Project_Profile(); - - // shoudl be false with non existent directory - $profile->setAttribute('projectDirectory', $this->_projectDirectory . 'non-existent/dir/'); - $this->assertFalse($profile->isLoadableFromFile()); - - // should return true for proper directory - copy($this->_projectProfileFile, $this->_projectDirectory . '/.zfproject.xml'); - $profile->setAttribute('projectDirectory', $this->_projectDirectory); - $this->assertTrue($profile->isLoadableFromFile()); - } - - public function testLoadFromDataIsSameAsLoadFromFile() - { - - $profile = new Zend_Tool_Project_Profile(array('projectProfileFile' => $this->_projectProfileFile)); - $profile->setAttribute('projectDirectory', $this->_projectDirectory); - $profile->loadFromFile(); - - $profile2 = new Zend_Tool_Project_Profile(); - $profile2->setAttribute('profileData', file_get_contents($this->_projectProfileFile)); - $profile2->setAttribute('projectDirectory', $this->_projectDirectory); - $profile2->loadFromData(); - - $this->assertEquals($profile->__toString(), $profile2->__toString()); - } - - public function testProfileCanReturnStorageData() - { - $this->_standardProfileFromData->loadFromData(); - $expectedValue = ' '; - $this->assertEquals($expectedValue, str_replace(array("\r\n", "\n"), '', $this->_standardProfileFromData->storeToData())); - } - - public function testProfileCanSaveStorageDataToFile() - { - $this->_standardProfileFromData->loadFromData(); - $this->_standardProfileFromData->setAttribute('projectProfileFile', $this->_projectDirectory . 'my-xml-file.xml'); - $this->_standardProfileFromData->storeToFile(); - $this->assertTrue(file_exists($this->_projectDirectory . 'my-xml-file.xml')); - } - - public function testProfileCanFindResource() - { - $profile = new Zend_Tool_Project_Profile(array( - 'projectProfileFile' => $this->_projectProfileFile, - 'projectDirectory' => $this->_projectDirectory - )); - $profile->loadFromFile(); - - $modelsDirectoryResource = $profile->search('modelsDirectory'); - - $this->assertEquals('Zend_Tool_Project_Profile_Resource', get_class($modelsDirectoryResource)); - $this->assertEquals('Zend_Tool_Project_Context_Zf_ModelsDirectory', get_class($modelsDirectoryResource->getContext())); - - $publicIndexFile = $profile->search(array('publicDirectory', 'publicIndexFile')); - - $this->assertEquals('Zend_Tool_Project_Profile_Resource', get_class($publicIndexFile)); - $this->assertEquals('Zend_Tool_Project_Context_Zf_PublicIndexFile', get_class($publicIndexFile->getContext())); - - } - - public function testProfileCanRecursivelyCreateParentFirst() - { - $this->_standardProfileFromData->loadFromData(); - - foreach ($this->_standardProfileFromData->getIterator() as $resource) { - $resource->getContext()->create(); - } - - $this->assertTrue(file_exists($this->_projectDirectory . 'public/index.php')); - } - - public function testProfileCanDelete() - { - $this->_standardProfileFromData->loadFromData(); - - foreach ($this->_standardProfileFromData->getIterator() as $resource) { - $resource->getContext()->create(); - } - - $this->assertTrue(file_exists($this->_projectDirectory . 'public/index.php')); - - $publicIndexFile = $this->_standardProfileFromData->search('publicIndexFile'); - $publicIndexFile->getContext()->delete(); - - $this->assertFalse(file_exists($this->_projectDirectory . 'public/index.php')); - - $appConfigFile = $this->_standardProfileFromData->search('applicationConfigFile'); - $appConfigFile->getContext()->delete(); - $configsDirectory = $this->_standardProfileFromData->search('configsDirectory'); - $configsDirectory->getContext()->delete(); - - $this->assertFalse(file_exists($this->_projectDirectory . 'application/configs')); - } - - /** - * - * @expectedException Zend_Tool_Project_Exception - */ - public function testProfileThrowsExceptionOnLoadFromData() - { - $profile = new Zend_Tool_Project_Profile(); - - // missing data from attributes should throw exception here - $profile->loadFromData(); - } - - /** - * - * @expectedException Zend_Tool_Project_Exception - */ - public function testProfileThrowsExceptionOnLoadFromFile() - { - $profile = new Zend_Tool_Project_Profile(); - - // missing file path or project path - $profile->loadFromFile(); - } - - /** - * - * @expectedException Zend_Tool_Project_Exception - */ - public function testProfileThrowsExceptionOnStoreToFile() - { - $profile = new Zend_Tool_Project_Profile(); - - // missing file path or project path - $profile->storeToFile(); - } - - /** - * - * @expectedException Zend_Tool_Project_Exception - */ - public function testProfileThrowsExceptionOnLoadFromFileWithBadPathForProfileFile() - { - $profile = new Zend_Tool_Project_Profile(); - $profile->setAttribute('projectProfileFile', '/path/should/not/exist'); - - // missing file path or project path - $profile->loadFromFile(); - } - - protected function _removeProjectFiles() - { - $rdi = new RecursiveDirectoryIterator($this->_projectDirectory); - - foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::CHILD_FIRST) as $dirIteratorItem) { - - $basename = $dirIteratorItem->getBasename(); - if (stristr($dirIteratorItem->getPathname(), '.svn') - || '.' === $basename - || '..' === $basename) - { - continue; - } - - if ($dirIteratorItem->isDir()) { - rmdir($dirIteratorItem->getPathname()); - } elseif ($dirIteratorItem->isFile()) { - unlink($dirIteratorItem->getPathname()); - } - } - } -} diff --git a/tests/Zend/Tool/Project/Provider/ControllerTest.php b/tests/Zend/Tool/Project/Provider/ControllerTest.php deleted file mode 100644 index bd6e18f61d..0000000000 --- a/tests/Zend/Tool/Project/Provider/ControllerTest.php +++ /dev/null @@ -1,52 +0,0 @@ -assertFalse(Zend_Tool_Project_Provider_Controller::hasResource(new Zend_Tool_Project_Profile(), - 'NewController', 'NonexistentModule')); - } - -} diff --git a/tests/Zend/Tool/Project/_files/.zfproject.xml.orig b/tests/Zend/Tool/Project/_files/.zfproject.xml.orig deleted file mode 100644 index 74c2b4c57e..0000000000 --- a/tests/Zend/Tool/Project/_files/.zfproject.xml.orig +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/Zend/Tool/Project/_files/project1/.gitignore b/tests/Zend/Tool/Project/_files/project1/.gitignore deleted file mode 100644 index 593bcf0e80..0000000000 --- a/tests/Zend/Tool/Project/_files/project1/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -!.gitignore -* From 1cd16a512d8389a3908a42d1c39e8491419877f3 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:42:37 -0500 Subject: [PATCH 30/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Amf Tests --- tests/Zend/AllTests.php | 2 - tests/Zend/Amf/Adobe/IntrospectorTest.php | 230 --- .../Amf/Adobe/TestAsset/ParameterHints.php | 8 - .../_files/ZendAmfAdobeIntrospectorTest.php | 42 - .../ZendAmfAdobeIntrospectorTestType.php | 36 - tests/Zend/Amf/AllTests.php | 78 - tests/Zend/Amf/AuthTest.php | 347 ----- tests/Zend/Amf/Contact.php | 46 - tests/Zend/Amf/ContactVO.php | 42 - tests/Zend/Amf/Request/bytearray.bin | Bin 25383 -> 0 bytes tests/Zend/Amf/Request/longstring.bin | 1 - .../Amf/Request/mock/arrayAmf3Request.bin | Bin 291 -> 0 bytes .../mock/bogusTypedObjectAmf0Request.bin | Bin 158 -> 0 bytes .../Amf/Request/mock/boolFalseAmf0Request.bin | Bin 43 -> 0 bytes .../Amf/Request/mock/boolFalseAmf3Request.bin | Bin 267 -> 0 bytes .../Amf/Request/mock/boolTrueAmf0Request.bin | Bin 43 -> 0 bytes .../Amf/Request/mock/boolTrueAmf3Request.bin | Bin 267 -> 0 bytes .../Amf/Request/mock/byteArrayAmf3Request.bin | Bin 25431 -> 0 bytes .../Request/mock/credentialsheaderAmf0.bin | Bin 126 -> 0 bytes .../Zend/Amf/Request/mock/dateAmf0Request.bin | Bin 52 -> 0 bytes .../Zend/Amf/Request/mock/dateAmf3Request.bin | Bin 276 -> 0 bytes .../Zend/Amf/Request/mock/intAmf0Request.bin | Bin 50 -> 0 bytes .../Amf/Request/mock/largeIntAmf3Request.bin | Bin 270 -> 0 bytes .../Request/mock/mixedArrayAmf0Request.bin | Bin 71 -> 0 bytes .../Zend/Amf/Request/mock/nullAmf0Request.bin | Bin 42 -> 0 bytes .../Amf/Request/mock/numberAmf0Request.bin | Bin 52 -> 0 bytes .../Amf/Request/mock/numberAmf3Request.bin | Bin 277 -> 0 bytes .../Amf/Request/mock/objectAmf0Request.bin | Bin 65 -> 0 bytes .../Request/mock/objectFirstParamRequest.bin | Bin 68 -> 0 bytes .../Amf/Request/mock/referenceAmf0Request.bin | Bin 90 -> 0 bytes .../Amf/Request/mock/stringAmf0Request.bin | Bin 70 -> 0 bytes .../Amf/Request/mock/stringAmf3Request.bin | Bin 294 -> 0 bytes .../Request/mock/typedObjectAmf0Request.bin | Bin 160 -> 0 bytes .../Amf/Request/mock/undefAmf3Request.bin | Bin 272 -> 0 bytes .../Amf/Request/mock/undefinedAmf0Request.bin | Bin 42 -> 0 bytes .../Zend/Amf/Request/mock/xmlAmf0Request.bin | Bin 70 -> 0 bytes .../Zend/Amf/Request/mock/xmlAmf3Request.bin | Bin 296 -> 0 bytes tests/Zend/Amf/RequestTest.php | 669 -------- tests/Zend/Amf/ResourceTest.php | 196 --- tests/Zend/Amf/Resources/StreamContext.php | 37 - tests/Zend/Amf/Response/HttpTest.php | 86 - .../Amf/Response/mock/arrayAmf0Response.bin | Bin 58 -> 0 bytes .../Amf/Response/mock/arrayAmf3Response.bin | Bin 310 -> 0 bytes .../Response/mock/boolFalseAmf0Response.bin | Bin 27 -> 0 bytes .../Response/mock/boolFalseAmf3Response.bin | Bin 287 -> 0 bytes .../Response/mock/boolTrueAmf0Response.bin | Bin 27 -> 0 bytes .../Response/mock/boolTrueAmf3Response.bin | Bin 287 -> 0 bytes .../Response/mock/classMapAmf3Response.bin | Bin 419 -> 0 bytes .../Amf/Response/mock/dateAmf0Response.bin | Bin 36 -> 0 bytes .../Amf/Response/mock/dateAmf3Response.bin | Bin 296 -> 0 bytes .../Response/mock/domdocumentAmf3Response.bin | Bin 372 -> 0 bytes .../Amf/Response/mock/intAmf0Response.bin | Bin 34 -> 0 bytes .../Response/mock/largeIntAmf3Response.bin | Bin 291 -> 0 bytes .../Response/mock/nestedArrayAmf0Response.bin | Bin 49 -> 0 bytes .../Amf/Response/mock/nullAmf0Response.bin | Bin 26 -> 0 bytes .../Amf/Response/mock/numberAmf0Response.bin | Bin 34 -> 0 bytes .../Amf/Response/mock/numberAmf3Response.bin | Bin 295 -> 0 bytes .../Amf/Response/mock/objectAmf0Response.bin | Bin 47 -> 0 bytes .../mock/referenceObjectAmf3Response.bin | Bin 313 -> 0 bytes .../Response/mock/sparseArrayAmf0Response.bin | Bin 51 -> 0 bytes .../Amf/Response/mock/stringAmf0Response.bin | Bin 52 -> 0 bytes .../Amf/Response/mock/stringAmf3Response.bin | Bin 312 -> 0 bytes .../mock/stringKeyArrayAmf0Response.bin | Bin 57 -> 0 bytes .../Response/mock/typedObjectAmf0Response.bin | Bin 243 -> 0 bytes tests/Zend/Amf/ResponseTest.php | 1066 ------------- tests/Zend/Amf/ServerTest.php | 1380 ----------------- tests/Zend/Amf/ServiceA.php | 42 - tests/Zend/Amf/ServiceB.php | 42 - tests/Zend/Amf/ServiceC.php | 42 - tests/Zend/Amf/TypeLoaderTest.php | 94 -- tests/Zend/Amf/Util/BinaryStreamTest.php | 93 -- tests/Zend/Amf/Value/ArrayCollectionTest.php | 218 --- tests/Zend/Amf/Value/MessageBodyTest.php | 100 -- tests/Zend/Amf/Value/MessageHeaderTest.php | 98 -- tests/Zend/Amf/_files/acl.xml | 9 - .../Zend/Amf/_files/services/My/ServiceA.php | 43 - tests/Zend/Amf/_files/services/ServiceC.php | 43 - tests/Zend/Amf/_files/testdata | 1 - .../Amf/_files/zf-6130/Request_RawData.txt | 25 - .../zf-6130/Response_withNoStrongType.txt | 11 - .../zf-6130/services/EmployeeService.php | 89 -- 81 files changed, 5216 deletions(-) delete mode 100644 tests/Zend/Amf/Adobe/IntrospectorTest.php delete mode 100644 tests/Zend/Amf/Adobe/TestAsset/ParameterHints.php delete mode 100644 tests/Zend/Amf/Adobe/_files/ZendAmfAdobeIntrospectorTest.php delete mode 100644 tests/Zend/Amf/Adobe/_files/ZendAmfAdobeIntrospectorTestType.php delete mode 100644 tests/Zend/Amf/AllTests.php delete mode 100755 tests/Zend/Amf/AuthTest.php delete mode 100644 tests/Zend/Amf/Contact.php delete mode 100644 tests/Zend/Amf/ContactVO.php delete mode 100644 tests/Zend/Amf/Request/bytearray.bin delete mode 100644 tests/Zend/Amf/Request/longstring.bin delete mode 100644 tests/Zend/Amf/Request/mock/arrayAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/bogusTypedObjectAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/boolFalseAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/boolFalseAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/boolTrueAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/boolTrueAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/byteArrayAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/credentialsheaderAmf0.bin delete mode 100644 tests/Zend/Amf/Request/mock/dateAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/dateAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/intAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/largeIntAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/mixedArrayAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/nullAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/numberAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/numberAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/objectAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/objectFirstParamRequest.bin delete mode 100644 tests/Zend/Amf/Request/mock/referenceAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/stringAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/stringAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/typedObjectAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/undefAmf3Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/undefinedAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/xmlAmf0Request.bin delete mode 100644 tests/Zend/Amf/Request/mock/xmlAmf3Request.bin delete mode 100644 tests/Zend/Amf/RequestTest.php delete mode 100755 tests/Zend/Amf/ResourceTest.php delete mode 100755 tests/Zend/Amf/Resources/StreamContext.php delete mode 100644 tests/Zend/Amf/Response/HttpTest.php delete mode 100644 tests/Zend/Amf/Response/mock/arrayAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/arrayAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/boolFalseAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/boolFalseAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/boolTrueAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/boolTrueAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/classMapAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/dateAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/dateAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/domdocumentAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/intAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/largeIntAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/nestedArrayAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/nullAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/numberAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/numberAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/objectAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/referenceObjectAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/sparseArrayAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/stringAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/stringAmf3Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/stringKeyArrayAmf0Response.bin delete mode 100644 tests/Zend/Amf/Response/mock/typedObjectAmf0Response.bin delete mode 100644 tests/Zend/Amf/ResponseTest.php delete mode 100644 tests/Zend/Amf/ServerTest.php delete mode 100644 tests/Zend/Amf/ServiceA.php delete mode 100644 tests/Zend/Amf/ServiceB.php delete mode 100755 tests/Zend/Amf/ServiceC.php delete mode 100644 tests/Zend/Amf/TypeLoaderTest.php delete mode 100644 tests/Zend/Amf/Util/BinaryStreamTest.php delete mode 100644 tests/Zend/Amf/Value/ArrayCollectionTest.php delete mode 100644 tests/Zend/Amf/Value/MessageBodyTest.php delete mode 100644 tests/Zend/Amf/Value/MessageHeaderTest.php delete mode 100644 tests/Zend/Amf/_files/acl.xml delete mode 100755 tests/Zend/Amf/_files/services/My/ServiceA.php delete mode 100755 tests/Zend/Amf/_files/services/ServiceC.php delete mode 100755 tests/Zend/Amf/_files/testdata delete mode 100644 tests/Zend/Amf/_files/zf-6130/Request_RawData.txt delete mode 100644 tests/Zend/Amf/_files/zf-6130/Response_withNoStrongType.txt delete mode 100644 tests/Zend/Amf/_files/zf-6130/services/EmployeeService.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 659ba7378c..199834f5d3 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -26,7 +26,6 @@ } require_once 'Zend/Acl/AclTest.php'; -require_once 'Zend/Amf/AllTests.php'; require_once 'Zend/AuthTest.php'; require_once 'Zend/Auth/AllTests.php'; require_once 'Zend/Cache/AllTests.php'; @@ -140,7 +139,6 @@ public static function suite() // Start remaining tests... $suite->addTestSuite('Zend_Acl_AclTest'); - $suite->addTest(Zend_Amf_AllTests::suite()); $suite->addTestSuite('Zend_AuthTest'); $suite->addTest(Zend_Auth_AllTests::suite()); $suite->addTest(Zend_Cache_AllTests::suite()); diff --git a/tests/Zend/Amf/Adobe/IntrospectorTest.php b/tests/Zend/Amf/Adobe/IntrospectorTest.php deleted file mode 100644 index 1e77105380..0000000000 --- a/tests/Zend/Amf/Adobe/IntrospectorTest.php +++ /dev/null @@ -1,230 +0,0 @@ -introspector = new Zend_Amf_Adobe_Introspector(); - } - - public function testIntrospectionDoesNotIncludeConstructor() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertNotContains('__construct', $xml); - } - - public function testIntrospectionDoesNotIncludeMagicMethods() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertNotContains('__get', $xml); - } - - public function testIntrospectionContainsPublicPropertiesOfReturnClassTypes() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertRegexp('/]*(name="com_zend_framework_IntrospectorTestCustomType")/', $xml, $xml); - $this->assertRegexp('/]*(name="foo")/', $xml, $xml); - $this->assertRegexp('/]*(type="string")/', $xml, $xml); - } - - public function testIntrospectionDoesNotContainNonPublicPropertiesOfReturnClassTypes() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertNotRegexp('/]*(name="_bar")/', $xml, $xml); - } - - public function testIntrospectionContainsPublicMethods() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertRegexp('/]*(name="foobar")/', $xml, $xml); - $this->assertRegexp('/]*(name="barbaz")/', $xml, $xml); - $this->assertRegexp('/]*(name="bazbat")/', $xml, $xml); - } - - public function testIntrospectionContainsOperationForEachPrototypeOfAPublicMethod() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertEquals(4, substr_count($xml, 'name="foobar"')); - $this->assertEquals(1, substr_count($xml, 'name="barbaz"')); - $this->assertEquals(1, substr_count($xml, 'name="bazbat"')); - } - - public function testPassingDirectoriesOptionShouldResolveServiceClassAndType() - { - require_once dirname(__FILE__) . '/_files/ZendAmfAdobeIntrospectorTestType.php'; - $xml = $this->introspector->introspect('ZendAmfAdobeIntrospectorTest', array( - 'directories' => array(dirname(__FILE__) . '/_files'), - )); - $this->assertRegexp('/]*(name="foo")/', $xml, $xml); - $this->assertRegexp('/]*(name="ZendAmfAdobeIntrospectorTestType")/', $xml, $xml); - $this->assertRegexp('/]*(name="bar")/', $xml, $xml); - } - - public function testMissingPropertyDocblockInTypedClassShouldReportTypeAsUnknown() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - if (!preg_match('/(]*(name="baz")[^>]*>)/', $xml, $matches)) { - $this->fail('Baz property of com.zend.framework.IntrospectorTestCustomType not found'); - } - $node = $matches[1]; - $this->assertContains('type="Unknown"', $node, $node); - } - - public function testPropertyDocblockWithoutAnnotationInTypedClassShouldReportTypeAsUnknown() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - if (!preg_match('/(]*(name="bat")[^>]*>)/', $xml, $matches)) { - $this->fail('Bat property of com.zend.framework.IntrospectorTestCustomType not found'); - } - $node = $matches[1]; - $this->assertContains('type="Unknown"', $node, $node); - } - - public function testTypedClassWithExplicitTypeShouldReportAsThatType() - { - $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest'); - $this->assertRegexp('/]*(name="explicit")/', $xml, $xml); - } - - /** - * @group ZF-10365 - */ - public function testArgumentsWithArrayTypeHintsReflectedInReturnedXml() - { - require_once dirname(__FILE__) . '/TestAsset/ParameterHints.php'; - $xml = $this->introspector->introspect('Zend.Amf.Adobe.TestAsset.ParameterHints'); - $this->assertRegexp('/]*(name="arg1")[^>]*(type="Unknown\[\]")/', $xml, $xml); - $this->assertRegexp('/]*(name="arg2")[^>]*(type="Unknown\[\]")/', $xml, $xml); - } -} - -class com_zend_framework_IntrospectorTest -{ - /** - * Constructor - * - * @return void - */ - public function __construct() - { - } - - /** - * Overloading: get properties - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - $prop = '_' . $name; - if (!isset($this->$prop)) { - return null; - } - return $this->$prop; - } - - /** - * Foobar - * - * @param string|int $arg - * @return string|stdClass - */ - public function foobar($arg) - { - } - - /** - * Barbaz - * - * @param com_zend_framework_IntrospectorTestCustomType $arg - * @return boolean - */ - public function barbaz($arg) - { - } - - /** - * Bazbat - * - * @return com_zend_framework_IntrospectorTestExplicitType - */ - public function bazbat() - { - } -} - -class com_zend_framework_IntrospectorTestCustomType -{ - /** - * @var string - */ - public $foo; - - public $baz; - - /** - * Docblock without an annotation - */ - public $bat; - - /** - * @var bool - */ - protected $_bar; -} - -class com_zend_framework_IntrospectorTestExplicitType -{ - public $_explicitType = 'explicit'; -} - - -// Call Zend_Amf_Adobe_IntrospectorTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Amf_Adobe_IntrospectorTest::main") { - Zend_Amf_Adobe_IntrospectorTest::main(); -} diff --git a/tests/Zend/Amf/Adobe/TestAsset/ParameterHints.php b/tests/Zend/Amf/Adobe/TestAsset/ParameterHints.php deleted file mode 100644 index f1621a8e1a..0000000000 --- a/tests/Zend/Amf/Adobe/TestAsset/ParameterHints.php +++ /dev/null @@ -1,8 +0,0 @@ -addTestSuite('Zend_Amf_Adobe_IntrospectorTest'); - $suite->addTestSuite('Zend_Amf_RequestTest'); - $suite->addTestSuite('Zend_Amf_ResponseTest'); - $suite->addTestSuite('Zend_Amf_Response_HttpTest'); - $suite->addTestSuite('Zend_Amf_ServerTest'); - $suite->addTestSuite('Zend_Amf_TypeLoaderTest'); - $suite->addTestSuite('Zend_Amf_Util_BinaryStreamTest'); - $suite->addTestSuite('Zend_Amf_Value_MessageBodyTest'); - $suite->addTestSuite('Zend_Amf_Value_MessageHeaderTest'); - $suite->addTestSuite('Zend_Amf_AuthTest'); - $suite->addTestSuite('Zend_Amf_ResourceTest'); - - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_AllTests::main') { - Zend_Amf_AllTests::main(); -} - diff --git a/tests/Zend/Amf/AuthTest.php b/tests/Zend/Amf/AuthTest.php deleted file mode 100755 index 85898aafe6..0000000000 --- a/tests/Zend/Amf/AuthTest.php +++ /dev/null @@ -1,347 +0,0 @@ -_server = new Zend_Amf_Server(); - $this->_server->setProduction(false); - Zend_Amf_Parse_TypeLoader::resetMap(); - $this->_acl = new Zend_Acl(); - } - - protected function tearDown() - { - unset($this->_server); - } - protected function _addServiceCall($request, $class = 'Zend_Amf_Auth_testclass', $method = 'hello') - { - $data[] = "12345"; - $this->_server->setClass($class); - $newBody = new Zend_Amf_Value_MessageBody("$class.$method","/1",$data); - $request->addAmfBody($newBody); - } - - protected function _addLogin($request, $username, $password) - { - $cmdBody = new Zend_Amf_Value_MessageBody("","/1",""); - $loginCmd = new Zend_Amf_Value_Messaging_CommandMessage(); - $cmdBody->setData($loginCmd); - $loginCmd->operation = Zend_Amf_Value_Messaging_CommandMessage::LOGIN_OPERATION; - $loginCmd->body = "$username:$password"; - $request->addAmfBody($cmdBody); - } - - protected function _addLogout($request) - { - $cmdBody = new Zend_Amf_Value_MessageBody("","/1",""); - $loginCmd = new Zend_Amf_Value_Messaging_CommandMessage(); - $cmdBody->setData($loginCmd); - $loginCmd->operation = Zend_Amf_Value_Messaging_CommandMessage::LOGOUT_OPERATION; - $request->addAmfBody($cmdBody); - } - - protected function _callService($class = 'Zend_Amf_Auth_testclass', $method = 'hello') - { - $request = new Zend_Amf_Request(); - $request->setObjectEncoding(0x03); - $this->_addServiceCall($request, $class, $method); - $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - return $responseBody[0]->getData(); - } - - protected function _callServiceAuth($username, $password, $class = 'Zend_Amf_Auth_testclass', $method = 'hello') - { - $request = new Zend_Amf_Request(); - $request->setObjectEncoding(0x03); - $this->_addLogin($request, $username, $password); - $this->_addServiceCall($request, $class, $method); - $this->_server->handle($request); - return $this->_server->getResponse()->getAmfBodies(); - } - - public function testService() - { - $resp = $this->_callService(); - $this->assertContains("hello", $resp); - } - - - public function testUnauthenticated() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new WrongPassword()); - $this->_server->setAcl($this->_acl); - $data = $this->_callService(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("not allowed", $data->faultString); - } - - public function testAnonymousDenied() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new WrongPassword()); - $this->_acl->addRole(new Zend_Acl_Role(Zend_Amf_Constants::GUEST_ROLE)); - $this->_server->setAcl($this->_acl); - $resp = $this->_callService(); - $this->assertTrue($resp instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("not allowed", $resp->faultString); - } - - public function testAnonymousOK() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new WrongPassword()); - $this->_acl->addRole(new Zend_Acl_Role(Zend_Amf_Constants::GUEST_ROLE)); - $this->_acl->allow(Zend_Amf_Constants::GUEST_ROLE, null, null); - $this->_server->setAcl($this->_acl); - $resp = $this->_callService(); - $this->assertContains("hello", $resp); - } - - public function testNoUsername() - { - $this->_server->setAuth(new WrongPassword()); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("", ""); - $data = $resp[0]->getData(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("username not supplied", $data->faultString); - } - - public function testWrongPassword() - { - $this->_server->setAuth(new WrongPassword()); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", ""); - $data = $resp[0]->getData(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("Wrong Password", $data->faultString); - } - - public function testRightPassword() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_acl->allow("testrole", null, null); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", ""); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertContains("hello", $resp[1]->getData()); - } - - // no ACL to allow access to this method - public function testNoAcl() - { - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", ""); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $data = $resp[1]->getData(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("not allowed", $data->faultString); - } - - // Class allows everybody to access, even though no ACL is defined - public function testNoClassAcl() - { - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", "", 'Zend_Amf_Auth_testclass_NoAcl'); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertContains("hello", $resp[1]->getData()); - } - - // Class-defined ACL - public function testClassAclAllowed() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole2")); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", "", 'Zend_Amf_Auth_testclass_Acl'); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertContains("hello", $resp[1]->getData()); - } - - // Class-defined ACL - public function testClassAclDenied() - { - $this->_server->setAuth(new RightPassword("testuser", "testrole2")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole2")); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", "", 'Zend_Amf_Auth_testclass_Acl'); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $data = $resp[1]->getData(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("not allowed", $data->faultString); - } - - // Class-defined ACL - public function testClassAclAllowed2() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new RightPassword("testuser", "testrole2")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole2")); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", "", 'Zend_Amf_Auth_testclass_Acl', 'hello2'); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertContains("hello", $resp[1]->getData()); - } - - public function testLogout() - { - Zend_Session::$_unitTestEnabled = true; - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_acl->addRole(new Zend_Acl_Role("testrole")); - $this->_acl->allow("testrole", null, null); - $this->_server->setAcl($this->_acl); - $resp = $this->_callServiceAuth("testuser", ""); - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertContains("hello", $resp[1]->getData()); - - // After logout same request should not be allowed - $this->setUp(); - $this->_server->setAuth(new RightPassword("testuser", "testrole")); - $this->_server->setAcl($this->_acl); - $request = new Zend_Amf_Request(); - $request->setObjectEncoding(0x03); - $this->_addLogout($request); - $this->_addServiceCall($request); - $this->_server->handle($request); - $resp = $this->_server->getResponse()->getAmfBodies(); - - $this->assertTrue($resp[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $data = $resp[1]->getData(); - $this->assertTrue($data instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("not allowed", $data->faultString); - } -} - -class WrongPassword extends Zend_Amf_Auth_Abstract -{ - public function authenticate() { - return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, - null, - array('Wrong Password') - ); - } -} - -class RightPassword extends Zend_Amf_Auth_Abstract -{ - public function __construct($name, $role) - { - $this->_name = $name; - $this->_role = $role; - } - public function authenticate() - { - $id = new stdClass(); - $id->role = $this->_role; - $id->name = $this->_name; - return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $id); - } -} - -class Zend_Amf_Auth_testclass { - function hello() { - return "hello!"; - } -} - -class Zend_Amf_Auth_testclass_Acl { - function hello() { - return "hello!"; - } - - function hello2() { - return "hello2!"; - } - - function initAcl(Zend_Acl $acl) { - $acl->allow("testrole", null, "hello"); - $acl->allow("testrole2", null, "hello2"); - return true; - } -} - -class Zend_Amf_Auth_testclass_NoAcl { - function hello() { - return "hello!"; - } - - function initAcl() { - return false; - } -} - -if (PHPUnit_MAIN_METHOD == "Zend_Amf_AuthTest::main") { - Zend_Amf_AuthTest::main(); -} - diff --git a/tests/Zend/Amf/Contact.php b/tests/Zend/Amf/Contact.php deleted file mode 100644 index 1bfdf10549..0000000000 --- a/tests/Zend/Amf/Contact.php +++ /dev/null @@ -1,46 +0,0 @@ -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 UH)Q{ztJdbdiF^8+0QdWU05-N2&Hw-a diff --git a/tests/Zend/Amf/Request/longstring.bin b/tests/Zend/Amf/Request/longstring.bin deleted file mode 100644 index 6b03e2c962..0000000000 --- a/tests/Zend/Amf/Request/longstring.bin +++ /dev/null @@ -1 +0,0 @@ -001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \ No newline at end of file diff --git a/tests/Zend/Amf/Request/mock/arrayAmf3Request.bin b/tests/Zend/Amf/Request/mock/arrayAmf3Request.bin deleted file mode 100644 index 4adc5e519101cfef0c6c32bd2a67eb73d8f18369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmXZV!D@p*5C-7gu1wKVBuL1i&tMu&lQhRzEeI`zBrjmxiCxfL*}?CP4_JjQ+Sy@4j)Pw;WB@q6B&F-0Y0^}nH+@3B#~m-n&4d!ssCVxU^o zg%wIp%37ebIiGPf{o#mHD;hkiH}Qr3Cl(yF2?jE@XxiZK3+CKCDSm-quR6((TC_0J zXge);S{D}z?iD3>h<8V)=^>N6RYF>L7&Po>jBa|!IowK7Q-?sl*v9elb+Zju(IyI$ nB#FXZyk3M!_OyD*(&ajP-nxvsJ_S|)I{_D+LBxI9q!P(P{wC=0O(=eg*~|;bEO5Mq7f1;s0|3+K2#f## diff --git a/tests/Zend/Amf/Request/mock/boolFalseAmf3Request.bin b/tests/Zend/Amf/Request/mock/boolFalseAmf3Request.bin deleted file mode 100644 index 62463d872405721126f54dcf2982c9d451a745d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmXX;-AcnS7)`bkX+>m&;)TzUIjw8gOJ_PLOoVMOP?ygcNWYXc74^=i_SUv~ap3%u zDItWC06SyI#qHq5EYT#pDL)%s-ji-MG?R*Ed^}X{nM!;fm$}ozqzE3sjBO=-Krbpb|Ys8OnXB*coa=1H#JXI$g@e{ewueMIw^Nd?jSIxfL== UWwA=~BF_pMPU(b&!%aYb0meB{XaE2J diff --git a/tests/Zend/Amf/Request/mock/boolTrueAmf0Request.bin b/tests/Zend/Amf/Request/mock/boolTrueAmf0Request.bin deleted file mode 100644 index 831803964ab1355d7b604c04bc0e4b36969e1dd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 tcmZQz00Kq^k)Zt2yp)il%mTfl)RNMoJg5Bp90n$RL!c}>7f1;sBLLIr2#o*$ diff --git a/tests/Zend/Amf/Request/mock/boolTrueAmf3Request.bin b/tests/Zend/Amf/Request/mock/boolTrueAmf3Request.bin deleted file mode 100644 index ab50be95577433a98b5fd0c8965e564e070c9ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmXX;-AcnS7)@-6v?4M}@xo`w+}gG1<+fBPD8jZEsLSUJq+d#sihAc$duv<0IB@<+ zKnS5E#9nK1cAE|ACmyX?{GB|%YWSG9;9PT3c=~7H<~wMOADpKtg2Z%S8?OvrI@8-D zT)jaf!Men&VeOl?Oa5Mx}<<8*8v%%ge-mRj(=#f>qVB|Foj zJXqDm7c>?73T0;$dUo>#DEWX%Mq*z}c8*HZkg$50ZL4MWAb25G8@{f}1-~ouH5YlA T=l4aPm8%7f0vfPrya~xK#ko*5 diff --git a/tests/Zend/Amf/Request/mock/byteArrayAmf3Request.bin b/tests/Zend/Amf/Request/mock/byteArrayAmf3Request.bin deleted file mode 100644 index 49421c10a5032aaa65affa106ac554b724d43164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25431 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 diff --git a/tests/Zend/Amf/Request/mock/intAmf0Request.bin b/tests/Zend/Amf/Request/mock/intAmf0Request.bin deleted file mode 100644 index 258454c7004c1d7de90ba3c353fe9639454abca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50 xcmZQz00Kq^k)Zt2yp)il%mTfl)RNMoJeS0hR0bw}L!c}l7g&ko29Qz)1^^YW33UJf diff --git a/tests/Zend/Amf/Request/mock/largeIntAmf3Request.bin b/tests/Zend/Amf/Request/mock/largeIntAmf3Request.bin deleted file mode 100644 index f2d44625bdf47fc3ff18a0dbc4047fd6c3fb2624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmXYp(MrQG6owO5Dy@i&Fud>?GS@L|b}8)!1x48Q0(CjgKzdS=RMb14%=hx9rqzoB z=l{NQelj71P!eIMH95OohV+vTXqtYprxy+H^9G!&PYO@}8@Txn8sh_b92GFrf~~zW zcSaFf( Zf@h*!@FKe_vh6ZRu}LO0`tJLl{sOwQQ@{WK diff --git a/tests/Zend/Amf/Request/mock/mixedArrayAmf0Request.bin b/tests/Zend/Amf/Request/mock/mixedArrayAmf0Request.bin deleted file mode 100644 index 74a33fb229865ac43c74c9413a54dcbe83f467b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmZQz00Kq^v7r3Yyp)il%mTfl)RNMoJpZJu)Z`KdCVfMoydoD!5eJZ9Vqh*Q&xeo< OjD|o)eqJgA11A6=0S&qU diff --git a/tests/Zend/Amf/Request/mock/nullAmf0Request.bin b/tests/Zend/Amf/Request/mock/nullAmf0Request.bin deleted file mode 100644 index a0e92a1c841e8a89ee8a04eaf860f8ef6e758c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42 scmZQz00Kq^k)Zt2yp)il%mTfl)RNMoJipSM90n$RL!c}h7f1;!0L*3xo&W#< diff --git a/tests/Zend/Amf/Request/mock/numberAmf0Request.bin b/tests/Zend/Amf/Request/mock/numberAmf0Request.bin deleted file mode 100644 index 4a2e218955ae71a8042e16178bd10ee7a0da3a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmZQz00Kq^v7r3Yyp)il%mTfl)RNMoJipT1q|_n?CVfMoJRcWWk%Rrj*R66pf&fJl B4H*Cc diff --git a/tests/Zend/Amf/Request/mock/numberAmf3Request.bin b/tests/Zend/Amf/Request/mock/numberAmf3Request.bin deleted file mode 100644 index ed6289274b2f71dc5951623166c09c612c776388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmXYq-Acni5QTSbTuDTvgd!sN2C1YZ4ZYGdT_NBPqQh+w> zT!U>jKD6}~H1iA9qS$EJxFdRabN%)6dHG#Xhd6|}?|_2kNfgbq1y6!-k;VaEF2mq< po~8kxWpS4AFpT2FJErbxoeOq^vYM>c97UrfT6WR@2)Y>}{RN~vR2TpN diff --git a/tests/Zend/Amf/Request/mock/objectAmf0Request.bin b/tests/Zend/Amf/Request/mock/objectAmf0Request.bin deleted file mode 100644 index 4d9993606b6b83975f20c174c9335d67006da22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmZQz00Kq^v7r3Yyp)il%mTfl)RNMoJpZJu)Z`KdCVeBIyfha`5ihSzzG1+w+z7m diff --git a/tests/Zend/Amf/Request/mock/objectFirstParamRequest.bin b/tests/Zend/Amf/Request/mock/objectFirstParamRequest.bin deleted file mode 100644 index 293e0731374bbc422078fad3020c3f12aa46b616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmZQzW?*1oWDpL@FU?B{DatI+D=E+SPs&P7E@5EOHv~#5asde@K`w4a<|H=uq{JfT TL^k%c{Cq|Rhshp5DFy}r-3ScK diff --git a/tests/Zend/Amf/Request/mock/referenceAmf0Request.bin b/tests/Zend/Amf/Request/mock/referenceAmf0Request.bin deleted file mode 100644 index 8e28dbf63edc1ffcc2026979380dce21b44fd34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmWNH+X;X$5Cr!wf@lXep`?{y19@B^KZzU$+xPZk7?=fYgd>dE%dPD>Ro$7iZb4yDaY<=ec|~Ov0AaEd?EnA( diff --git a/tests/Zend/Amf/Request/mock/stringAmf3Request.bin b/tests/Zend/Amf/Request/mock/stringAmf3Request.bin deleted file mode 100644 index d5bc19e758550b20dafe858dd64e15311d4fcedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmXYqQEP)R9K_=)89K)3q>Qo8V5ee7eQaw5VPjDH1+4kkW{ZhSV%PR<-+a;S;o$Cf zaEC?+Aq&~OV+>tAM<(36JsP_|-us@xY1)8NWleeg??6pA&nx3q%C$Xz=@6A8*7plYff50xyDaD^^Jz;q=lKd=9F1B!uc#*r$P8K_v0Xq{dg8; q{$iOd{8f-d^C-=dY?V4A3y0;dBCxLy^y8B??Uz)#JAR+e7wZ=v&|2{T diff --git a/tests/Zend/Amf/Request/mock/typedObjectAmf0Request.bin b/tests/Zend/Amf/Request/mock/typedObjectAmf0Request.bin deleted file mode 100644 index ec414a2b531f940815af0a58d1a431f2457c19d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmXwzOA5j;7=*`AizzMy!CSPFcmcr!6hz$rO(I0{keDKPdJ~G@Vm9+&fWiugYn+3= zCHoqZ$#V+h^fW4i9YyiKT@CHPFEM0N`95Of=$!+3!_ZO+(P^xWC+isYAJXPrWibX7 gJz5_p>q>engy^M|{iy(Ebv>}aA2$6*o7xBX5A(<;_W%F@ diff --git a/tests/Zend/Amf/Request/mock/undefAmf3Request.bin b/tests/Zend/Amf/Request/mock/undefAmf3Request.bin deleted file mode 100644 index 2cf3bb61df9ca9c413968d393b28cdb9e758efe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmXYqK}*9x5QR53tRx~*Lh;apzhG+{H`S|6QV1wQTYo_8OzT228+JEhz4^aAm_!f5 zd+!@&9vd;nJmyndRqX6G?$S@#qjC5hy&Nk1oYiP;c~o@#cW7rDthMXN^RU85H)u+y zG+kQVnmq<@8cySVrI1_!6Q^q2=_mDpQE#m)>*g9dRWw{he-&83)jO7e#_}73t~K;Z zfCohgJlg1%U}sblj6CM~%x66KLIPgM{4P(IQi}NDJ`u@sB}KMa%taoj>$yzwEPY&s c7haHU3*hIZs!6uZ2^y`)@oE1<{9 diff --git a/tests/Zend/Amf/Request/mock/xmlAmf3Request.bin b/tests/Zend/Amf/Request/mock/xmlAmf3Request.bin deleted file mode 100644 index a61c4dbf110d02096b3fe3c4f55c05df6b908b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmXYr(M!WH5XMtiBJB_varofN{(-D@I%%;Krs<%d2-_Zft;@Lu(j=s*sBiw~w$+D& z`+nbjcZWs@ArJYgl@gsqi%wjGJ(`3+qGG$n#(U(FSbg zgjQ#bZtWhOR0-+%2$%8WvRFS{r}U1kZz+q@ un6A_request = new Zend_Amf_Request(); - } - - /** - * Teardown environment - */ - public function tearDown() - { - unset($this->_request); - } - - /** - * ActionScript undef to PHP null - * - */ - public function testAmf3RemoteObjectUndefParameterDeserializedToNativePhpNull() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/undefAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recievedpbs - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnUndefined', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP null - $this->assertTrue(is_null($data[0])); - } - - /** - * ActionScript String to PHP String - * - */ - public function testAmf3RemoteObjectStringParameterDeserializedToNativePhpString() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/stringAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnString', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP string - $this->assertTrue(is_string($data[0])); - // Make sure that the string was deserialized properly and check its value - $this->assertEquals('abcdefghijklmpqrstuvwxyz', $data[0]); - } - - /** - * ActionScript Array to Php Array - * - */ - public function testAmf3RemoteObjectArrayParameterDeserializedToNativePhpArray() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/arrayAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnArray', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP array - $this->assertTrue(is_array($data[0])); - // Make sure that the array was deserialized properly and check its value - $this->assertEquals('a', $data[0][0]); - $this->assertEquals('g', $data[0][6]); - } - - /** - * ActionScript Numnber to PHP float - * - */ - public function testAmf3NumberParameterDeserializedToNativePhpFloat() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/numberAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnNumber', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP float - $this->assertTrue(is_float($data[0])); - // Make sure that the float was deserialized properly and check its value - $this->assertEquals(31.57, $data[0]); - } - - /** - * ActionScript Date to Php DateTime - * - */ - public function testAmf3DateParameterDeserializedToNativeDateTime() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/dateAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnDate', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that the array was deserialized properly and check its value - $this->assertEquals(1978, $data[0]->toString('Y')); - - } - - /** - * Try and read in the largest Amf Integer to PHP int - * - */ - public function testAmf3LargeIntParameterDeserializedToNativePhpInt() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/largeIntAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnInt', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP array - $this->assertTrue(is_int($data[0])); - // Make sure that the array was deserialized properly and check its value - $this->assertEquals(268435455, $data[0]); - } - - /** - * Read boolean true and convert it to php boolean true - * - */ - public function testAmf3BoolTrueParameterDeserializedToNativePhpBool() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/boolTrueAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnBool', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP array - $this->assertTrue(is_bool($data[0])); - // Make sure that the Bool was deserialized properly and check its value - $this->assertEquals(true, $data[0]); - } - - /** - * Convert boolean false to php boolean false. - * - */ - public function testAmf3BoolFalseParameterDeserializedToNativePhpBool() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/boolFalseAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnBool', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP array - $this->assertTrue(is_bool($data[0])); - // Make sure that the Bool was deserialized properly and check its value - $this->assertEquals(false, $data[0]); - } - - public function testAmf3XmlParameterDeserializedToNativePhpSimpleXml() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/xmlAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure the encoding type is properly set. - $this->assertEquals(0x03, $this->_request->getObjectEncoding()); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $message = $bodies[0]->getData(); - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage); - // Make sure that our endpoint is properly set. - $this->assertEquals('returnXml', $message->operation); - $this->assertEquals('RoundTrip', $message->source); - $data = $message->body; - // Make sure that we are dealing with a PHP simpleXml element - $this->assertTrue($data[0] instanceof SimpleXMLElement); - // Make sure that the xml was deserialized properly and check its value - $this->assertEquals('hello', (string) $data[0]->p); - } - - public function testAmf3ByteArrayDeserializedToNativePhpString() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/byteArrayAmf3Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $requestBody = $this->_request->getAmfBodies(); - $this->assertTrue($requestBody[0] instanceof Zend_Amf_Value_MessageBody); - $data = $requestBody[0]->getData(); - // Make sure that we are dealing with a PHP string - $this->assertTrue(is_string($data[0])); - // Make sure that the string was deserialized properly and check its value - $byteArray = file_get_contents(dirname(__FILE__) .'/Request/bytearray.bin'); - $this->assertEquals($byteArray, $data[0]); - } - - /** - * Actionscript String to PHP String - * - */ - public function testAmf0StringParameterDeserializedToNativePhpString() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/stringAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $requestBody = $this->_request->getAmfBodies(); - $this->assertTrue($requestBody[0] instanceof Zend_Amf_Value_MessageBody); - $this->assertEquals('RoundTrip.returnString', $requestBody[0]->getTargetURI()); - $data = $requestBody[0]->getData(); - // Make sure that we are dealing with a PHP string - $this->assertTrue(is_string($data[0])); - // Make sure that the string was deserialized properly and check its value - $this->assertEquals('abcdefghijklmpqrstuvwxyz', $data[0]); - } - - /** - * ActionScript Object to PHP Object for Amf0 - * - */ - public function testAmf0ObjectParameterDeserializedToNativePhpObject() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/objectAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that we are dealing with a PHP string - // Make sure that the string was deserialized properly and check its value - $this->assertEquals('foo', $data[0]->a); - $this->assertEquals('bar', $data[0]->b); - } - - /** - * Test to make sure that a generic object as the first paramater does not crash - * @group ZF-5346 - */ - public function testAmf0ObjectFirstParameter() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/objectFirstParamRequest.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that we are dealing with a PHP string - // Make sure that the string was deserialized properly and check its value - $this->assertEquals('foo', $data[0]->a); - $this->assertEquals('bar', $data[0]->b); - $this->assertEquals(1234, $data[1]); - } - - /** - * ActionScript Mixed Array to PHP Object for Amf0 - * - */ - public function testAmf0MixedArrayParameterDeserializedToNativePhpObject() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/mixedArrayAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(array_key_exists(1, $data[0])); - $this->assertEquals('two', $data[0]->two); - } - - /** - * ActionScript Numnber to PHP float - * - */ - public function testAmf0NumberParameterDeserializedToNativePhpFloat() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/numberAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(is_float($data[0])); - $this->assertEquals(31.57, $data[0]); - } - - /** - * ActionScript Date to PHP DateTime - * - */ - public function testAmf0DateParameterDeserializedToNativePhpDateTime() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/dateAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertEquals(10, $data[0]->toString('M')); - $this->assertEquals(1978, $data[0]->toString('Y')); - } - - /** - * ActionScript Integer to PHP int - * - */ - public function testAmf0IntParameterDeserializedToNativePhpint() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/intAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertEquals(268435456, $data[0]); - } - - /** - * Convert an Amf0 boolean true to php boolean - * - */ - public function testAmf0BoolTrueParameterDeserializedToNativePhpBool() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/boolTrueAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(is_bool($data[0])); - $this->assertEquals(true, $data[0]); - } - -/** - * Convert an Amf0 boolean false to php boolean - * - */ - public function testAmf0BoolFalseParameterDeserializedToNativePhpBool() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/boolFalseAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(is_bool($data[0])); - $this->assertEquals(false, $data[0]); - } - - public function testAmf0NullDeserializedToNativePhpNull() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/nullAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(is_null($data[0])); - } - - public function testAmf0UndefinedDeserializedToNativePhpNull() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/undefinedAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that the string was deserialized properly and check its value - $this->assertTrue(is_null($data[0])); - } - - public function testAmf0XmlParameterDeserializedToNativePhpSimpleXml() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/xmlAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that we are dealing with a PHP simpleXml element - $this->assertTrue($data[0] instanceof SimpleXMLElement); - // Make sure that the xml was deserialized properly and check its value - $this->assertEquals('hello', (string) $data[0]->p); - } - - public function testAmf0ReferenceDeserialized() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/referenceAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that we are dealing with a PHP a number - // Make sure that the xml was deserialized properly and check its value - $this->assertEquals('foo', (string) $data[0]->a); - } - - public function testAmf0TypedObjecDeserializedToNativePHPObject() - { - Zend_Amf_Parse_TypeLoader::setMapping("ContactVO","Contact"); - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/typedObjectAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(0 , sizeof($this->_request->getAmfHeaders())); - // Make sure that the message body was set after deserialization - $this->assertEquals(1, sizeof($this->_request->getAmfBodies())); - $bodies = $this->_request->getAmfBodies(); - $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody); - $data = $bodies[0]->getData(); - // Make sure that we are dealing with a PHP simpleXml element - $this->assertTrue($data[0] instanceof Contact); - // Make sure that the xml was deserialized properly and check its value - $this->assertEquals('arnold', (string) $data[0]->lastname); - } - - public function testAmf0TypedObjecDeserializedToNativePHPObjectUnknownType() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/bogusTypedObjectAmf0Request.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - - $requestBodies = $this->_request->getAmfBodies(); - $messageBody = reset($requestBodies); - $data = $messageBody->getData(); - $dataObject = reset($data); - - $this->assertEquals('stdClass', get_class($dataObject)); - } - - /** - * Test Amf0 credentials sent to the server - * - */ - public function testAmf0CredentialsInHeader() - { - $myRequest = file_get_contents(dirname(__FILE__) .'/Request/mock/credentialsheaderAmf0.bin'); - // send the mock object request to be deserialized - $this->_request->initialize($myRequest); - // Make sure that no headers where recieved - $this->assertEquals(1 , sizeof($this->_request->getAmfHeaders())); - $requestHeaders = $this->_request->getAmfHeaders(); - $this->assertTrue($requestHeaders[0] instanceof Zend_Amf_Value_MessageHeader); - $this->assertEquals('Credentials', $requestHeaders[0]->name); - $this->assertFalse($requestHeaders[0]->mustRead); - $data = $requestHeaders[0]->data; - // Check the resulting header - $this->assertEquals('admin', $data->userid); - $this->assertEquals('pw123', $data->password); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_RequestTest::main') { - Zend_Amf_RequestTest::main(); -} - diff --git a/tests/Zend/Amf/ResourceTest.php b/tests/Zend/Amf/ResourceTest.php deleted file mode 100755 index 6e81fb451e..0000000000 --- a/tests/Zend/Amf/ResourceTest.php +++ /dev/null @@ -1,196 +0,0 @@ -_server = new Zend_Amf_Server(); - $this->_server->setProduction(false); - Zend_Amf_Parse_TypeLoader::resetMap(); - } - - protected function tearDown() - { - unset($this->_server); - } - - protected function _callService($method, $class = 'Zend_Amf_Resource_testclass') - { - $request = new Zend_Amf_Request(); - $request->setObjectEncoding(0x03); - $this->_server->setClass($class); - $newBody = new Zend_Amf_Value_MessageBody("$class.$method","/1",array("test")); - $request->addAmfBody($newBody); - $this->_server->handle($request); - $response = $this->_server->getResponse(); - return $response; - } - - public function testFile() - { - $resp = $this->_callService("returnFile"); - $this->assertContains("test data", $resp->getResponse()); - } - - /** - * Defining new unknown resource type - * - * @expectException Zend_Amf_Server_Exception - * - */ - public function testCtxNoResource() - { - try { - $this->_callService("returnCtx"); - } catch(Zend_Amf_Server_Exception $e) { - $this->assertContains("serialize resource type", $e->getMessage()); - return; - } - $this->fail("Failed to throw exception on unknown resource"); - } - - /** - * Defining new unknown resource type via plugin loader and handling it - * - */ - public function testCtxLoader() - { - Zend_Amf_Parse_TypeLoader::addResourceDirectory("Test_Resource", dirname(__FILE__)."/Resources"); - $resp = $this->_callService("returnCtx"); - $this->assertContains("Accept-language:", $resp->getResponse()); - $this->assertContains("foo=bar", $resp->getResponse()); - } - - /** - * Defining new unknown resource type and handling it - * - */ - public function testCtx() - { - Zend_Amf_Parse_TypeLoader::setResourceLoader(new Zend_Amf_TestResourceLoader("2")); - $resp = $this->_callService("returnCtx"); - $this->assertContains("Accept-language:", $resp->getResponse()); - $this->assertContains("foo=bar", $resp->getResponse()); - } - - /** - * Defining new unknown resource type, handler has no parse() - * - */ - public function testCtxNoParse() - { - Zend_Amf_Parse_TypeLoader::setResourceLoader(new Zend_Amf_TestResourceLoader("3")); - try { - $resp = $this->_callService("returnCtx"); - } catch(Zend_Amf_Server_Exception $e) { - $this->assertContains("Could not call parse()", $e->getMessage()); - return; - } - $this->fail("Failed to throw exception on unknown resource"); - } - -} - -class Zend_Amf_Resource_testclass { - function returnFile() - { - return fopen(dirname(__FILE__)."/_files/testdata", "r"); - } - function returnCtx() - { - $opts = array( - 'http'=>array( - 'method'=>"GET", - 'header'=>"Accept-language: en\r\n" . - "Cookie: foo=bar\r\n" - ) - ); - $context = stream_context_create($opts); - return $context; - } -} - -class StreamContext2 -{ - public function parse($resource) - { - return stream_context_get_options($resource); - } -} -class StreamContext3 -{ - protected function parse($resource) - { - return stream_context_get_options($resource); - } -} -class Zend_Amf_TestResourceLoader implements Zend_Loader_PluginLoader_Interface { - public $suffix; - public function __construct($suffix) { - $this->suffix = $suffix; - } - public function addPrefixPath($prefix, $path) {} - public function removePrefixPath($prefix, $path = null) {} - public function isLoaded($name) {} - public function getClassName($name) {} - public function load($name) { - return $name.$this->suffix; - } -} - -if (PHPUnit_MAIN_METHOD == "Zend_Amf_ResourceTest::main") { - Zend_Amf_ResourceTest::main(); -} - diff --git a/tests/Zend/Amf/Resources/StreamContext.php b/tests/Zend/Amf/Resources/StreamContext.php deleted file mode 100755 index fe87b2399e..0000000000 --- a/tests/Zend/Amf/Resources/StreamContext.php +++ /dev/null @@ -1,37 +0,0 @@ -assertFalse($req->isIeOverSsl()); - } - -} - -/** - * Expose Zend_Amf_Response_Http::isIeOverSsl for testing - * @see ZF-11783 - */ -class ZF11783_ExposeIsIeOverSsl extends Zend_Amf_Response_Http -{ - public function isIeOverSsl() { - return parent::isIeOverSsl(); - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_Response_HttpTest::main') { - Zend_Amf_Response_HttpTest::main(); -} - - diff --git a/tests/Zend/Amf/Response/mock/arrayAmf0Response.bin b/tests/Zend/Amf/Response/mock/arrayAmf0Response.bin deleted file mode 100644 index cc596e4815dbf6b12b2ca465e34301de2a3929f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58 zcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYzy%a%XJTMX2jVm!P6gr=AWjD2Bp^-%0A#HS A)&Kwi diff --git a/tests/Zend/Amf/Response/mock/arrayAmf3Response.bin b/tests/Zend/Amf/Response/mock/arrayAmf3Response.bin deleted file mode 100644 index 772e3bfa62cdaa6f1c5cc5ee383b083156292bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmXYpT}#6-7==?Jfo&IK3=#1+WJ{Cg>oRLQDCmvo59peAHQ2S%)~`!{xz_2qdN}9s zAdC=-&|=HCU3(A1YcnGBJ!Lij!jH!WJ~k&9hO!QA{ZBA#T=m>`?+y4G?#?URR9)Xg zQ;wl)3%{zG0PR@#D-XjM+H<}B6G7qEW0-g>PcN6h^w8agH&{MF>7gHHht7YJA`{9= zB_!2?87idX)Fd*d%!D4U|0h>eVGL<*iOlj%w3 zl*wtvC!=*~dcLXsF3obT$aTyUshQS^VC(|T7g01@Mg-Rc9|;D6J;4>h2ZGBV2X<8t diff --git a/tests/Zend/Amf/Response/mock/boolFalseAmf0Response.bin b/tests/Zend/Amf/Response/mock/boolFalseAmf0Response.bin deleted file mode 100644 index 85bc0b77ac923c89c2b2f78b124e5b6a6621c68a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27 fcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYz{mgqM!^U5 diff --git a/tests/Zend/Amf/Response/mock/boolFalseAmf3Response.bin b/tests/Zend/Amf/Response/mock/boolFalseAmf3Response.bin deleted file mode 100644 index ccbf7dcf7a1855913ee6b75f662c4a3a93080cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmXYp%TB{E5Jeq|BGE2TRUw4<2DgqMv9okuk|o$6_<#@(AtH59VqQzW9NfZLote3J z&;lV8q1BG=Mt2AE+u#xU39Ogji-)HHKDT?A=cemj_ir$7b^GGRj{$54x5q17x8pRy z(D;6I#;)6;2j`8wv@rYL9oL(`M_}y6_rZO$f4w-^{dm*A!}&8b7N+^^akO8t$qG>t zsU((+B$zW=;kx8CCYefAqDfUT5*wilS}IO(l?sYgsueDBsWCag6Q#B0QEVt7jLCwB kHltXUsls_q!x#`%UWz&s@l`^(kRh35gq)(~DvC~i0f(`^de6s0%Iyv{; zi(-UOgqGWM>+C)F_c0)Jm}j;4i65Uw_}c8j`?eo!|4-mIs(ZEWa|F}F-DwLqotq{Y z+b}rWm{m6pU_)cB4EQkElV1Nlg2t@FFmq`4Z9$UDZsab43U#Wvy{3xt;?eaix{QvnEXFLRNxCNt4%7DXME+ iG0w1_J*H_{oHEXHn)01Uu4&40e!R;FIYWzO6ve-)cv3F_ diff --git a/tests/Zend/Amf/Response/mock/classMapAmf3Response.bin b/tests/Zend/Amf/Response/mock/classMapAmf3Response.bin deleted file mode 100644 index c7a90e1b2175d1ddc8943f954d3447f0759be435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmXYtQBT4!6ot1aHLw^%h%v+`e?XzzTG-wgg(Wi@6H(vGdV%V;nzf2P`pb0#&&&OC z&dI&Wbxs_|aUE|QjCJ)0=A*EV^V_K3`#E{u6!0}F!5Fbs)%KsjjFSAV()$AB7VZxz zT<5y3p%7N-DwF-ZP*B-SUP&-kRR?=;Tm+dMSkE6i*gxiIX6RFbkK>vPS+Q2?_O6H1q??nx@YfA*W8ybKP#o?X3n}S61Zq<)NeG zV54edD^Wtf5J&K!6skBc^;#8xIzB^Zw;GVQDwW-#n^)7$nUH!7qgZ+2P;YPgO@5#<=zdyf z@0EiV2%!M2wruPA8yH_YkI>JQ_3~?R_t3$6w1aW1Tidt)1Y?vnPrZBVz_f5RuW;VD zVSujo*7cQHH=TvvSLW2f=xsmOo4-d;nT@v-`+E0$vZq^jXoQN{RT1bUuoO4W+&`F$-xZp)tF-?+~DUJ(C3oPhlO?QgPK0J)Flok@JjFhvM(zqZhmEjp>Ny?QHG$!N#EmuKs806Pc{{4y2FM9P<3;+NC diff --git a/tests/Zend/Amf/Response/mock/domdocumentAmf3Response.bin b/tests/Zend/Amf/Response/mock/domdocumentAmf3Response.bin deleted file mode 100644 index e6537ab026f3383b157f329ed8e69691717ae535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmX|+PfNo<5XCnr0n>w&A|hU-7f;*lZkkOBYs%&y1oR^M0n%oyp_{BEX>E`Fg(o6Z~D31!u2QQ1vKr| zLKk~83rR>4*LScheS&?)LmaV~;+T7qJ26Y$gqm3oK8@25r!w+!;&2~3jC+{$;xisg z*GUaCn>yU_sgyYKBZ_CJkLqnPh1^|0+9 u>ytf=>4c2ufh8KPyFh?~s?QmSHSB|2*vBHax!ORm5cU~_{qM3*Th=eNB5vUT diff --git a/tests/Zend/Amf/Response/mock/intAmf0Response.bin b/tests/Zend/Amf/Response/mock/intAmf0Response.bin deleted file mode 100644 index 25d1451091d18426a2236207d24c080fdaa4d266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34 kcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYz~Hz6B*nl00EI&cs*3^w}E>|ZYq?%vy9VxKZCBc+#6yEYOQc*$)MWkj)S`*G? ori8?mDso&Mu$*yn!nhDcC9?F2vduP&K^kj{X7ePO{=`rG0qHtblmGw# diff --git a/tests/Zend/Amf/Response/mock/nestedArrayAmf0Response.bin b/tests/Zend/Amf/Response/mock/nestedArrayAmf0Response.bin deleted file mode 100644 index 9feb97f7e2e44b67ac6d764f10db482d2b20c3ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49 ycmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYz|6p!S(2Jt%mtKZVq#!S1mYwH22KDZcnbUg diff --git a/tests/Zend/Amf/Response/mock/nullAmf0Response.bin b/tests/Zend/Amf/Response/mock/nullAmf0Response.bin deleted file mode 100644 index a191158630dc14cc39240507b5801e0d13421335..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26 ecmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYzzP69&^ diff --git a/tests/Zend/Amf/Response/mock/numberAmf3Response.bin b/tests/Zend/Amf/Response/mock/numberAmf3Response.bin deleted file mode 100644 index 62b864be24a3d8e0486e3d85aed44bea6215f41b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmXYpK~BRk5JepoBGE2TRUw3sxPeXLOg_s)JBaduw=mjxD9vW z5MTm-@%3ir|3M>!P=F?jcwx;N`lrqz^zAhrzm0D0I(V6Hpzo`uHO)UkKbQ4`vCkdo z2CjxHoYr=`g|2d~HKm@`T?@vQ`dCBnS~IL?e~+NlGuL`{)#mZ&m#*z)yMx1fs5ET* zgIlX#!!pVl@mx5#Bl}bh< zLGvIiSwU5t@eKQv!cTmxanZ~_1b^b1G; diff --git a/tests/Zend/Amf/Response/mock/referenceObjectAmf3Response.bin b/tests/Zend/Amf/Response/mock/referenceObjectAmf3Response.bin deleted file mode 100644 index 1d519db1f97e55baddeb0aa545b6e69ebb54b60f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmXYr-AcnS9K};M3hORplp*3XWJ}YJC6_U2pr8mcAE0ag)@s*EllgJ!lWSK!S3k}< z91fZxggms|(rw>8fIYPip`TH!;CuG?)WYZH2-cQ$)7Ae3b|b3SuK#Gk)NnVYa9#Do z0Bz}-zAMbCY8&WWVJ;0=*L0H|{tZE4Lf4G!%H!MmO#A+}d54QiZYHP!IP<$NSRB)nST}0B#jtNVoJyy1xwEh!u5VUdVhF<%7p_|r@@X_gGDg^ E1)N)2umAu6 diff --git a/tests/Zend/Amf/Response/mock/sparseArrayAmf0Response.bin b/tests/Zend/Amf/Response/mock/sparseArrayAmf0Response.bin deleted file mode 100644 index 123029b8d7ff196b3e46fcab44fb6d4563ab3c60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51 zcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYzyXqAU^HZ6U{1@=XJ9l1GLjOD7#KJKBz_9; diff --git a/tests/Zend/Amf/Response/mock/stringAmf0Response.bin b/tests/Zend/Amf/Response/mock/stringAmf0Response.bin deleted file mode 100644 index b0b6a4a7b20fc6014d2791726be8a32c700a3f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYz{DU?RasG9R$5YAR9KLklbw~Bk)D>ClAM$X E0F`zUPyhe` diff --git a/tests/Zend/Amf/Response/mock/stringAmf3Response.bin b/tests/Zend/Amf/Response/mock/stringAmf3Response.bin deleted file mode 100644 index 4e4347cdffff4c92c4c2df02df867838425a9bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmXYpT}#6-7==?N1-A{SKRx5&_uyk$!*RL+Ym3S>)xUwAs&d`5hZ=MRuh$ix%C_sE zE}UtbT#w7zK;v@#pusxRTiId#m`H`_ z$38F(l*G?U^k+Rhku;7Y>OayTWLyeP1tB+RIPyH7o=?Zae&=lWwcXU~PqV6)pvy(^ E3r@vc&j0`b diff --git a/tests/Zend/Amf/Response/mock/stringKeyArrayAmf0Response.bin b/tests/Zend/Amf/Response/mock/stringKeyArrayAmf0Response.bin deleted file mode 100644 index c7d8217d92ffe807c102d98413232aa9faddcddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZQz00Kq^Zhb@j{Jfyl;?kTF28RDYz|6p$mY>hyAOcbV1k6c^MGOw+5Do(aCjfVx B3rYY0 diff --git a/tests/Zend/Amf/Response/mock/typedObjectAmf0Response.bin b/tests/Zend/Amf/Response/mock/typedObjectAmf0Response.bin deleted file mode 100644 index 4b32768336b5ccee6d5b48fa9d94cd6be583e61d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmajY%?g4*6b0bZl#%7a7co<_pPdo3Xd@J~A9ccs83&w+dixp|MM2QnoeSrFfK3mR zFbY+3VEQTy@UR)%JMrOeRbyyrPB{p#2uPH|J@ZzZhDt`z-z$cZps(&6B{wx3CMg#L z{zZ2^qm?Syv{Vv9sR}Oa(u?9Gn5T_response = new Zend_Amf_Response(); - } - - /** - * Teardown environment - */ - public function tearDown() - { - unset($this->_response); - } - - /** - * PHP String to Amf String - * - */ - public function testPhpStringSerializedToAmf3String() - { - // Create php object to serialize - $data = "zyxwvutsrqpmlkjihgfedcba"; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'C626EDB9-8CF4-C305-8915-096C8AA80E2E'; - $acknowledgeMessage->clientId = '49D6F1AF-ADFB-3A48-5B2D-00000A5D0301'; - $acknowledgeMessage->messageId = '5F58E888-58E8-12A9-7A85-00006D91CCB1'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124569861800'; - $acknowledgeMessage->body = $data; - - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI, null, $acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/stringAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - - /** - * PHP Arrat to Amf Array - * - */ - public function testPhpArraySerializedToAmf3Array() - { - // Create php object to serialize - $data = array("g", "f", "e","d","c","b","a"); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'D3695635-7308-35A2-8451-09F7CAAB868A'; - $acknowledgeMessage->clientId = '54A7E9A2-9C2A-9849-5A3D-000070318519'; - $acknowledgeMessage->messageId = '2E68D735-A68E-D208-9ACC-00006FBCDE26'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570774300'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI, null, $acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/arrayAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP float to Amf3 Number - * - */ - public function testPhpFloatSerializedToAmf3Number() - { - $data = 31.57; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '1D556448-6DF0-6D0B-79C7-09798CC54A93'; - $acknowledgeMessage->clientId = '03EB43E5-3ADA-0F69-DA96-00007A54194D'; - $acknowledgeMessage->messageId = '5E4C2B6B-ADAC-4C49-52B6-0000205BC451'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124569947000'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI, null, $acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/numberAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP DateTime to Amf Date - * - */ - public function testPhpDateTimeSerializedToAmf3Date() - { - // Create php object to serialize - date_default_timezone_set('America/Chicago'); - $dateSrc = '1978-10-23 4:20 America/Chicago'; - $date = new DateTime($dateSrc, new DateTimeZone('America/Chicago')); - $data = $date; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '77D952FE-47FA-D789-83B6-097D43403C6C'; - $acknowledgeMessage->clientId = '2D043296-C81C-7189-4325-000007D62DA1'; - $acknowledgeMessage->messageId = '2A686BAF-7D69-11C8-9A0F-0000513C0958'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124569971300'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/dateAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testZendDateTimeSerializedToAmf3Date() - { - // Create php object to serialize - $date = new Zend_Date('October 23, 1978', null, 'en_US'); - $date->set('4:20:00',Zend_Date::TIMES); - $data = $date; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '77D952FE-47FA-D789-83B6-097D43403C6C'; - $acknowledgeMessage->clientId = '2D043296-C81C-7189-4325-000007D62DA1'; - $acknowledgeMessage->messageId = '2A686BAF-7D69-11C8-9A0F-0000513C0958'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124569971300'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/dateAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Test the largest Integer that AS in can handle - * - */ - public function testPhpLargeIntSerializedToAmf3Int() - { - // Create php object to serialize - $data = 268435455; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '1D191AC2-8628-2C9A-09B2-0981CBCCF2CC'; - $acknowledgeMessage->clientId = '13D9DF0B-CCD0-1149-53D2-0000696908C2'; - $acknowledgeMessage->messageId = '03387968-E9BA-E149-A230-00006366BE67'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570001000'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/largeIntAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Convert boolean true to php boolean true - * - */ - public function testPhpBoolTrueSerializedToAmf3BoolTrue() - { - // Create php object to serialize - $data = true; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '45B8A430-A13A-FE86-D62F-098900BDF482'; - $acknowledgeMessage->clientId = '4000C9FB-C97B-D609-DBAA-000048B69D81'; - $acknowledgeMessage->messageId = '5F9AA1BF-D474-BB69-12C6-0000775127E8'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570048300'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/boolTrueAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Covert boolean false to PHP boolean false - * - */ - public function testPhpBoolFalseSerializedToAmf3BoolFalse() - { - // Create php object to serialize - $data = false; - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '9C5D0787-7301-432E-FD4F-098681A0EE30'; - $acknowledgeMessage->clientId = '5AC2D840-E652-86A8-CB7A-00000418AAA4'; - $acknowledgeMessage->messageId = '200337C4-0932-7D68-BB24-00005EBD5F95'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570031900'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/boolFalseAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * test case for taking a PHP typed object and sending it back to flex as - * a typed object. uses explicit type - * - */ - public function testPhpTypedObjectSerializedToAmf3TypedObjectExplicitType() - { - $data = array(); - - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'AF307825-478F-C4CA-AC03-09C10CD02CCC'; - $acknowledgeMessage->clientId = '702B4B03-89F5-34C8-1B4E-0000049466FA'; - $acknowledgeMessage->messageId = '704B88DF-6D5E-A228-53E3-00001DA3041F'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570415500'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/classMapAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Test case for taking a PHP typed object and sending it back to flex as - * a typed object. uses getAsClassName - * - */ - public function testPhpTypedObjectSerializedToAmf3TypedObjectGetAsClassName() - { - $data = array(); - - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'AF307825-478F-C4CA-AC03-09C10CD02CCC'; - $acknowledgeMessage->clientId = '702B4B03-89F5-34C8-1B4E-0000049466FA'; - $acknowledgeMessage->messageId = '704B88DF-6D5E-A228-53E3-00001DA3041F'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570415500'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/classMapAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * The feature test allows for php to just retun it's class name if nothing is specified. Using - * _explicitType, setClassMap, getASClassName() should only be used now if you want to override the - * PHP class name for specifying the return type. - * @group ZF-6130 - */ - public function testPhpObjectNameSerializedToAmf3ClassName() - { - $data = array(); - - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'AF307825-478F-C4CA-AC03-09C10CD02CCC'; - $acknowledgeMessage->clientId = '702B4B03-89F5-34C8-1B4E-0000049466FA'; - $acknowledgeMessage->messageId = '704B88DF-6D5E-A228-53E3-00001DA3041F'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124570415500'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/classMapAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Returning a DOMDocument object to AMF is serialized into a XMString ready for E4X - * - * @group ZF-4999 - */ - public function testPhpDomDocumentSerializedToAmf3XmlString() - { - $sXML = 'ab'; - $data = new DOMDocument(); - $data->preserveWhiteSpace = false; - $data->loadXML($sXML); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'B0B0E583-5A80-826B-C2D1-D67A63D2F5E1'; - $acknowledgeMessage->clientId = '3D281DFB-FAC8-E368-3267-0000696DA53F'; - $acknowledgeMessage->messageId = '436381AA-C8C1-9749-2B05-000067CEA2CD'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '122766401600'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/domdocumentAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Returning a SimpleXML object to AMF is serialized into a XMString ready for E4X - * - * @group ZF-4999 - */ - public function testSimpleXmlSerializedToAmf3XmlString() - { - $sXML = 'ab'; - $data = new DOMDocument(); - $data->preserveWhiteSpace = false; - $data->loadXML($sXML); - $data = simplexml_import_dom($data); - - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = 'B0B0E583-5A80-826B-C2D1-D67A63D2F5E1'; - $acknowledgeMessage->clientId = '3D281DFB-FAC8-E368-3267-0000696DA53F'; - $acknowledgeMessage->messageId = '436381AA-C8C1-9749-2B05-000067CEA2CD'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '122766401600'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/domdocumentAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Check to make sure that cyclic references work inside of the AMF3 serializer - * @group ZF-6205 - */ - public function testReferenceObjectsToAmf3() - { - $data = new ReferenceTest(); - $data = $data->getReference(); - - // Create an acknowlege message for a response to a RemotingMessage - $acknowledgeMessage = new Zend_Amf_Value_Messaging_AcknowledgeMessage(null); - $acknowledgeMessage->correlationId = '839B091C-8DDF-F6DD-2FF1-EAA82AE39608'; - $acknowledgeMessage->clientId = '21CC629C-58AF-2D68-A292-000006F8D883'; - $acknowledgeMessage->messageId = '05E70A68-FF7F-D289-1A94-00004CCECA98'; - $acknowledgeMessage->destination = null; - $acknowledgeMessage->timeToLive = 0; - $acknowledgeMessage->timestamp = '124518243200'; - $acknowledgeMessage->body = $data; - - $newBody = new Zend_Amf_Value_MessageBody($this->responseURI,null,$acknowledgeMessage); - - // serialize the data to an AMF output stream - $this->_response->setObjectEncoding(0x03); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/referenceObjectAmf3Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - - } - - - - /** - * PHP string to Amf0 string - * - */ - public function testPhpStringSerializedToAmf0String() - { - $data = "zyxwvutsrqpmlkjihgfedcba"; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/stringAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP Array to Amf0 Array - * - */ - public function testPhpArraySerializedToAmf0Array() - { - $data = array("g", "f", "e","d","c","b","a"); - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/arrayAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * Check to make sure that we can place arrays in arrays. - * - * @group ZF-4712 - */ - public function testPhpNestedArraySerializedToAmf0Array() - { - $data = array("items"=>array("a","b")); - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/nestedArrayAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - - } - - /** - * Allow sparse arrays to be retruned to Actionscript without loosing the keys. - * - * @group ZF-5094 - */ - public function testPhpSparseArraySerializedToAmf0Array() - { - $data = array(1 => 'foo', 5 => 'bar'); - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/sparseArrayAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - - } - - /** - * Test to convert string keyed arrays are converted to objects so that we do not loose - * the key refrence in the associative array. - * - * @group ZF-5094 - */ - public function testPhpStringKeyArrayToAmf0Object() - { - $data = array('foo' => 5, 'bar' => 23); - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/stringKeyArrayAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - - } - - /** - * PHP Object to Amf0 Object - * - */ - public function testPhpObjectSerializedToAmf0Object() - { - $data = array('b'=>'bar',"a" =>'foo'); - $data = (object) $data; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/objectAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testPhpObjectSerializedToAmf0TypedObjectClassMap() - { - Zend_Amf_Parse_TypeLoader::setMapping("ContactVO","Contact"); - - $data = array(); - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/typedObjectAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - - public function testPhpObjectSerializedToAmf0TypedObjectExplicitType() - { - $data = array(); - - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/typedObjectAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testPhpObjectSerializedToAmf0TypedObjectGetAsClassName() - { - $data = array(); - - $contact = new Contact(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - $contact = new Contact(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - unset($contact->_explicitType); - array_push( $data, $contact ); - - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/typedObjectAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * The feature test allows for php to just retun it's class name if nothing is specified. Using - * _explicitType, setClassMap, getASClassName() should only be used now if you want to override the - * PHP class name for specifying the return type. - * @group ZF-6130 - */ - public function testPhpObjectNameSerializedToAmf0ClassName() - { - $data = array(); - - $contact = new ContactVO(); - $contact->id = '15'; - $contact->firstname = 'Joe'; - $contact->lastname = 'Smith'; - $contact->email = 'jsmith@adobe.com'; - $contact->mobile = '123-456-7890'; - - array_push( $data, $contact ); - - $contact = new ContactVO(); - $contact->id = '23'; - $contact->firstname = 'Adobe'; - $contact->lastname = 'Flex'; - $contact->email = 'was@here.com'; - $contact->mobile = '123-456-7890'; - array_push( $data, $contact ); - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/typedObjectAmf0Response.bin'); - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP float to Amf0 Number - * - */ - public function testPhpFloatSerializedToAmf0Number() - { - $data = 31.57; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/numberAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP DateTime to Amf0 date - * - */ - public function testPhpDateTimeSerializedToAmf0Date() - { - date_default_timezone_set('America/Chicago'); - $dateSrc = '1978-10-23 4:20 America/Chicago'; - $date = new DateTime($dateSrc, new DateTimeZone('America/Chicago')); - $data = $date; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/dateAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testZendDateSerializedToAmf0Date() - { - $date = new Zend_Date('October 23, 1978', null, 'en_US'); - $date->set('4:20:00',Zend_Date::TIMES); - - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$date); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/dateAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP boolean true to Amf0 bool true. - * - */ - public function testPhpBoolTrueSerializedToAmf0Bool() - { - $data = true; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/boolTrueAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - /** - * PHP boolean true to Amf0 bool true. - * - */ - public function testPhpBoolFalseSerializedToAmf0Bool() - { - $data = false; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/boolFalseAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testPHPNullSerializedToAmf0Null() - { - $data = null; - $newBody = new Zend_Amf_Value_MessageBody('/1/onResult',null,$data); - $this->_response->setObjectEncoding(0x00); - $this->_response->addAmfBody($newBody); - $this->_response->finalize(); - $testResponse = $this->_response->getResponse(); - - // Load the expected response. - $mockResponse = file_get_contents(dirname(__FILE__) .'/Response/mock/nullAmf0Response.bin'); - - // Check that the response matches the expected serialized value - $this->assertEquals($mockResponse, $testResponse); - } - - public function testResponseShouldNotHaveMessageHeadersByDefault() - { - $headers = $this->_response->getAmfHeaders(); - $this->assertEquals(0, count($headers)); - } - - public function testResponseShouldAggregateMessageHeaders() - { - $this->header1 = new Zend_Amf_Value_MessageHeader('foo', false, 'bar'); - $this->header2 = new Zend_Amf_Value_MessageHeader('bar', true, 'baz'); - $this->_response->addAmfHeader($this->header1) - ->addAmfHeader($this->header2); - $headers = $this->_response->getAmfHeaders(); - $this->assertEquals(2, count($headers)); - $this->assertContains($this->header1, $headers); - $this->assertContains($this->header2, $headers); - } - - public function testResponseHeadersShouldBeSerializedWhenWritingMessage() - { - $this->testResponseShouldAggregateMessageHeaders(); - $this->_response->finalize(); - $response = $this->_response->getResponse(); - - $request = new Zend_Amf_Request(); - $request->initialize($response); - $headers = $request->getAmfHeaders(); - $this->assertEquals(2, count($headers)); - } - - public function testToStringShouldProxyToGetResponse() - { - $this->testResponseShouldAggregateMessageHeaders(); - $this->_response->finalize(); - $response = $this->_response->getResponse(); - - $test = $this->_response->__toString(); - $this->assertSame($response, $test); - } -} - -/* - * Used to test recursive cyclic references in the serializer. - *@group ZF-6205 - */ -class ReferenceTest { - public function getReference() { - $o = new TestObject(); - $o->recursive = new TestObject(); - $o->recursive->recursive = $o; - return $o; - } -} -/** - * @see ReferenceTest - */ -class TestObject { - public $recursive; -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_ResponseTest::main') { - Zend_Amf_ResponseTest::main(); -} - diff --git a/tests/Zend/Amf/ServerTest.php b/tests/Zend/Amf/ServerTest.php deleted file mode 100644 index 2440d7afe2..0000000000 --- a/tests/Zend/Amf/ServerTest.php +++ /dev/null @@ -1,1380 +0,0 @@ -_server = new Zend_Amf_Server(); - $this->_server->setProduction(false); - Zend_Amf_Parse_TypeLoader::resetMap(); - } - - public function tearDown() - { - unset($this->_server); - //Zend_Amf_Parse_TypeLoader::resetMap(); - } - - /** - * Call as method call - * - * Returns: void - */ - public function test__construct() - { - $this->assertTrue($this->_server instanceof Zend_Amf_Server); - } - - public function testIsProductionByDefault() - { - $this->_server = new Zend_Amf_Server; - $this->assertTrue($this->_server->isProduction()); - } - - public function testProductionFlagShouldBeMutable() - { - $this->testIsProductionByDefault(); - $this->_server->setProduction(false); - $this->assertFalse($this->_server->isProduction()); - $this->_server->setProduction(true); - $this->assertTrue($this->_server->isProduction()); - } - - public function testSetClass() - { - $this->_server->setClass('Zend_Amf_testclass', 'test'); - $methods = $this->_server->listMethods(); - $this->assertTrue(in_array('test.test1', $methods)); - $this->assertTrue(in_array('test.test2', $methods)); - $this->assertFalse(in_array('test._test3', $methods)); - $this->assertFalse(in_array('test.__construct', $methods)); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetClassShouldRaiseExceptionOnInvalidClassname() - { - $this->_server->setClass('foobar'); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetClassShouldRaiseExceptionOnInvalidClasstype() - { - $this->_server->setClass(array('foobar')); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetClassShouldRaiseExceptionOnDuplicateMethodName() - { - $this->_server->setClass('Zend_Amf_testclass', 'tc'); - $this->_server->setClass('Zend_Amf_testclassPrivate', 'tc'); - } - - /** - * ZF-5393 - */ - public function testSetClassUsingObject() - { - $testClass = new Zend_Amf_testclass(); - $this->_server->setClass($testClass); - $this->assertEquals(8, count($this->_server->getFunctions())); - } - - /** - * addFunction() test - * - * Call as method call - * - * Expects: - * - function: - * - namespace: Optional; has default; - * - * Returns: void - */ - public function testAddFunction() - { - try { - $this->_server->addFunction('Zend_Amf_Server_testFunction', 'test'); - } catch (Exception $e) { - $this->fail('Attachment should have worked'); - } - - $methods = $this->_server->listMethods(); - $this->assertTrue(in_array('test.Zend_Amf_Server_testFunction', $methods), var_export($methods, 1)); - - try { - $this->_server->addFunction('nosuchfunction'); - $this->fail('nosuchfunction() should not exist and should throw an exception'); - } catch (Exception $e) { - // do nothing - } - - $server = new Zend_Amf_Server(); - try { - $server->addFunction( - array( - 'Zend_Amf_Server_testFunction', - 'Zend_Amf_Server_testFunction2', - ), - 'zsr' - ); - } catch (Exception $e) { - $this->fail('Error attaching array of functions: ' . $e->getMessage()); - } - $methods = $server->listMethods(); - $this->assertTrue(in_array('zsr.Zend_Amf_Server_testFunction', $methods)); - $this->assertTrue(in_array('zsr.Zend_Amf_Server_testFunction2', $methods)); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testAddFunctionShouldRaiseExceptionForInvalidFunctionName() - { - $this->_server->addFunction(true); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testAddFunctionShouldRaiseExceptionOnDuplicateMethodName() - { - $this->_server->addFunction('Zend_Amf_Server_testFunction', 'tc'); - $this->_server->addFunction('Zend_Amf_Server_testFunction', 'tc'); - } - - /** - * Test sending data to the remote class and make sure we - * recieve the proper response. - * - */ - public function testHandleLoadedClassAmf0() - { - // serialize the data to an AMF output stream - $data[] = "12345"; - $this->_server->setClass('Zend_Amf_testclass'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_testclass.test1","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x00); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertEquals("String: 12345", $responseBody[0]->getData(), var_export($responseBody, 1)); - } - - public function testShouldAllowHandlingFunctionCallsViaAmf0() - { - // serialize the data to an AMF output stream - $data = array('foo', 'bar'); - $this->_server->addFunction('Zend_Amf_Server_testFunction'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_Server_testFunction","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x00); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertEquals("bar: foo", $responseBody[0]->getData(), var_export($responseBody, 1)); - } - - /** - * Test to make sure that AMF3 basic requests are handled for loading - * a class. - * This type of call is sent from NetConnection rather than RemoteObject - * - * @group ZF-4680 - */ - public function testHandleLoadedClassAmf3NetConnection() - { - // serialize the data to an AMF output stream - $data[] = "12345"; - $this->_server->setClass('Zend_Amf_testclass'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_testclass.test1","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertEquals("String: 12345", $responseBody[0]->getData(), var_export($responseBody, 1)); - - } - - /** - * Test to make sure that AMF3 basic requests are handled for function calls. - * This type of call is sent from net connection rather than RemoteObject - * - * @group ZF-4680 - */ - public function testShouldAllowHandlingFunctionCallsViaAmf3NetConnection() - { - // serialize the data to an AMF output stream - $data = array('foo', 'bar'); - $this->_server->addFunction('Zend_Amf_Server_testFunction'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_Server_testFunction","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertEquals("bar: foo", $responseBody[0]->getData(), var_export($responseBody, 1)); - } - - /** - * Test sending data to the remote class and make sure we - * recieve the proper response. - * - */ - public function testHandleLoadedClassAmf3() - { - // serialize the data to an AMF output stream - $data[] = "12345"; - $this->_server->setClass('Zend_Amf_testclass'); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'test1'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check the message body is the expected data to be returned - $this->assertEquals("String: 12345", $acknowledgeMessage->body); - } - - - /** - * Test to make sure that you can have the same method name in two different classes. - * - * @group ZF-5040 - */ - public function testSameMethodNameInTwoServices() - { - $this->_server->setClass('ServiceA'); - $this->_server->setClass('ServiceB'); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'getMenu'; - $message->source = 'ServiceB'; - $message->body = array(); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check the message body is the expected data to be returned - $this->assertEquals("myMenuB", $acknowledgeMessage->body); - } - - /** - * test command message. THis is the first call the Flex - * makes before any subsequent service calls. - */ - public function testCommandMessagePingOperation() - { - $message = new Zend_Amf_Value_Messaging_CommandMessage(); - $message->operation = 5; - $message->messageId = $message->generateId(); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check that the MessageID was not corrupeted when set to the correlationId - $this->assertEquals($acknowledgeMessage->correlationId, $message->messageId); - } - - public function testInvalidAmf0MessageShouldResultInErrorMessage() - { - // serialize the data to an AMF output stream - $data[] = "12345"; - $this->_server->setClass('Zend_Amf_testclass'); - $newBody = new Zend_Amf_Value_MessageBody("bogus","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x00); - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if (!is_array($data)) { - continue; - } - if (!array_key_exists('description', $data)) { - continue; - } - if (strstr($data['description'], 'does not exist')) { - $found = true; - break; - } - } - $this->assertTrue($found, 'Invalid method did not raise error condition' . var_export($bodies, 1)); - } - - public function testInvalidCommandMessageShouldResultInErrorMessage() - { - $message = new Zend_Amf_Value_Messaging_CommandMessage(); - $message->operation = 'pong'; - $message->messageId = $message->generateId(); - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - - // Now check if the return data was properly set. - $message = $responseBody[0]->getData(); - - // check that we have a message beening returned - $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_ErrorMessage); - } - - /** - * Add a class mapping and lookup the mapping to make sure - * the mapping succeeds - */ - public function testClassMap() - { - $this->_server->setClassMap('controller.test', 'Zend_Amf_testclass'); - $className = Zend_Amf_Parse_TypeLoader::getMappedClassName('Zend_Amf_testclass'); - $this->assertEquals('controller.test', $className); - } - - public function testDispatchingMethodShouldReturnErrorMessageForInvalidMethod() - { - // serialize the data to an AMF output stream - $data[] = "12345"; - $this->_server->setClass('Zend_Amf_testclass'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'bogus'; // INVALID method! - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ($data instanceof Zend_Amf_Value_Messaging_ErrorMessage) { - if (strstr($data->faultString, 'does not exist')) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Invalid method did not raise error condition: ' . var_export($bodies, 1)); - } - - public function testDispatchingMethodThatThrowsExceptionShouldReturnErrorMessageWhenProductionFlagOff() - { - // serialize the data to an AMF output stream - $data = array(); - $this->_server->setClass('Zend_Amf_testclass'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'throwException'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ($data instanceof Zend_Amf_Value_Messaging_ErrorMessage) { - if (strstr($data->faultString, 'should not be displayed')) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Method raising exception should display error message when not in production'); - } - - public function testDispatchingMethodThatThrowsExceptionShouldNotReturnErrorMessageWhenProductionFlagOn() - { - // serialize the data to an AMF output stream - $data = array(); - $this->_server->setClass('Zend_Amf_testclass') - ->setProduction(true); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'throwException'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ($data instanceof Zend_Amf_Value_Messaging_ErrorMessage) { - if (strstr($data->faultString, 'should not be displayed')) { - $found = true; - break; - } - } - } - $this->assertFalse($found, 'Method raising exception should not display error message when in production'); - } - - public function testDispatchingMethodShouldPassInvocationArgumentsToMethod() - { - // serialize the data to an AMF output stream - $data[] = "baz"; - $this->_server->setClass('Zend_Amf_testclass', '', 'foo', 'bar'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'checkArgv'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null, "/1" ,$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ('Zend_Amf_Value_Messaging_AcknowledgeMessage' == get_class($data)) { - if ('baz:foo:bar' == $data->body) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Valid response not found'); - } - - public function testServerShouldSeamlesslyInvokeStaticMethods() - { - // serialize the data to an AMF output stream - $data[] = "testing"; - $this->_server->setClass('Zend_Amf_testclass'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'checkStaticUsage'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null, "/1" ,$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ('Zend_Amf_Value_Messaging_AcknowledgeMessage' == get_class($data)) { - if ('testing' == $data->body) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Valid response not found'); - } - - public function testServerShouldSeamlesslyInvokeFunctions() - { - // serialize the data to an AMF output stream - $data[] = 'foo'; - $data[] = 'bar'; - $this->_server->addFunction('Zend_Amf_Server_testFunction'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'Zend_Amf_Server_testFunction'; - $message->source = null; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null, "/1" ,$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ('Zend_Amf_Value_Messaging_AcknowledgeMessage' == get_class($data)) { - if ('bar: foo' == $data->body) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Valid response not found'); - } - - public function testDispatchingMethodCorrespondingToClassWithPrivateConstructorShouldReturnErrorMessage() - { - // serialize the data to an AMF output stream - $data[] = "baz"; - $this->_server->setClass('Zend_Amf_testclassPrivate'); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'test1'; - $message->source = 'Zend_Amf_testclassPrivate'; - $message->body = $data; - - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null, "/1" ,$message); - $request = new Zend_Amf_Request(); - - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - - // let the server handle mock request - $result = $this->_server->handle($request); - $bodies = $result->getAmfBodies(); - $found = false; - foreach ($bodies as $body) { - $data = $body->getData(); - if ('Zend_Amf_Value_Messaging_ErrorMessage' == get_class($data)) { - if (strstr($data->faultString, 'Error instantiating class')) { - $found = true; - break; - } - } - } - $this->assertTrue($found, 'Method succeeded?'); - } - - public function testNotPassingRequestToHandleShouldResultInServerCreatingRequest() - { - $this->_server->setClass('Zend_Amf_testclass'); - ob_start(); - $result = $this->_server->handle(); - $content = ob_get_clean(); - $request = $this->_server->getRequest(); - $this->assertTrue($request instanceof Zend_Amf_Request_Http); - $bodies = $request->getAmfBodies(); - $this->assertEquals(0, count($bodies)); - $this->assertContains('Endpoint', $content); - } - - public function testSetRequestShouldAllowValidStringClassNames() - { - $this->_server->setRequest('Zend_Amf_Request'); - $request = $this->_server->getRequest(); - $this->assertTrue($request instanceof Zend_Amf_Request); - $this->assertFalse($request instanceof Zend_Amf_Request_Http); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetRequestShouldRaiseExceptionOnInvalidStringClassName() - { - $this->_server->setRequest('Zend_Amf_ServerTest_BogusRequest'); - } - - public function testSetRequestShouldAllowValidRequestObjects() - { - $request = new Zend_Amf_Request; - $this->_server->setRequest($request); - $this->assertSame($request, $this->_server->getRequest()); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetRequestShouldRaiseExceptionOnInvalidRequestObjects() - { - require_once 'Zend/XmlRpc/Request.php'; - $request = new Zend_XmlRpc_Request; - $this->_server->setRequest($request); - } - - public function testSetResponseShouldAllowValidStringClassNames() - { - $this->_server->setResponse('Zend_Amf_Response'); - $response = $this->_server->getResponse(); - $this->assertTrue($response instanceof Zend_Amf_Response); - $this->assertFalse($response instanceof Zend_Amf_Response_Http); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetResponseShouldRaiseExceptionOnInvalidStringClassName() - { - $this->_server->setResponse('Zend_Amf_ServerTest_BogusResponse'); - } - - public function testSetResponseShouldAllowValidResponseObjects() - { - $response = new Zend_Amf_Response; - $this->_server->setResponse($response); - $this->assertSame($response, $this->_server->getResponse()); - } - - /** - * @expectedException Zend_Amf_Server_Exception - */ - public function testSetResponseShouldRaiseExceptionOnInvalidResponseObjects() - { - require_once 'Zend/XmlRpc/Response.php'; - $response = new Zend_XmlRpc_Response; - $this->_server->setResponse($response); - } - - public function testGetFunctionsShouldReturnArrayOfDispatchables() - { - $this->_server->addFunction('Zend_Amf_Server_testFunction', 'tf') - ->setClass('Zend_Amf_testclass', 'tc') - ->setClass('Zend_Amf_testclassPrivate', 'tcp'); - $functions = $this->_server->getFunctions(); - $this->assertTrue(is_array($functions)); - $this->assertTrue(0 < count($functions)); - $namespaces = array('tf', 'tc', 'tcp'); - foreach ($functions as $key => $value) { - $this->assertTrue(strstr($key, '.') ? true : false, $key); - $ns = substr($key, 0, strpos($key, '.')); - $this->assertContains($ns, $namespaces, $key); - $this->assertTrue($value instanceof Zend_Server_Reflection_Function_Abstract); - } - } - - public function testFaultShouldBeUnimplemented() - { - $this->assertNull($this->_server->fault()); - } - - public function testPersistenceShouldBeUnimplemented() - { - $this->assertNull($this->_server->setPersistence(true)); - } - - public function testLoadFunctionsShouldBeUnimplemented() - { - $this->assertNull($this->_server->loadFunctions(true)); - } - - /** - * @group ZF-5388 - * Issue if only one parameter of type array is passed it is nested into another array. - */ - public function testSingleArrayParamaterAMF3() - { - // serialize the data to an AMF output stream - $data[] = array('item1', 'item2'); - $this->_server->setClass('Zend_Amf_testclass'); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'testSingleArrayParamater'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check the message body is the expected data to be returned - $this->assertTrue($acknowledgeMessage->body); - } - - /** - * @group ZF-5388 - * Issue if only one parameter of type array is passed it is nested into another array. - */ - public function testSingleArrayParamaterAMF0() - { - $data[] = array('item1', 'item2'); - $this->_server->setClass('Zend_Amf_testclass'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_testclass.testSingleArrayParamater","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x00); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertTrue($responseBody[0]->getData(), var_export($responseBody, 1)); - } - - /** - * @group ZF-5388 - * Issue if only one parameter of type array is passed it is nested into another array. - */ - public function testMutiArrayParamaterAMF3() - { - // serialize the data to an AMF output stream - $data[] = array('item1', 'item2'); - $data[] = array('item3', 'item4'); - $this->_server->setClass('Zend_Amf_testclass'); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'testMultiArrayParamater'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check the message body is the expected data to be returned - $this->assertEquals(4, count($acknowledgeMessage->body)); - } - - /** - * @group ZF-5388 - * Issue if multipol parameters are sent and one is of type array is passed. - */ - public function testMutiArrayParamaterAMF0() - { - $data[] = array('item1', 'item2'); - $data[] = array('item3', 'item4'); - $this->_server->setClass('Zend_Amf_testclass'); - $newBody = new Zend_Amf_Value_MessageBody("Zend_Amf_testclass.testMultiArrayParamater","/1",$data); - $request = new Zend_Amf_Request(); - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x00); - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - $this->assertEquals(4, count($responseBody[0]->getData()), var_export($responseBody, 1)); - } - - /** - * @group ZF-5346 - */ - public function testSingleObjectParamaterAMF3() - { - // serialize the data to an AMF output stream - $data[] = array('item1', 'item2'); - $data[] = array('item3', 'item4'); - $this->_server->setClass('Zend_Amf_testclass'); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'testMultiArrayParamater'; - $message->source = 'Zend_Amf_testclass'; - $message->body = $data; - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1",$message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - $this->assertTrue(0 < count($responseBody), var_export($responseBody, 1)); - $this->assertTrue(array_key_exists(0, $responseBody), var_export($responseBody, 1)); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertTrue($acknowledgeMessage instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - // Check the message body is the expected data to be returned - $this->assertEquals(4, count($acknowledgeMessage->body)); - - } - - - - /** - * Check that when using server->setSession you get an amf header that has an append to gateway sessionID - * @group ZF-5381 - */ - public function testSessionAmf3() - { - Zend_Session::$_unitTestEnabled = true; - Zend_Session::start(); - $this->_server->setClass('Zend_Amf_testSession'); - $this->_server->setSession(); - - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'getCount'; - $message->source = 'Zend_Amf_testSession'; - $message->body = array(); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1", $message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $result = $this->_server->handle($request); - $response = $this->_server->getResponse(); - $responseBody = $response->getAmfBodies(); - // Now check if the return data was properly set. - $acknowledgeMessage = $responseBody[0]->getData(); - // check that we have a message beening returned - $this->assertEquals(1, $acknowledgeMessage->body); - // check that a header is being returned for the session id - $headerBody = $response->getAmfHeaders(); - $this->assertEquals('AppendToGatewayUrl',$headerBody[0]->name); - - // Do not stop session since it still can be used by other tests - // Zend_Session::stop(); - } - - public function testAddDirectory() - { - $this->_server->addDirectory(dirname(__FILE__)."/_files/services"); - $this->_server->addDirectory(dirname(__FILE__)."/_files/"); - $dirs = $this->_server->getDirectory(); - $this->assertContains(dirname(__FILE__)."/_files/services/", $dirs); - $this->assertContains(dirname(__FILE__)."/_files/", $dirs); - } - - public function testAddDirectoryService() - { - $this->_server->addDirectory(dirname(__FILE__)."/_files/services"); - // should take it from the path above, not include path - $origPath = get_include_path(); - set_include_path($origPath.PATH_SEPARATOR.dirname(__FILE__)); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'getMenu'; - $message->source = 'ServiceC'; - $message->body = array(); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1", $message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $this->_server->handle($request); - set_include_path($origPath); - $response = $this->_server->getResponse()->getAMFBodies(); - $this->assertTrue($response[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertEquals("Service: MenuC", $response[0]->getData()->body); - } - - public function testAddDirectoryService2() - { - $this->_server->addDirectory(dirname(__FILE__)."/_files/services"); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'getMenu'; - $message->source = 'My.ServiceA'; - $message->body = array(); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1", $message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $this->_server->handle($request); - $response = $this->_server->getResponse()->getAMFBodies(); - $this->assertTrue($response[0]->getData() instanceof Zend_Amf_Value_Messaging_AcknowledgeMessage); - $this->assertEquals("Service: myMenuA", $response[0]->getData()->body); - } - - /* - * See ZF-6625 - */ - public function testAddDirectoryServiceNotFound() - { - $this->_server->addDirectory(dirname(__FILE__)."/_files/services"); - // create a mock remoting message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'encode'; - $message->source = 'Zend_Json'; - $message->body = array("123"); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1", $message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $this->_server->handle($request); - $response = $this->_server->getResponse()->getAMFBodies(); - $this->assertTrue($response[0]->getData() instanceof Zend_Amf_Value_Messaging_ErrorMessage); - // test the same while ensuring Zend_Json is loaded - require_once 'Zend/Json.php'; - $this->_server->handle($request); - $response = $this->_server->getResponse()->getAMFBodies(); - $this->assertTrue($response[0]->getData() instanceof Zend_Amf_Value_Messaging_ErrorMessage); - } - - /* See ZF-7102 */ - public function testCtorExcection() - { - $this->_server->setClass('Zend_Amf_testException'); - $this->_server->setProduction(false); - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'hello'; - $message->source = 'Zend_Amf_testException'; - $message->body = array("123"); - // create a mock message body to place th remoting message inside - $newBody = new Zend_Amf_Value_MessageBody(null,"/1", $message); - $request = new Zend_Amf_Request(); - // at the requested service to a request - $request->addAmfBody($newBody); - $request->setObjectEncoding(0x03); - // let the server handle mock request - $this->_server->handle($request); - $response = $this->_server->getResponse()->getAMFBodies(); - $this->assertTrue($response[0]->getData() instanceof Zend_Amf_Value_Messaging_ErrorMessage); - $this->assertContains("Oops, exception!", $response[0]->getData()->faultString); - } - - - /** @group ZF-11529 */ - public function testSettingAuthAdapterWithAclSetsServerAcl() - { - $aclFile = dirname(__FILE__) . '/_files/acl.xml'; - $authAdapter = new Zend_Amf_Adobe_Auth($aclFile); - $this->_server->setAuth($authAdapter); - $this->assertSame($authAdapter->getAcl(), $this->_server->getAcl()); - } - - /** @group ZF-11529 */ - public function testSettingAuthAdapterWithAclWhenServerAclAlreadyPopulatedWillNotChangeServerAcl() - { - $acl = new Zend_Acl(); - $this->_server->setAcl($acl); - - $aclFile = dirname(__FILE__) . '/_files/acl.xml'; - $authAdapter = new Zend_Amf_Adobe_Auth($aclFile); - $this->_server->setAuth($authAdapter); - - $this->assertNotSame($authAdapter->getAcl(), $this->_server->getAcl()); - $this->assertSame($acl, $this->_server->getAcl()); - } - - /** - * @group ZF-6130 - */ - public function testServerShouldCastObjectArgumentsToAppropriateType() - { - $server = new Zend_Amf_Server(); - $server->addDirectory(dirname(__FILE__) . '/_files/zf-6130/services'); - - // Create a mock message - $message = new Zend_Amf_Value_Messaging_RemotingMessage(); - $message->operation = 'createEmployee'; - $message->source = 'EmployeeService'; // original raw request used "destination" - $message->body = array(array( - 'office' => 322, - 'departmentid' => 3, - 'street' => 32, - 'zipcode' => 32, - 'state' => 32, - 'lastname' => 4, - 'firstname' => 2, - 'photofile' => 322, - 'city' => 32, - 'id' => 1, - 'title' => 4, - 'officephone' => 233, - 'email' => 32, - 'cellphone' => 22, - )); - $body = new Zend_Amf_Value_MessageBody(null, "\1", $message); - - $request = new Zend_Amf_Request(); - $request->addAmfBody($body); - $request->setObjectEncoding(0x03); - - $response = $server->handle($request); - $employee = EmployeeService::$employee; - $this->assertNotNull($employee); - $this->assertNotEquals(1, $employee->id); - $this->assertRegexp('/[a-z0-9]{3,}/', $employee->id); - } -} - -if (PHPUnit_MAIN_METHOD == "Zend_Amf_ServerTest::main") { - Zend_Amf_ServerTest::main(); -} - -/** - * Zend_Amf_Server_testFunction - * - * Function for use with Amf server unit tests - * - * @param array $var1 - * @param string $var2 - * @return string - */ -function Zend_Amf_Server_testFunction($var1, $var2 = 'optional') -{ - return $var2 . ': ' . implode(',', (array) $var1); -} - -/** - * Zend_Amf_Server_testFunction2 - * - * Function for use with Amf server unit tests - * - * @return string - */ -function Zend_Amf_Server_testFunction2() -{ - return 'function2'; -} - -/** - * Class to used with Zend_Amf_Server unit tests. - * - */ -class Zend_Amf_testclass -{ - public function __construct() - { - } - - /** - * Concatinate a string - * - * @param string - * @return string - */ - public function test1($string = '') - { - return 'String: '. (string) $string; - } - - /** - * Test2 - * - * Returns imploded array - * - * @param array $array - * @return string - */ - public static function test2($array) - { - return implode('; ', (array) $array); - } - - /** - * Test3 - * - * Should not be available... - * - * @return void - */ - protected function _test3() - { - } - - /** - * Test base64 encoding in request and response - * - * @param base64 $data - * @return base64 - */ - public function base64($data) - { - return $data; - } - - /** - * Test that invoke arguments are passed - * - * @param string $message message argument for comparisons - * @return string - */ - public function checkArgv($message) - { - $argv = func_get_args(); - return implode(':', $argv); - } - - /** - * Test static usage - * - * @param string $message - * @return string - */ - public static function checkStaticUsage($message) - { - return $message; - } - - /** - * Test throwing exceptions - * - * @return void - */ - public function throwException() - { - throw new Exception('This exception should not be displayed'); - } - - /** - * test if we can send an array as a paramater without it getting nested two - * Used to test ZF-5388 - */ - public function testSingleArrayParamater($inputArray){ - if( $inputArray[0] == 'item1' ){ - return true; - } - return false; - } - /** - * This will crash if two arrays are not passed into the function. - * Used to test ZF-5388 - */ - public function testMultiArrayParamater($arrayOne, $arrayTwo) - { - return array_merge($arrayOne, $arrayTwo); - } -} - -class Zend_Amf_testException -{ - public function __construct() { - throw new Exception("Oops, exception!"); - } - - public function hello() { - return "hello"; - } -} - -/** - * Class with private constructor - */ -class Zend_Amf_testclassPrivate -{ - private function __construct() - { - } - - /** - * Test1 - * - * Returns 'String: ' . $string - * - * @param string $string - * @return string - */ - public function test1($string = '') - { - return 'String: '. (string) $string; - } - - public function hello() - { - return "hello"; - } -} - -/** - * Example class for sending a session back to ActionScript. - */ -class Zend_Amf_testSession -{ - /** Check if the session is available or create it. */ - public function __construct() { - if (!isset($_SESSION['count'])) { - $_SESSION['count'] = 0; - } - } - - /** increment the current count session variable and return it's value */ - public function getCount() - { - $_SESSION['count']++; - return $_SESSION['count']; - } -} - diff --git a/tests/Zend/Amf/ServiceA.php b/tests/Zend/Amf/ServiceA.php deleted file mode 100644 index e4b2210cf9..0000000000 --- a/tests/Zend/Amf/ServiceA.php +++ /dev/null @@ -1,42 +0,0 @@ -assertEquals('Zend_Amf_Value_Messaging_RemotingMessage', $class); - } - - /** - * Test that we can get the return name from the server name for serialization - * - */ - public function testGetMappedClassNameForServer() - { - $class = Zend_Amf_Parse_TypeLoader::getMappedClassName('Zend_Amf_Value_Messaging_RemotingMessage'); - $this->assertEquals('flex.messaging.messages.RemotingMessage', $class); - } - - /** - * Test that we can find and load the remote matching class name - * - */ - public function testLoadTypeSuccess(){ - $class = Zend_Amf_Parse_TypeLoader::loadType('flex.messaging.messages.RemotingMessage'); - $this->assertEquals('Zend_Amf_Value_Messaging_RemotingMessage', $class); - } - - /** - * Test that adding our own mappping will result in it being added to the classMap - * - */ - public function testSetMappingClass() - { - Zend_Amf_Parse_TypeLoader::setMapping('com.example.vo.Contact','Contact'); - $class = Zend_Amf_Parse_TypeLoader::getMappedClassName('com.example.vo.Contact'); - $this->assertEquals('Contact', $class); - } - - public function testUnknownClassMap() { - $class = Zend_Amf_Parse_TypeLoader::loadType('com.example.vo.Bogus'); - $this->assertEquals('stdClass', $class); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_TypeloaderTest::main') { - Zend_Amf_ResponseTest::main(); -} - diff --git a/tests/Zend/Amf/Util/BinaryStreamTest.php b/tests/Zend/Amf/Util/BinaryStreamTest.php deleted file mode 100644 index b30b0b098e..0000000000 --- a/tests/Zend/Amf/Util/BinaryStreamTest.php +++ /dev/null @@ -1,93 +0,0 @@ -readBytes(10 * $length); - } - - public function testReadBytesShouldReturnSubsetOfStringFromCurrentNeedle() - { - $string = 'this is a short stream'; - $stream = new Zend_Amf_Util_BinaryStream($string); - $test = $stream->readBytes(4); - $this->assertEquals('this', $test); - $test = $stream->readBytes(5); - $this->assertEquals(' is a', $test); - } - - public function testBinaryStreamsShouldAllowWritingUtf8() - { - $string = str_repeat('赵勇', 1000); - $stream = new Zend_Amf_Util_BinaryStream(''); - $stream->writeLongUtf($string); - $test = $stream->getStream(); - $this->assertContains($string, $test); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_Util_BinaryStreamTest::main') { - Zend_Amf_Util_BinaryStreamTest::main(); -} diff --git a/tests/Zend/Amf/Value/ArrayCollectionTest.php b/tests/Zend/Amf/Value/ArrayCollectionTest.php deleted file mode 100644 index e0b1788a6f..0000000000 --- a/tests/Zend/Amf/Value/ArrayCollectionTest.php +++ /dev/null @@ -1,218 +0,0 @@ - 'foo1', 'bar' => 'bar1'); - $data[] = array('foo' => 'foo2', 'bar' => 'bar2'); - $this->_data = $data; - - } - - public function tearDown() - { - unset($this->_arrayCollection); - unset($this->_data); - } - - public function testConstructorArrayCollectionTwo() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $this->assertEquals('bar2', $this->_arrayCollection[1]['bar']); - } - - /** - * Check that the ArrayCollection can be accessed like a standard array. - */ - public function testConstructorArrayCollection() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $this->assertEquals('bar2', $this->_arrayCollection[1]['bar']); - } - - /** - * Check that we can get the count of the ArrayCollection - */ - public function testCountable() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $this->assertEquals(2, count($this->_arrayCollection)); - } - - /** - * Test that we can foreach through the ArrayCollection - */ - public function testIteratorArray() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $total = count($this->_arrayCollection); - $count = 0; - foreach($this->_arrayCollection as $row) { - $count++; - } - $this->assertEquals(2, $count); - } - - /** - * Test that we can alter an item based on it's offset - */ - public function testOffsetExists() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $this->assertTrue($this->_arrayCollection->offsetExists(1)); - } - - /** - * Check that you can set and get the changes to an offset key. - */ - public function testOffsetSetGet() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $data = array('fooSet' => 'fooSet2', 'barSet' => 'barSet2'); - $this->_arrayCollection->offsetSet(1,$data); - $this->assertEquals($data, $this->_arrayCollection->offsetGet(1)); - } - - /** - * Check that you can delete an item from the arraycollection based on key. - */ - public function testOffsetUnset() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $data = array('foo' => 'foo1', 'bar' => 'bar1'); - $this->assertEquals($data, $this->_arrayCollection->offsetGet(0)); - $this->assertEquals(2, count($this->_arrayCollection)); - $this->_arrayCollection->offsetUnset(0); - $this->assertEquals(1, count($this->_arrayCollection)); - } - - /** - * Check that you can transform an ArrayCollection into a standard array with iterator_to_array - */ - public function testIteratorToArray() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $standardArray = iterator_to_array($this->_arrayCollection); - $this->assertTrue(is_array($standardArray)); - } - - /** - * Make sure that you can append more name values to the arraycollection - */ - public function testAppend() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $arrayCollectionTwo = new Zend_Amf_Value_Messaging_ArrayCollection(); - $arrayCollectionTwo->append(array('foo' => 'foo1', 'bar' => 'bar1')); - $arrayCollectionTwo->append(array('foo' => 'foo2', 'bar' => 'bar2')); - $this->assertEquals($arrayCollectionTwo, $this->_arrayCollection); - } - - /** - * Test to make sure that when the iterator as data it is a valid iterator - * - public function testValid() - { - unset($this->_arrayCollection); - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection(); - $this->assertFalse($this->_arrayCollection->valid()); - unset($this->_arrayCollection); - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $this->assertTrue($this->_arrayCollection->valid()); - } - */ - - /* - public function testArrayIterator() - { - $this->_arrayCollection = new Zend_Amf_Value_Messaging_ArrayCollection($this->_data); - $data0 = array('foo' => 'foo1', 'bar' => 'bar1'); - $data1 = array('foo' => 'foo2', 'bar' => 'bar2'); - $data3 = array('kung' => 'foo', 'Bruce' => 'Lee'); - $this->_arrayCollection->offsetSet(3,$data3); - $this->assertEquals($data0,$this->_arrayCollection->current()); - $this->_arrayCollection->next(); - $this->assertEquals($data1,$this->_arrayCollection->current()); - $this->_arrayCollection->next(); - var_dump($this->_arrayCollection->key()); - $this->assertEquals($data3,$this->_arrayCollection->current()); - $this->_arrayCollection->rewind(); - $this->assertEquals($data0,$this->_arrayCollection->current()); - - } - */ - - -} - -class Zend_Amf_Value_ArrayCollectionTest_SerializableData -{ - public function __toString() - { - return __CLASS__; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_Value_ArrayCollectionTest::main') { - Zend_Amf_Value_ArrayCollectionTest::main(); -} diff --git a/tests/Zend/Amf/Value/MessageBodyTest.php b/tests/Zend/Amf/Value/MessageBodyTest.php deleted file mode 100644 index cfb15f50ba..0000000000 --- a/tests/Zend/Amf/Value/MessageBodyTest.php +++ /dev/null @@ -1,100 +0,0 @@ -body = new Zend_Amf_Value_MessageBody('/foo', '/bar', 'data'); - } - - public function testMessageBodyShouldAllowSettingData() - { - $this->assertEquals('data', $this->body->getData()); - $this->body->setData('foobar'); - $this->assertEquals('foobar', $this->body->getData()); - } - - public function testMessageBodyShouldAttachDataAsIs() - { - $object = new Zend_Amf_Value_MessageBodyTest_SerializableData(); - $this->body->setData($object); - $this->assertSame($object, $this->body->getData()); - } - - public function testReplyMethodShouldModifyTargetUri() - { - $this->body->setReplyMethod('?action=bar'); - $this->assertEquals('/foo?action=bar', $this->body->getTargetUri()); - } - - public function testReplyMethodShouldInsertPathSeparatorIfNoQueryStringProvided() - { - $this->body->setReplyMethod('bar'); - $this->assertEquals('/foo/bar', $this->body->getTargetUri()); - } - - public function testPassingNullToTargetUriShouldResultInEmptyString() - { - $this->body->setTargetUri(null); - $this->assertSame('', $this->body->getTargetUri()); - } -} - -class Zend_Amf_Value_MessageBodyTest_SerializableData -{ - public function __toString() - { - return __CLASS__; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_Value_MessageBodyTest::main') { - Zend_Amf_Value_MessageBodyTest::main(); -} diff --git a/tests/Zend/Amf/Value/MessageHeaderTest.php b/tests/Zend/Amf/Value/MessageHeaderTest.php deleted file mode 100644 index 31656c3433..0000000000 --- a/tests/Zend/Amf/Value/MessageHeaderTest.php +++ /dev/null @@ -1,98 +0,0 @@ -assertEquals('foo', $messageHeader->name); - } - - public function testConstructorShouldSetMessageHeaderMustReadFlag() - { - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', true, 'content'); - $this->assertTrue($messageHeader->mustRead); - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', false, 'content'); - $this->assertFalse($messageHeader->mustRead); - } - - public function testConstructorShouldCastMessageHeaderMustReadFlagToBoolean() - { - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', 'foo', 'content'); - $this->assertTrue($messageHeader->mustRead); - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', 0, 'content'); - $this->assertFalse($messageHeader->mustRead); - } - - public function testConstructorShouldSetMessageHeaderDataUnmodified() - { - $data = new stdClass; - $data->foo = 'bar'; - $data->bar = array('baz' => 'bat'); - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', true, $data); - $this->assertSame($data, $messageHeader->data); - } - - public function testConstructorShouldNotSetLengthIfNotProvided() - { - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', true, 'content'); - $this->assertNull($messageHeader->length); - } - - public function testConstructorShouldCastLengthToInteger() - { - $messageHeader = new Zend_Amf_Value_MessageHeader('foo', 'foo', 'content', '2'); - $this->assertSame(2, $messageHeader->length); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Amf_Value_MessageHeaderTest::main') { - Zend_Amf_Value_MessageHeaderTest::main(); -} diff --git a/tests/Zend/Amf/_files/acl.xml b/tests/Zend/Amf/_files/acl.xml deleted file mode 100644 index e526855098..0000000000 --- a/tests/Zend/Amf/_files/acl.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/Zend/Amf/_files/services/My/ServiceA.php b/tests/Zend/Amf/_files/services/My/ServiceA.php deleted file mode 100755 index 5b558713d2..0000000000 --- a/tests/Zend/Amf/_files/services/My/ServiceA.php +++ /dev/null @@ -1,43 +0,0 @@ -id = uniqid(); - self::$employee = $item; - return $item->id; - } -} - -class Employee -{ - /** - * @var int - */ - public $id; - - /** - * @var string - */ - public $firstname; - - /** - * @var string - */ - public $lastname; - - /** - * @var string - */ - public $title; - - /** - * @var int - */ - public $departmentid; - - /** - * @var string - */ - public $officephone; - - /** - * @var string - */ - public $cellphone; - - /** - * @var string - */ - public $email; - - /** - * @var string - */ - public $street; - - /** - * @var string - */ - public $city; - - /** - * @var string - */ - public $state; - - /** - * @var string - */ - public $zipcode; - - /** - * @var string - */ - public $office; - - /** - * @var string - */ - public $photofile; -} From 3cb35f044cc898ad04ea284be9607915f0559ad3 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:44:46 -0500 Subject: [PATCH 31/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Auth Tests --- library/Zend/Auth.php | 169 ------ tests/Zend/AllTests.php | 4 - tests/Zend/Auth/Adapter/AllTests.php | 74 --- tests/Zend/Auth/Adapter/DbTable/AllTests.php | 83 --- .../Auth/Adapter/DbTable/BasicSqliteTest.php | 491 ---------------- .../DbTable/BasicSqliteTest/SkipTests.php | 46 -- .../Auth/Adapter/Digest/_files/.htdigest.1 | 2 - tests/Zend/Auth/Adapter/DigestTest.php | 250 -------- tests/Zend/Auth/Adapter/Http/AllTests.php | 72 --- tests/Zend/Auth/Adapter/Http/AuthTest.php | 494 ---------------- tests/Zend/Auth/Adapter/Http/ObjectTest.php | 298 ---------- tests/Zend/Auth/Adapter/Http/ProxyTest.php | 480 ---------------- .../Auth/Adapter/Http/Resolver/AllTests.php | 66 --- .../Auth/Adapter/Http/Resolver/FileTest.php | 276 --------- tests/Zend/Auth/Adapter/Http/_files/htbasic.1 | 3 - .../Zend/Auth/Adapter/Http/_files/htdigest.3 | 2 - tests/Zend/Auth/Adapter/Ldap/AllTests.php | 88 --- tests/Zend/Auth/Adapter/Ldap/OfflineTest.php | 112 ---- tests/Zend/Auth/Adapter/Ldap/OnlineTest.php | 207 ------- tests/Zend/Auth/Adapter/OpenId/AllTests.php | 67 --- tests/Zend/Auth/Adapter/OpenId/OpenIdTest.php | 535 ------------------ .../Auth/Adapter/OpenId/ResponseHelper.php | 54 -- tests/Zend/Auth/AllTests.php | 66 --- tests/Zend/AuthTest.php | 111 ---- 24 files changed, 4050 deletions(-) delete mode 100644 library/Zend/Auth.php delete mode 100644 tests/Zend/Auth/Adapter/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/DbTable/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest.php delete mode 100644 tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest/SkipTests.php delete mode 100644 tests/Zend/Auth/Adapter/Digest/_files/.htdigest.1 delete mode 100644 tests/Zend/Auth/Adapter/DigestTest.php delete mode 100644 tests/Zend/Auth/Adapter/Http/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/Http/AuthTest.php delete mode 100644 tests/Zend/Auth/Adapter/Http/ObjectTest.php delete mode 100644 tests/Zend/Auth/Adapter/Http/ProxyTest.php delete mode 100644 tests/Zend/Auth/Adapter/Http/Resolver/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/Http/Resolver/FileTest.php delete mode 100644 tests/Zend/Auth/Adapter/Http/_files/htbasic.1 delete mode 100644 tests/Zend/Auth/Adapter/Http/_files/htdigest.3 delete mode 100644 tests/Zend/Auth/Adapter/Ldap/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/Ldap/OfflineTest.php delete mode 100644 tests/Zend/Auth/Adapter/Ldap/OnlineTest.php delete mode 100644 tests/Zend/Auth/Adapter/OpenId/AllTests.php delete mode 100644 tests/Zend/Auth/Adapter/OpenId/OpenIdTest.php delete mode 100644 tests/Zend/Auth/Adapter/OpenId/ResponseHelper.php delete mode 100644 tests/Zend/Auth/AllTests.php delete mode 100644 tests/Zend/AuthTest.php diff --git a/library/Zend/Auth.php b/library/Zend/Auth.php deleted file mode 100644 index 434d944fc5..0000000000 --- a/library/Zend/Auth.php +++ /dev/null @@ -1,169 +0,0 @@ -_storage) { - /** - * @see Zend_Auth_Storage_Session - */ - #require_once 'Zend/Auth/Storage/Session.php'; - $this->setStorage(new Zend_Auth_Storage_Session()); - } - - return $this->_storage; - } - - /** - * Sets the persistent storage handler - * - * @param Zend_Auth_Storage_Interface $storage - * @return Zend_Auth Provides a fluent interface - */ - public function setStorage(Zend_Auth_Storage_Interface $storage) - { - $this->_storage = $storage; - return $this; - } - - /** - * Authenticates against the supplied adapter - * - * @param Zend_Auth_Adapter_Interface $adapter - * @return Zend_Auth_Result - */ - public function authenticate(Zend_Auth_Adapter_Interface $adapter) - { - $result = $adapter->authenticate(); - - /** - * ZF-7546 - prevent multiple succesive calls from storing inconsistent results - * Ensure storage has clean state - */ - if ($this->hasIdentity()) { - $this->clearIdentity(); - } - - if ($result->isValid()) { - $this->getStorage()->write($result->getIdentity()); - } - - return $result; - } - - /** - * Returns true if and only if an identity is available from storage - * - * @return boolean - */ - public function hasIdentity() - { - return !$this->getStorage()->isEmpty(); - } - - /** - * Returns the identity from storage or null if no identity is available - * - * @return mixed|null - */ - public function getIdentity() - { - $storage = $this->getStorage(); - - if ($storage->isEmpty()) { - return null; - } - - return $storage->read(); - } - - /** - * Clears the identity from persistent storage - * - * @return void - */ - public function clearIdentity() - { - $this->getStorage()->clear(); - } -} diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 199834f5d3..ab0660a392 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -26,8 +26,6 @@ } require_once 'Zend/Acl/AclTest.php'; -require_once 'Zend/AuthTest.php'; -require_once 'Zend/Auth/AllTests.php'; require_once 'Zend/Cache/AllTests.php'; require_once 'Zend/Db/AllTests.php'; require_once 'Zend/ConfigTest.php'; @@ -139,8 +137,6 @@ public static function suite() // Start remaining tests... $suite->addTestSuite('Zend_Acl_AclTest'); - $suite->addTestSuite('Zend_AuthTest'); - $suite->addTest(Zend_Auth_AllTests::suite()); $suite->addTest(Zend_Cache_AllTests::suite()); $suite->addTestSuite('Zend_ConfigTest'); $suite->addTest(Zend_Config_AllTests::suite()); diff --git a/tests/Zend/Auth/Adapter/AllTests.php b/tests/Zend/Auth/Adapter/AllTests.php deleted file mode 100644 index c274d0ca52..0000000000 --- a/tests/Zend/Auth/Adapter/AllTests.php +++ /dev/null @@ -1,74 +0,0 @@ -addTest(Zend_Auth_Adapter_DbTable_AllTests::suite()); - $suite->addTestSuite('Zend_Auth_Adapter_DigestTest'); - $suite->addTest(Zend_Auth_Adapter_Http_AllTests::suite()); - $suite->addTest(Zend_Auth_Adapter_Ldap_AllTests::suite()); - $suite->addTest(Zend_Auth_Adapter_OpenId_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_Adapter_AllTests::main') { - Zend_Auth_Adapter_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/DbTable/AllTests.php b/tests/Zend/Auth/Adapter/DbTable/AllTests.php deleted file mode 100644 index 11ee09270e..0000000000 --- a/tests/Zend/Auth/Adapter/DbTable/AllTests.php +++ /dev/null @@ -1,83 +0,0 @@ -message = 'Tests are not enabled in TestConfiguration.php'; - $suite->addTest($skipTest); - } else if (!extension_loaded('pdo')) { - $skipTest = new Zend_Auth_Adapter_DbTable_BasicSqliteTest_SkipTests(); - $skipTest->message = "Extension 'PDO' is not loaded"; - $suite->addTest($skipTest); - } else if (!in_array('sqlite', PDO::getAvailableDrivers())) { - $skipTest = new Zend_Auth_Adapter_DbTable_BasicSqliteTest_SkipTests(); - $skipTest->message = "PDO driver 'sqlite' is not available"; - $suite->addTest($skipTest); - } else { - $suite->addTestSuite('Zend_Auth_Adapter_DbTable_BasicSqliteTest'); - } - - return $suite; - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_Adapter_DbTable_AllTests::main') { - Zend_Auth_Adapter_DbTable_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest.php b/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest.php deleted file mode 100644 index 5192c31ff2..0000000000 --- a/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest.php +++ /dev/null @@ -1,491 +0,0 @@ -_setupDbAdapter(); - $this->_setupAuthAdapter(); - } - - public function tearDown() - { - $this->_adapter = null; - $this->_db->query('DROP TABLE [users]'); - $this->_db = null; - } - - /** - * Ensures expected behavior for authentication success - * - * @return void - */ - public function testAuthenticateSuccess() - { - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $this->assertTrue($result->isValid()); - } - - /** - * Ensures expected behavior for authentication success - * - * @return void - */ - public function testAuthenticateSuccessWithTreatment() - { - $this->_adapter = new Zend_Auth_Adapter_DbTable($this->_db, 'users', 'username', 'password', '?'); - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $this->assertTrue($result->isValid()); - } - - /** - * Ensures expected behavior for for authentication failure - * reason: Identity not found. - * - */ - public function testAuthenticateFailureIdentityNotFound() - { - $this->_adapter->setIdentity('non_existent_username'); - $this->_adapter->setCredential('my_password'); - - try { - $result = $this->_adapter->authenticate(); - $this->assertEquals(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, $result->getCode()); - } catch (Zend_Auth_Exception $e) { - $this->fail('Exception should have been thrown'); - } - } - - /** - * Ensures expected behavior for for authentication failure - * reason: Identity not found. - * - */ - public function testAuthenticateFailureIdentityAmbigious() - { - $sql_insert = 'INSERT INTO users (username, password, real_name) VALUES ("my_username", "my_password", "My Real Name")'; - $this->_db->query($sql_insert); - - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - - try { - $result = $this->_adapter->authenticate(); - $this->assertEquals(Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS, $result->getCode()); - } catch (Zend_Auth_Exception $e) { - $this->fail('Exception should have been thrown'); - } - } - - /** - * Ensures expected behavior for authentication failure because of a bad password - * - * @return void - */ - public function testAuthenticateFailureInvalidCredential() - { - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password_bad'); - $result = $this->_adapter->authenticate(); - $this->assertFalse($result->isValid()); - } - - /** - * Ensures that getResultRowObject() works for successful authentication - * - * @return void - */ - public function testGetResultRow() - { - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $resultRow = $this->_adapter->getResultRowObject(); - $this->assertEquals($resultRow->username, 'my_username'); - } - - /** - * Ensure that ResultRowObject returns only what told to be included - * - */ - public function testGetSpecificResultRow() - { - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $resultRow = $this->_adapter->getResultRowObject(array('username', 'real_name')); - $this->assertEquals('O:8:"stdClass":2:{s:8:"username";s:11:"my_username";s:9:"real_name";s:12:"My Real Name";}', serialize($resultRow)); - } - - /** - * Ensure that ResultRowObject returns an object has specific omissions - * - */ - public function testGetOmittedResultRow() - { - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $resultRow = $this->_adapter->getResultRowObject(null, 'password'); - $this->assertEquals('O:8:"stdClass":3:{s:2:"id";s:1:"1";s:8:"username";s:11:"my_username";s:9:"real_name";s:12:"My Real Name";}', serialize($resultRow)); - } - - /** - * @group ZF-5957 - */ - public function testAdapterCanReturnDbSelectObject() - { - $this->assertTrue($this->_adapter->getDbSelect() instanceof Zend_Db_Select); - } - - /** - * @group ZF-5957 - */ - public function testAdapterCanUseModifiedDbSelectObject() - { - $this->_db->getProfiler()->setEnabled(true); - $select = $this->_adapter->getDbSelect(); - $select->where('1 = 1'); - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $this->_adapter->authenticate(); - $profiler = $this->_db->getProfiler(); - $this->assertEquals( - 'SELECT "users".*, (CASE WHEN "password" = \'my_password\' THEN 1 ELSE 0 END) AS "zend_auth_credential_match" FROM "users" WHERE (1 = 1) AND ("username" = \'my_username\')', - $profiler->getLastQueryProfile()->getQuery() - ); - } - - /** - * @group ZF-5957 - */ - public function testAdapterReturnsASelectObjectWithoutAuthTimeModificationsAfterAuth() - { - $select = $this->_adapter->getDbSelect(); - $select->where('1 = 1'); - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $this->_adapter->authenticate(); - $selectAfterAuth = $this->_adapter->getDbSelect(); - $whereParts = $selectAfterAuth->getPart(Zend_Db_Select::WHERE); - $this->assertEquals(1, count($whereParts)); - $this->assertEquals('(1 = 1)', array_pop($whereParts)); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionNoTable() - { - $adapter = new Zend_Auth_Adapter_DbTable($this->_db); - $result = $adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'A table must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionNoIdentityColumn() - { - $adapter = new Zend_Auth_Adapter_DbTable($this->_db, 'users'); - $result = $adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'An identity column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionNoCredentialColumn() - { - $adapter = new Zend_Auth_Adapter_DbTable($this->_db, 'users', 'username'); - $result = $adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'A credential column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionNoIdentity() - { - $result = $this->_adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionNoCredential() - { - $this->_adapter->setIdentity('my_username'); - $result = $this->_adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'A credential value was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'); - } - - /** - * Ensure that exceptions are caught - * - * @expectedException Zend_Auth_Exception - */ - public function testCatchExceptionBadSql() - { - $this->_adapter->setTableName('bad_table_name'); - $this->_adapter->setIdentity('value'); - $this->_adapter->setCredential('value'); - $result = $this->_adapter->authenticate(); - // $this->assertEquals($e->getMessage(), 'The supplied parameters to Zend_Auth_Adapter_DbTable failed to produce a valid sql statement, please check table and column names for validity.'); - } - - /** - * - * @group ZF-3068 - */ - public function testDbTableAdapterUsesCaseFolding() - { - $this->tearDown(); - $this->_setupDbAdapter(array(Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER)); - $this->_setupAuthAdapter(); - - $this->_adapter->setIdentity('my_username'); - $this->_adapter->setCredential('my_password'); - $this->_db->foldCase(Zend_Db::CASE_UPPER); - $this->_adapter->authenticate(); - } - - - /** - * Test fallback to default database adapter, when no such adapter set - * - * @expectedException Zend_Auth_Adapter_Exception - * @group ZF-7510 - */ - public function testAuthenticateWithDefaultDbAdapterNoAdapterException() - { - require_once('Zend/Db/Table/Abstract.php'); - // preserve default db adapter between cases - $tmp = Zend_Db_Table_Abstract::getDefaultAdapter(); - - // make sure that no default adapter exists - Zend_Db_Table_Abstract::setDefaultAdapter(null); - try { - $this->_adapter = new Zend_Auth_Adapter_DbTable(); - } catch (Exception $e) { - $this->assertContains('No database adapter present', $e->getMessage()); - throw $e; - } - - // restore adapter - Zend_Db_Table_Abstract::setDefaultAdapter($tmp); - } - - /** - * Test fallback to default database adapter - * - * @group ZF-7510 - */ - public function testAuthenticateWithDefaultDbAdapter() - { - require_once('Zend/Db/Table/Abstract.php'); - // preserve default adapter between cases - $tmp = Zend_Db_Table_Abstract::getDefaultAdapter(); - - // make sure that default db adapter exists - Zend_Db_Table_Abstract::setDefaultAdapter($this->_db); - - // check w/o passing adapter - $this->_adapter = new Zend_Auth_Adapter_DbTable(); - $this->_adapter - ->setTableName('users') - ->setIdentityColumn('username') - ->setCredentialColumn('password') - ->setTableName('users') - ->setIdentity('my_username') - ->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $this->assertTrue($result->isValid()); - - // restore adapter - Zend_Db_Table_Abstract::setDefaultAdapter($tmp); - } - /** - * Test to see same usernames with different passwords can not authenticate - * when flag is not set. This is the current state of - * Zend_Auth_Adapter_DbTable (up to ZF 1.10.6) - * - * @group ZF-7289 - */ - public function testEqualUsernamesDifferentPasswordShouldNotAuthenticateWhenFlagIsNotSet() - { - $this->_db->insert('users', array ( - 'username' => 'my_username', - 'password' => 'my_otherpass', - 'real_name' => 'Test user 2', - )); - - // test if user 1 can authenticate - $this->_adapter->setIdentity('my_username') - ->setCredential('my_password'); - $result = $this->_adapter->authenticate(); - $this->assertTrue(in_array('More than one record matches the supplied identity.', - $result->getMessages())); - $this->assertFalse($result->isValid()); - } - /** - * Test to see same usernames with different passwords can authenticate when - * a flag is set - * - * @group ZF-7289 - */ - public function testEqualUsernamesDifferentPasswordShouldAuthenticateWhenFlagIsSet() - { - $this->_db->insert('users', array ( - 'username' => 'my_username', - 'password' => 'my_otherpass', - 'real_name' => 'Test user 2', - )); - - // test if user 1 can authenticate - $this->_adapter->setIdentity('my_username') - ->setCredential('my_password') - ->setAmbiguityIdentity(true); - $result = $this->_adapter->authenticate(); - $this->assertFalse(in_array('More than one record matches the supplied identity.', - $result->getMessages())); - $this->assertTrue($result->isValid()); - $this->assertEquals('my_username', $result->getIdentity()); - - $this->_adapter = null; - $this->_setupAuthAdapter(); - - // test if user 2 can authenticate - $this->_adapter->setIdentity('my_username') - ->setCredential('my_otherpass') - ->setAmbiguityIdentity(true); - $result2 = $this->_adapter->authenticate(); - $this->assertFalse(in_array('More than one record matches the supplied identity.', - $result->getMessages())); - $this->assertTrue($result->isValid()); - $this->assertEquals('my_username', $result->getIdentity()); - } - - - protected function _setupDbAdapter($optionalParams = array()) - { - $params = array('dbname' => TESTS_ZEND_AUTH_ADAPTER_DBTABLE_PDO_SQLITE_DATABASE); - - if (!empty($optionalParams)) { - $params['options'] = $optionalParams; - } - - $this->_db = new Zend_Db_Adapter_Pdo_Sqlite($params); - - $sqlCreate = 'CREATE TABLE [users] ( ' - . '[id] INTEGER NOT NULL PRIMARY KEY, ' - . '[username] VARCHAR(50) NOT NULL, ' - . '[password] VARCHAR(32) NULL, ' - . '[real_name] VARCHAR(150) NULL)'; - $this->_db->query($sqlCreate); - - $sqlInsert = 'INSERT INTO users (username, password, real_name) ' - . 'VALUES ("my_username", "my_password", "My Real Name")'; - $this->_db->query($sqlInsert); - } - - protected function _setupAuthAdapter() - { - $this->_adapter = new Zend_Auth_Adapter_DbTable($this->_db, 'users', 'username', 'password'); - } - - -} - - -class Zend_Auth_Adapter_DbTable_BasicSqliteTest_Skip extends Zend_Auth_Adapter_DbTable_BasicSqliteTest -{ - public function setUp() - { - $this->markTestSkipped('Zend_Auth_Adapter_DbTable Sqlite tests are not enabled in TestConfiguration.php'); - } -} diff --git a/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest/SkipTests.php b/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest/SkipTests.php deleted file mode 100644 index f5cf7c529e..0000000000 --- a/tests/Zend/Auth/Adapter/DbTable/BasicSqliteTest/SkipTests.php +++ /dev/null @@ -1,46 +0,0 @@ -markTestSkipped($this->message); - } - - public function testBasicSqlite() - { - // this is here only so we have at least one test - } - -} diff --git a/tests/Zend/Auth/Adapter/Digest/_files/.htdigest.1 b/tests/Zend/Auth/Adapter/Digest/_files/.htdigest.1 deleted file mode 100644 index ff6292749e..0000000000 --- a/tests/Zend/Auth/Adapter/Digest/_files/.htdigest.1 +++ /dev/null @@ -1,2 +0,0 @@ -someUser:Some Realm:fde17b91c3a510ecbaf7dbd37f59d4f8 -someOtherUser:Some Other Realm:1911c62b21a85c85c4c1a57785893b94 diff --git a/tests/Zend/Auth/Adapter/DigestTest.php b/tests/Zend/Auth/Adapter/DigestTest.php deleted file mode 100644 index e729ca2a36..0000000000 --- a/tests/Zend/Auth/Adapter/DigestTest.php +++ /dev/null @@ -1,250 +0,0 @@ -_filesPath = dirname(__FILE__) . '/Digest/_files'; - } - - /** - * Ensures that the adapter throws an exception when authentication is attempted before - * setting a required option - * - * @return void - */ - public function testOptionRequiredException() - { - $adapter = new Zend_Auth_Adapter_Digest(); - try { - $adapter->authenticate(); - $this->fail('Expected Zend_Auth_Adapter_Exception not thrown upon authentication attempt before setting ' - . 'a required option'); - } catch (Zend_Auth_Adapter_Exception $e) { - $this->assertContains('must be set before authentication', $e->getMessage()); - } - } - - /** - * Ensures that an exception is thrown upon authenticating against a nonexistent file - * - * @return void - */ - public function testFileNonExistentException() - { - $adapter = new Zend_Auth_Adapter_Digest('nonexistent', 'realm', 'username', 'password'); - try { - $adapter->authenticate(); - $this->fail('Expected Zend_Auth_Adapter_Exception not thrown upon authenticating against nonexistent ' - . 'file'); - } catch (Zend_Auth_Adapter_Exception $e) { - $this->assertContains('Cannot open', $e->getMessage()); - } - } - - /** - * Ensures expected behavior upon realm not found for existing user - * - * @return void - */ - public function testUserExistsRealmNonexistent() - { - $filename = "$this->_filesPath/.htdigest.1"; - $realm = 'Nonexistent Realm'; - $username = 'someUser'; - $password = 'somePassword'; - - $adapter = new Zend_Auth_Adapter_Digest($filename, $realm, $username, $password); - - $result = $adapter->authenticate(); - - $this->assertFalse($result->isValid()); - - $messages = $result->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertEquals($result->getCode(), Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND); - $this->assertContains('combination not found', $messages[0]); - - $identity = $result->getIdentity(); - $this->assertEquals($identity['realm'], $realm); - $this->assertEquals($identity['username'], $username); - } - - /** - * Ensures expected behavior upon user not found in existing realm - * - * @return void - */ - public function testUserNonexistentRealmExists() - { - $filename = "$this->_filesPath/.htdigest.1"; - $realm = 'Some Realm'; - $username = 'nonexistentUser'; - $password = 'somePassword'; - - $adapter = new Zend_Auth_Adapter_Digest($filename, $realm, $username, $password); - - $result = $adapter->authenticate(); - - $this->assertFalse($result->isValid()); - $this->assertEquals($result->getCode(), Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND); - - $messages = $result->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertContains('combination not found', $messages[0]); - - $identity = $result->getIdentity(); - $this->assertEquals($identity['realm'], $realm); - $this->assertEquals($identity['username'], $username); - } - - /** - * Ensures expected behavior upon incorrect password - * - * @return void - */ - public function testIncorrectPassword() - { - $filename = "$this->_filesPath/.htdigest.1"; - $realm = 'Some Realm'; - $username = 'someUser'; - $password = 'incorrectPassword'; - - $adapter = new Zend_Auth_Adapter_Digest($filename, $realm, $username, $password); - - $result = $adapter->authenticate(); - - $this->assertFalse($result->isValid()); - $this->assertEquals($result->getCode(), Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID); - - $messages = $result->getMessages(); - $this->assertEquals(1, count($messages)); - $this->assertContains('Password incorrect', $messages[0]); - - $identity = $result->getIdentity(); - $this->assertEquals($identity['realm'], $realm); - $this->assertEquals($identity['username'], $username); - } - - /** - * Ensures that successful authentication works as expected - * - * @return void - */ - public function testAuthenticationSuccess() - { - $filename = "$this->_filesPath/.htdigest.1"; - $realm = 'Some Realm'; - $username = 'someUser'; - $password = 'somePassword'; - - $adapter = new Zend_Auth_Adapter_Digest($filename, $realm, $username, $password); - - $result = $adapter->authenticate(); - - $this->assertTrue($result->isValid()); - $this->assertEquals($result->getCode(), Zend_Auth_Result::SUCCESS); - - $this->assertEquals(array(), $result->getMessages()); - - $identity = $result->getIdentity(); - $this->assertEquals($identity['realm'], $realm); - $this->assertEquals($identity['username'], $username); - } - - /** - * Ensures that getFilename() returns expected default value - * - * @return void - */ - public function testGetFilename() - { - $adapter = new Zend_Auth_Adapter_Digest(); - $this->assertEquals(null, $adapter->getFilename()); - } - - /** - * Ensures that getRealm() returns expected default value - * - * @return void - */ - public function testGetRealm() - { - $adapter = new Zend_Auth_Adapter_Digest(); - $this->assertEquals(null, $adapter->getRealm()); - } - - /** - * Ensures that getUsername() returns expected default value - * - * @return void - */ - public function testGetUsername() - { - $adapter = new Zend_Auth_Adapter_Digest(); - $this->assertEquals(null, $adapter->getUsername()); - } - - /** - * Ensures that getPassword() returns expected default value - * - * @return void - */ - public function testGetPassword() - { - $adapter = new Zend_Auth_Adapter_Digest(); - $this->assertEquals(null, $adapter->getPassword()); - } -} diff --git a/tests/Zend/Auth/Adapter/Http/AllTests.php b/tests/Zend/Auth/Adapter/Http/AllTests.php deleted file mode 100644 index bb5344bf1b..0000000000 --- a/tests/Zend/Auth/Adapter/Http/AllTests.php +++ /dev/null @@ -1,72 +0,0 @@ -addTestSuite('Zend_Auth_Adapter_Http_AuthTest'); - $suite->addTestSuite('Zend_Auth_Adapter_Http_ObjectTest'); - $suite->addTestSuite('Zend_Auth_Adapter_Http_ProxyTest'); - $suite->addTest(Zend_Auth_Adapter_Http_Resolver_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_Adapter_Http_AllTests::main') { - Zend_Auth_Adapter_Http_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/Http/AuthTest.php b/tests/Zend/Auth/Adapter/Http/AuthTest.php deleted file mode 100644 index ea27ac8645..0000000000 --- a/tests/Zend/Auth/Adapter/Http/AuthTest.php +++ /dev/null @@ -1,494 +0,0 @@ -_filesPath = dirname(__FILE__) . '/_files'; - $this->_basicResolver = new Zend_Auth_Adapter_Http_Resolver_File("{$this->_filesPath}/htbasic.1"); - $this->_digestResolver = new Zend_Auth_Adapter_Http_Resolver_File("{$this->_filesPath}/htdigest.3"); - $this->_basicConfig = array( - 'accept_schemes' => 'basic', - 'realm' => 'Test Realm' - ); - $this->_digestConfig = array( - 'accept_schemes' => 'digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300 - ); - $this->_bothConfig = array( - 'accept_schemes' => 'basic digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300 - ); - } - - public function testBasicChallenge() - { - // Trying to authenticate without sending an Authorization header - // should result in a 401 reply with a Www-Authenticate header, and a - // false result. - - // The expected Basic Www-Authenticate header value - $basic = 'Basic realm="' . $this->_bothConfig['realm'] . '"'; - - $data = $this->_doAuth('', 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testDigestChallenge() - { - // Trying to authenticate without sending an Authorization header - // should result in a 401 reply with a Www-Authenticate header, and a - // false result. - - // The expected Digest Www-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth('', 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testBothChallenges() - { - // Trying to authenticate without sending an Authorization header - // should result in a 401 reply with at least one Www-Authenticate - // header, and a false result. - - $data = $this->_doAuth('', 'both'); - extract($data); // $result, $status, $headers - - // The expected Www-Authenticate header values - $basic = 'Basic realm="' . $this->_bothConfig['realm'] . '"'; - $digest = $this->_digestChallenge(); - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Verify the status code and the presence of both challenges - $this->assertEquals(401, $status); - $this->assertEquals('Www-Authenticate', $headers[0]['name']); - $this->assertEquals('Www-Authenticate', $headers[1]['name']); - - // Check to see if the expected challenges match the actual - $this->assertEquals($basic, $headers[0]['value']); - $this->assertEquals($digest, $headers[1]['value']); - } - - public function testBasicAuthValidCreds() - { - // Attempt Basic Authentication with a valid username and password - - $data = $this->_doAuth('Basic ' . base64_encode('Bryce:ThisIsNotMyPassword'), 'basic'); - $this->_checkOK($data); - } - - public function testBasicAuthBadCreds() - { - // Ensure that credentials containing invalid characters are treated as - // a bad username or password. - - // The expected Basic Www-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode("Bad\tChars:In:Creds"), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testBasicAuthBadUser() - { - // Attempt Basic Authentication with a nonexistant username and - // password - - // The expected Basic Www-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode('Nobody:NotValid'), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testBasicAuthBadPassword() - { - // Attempt Basic Authentication with a valid username, but invalid - // password - - // The expected Basic Www-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode('Bryce:Invalid'), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testDigestAuthValidCreds() - { - // Attempt Digest Authentication with a valid username and password - - $data = $this->_doAuth($this->_digestReply('Bryce', 'ThisIsNotMyPassword'), 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthDefaultAlgo() - { - // If the client omits the aglorithm argument, it should default to MD5, - // and work just as above - - $cauth = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $cauth = preg_replace('/algorithm="MD5", /', '', $cauth); - - $data = $this->_doAuth($cauth, 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthQuotedNC() - { - // The nonce count isn't supposed to be quoted, but apparently some - // clients do anyway. - - $cauth = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $cauth = preg_replace('/nc=00000001/', 'nc="00000001"', $cauth); - - $data = $this->_doAuth($cauth, 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthBadCreds() - { - // Attempt Digest Authentication with a bad username and password - - // The expected Digest Www-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth($this->_digestReply('Nobody', 'NotValid'), 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testDigestAuthBadCreds2() - { - // Formerly, a username with invalid characters would result in a 400 - // response, but now should result in 401 response. - - // The expected Digest Www-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth($this->_digestReply('Bad:chars', 'NotValid'), 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testDigestTampered() - { - // Create the tampered header value - $tampered = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $tampered = preg_replace( - '/ nonce="[a-fA-F0-9]{32}", /', - ' nonce="'.str_repeat('0', 32).'", ', - $tampered - ); - - // The expected Digest Www-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth($tampered, 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testBadSchemeRequest() - { - // Sending a request for an invalid authentication scheme should result - // in a 400 Bad Request response. - - $data = $this->_doAuth('Invalid ' . base64_encode('Nobody:NotValid'), 'basic'); - $this->_checkBadRequest($data); - } - - public function testBadDigestRequest() - { - // If any of the individual parts of the Digest Authorization header - // are bad, it results in a 400 Bad Request. But that's a lot of - // possibilities, so we're just going to pick one for now. - $bad = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $bad = preg_replace( - '/realm="([^"]+)"/', // cut out the realm - '', $bad - ); - - $data = $this->_doAuth($bad, 'digest'); - $this->_checkBadRequest($data); - } - - /** - * Acts like a client sending the given Authenticate header value. - * - * @param string $clientHeader Authenticate header value - * @param string $scheme Which authentication scheme to use - * @return array Containing the result, response headers, and the status - */ - protected function _doAuth($clientHeader, $scheme) - { - // Set up stub request and response objects - $request = $this->getMock('Zend_Controller_Request_Http'); - $response = new Zend_Controller_Response_Http; - $response->setHttpResponseCode(200); - $response->headersSentThrowsException = false; - - // Set stub method return values - $request->expects($this->any()) - ->method('getRequestUri') - ->will($this->returnValue('/')); - $request->expects($this->any()) - ->method('getMethod') - ->will($this->returnValue('GET')); - $request->expects($this->any()) - ->method('getServer') - ->will($this->returnValue('PHPUnit')); - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue($clientHeader)); - - // Select an Authentication scheme - switch ($scheme) { - case 'basic': - $use = $this->_basicConfig; - break; - case 'digest': - $use = $this->_digestConfig; - break; - case 'both': - default: - $use = $this->_bothConfig; - } - - // Create the HTTP Auth adapter - $a = new Zend_Auth_Adapter_Http($use); - $a->setBasicResolver($this->_basicResolver); - $a->setDigestResolver($this->_digestResolver); - - // Send the authentication request - $a->setRequest($request); - $a->setResponse($response); - $result = $a->authenticate(); - - $return = array( - 'result' => $result, - 'status' => $response->getHttpResponseCode(), - 'headers' => $response->getHeaders() - ); - return $return; - } - - /** - * Constructs a local version of the digest challenge we expect to receive - * - * @return string - */ - protected function _digestChallenge() - { - $timeout = ceil(time() / 300) * 300; - $nonce = md5($timeout . ':PHPUnit:Zend_Auth_Adapter_Http'); - $opaque = md5('Opaque Data:Zend_Auth_Adapter_Http'); - $wwwauth = 'Digest ' - . 'realm="' . $this->_digestConfig['realm'] . '", ' - . 'domain="' . $this->_digestConfig['digest_domains'] . '", ' - . 'nonce="' . $nonce . '", ' - . 'opaque="' . $opaque . '", ' - . 'algorithm="MD5", ' - . 'qop="auth"'; - - return $wwwauth; - } - - /** - * Constructs a client digest Authorization header - * - * @return string - */ - protected function _digestReply($user, $pass) - { - $nc = '00000001'; - $timeout = ceil(time() / 300) * 300; - $nonce = md5($timeout . ':PHPUnit:Zend_Auth_Adapter_Http'); - $opaque = md5('Opaque Data:Zend_Auth_Adapter_Http'); - $cnonce = md5('cnonce'); - $response = md5(md5($user . ':' . $this->_digestConfig['realm'] . ':' . $pass) . ":$nonce:$nc:$cnonce:auth:" - . md5('GET:/')); - $cauth = 'Digest ' - . 'username="Bryce", ' - . 'realm="' . $this->_digestConfig['realm'] . '", ' - . 'nonce="' . $nonce . '", ' - . 'uri="/", ' - . 'response="' . $response . '", ' - . 'algorithm="MD5", ' - . 'cnonce="' . $cnonce . '", ' - . 'opaque="' . $opaque . '", ' - . 'qop="auth", ' - . 'nc=' . $nc; - - return $cauth; - } - - /** - * Checks for an expected 401 Unauthorized response - * - * @param array $data Authentication results - * @param string $expected Expected Www-Authenticate header value - * @return void - */ - protected function _checkUnauthorized($data, $expected) - { - extract($data); // $result, $status, $headers - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Verify the status code and the presence of the challenge - $this->assertEquals(401, $status); - $this->assertEquals('Www-Authenticate', $headers[0]['name']); - - // Check to see if the expected challenge matches the actual - $this->assertEquals($expected, $headers[0]['value']); - } - - /** - * Checks for an expected 200 OK response - * - * @param array $data Authentication results - * @return void - */ - protected function _checkOK($data) - { - extract($data); // $result, $status, $headers - - // Make sure the result is true - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid()); - - // Verify we got a 200 response - $this->assertEquals(200, $status); - } - - /** - * Checks for an expected 400 Bad Request response - * - * @param array $data Authentication results - * @return void - */ - protected function _checkBadRequest($data) - { - extract($data); // $result, $status, $headers - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Make sure it set the right HTTP code - $this->assertEquals(400, $status); - } -} diff --git a/tests/Zend/Auth/Adapter/Http/ObjectTest.php b/tests/Zend/Auth/Adapter/Http/ObjectTest.php deleted file mode 100644 index 01a774194e..0000000000 --- a/tests/Zend/Auth/Adapter/Http/ObjectTest.php +++ /dev/null @@ -1,298 +0,0 @@ -_filesPath = dirname(__FILE__) . '/_files'; - $this->_basicResolver = new Zend_Auth_Adapter_Http_Resolver_File("$this->_filesPath/htbasic.1"); - $this->_digestResolver = new Zend_Auth_Adapter_Http_Resolver_File("$this->_filesPath/htdigest.3"); - $this->_basicConfig = array( - 'accept_schemes' => 'basic', - 'realm' => 'Test Realm' - ); - $this->_digestConfig = array( - 'accept_schemes' => 'digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300 - ); - $this->_bothConfig = array( - 'accept_schemes' => 'basic digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300 - ); - } - - public function testValidConfigs() - { - try { - $t = new Zend_Auth_Adapter_Http($this->_basicConfig); - } catch (Zend_Auth_Adapter_Exception $e) { - $this->fail('Valid config deemed invalid'); - } - $this->assertFalse(empty($t)); - $this->assertTrue($t instanceof Zend_Auth_Adapter_Http); - unset($t); - - try { - $t = new Zend_Auth_Adapter_Http($this->_digestConfig); - } catch (Zend_Auth_Adapter_Exception $e) { - $this->fail('Valid config deemed invalid'); - } - $this->assertFalse(empty($t)); - $this->assertTrue($t instanceof Zend_Auth_Adapter_Http); - unset($t); - - try { - $t = new Zend_Auth_Adapter_Http($this->_bothConfig); - } catch (Zend_Auth_Adapter_Exception $e) { - $this->fail('Valid config deemed invalid'); - } - $this->assertFalse(empty($t)); - $this->assertTrue($t instanceof Zend_Auth_Adapter_Http); - unset($t); - } - - public function testInvalidConfigs() - { - $badConfigs = array( - 'bad1' => array( - 'auth_type' => 'bogus', - 'realm' => 'Test Realm' - ), - 'bad2' => array( - 'auth_type' => 'digest', - 'realm' => 'Bad: "Chars"'."\n", - 'digest_domains' => '/ /admin', - 'nonce_timeout' => 300 - ), - 'bad3' => array( - 'auth_type' => 'digest', - 'realm' => 'Test Realm', - 'digest_domains' => 'no"quotes'."\tor tabs", - 'nonce_timeout' => 300 - ), - 'bad4' => array( - 'auth_type' => 'digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ /admin', - 'nonce_timeout' => 'junk' - ) - ); - - foreach ($badConfigs as $cfg) { - $t = null; - try { - $t = new Zend_Auth_Adapter_Http($cfg); - $this->fail('Accepted an invalid config'); - } catch (Zend_Auth_Adapter_Exception $e) { - // Good, it threw an exception - } - } - } - - public function testAuthenticateArgs() - { - $a = new Zend_Auth_Adapter_Http($this->_basicConfig); - - try { - $a->authenticate(); - $this->fail('Attempted authentication without request/response objects'); - } catch (Zend_Auth_Adapter_Exception $e) { - // Good, it threw an exception - } - - $request = $this->getMock('Zend_Controller_Request_Http'); - $response = $this->getMock('Zend_Controller_Response_Http'); - - // If this throws an exception, it fails - $a->setRequest($request) - ->setResponse($response) - ->authenticate(); - } - - public function testNoResolvers() - { - $request = $this->getMock('Zend_Controller_Request_Http'); - $response = $this->getMock('Zend_Controller_Response_Http'); - - // Stub request for Basic auth - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue('Basic _basicConfig); - $a->setRequest($request) - ->setResponse($response); - $result = $a->authenticate(); - $this->fail("Tried Basic authentication without a resolver.\n" . Zend_Debug::dump($result->getMessages(),null,false)); - } catch (Zend_Auth_Adapter_Exception $e) { - // Good, it threw an exception - unset($a); - } - - // Stub request for Digest auth, must be reseted (recreated) - $request = $this->getMock('Zend_Controller_Request_Http'); - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue('Digest _digestConfig); - $a->setRequest($request) - ->setResponse($response); - $result = $a->authenticate(); - $this->fail("Tried Digest authentication without a resolver.\n" . Zend_Debug::dump($result->getMessages(),null,false)); - } catch (Zend_Auth_Adapter_Exception $e) { - // Good, it threw an exception - unset($a); - } - } - - public function testWrongResolverUsed() - { - $response = $this->getMock('Zend_Controller_Response_Http'); - $request = $this->getMock('Zend_Controller_Request_Http'); - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue('Basic _digestConfig); - $a->setDigestResolver($this->_digestResolver) - ->setRequest($request) - ->setResponse($response); - $result = $a->authenticate(); - $this->assertEquals($result->getCode(),Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID); - } - - public function testUnsupportedScheme() - { - $response = $this->getMock('Zend_Controller_Response_Http'); - $request = $this->getMock('Zend_Controller_Request_Http'); - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue('NotSupportedScheme _digestConfig); - $a->setDigestResolver($this->_digestResolver) - ->setRequest($request) - ->setResponse($response); - $result = $a->authenticate(); - $this->assertEquals($result->getCode(),Zend_Auth_Result::FAILURE_UNCATEGORIZED); - } -} diff --git a/tests/Zend/Auth/Adapter/Http/ProxyTest.php b/tests/Zend/Auth/Adapter/Http/ProxyTest.php deleted file mode 100644 index f3a72c3695..0000000000 --- a/tests/Zend/Auth/Adapter/Http/ProxyTest.php +++ /dev/null @@ -1,480 +0,0 @@ -_filesPath = dirname(__FILE__) . '/_files'; - $this->_basicResolver = new Zend_Auth_Adapter_Http_Resolver_File("{$this->_filesPath}/htbasic.1"); - $this->_digestResolver = new Zend_Auth_Adapter_Http_Resolver_File("{$this->_filesPath}/htdigest.3"); - $this->_basicConfig = array( - 'accept_schemes' => 'basic', - 'realm' => 'Test Realm', - 'proxy_auth' => true - ); - $this->_digestConfig = array( - 'accept_schemes' => 'digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300, - 'proxy_auth' => true - ); - $this->_bothConfig = array( - 'accept_schemes' => 'basic digest', - 'realm' => 'Test Realm', - 'digest_domains' => '/ http://localhost/', - 'nonce_timeout' => 300, - 'proxy_auth' => true - ); - } - - public function testBasicChallenge() - { - // Trying to authenticate without sending an Proxy-Authorization header - // should result in a 407 reply with a Proxy-Authenticate header, and a - // false result. - - // The expected Basic Proxy-Authenticate header value - $basic = 'Basic realm="' . $this->_bothConfig['realm'] . '"'; - - $data = $this->_doAuth('', 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testDigestChallenge() - { - // Trying to authenticate without sending an Proxy-Authorization header - // should result in a 407 reply with a Proxy-Authenticate header, and a - // false result. - - // The expected Digest Proxy-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth('', 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testBothChallenges() - { - // Trying to authenticate without sending an Proxy-Authorization header - // should result in a 407 reply with at least one Proxy-Authenticate - // header, and a false result. - - $data = $this->_doAuth('', 'both'); - extract($data); // $result, $status, $headers - - // The expected Proxy-Authenticate header values - $basic = 'Basic realm="' . $this->_bothConfig['realm'] . '"'; - $digest = $this->_digestChallenge(); - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Verify the status code and the presence of both challenges - $this->assertEquals(407, $status); - $this->assertEquals('Proxy-Authenticate', $headers[0]['name']); - $this->assertEquals('Proxy-Authenticate', $headers[1]['name']); - - // Check to see if the expected challenges match the actual - $this->assertEquals($basic, $headers[0]['value']); - $this->assertEquals($digest, $headers[1]['value']); - } - - public function testBasicAuthValidCreds() - { - // Attempt Basic Authentication with a valid username and password - - $data = $this->_doAuth('Basic ' . base64_encode('Bryce:ThisIsNotMyPassword'), 'basic'); - $this->_checkOK($data); - } - - public function testBasicAuthBadCreds() - { - // Ensure that credentials containing invalid characters are treated as - // a bad username or password. - - // The expected Basic WWW-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode("Bad\tChars:In:Creds"), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testBasicAuthBadUser() - { - // Attempt Basic Authentication with a bad username and password - - // The expected Basic Proxy-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode('Nobody:NotValid'), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testBasicAuthBadPassword() - { - // Attempt Basic Authentication with a valid username, but invalid - // password - - // The expected Basic WWW-Authenticate header value - $basic = 'Basic realm="' . $this->_basicConfig['realm'] . '"'; - - $data = $this->_doAuth('Basic ' . base64_encode('Bryce:Invalid'), 'basic'); - $this->_checkUnauthorized($data, $basic); - } - - public function testDigestAuthValidCreds() - { - // Attempt Digest Authentication with a valid username and password - - $data = $this->_doAuth($this->_digestReply('Bryce', 'ThisIsNotMyPassword'), 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthDefaultAlgo() - { - // If the client omits the aglorithm argument, it should default to MD5, - // and work just as above - - $cauth = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $cauth = preg_replace('/algorithm="MD5", /', '', $cauth); - - $data = $this->_doAuth($cauth, 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthQuotedNC() - { - // The nonce count isn't supposed to be quoted, but apparently some - // clients do anyway. - - $cauth = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $cauth = preg_replace('/nc=00000001/', 'nc="00000001"', $cauth); - - $data = $this->_doAuth($cauth, 'digest'); - $this->_checkOK($data); - } - - public function testDigestAuthBadCreds() - { - // Attempt Digest Authentication with a bad username and password - - // The expected Digest Proxy-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth($this->_digestReply('Nobody', 'NotValid'), 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testDigestTampered() - { - // Create the tampered header value - $tampered = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $tampered = preg_replace( - '/ nonce="[a-fA-F0-9]{32}", /', - ' nonce="' . str_repeat('0', 32).'", ', - $tampered - ); - - // The expected Digest Proxy-Authenticate header value - $digest = $this->_digestChallenge(); - - $data = $this->_doAuth($tampered, 'digest'); - $this->_checkUnauthorized($data, $digest); - } - - public function testBadSchemeRequest() - { - // Sending a request for an invalid authentication scheme should result - // in a 400 Bad Request response. - - $data = $this->_doAuth('Invalid ' . base64_encode('Nobody:NotValid'), 'basic'); - $this->_checkBadRequest($data); - } - - public function testBadDigestRequest() - { - // If any of the individual parts of the Digest Proxy-Authorization header - // are bad, it results in a 400 Bad Request. But that's a lot of - // possibilities, so we're just going to pick one for now. - $bad = $this->_digestReply('Bryce', 'ThisIsNotMyPassword'); - $bad = preg_replace( - '/realm="([^"]+)"/', // cut out the realm - '', $bad - ); - - $data = $this->_doAuth($bad, 'digest'); - $this->_checkBadRequest($data); - } - - /** - * Acts like a client sending the given Authenticate header value. - * - * @param string $clientHeader Authenticate header value - * @param string $scheme Which authentication scheme to use - * @return array Containing the result, the response headers, and the status - */ - public function _doAuth($clientHeader, $scheme) - { - // Set up stub request and response objects - $request = $this->getMock('Zend_Controller_Request_Http'); - $response = new Zend_Controller_Response_Http; - $response->setHttpResponseCode(200); - $response->headersSentThrowsException = false; - - // Set stub method return values - $request->expects($this->any()) - ->method('getRequestUri') - ->will($this->returnValue('/')); - $request->expects($this->any()) - ->method('getMethod') - ->will($this->returnValue('GET')); - $request->expects($this->any()) - ->method('getServer') - ->will($this->returnValue('PHPUnit')); - $request->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue($clientHeader)); - - // Select an Authentication scheme - switch ($scheme) { - case 'basic': - $use = $this->_basicConfig; - break; - case 'digest': - $use = $this->_digestConfig; - break; - case 'both': - default: - $use = $this->_bothConfig; - } - - // Create the HTTP Auth adapter - $a = new Zend_Auth_Adapter_Http($use); - $a->setBasicResolver($this->_basicResolver); - $a->setDigestResolver($this->_digestResolver); - - // Send the authentication request - $a->setRequest($request); - $a->setResponse($response); - $result = $a->authenticate(); - - $return = array( - 'result' => $result, - 'status' => $response->getHttpResponseCode(), - 'headers' => $response->getHeaders() - ); - return $return; - } - - /** - * Constructs a local version of the digest challenge we expect to receive - * - * @return string - */ - protected function _digestChallenge() - { - $timeout = ceil(time() / 300) * 300; - $nonce = md5($timeout . ':PHPUnit:Zend_Auth_Adapter_Http'); - $opaque = md5('Opaque Data:Zend_Auth_Adapter_Http'); - $wwwauth = 'Digest ' - . 'realm="' . $this->_digestConfig['realm'] . '", ' - . 'domain="' . $this->_digestConfig['digest_domains'] . '", ' - . 'nonce="' . $nonce . '", ' - . 'opaque="' . $opaque . '", ' - . 'algorithm="MD5", ' - . 'qop="auth"'; - - return $wwwauth; - } - - /** - * Constructs a client digest Proxy-Authorization header - * - * @param string $user - * @param string $pass - * @return string - */ - protected function _digestReply($user, $pass) - { - $nc = '00000001'; - $timeout = ceil(time() / 300) * 300; - $nonce = md5($timeout . ':PHPUnit:Zend_Auth_Adapter_Http'); - $opaque = md5('Opaque Data:Zend_Auth_Adapter_Http'); - $cnonce = md5('cnonce'); - $response = md5(md5($user . ':' . $this->_digestConfig['realm'] . ':' . $pass) . ":$nonce:$nc:$cnonce:auth:" - . md5('GET:/')); - $cauth = 'Digest ' - . 'username="Bryce", ' - . 'realm="' . $this->_digestConfig['realm'] . '", ' - . 'nonce="' . $nonce . '", ' - . 'uri="/", ' - . 'response="' . $response . '", ' - . 'algorithm="MD5", ' - . 'cnonce="' . $cnonce . '", ' - . 'opaque="' . $opaque . '", ' - . 'qop="auth", ' - . 'nc=' . $nc; - - return $cauth; - } - - /** - * Checks for an expected 407 Proxy-Unauthorized response - * - * @param array $data Authentication results - * @param string $expected Expected Proxy-Authenticate header value - * @return void - */ - protected function _checkUnauthorized($data, $expected) - { - extract($data); // $result, $status, $headers - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Verify the status code and the presence of the challenge - $this->assertEquals(407, $status); - $this->assertEquals('Proxy-Authenticate', $headers[0]['name']); - - // Check to see if the expected challenge matches the actual - $this->assertEquals($expected, $headers[0]['value']); - } - - /** - * Checks for an expected 200 OK response - * - * @param array $data Authentication results - * @return void - */ - protected function _checkOK($data) - { - extract($data); // $result, $status, $headers - - // Make sure the result is true - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid()); - - // Verify we got a 200 response - $this->assertEquals(200, $status); - } - - /** - * Checks for an expected 400 Bad Request response - * - * @param array $data Authentication results - * @return void - */ - protected function _checkBadRequest($data) - { - extract($data); // $result, $status, $headers - - // Make sure the result is false - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - - // Make sure it set the right HTTP code - $this->assertEquals(400, $status); - } -} diff --git a/tests/Zend/Auth/Adapter/Http/Resolver/AllTests.php b/tests/Zend/Auth/Adapter/Http/Resolver/AllTests.php deleted file mode 100644 index 0b126b1588..0000000000 --- a/tests/Zend/Auth/Adapter/Http/Resolver/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTestSuite('Zend_Auth_Adapter_Http_Resolver_FileTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_Adapter_Http_Resolver_AllTests::main') { - Zend_Auth_Adapter_Http_Resolver_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/Http/Resolver/FileTest.php b/tests/Zend/Auth/Adapter/Http/Resolver/FileTest.php deleted file mode 100644 index ccd36013ca..0000000000 --- a/tests/Zend/Auth/Adapter/Http/Resolver/FileTest.php +++ /dev/null @@ -1,276 +0,0 @@ -_filesPath = dirname(dirname(__FILE__)) . '/_files'; - $this->_validPath = "$this->_filesPath/htdigest.3"; - $this->_badPath = 'doesnotexist'; - $this->_resolver = new Zend_Auth_Adapter_Http_Resolver_File($this->_validPath); - } - - /** - * Ensures that setFile() works as expected for valid input - * - * @return void - */ - public function testSetFileValid() - { - try { - $this->_resolver->setFile($this->_validPath); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->fail('Threw exception on valid file path'); - } - $this->assertEquals($this->_validPath, $this->_resolver->getFile()); - } - - /** - * Ensures that setFile() works as expected for invalid input - * - * @return void - */ - public function testSetFileInvalid() - { - try { - $this->_resolver->setFile($this->_badPath); - $this->fail('Accepted bad path'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Path not readable', $e->getMessage()); - } - } - - /** - * Ensures that __construct() works as expected for valid input - * - * @return void - */ - public function testConstructValid() - { - try { - $v = new Zend_Auth_Adapter_Http_Resolver_File($this->_validPath); - $this->assertEquals($this->_validPath, $v->getFile()); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->fail('Constructor threw exception on valid file path'); - } - } - - /** - * Ensures that __construct() works as expected for invalid input - * - * @return void - */ - public function testConstructInvalid() - { - try { - $v = new Zend_Auth_Adapter_Http_Resolver_File($this->_badPath); - $this->fail('Constructor accepted bad path'); - } catch(Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Path not readable', $e->getMessage()); - } - } - - /** - * Ensures that resolve() works as expected for empty username - * - * @return void - */ - public function testResolveUsernameEmpty() - { - try { - $this->_resolver->resolve('', ''); - $this->fail('Accepted empty username'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertEquals('Username is required', $e->getMessage()); - } - } - - /** - * Ensures that resolve() works as expected for empty realm - * - * @return void - */ - public function testResolveRealmEmpty() - { - try { - $this->_resolver->resolve('username', ''); - $this->fail('Accepted empty realm'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertEquals('Realm is required', $e->getMessage()); - } - } - - /** - * Ensures that resolve() works as expected for invalid username - * - * @return void - */ - public function testResolveUsernameInvalid() - { - try { - $this->_resolver->resolve('bad:name', 'realm'); - $this->fail('Accepted malformed username with colon'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Username must consist', $e->getMessage()); - } - try { - $this->_resolver->resolve("badname\n", 'realm'); - $this->fail('Accepted malformed username with newline'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Username must consist', $e->getMessage()); - } - } - - /** - * Ensures that resolve() works as expected for invalid realm - * - * @return void - */ - public function testResolveRealmInvalid() - { - try { - $this->_resolver->resolve('username', 'bad:realm'); - $this->fail('Accepted malformed realm with colon'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Realm must consist', $e->getMessage()); - } - try { - $this->_resolver->resolve('username', "badrealm\n"); - $this->fail('Accepted malformed realm with newline'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Realm must consist', $e->getMessage()); - } - } - - /** - * Ensures that resolve() works as expected when a previously readable file becomes unreadable - * - * @return void - */ - public function testResolveFileDisappearsMystery() - { - if (rename("$this->_filesPath/htdigest.3", "$this->_filesPath/htdigest.3.renamed")) { - try { - $this->_resolver->resolve('username', 'realm'); - $this->fail('Expected thrown exception upon resolve() after moving valid file'); - } catch (Zend_Auth_Adapter_Http_Resolver_Exception $e) { - $this->assertContains('Unable to open password file', $e->getMessage()); - } - rename("$this->_filesPath/htdigest.3.renamed", "$this->_filesPath/htdigest.3"); - } - } - - /** - * Ensures that resolve() works as expected when provided valid credentials - * - * @return void - */ - public function testResolveValid() - { - $this->assertEquals( - $this->_resolver->resolve('Bryce', 'Test Realm'), - 'd5b7c330d5685beb782a9e22f0f20579', - 'Rejected valid credentials' - ); - } - - /** - * Ensures that resolve() works as expected when provided nonexistent realm - * - * @return void - */ - public function testResolveRealmNonexistent() - { - $this->assertFalse( - $this->_resolver->resolve('Bryce', 'nonexistent'), - 'Accepted a valid user in the wrong realm' - ); - } - - /** - * Ensures that resolve() works as expected when provided nonexistent user - * - * @return void - */ - public function testResolveUserNonexistent() - { - $this->assertFalse( - $this->_resolver->resolve('nonexistent', 'Test Realm'), - 'Accepted a nonexistent user from an existing realm' - ); - } -} diff --git a/tests/Zend/Auth/Adapter/Http/_files/htbasic.1 b/tests/Zend/Auth/Adapter/Http/_files/htbasic.1 deleted file mode 100644 index 7f18f9627f..0000000000 --- a/tests/Zend/Auth/Adapter/Http/_files/htbasic.1 +++ /dev/null @@ -1,3 +0,0 @@ -Bryce:Test Realm:ThisIsNotMyPassword -Mufasa:Test Realm:Circle Of Life -Bad Chars:In:Creds diff --git a/tests/Zend/Auth/Adapter/Http/_files/htdigest.3 b/tests/Zend/Auth/Adapter/Http/_files/htdigest.3 deleted file mode 100644 index f9f4944f34..0000000000 --- a/tests/Zend/Auth/Adapter/Http/_files/htdigest.3 +++ /dev/null @@ -1,2 +0,0 @@ -Bryce:Test Realm:d5b7c330d5685beb782a9e22f0f20579 -Mufasa:Test Realm:200dc292ecb68e04c95bb74ae2ce3c80 diff --git a/tests/Zend/Auth/Adapter/Ldap/AllTests.php b/tests/Zend/Auth/Adapter/Ldap/AllTests.php deleted file mode 100644 index 3511e84b1f..0000000000 --- a/tests/Zend/Auth/Adapter/Ldap/AllTests.php +++ /dev/null @@ -1,88 +0,0 @@ -addTestSuite('Zend_Auth_Adapter_Ldap_OfflineTest'); - - if (defined('TESTS_ZEND_AUTH_ADAPTER_LDAP_ONLINE_ENABLED') - && constant('TESTS_ZEND_AUTH_ADAPTER_LDAP_ONLINE_ENABLED')) { - $suite->addTestSuite('Zend_Auth_Adapter_Ldap_OnlineTest'); - } else { - $suite->addTest(new Zend_Auth_Adapter_Ldap_SkipOnlineTests()); - } - - return $suite; - } -} - -/** - * @category Zend - * @package Zend_Ldap - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Auth - */ -class Zend_Auth_Adapter_Ldap_SkipOnlineTests extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Auth_Adapter_Ldap online tests not enabled in TestConfiguration.php'); - } - - public function testNothing() - { - } -} - -if (PHPUnit_MAIN_METHOD === 'Zend_Auth_Adapter_Ldap_AllTests::main') { - Zend_Auth_Adapter_Ldap_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/Ldap/OfflineTest.php b/tests/Zend/Auth/Adapter/Ldap/OfflineTest.php deleted file mode 100644 index 0c2738844a..0000000000 --- a/tests/Zend/Auth/Adapter/Ldap/OfflineTest.php +++ /dev/null @@ -1,112 +0,0 @@ -_adapter = new Zend_Auth_Adapter_Ldap(); - } - - public function testGetSetLdap() - { - if (!extension_loaded('ldap')) { - $this->markTestSkipped('LDAP is not enabled'); - } - $this->_adapter->setLdap(new Zend_Ldap()); - $this->assertTrue($this->_adapter->getLdap() instanceof Zend_Ldap); - } - - public function testUsernameIsNullIfNotSet() - { - $this->assertNull($this->_adapter->getUsername()); - } - - public function testPasswordIsNullIfNotSet() - { - $this->assertNull($this->_adapter->getPassword()); - } - - public function testSetAndGetUsername() - { - $usernameExpected = 'someUsername'; - $usernameActual = $this->_adapter->setUsername($usernameExpected) - ->getUsername(); - $this->assertSame($usernameExpected, $usernameActual); - } - - public function testSetAndGetPassword() - { - $passwordExpected = 'somePassword'; - $passwordActual = $this->_adapter->setPassword($passwordExpected) - ->getPassword(); - $this->assertSame($passwordExpected, $passwordActual); - } - - public function testSetIdentityProxiesToSetUsername() - { - $usernameExpected = 'someUsername'; - $usernameActual = $this->_adapter->setIdentity($usernameExpected) - ->getUsername(); - $this->assertSame($usernameExpected, $usernameActual); - } - - public function testSetCredentialProxiesToSetPassword() - { - $passwordExpected = 'somePassword'; - $passwordActual = $this->_adapter->setCredential($passwordExpected) - ->getPassword(); - $this->assertSame($passwordExpected, $passwordActual); - } -} diff --git a/tests/Zend/Auth/Adapter/Ldap/OnlineTest.php b/tests/Zend/Auth/Adapter/Ldap/OnlineTest.php deleted file mode 100644 index ba9f89b71f..0000000000 --- a/tests/Zend/Auth/Adapter/Ldap/OnlineTest.php +++ /dev/null @@ -1,207 +0,0 @@ -_options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - if (defined('TESTS_ZEND_LDAP_PORT')) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_START_TLS')) - $this->_options['useStartTls'] = TESTS_ZEND_LDAP_USE_START_TLS; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $this->_options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT')) - $this->_options['accountFilterFormat'] = TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) - $this->_options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) - $this->_options['accountDomainNameShort'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT; - - if (defined('TESTS_ZEND_LDAP_ALT_USERNAME')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_USERNAME] = TESTS_ZEND_LDAP_ALT_USERNAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_PRINCIPAL] = - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - } - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_BACKSLASH] = - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME; - } - } - } - - public function testSimpleAuth() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - TESTS_ZEND_LDAP_ALT_USERNAME, - TESTS_ZEND_LDAP_ALT_PASSWORD - ); - - $result = $adapter->authenticate(); - - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid()); - $this->assertTrue($result->getCode() == Zend_Auth_Result::SUCCESS); - } - - public function testCanonAuth() - { - /* This test authenticates with each of the account name forms - * (uname, uname@example.com, EXAMPLE\uname) AND it does so with - * the accountCanonicalForm set to each of the account name forms - * (e.g. authenticate with uname@example.com but getIdentity() returns - * EXAMPLE\uname). A total of 9 authentications are performed. - */ - foreach ($this->_names as $form => $formName) { - $options = $this->_options; - $options['accountCanonicalForm'] = $form; - $adapter = new Zend_Auth_Adapter_Ldap(array($options)); - $adapter->setPassword(TESTS_ZEND_LDAP_ALT_PASSWORD); - foreach ($this->_names as $username) { - $adapter->setUsername($username); - $result = $adapter->authenticate(); - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid()); - $this->assertTrue($result->getCode() == Zend_Auth_Result::SUCCESS); - $this->assertTrue($result->getIdentity() === $formName); - } - } - } - - public function testInvalidPassAuth() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - TESTS_ZEND_LDAP_ALT_USERNAME, - 'invalid' - ); - - $result = $adapter->authenticate(); - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid() === false); - $this->assertTrue($result->getCode() == Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID); - } - - public function testInvalidUserAuth() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - 'invalid', - 'doesntmatter' - ); - - $result = $adapter->authenticate(); - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($result->isValid() === false); - $this->assertTrue( - $result->getCode() == Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND || - $result->getCode() == Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID - ); - } - - public function testMismatchDomainAuth() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - 'EXAMPLE\\doesntmatter', - 'doesntmatter' - ); - - $result = $adapter->authenticate(); - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertFalse($result->isValid()); - $this->assertThat($result->getCode(), $this->lessThanOrEqual(Zend_Auth_Result::FAILURE)); - $messages = $result->getMessages(); - $this->assertContains('not found', $messages[0]); - } - - public function testAccountObjectRetrieval() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - TESTS_ZEND_LDAP_ALT_USERNAME, - TESTS_ZEND_LDAP_ALT_PASSWORD - ); - - $result = $adapter->authenticate(); - $account = $adapter->getAccountObject(); - - $this->assertTrue($result->isValid()); - $this->assertTrue($account instanceof stdClass); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_DN, $account->dn); - } - - public function testAccountObjectRetrievalWithOmittedAttributes() - { - $adapter = new Zend_Auth_Adapter_Ldap( - array($this->_options), - TESTS_ZEND_LDAP_ALT_USERNAME, - TESTS_ZEND_LDAP_ALT_PASSWORD - ); - - $result = $adapter->authenticate(); - $account = $adapter->getAccountObject(array(), array('userPassword')); - - $this->assertTrue($account instanceof stdClass); - $this->assertFalse(isset($account->userpassword)); - } -} diff --git a/tests/Zend/Auth/Adapter/OpenId/AllTests.php b/tests/Zend/Auth/Adapter/OpenId/AllTests.php deleted file mode 100644 index c78310e1b0..0000000000 --- a/tests/Zend/Auth/Adapter/OpenId/AllTests.php +++ /dev/null @@ -1,67 +0,0 @@ -addTestSuite('Zend_Auth_Adapter_OpenIdTest'); - - return $suite; - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_Adapter_OpenId_AllTests::main') { - Zend_Auth_Adapter_OpenId_AllTests::main(); -} diff --git a/tests/Zend/Auth/Adapter/OpenId/OpenIdTest.php b/tests/Zend/Auth/Adapter/OpenId/OpenIdTest.php deleted file mode 100644 index a90dcaa913..0000000000 --- a/tests/Zend/Auth/Adapter/OpenId/OpenIdTest.php +++ /dev/null @@ -1,535 +0,0 @@ -authenticate(); - $this->assertFalse($ret->isValid()); - $this->assertSame("", $ret->getIdentity()); - $this->assertSame(0, $ret->getCode()); - $msgs = $ret->getMessages(); - $this->assertTrue(is_array($msgs)); - $this->assertSame(2, count($msgs)); - $this->assertSame("Authentication failed", $msgs[0]); - $this->assertSame("Missing openid.mode", $msgs[1]); - } - - public function testAuthenticateLoginInvalid() - { - $adapter = new Zend_Auth_Adapter_OpenId("%sd", new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files")); - $ret = $adapter->authenticate(); - $this->assertFalse($ret->isValid()); - $this->assertSame("%sd", $ret->getIdentity()); - $this->assertSame(0, $ret->getCode()); - $msgs = $ret->getMessages(); - $this->assertTrue(is_array($msgs)); - $this->assertSame(2, count($msgs)); - $this->assertSame("Authentication failed", $msgs[0]); - $this->assertSame("Normalisation failed", $msgs[1]); - } - - public function testAuthenticateLoginValid() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(self::ID, $storage); - $this->assertSame($adapter, $adapter->setResponse($response)); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - } - - public function testSetIdentity() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(null, $storage); - $this->assertSame($adapter, $adapter->setIdentity(self::ID)); - $adapter->setResponse($response); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - } - - public function testSetStorage() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(self::ID); - $this->assertSame($adapter, $adapter->setStorage($storage)); - $adapter->setResponse($response); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - } - - public function testSetReturnTo() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(self::ID, $storage); - $adapter->setResponse($response); - $this->assertSame($adapter, $adapter->setReturnTo("http://www.zf-test.com/return.php")); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - } - - public function testSetRoot() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(self::ID, $storage); - $adapter->setResponse($response); - $this->assertSame($adapter, $adapter->setRoot("http://www.zf-test.com/root.php")); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Froot.php', $query['openid.trust_root'] ); - } - - public function testAuthenticateVerifyInvalid() - { - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - unset($_SERVER['REQUEST_METHOD']); - $_GET = array('openid_mode'=>'id_res', - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_op_endpoint" => self::SERVER, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124fff", - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed,op_endpoint", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $adapter = new Zend_Auth_Adapter_OpenId(null, new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files")); - $ret = $adapter->authenticate(); - $this->assertFalse($ret->isValid()); - $this->assertSame(self::ID, $ret->getIdentity()); - $this->assertSame(0, $ret->getCode()); - $msgs = $ret->getMessages(); - $this->assertTrue(is_array($msgs)); - $this->assertSame(2, count($msgs)); - $this->assertSame("Authentication failed", $msgs[0]); - $this->assertSame("Signature check failed", $msgs[1]); - } - - public function testAuthenticateVerifyGetValid() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - $storage->purgeNonces(); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - unset($_SERVER['REQUEST_METHOD']); - $_GET = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_op_endpoint" => self::SERVER, - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed,op_endpoint", - "openid_sig" => '7DZUB+y05wJqpYSdFs5cX5FyNMY=' - ); - $adapter = new Zend_Auth_Adapter_OpenId(null, $storage); - $ret = $adapter->authenticate(); - $this->assertTrue($ret->isValid()); - } - - public function testAuthenticateVerifyPostValid() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - $storage->purgeNonces(); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_GET = array(); - $_POST = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_op_endpoint" => self::SERVER, - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed,op_endpoint", - "openid_sig" => "7DZUB+y05wJqpYSdFs5cX5FyNMY=" - ); - $adapter = new Zend_Auth_Adapter_OpenId(null, $storage); - $ret = $adapter->authenticate(); - $this->assertTrue($ret->isValid()); - } - - public function testSetExtensions() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $this->assertTrue( $storage->delDiscoveryInfo(self::ID) ); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn) ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - $storage->purgeNonces(); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_GET = array( - "openid_ns" => Zend_OpenId::NS_2_0, - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_op_endpoint" => self::SERVER, - "openid_mode" => "id_res", - "openid_ns_sreg" => "http://openid.net/extensions/sreg/1.1", - "openid_sreg_nickname" => "test", - "openid_signed" => "ns,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,ns.sreg,sreg.nickname,signed,op_endpoint", - "openid_sig" => 'CIJabsMLZWjhJh+rHMnV+brQ7xE=' - ); - $_POST = array(); - $adapter = new Zend_Auth_Adapter_OpenId(null, $storage); - $sreg= new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>false)); - $this->assertSame($adapter, $adapter->setExtensions($sreg)); - $ret = $adapter->authenticate(); - $this->assertTrue($ret->isValid()); - $sreg_data = $sreg->getProperties(); - $this->assertSame("test", $sreg_data['nickname']); - } - - function testSetCheckImmediate() { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn); - - $response = new Zend_OpenId_ResponseHelper(true); - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - - $adapter = new Zend_Auth_Adapter_OpenId(self::ID, $storage); - $adapter->setCheckImmediate(true); - $this->assertSame($adapter, $adapter->setResponse($response)); - $ret = $adapter->authenticate(); - $this->assertTrue(is_null($ret)); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_immediate', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - } - - function testSetHttpClient() { - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files"); - $storage->delDiscoveryInfo(self::ID); - $storage->delAssociation(self::SERVER); - $adapter = new Zend_Auth_Adapter_OpenId(self::ID, $storage); - $http = new Zend_Http_Client(null, - array( - 'maxredirects' => 4, - 'timeout' => 15, - 'useragent' => 'Zend_OpenId' - )); - $test = new Zend_Http_Client_Adapter_Test(); - $http->setAdapter($test); - $adapter->SetHttpClient($http); - $ret = $adapter->authenticate(); - $this->assertSame("GET / HTTP/1.1\r\n". - "Host: id.myopenid.com\r\n". - "Connection: close\r\n". - "Accept-encoding: gzip, deflate\r\n". - "User-Agent: Zend_OpenId\r\n\r\n", - $http->getLastRequest()); - } - -} diff --git a/tests/Zend/Auth/Adapter/OpenId/ResponseHelper.php b/tests/Zend/Auth/Adapter/OpenId/ResponseHelper.php deleted file mode 100644 index 0864741fec..0000000000 --- a/tests/Zend/Auth/Adapter/OpenId/ResponseHelper.php +++ /dev/null @@ -1,54 +0,0 @@ -_canSendHeaders = $canSendHeaders; - } - - public function canSendHeaders($throw = false) - { - return $this->_canSendHeaders; - } - - public function sendResponse() - { - } -} diff --git a/tests/Zend/Auth/AllTests.php b/tests/Zend/Auth/AllTests.php deleted file mode 100644 index 7183c18e1a..0000000000 --- a/tests/Zend/Auth/AllTests.php +++ /dev/null @@ -1,66 +0,0 @@ -addTest(Zend_Auth_Adapter_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Auth_AllTests::main') { - Zend_Auth_AllTests::main(); -} diff --git a/tests/Zend/AuthTest.php b/tests/Zend/AuthTest.php deleted file mode 100644 index 0d87b5bb9e..0000000000 --- a/tests/Zend/AuthTest.php +++ /dev/null @@ -1,111 +0,0 @@ -assertTrue(Zend_Auth::getInstance() instanceof Zend_Auth); - $this->assertEquals(Zend_Auth::getInstance(), Zend_Auth::getInstance()); - } - - /** - * Ensures that getStorage() returns Zend_Auth_Storage_Session - * - * @return void - */ - public function testGetStorage() - { - $this->assertTrue(Zend_Auth::getInstance()->getStorage() instanceof Zend_Auth_Storage_Session); - } - - /** - * Ensures expected behavior for successful authentication - * - * @return void - */ - public function testAuthenticate() - { - $auth = Zend_Auth::getInstance(); - $result = $auth->authenticate(new Zend_AuthTest_Success_Adapter()); - $this->assertTrue($result instanceof Zend_Auth_Result); - $this->assertTrue($auth->hasIdentity()); - $this->assertEquals('someIdentity', $auth->getIdentity()); - } - - /** - * Ensures expected behavior for clearIdentity() - * - * @return void - */ - public function testClearIdentity() - { - $auth = Zend_Auth::getInstance(); - $auth->clearIdentity(); - $this->assertFalse($auth->hasIdentity()); - $this->assertEquals(null, $auth->getIdentity()); - } -} - - -class Zend_AuthTest_Success_Adapter implements Zend_Auth_Adapter_Interface -{ - public function authenticate() - { - return new Zend_Auth_Result(true, 'someIdentity'); - } -} From e8f7aa9a9edb1f62ab75443787774ae61591f6b1 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:46:22 -0500 Subject: [PATCH 32/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_OpenId Tests and Demos --- demos/Zend/OpenId/login-bg.gif | Bin 237 -> 0 bytes .../controllers/ErrorController.php | 64 - .../controllers/IndexController.php | 112 -- .../application/views/scripts/error/404.phtml | 12 - .../application/views/scripts/error/500.phtml | 12 - .../views/scripts/index/login.phtml | 17 - .../views/scripts/index/welcome.phtml | 14 - demos/Zend/OpenId/mvc_auth/html/.htaccess | 2 - demos/Zend/OpenId/mvc_auth/html/config.ini | 1 - demos/Zend/OpenId/mvc_auth/html/index.php | 36 - demos/Zend/OpenId/templates/identity.phtml | 9 - demos/Zend/OpenId/templates/identity2.phtml | 10 - demos/Zend/OpenId/templates/login.phtml | 83 - demos/Zend/OpenId/templates/profile.phtml | 14 - demos/Zend/OpenId/templates/register.phtml | 69 - .../templates/registration_complete.phtml | 11 - demos/Zend/OpenId/templates/trust.phtml | 18 - demos/Zend/OpenId/test_auth.php | 68 - demos/Zend/OpenId/test_consumer.php | 128 -- demos/Zend/OpenId/test_server.php | 268 --- tests/Zend/AllTests.php | 4 - tests/Zend/OpenId/AllTests.php | 68 - .../Zend/OpenId/Consumer/Storage/FileTest.php | 305 --- tests/Zend/OpenId/ConsumerTest.php | 1092 ----------- tests/Zend/OpenId/Extension/SregTest.php | 258 --- tests/Zend/OpenId/ExtensionTest.php | 109 -- .../Zend/OpenId/Provider/Storage/FileTest.php | 212 --- .../Zend/OpenId/Provider/User/SessionTest.php | 74 - tests/Zend/OpenId/ProviderTest.php | 1645 ----------------- tests/Zend/OpenId/ResponseHelper.php | 54 - tests/Zend/OpenIdTest.php | 699 ------- 31 files changed, 5468 deletions(-) delete mode 100644 demos/Zend/OpenId/login-bg.gif delete mode 100644 demos/Zend/OpenId/mvc_auth/application/controllers/ErrorController.php delete mode 100644 demos/Zend/OpenId/mvc_auth/application/controllers/IndexController.php delete mode 100644 demos/Zend/OpenId/mvc_auth/application/views/scripts/error/404.phtml delete mode 100644 demos/Zend/OpenId/mvc_auth/application/views/scripts/error/500.phtml delete mode 100644 demos/Zend/OpenId/mvc_auth/application/views/scripts/index/login.phtml delete mode 100644 demos/Zend/OpenId/mvc_auth/application/views/scripts/index/welcome.phtml delete mode 100644 demos/Zend/OpenId/mvc_auth/html/.htaccess delete mode 100644 demos/Zend/OpenId/mvc_auth/html/config.ini delete mode 100644 demos/Zend/OpenId/mvc_auth/html/index.php delete mode 100644 demos/Zend/OpenId/templates/identity.phtml delete mode 100644 demos/Zend/OpenId/templates/identity2.phtml delete mode 100644 demos/Zend/OpenId/templates/login.phtml delete mode 100644 demos/Zend/OpenId/templates/profile.phtml delete mode 100644 demos/Zend/OpenId/templates/register.phtml delete mode 100644 demos/Zend/OpenId/templates/registration_complete.phtml delete mode 100644 demos/Zend/OpenId/templates/trust.phtml delete mode 100644 demos/Zend/OpenId/test_auth.php delete mode 100644 demos/Zend/OpenId/test_consumer.php delete mode 100644 demos/Zend/OpenId/test_server.php delete mode 100644 tests/Zend/OpenId/AllTests.php delete mode 100644 tests/Zend/OpenId/Consumer/Storage/FileTest.php delete mode 100644 tests/Zend/OpenId/ConsumerTest.php delete mode 100644 tests/Zend/OpenId/Extension/SregTest.php delete mode 100644 tests/Zend/OpenId/ExtensionTest.php delete mode 100644 tests/Zend/OpenId/Provider/Storage/FileTest.php delete mode 100644 tests/Zend/OpenId/Provider/User/SessionTest.php delete mode 100644 tests/Zend/OpenId/ProviderTest.php delete mode 100644 tests/Zend/OpenId/ResponseHelper.php delete mode 100644 tests/Zend/OpenIdTest.php diff --git a/demos/Zend/OpenId/login-bg.gif b/demos/Zend/OpenId/login-bg.gif deleted file mode 100644 index cde836c893f64bcfec04b9c817e3371ff122fe19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmVb{bmUKcqz}))c5uC(7v?)v4a2P)ZNa- z@$&T2)z|&~{r~^}A^8LV00000EC2ui01yBW000GQ;3tk`X`bk)Wk@<6#nZYULKH{p zEx|?+kif!I0vIL|#ZMubBmjWH2OtmxIFVa~6JQ7!1CK!f5W#StOTv&C3=E8h2vI1s n+#cd5;2fT3B_0kF0v!+!GARoV78n&7dMN`JIW(4+BOw4gP{MS* diff --git a/demos/Zend/OpenId/mvc_auth/application/controllers/ErrorController.php b/demos/Zend/OpenId/mvc_auth/application/controllers/ErrorController.php deleted file mode 100644 index 13a054dc7b..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/controllers/ErrorController.php +++ /dev/null @@ -1,64 +0,0 @@ -_getParam('error_handler', false); - if (!$errors) { - // Unknown application error - return $this->render('500'); - } - - switch ($errors->type) { - case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: - case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: - // Page not found (404) error - $this->render('404'); - break; - default: - // Application (500) error - $this->render('500'); - break; - } - } -} diff --git a/demos/Zend/OpenId/mvc_auth/application/controllers/IndexController.php b/demos/Zend/OpenId/mvc_auth/application/controllers/IndexController.php deleted file mode 100644 index c7bd398d1a..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/controllers/IndexController.php +++ /dev/null @@ -1,112 +0,0 @@ -hasIdentity()) { - $this->_redirect('/index/login'); - } else { - $this->_redirect('/index/welcome'); - } - } - - /** - * welcomeAction - * - * @return void - */ - public function welcomeAction() - { - $auth = Zend_Auth::getInstance(); - if (!$auth->hasIdentity()) { - $this->_redirect('index/login'); - } - $this->view->user = $auth->getIdentity(); - } - - /** - * loginAction - * - * @return void - */ - public function loginAction() - { - $this->view->status = ""; - if (($this->_request->isPost() && - $this->_request->getPost('openid_action') == 'login' && - $this->_request->getPost('openid_identifier', '') !== '') || - ($this->_request->isPost() && - $this->_request->getPost('openid_mode') !== null) || - (!$this->_request->isPost() && - $this->_request->getQuery('openid_mode') != null)) { - Zend_Loader::loadClass('Zend_Auth_Adapter_OpenId'); - $auth = Zend_Auth::getInstance(); - $result = $auth->authenticate( - new Zend_Auth_Adapter_OpenId($this->_request->getPost('openid_identifier'))); - if ($result->isValid()) { - $this->_redirect('/index/welcome'); - } else { - $auth->clearIdentity(); - foreach ($result->getMessages() as $message) { - $this->view->status .= "$message
      \n"; - } - } - } - $this->render(); - } - - /** - * logoutAction - * - * @return void - */ - public function logoutAction() - { - Zend_Auth::getInstance()->clearIdentity(); - $this->_redirect('/index/index'); - } -} diff --git a/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/404.phtml b/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/404.phtml deleted file mode 100644 index d4aa37821a..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/404.phtml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - ZF OpenId Auth Application - - -Page not found! - - diff --git a/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/500.phtml b/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/500.phtml deleted file mode 100644 index c7c48d1946..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/views/scripts/error/500.phtml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - ZF OpenId Auth Application - - -An error occurred in this application! - - diff --git a/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/login.phtml b/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/login.phtml deleted file mode 100644 index ddb5f0b9e6..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/login.phtml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - ZF OpenId Auth Application - - -status; ?> -

      -OpenID Login - - -
      - - \ No newline at end of file diff --git a/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/welcome.phtml b/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/welcome.phtml deleted file mode 100644 index df7f628d26..0000000000 --- a/demos/Zend/OpenId/mvc_auth/application/views/scripts/index/welcome.phtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - ZF OpenId Auth Application - - -Hello user; ?>! -
      -logout - - diff --git a/demos/Zend/OpenId/mvc_auth/html/.htaccess b/demos/Zend/OpenId/mvc_auth/html/.htaccess deleted file mode 100644 index 06cc9adafc..0000000000 --- a/demos/Zend/OpenId/mvc_auth/html/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -RewriteEngine on -RewriteRule !\.(js|ico|gif|jpg|png|css|php)$ index.php diff --git a/demos/Zend/OpenId/mvc_auth/html/config.ini b/demos/Zend/OpenId/mvc_auth/html/config.ini deleted file mode 100644 index de05220d65..0000000000 --- a/demos/Zend/OpenId/mvc_auth/html/config.ini +++ /dev/null @@ -1 +0,0 @@ -baseUrl=/demos/Zend/OpenId/mvc_auth/html \ No newline at end of file diff --git a/demos/Zend/OpenId/mvc_auth/html/index.php b/demos/Zend/OpenId/mvc_auth/html/index.php deleted file mode 100644 index 1575c85d12..0000000000 --- a/demos/Zend/OpenId/mvc_auth/html/index.php +++ /dev/null @@ -1,36 +0,0 @@ -setControllerDirectory(dirname(dirname(__FILE__)) . '/application/controllers') - ->setBaseUrl($config->baseUrl); -$front->dispatch(); diff --git a/demos/Zend/OpenId/templates/identity.phtml b/demos/Zend/OpenId/templates/identity.phtml deleted file mode 100644 index a1f3eea239..0000000000 --- a/demos/Zend/OpenId/templates/identity.phtml +++ /dev/null @@ -1,9 +0,0 @@ - - -Zend OpenID Server Example - - - -server . '?openid=' . $this->name;?> - - diff --git a/demos/Zend/OpenId/templates/identity2.phtml b/demos/Zend/OpenId/templates/identity2.phtml deleted file mode 100644 index 3cd7cd412a..0000000000 --- a/demos/Zend/OpenId/templates/identity2.phtml +++ /dev/null @@ -1,10 +0,0 @@ - - -Zend OpenID Server Example - - - - -server . '?openid2=' . $this->name;?> - - diff --git a/demos/Zend/OpenId/templates/login.phtml b/demos/Zend/OpenId/templates/login.phtml deleted file mode 100644 index 28288a1da1..0000000000 --- a/demos/Zend/OpenId/templates/login.phtml +++ /dev/null @@ -1,83 +0,0 @@ - - - -Zend OpenID Server Example - - - - -error)) { - echo ''; -} -?> -
      -
      -
      -OpenID Login - -
      - - -id)) { - echo ' value="' . $this->id . '"'; - } - if (isset($this->ro)) { - echo ' readonly="1" disabled="1">'."\n"; - echo '> -
      - - - -
        - -
      -ro)) { - echo '
      '; - echo 'register'; - } - -?> -
      -
      -
      - - diff --git a/demos/Zend/OpenId/templates/profile.phtml b/demos/Zend/OpenId/templates/profile.phtml deleted file mode 100644 index 36f9d295fa..0000000000 --- a/demos/Zend/OpenId/templates/profile.phtml +++ /dev/null @@ -1,14 +0,0 @@ - - - -Zend OpenID Server Example - - -

      Your are logged in as url;?>

      -
      -LogOut -

      Trusted Sites:

      - -sites;?> -
      - diff --git a/demos/Zend/OpenId/templates/register.phtml b/demos/Zend/OpenId/templates/register.phtml deleted file mode 100644 index 0b6157af5e..0000000000 --- a/demos/Zend/OpenId/templates/register.phtml +++ /dev/null @@ -1,69 +0,0 @@ - - - -Zend OpenID Server Example - - - - -error)) { - echo ''; -} -?> -
      -
      -
      -Register OpenID Account - -
      - - -name)) {echo ' value="' . $this->name . '"';} ?>> -
      - - - -
      - - - -
        - -
      -
      -
      -
      - - diff --git a/demos/Zend/OpenId/templates/registration_complete.phtml b/demos/Zend/OpenId/templates/registration_complete.phtml deleted file mode 100644 index 15661e1589..0000000000 --- a/demos/Zend/OpenId/templates/registration_complete.phtml +++ /dev/null @@ -1,11 +0,0 @@ - - - -Zend OpenID Server Example - - -

      Than you for registration!

      -

      Your OpenID identity url;?>

      -

      You also can use OpenID 2.0 identity url2;?>

      - - \ No newline at end of file diff --git a/demos/Zend/OpenId/templates/trust.phtml b/demos/Zend/OpenId/templates/trust.phtml deleted file mode 100644 index 0c7a3645f2..0000000000 --- a/demos/Zend/OpenId/templates/trust.phtml +++ /dev/null @@ -1,18 +0,0 @@ - - - -Zend OpenID Server Example - - -

      A site identifying as site;?> has asked us for confirmation that url;?> is your identity URL.

      -
      -sreg;?> - -
      - -
      - - -
      - - diff --git a/demos/Zend/OpenId/test_auth.php b/demos/Zend/OpenId/test_auth.php deleted file mode 100644 index 4c14422072..0000000000 --- a/demos/Zend/OpenId/test_auth.php +++ /dev/null @@ -1,68 +0,0 @@ -authenticate( - new Zend_Auth_Adapter_OpenId(@$_POST['openid_identifier'])); - if ($result->isValid()) { - Zend_OpenId::redirect(Zend_OpenId::selfURL()); - } else { - $auth->clearIdentity(); - foreach ($result->getMessages() as $message) { - $status .= "$message
      \n"; - } - } -} else if ($auth->hasIdentity()) { - if (isset($_POST['openid_action']) && - $_POST['openid_action'] == "logout") { - $auth->clearIdentity(); - } else { - $status = "You are logged-in as " . $auth->getIdentity() . "
      \n"; - } -} -?> - - -
      -OpenID Login - - - -
      diff --git a/demos/Zend/OpenId/test_consumer.php b/demos/Zend/OpenId/test_consumer.php deleted file mode 100644 index 96cf7a5bf0..0000000000 --- a/demos/Zend/OpenId/test_consumer.php +++ /dev/null @@ -1,128 +0,0 @@ -login($id, null, null, $sreg)) { - $status = "OpenID login failed (".$consumer->getError().")"; - } -} else if (isset($_GET['openid_mode'])) { - if ($_GET['openid_mode'] == "id_res") { - $sreg = new Zend_OpenId_Extension_Sreg(); - $consumer = new Zend_OpenId_Consumer(); - if ($consumer->verify($_GET, $id, $sreg)) { - $status = "VALID $id"; - $data = $sreg->getProperties(); - } else { - $status = "INVALID $id (".$consumer->getError().")"; - } - } else if ($_GET['openid_mode'] == "cancel") { - $status = "CANCELED"; - } -} -$sreg_html = ""; -$sreg = new Zend_OpenId_Extension_Sreg(); -foreach (Zend_OpenId_Extension_Sreg::getSregProperties() as $prop) { - $val = isset($data[$prop]) ? $data[$prop] : ""; - $sreg_html .= <<$prop - - - - - - - - $val - -EOF; -} -?> - - - -Zend OpenID Consumer Example - - - -\n";?> -
      -
      -
      -OpenID Login - -
      - - - - -\n";?> -
       requirdoptionalnone 
      -
      -register -
      -
      -
      -
      - - diff --git a/demos/Zend/OpenId/test_server.php b/demos/Zend/OpenId/test_server.php deleted file mode 100644 index d5aa16bbd0..0000000000 --- a/demos/Zend/OpenId/test_server.php +++ /dev/null @@ -1,268 +0,0 @@ - $val) { - $str .= "$key:\"$val\";"; - } - } - $trusted = true; - } - $s = '
      ' - . '' - . '' - . '' - . $site -// . '' -// . ($trusted ? 'allowed' : 'denied') - . '' - . ($trusted ? - '' : - '') - . '' - . '' - . ''.$str.'' - . '
      '; - return $s; -} - -/** - * sreg_form - * - * @param Zend_OpenId_Extension_Sreg $sreg - * @return string - */ -function sreg_form(Zend_OpenId_Extension_Sreg $sreg) -{ - $s = ""; - $props = $sreg->getProperties(); - if (is_array($props) && count($props) > 0) { - $s = 'It also requests additinal information about you'; - $s .= ' (fields marked by * are required)
      '; - $s .= ''; - foreach ($props as $prop => $val) { - if ($val) { - $s .= ''; - } else { - $s .= ''; - } - $value = ""; - $s .= ''; - } - $s .= '
      '.$prop.':*
      '.$prop.':

      '; - $policy = $sreg->getPolicyUrl(); - if (!empty($policy)) { - $s .= 'The private policy can be found at '.$policy.'.
      '; - } - } - return $s; -} - -$session = new Zend_Session_Namespace("opeinid.server"); -Zend_Session::start(); - -$ret = false; -if ($_SERVER["REQUEST_METHOD"] == "GET") { - if (!isset($_GET['openid_action']) && isset($_GET['openid_mode'])) { - $ret = $server->handle($_GET, new Zend_OpenId_Extension_Sreg()); - } else { - require_once 'Zend/View.php'; - - $view = new Zend_View(); - $view->setScriptPath(dirname(__FILE__) . '/templates'); - $view->strictVars(true); - - if (isset($session->id)) { - $view->id = $session->id; - } - if (isset($session->error)) { - $view->error = $session->error; - unset($session->error); - } - if (isset($_GET['openid_action'])) { - if ($_GET['openid_action'] == 'register') { - $ret = $view->render('register.phtml'); - } else if ($_GET['openid_action'] == 'registration_complete' && - isset($_GET['openid_name'])) { - $view->name = $_GET['openid_name']; - $view->url = Zend_OpenId::selfURL() . '?openid=' . $view->name; - if ($server->hasUser($view->url)) { - $view->url2 = Zend_OpenId::selfURL() . '?openid2=' . $view->name; - $ret = $view->render('registration_complete.phtml'); - } - } else if ($_GET['openid_action'] == 'logout') { - $server->logout(); - header('Location: ' . $_SERVER['PHP_SELF']); - exit; - } else if ($_GET['openid_action'] == 'login') { - if (isset($_GET['openid_identity'])) { - $view->id = $_GET['openid_identity']; - $view->ro = true; - } - $ret = $view->render('login.phtml'); - } else if ($_GET['openid_action'] == 'trust') { - if ($server->getLoggedInUser() !== false) { - $view->site = $server->getSiteRoot($_GET); - $view->url = $server->getLoggedInUser(); - $sreg = new Zend_OpenId_Extension_Sreg(); - $sreg->parseRequest($_GET); - $view->sreg = sreg_form($sreg); - if ($server->hasUser($view->url)) { - $ret = $view->render('trust.phtml'); - } - } - } - } else if (isset($_GET['openid'])) { - $url = Zend_OpenId::selfURL() . '?openid=' . $_GET['openid']; - if ($server->hasUser($url)) { - $view->server = Zend_OpenId::selfURL(); - $view->name = $_GET['openid']; - $ret = $view->render('identity.phtml'); - } - } else if (isset($_GET['openid2'])) { - $url = Zend_OpenId::selfURL() . '?openid=' . $_GET['openid2']; - if ($server->hasUser($url)) { - $view->server = Zend_OpenId::selfURL(); - $view->name = $_GET['openid2']; - $ret = $view->render('identity2.phtml'); - } - } else { - if ($server->getLoggedInUser() !== false) { - $view->url = $server->getLoggedInUser(); - if ($server->hasUser($view->url)) { - $sites = $server->getTrustedSites(); - $s = ""; - foreach ($sites as $site => $trusted) { - if (is_bool($trusted) || is_array($trusted)) { - $s .= trust_form($site, $trusted); - } - } - if (empty($s)) { - $s = "None"; - } - $view->sites = $s; - $ret = $view->render('profile.phtml'); - } - } else { - $ret = $view->render('login.phtml'); - } - } - } -} else if ($_SERVER["REQUEST_METHOD"] == "POST") { - if (!isset($_POST['openid_action']) && isset($_POST['openid_mode'])) { - $ret = $server->handle($_POST, new Zend_OpenId_Extension_Sreg()); - } else if (isset($_POST['openid_action'])) { - if ($_POST['openid_action'] == 'login' && - isset($_POST['openid_url']) && - isset($_POST['openid_password'])) { - if (!$server->login($_POST['openid_url'], - $_POST['openid_password'])) { - $session->error = 'Wrong identity/password!'; - $session->id = $_POST['openid_url']; - } - unset($_GET['openid_action']); - Zend_OpenId::redirect($_SERVER['PHP_SELF'], $_GET); - } else if ($_POST['openid_action'] == 'register' && - isset($_POST['openid_name']) && - isset($_POST['openid_password']) && - isset($_POST['openid_password2'])) { - - $url = Zend_OpenId::selfURL() . '?openid=' . $_POST['openid_name']; - if ($_POST['openid_password'] != $_POST['openid_password2']) { - $session->name = $_POST['openid_name']; - $session->error = 'Password mismatch.'; - header('Location: ' . $_SERVER['PHP_SELF'] . '?openid.action=register'); - } else if ($server->register($url, $_POST['openid_password'])) { - header('Location: ' . $_SERVER['PHP_SELF'] . '?openid.action=registration_complete&openid.name=' . $_POST['openid_name']); - } else { - $session->error = 'Registration failed. Try another name.'; - header('Location: ' . $_SERVER['PHP_SELF'] . '?openid.action=register'); - } - exit; - } else if ($_POST['openid_action'] == 'trust') { - if (isset($_GET['openid_return_to'])) { - $sreg = new Zend_OpenId_Extension_Sreg(); - $sreg->parseResponse($_POST); - if (isset($_POST['allow'])) { - if (isset($_POST['forever'])) { - $server->allowSite($server->getSiteRoot($_GET), $sreg); - } - unset($_GET['openid_action']); - $server->respondToConsumer($_GET, $sreg); - } else if (isset($_POST['deny'])) { - if (isset($_POST['forever'])) { - $server->denySite($server->getSiteRoot($_GET)); - } - Zend_OpenId::redirect($_GET['openid_return_to'], array('openid.mode'=>'cancel')); - } - } else if (isset($_POST['allow'])) { - $server->allowSite($_POST['site']); - header('Location: ' . $_SERVER['PHP_SELF']); - exit; - } else if (isset($_POST['deny'])) { - $server->denySite($_POST['site']); - header('Location: ' . $_SERVER['PHP_SELF']); - exit; - } else if (isset($_POST['del'])) { - $server->delSite($_POST['site']); - header('Location: ' . $_SERVER['PHP_SELF']); - exit; - } - } - } -} -if (is_string($ret)) { - echo $ret; -} else if ($ret !== true) { - header('HTTP/1.0 403 Forbidden'); - echo 'Forbidden'; -} diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index ab0660a392..5ee53ea96a 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -54,8 +54,6 @@ require_once 'Zend/MimeTest.php'; require_once 'Zend/Mime/AllTests.php'; require_once 'Zend/Oauth/AllTests.php'; -require_once 'Zend/OpenIdTest.php'; -require_once 'Zend/OpenId/AllTests.php'; require_once 'Zend/PdfTest.php'; require_once 'Zend/Pdf/AllTests.php'; require_once 'Zend/ProgressBar/AllTests.php'; @@ -112,8 +110,6 @@ public static function suiteBuffered() // These tests require no output be sent prior to running as they rely // on internal PHP functions - $suite->addTestSuite('Zend_OpenIdTest'); - $suite->addTest(Zend_OpenId_AllTests::suite()); $suite->addTest(Zend_Session_AllTests::suite()); $suite->addTest(Zend_Soap_AllTests::suite()); diff --git a/tests/Zend/OpenId/AllTests.php b/tests/Zend/OpenId/AllTests.php deleted file mode 100644 index d90de08016..0000000000 --- a/tests/Zend/OpenId/AllTests.php +++ /dev/null @@ -1,68 +0,0 @@ -addTestSuite('Zend_OpenId_ConsumerTest'); - $suite->addTestSuite('Zend_OpenId_Consumer_Storage_FileTest'); - $suite->addTestSuite('Zend_OpenId_ProviderTest'); - $suite->addTestSuite('Zend_OpenId_Provider_Storage_FileTest'); - $suite->addTestSuite('Zend_OpenId_Provider_User_SessionTest'); - $suite->addTestSuite('Zend_OpenId_ExtensionTest'); - $suite->addTestSuite('Zend_OpenId_Extension_SregTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_OpenId_AllTests::main') { - Zend_OpenId_AllTests::main(); -} diff --git a/tests/Zend/OpenId/Consumer/Storage/FileTest.php b/tests/Zend/OpenId/Consumer/Storage/FileTest.php deleted file mode 100644 index 5ab619bfd0..0000000000 --- a/tests/Zend/OpenId/Consumer/Storage/FileTest.php +++ /dev/null @@ -1,305 +0,0 @@ -_tmpDir = dirname(__FILE__) . "/_files"; - - // Clear directory - self::_rmDir($this->_tmpDir); - mkdir($this->_tmpDir); - } - - public function tearDown() - { - self::_rmDir($this->_tmpDir); - } - - /** - * testing __construct - * - */ - public function testConstruct() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $storage = new Zend_OpenId_Consumer_Storage_File($dir); - $this->assertTrue( is_dir($dir) ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - return; - } - - chmod($dir, 0400); - $dir2 = $dir . '/test'; - try { - $storage = new Zend_OpenId_Consumer_Storage_File($dir2); - $ex = null; - } catch (Exception $e) { - $ex = $e; - } - $this->assertTrue( $ex instanceof Zend_OpenId_Exception ); - $this->assertSame( Zend_OpenId_Exception::ERROR_STORAGE, $ex->getCode() ); - $this->assertContains( 'Cannot access storage directory', $ex->getMessage() ); - chmod($dir, 0777); - $this->assertFalse( is_dir($dir2) ); - self::_rmDir($dir); - } - - /** - * testing getAssociation - * - */ - public function testGetAssociation() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delAssociation(self::URL); - $this->assertTrue( $storage->addAssociation(self::URL, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - $this->assertTrue( $storage->getAssociation(self::URL, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( self::HANDLE, $handle ); - $this->assertSame( self::MAC_FUNC, $macFunc ); - $this->assertSame( self::SECRET, $secret ); - $this->assertSame( $expiresIn, $expires ); - $this->assertTrue( $storage->delAssociation(self::URL) ); - $this->assertFalse( $storage->getAssociation(self::URL, $handle, $macFunc, $secret, $expires) ); - - $storage = new Zend_OpenId_Consumer_Storage_File($dir); - $this->assertTrue( is_dir($dir) ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - return; - } - - chmod($dir, 0); - $this->assertFalse( $storage->addAssociation(self::URL, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - chmod($dir, 0777); - } - - /** - * testing getAssociationByHandle - * - */ - public function testGetAssociationByHandle() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delAssociation(self::URL); - $this->assertTrue( $storage->addAssociation(self::URL, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - $this->assertTrue( $storage->getAssociationByHandle(self::HANDLE, $url, $macFunc, $secret, $expires) ); - $this->assertSame( self::URL, $url ); - $this->assertSame( self::MAC_FUNC, $macFunc ); - $this->assertSame( self::SECRET, $secret ); - $this->assertSame( $expiresIn, $expires ); - $this->assertTrue( $storage->delAssociation(self::URL) ); - $this->assertFalse( $storage->getAssociationByHandle(self::HANDLE, $url, $macFunc, $secret, $expires) ); - } - - /** - * testing getAssociation - * - */ - public function testGetAssociationExpiratin() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 1; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delAssociation(self::URL); - $this->assertTrue( $storage->addAssociation(self::URL, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - sleep(2); - $this->assertFalse( $storage->getAssociation(self::URL, $handle, $macFunc, $secret, $expires) ); - } - - /** - * testing getAssociationByHandle - * - */ - public function testGetAssociationByHandleExpiration() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 1; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delAssociation(self::URL); - $this->assertTrue( $storage->addAssociation(self::URL, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - sleep(2); - $this->assertFalse( $storage->getAssociationByHandle(self::HANDLE, $url, $macFunc, $secret, $expires) ); - } - - /** - * testing getDiscoveryInfo - * - */ - public function testGetDiscoveryInfo() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, self::VERSION, $expiresIn) ); - $this->assertTrue( $storage->getDiscoveryInfo(self::ID, $realId, $server, $version, $expires) ); - $this->assertSame( self::REAL_ID, $realId ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( self::VERSION, $version ); - $this->assertSame( $expiresIn, $expires ); - $this->assertTrue( $storage->delDiscoveryInfo(self::ID) ); - $this->assertFalse( $storage->getDiscoveryInfo(self::ID, $realId, $server, $version, $expires) ); - - self::_rmDir($dir); - $storage = new Zend_OpenId_Consumer_Storage_File($dir); - $this->assertTrue( is_dir($dir) ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - return; - } - - chmod($dir, 0); - $this->assertFalse( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, self::VERSION, $expiresIn) ); - chmod($dir, 0777); - @rmdir($dir); - } - - /** - * testing getDiscoveryInfo - * - */ - public function testGetDiscoveryInfoExpiration() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $expiresIn = time() + 1; - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, self::VERSION, $expiresIn) ); - sleep(2); - $this->assertFalse( $storage->getDiscoveryInfo(self::ID, $realId, $server, $version, $expires) ); - } - - /** - * testing isUniqueNonce - * - */ - public function testIsUniqueNonce() - { - $tmp = $this->_tmpDir; - $dir = $tmp . '/openid_consumer'; - - $storage = new Zend_OpenId_Consumer_Storage_File($tmp); - $storage->purgeNonces(); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '2') ); - $this->assertFalse( $storage->isUniqueNonce(self::SERVER, '1') ); - $this->assertFalse( $storage->isUniqueNonce(self::SERVER, '2') ); - $storage->purgeNonces(); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - sleep(2); - $date = @date("r", time()); - sleep(2); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '2') ); - $storage->purgeNonces($date); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - $this->assertFalse( $storage->isUniqueNonce(self::SERVER, '2') ); - $storage->purgeNonces(); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - sleep(2); - $date = time(); - sleep(2); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '2') ); - $storage->purgeNonces($date); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - $this->assertFalse( $storage->isUniqueNonce(self::SERVER, '2') ); - $storage->purgeNonces(); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER, '1') ); - $this->assertTrue( $storage->isUniqueNonce(self::SERVER2, '1') ); - $storage->purgeNonces(); - } -} diff --git a/tests/Zend/OpenId/ConsumerTest.php b/tests/Zend/OpenId/ConsumerTest.php deleted file mode 100644 index 7c38e58f61..0000000000 --- a/tests/Zend/OpenId/ConsumerTest.php +++ /dev/null @@ -1,1092 +0,0 @@ -delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) ); - $storage->delAssociation(self::SERVER); - $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage); - $this->assertTrue( $consumer->login(self::ID, null, null, null, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - - // Test user defined return_to and trust_root - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage); - $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) ); - $headers = $response->getHeaders(); - $url = $headers[0]['value']; - $url = parse_url($url); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.trust_root'] ); - - $storage->delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn) ); - - // Test login with OpenID 2.0 - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage); - $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) ); - $headers = $response->getHeaders(); - $url = $headers[0]['value']; - $url = parse_url($url); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 7, count($query) ); - $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] ); - - // Test login with SREG extension - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>false)); - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage); - $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", $ext, $response) ); - $headers = $response->getHeaders(); - $url = $headers[0]['value']; - $url = parse_url($url); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 9, count($query) ); - $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] ); - $this->assertSame( 'nickname', $query['openid.sreg.required'] ); - $this->assertSame( 'email', $query['openid.sreg.optional'] ); - - // Test login in dumb mode - $storage->delAssociation(self::SERVER); - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage, true); - $this->assertTrue( $consumer->login(self::ID, "http://www.zf-test.com/return.php", "http://www.zf-test.com/trust.php", null, $response) ); - $headers = $response->getHeaders(); - $url = $headers[0]['value']; - $url = parse_url($url); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0', $query['openid.ns'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Freturn.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftrust.php', $query['openid.realm'] ); - - $storage->delDiscoveryInfo(self::ID); - } - - /** - * testing check - * - */ - public function testCheck() - { - $expiresIn = time() + 600; - - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $storage->delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) ); - $storage->delAssociation(self::SERVER); - $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - - $response = new Zend_OpenId_ResponseHelper(true); - $consumer = new Zend_OpenId_Consumer($storage); - $this->assertTrue( $consumer->check(self::ID, null, null, null, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( '', $response->getBody() ); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $url = $headers[0]['value']; - $url = parse_url($url); - $this->assertSame( "http", $url['scheme'] ); - $this->assertSame( "www.myopenid.com", $url['host'] ); - $this->assertSame( "/", $url['path'] ); - $q = explode("&", $url['query']); - $query = array(); - foreach($q as $var) { - if (list($key, $val) = explode("=", $var, 2)) { - $query[$key] = $val; - } - } - $this->assertTrue( is_array($query) ); - $this->assertSame( 6, count($query) ); - $this->assertSame( 'checkid_immediate', $query['openid.mode'] ); - $this->assertSame( 'http%3A%2F%2Freal_id.myopenid.com%2F', $query['openid.identity'] ); - $this->assertSame( 'http%3A%2F%2Fid.myopenid.com%2F', $query['openid.claimed_id'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com%2Ftest.php', $query['openid.return_to'] ); - $this->assertSame( 'http%3A%2F%2Fwww.zf-test.com', $query['openid.trust_root'] ); - - $storage->delDiscoveryInfo(self::ID); - $storage->delAssociation(self::SERVER); - } - - /** - * testing _getAssociation - * - */ - public function testGetAssociation() - { - $expiresIn = time() + 600; - - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $storage->delAssociation(self::SERVER); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - $this->assertFalse( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertTrue( $storage->addAssociation(self::SERVER, self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - $this->assertTrue( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( self::HANDLE, $handle ); - $this->assertSame( self::MAC_FUNC, $macFunc ); - $this->assertSame( self::SECRET, $secret ); - $this->assertSame( $expiresIn, $expires ); - $storage->delAssociation(self::SERVER); - $this->assertTrue( $consumer->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( self::HANDLE, $handle ); - $this->assertSame( self::MAC_FUNC, $macFunc ); - $this->assertSame( self::SECRET, $secret ); - $this->assertSame( $expiresIn, $expires ); - } - - /** - * testing _httpRequest - * - */ - public function testHttpRequest() - { - $consumer = new Zend_OpenId_ConsumerHelper(new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer")); - $http = new Zend_Http_Client(null, - array( - 'maxredirects' => 4, - 'timeout' => 15, - 'useragent' => 'Zend_OpenId' - )); - $test = new Zend_Http_Client_Adapter_Test(); - $http->setAdapter($test); - $consumer->SetHttpClient($http); - $this->assertSame( $http, $consumer->GetHttpClient() ); - $this->assertFalse( $consumer->httpRequest(self::SERVER) ); - - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nok\n"); - - // Test GET request without parameters - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER) ); - $this->assertSame( "GET / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n\r\n", - $http->getLastRequest() ); - - // Test POST request without parameters - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER, 'POST') ); - $this->assertSame( "POST / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Length: 0\r\n\r\n", - $http->getLastRequest() ); - - // Test GET request with parameters - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php', 'GET', array('a'=>'b','c'=>'d')) ); - $this->assertSame( "GET /test.php?a=b&c=d HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n\r\n", - $http->getLastRequest() ); - - // Test POST request with parameters - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php', 'POST', array('a'=>'b','c'=>'d')) ); - $this->assertSame( "POST /test.php HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 7\r\n\r\n" . - "a=b&c=d", - $http->getLastRequest() ); - - // Test GET parameters combination - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php?a=b', 'GET', array('c'=>'x y')) ); - $this->assertSame( "GET /test.php?a=b&c=x+y HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n\r\n", - $http->getLastRequest() ); - - // Test GET and POST parameters combination - $this->assertSame( "ok\n", $consumer->httpRequest(self::SERVER . 'test.php?a=b', 'POST', array('c'=>'x y')) ); - $this->assertSame( "POST /test.php?a=b HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 5\r\n\r\n" . - "c=x+y", - $http->getLastRequest() ); - } - - /** - * testing _associate - * - */ - public function testAssociate() - { - try { - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $storage->delAssociation(self::SERVER); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - $http = new Zend_Http_Client(null, - array( - 'maxredirects' => 4, - 'timeout' => 15, - 'useragent' => 'Zend_OpenId' - )); - $test = new Zend_Http_Client_Adapter_Test(); - $http->setAdapter($test); - $consumer->SetHttpClient($http); - - // Test OpenID 1.1 association request with DH-SHA1 - $consumer->clearAssociation(); - $this->assertFalse( $consumer->associate(self::SERVER, 1.1, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertSame( "POST / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 510\r\n\r\n" . - "openid.mode=associate&" . - "openid.assoc_type=HMAC-SHA1&" . - "openid.session_type=DH-SHA1&". - "openid.dh_modulus=ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX%2BYkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi%2F368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI%2BXUkKJX8Fvf8W8vsixYOr&" . - "openid.dh_gen=Ag%3D%3D&" . - "openid.dh_consumer_public=GaLlROlBGgSopPzo1ewYISnnT4BUFBfIKlgDPoS9U41t5eQb8QYqgcw7%2BW3dSF1VlWcvJGR0UbZIEhJ3UrCs6p69q6sgl%2FOZ7P%2B17rme7OynqszA3pqD6MJoQVZ5Ht%2FR%2BjmMjK08ajcgYEZU1GG4U5k8eYbcFnje00%2FTGfjKY0I%3D", - $http->getLastRequest() ); - - // Test OpenID 2.0 association request with DH-SHA256 - $consumer->clearAssociation(); - $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertSame( "POST / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 567\r\n\r\n" . - "openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&" . - "openid.mode=associate&" . - "openid.assoc_type=HMAC-SHA256&" . - "openid.session_type=DH-SHA256&". - "openid.dh_modulus=ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX%2BYkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi%2F368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI%2BXUkKJX8Fvf8W8vsixYOr&" . - "openid.dh_gen=Ag%3D%3D&" . - "openid.dh_consumer_public=GaLlROlBGgSopPzo1ewYISnnT4BUFBfIKlgDPoS9U41t5eQb8QYqgcw7%2BW3dSF1VlWcvJGR0UbZIEhJ3UrCs6p69q6sgl%2FOZ7P%2B17rme7OynqszA3pqD6MJoQVZ5Ht%2FR%2BjmMjK08ajcgYEZU1GG4U5k8eYbcFnje00%2FTGfjKY0I%3D", - $http->getLastRequest() ); - - // Test OpenID 1.1 association response with DH-SHA1 - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "assoc_type:HMAC-SHA1\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:DH-SHA1\n". - "dh_server_public:AIoP3d+ZTkd5vZj6G82XVIQ6KRAfSKmLz2Q3qVMzZ5tt7Z7St714GccipYXzCs5Tzgkc+Nt/uDE5xQ/f0Zn0uDS65CZHx3MOPqAANw/9YC/CafF1CD1MxW5TiN50GsjT/wGkcJFcpPXYVigQDOjIkHjKCysk53ktFvCoT60nFKGc\n". - "enc_mac_key:ON+M6/X8uUcOfxw1HF4sw/0XYyw=\n"); - $this->assertTrue( $consumer->associate(self::SERVER, 1.1, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( "0123456789absdef0123456789absdef", $handle ); - $this->assertSame( "sha1", $macFunc ); - $this->assertSame( "e36624c686748f6b646648f12748ffd157e4d4dd", bin2hex($secret) ); - $this->assertTrue( $storage->delAssociation(self::SERVER) ); - - // Wrong OpenID 2.0 association response (wrong ns) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/1.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:DH-SHA256\n". - "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n". - "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n"); - $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - - // Wrong OpenID 2.0 association response (wrong assoc_type) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA1\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:DH-SHA256\n". - "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n". - "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n"); - $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - - // Wrong OpenID 2.0 association response (wrong session_type) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:DH-SHA257\n". - "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n". - "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n"); - $this->assertFalse( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - - // Test OpenID 2.0 association response with DH-SHA256 - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:DH-SHA256\n". - "dh_server_public:AIlflxF8rvxx1Xi4Oj/KdP+7fvczeIRvx8WScMQS9I27R6YKd3Nx++5tAAF0rHelKDSG2ZeFM/zLEu9ZmUFzF02OaehWqykCfmtLASwMZO0u2GwYiIu5BoeJb9HlXJes58u/M4ViPXWhn27w2ZTlZJuuK8sDiTSTj9TmFxOriH4X\n". - "enc_mac_key:lvvCoTyvKy8oV6wnNHeroU0uLgBHiGV4BNkrXJe04JE=\n"); - $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( "0123456789absdef0123456789absdef", $handle ); - $this->assertSame( "sha256", $macFunc ); - $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) ); - $this->assertTrue( $storage->delAssociation(self::SERVER) ); - - // Test OpenID 2.0 association response without encryption (missing session_type) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n"); - $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( "0123456789absdef0123456789absdef", $handle ); - $this->assertSame( "sha256", $macFunc ); - $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) ); - $this->assertTrue( $storage->delAssociation(self::SERVER) ); - - // Test OpenID 2.0 association response without encryption (blank session_type) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:\n". - "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n"); - $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( "0123456789absdef0123456789absdef", $handle ); - $this->assertSame( "sha256", $macFunc ); - $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) ); - $this->assertTrue( $storage->delAssociation(self::SERVER) ); - - // Test OpenID 2.0 association response without encryption (blank session_type) - $consumer->clearAssociation(); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "ns:http://specs.openid.net/auth/2.0\n" . - "assoc_type:HMAC-SHA256\n" . - "assoc_handle:0123456789absdef0123456789absdef\n" . - "expires_in:3600\n" . - "session_type:no-encryption\n". - "mac_key:7ZAbxWHCn9e7QoYuXwn6N+eUSn7nIUIyLzSiG/4ThLg=\n"); - $this->assertTrue( $consumer->associate(self::SERVER, 2.0, pack("H*", "60017f7ebf0ef29ace27f0dfee2aaa6528d170e147b1260cc3987d7851cb67d49fbfdbb42c56494e61b1e1e39fa42315db0bf4f879787fcf1e807d0629d47cf05d3ac50602b1e7f6e73cd370320ddcdcf7f7aa86f35a3273d187de9c9efa959a02ce3a9c80f47dfcc83cfaad60b673e1806a764227344deae158ceec9ca4d60e")) ); - $this->assertTrue( $storage->getAssociation(self::SERVER, $handle, $macFunc, $secret, $expires) ); - $this->assertSame( "0123456789absdef0123456789absdef", $handle ); - $this->assertSame( "sha256", $macFunc ); - $this->assertSame( "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8", bin2hex($secret) ); - $this->assertTrue( $storage->delAssociation(self::SERVER) ); - } catch (Zend_OpenId_Exception $e) { - $this->markTestSkipped($e->getMessage()); - } - } - - /** - * testing discovery - * - */ - public function testDiscovery() - { - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - $http = new Zend_Http_Client(null, - array( - 'maxredirects' => 4, - 'timeout' => 15, - 'useragent' => 'Zend_OpenId' - )); - $test = new Zend_Http_Client_Adapter_Test(); - $http->setAdapter($test); - $consumer->SetHttpClient($http); - - // Bad response - $storage->delDiscoveryInfo(self::ID); - $id = self::ID; - $this->assertFalse( $consumer->discovery($id, $server, $version) ); - - // Test Yardis Discovery - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "" . - "\n" . - "\n" . - " \n" . - " \n" . - " http://specs.openid.net/auth/2.0/server\n" . - " " . self::SERVER . "\n" . - " \n" . - " \n" . - ""); - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( "http://specs.openid.net/auth/2.0/identifier_select", $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 1.1) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 1.1, $version ); - - // Test HTML based discovery (OpenID 1.1) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 1.1, $version ); - - // Test HTML based discovery (OpenID 2.0) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 2.0) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 1.1 and 2.0) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 1.1) (single quotes) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 1.1, $version ); - - // Test HTML based discovery (OpenID 1.1) (single quotes) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 1.1, $version ); - - // Test HTML based discovery (OpenID 2.0) (single quotes) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 2.0) (single quotes) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Test HTML based discovery (OpenID 1.1 and 2.0) (single quotes) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 2.0, $version ); - - // Wrong HTML - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertFalse( $consumer->discovery($id, $server, $version) ); - - // Test HTML based discovery with multivalue rel (OpenID 1.1) - $storage->delDiscoveryInfo(self::ID); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\n" . - "\n" . - "\n" . - "\n" . - "\n"); - $id = self::ID; - $this->assertTrue( $consumer->discovery($id, $server, $version) ); - $this->assertSame( self::REAL_ID, $id ); - $this->assertSame( self::SERVER, $server ); - $this->assertSame( 1.1, $version ); - } - - /** - * testing verify - * - */ - public function testVerify() - { - $expiresIn = time() + 600; - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - - // Wrong arguments - $this->assertFalse( $consumer->verify(array()) ); - - // HMAC-SHA1 - $consumer->clearAssociation(); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_op_endpoint" => self::SERVER, - "openid_signed" => "op_endpoint,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "4KFaoZApYmYq6aFdIGzzgbsIiaA=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->purgeNonces(); - $this->assertTrue( $consumer->verify($params) ); - - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn); - - // HMAC-SHA256 - $consumer->clearAssociation(); - $params = array( - "openid_ns" => Zend_OpenId::NS_2_0, - "openid_op_endpoint" => self::SERVER, - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "op_endpoint,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "O1ycNUA75AiVnoIcdBrx/nx462lLRv4f7xO9IPRiHqU=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha256", pack("H*", "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8"), $expiresIn); - $storage->purgeNonces(); - $this->assertTrue( $consumer->verify($params) ); - - // HMAC-SHA256 (duplicate response_nonce) - $consumer->clearAssociation(); - $params = array( - "openid_ns" => Zend_OpenId::NS_2_0, - "openid_op_endpoint" => self::SERVER, - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "rMiVhEmHVcIHoY2uzPNb7udWqa4lruvjnwZfujct0TE=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha256", pack("H*", "ed901bc561c29fd7bb42862e5f09fa37e7944a7ee72142322f34a21bfe1384b8"), $expiresIn); - $this->assertFalse( $consumer->verify($params) ); - - $storage->delDiscoveryInfo(self::ID); - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - - // wrong signature - $consumer->clearAssociation(); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_op_endpoint" => self::SERVER, - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124fff", - "openid_mode" => "id_res", - "openid_signed" => "op_endpoint,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->purgeNonces(); - $this->assertFalse( $consumer->verify($params) ); - $this->assertFalse( $storage->getAssociation(self::SERVER, $handle, $func, $secret, $expires) ); - - // openid_invalidate_handle - $consumer->clearAssociation(); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_op_endpoint" => self::SERVER, - "openid_invalidate_handle" => self::HANDLE."1", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "op_endpoint,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "4KFaoZApYmYq6aFdIGzzgbsIiaA=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->delAssociation(self::SERVER."1"); - $storage->addAssociation(self::SERVER."1", self::HANDLE."1", "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->purgeNonces(); - $this->assertTrue( $consumer->verify($params) ); - $this->assertFalse( $storage->getAssociation(self::SERVER."1", $handle, $func, $secret, $expires) ); - - $storage->delDiscoveryInfo(self::ID); - } - - /** - * testing verify - * - */ - public function testVerifyDumb() - { - $expiresIn = time() + 600; - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - $http = new Zend_Http_Client(null, - array( - 'maxredirects' => 4, - 'timeout' => 15, - 'useragent' => 'Zend_OpenId' - )); - $test = new Zend_Http_Client_Adapter_Test(); - $http->setAdapter($test); - $consumer->SetHttpClient($http); - $storage->delDiscoveryInfo(self::ID); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) ); - $this->assertTrue( $storage->addDiscoveryInfo(self::REAL_ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn) ); - - // Wrong arguments (no identity) - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true"); - $consumer->clearAssociation(); - $storage->delAssociation(self::SERVER); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->purgeNonces(); - $this->assertFalse( $consumer->verify($params) ); - - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:false"); - $consumer->clearAssociation(); - $storage->delAssociation(self::SERVER); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->purgeNonces(); - $this->assertFalse( $consumer->verify($params) ); - $this->assertSame( "POST / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 445\r\n\r\n" . - "openid.return_to=http%3A%2F%2Fwww.zf-test.com%2Ftest.php&" . - "openid.assoc_handle=d41d8cd98f00b204e9800998ecf8427e&" . - "openid.claimed_id=http%3A%2F%2Fid.myopenid.com%2F&" . - "openid.identity=http%3A%2F%2Freal_id.myopenid.com%2F&" . - "openid.response_nonce=2007-08-14T12%3A52%3A33Z46c1a59124ffe&" . - "openid.mode=check_authentication&" . - "openid.signed=assoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cresponse_nonce%2Cmode%2Csigned&" . - "openid.sig=h%2F5AFD25NpzSok5tzHEGCVUkQSw%3D", - $http->getLastRequest() ); - - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true"); - $consumer->clearAssociation(); - $storage->delAssociation(self::SERVER); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,identity,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->purgeNonces(); - $this->assertTrue( $consumer->verify($params) ); - - // SREG - $this->assertTrue( $storage->delDiscoveryInfo(self::ID) ); - $this->assertTrue( $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 2.0, $expiresIn) ); - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:true"); - $consumer->clearAssociation(); - $storage->delAssociation(self::SERVER); - $params = array( - "openid_ns" => Zend_OpenId::NS_2_0, - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_op_endpoint" => self::SERVER, - "openid_mode" => "id_res", - "openid_ns_sreg" => "http://openid.net/extensions/sreg/1.1", - "openid_sreg_nickname" => "test", - "openid_signed" => "ns,assoc_handle,return_to,claimed_id,identity,response_nonce,mode,ns.sreg,sreg.nickname,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->purgeNonces(); - $this->assertTrue( $consumer->verify($params) ); - $this->assertSame( "POST / HTTP/1.1\r\n" . - "Host: www.myopenid.com\r\n" . - "Connection: close\r\n" . - "Accept-encoding: gzip, deflate\r\n" . - "User-Agent: Zend_OpenId\r\n" . - "Content-Type: application/x-www-form-urlencoded\r\n" . - "Content-Length: 672\r\n\r\n" . - "openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&" . - "openid.return_to=http%3A%2F%2Fwww.zf-test.com%2Ftest.php&" . - "openid.assoc_handle=d41d8cd98f00b204e9800998ecf8427e&" . - "openid.claimed_id=http%3A%2F%2Fid.myopenid.com%2F&" . - "openid.identity=http%3A%2F%2Freal_id.myopenid.com%2F&" . - "openid.response_nonce=2007-08-14T12%3A52%3A33Z46c1a59124ffe&" . - "openid.op_endpoint=http%3A%2F%2Fwww.myopenid.com%2F&" . - "openid.mode=check_authentication&" . - "openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&" . - "openid.sreg.nickname=test&" . - "openid.signed=ns%2Cassoc_handle%2Creturn_to%2Cclaimed_id%2Cidentity%2Cresponse_nonce%2Cmode%2Cns.sreg%2Csreg.nickname%2Csigned&" . - "openid.sig=h%2F5AFD25NpzSok5tzHEGCVUkQSw%3D", - $http->getLastRequest() ); - - // invalidate_handle - $test->setResponse("HTTP/1.1 200 OK\r\n\r\nis_valid:false\ninvalidate_handle:".self::HANDLE."1"."\n"); - $consumer->clearAssociation(); - $params = array( - "openid_ns" => Zend_OpenId::NS_2_0, - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_op_endpoint" => self::SERVER, - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->delAssociation(self::SERVER."1"); - $storage->addAssociation(self::SERVER."1", self::HANDLE."1", "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->purgeNonces(); - $this->assertFalse( $consumer->verify($params) ); - $this->assertFalse( $storage->getAssociation(self::SERVER."1", $handle, $func, $secret, $expires) ); - } - - /** - * Test the required parameters for the signature - * @see https://openid.net/specs/openid-authentication-2_0.html#positive_assertions - */ - public function testSignedParams() - { - $expiresIn = time() + 600; - $_SERVER['SCRIPT_URI'] = "http://www.zf-test.com/test.php"; - $storage = new Zend_OpenId_Consumer_Storage_File(dirname(__FILE__)."/_files/consumer"); - $consumer = new Zend_OpenId_ConsumerHelper($storage); - - $storage->addDiscoveryInfo(self::ID, self::REAL_ID, self::SERVER, 1.1, $expiresIn); - - // Wrong arguments - $this->assertFalse( $consumer->verify(array()) ); - // HMAC-SHA1 - $consumer->clearAssociation(); - $params = array( - "openid_return_to" => "http://www.zf-test.com/test.php", - "openid_assoc_handle" => self::HANDLE, - "openid_claimed_id" => self::ID, - "openid_identity" => self::REAL_ID, - "openid_response_nonce" => "2007-08-14T12:52:33Z46c1a59124ffe", - "openid_mode" => "id_res", - "openid_signed" => "assoc_handle,return_to,claimed_id,identity,response_nonce,mode,signed", - "openid_sig" => "h/5AFD25NpzSok5tzHEGCVUkQSw=" - ); - $storage->delAssociation(self::SERVER); - $storage->addAssociation(self::SERVER, self::HANDLE, "sha1", pack("H*", "8382aea922560ece833ba55fa53b7a975f597370"), $expiresIn); - $storage->purgeNonces(); - $this->assertFalse( $consumer->verify($params) ); - $this->assertEquals( "The required parameter op_endpoint is missing in the signed", $consumer->getError()); - } - -} - -class Zend_OpenId_ConsumerHelper extends Zend_OpenId_Consumer { - - public function addAssociation($url, $handle, $macFunc, $secret, $expires) - { - return $this->_addAssociation($url, $handle, $macFunc, $secret, $expires); - } - - public function getAssociation($url, &$handle, &$macFunc, &$secret, &$expires) - { - return $this->_getAssociation($url, $handle, $macFunc, $secret, $expires); - } - - public function clearAssociation() - { - $this->_cache = array(); - } - - public function httpRequest($url, $method = 'GET', array $params = array()) - { - return $this->_httpRequest($url, $method, $params); - } - - public function associate($url, $version, $priv_key = null) - { - return $this->_associate($url, $version, $priv_key); - } - - public function discovery(&$id, &$server, &$version) - { - return $this->_discovery($id, $server, $version); - } - -} diff --git a/tests/Zend/OpenId/Extension/SregTest.php b/tests/Zend/OpenId/Extension/SregTest.php deleted file mode 100644 index 813c1b5265..0000000000 --- a/tests/Zend/OpenId/Extension/SregTest.php +++ /dev/null @@ -1,258 +0,0 @@ -assertSame( array(), $ext->getProperties() ); - $ext = new Zend_OpenId_Extension_Sreg(array('nickname'=>true,'email'=>false)); - $this->assertSame( array('nickname'=>true,'email'=>false), $ext->getProperties() ); - } - - /** - * testing getPolicyUrl - * - */ - public function testGetPolicyUrl() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $this->assertSame( null, $ext->getPolicyUrl() ); - $ext = new Zend_OpenId_Extension_Sreg(null, self::POLICY); - $this->assertSame( self::POLICY, $ext->getPolicyUrl() ); - } - - /** - * testing getVersion - * - */ - public function testGetVersion() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $this->assertSame( 1.0, $ext->getVersion() ); - $ext = new Zend_OpenId_Extension_Sreg(null, null, 1.1); - $this->assertSame( 1.1, $ext->getVersion() ); - } - - /** - * testing getSregProperties - * - */ - public function testGetSregProperties() - { - $this->assertSame( - array( - "nickname", - "email", - "fullname", - "dob", - "gender", - "postcode", - "country", - "language", - "timezone" - ), - Zend_OpenId_Extension_Sreg::getSregProperties() ); - } - - /** - * testing prepareRequest - * - */ - public function testPrepareRequest() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $params = array(); - $this->assertTrue( $ext->prepareRequest($params) ); - $this->assertSame( array(), $params ); - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>false)); - $params = array(); - $this->assertTrue( $ext->prepareRequest($params) ); - $this->assertSame( array('openid.sreg.required'=>"nickname", 'openid.sreg.optional'=>"email"), $params ); - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>true), self::POLICY); - $params = array(); - $this->assertTrue( $ext->prepareRequest($params) ); - $this->assertSame( array('openid.sreg.required'=>"nickname,email", 'openid.sreg.policy_url' => self::POLICY), $params ); - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>false,"email"=>false), self::POLICY, 1.1); - $params = array(); - $this->assertTrue( $ext->prepareRequest($params) ); - $this->assertSame( array('openid.ns.sreg'=>"http://openid.net/extensions/sreg/1.1",'openid.sreg.optional'=>"nickname,email", 'openid.sreg.policy_url' => self::POLICY), $params ); - } - - /** - * testing parseRequest - * - */ - public function testParseRequest() - { - $ext = new Zend_OpenId_Extension_Sreg(); - - $this->assertTrue( $ext->parseRequest(array()) ); - $this->assertSame( array(), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseRequest(array('openid_sreg_required'=>"nickname", 'openid_sreg_optional'=>"email")) ); - $this->assertSame( array('nickname'=>true,'email'=>false), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseRequest(array('openid_sreg_required'=>"nickname,email", 'openid_sreg_policy_url' => self::POLICY)) ); - $this->assertSame( array('nickname'=>true,'email'=>true), $ext->getProperties() ); - $this->assertSame( self::POLICY, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseRequest(array('openid_ns_sreg'=>"http://openid.net/extensions/sreg/1.1", 'openid_sreg_optional'=>"nickname,email", 'openid_sreg_policy_url' => self::POLICY)) ); - $this->assertSame( array('nickname'=>false,'email'=>false), $ext->getProperties() ); - $this->assertSame( self::POLICY, $ext->getPolicyUrl() ); - $this->assertSame( 1.1, $ext->getVersion() ); - } - - /** - * testing getTrustData - * - */ - public function testGetTrustData() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $data = array(); - $this->assertTrue( $ext->getTrustData($data) ); - $this->assertSame( 1, count($data) ); - $this->assertSame( array(), $data["Zend_OpenId_Extension_Sreg"] ); - $ext = new Zend_OpenId_Extension_Sreg(array('nickname'=>true,'email'=>false)); - $data = array(); - $this->assertTrue( $ext->getTrustData($data) ); - $this->assertSame( 1, count($data) ); - $this->assertSame( array('nickname'=>true,'email'=>false), $data["Zend_OpenId_Extension_Sreg"] ); - } - - /** - * testing checkTrustData - * - */ - public function testCheckTrustData() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $this->assertTrue( $ext->checkTrustData(array()) ); - $this->assertSame( array(), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(); - $this->assertTrue( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array())) ); - $this->assertSame( array(), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(array()); - $this->assertTrue( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array("nickname"=>self::USER, "email"=>self::EMAIL))) ); - $this->assertSame( array(), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>true)); - $this->assertTrue( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array("nickname"=>self::USER, "email"=>self::EMAIL))) ); - $this->assertSame( array('nickname'=>self::USER, "email"=>self::EMAIL), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>true)); - $this->assertFalse( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array("nickname"=>self::USER))) ); - - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>true,"email"=>false)); - $this->assertTrue( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array("nickname"=>self::USER))) ); - $this->assertSame( array('nickname'=>self::USER), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>false,"email"=>true)); - $this->assertTrue( $ext->checkTrustData(array("Zend_OpenId_Extension_Sreg"=>array("nickname"=>self::USER, "email"=>self::EMAIL))) ); - $this->assertSame( array('nickname'=>self::USER, "email"=>self::EMAIL), $ext->getProperties() ); - - $ext = new Zend_OpenId_Extension_Sreg(array("nickname"=>false,"email"=>true)); - $this->assertFalse( $ext->checkTrustData(array("Zend_OpenId_Extension_SregX"=>array("nickname"=>self::USER, "email"=>self::EMAIL))) ); - } - - /** - * testing prepareResponse - * - */ - public function testPrepareResponse() - { - $ext = new Zend_OpenId_Extension_Sreg(); - $params = array(); - $this->assertTrue( $ext->prepareResponse($params) ); - $this->assertSame( array(), $params ); - - $ext = new Zend_OpenId_Extension_Sreg(array('nickname'=>self::USER, "email"=>self::EMAIL), self::POLICY); - $params = array(); - $this->assertTrue( $ext->prepareResponse($params) ); - $this->assertSame( array('openid.sreg.nickname'=>self::USER, 'openid.sreg.email'=>self::EMAIL), $params ); - - $ext = new Zend_OpenId_Extension_Sreg(array('nickname'=>self::USER, "email"=>self::EMAIL), self::POLICY, 1.1); - $params = array(); - $this->assertTrue( $ext->prepareResponse($params) ); - $this->assertSame( array('openid.ns.sreg'=>"http://openid.net/extensions/sreg/1.1", 'openid.sreg.nickname'=>self::USER, 'openid.sreg.email'=>self::EMAIL), $params ); - } - - /** - * testing parseResponse - * - */ - public function testParseResponse() - { - $ext = new Zend_OpenId_Extension_Sreg(); - - $this->assertTrue( $ext->parseResponse(array()) ); - $this->assertSame( array(), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseResponse(array('openid_sreg_nickname'=>self::USER, 'openid_sreg_email'=>self::EMAIL)) ); - $this->assertSame( array('nickname'=>self::USER,'email'=>self::EMAIL), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseResponse(array('openid_sreg_nickname'=>self::USER, 'openid_sreg_email'=>self::EMAIL, 'openid_sreg_policy_url' => self::POLICY)) ); - $this->assertSame( array('nickname'=>self::USER,'email'=>self::EMAIL), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.0, $ext->getVersion() ); - - $this->assertTrue( $ext->parseResponse(array('openid_ns_sreg'=>"http://openid.net/extensions/sreg/1.1",'openid_sreg_nickname'=>self::USER, 'openid_sreg_email'=>self::EMAIL)) ); - $this->assertSame( array('nickname'=>self::USER,'email'=>self::EMAIL), $ext->getProperties() ); - $this->assertSame( null, $ext->getPolicyUrl() ); - $this->assertSame( 1.1, $ext->getVersion() ); - } -} diff --git a/tests/Zend/OpenId/ExtensionTest.php b/tests/Zend/OpenId/ExtensionTest.php deleted file mode 100644 index 08481397ce..0000000000 --- a/tests/Zend/OpenId/ExtensionTest.php +++ /dev/null @@ -1,109 +0,0 @@ -assertTrue( Zend_OpenId_Extension::forAll(null, 'getTrustData', $params) ); - $this->assertSame( array(), $params ); - - $params = array(); - $this->assertTrue( Zend_OpenId_Extension::forAll(array(), 'getTrustData', $params) ); - $this->assertSame( array(), $params ); - - $params = array(); - $this->assertFalse( Zend_OpenId_Extension::forAll(array(1), 'getTrustData', $params) ); - - $params = array(); - $this->assertFalse( Zend_OpenId_Extension::forAll(new stdClass(), 'getTrustData', $params) ); - - $ext = new Zend_OpenId_Extension_Sreg(); - $params = array(); - $this->assertTrue( Zend_OpenId_Extension::forAll($ext, 'getTrustData', $params) ); - $this->assertSame( array('Zend_OpenId_Extension_Sreg'=>array()), $params ); - - $ext = new Zend_OpenId_Extension_Sreg(); - $params = array(); - $this->assertTrue( Zend_OpenId_Extension::forAll(array($ext), 'getTrustData', $params) ); - $this->assertSame( array('Zend_OpenId_Extension_Sreg'=>array()), $params ); - - $ext = new Zend_OpenId_Extension_Helper(); - $params = array(); - $this->assertTrue( Zend_OpenId_Extension::forAll(array($ext), 'getTrustData', $params) ); - $this->assertSame( array(), $params ); - $this->assertFalse( Zend_OpenId_Extension::forAll(array($ext), 'wrong', $params) ); - $this->assertSame( array(), $params ); - } - - /** - * testing extension callbacks - * - */ - public function testCallbacks() - { - $ext = new Zend_OpenId_Extension_Helper(); - $a = array(); - $this->assertTrue( $ext->prepareRequest($a) ); - $this->assertSame( array(), $a ); - $this->assertTrue( $ext->parseRequest($a) ); - $this->assertSame( array(), $a ); - $this->assertTrue( $ext->prepareResponse($a) ); - $this->assertSame( array(), $a ); - $this->assertTrue( $ext->parseResponse($a) ); - $this->assertSame( array(), $a ); - $this->assertTrue( $ext->getTrustData($a) ); - $this->assertSame( array(), $a ); - $this->assertTrue( $ext->checkTrustData($a) ); - $this->assertSame( array(), $a ); - $this->assertFalse( $ext->wrong($a) ); - $this->assertSame( array(), $a ); - } -} - -class Zend_OpenId_Extension_Helper extends Zend_OpenId_Extension -{ - function wrong($data) - { - return false; - } -} diff --git a/tests/Zend/OpenId/Provider/Storage/FileTest.php b/tests/Zend/OpenId/Provider/Storage/FileTest.php deleted file mode 100644 index 1c6a21593c..0000000000 --- a/tests/Zend/OpenId/Provider/Storage/FileTest.php +++ /dev/null @@ -1,212 +0,0 @@ -assertTrue( is_dir($dir) ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - return; - } - - chmod($dir, 0); - $dir2 = $dir . '/test'; - try { - $storage = new Zend_OpenId_Provider_Storage_File($dir2); - $ex = null; - } catch (Exception $e) { - $ex = $e; - } - $this->assertTrue( $ex instanceof Zend_OpenId_Exception ); - $this->assertSame( Zend_OpenId_Exception::ERROR_STORAGE, $ex->getCode() ); - $this->assertContains( 'Cannot access storage directory', $ex->getMessage() ); - chmod($dir, 0777); - $this->assertFalse( is_dir($dir2) ); - @rmdir($dir); - } - - /** - * testing getAssociation - * - */ - public function testGetAssociation() - { - $expiresIn = time() + 600; - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delAssociation(self::HANDLE); - $this->assertTrue( $storage->addAssociation(self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - $this->assertSame( self::MAC_FUNC, $macFunc ); - $this->assertSame( self::SECRET, $secret ); - $this->assertSame( $expiresIn, $expires ); - $this->assertTrue( $storage->delAssociation(self::HANDLE) ); - $this->assertFalse( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - - $tmp = dirname(__FILE__)."/_files"; - $dir = $tmp . '/openid_consumer'; - @rmdir($dir); - $storage = new Zend_OpenId_Provider_Storage_File($dir); - $this->assertTrue( is_dir($dir) ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - return; - } - - chmod($dir, 0); - $this->assertFalse( $storage->addAssociation(self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - chmod($dir, 0777); - @rmdir($dir); - } - - /** - * testing getAssociation - * - */ - public function testGetAssociationExpiratin() - { - $expiresIn = time() + 1; - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delAssociation(self::HANDLE); - $this->assertTrue( $storage->addAssociation(self::HANDLE, self::MAC_FUNC, self::SECRET, $expiresIn) ); - sleep(2); - $this->assertFalse( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - } - - /** - * testing addUser - * - */ - public function testAddUser() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delUser(self::USER); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertFalse( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $storage->delUser(self::USER) ); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $storage->delUser(self::USER) ); - } - - /** - * testing hasUser - * - */ - public function testHasUser() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delUser(self::USER); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $storage->hasUser(self::USER) ); - $this->assertTrue( $storage->delUser(self::USER) ); - $this->assertFalse( $storage->hasUser(self::USER) ); - } - - /** - * testing checkUser - * - */ - public function testCheckUser() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delUser(self::USER); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $storage->checkUser(self::USER, self::PASSWORD) ); - $this->assertFalse( $storage->checkUser(self::USER, self::USER) ); - $this->assertTrue( $storage->delUser(self::USER) ); - $this->assertFalse( $storage->checkUser(self::USER, self::PASSWORD) ); - } - - /** - * testing addSite - * - */ - public function testAddSite() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files"); - $storage->delUser(self::USER); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE1, true) ); - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 1, count($trusted) ); - reset($trusted); - $this->assertSame( self::SITE1, key($trusted) ); - $this->assertSame( true, current($trusted) ); - $this->assertTrue( $storage->delUser(self::USER) ); - $this->assertFalse( $storage->addSite(self::USER, self::SITE1, true) ); - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 0, count($trusted) ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE1, self::SITE1) ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE2, self::SITE2) ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE1, self::USER) ); - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 2, count($trusted) ); - $this->assertSame( self::USER, $trusted[self::SITE1] ); - $this->assertSame( self::SITE2, $trusted[self::SITE2] ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE2, null) ); - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 1, count($trusted) ); - $this->assertSame( self::USER, $trusted[self::SITE1] ); - $this->assertTrue( $storage->addSite(self::USER, self::SITE1, null) ); - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 0, count($trusted) ); - $this->assertTrue( $storage->delUser(self::USER) ); - $storage->delUser(self::USER); - $this->assertFalse( $storage->getTrustedSites(self::USER) ); - } -} diff --git a/tests/Zend/OpenId/Provider/User/SessionTest.php b/tests/Zend/OpenId/Provider/User/SessionTest.php deleted file mode 100644 index 681881cf8e..0000000000 --- a/tests/Zend/OpenId/Provider/User/SessionTest.php +++ /dev/null @@ -1,74 +0,0 @@ -_user1 = new Zend_OpenId_Provider_User_Session(); - $this->_user2 = new Zend_OpenId_Provider_User_Session(new Zend_Session_Namespace("openid2")); - } - - /** - * testing getLoggedInUser - * - */ - public function testGetLoggedInUser() - { - $user = $this->_user1; - $user->delLoggedInUser(); - $this->assertTrue( $user->setLoggedInUser(self::USER1) ); - $this->assertSame( self::USER1, $user->getLoggedInUser() ); - $this->assertTrue( $user->setLoggedInUser(self::USER2) ); - $this->assertSame( self::USER2, $user->getLoggedInUser() ); - $this->assertTrue( $user->delLoggedInUser() ); - $this->assertFalse( $user->getLoggedInUser()); - - $user = $this->_user2; - $user->delLoggedInUser(); - $this->assertTrue( $user->setLoggedInUser(self::USER1) ); - $this->assertSame( self::USER1, $user->getLoggedInUser() ); - $this->assertTrue( $user->setLoggedInUser(self::USER2) ); - $this->assertSame( self::USER2, $user->getLoggedInUser() ); - $this->assertTrue( $user->delLoggedInUser() ); - $this->assertFalse( $user->getLoggedInUser()); - } -} diff --git a/tests/Zend/OpenId/ProviderTest.php b/tests/Zend/OpenId/ProviderTest.php deleted file mode 100644 index 35ffdee537..0000000000 --- a/tests/Zend/OpenId/ProviderTest.php +++ /dev/null @@ -1,1645 +0,0 @@ -_user = new Zend_OpenId_Provider_User_Session(); - } - - /** - * testing register - * - */ - public function testRegister() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - $this->assertFalse( $storage->checkUser(self::USER, self::PASSWORD) ); - - // wrong ID - $this->assertFalse( $provider->register("", self::PASSWORD) ); - // registration of new user - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - // registration of existent user - $this->assertFalse( $provider->register(self::USER, self::PASSWORD) ); - - $this->assertTrue( $storage->checkUser(self::USER, md5(self::USER . self::PASSWORD)) ); - $storage->delUser(self::USER); - } - - /** - * testing hasUser - * - */ - public function testHasUser() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - // wrong ID - $this->assertFalse( $provider->hasUser("") ); - $this->assertFalse( $provider->hasUser("http://:80/test") ); - - // check for non existent - $this->assertFalse( $provider->hasUser(self::USER) ); - - // check for existent user - $this->assertTrue( $storage->addUser(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->hasUser(self::USER) ); - - $storage->delUser(self::USER); - } - - /** - * testing login - * - */ - public function testLogin() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - // wrong ID - $this->assertFalse( $provider->login("", self::PASSWORD) ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - $this->assertFalse( $provider->login("http://:80/test", self::PASSWORD) ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - - // login as non existent user - $this->assertFalse( $provider->login(self::USER, self::PASSWORD) ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - // login as existent user with wrong password - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertFalse( $provider->login(self::USER, self::PASSWORD . "x") ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - // login as existent user with proper password - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertSame( self::USER, $this->_user->getLoggedInUser() ); - - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - } - - /** - * testing logout - * - */ - public function testLogout() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - $this->assertFalse( $this->_user->getLoggedInUser() ); - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertSame( self::USER, $this->_user->getLoggedInUser() ); - $this->assertTrue( $provider->logout() ); - $this->assertFalse( $this->_user->getLoggedInUser() ); - - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - } - - /** - * testing logout - * - */ - public function testLoggedInUser() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - $this->assertFalse( $provider->getLoggedInUser() ); - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertFalse( $provider->getLoggedInUser() ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertSame( self::USER, $this->_user->getLoggedInUser() ); - $this->assertTrue( $provider->logout() ); - $this->assertFalse( $provider->getLoggedInUser() ); - - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - } - - /** - * testing getSiteRoot - * - */ - public function testGetSiteRoot() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - $params = array( - 'openid_realm' => "http://wrong/", - 'openid_trust_root' => "http://root/", - 'openid_return_to' => "http://wrong/", - ); - $this->assertSame( "http://root/", $provider->getSiteRoot($params) ); - - $params = array( - 'openid_realm' => "http://wrong/", - 'openid_return_to' => "http://root/", - ); - $this->assertSame( "http://root/", $provider->getSiteRoot($params) ); - - $params = array( - 'openid_realm' => "http://wrong/", - ); - $this->assertFalse( $provider->getSiteRoot($params) ); - - $params = array( - 'openid_ns' => Zend_OpenId::NS_2_0, - 'openid_realm' => "http://root/", - 'openid_trust_root' => "http://wrong/", - 'openid_return_to' => "http://wrong/", - ); - $this->assertSame( "http://root/", $provider->getSiteRoot($params) ); - - $params = array( - 'openid_ns' => Zend_OpenId::NS_2_0, - 'openid_trust_root' => "http://wrong/", - 'openid_return_to' => "http://root/", - ); - $this->assertSame( "http://root/", $provider->getSiteRoot($params) ); - - $params = array( - 'openid_ns' => Zend_OpenId::NS_2_0, - 'openid_return_to' => "http://root/", - ); - $this->assertSame( "http://root/", $provider->getSiteRoot($params) ); - - $params = array( - 'openid_ns' => Zend_OpenId::NS_2_0, - ); - $this->assertFalse( $provider->getSiteRoot($params) ); - - $params = array( - 'openid_trust_root' => "", - ); - $this->assertFalse( $provider->getSiteRoot($params) ); - } - - /** - * testing allowSite - * - */ - public function testAllowSite() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - - // not logged in - $this->assertFalse( $provider->allowSite("http://www.test.com/") ); - // logged in - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->allowSite("http://www.test.com/") ); - - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 1, count($trusted) ); - reset($trusted); - $this->assertSame( "http://www.test.com/", key($trusted) ); - $this->assertSame( true, current($trusted) ); - - // duplicate - $this->assertTrue( $provider->allowSite("http://www.test.com/") ); - - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 1, count($trusted) ); - reset($trusted); - $this->assertSame( "http://www.test.com/", key($trusted) ); - $this->assertSame( true, current($trusted) ); - - // extensions - $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id")); - $this->assertTrue( $provider->allowSite("http://www.test.com/", $sreg) ); - - $trusted = $storage->getTrustedSites(self::USER); - $this->assertTrue( is_array($trusted) ); - $this->assertSame( 1, count($trusted) ); - reset($trusted); - $this->assertSame( "http://www.test.com/", key($trusted) ); - $this->assertSame( array('Zend_OpenId_Extension_Sreg'=>array('nickname'=>'test_id')), current($trusted) ); - - $this->_user->delLoggedInUser(); - $storage->delUser(self::USER); - } - - /** - * testing denySite - * - */ - public function testDenySite() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id")); - - // not logged in - $this->assertFalse( $provider->denySite("http://www.test.com/") ); - - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->allowSite("http://www.test1.com/") ); - $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) ); - $this->AssertSame( array( - 'http://www.test1.com/' => true, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ) - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->denySite("http://www.test3.com/") ); - $this->AssertSame( array( - 'http://www.test1.com/' => true, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ), - 'http://www.test3.com/' => false - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->denySite("http://www.test1.com/") ); - $this->AssertSame( array( - 'http://www.test1.com/' => false, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ), - 'http://www.test3.com/' => false - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->denySite("http://www.test2.com/") ); - $this->AssertSame( array( - 'http://www.test1.com/' => false, - 'http://www.test2.com/' => false, - 'http://www.test3.com/' => false - ), - $storage->getTrustedSites(self::USER) ); - - $this->_user->delLoggedInUser(); - $storage->delUser(self::USER); - } - - /** - * testing delSite - * - */ - public function testDelSite() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id")); - - // not logged in - $this->assertFalse( $provider->delSite("http://www.test.com/") ); - - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->allowSite("http://www.test1.com/") ); - $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) ); - $this->AssertSame( array( - 'http://www.test1.com/' => true, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ) - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->delSite("http://www.test3.com/") ); - $this->AssertSame( array( - 'http://www.test1.com/' => true, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ) - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->delSite("http://www.test1.com/") ); - $this->AssertSame( array( - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ) - ), - $storage->getTrustedSites(self::USER) ); - - $this->assertTrue( $provider->delSite("http://www.test2.com/") ); - $this->AssertSame( array( - ), - $storage->getTrustedSites(self::USER) ); - - $this->_user->delLoggedInUser(); - $storage->delUser(self::USER); - } - - /** - * testing getTrustedSites - * - */ - public function testGetTrustedSites() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $storage->delUser(self::USER); - $this->_user->delLoggedInUser(); - $provider = new Zend_OpenId_Provider(null, null, $this->_user, $storage); - $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id")); - - $this->assertTrue( $provider->register(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->allowSite("http://www.test1.com/") ); - $this->assertTrue( $provider->allowSite("http://www.test2.com/", $sreg) ); - $this->AssertSame( array( - 'http://www.test1.com/' => true, - 'http://www.test2.com/' => array( - 'Zend_OpenId_Extension_Sreg' => array( - 'nickname' => 'test_id' - ) - ) - ), - $provider->getTrustedSites() ); - - $this->_user->delLoggedInUser(); - $this->AssertFalse( $provider->getTrustedSites() ); - - $storage->delUser(self::USER); - } - - /** - * testing genSecret - * - */ - public function testGenSecret() - { - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider")); - - // SHA1 - $x = $provider->genSecret("sha1"); - $this->assertTrue( is_string($x) ); - $this->assertSame( 20, strlen($x) ); - - // SHA256 - $x = $provider->genSecret("sha256"); - $this->assertTrue( is_string($x) ); - $this->assertSame( 32, strlen($x) ); - - // invalid function - $this->assertFalse( $provider->genSecret("md5") ); - } - - /** - * testing _associate - * - */ - public function testAssociate() - { - try { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - - // Wrong assoc_type - $ret = $provider->handle(array('openid_mode'=>'associate')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'unsupported-type', $res['error-code'] ); - - // Wrong assoc_type (OpenID 2.0) - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_mode'=>'associate')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] ); - $this->assertSame( 'unsupported-type', $res['error-code'] ); - - // Wrong session_type - $ret = $provider->handle(array('openid_mode'=>'associate', - 'openid_assoc_type'=>'HMAC-SHA1', - 'openid_session_type'=>'DH-SHA257')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'unsupported-type', $res['error-code'] ); - - // Associaation without encryption - $ret = $provider->handle(array('openid_assoc_type'=>'HMAC-SHA1', - 'openid_mode'=>'associate')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'HMAC-SHA1', $res['assoc_type'] ); - $this->assertTrue( isset($res['mac_key']) ); - $this->assertSame( 20, strlen(base64_decode($res['mac_key'])) ); - $this->assertTrue( isset($res['assoc_handle']) ); - $this->assertSame( '3600', $res['expires_in'] ); - $this->assertFalse( isset($res['session_type']) ); - $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha1', $macFunc ); - $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) ); - - // Associaation without encryption (OpenID 2.0) - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_type'=>'HMAC-SHA256', - 'openid_mode'=>'associate')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] ); - $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] ); - $this->assertTrue( isset($res['mac_key']) ); - $this->assertSame( 32, strlen(base64_decode($res['mac_key'])) ); - $this->assertTrue( isset($res['assoc_handle']) ); - $this->assertSame( '3600', $res['expires_in'] ); - $this->assertFalse( isset($res['session_type']) ); - $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha256', $macFunc ); - $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) ); - - // Associaation without encryption (OpenID 2.0) - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_type'=>'HMAC-SHA256', - 'openid_mode'=>'associate', - 'openid_session_type'=>'no-encryption')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] ); - $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] ); - $this->assertTrue( isset($res['mac_key']) ); - $this->assertSame( 32, strlen(base64_decode($res['mac_key'])) ); - $this->assertTrue( isset($res['assoc_handle']) ); - $this->assertSame( '3600', $res['expires_in'] ); - $this->assertSame( 'no-encryption', $res['session_type'] ); - $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha256', $macFunc ); - $this->assertSame( bin2hex(base64_decode($res['mac_key'])), bin2hex($secret) ); - - // Associaation with DH-SHA1 encryption - $ret = $provider->handle(array('openid_assoc_type'=>'HMAC-SHA1', - 'openid_mode'=>'associate', - 'openid_session_type'=>'DH-SHA1', - 'openid_dh_modulus'=>'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr', - 'openid_dh_gen'=>'Ag==', - 'openid_dh_consumer_public'=>'RqexRm+Zn5s3sXxFBjI9WfCOBwBDDQBKPzX4fjMGl3YEJh5tx8SVo7awgwuqsliR+nvjmRh5kSFIGv8YSCsy88v1CcAfWUGfjehO9euxQcXOYJnNGbl6GQrE2FYe2RCvML4Yi8eYCYtCQi0wlDE7BJXGSVPXFzj/ru0lR/voPpk=', - )); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'HMAC-SHA1', $res['assoc_type'] ); - $this->assertSame( 'DH-SHA1', $res['session_type'] ); - $this->assertTrue( isset($res['dh_server_public']) ); - $this->assertTrue( isset($res['enc_mac_key']) ); - $this->assertSame( 20, strlen(base64_decode($res['enc_mac_key'])) ); - $this->assertTrue( isset($res['assoc_handle']) ); - $this->assertSame( '3600', $res['expires_in'] ); - $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha1', $macFunc ); - - // Associaation with DH-SHA256 encryption (OpenID 2.0) - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_type'=>'HMAC-SHA256', - 'openid_mode'=>'associate', - 'openid_session_type'=>'DH-SHA256', - 'openid_dh_modulus'=>'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr', - 'openid_dh_gen'=>'Ag==', - 'openid_dh_consumer_public'=>'RqexRm+Zn5s3sXxFBjI9WfCOBwBDDQBKPzX4fjMGl3YEJh5tx8SVo7awgwuqsliR+nvjmRh5kSFIGv8YSCsy88v1CcAfWUGfjehO9euxQcXOYJnNGbl6GQrE2FYe2RCvML4Yi8eYCYtCQi0wlDE7BJXGSVPXFzj/ru0lR/voPpk=', - )); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'HMAC-SHA256', $res['assoc_type'] ); - $this->assertSame( 'DH-SHA256', $res['session_type'] ); - $this->assertTrue( isset($res['dh_server_public']) ); - $this->assertTrue( isset($res['enc_mac_key']) ); - $this->assertSame( 32, strlen(base64_decode($res['enc_mac_key'])) ); - $this->assertTrue( isset($res['assoc_handle']) ); - $this->assertSame( '3600', $res['expires_in'] ); - $this->assertTrue( $storage->getAssociation($res['assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha256', $macFunc ); - } catch (Zend_OpenId_Exception $e) { - $this->markTestSkipped($e->getMessage()); - } - } - - /** - * testing _checkAuthentication - * - */ - public function testCheckAuthentication() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - - // Wrong arguments - $ret = $provider->handle(array('openid_mode'=>'check_authentication')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'false', $res['is_valid'] ); - - // Wrong arguments (OpenID 2.0) - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_mode'=>'check_authentication')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( Zend_OpenId::NS_2_0, $res['ns'] ); - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'false', $res['is_valid'] ); - - // Wrong session id - $storage->delAssociation(self::HANDLE); - $ret = $provider->handle(array('openid_mode'=>'check_authentication', - 'openid_assoc_handle'=>self::HANDLE)); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'false', $res['is_valid'] ); - - // Proper session signed with HAMC-SHA256 - $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660); - $ret = $provider->handle(array('openid_mode'=>'check_authentication', - 'openid_assoc_handle'=>self::HANDLE, - 'openid_signed'=>'mode,assoc_handle,signed', - 'openid_sig'=>'IgLZCOXmEPowYl6yyFZjYL4ZTtQ=')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'true', $res['is_valid'] ); - - // Proper session signed with HAMC-SHA256 - $storage->delAssociation(self::HANDLE); - $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660); - $ret = $provider->handle(array('openid_mode'=>'check_authentication', - 'openid_assoc_handle'=>self::HANDLE, - 'openid_signed'=>'mode,assoc_handle,signed', - 'openid_sig'=>'xoJcXj30L1N7QRir7I2ovop1SaijXnAI97X/yH+kvck=')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'true', $res['is_valid'] ); - - // Wrong signature - $storage->delAssociation(self::HANDLE); - $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660); - $ret = $provider->handle(array('openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_mode'=>'check_authentication', - 'openid_assoc_handle'=>self::HANDLE, - 'openid_signed'=>'ns,mode,assoc_handle,signed', - 'openid_sig'=>'xoJcXj30L1N7QRir7I2ovop1SaijXnAI97X/yH+kvck=')); - $res = array(); - foreach (explode("\n", $ret) as $line) { - if (!empty($line)) { - list($key, $val) = explode(":", $line, 2); - $res[$key] = $val; - } - } - $this->assertSame( 'id_res', $res['openid.mode'] ); - $this->assertSame( 'false', $res['is_valid'] ); - - $storage->delAssociation(self::HANDLE); - } - - /** - * testing respondToConsumer - * - */ - public function testRespondToConsumer() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - - // dumb mode - $response = new Zend_OpenId_ResponseHelper(true); - $storage->delAssociation(self::HANDLE); - $this->assertTrue( $provider->respondToConsumer(array( - 'openid_assoc_handle' => self::HANDLE, - 'openid_return_to' => 'http://www.test.com/test.php' - ), null, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $ret = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $ret[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $ret['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] ); - $this->assertTrue( isset($ret['openid.assoc_handle']) ); - $this->assertTrue( isset($ret['openid.response_nonce']) ); - $this->assertTrue( isset($ret['openid.signed']) ); - $this->assertTrue( isset($ret['openid.sig']) ); - $this->assertTrue( $storage->getAssociation($ret['openid.assoc_handle'], $macFunc, $secret, $expires) ); - $this->assertSame( 'sha1', $macFunc ); - - // OpenID 2.0 with SHA256 - $_SERVER['SCRIPT_URI'] = "http://www.test.com/endpoint.php"; - $response = new Zend_OpenId_ResponseHelper(true); - $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660); - $this->assertTrue( $provider->respondToConsumer(array( - 'openid_ns' => Zend_OpenId::NS_2_0, - 'openid_assoc_handle' => self::HANDLE, - 'openid_return_to' => 'http://www.test.com/test.php' - ), null, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $ret = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $ret[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $ret['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] ); - $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] ); - $this->assertTrue( isset($ret['openid.response_nonce']) ); - $this->assertTrue( isset($ret['openid.signed']) ); - $this->assertTrue( isset($ret['openid.sig']) ); - $this->assertSame( Zend_OpenId::NS_2_0, $ret['openid.ns'] ); - $this->assertSame( "http://www.test.com/endpoint.php", $ret['openid.op_endpoint'] ); - $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - $this->assertSame( 'sha256', $macFunc ); - $storage->delAssociation(self::HANDLE); - - // OpenID 1.1 with SHA1 - $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660); - $response = new Zend_OpenId_ResponseHelper(true); - $ret = $provider->respondToConsumer(array( - 'openid_assoc_handle' => self::HANDLE, - 'openid_return_to' => 'http://www.test.com/test.php', - 'openid_claimed_id' => 'http://claimed_id/', - 'openid_identity' => 'http://identity/', - 'openid_unknown' => 'http://www.test.com/test.php', - ), null, $response); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $ret = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $ret[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $ret['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] ); - $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] ); - $this->assertTrue( isset($ret['openid.response_nonce']) ); - $this->assertTrue( isset($ret['openid.signed']) ); - $this->assertTrue( isset($ret['openid.sig']) ); - $this->assertFalse( isset($ret['openid.ns']) ); - $this->assertFalse( isset($ret['openid.op_endpoint']) ); - $this->assertSame( 'http://claimed_id/', $ret['openid.claimed_id'] ); - $this->assertSame( 'http://identity/', $ret['openid.identity'] ); - $this->assertFalse( isset($ret['openid.unknown']) ); - $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - $this->assertSame( 'sha1', $macFunc ); - $storage->delAssociation(self::HANDLE); - - // extensions - $sreg = new Zend_OpenId_Extension_Sreg(array("nickname"=>"test_id")); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue( $provider->respondToConsumer(array( - 'openid_return_to' => 'http://www.test.com/test.php', - ), $sreg, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $ret = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $ret[$key] = urldecode($val); - } - $this->assertSame( 'test_id', $ret['openid.sreg.nickname'] ); - } - - /** - * testing _checkId - * - */ - public function testCheckIdImmediate() - { - $_SERVER['SCRIPT_URI'] = "http://www.test.com/server.php"; - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - $provider->logout(); - - // Wrong arguments (no openid.return_to and openid.trust_root) - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertFalse( $provider->handle(array( - 'openid_mode'=>'checkid_immediate'), - null, $response) ); - - // Unexistent user - $storage->delUser(self::USER); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] ); - - // No openid_identity - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'login', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - - // Non logged in user - $provider->register(self::USER, self::PASSWORD); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'login', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - - // Non logged in user with SREG - $provider->register(self::USER, self::PASSWORD); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, - 'openid_sreg_required'=>'nickname'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'login', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query2['openid.ns.sreg'] ); - $this->assertSame( "nickname", $query2['openid.sreg.required'] ); - - // Logged in user (unknown site) - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - - // Logged in user (unknown site 2) - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $this->assertTrue( $provider->allowSite('http://www.test.com/test1.php') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - - // Logged in user (unknown site + SREG) - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue( $provider->delSite('http://www.test.com/test1.php') ); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, - 'openid_sreg_required'=>'nickname'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query2['openid.ns.sreg'] ); - $this->assertSame( "nickname", $query2['openid.sreg.required'] ); - - // Logged in user (untrusted site) - $this->assertTrue( $provider->denySite('http://www.test.com') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] ); - - // Logged in user (untrusted site with wildcard) - $this->assertTrue( $provider->delSite('http://www.test.com') ); - $this->assertTrue( $provider->denySite('http://*.test.com') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] ); - - // Logged in user (trusted site) - $this->assertTrue( $provider->delSite('http://*.test.com') ); - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) ); - - // Logged in user (trusted site without openid.return_to) - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_trust_root'=>'http://www.test.com/test.php'), - null, $response)); - $this->assertSame( array(), $response->getHeaders() ); - $this->assertSame( '', $response->getBody() ); - - // Logged in user (trusted site) & OpenID 2.0 & established session - $storage->delAssociation(self::HANDLE); - $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660); - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_handle'=>self::HANDLE, - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) ); - - // Logged in user (trusted site) & invalid association handle - $storage->delAssociation(self::HANDLE); - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_handle'=>self::HANDLE, - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( self::HANDLE, $query['openid.invalidate_handle'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) ); - - // SREG success - $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test','email'=>'test@test.com')); - $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) ); - $sreg = new Zend_OpenId_Extension_Sreg(); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, - 'openid_sreg_required'=>'nickname', - 'openid_sreg_optional'=>'email', - ), - $sreg, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) ); - $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query['openid.ns.sreg'] ); - $this->assertSame( 'test', $query['openid.sreg.nickname'] ); - $this->assertSame( 'test@test.com', $query['openid.sreg.email'] ); - - // SREG failed - $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test')); - $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) ); - $sreg = new Zend_OpenId_Extension_Sreg(); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_immediate', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_sreg_required'=>'nickname,email', - ), - $sreg, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $url2 = parse_url($query['openid.user_setup_url']); - $this->assertSame( 'www.test.com', $url2['host'] ); - $this->assertSame( '/server.php', $url2['path'] ); - $query2 = array(); - foreach (explode('&', $url2['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query2[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query2['openid.action'] ); - $this->assertSame( 'checkid_setup', $query2['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query2['openid.return_to'] ); - $this->assertSame( self::USER, $query2['openid.identity'] ); - $this->assertSame( "nickname,email", $query2['openid.sreg.required'] ); - - $provider->logout(); - $storage->delUser(self::USER); - } - - /** - * testing handle - * - */ - public function testCheckIdSetup() - { - $_SERVER['SCRIPT_URI'] = "http://www.test.com/server.php"; - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - $provider->logout(); - - // Wrong arguments (no openid.return_to and openid.trust_root) - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertFalse( $provider->handle(array( - 'openid_mode'=>'checkid_setup'), - null, $response) ); - - // Unexistent user - $storage->delUser(self::USER); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] ); - - // No openid_identity - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/server.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'login', $query['openid.action'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - - // Non logged in user - $provider->register(self::USER, self::PASSWORD); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/server.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'login', $query['openid.action'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - - // Logged in user (unknown site) - $this->assertTrue( $provider->login(self::USER, self::PASSWORD) ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/server.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query['openid.action'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - - // Logged in user (untrusted site) - $this->assertTrue( $provider->denySite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/test.php?openid.mode=cancel', $headers[0]['value'] ); - - // Logged in user (trusted site) - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) ); - - // Logged in user (trusted site without openid.return_to) - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_trust_root'=>'http://www.test.com/test.php'), - null, $response)); - $this->assertSame( array(), $response->getHeaders() ); - $this->assertSame( '', $response->getBody() ); - - // Logged in user (trusted site) & OpenID 2.0 & established session - $storage->delAssociation(self::HANDLE); - $storage->addAssociation(self::HANDLE, "sha1", pack("H*", '0102030405060708091011121314151617181920'), time() + 3660); - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_handle'=>self::HANDLE, - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( self::HANDLE, $query['openid.assoc_handle'] ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 20, strlen(base64_decode($query['openid.sig'])) ); - - // Logged in user (trusted site) & invalid association handle - $storage->delAssociation(self::HANDLE); - $this->assertTrue( $provider->allowSite('http://www.test.com/') ); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_assoc_handle'=>self::HANDLE, - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php'), - null, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( self::HANDLE, $query['openid.invalidate_handle'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) ); - - // SREG success - $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test','email'=>'test@test.com')); - $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) ); - $sreg = new Zend_OpenId_Extension_Sreg(); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_ns'=>Zend_OpenId::NS_2_0, - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_ns_sreg'=>Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, - 'openid_sreg_required'=>'nickname', - 'openid_sreg_optional'=>'email', - ), - $sreg, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( Zend_OpenId::NS_2_0, $query['openid.ns'] ); - $this->assertSame( "http://www.test.com/server.php", $query['openid.op_endpoint'] ); - $this->assertSame( 'id_res', $query['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertTrue( isset($query['openid.assoc_handle']) ); - $this->assertTrue( isset($query['openid.response_nonce']) ); - $this->assertTrue( isset($query['openid.signed']) ); - $this->assertTrue( isset($query['openid.sig']) ); - $this->assertSame( 32, strlen(base64_decode($query['openid.sig'])) ); - $this->assertSame( Zend_OpenId_Extension_Sreg::NAMESPACE_1_1, $query['openid.ns.sreg'] ); - $this->assertSame( 'test', $query['openid.sreg.nickname'] ); - $this->assertSame( 'test@test.com', $query['openid.sreg.email'] ); - - // SREG failed - $sreg = new Zend_OpenId_Extension_Sreg(array('nickname'=>'test')); - $this->assertTrue( $provider->allowSite('http://www.test.com/', $sreg) ); - $sreg = new Zend_OpenId_Extension_Sreg(); - $response = new Zend_OpenId_ResponseHelper(true); - $this->assertTrue($provider->handle(array( - 'openid_mode'=>'checkid_setup', - 'openid_identity'=>self::USER, - 'openid_return_to'=>'http://www.test.com/test.php', - 'openid_sreg_required'=>'nickname,email', - ), - $sreg, $response)); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/server.php', $url['path'] ); - $query = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $query[$key] = urldecode($val); - } - $this->assertSame( 'trust', $query['openid.action'] ); - $this->assertSame( 'checkid_setup', $query['openid.mode'] ); - $this->assertSame( self::USER, $query['openid.identity'] ); - $this->assertSame( 'http://www.test.com/test.php', $query['openid.return_to'] ); - $this->assertSame( 'nickname,email', $query['openid.sreg.required'] ); - - $provider->logout(); - $storage->delUser(self::USER); - } - - /** - * testing handle - * - */ - public function testHandle() - { - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider")); - - // no openid_mode - $this->assertFalse( $provider->handle(array()) ); - - // wrong openid_mode - $this->assertFalse( $provider->handle(array('openid_mode'=>'wrong')) ); - } - - /** - * testing setOpEndpoint - * - */ - public function testSetOpEndpoint() - { - $storage = new Zend_OpenId_Provider_Storage_File(dirname(__FILE__)."/_files/provider"); - $provider = new Zend_OpenId_ProviderHelper(null, null, $this->_user, $storage); - $provider->setOpEndpoint("http://www.test.com/real_endpoint.php"); - - // OpenID 2.0 with SHA256 - $_SERVER['SCRIPT_URI'] = "http://www.test.com/endpoint.php"; - $response = new Zend_OpenId_ResponseHelper(true); - $storage->addAssociation(self::HANDLE, "sha256", pack("H*", '0102030405060708091011121314151617181920212223242526272829303132'), time() + 3660); - $this->assertTrue( $provider->respondToConsumer(array( - 'openid_ns' => Zend_OpenId::NS_2_0, - 'openid_assoc_handle' => self::HANDLE, - 'openid_return_to' => 'http://www.test.com/test.php' - ), null, $response) ); - $headers = $response->getHeaders(); - $this->assertSame( 'Location', $headers[0]['name'] ); - $url = parse_url($headers[0]['value']); - $this->assertSame( 'www.test.com', $url['host'] ); - $this->assertSame( '/test.php', $url['path'] ); - $ret = array(); - foreach (explode('&', $url['query']) as $line) { - list($key,$val) = explode('=', $line, 2); - $ret[$key] = urldecode($val); - } - $this->assertSame( 'id_res', $ret['openid.mode'] ); - $this->assertSame( 'http://www.test.com/test.php', $ret['openid.return_to'] ); - $this->assertSame( self::HANDLE, $ret['openid.assoc_handle'] ); - $this->assertTrue( isset($ret['openid.response_nonce']) ); - $this->assertTrue( isset($ret['openid.signed']) ); - $this->assertTrue( isset($ret['openid.sig']) ); - $this->assertSame( Zend_OpenId::NS_2_0, $ret['openid.ns'] ); - $this->assertSame( "http://www.test.com/real_endpoint.php", $ret['openid.op_endpoint'] ); - $this->assertTrue( $storage->getAssociation(self::HANDLE, $macFunc, $secret, $expires) ); - $this->assertSame( 'sha256', $macFunc ); - $storage->delAssociation(self::HANDLE); - } -} - -class Zend_OpenId_ProviderHelper extends Zend_OpenId_Provider -{ - public function genSecret($func) - { - return $this->_genSecret($func); - } -} diff --git a/tests/Zend/OpenId/ResponseHelper.php b/tests/Zend/OpenId/ResponseHelper.php deleted file mode 100644 index 0864741fec..0000000000 --- a/tests/Zend/OpenId/ResponseHelper.php +++ /dev/null @@ -1,54 +0,0 @@ -_canSendHeaders = $canSendHeaders; - } - - public function canSendHeaders($throw = false) - { - return $this->_canSendHeaders; - } - - public function sendResponse() - { - } -} diff --git a/tests/Zend/OpenIdTest.php b/tests/Zend/OpenIdTest.php deleted file mode 100644 index 8043a7f7f5..0000000000 --- a/tests/Zend/OpenIdTest.php +++ /dev/null @@ -1,699 +0,0 @@ -_serverVariables = $_SERVER; - } - - public function tearDown() - { - $_SERVER = $this->_serverVariables; - } - - - /** - * testing testSelfUrl - * - */ - public function testSelfUrl() - { - unset($_SERVER['SCRIPT_URI']); - unset($_SERVER['HTTPS']); - unset($_SERVER['HTTP_HOST']); - unset($_SERVER['SERVER_NAME']); - unset($_SERVER['SERVER_PORT']); - unset($_SERVER['SCRIPT_URL']); - unset($_SERVER['REDIRECT_URL']); - unset($_SERVER['PHP_SELF']); - unset($_SERVER['SCRIPT_NAME']); - unset($_SERVER['PATH_INFO']); - $this->assertSame( 'http://', Zend_OpenId::selfUrl() ); - - $_SERVER['SCRIPT_URI'] = "http://www.test.com/"; - $this->assertSame( 'http://www.test.com/', Zend_OpenId::selfUrl() ); - - unset($_SERVER['SCRIPT_URI']); - $_SERVER['HTTP_HOST'] = "www.test.com"; - $_SERVER['SERVER_NAME'] = "www.wrong.com"; - $this->assertSame( 'http://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['HTTP_HOST'] = "www.test.com:80"; - $this->assertSame( 'http://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['HTTP_HOST'] = "www.test.com:8080"; - $this->assertSame( 'http://www.test.com:8080', Zend_OpenId::selfUrl() ); - - $_SERVER['HTTP_HOST'] = "www.test.com"; - $_SERVER['SERVER_PORT'] = "80"; - $this->assertSame( 'http://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['SERVER_PORT'] = "8080"; - $this->assertSame( 'http://www.test.com:8080', Zend_OpenId::selfUrl() ); - - unset($_SERVER['HTTP_HOST']); - unset($_SERVER['SERVER_PORT']); - $_SERVER['SERVER_NAME'] = "www.test.com"; - $this->assertSame( 'http://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['SERVER_PORT'] = "80"; - $this->assertSame( 'http://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['SERVER_PORT'] = "8080"; - $this->assertSame( 'http://www.test.com:8080', Zend_OpenId::selfUrl() ); - - unset($_SERVER['SERVER_PORT']); - $_SERVER['HTTPS'] = "on"; - $this->assertSame( 'https://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['SERVER_PORT'] = "443"; - $this->assertSame( 'https://www.test.com', Zend_OpenId::selfUrl() ); - - $_SERVER['SERVER_PORT'] = "8080"; - $this->assertSame( 'https://www.test.com:8080', Zend_OpenId::selfUrl() ); - - unset($_SERVER['SERVER_PORT']); - unset($_SERVER['HTTPS']); - - $_SERVER['SCRIPT_URL'] = '/test.php'; - $_SERVER['PHP_SELF'] = '/bug.php'; - $_SERVER['SCRIPT_NAME'] = '/bug.php'; - $_SERVER['PATH_INFO'] = '/bug'; - $this->assertSame( 'http://www.test.com/test.php', Zend_OpenId::selfUrl() ); - - unset($_SERVER['SCRIPT_URL']); - $_SERVER['REDIRECT_URL'] = '/ok'; - $_SERVER['PHP_SELF'] = '/bug.php'; - $_SERVER['SCRIPT_NAME'] = '/bug.php'; - $_SERVER['PATH_INFO'] = '/bug'; - $this->assertSame( 'http://www.test.com/ok', Zend_OpenId::selfUrl() ); - - unset($_SERVER['REDIRECT_URL']); - $_SERVER['PHP_SELF'] = '/test.php'; - $this->assertSame( 'http://www.test.com/test.php', Zend_OpenId::selfUrl() ); - - unset($_SERVER['PHP_SELF']); - $_SERVER['SCRIPT_NAME'] = '/test.php'; - $_SERVER['PATH_INFO'] = '/ok'; - $this->assertSame( 'http://www.test.com/test.php/ok', Zend_OpenId::selfUrl() ); - - unset($_SERVER['PATH_INFO']); - $this->assertSame( 'http://www.test.com/test.php', Zend_OpenId::selfUrl() ); - } - - /** - * testing testAbsolutefUrl - * - */ - public function testAbsoluteUrl() - { - unset($_SERVER['SCRIPT_URI']); - unset($_SERVER['HTTPS']); - unset($_SERVER['HTTP_HOST']); - unset($_SERVER['SERVER_NAME']); - unset($_SERVER['SERVER_PORT']); - unset($_SERVER['SCRIPT_URL']); - unset($_SERVER['REDIRECT_URL']); - unset($_SERVER['PHP_SELF']); - unset($_SERVER['SCRIPT_NAME']); - unset($_SERVER['PATH_INFO']); - - $_SERVER['HTTP_HOST'] = "www.test.com"; - $_SERVER['SCRIPT_NAME'] = '/a/b/c/test.php'; - - $this->assertSame( 'http://www.test.com/a/b/c/test.php', Zend_OpenId::absoluteUrl("") ); - - $this->assertSame( 'http://www.test.com/a/b/c/ok.php', Zend_OpenId::absoluteUrl("ok.php") ); - - $this->assertSame( 'http://www.test.com/a/ok.php', Zend_OpenId::absoluteUrl("/a/ok.php") ); - - $this->assertSame( 'http://www.php.net/ok.php', Zend_OpenId::absoluteUrl("http://www.php.net/ok.php") ); - - $this->assertSame( 'https://www.php.net/ok.php', Zend_OpenId::absoluteUrl("https://www.php.net/ok.php") ); - - $_SERVER['SCRIPT_NAME'] = '/test.php'; - $this->assertSame( 'http://www.test.com/a/b.php', Zend_OpenId::absoluteUrl("/a/b.php") ); - - $this->assertSame( 'http://www.test.com/a/b.php', Zend_OpenId::absoluteUrl("a/b.php") ); - } - - /** - * testing testParamsToQuery - * - */ - public function testParamsToQuery() - { - $this->assertSame( '', Zend_OpenId::paramsToQuery(array()) ); - $this->assertSame( 'a=1', Zend_OpenId::paramsToQuery(array('a'=>1)) ); - $this->assertSame( 'a=1&b=2', Zend_OpenId::paramsToQuery(array('a'=>1,'b'=>2)) ); - $this->assertSame( 'a=x+y', Zend_OpenId::paramsToQuery(array('a'=>'x y')) ); - } - - /** - * testing testNormalizeUrl - * - */ - public function testNormalizeUrl() - { - $url = 'example://a/b/c/%7Bfoo%7D'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://a/b/c/%7Bfoo%7D', $url ); - - $url = 'eXAMPLE://A/./b/../b/%63/%7bfoo%7d'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://a/b/c/%7Bfoo%7D', $url ); - - $url = 'eXAMPLE://A/./b/../b/%63/%bbfoo%Bd'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://a/b/c/%BBfoo%BD', $url ); - - $url = 'example://a/b/c/%1'; - $this->assertFalse( Zend_OpenId::normalizeUrl($url) ); - - $url = 'example://a/b/c/%x1'; - $this->assertFalse( Zend_OpenId::normalizeUrl($url) ); - - $url = 'example://a/b/c/%1x'; - $this->assertFalse( Zend_OpenId::normalizeUrl($url) ); - - $url = 'eXAMPLE://A/b/c/x%20y'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://a/b/c/x%20y', $url ); - - $url = 'example://host/.a/b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/.a/b/c', $url ); - - $url = 'a/b/c'; - $this->assertFalse( Zend_OpenId::normalizeUrl($url) ); - - $url = 'example://:80/a/b/c'; - $this->assertFalse( Zend_OpenId::normalizeUrl($url) ); - - $url = 'example://host/a/.b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/.b/c', $url ); - - $url = 'example://host/a/b/.c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/.c', $url ); - - $url = 'example://host/..a/b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/..a/b/c', $url ); - - $url = 'example://host/a/..b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/..b/c', $url ); - - $url = 'example://host/a/b/..c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/..c', $url ); - - $url = 'example://host/./b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/b/c', $url ); - - $url = 'example://host/a/./c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/c', $url ); - - $url = 'example://host/a/b/.'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b', $url ); - - $url = 'example://host/a/b/./'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/', $url ); - - $url = 'example://host/../b/c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/b/c', $url ); - - $url = 'example://host/a/../c'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/c', $url ); - - $url = 'example://host/a/b/..'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a', $url ); - - $url = 'example://host/a/b/../'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/', $url ); - - $url = 'example://host/a/b/c/..'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b', $url ); - - $url = 'example://host/a/b/c/../..'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a', $url ); - - $url = 'example://host/a/b/c/../../..'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/', $url ); - - $url = 'example://host///a///b///c///..///../d'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/d', $url ); - - $url = 'example://host///a///b///c///.///./d'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/c/d', $url ); - - $url = 'example://host///a///b///c///..///./d'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/d', $url ); - - $url = 'example://host///a///b///c///.///../d'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'example://host/a/b/d', $url ); - - $url = 'http://example.com'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/', $url ); - - $url = 'http://example.com/'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/', $url ); - - $url = 'http://example.com:'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/', $url ); - - $url = 'http://example.com:80/'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/', $url ); - - $url = 'https://example.com:443/'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'https://example.com/', $url ); - - $url = 'http://example.com?'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/?', $url ); - - $url = 'http://example.com/?'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/?', $url ); - - $url = 'http://example.com/test.php?Foo=Bar#Baz'; - $this->assertTrue( Zend_OpenId::normalizeUrl($url) ); - $this->assertSame( 'http://example.com/test.php?Foo=Bar#Baz', $url ); - } - - /** - * testing testNormalize - * - */ - public function testNormalize() - { - $url = ''; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '', $url ); - - $url = ' localhost '; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://localhost/', $url ); - - $url = 'xri://$ip*127.0.0.1'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://127.0.0.1/', $url ); - - $url = 'xri://$dns*localhost'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://localhost/', $url ); - - $url = 'xri://localhost'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://localhost/', $url ); - - $url = '=name'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '=name', $url ); - - $url = '@name'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '@name', $url ); - - $url = '+name'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '+name', $url ); - - $url = '$name'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '$name', $url ); - - $url = '!name'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( '!name', $url ); - - $url = 'localhost'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://localhost/', $url ); - - $url = 'http://localhost'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'http://localhost/', $url ); - - $url = 'https://localhost'; - $this->assertTrue( Zend_OpenId::normalize($url) ); - $this->assertSame( 'https://localhost/', $url ); - } - - /** - * testing testRedirect - * - */ - public function testRedirect() - { - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/", null, $response, 'GET'); - $this->assertSame( 302, $response->getHttpResponseCode() ); - $this->assertSame( array(), $response->getRawHeaders() ); - $headers = $response->getHeaders(); - $this->assertTrue( is_array($headers) ); - $this->assertSame( 1, count($headers) ); - $this->assertTrue( is_array($headers[0]) ); - $this->assertSame( 3, count($headers[0]) ); - $this->assertSame( 'Location', $headers[0]['name'] ); - $this->assertSame( 'http://www.test.com/', $headers[0]['value'] ); - $this->assertSame( true, $headers[0]['replace'] ); - $this->assertSame( '', $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", null, $response, 'GET'); - $headers = $response->getHeaders(); - $this->assertSame( 'http://www.test.com/test.php?a=b', $headers[0]['value'] ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'b'), $response, 'GET'); - $headers = $response->getHeaders(); - $this->assertSame( 'http://www.test.com/test.php?a=b', $headers[0]['value'] ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'b', 'c'=>'d'), $response, 'GET'); - $headers = $response->getHeaders(); - $this->assertSame( 'http://www.test.com/test.php?a=b&c=d', $headers[0]['value'] ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", array('c'=>'d'), $response, 'GET'); - $headers = $response->getHeaders(); - $this->assertSame( 'http://www.test.com/test.php?a=b&c=d', $headers[0]['value'] ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'x y'), $response, 'GET'); - $headers = $response->getHeaders(); - $this->assertSame( 'http://www.test.com/test.php?a=x+y', $headers[0]['value'] ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/", null, $response, 'GET'); - $this->assertSame( 200, $response->getHttpResponseCode() ); - $this->assertSame( array(), $response->getRawHeaders() ); - $this->assertSame( array(), $response->getHeaders() ); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", null, $response, 'GET'); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'b'), $response, 'GET'); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'b','c'=>'d'), $response, 'GET'); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", array('c'=>'d'), $response, 'GET'); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(false); - Zend_OpenId::redirect("http://www.test.com/test.php", array('a'=>'x y'), $response, 'GET'); - $this->assertSame( - "", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/", null, $response, 'POST'); - $this->assertSame( 200, $response->getHttpResponseCode() ); - $this->assertSame( array(), $response->getRawHeaders() ); - $this->assertSame( array(), $response->getHeaders() ); - $this->assertSame( - "\n" . - "
      \n" . - "\n" . - "
      \n", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", array('a'=>'b'), $response, 'POST'); - $this->assertSame( - "\n" . - "
      \n" . - "\n" . - "\n" . - "
      \n", - $response->getBody() ); - - $response = new Zend_OpenId_ResponseHelper(true); - Zend_OpenId::redirect("http://www.test.com/test.php?a=b", array('a'=>'b','c'=>'d'), $response, 'POST'); - $this->assertSame( - "\n" . - "
      \n" . - "\n" . - "\n" . - "\n" . - "
      \n", - $response->getBody() ); - } - - /** - * testing testRedirect - * - */ - public function testRandomBytes() - { - $this->assertSame( '', Zend_OpenId::randomBytes(0) ); - $x = Zend_OpenId::randomBytes(1); - $this->assertTrue( is_string($x) ); - $this->assertSame( 1, strlen($x) ); - $x = Zend_OpenId::randomBytes(1024); - $this->assertTrue( is_string($x) ); - $this->assertSame( 1024, strlen($x) ); - } - - /** - * testing testDigest - * - */ - public function testDigest() - { - $this->assertSame( - 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d', - bin2hex(Zend_OpenId::digest('sha1', 'hello')) ); - $this->assertSame( - '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824', - bin2hex(Zend_OpenId::digest('sha256', 'hello')) ); - } - - /** - * testing testHashHmac - * - */ - public function testHashHmac() - { - $key = 'password'; - $this->assertSame( - '1f48abc79459fa853af681ddb3c73ff7f35c48fb', - bin2hex(Zend_OpenId::hashHmac('sha1', 'hello', $key)) ); - $this->assertSame( - '7ae615e698567e5e1512dd8140e740bd4d65dfa4db195d80ca327de6302b4a63', - bin2hex(Zend_OpenId::hashHmac('sha256', 'hello', $key)) ); - $key = str_repeat('x',128); - $this->assertSame( - '59c6c30dc9fb96b2cb2d7c41dbc6f96d1fbf67ac', - bin2hex(Zend_OpenId::hashHmac('sha1', 'hello', $key)) ); - $this->assertSame( - 'f5e0c31f7cdd272710052ac3ebcc40d7e82be2427b7e5e1e8373ef1e327515f4', - bin2hex(Zend_OpenId::hashHmac('sha256', 'hello', $key)) ); - } - - /** - * testing testCreateDhKey - * - */ - public function testCreateDhKey() - { - try { - $dh = Zend_OpenId::createDhKey( - pack('H*', '0233'), - pack('H*', '05'), - pack('H*', '09')); - $dh_details = Zend_OpenId::getDhKeyDetails($dh); - $this->assertTrue( is_array($dh_details) ); - $this->assertSame( 4, count($dh_details)); - $this->assertSame( '0233', bin2hex($dh_details['p']) ); - $this->assertSame( '05', bin2hex($dh_details['g']) ); - $this->assertSame( '09', bin2hex($dh_details['priv_key']) ); - $this->assertSame( '4e', bin2hex($dh_details['pub_key']) ); - - $dh = Zend_OpenId::createDhKey( - pack('H*', '0233'), - pack('H*', '02'), - pack('H*', '09')); - $dh_details = Zend_OpenId::getDhKeyDetails($dh); - $this->assertTrue( is_array($dh_details) ); - $this->assertSame( 4, count($dh_details) ); - $this->assertSame( '0233', bin2hex($dh_details['p']) ); - $this->assertSame( '02', bin2hex($dh_details['g']) ); - $this->assertSame( '09', bin2hex($dh_details['priv_key']) ); - $this->assertSame( '0200', bin2hex($dh_details['pub_key']) ); - - $dh = Zend_OpenId::createDhKey( - pack('H*', '0233'), - pack('H*', '02')); - $dh_details = Zend_OpenId::getDhKeyDetails($dh); - $this->assertTrue( is_array($dh_details) ); - $this->assertSame( 4, count($dh_details) ); - $this->assertSame( '0233', bin2hex($dh_details['p']) ); - $this->assertSame( '02', bin2hex($dh_details['g']) ); - $this->assertTrue( is_string($dh_details['priv_key']) ); - $this->assertTrue( strlen($dh_details['priv_key']) > 0 ); - $this->assertTrue( is_string($dh_details['pub_key']) ); - $this->assertTrue( strlen($dh_details['pub_key']) > 0 ); - } catch (Zend_OpenId_Exception $e) { - $this->markTestSkipped($e->getMessage()); - } - } - - /** - * testing testComputeDhSecret - * - */ - public function testComputeDhSecret() - { - try { - $alice = Zend_OpenId::createDhKey( - pack('H*', '0233'), - pack('H*', '05'), - pack('H*', '09')); - $alice_details = Zend_OpenId::getDhKeyDetails($alice); - $this->assertSame( '4e', bin2hex($alice_details['pub_key']) ); - - $bob = Zend_OpenId::createDhKey( - pack('H*', '0233'), - pack('H*', '05'), - pack('H*', '0e')); - $bob_details = Zend_OpenId::getDhKeyDetails($bob); - $this->assertSame( '0216', bin2hex($bob_details['pub_key']) ); - - $this->assertSame( '75', - bin2hex(Zend_OpenId::computeDhSecret($alice_details['pub_key'], $bob)) ); - $this->assertSame( '75', - bin2hex(Zend_OpenId::computeDhSecret($bob_details['pub_key'], $alice)) ); - } catch (Zend_OpenId_Exception $e) { - $this->markTestSkipped($e->getMessage()); - } - } - - /** - * testing testBtwoc - * - */ - public function testBtwoc() - { - $this->assertSame( '00', bin2hex(Zend_OpenId::btwoc(pack('H*', '00'))) ); - $this->assertSame( '01', bin2hex(Zend_OpenId::btwoc(pack('H*', '01'))) ); - $this->assertSame( '7e', bin2hex(Zend_OpenId::btwoc(pack('H*', '7e'))) ); - $this->assertSame( '78', bin2hex(Zend_OpenId::btwoc(pack('H*', '78'))) ); - $this->assertSame( '0080', bin2hex(Zend_OpenId::btwoc(pack('H*', '80'))) ); - $this->assertSame( '0081', bin2hex(Zend_OpenId::btwoc(pack('H*', '81'))) ); - $this->assertSame( '00fe', bin2hex(Zend_OpenId::btwoc(pack('H*', 'fe'))) ); - $this->assertSame( '00ff', bin2hex(Zend_OpenId::btwoc(pack('H*', 'ff'))) ); - } - - /** - * testing setSelfUrl - * - */ - public function testSetSelfUrl() - { - unset($_SERVER['SCRIPT_URI']); - unset($_SERVER['HTTPS']); - unset($_SERVER['HTTP_HOST']); - unset($_SERVER['SERVER_NAME']); - unset($_SERVER['SERVER_PORT']); - unset($_SERVER['SCRIPT_URL']); - unset($_SERVER['REDIRECT_URL']); - unset($_SERVER['PHP_SELF']); - unset($_SERVER['SCRIPT_NAME']); - unset($_SERVER['PATH_INFO']); - $_SERVER['SCRIPT_URI'] = "http://www.test.com/"; - - $this->assertSame( 'http://www.test.com/', Zend_OpenId::selfUrl() ); - - $this->assertSame( null, Zend_OpenId::setSelfUrl("http://localhost/test") ); - $this->assertSame( "http://localhost/test", Zend_OpenId::selfUrl() ); - - $this->assertSame( "http://localhost/test", Zend_OpenId::setSelfUrl() ); - $this->assertSame( 'http://www.test.com/', Zend_OpenId::selfUrl() ); - - $this->assertSame( null, Zend_OpenId::setSelfUrl() ); - $this->assertSame( 'http://www.test.com/', Zend_OpenId::selfUrl() ); - } -} From a62fd620c98f05d168edb3f584499e8ded2de7ba Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:47:53 -0500 Subject: [PATCH 33/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Ldap Tests --- tests/Zend/AllTests.php | 2 - tests/Zend/Ldap/AllTests.php | 116 --- tests/Zend/Ldap/AttributeTest.php | 543 -------------- tests/Zend/Ldap/BindTest.php | 273 ------- tests/Zend/Ldap/CanonTest.php | 397 ----------- tests/Zend/Ldap/ChangePasswordTest.php | 223 ------ tests/Zend/Ldap/ConnectTest.php | 221 ------ tests/Zend/Ldap/ConverterTest.php | 267 ------- tests/Zend/Ldap/CopyRenameTest.php | 362 ---------- tests/Zend/Ldap/CrudTest.php | 509 ------------- tests/Zend/Ldap/Dn/AllTests.php | 67 -- tests/Zend/Ldap/Dn/CreationTest.php | 210 ------ tests/Zend/Ldap/Dn/EscapingTest.php | 58 -- tests/Zend/Ldap/Dn/ExplodingTest.php | 263 ------- tests/Zend/Ldap/Dn/ImplodingTest.php | 137 ---- tests/Zend/Ldap/Dn/MiscTest.php | 87 --- tests/Zend/Ldap/Dn/ModificationTest.php | 294 -------- tests/Zend/Ldap/FilterTest.php | 214 ------ tests/Zend/Ldap/Ldif/AllTests.php | 78 -- tests/Zend/Ldap/Ldif/SimpleDecoderTest.php | 390 ---------- tests/Zend/Ldap/Ldif/SimpleEncoderTest.php | 269 ------- tests/Zend/Ldap/Node/AllTests.php | 93 --- .../Zend/Ldap/Node/AttributeIterationTest.php | 64 -- .../Zend/Ldap/Node/ChildrenIterationTest.php | 125 ---- tests/Zend/Ldap/Node/ChildrenTest.php | 207 ------ tests/Zend/Ldap/Node/OfflineTest.php | 672 ------------------ tests/Zend/Ldap/Node/OnlineTest.php | 289 -------- tests/Zend/Ldap/Node/RootDseTest.php | 177 ----- tests/Zend/Ldap/Node/SchemaTest.php | 314 -------- tests/Zend/Ldap/Node/UpdateTest.php | 219 ------ tests/Zend/Ldap/OfflineTest.php | 152 ---- tests/Zend/Ldap/OnlineTestCase.php | 143 ---- tests/Zend/Ldap/OriginalBindTest.php | 181 ----- tests/Zend/Ldap/OriginalCanonTest.php | 119 ---- tests/Zend/Ldap/OriginalConnectTest.php | 174 ----- tests/Zend/Ldap/OriginalOfflineTest.php | 113 --- tests/Zend/Ldap/SearchTest.php | 613 ---------------- tests/Zend/Ldap/TestCase.php | 61 -- .../Zend/Ldap/_files/AttributeTest.input.txt | 1 - 39 files changed, 8697 deletions(-) delete mode 100644 tests/Zend/Ldap/AllTests.php delete mode 100644 tests/Zend/Ldap/AttributeTest.php delete mode 100644 tests/Zend/Ldap/BindTest.php delete mode 100644 tests/Zend/Ldap/CanonTest.php delete mode 100644 tests/Zend/Ldap/ChangePasswordTest.php delete mode 100644 tests/Zend/Ldap/ConnectTest.php delete mode 100644 tests/Zend/Ldap/ConverterTest.php delete mode 100644 tests/Zend/Ldap/CopyRenameTest.php delete mode 100644 tests/Zend/Ldap/CrudTest.php delete mode 100644 tests/Zend/Ldap/Dn/AllTests.php delete mode 100644 tests/Zend/Ldap/Dn/CreationTest.php delete mode 100644 tests/Zend/Ldap/Dn/EscapingTest.php delete mode 100644 tests/Zend/Ldap/Dn/ExplodingTest.php delete mode 100644 tests/Zend/Ldap/Dn/ImplodingTest.php delete mode 100644 tests/Zend/Ldap/Dn/MiscTest.php delete mode 100644 tests/Zend/Ldap/Dn/ModificationTest.php delete mode 100644 tests/Zend/Ldap/FilterTest.php delete mode 100644 tests/Zend/Ldap/Ldif/AllTests.php delete mode 100644 tests/Zend/Ldap/Ldif/SimpleDecoderTest.php delete mode 100644 tests/Zend/Ldap/Ldif/SimpleEncoderTest.php delete mode 100644 tests/Zend/Ldap/Node/AllTests.php delete mode 100644 tests/Zend/Ldap/Node/AttributeIterationTest.php delete mode 100644 tests/Zend/Ldap/Node/ChildrenIterationTest.php delete mode 100644 tests/Zend/Ldap/Node/ChildrenTest.php delete mode 100644 tests/Zend/Ldap/Node/OfflineTest.php delete mode 100644 tests/Zend/Ldap/Node/OnlineTest.php delete mode 100644 tests/Zend/Ldap/Node/RootDseTest.php delete mode 100644 tests/Zend/Ldap/Node/SchemaTest.php delete mode 100644 tests/Zend/Ldap/Node/UpdateTest.php delete mode 100644 tests/Zend/Ldap/OfflineTest.php delete mode 100644 tests/Zend/Ldap/OnlineTestCase.php delete mode 100644 tests/Zend/Ldap/OriginalBindTest.php delete mode 100644 tests/Zend/Ldap/OriginalCanonTest.php delete mode 100644 tests/Zend/Ldap/OriginalConnectTest.php delete mode 100644 tests/Zend/Ldap/OriginalOfflineTest.php delete mode 100644 tests/Zend/Ldap/SearchTest.php delete mode 100644 tests/Zend/Ldap/TestCase.php delete mode 100644 tests/Zend/Ldap/_files/AttributeTest.input.txt diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 5ee53ea96a..7df6f23c54 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -42,7 +42,6 @@ require_once 'Zend/Http/AllTests.php'; require_once 'Zend/JsonTest.php'; require_once 'Zend/Json/AllTests.php'; -require_once 'Zend/Ldap/AllTests.php'; require_once 'Zend/LoaderTest.php'; require_once 'Zend/Loader/AllTests.php'; require_once 'Zend/LocaleTest.php'; @@ -149,7 +148,6 @@ public static function suite() $suite->addTest(Zend_Http_AllTests::suite()); $suite->addTestSuite('Zend_JsonTest'); $suite->addTest(Zend_Json_AllTests::suite()); - $suite->addTest(Zend_Ldap_AllTests::suite()); $suite->addTestSuite('Zend_LoaderTest'); $suite->addTest(Zend_Loader_AllTests::suite()); $suite->addTestSuite('Zend_LocaleTest'); diff --git a/tests/Zend/Ldap/AllTests.php b/tests/Zend/Ldap/AllTests.php deleted file mode 100644 index fd19392dfe..0000000000 --- a/tests/Zend/Ldap/AllTests.php +++ /dev/null @@ -1,116 +0,0 @@ -addTestSuite('Zend_Ldap_OfflineTest'); - $suite->addTestSuite('Zend_Ldap_AttributeTest'); - $suite->addTestSuite('Zend_Ldap_ConverterTest'); - $suite->addTest(Zend_Ldap_Dn_AllTests::suite()); - $suite->addTestSuite('Zend_Ldap_FilterTest'); - $suite->addTest(Zend_Ldap_Node_AllTests::suite()); - $suite->addTest(Zend_Ldap_Ldif_AllTests::suite()); - - if (defined('TESTS_ZEND_LDAP_ONLINE_ENABLED') - && constant('TESTS_ZEND_LDAP_ONLINE_ENABLED')) { - $suite->addTestSuite('Zend_Ldap_ConnectTest'); - $suite->addTestSuite('Zend_Ldap_BindTest'); - $suite->addTestSuite('Zend_Ldap_CanonTest'); - $suite->addTestSuite('Zend_Ldap_SearchTest'); - $suite->addTestSuite('Zend_Ldap_CrudTest'); - $suite->addTestSuite('Zend_Ldap_CopyRenameTest'); - $suite->addTestSuite('Zend_Ldap_ChangePasswordTest'); - } else { - $suite->addTest(new Zend_Ldap_SkipOnlineTests()); - } - - return $suite; - } -} - -/** - * @category Zend - * @package Zend_Ldap - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - * @group Zend_Ldap - */ -class Zend_Ldap_SkipOnlineTests extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Ldap online tests not enabled in TestConfiguration.php'); - } - - /** - * @group Zend_Ldap - */ - public function testNothing() - { - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Ldap_AllTests::main') { - Zend_Ldap_AllTests::main(); -} - diff --git a/tests/Zend/Ldap/AttributeTest.php b/tests/Zend/Ldap/AttributeTest.php deleted file mode 100644 index 0482d37ad1..0000000000 --- a/tests/Zend/Ldap/AttributeTest.php +++ /dev/null @@ -1,543 +0,0 @@ -assertEquals($tsValue, $value); - } - - protected function _assertUtcDateTimeString($localTimestamp, $value) - { - $localOffset = date('Z', $localTimestamp); - $utcTimestamp = $localTimestamp - $localOffset; - $this->assertEquals(date('YmdHis', $utcTimestamp) . 'Z', $value); - } - - public function testGetAttributeValue() - { - $data=array('uid' => array('value')); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid', 0); - $this->assertEquals('value', $value); - } - - public function testGetNonExistentAttributeValue() - { - $data=array('uid' => array('value')); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid', 1); - $this->assertNull($value); - } - - public function testGetNonExistentAttribute() - { - $data=array('uid' => array('value')); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid2', 0); - $this->assertNull($value); - $array=Zend_Ldap_Attribute::getAttribute($data, 'uid2'); - $this->assertTrue(is_array($array)); - $this->assertEquals(0, count($array)); - } - - public function testGetAttributeWithWrongIndexType() - { - $data=array('uid' => array('value')); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid', 'index'); - $this->assertNull($value); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid', 3.1415); - $this->assertNull($value); - } - - public function testGetAttributeArray() - { - $data=array('uid' => array('value')); - $value=Zend_Ldap_Attribute::getAttribute($data, 'uid'); - $this->assertTrue(is_array($value)); - $this->assertEquals(1, count($value)); - $this->assertContains('value', $value); - } - - public function testSimpleSetAttribute() - { - $data=array(); - Zend_Ldap_Attribute::setAttribute($data, 'uid', 'new', false); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(1, count($data['uid'])); - $this->assertContains('new', $data['uid']); - } - - public function testSimpleOverwriteAttribute() - { - $data=array('uid' => array('old')); - Zend_Ldap_Attribute::setAttribute($data, 'uid', 'new', false); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(1, count($data['uid'])); - $this->assertContains('new', $data['uid']); - } - - public function testSimpleAppendAttribute() - { - $data=array('uid' => array('old')); - Zend_Ldap_Attribute::setAttribute($data, 'uid', 'new', true); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(2, count($data['uid'])); - $this->assertContains('old', $data['uid']); - $this->assertContains('new', $data['uid']); - $this->assertEquals('old', $data['uid'][0]); - $this->assertEquals('new', $data['uid'][1]); - } - - public function testBooleanAttributeHandling() - { - $data=array( - 'p1_true' => array('TRUE'), - 'p1_false' => array('FALSE') - ); - Zend_Ldap_Attribute::setAttribute($data, 'p2_true', true); - Zend_Ldap_Attribute::setAttribute($data, 'p2_false', false); - $this->assertEquals('TRUE', $data['p2_true'][0]); - $this->assertEquals('FALSE', $data['p2_false'][0]); - $this->assertEquals(true, Zend_Ldap_Attribute::getAttribute($data, 'p1_true', 0)); - $this->assertEquals(false, Zend_Ldap_Attribute::getAttribute($data, 'p1_false', 0)); - } - - public function testArraySetAttribute() - { - $data=array(); - Zend_Ldap_Attribute::setAttribute($data, 'uid', array('new1', 'new2'), false); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(2, count($data['uid'])); - $this->assertContains('new1', $data['uid']); - $this->assertContains('new2', $data['uid']); - $this->assertEquals('new1', $data['uid'][0]); - $this->assertEquals('new2', $data['uid'][1]); - } - - public function testArrayOverwriteAttribute() - { - $data=array('uid' => array('old')); - Zend_Ldap_Attribute::setAttribute($data, 'uid', array('new1', 'new2'), false); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(2, count($data['uid'])); - $this->assertContains('new1', $data['uid']); - $this->assertContains('new2', $data['uid']); - $this->assertEquals('new1', $data['uid'][0]); - $this->assertEquals('new2', $data['uid'][1]); - } - - public function testArrayAppendAttribute() - { - $data=array('uid' => array('old')); - Zend_Ldap_Attribute::setAttribute($data, 'uid', array('new1', 'new2'), true); - $this->assertArrayHasKey('uid', $data); - $this->assertTrue(is_array($data['uid'])); - $this->assertEquals(3, count($data['uid'])); - $this->assertContains('old', $data['uid']); - $this->assertContains('new1', $data['uid']); - $this->assertContains('new2', $data['uid']); - $this->assertEquals('old', $data['uid'][0]); - $this->assertEquals('new1', $data['uid'][1]); - $this->assertEquals('new2', $data['uid'][2]); - } - - public function testPasswordSettingSHA() - { - $data=array(); - Zend_Ldap_Attribute::setPassword($data, 'pa$$w0rd', Zend_Ldap_Attribute::PASSWORD_HASH_SHA); - $password=Zend_Ldap_Attribute::getAttribute($data, 'userPassword', 0); - $this->assertEquals('{SHA}vi3X+3ptD4ulrdErXo+3W72mRyE=', $password); - } - - public function testPasswordSettingMD5() - { - $data=array(); - Zend_Ldap_Attribute::setPassword($data, 'pa$$w0rd', Zend_Ldap_Attribute::PASSWORD_HASH_MD5); - $password=Zend_Ldap_Attribute::getAttribute($data, 'userPassword', 0); - $this->assertEquals('{MD5}bJuLJ96h3bhF+WqiVnxnVA==', $password); - } - - public function testPasswordSettingUnicodePwd() - { - $data=array(); - Zend_Ldap_Attribute::setPassword($data, 'new', Zend_Ldap_Attribute::PASSWORD_UNICODEPWD); - $password=Zend_Ldap_Attribute::getAttribute($data, 'unicodePwd', 0); - $this->assertEquals("\x22\x00\x6E\x00\x65\x00\x77\x00\x22\x00", $password); - } - - public function testPasswordSettingCustomAttribute() - { - $data=array(); - Zend_Ldap_Attribute::setPassword($data, 'pa$$w0rd', - Zend_Ldap_Attribute::PASSWORD_HASH_SHA, 'myAttribute'); - $password=Zend_Ldap_Attribute::getAttribute($data, 'myAttribute', 0); - $this->assertNotNull($password); - } - - public function testSetAttributeWithObject() - { - $data=array(); - $object=new stdClass(); - $object->a=1; - $object->b=1.23; - $object->c='string'; - Zend_Ldap_Attribute::setAttribute($data, 'object', $object); - $this->assertEquals(serialize($object), $data['object'][0]); - } - - public function testSetAttributeWithFilestream() - { - $data=array(); - $stream=fopen(dirname(__FILE__) . '/_files/AttributeTest.input.txt', 'r'); - Zend_Ldap_Attribute::setAttribute($data, 'file', $stream); - fclose($stream); - $this->assertEquals('String from file', $data['file'][0]); - } - - public function testSetDateTimeValueLocal() - { - $ts=mktime(12, 30, 30, 6, 25, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, false); - $this->_assertLocalDateTimeString($ts, $data['ts'][0]); - } - - public function testSetDateTimeValueUtc() - { - $ts=mktime(12, 30, 30, 6, 25, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, true); - $this->_assertUtcDateTimeString($ts, $data['ts'][0]); - } - - public function testSetDateTimeValueLocalArray() - { - $ts=array(); - $ts[]=mktime(12, 30, 30, 6, 25, 2008); - $ts[]=mktime(1, 25, 30, 1, 2, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, false); - $this->_assertLocalDateTimeString($ts[0], $data['ts'][0]); - $this->_assertLocalDateTimeString($ts[1], $data['ts'][1]); - } - - public function testSetDateTimeValueIllegal() - { - $ts='dummy'; - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, false); - $this->assertEquals(0, count($data['ts'])); - } - - public function testGetDateTimeValueFromLocal() - { - $ts=mktime(12, 30, 30, 6, 25, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, false); - $this->_assertLocalDateTimeString($ts, $data['ts'][0]); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts', 0); - $this->assertEquals($ts, $retTs); - } - - public function testGetDateTimeValueFromUtc() - { - $ts=mktime(12, 30, 30, 6, 25, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, true); - $this->_assertUtcDateTimeString($ts, $data['ts'][0]); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts', 0); - $this->assertEquals($ts, $retTs); - } - - public function testGetDateTimeValueFromArray() - { - $ts=array(); - $ts[]=mktime(12, 30, 30, 6, 25, 2008); - $ts[]=mktime(1, 25, 30, 1, 2, 2008); - $data=array(); - Zend_Ldap_Attribute::setDateTimeAttribute($data, 'ts', $ts, false); - $this->_assertLocalDateTimeString($ts[0], $data['ts'][0]); - $this->_assertLocalDateTimeString($ts[1], $data['ts'][1]); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts'); - $this->assertEquals($ts[0], $retTs[0]); - $this->assertEquals($ts[1], $retTs[1]); - } - - public function testGetDateTimeValueIllegal() - { - $data=array('ts' => array('dummy')); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts', 0); - $this->assertEquals('dummy', $retTs); - } - - public function testGetDateTimeValueNegativeOffet() - { - $data=array('ts' => array('20080612143045-0700')); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts', 0); - $tsCompare=gmmktime(21, 30, 45, 6, 12, 2008); - $this->assertEquals($tsCompare, $retTs); - } - - public function testGetDateTimeValueNegativeOffet2() - { - $data=array('ts' => array('20080612143045-0715')); - $retTs=Zend_Ldap_Attribute::getDateTimeAttribute($data, 'ts', 0); - $tsCompare=gmmktime(21, 45, 45, 6, 12, 2008); - $this->assertEquals($tsCompare, $retTs); - } - - public function testRemoveAttributeValueSimple() - { - $data=array('test' => array('value1', 'value2', 'value3', 'value3')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', 'value2'); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(3, count($data['test'])); - $this->assertContains('value1', $data['test']); - $this->assertContains('value3', $data['test']); - $this->assertNotContains('value2', $data['test']); - } - - public function testRemoveAttributeValueArray() - { - $data=array('test' => array('value1', 'value2', 'value3', 'value3')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', array('value1', 'value2')); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(2, count($data['test'])); - $this->assertContains('value3', $data['test']); - $this->assertNotContains('value1', $data['test']); - $this->assertNotContains('value2', $data['test']); - } - - public function testRemoveAttributeMultipleValueSimple() - { - $data=array('test' => array('value1', 'value2', 'value3', 'value3')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', 'value3'); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(2, count($data['test'])); - $this->assertContains('value1', $data['test']); - $this->assertContains('value2', $data['test']); - $this->assertNotContains('value3', $data['test']); - } - - public function testRemoveAttributeMultipleValueArray() - { - $data=array('test' => array('value1', 'value2', 'value3', 'value3')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', array('value1', 'value3')); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(1, count($data['test'])); - $this->assertContains('value2', $data['test']); - $this->assertNotContains('value1', $data['test']); - $this->assertNotContains('value3', $data['test']); - } - - public function testRemoveAttributeValueBoolean() - { - $data=array('test' => array('TRUE', 'FALSE', 'TRUE', 'FALSE')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', false); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(2, count($data['test'])); - $this->assertContains('TRUE', $data['test']); - $this->assertNotContains('FALSE', $data['test']); - } - - public function testRemoveAttributeValueInteger() - { - $data=array('test' => array('1', '2', '3', '4')); - Zend_Ldap_Attribute::removeFromAttribute($data, 'test', array(2, 4)); - $this->assertArrayHasKey('test', $data); - $this->assertTrue(is_array($data['test'])); - $this->assertEquals(2, count($data['test'])); - $this->assertContains('1', $data['test']); - $this->assertContains('3', $data['test']); - $this->assertNotContains('2', $data['test']); - $this->assertNotContains('4', $data['test']); - } - - public function testConvertFromLdapValue() - { - $this->assertEquals(true, Zend_Ldap_Attribute::convertFromLdapValue('TRUE')); - $this->assertEquals(false, Zend_Ldap_Attribute::convertFromLdapValue('FALSE')); - } - - public function testConvertToLdapValue() - { - $this->assertEquals('string', Zend_Ldap_Attribute::convertToLdapValue('string')); - $this->assertEquals('1', Zend_Ldap_Attribute::convertToLdapValue(1)); - $this->assertEquals('TRUE', Zend_Ldap_Attribute::convertToLdapValue(true)); - } - - public function testConvertFromLdapDateTimeValue() - { - $ldap='20080625123030+0200'; - $this->assertEquals(gmmktime(10, 30, 30, 6, 25, 2008), - Zend_Ldap_Attribute::convertFromLdapDateTimeValue($ldap)); - } - - public function testConvertFromLdapDateTimeValueActiveDirectory() - { - $ldap='20080625123030.0+0200'; - $this->assertEquals(gmmktime(10, 30, 30, 6, 25, 2008), - Zend_Ldap_Attribute::convertFromLdapDateTimeValue($ldap)); - } - - public function testConvertToLdapDateTimeValue() - { - $ts=mktime(12, 30, 30, 6, 25, 2008); - $this->_assertLocalDateTimeString($ts, Zend_Ldap_Attribute::convertToLdapDateTimeValue($ts)); - } - - public function testRemoveDuplicates() - { - $data=array( - 'strings1' => array('value1', 'value2', 'value2', 'value3'), - 'strings2' => array('value1', 'value2', 'value3', 'value4'), - 'boolean1' => array('TRUE', 'TRUE', 'TRUE', 'TRUE'), - 'boolean2' => array('TRUE', 'FALSE', 'TRUE', 'FALSE'), - ); - $expected=array( - 'strings1' => array('value1', 'value2', 'value3'), - 'strings2' => array('value1', 'value2', 'value3', 'value4'), - 'boolean1' => array('TRUE'), - 'boolean2' => array('TRUE', 'FALSE'), - ); - Zend_Ldap_Attribute::removeDuplicatesFromAttribute($data, 'strings1'); - Zend_Ldap_Attribute::removeDuplicatesFromAttribute($data, 'strings2'); - Zend_Ldap_Attribute::removeDuplicatesFromAttribute($data, 'boolean1'); - Zend_Ldap_Attribute::removeDuplicatesFromAttribute($data, 'boolean2'); - $this->assertEquals($expected, $data); - } - - public function testHasValue() - { - $data=array( - 'strings1' => array('value1', 'value2', 'value2', 'value3'), - 'strings2' => array('value1', 'value2', 'value3', 'value4'), - 'boolean1' => array('TRUE', 'TRUE', 'TRUE', 'TRUE'), - 'boolean2' => array('TRUE', 'FALSE', 'TRUE', 'FALSE'), - ); - - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'strings1', 'value1')); - $this->assertFalse(Zend_Ldap_Attribute::attributeHasValue($data, 'strings1', 'value4')); - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'boolean1', true)); - $this->assertFalse(Zend_Ldap_Attribute::attributeHasValue($data, 'boolean1', false)); - - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'strings1', - array('value1', 'value2'))); - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'strings1', - array('value1', 'value2', 'value3'))); - $this->assertFalse(Zend_Ldap_Attribute::attributeHasValue($data, 'strings1', - array('value1', 'value2', 'value3', 'value4'))); - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'strings2', - array('value1', 'value2', 'value3', 'value4'))); - - $this->assertTrue(Zend_Ldap_Attribute::attributeHasValue($data, 'boolean2', - array(true, false))); - $this->assertFalse(Zend_Ldap_Attribute::attributeHasValue($data, 'boolean1', - array(true, false))); - } - - public function testPasswordGenerationSSHA() - { - $password = 'pa$$w0rd'; - $ssha = Zend_Ldap_Attribute::createPassword($password, Zend_Ldap_Attribute::PASSWORD_HASH_SSHA); - $encoded = substr($ssha, strpos($ssha, '}')); - $binary = base64_decode($encoded); - $this->assertEquals(24, strlen($binary)); - $hash = substr($binary, 0, 20); - $salt = substr($binary, 20); - $this->assertEquals(4, strlen($salt)); - $this->assertEquals(sha1($password . $salt, true), $hash); - } - - public function testPasswordGenerationSHA() - { - $password = 'pa$$w0rd'; - $sha = Zend_Ldap_Attribute::createPassword($password, Zend_Ldap_Attribute::PASSWORD_HASH_SHA); - $encoded = substr($sha, strpos($sha, '}')); - $binary = base64_decode($encoded); - $this->assertEquals(20, strlen($binary)); - $this->assertEquals(sha1($password, true), $binary); - } - - public function testPasswordGenerationSMD5() - { - $password = 'pa$$w0rd'; - $smd5 = Zend_Ldap_Attribute::createPassword($password, Zend_Ldap_Attribute::PASSWORD_HASH_SMD5); - $encoded = substr($smd5, strpos($smd5, '}')); - $binary = base64_decode($encoded); - $this->assertEquals(20, strlen($binary)); - $hash = substr($binary, 0, 16); - $salt = substr($binary, 16); - $this->assertEquals(4, strlen($salt)); - $this->assertEquals(md5($password . $salt, true), $hash); - } - - public function testPasswordGenerationMD5() - { - $password = 'pa$$w0rd'; - $md5 = Zend_Ldap_Attribute::createPassword($password, Zend_Ldap_Attribute::PASSWORD_HASH_MD5); - $encoded = substr($md5, strpos($md5, '}')); - $binary = base64_decode($encoded); - $this->assertEquals(16, strlen($binary)); - $this->assertEquals(md5($password, true), $binary); - } - - public function testPasswordGenerationUnicodePwd() - { - $password = 'new'; - $unicodePwd = Zend_Ldap_Attribute::createPassword($password, Zend_Ldap_Attribute::PASSWORD_UNICODEPWD); - $this->assertEquals(10, strlen($unicodePwd)); - $this->assertEquals("\x22\x00\x6E\x00\x65\x00\x77\x00\x22\x00", $unicodePwd); - } -} - diff --git a/tests/Zend/Ldap/BindTest.php b/tests/Zend/Ldap/BindTest.php deleted file mode 100644 index a025250f44..0000000000 --- a/tests/Zend/Ldap/BindTest.php +++ /dev/null @@ -1,273 +0,0 @@ -_options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - if (defined('TESTS_ZEND_LDAP_PORT')) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_START_TLS')) - $this->_options['useStartTls'] = TESTS_ZEND_LDAP_USE_START_TLS; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $this->_options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT')) - $this->_options['accountFilterFormat'] = TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) - $this->_options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) - $this->_options['accountDomainNameShort'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT; - if (defined('TESTS_ZEND_LDAP_ALT_USERNAME')) - $this->_altUsername = TESTS_ZEND_LDAP_ALT_USERNAME; - - if (isset($this->_options['bindRequiresDn'])) - $this->_bindRequiresDn = $this->_options['bindRequiresDn']; - } - - public function testEmptyOptionsBind() - { - $ldap = new Zend_Ldap(array()); - try { - $ldap->bind(); - $this->fail('Expected exception for empty options'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('A host parameter is required', $zle->getMessage()); - } - } - public function testAnonymousBind() - { - $options = $this->_options; - unset($options['password']); - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind(); - } catch (Zend_Ldap_Exception $zle) { - // or I guess the server doesn't allow unauthenticated binds - $this->assertContains('unauthenticated bind', $zle->getMessage()); - } - } - public function testNoBaseDnBind() - { - $options = $this->_options; - unset($options['baseDn']); - $options['bindRequiresDn'] = true; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind('invalid', 'ignored'); - $this->fail('Expected exception for baseDn missing'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Base DN not set', $zle->getMessage()); - } - } - public function testNoDomainNameBind() - { - $options = $this->_options; - unset($options['accountDomainName']); - $options['bindRequiresDn'] = false; - $options['accountCanonicalForm'] = Zend_Ldap::ACCTNAME_FORM_PRINCIPAL; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind('invalid', 'ignored'); - $this->fail('Expected exception for missing accountDomainName'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Option required: accountDomainName', $zle->getMessage()); - } - } - public function testPlainBind() - { - $ldap = new Zend_Ldap($this->_options); - $ldap->bind(); - $this->assertNotNull($ldap->getResource()); - } - public function testConnectBind() - { - $ldap = new Zend_Ldap($this->_options); - $ldap->connect()->bind(); - $this->assertNotNull($ldap->getResource()); - } - public function testExplicitParamsBind() - { - $options = $this->_options; - $username = $options['username']; - $password = $options['password']; - - unset($options['username']); - unset($options['password']); - - $ldap = new Zend_Ldap($options); - $ldap->bind($username, $password); - $this->assertNotNull($ldap->getResource()); - } - public function testRequiresDnBind() - { - $options = $this->_options; - - $options['bindRequiresDn'] = true; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_altUsername, 'invalid'); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testRequiresDnWithoutDnBind() - { - $options = $this->_options; - - $options['bindRequiresDn'] = true; - - unset($options['username']); - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_principalName); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - /* Note that if your server actually allows anonymous binds this test will fail. - */ - $this->assertContains('Failed to retrieve DN', $zle->getMessage()); - } - } - - public function testBindWithEmptyPassword() - { - $options = $this->_options; - $options['allowEmptyPassword'] = false; - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_altUsername, ''); - $this->fail('Expected exception for empty password'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Empty password not allowed - see allowEmptyPassword option.', - $zle->getMessage()); - } - - $options['allowEmptyPassword'] = true; - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_altUsername, ''); - } catch (Zend_Ldap_Exception $zle) { - if ($zle->getMessage() === - 'Empty password not allowed - see allowEmptyPassword option.') { - $this->fail('Exception for empty password'); - } else { - $message = $zle->getMessage(); - $this->assertTrue(strstr($message, 'Invalid credentials') || - strstr($message, 'Server is unwilling to perform')); - return; - } - } - $this->assertNotNull($ldap->getResource()); - } - - public function testBindWithoutDnUsernameAndDnRequired() - { - $options = $this->_options; - $options['username'] = TESTS_ZEND_LDAP_ALT_USERNAME; - $options['bindRequiresDn'] = true; - $ldap = new Zend_Ldap($options); - try { - $ldap->bind(); - $this->fail('Expected exception for empty password'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Binding requires username in DN form', - $zle->getMessage()); - } - } - - /** - * @group ZF-8259 - */ - public function testBoundUserIsFalseIfNotBoundToLDAP() - { - $ldap = new Zend_Ldap($this->_options); - $this->assertFalse($ldap->getBoundUser()); - } - - /** - * @group ZF-8259 - */ - public function testBoundUserIsReturnedAfterBinding() - { - $ldap = new Zend_Ldap($this->_options); - $ldap->bind(); - $this->assertEquals(TESTS_ZEND_LDAP_USERNAME, $ldap->getBoundUser()); - } - - /** - * @group ZF-8259 - */ - public function testResourceIsAlwaysReturned() - { - $ldap = new Zend_Ldap($this->_options); - $this->assertNotNull($ldap->getResource()); - $this->assertTrue(is_resource($ldap->getResource())); - $this->assertEquals(TESTS_ZEND_LDAP_USERNAME, $ldap->getBoundUser()); - } - - /** - * @see https://net.educause.edu/ir/library/pdf/csd4875.pdf - */ - public function testBindWithNullPassword() - { - $ldap = new Zend_Ldap($this->_options); - $this->setExpectedException('Zend_Ldap_Exception', 'Invalid credentials'); - $ldap->bind($this->_altUsername, "\0invalidpassword"); - } -} diff --git a/tests/Zend/Ldap/CanonTest.php b/tests/Zend/Ldap/CanonTest.php deleted file mode 100644 index 270254cb2f..0000000000 --- a/tests/Zend/Ldap/CanonTest.php +++ /dev/null @@ -1,397 +0,0 @@ -_options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - if (defined('TESTS_ZEND_LDAP_PORT')) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_START_TLS')) - $this->_options['useStartTls'] = TESTS_ZEND_LDAP_USE_START_TLS; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $this->_options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT')) - $this->_options['accountFilterFormat'] = TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) - $this->_options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) - $this->_options['accountDomainNameShort'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT; - } - - public function testPlainCanon() - { - $ldap = new Zend_Ldap($this->_options); - /* This test tries to canonicalize each name (uname, uname@example.com, - * EXAMPLE\uname) to each of the 3 forms (username, principal and backslash) - * for a total of canonicalizations. - */ - if (defined('TESTS_ZEND_LDAP_ALT_USERNAME')) { - $names[Zend_Ldap::ACCTNAME_FORM_USERNAME] = TESTS_ZEND_LDAP_ALT_USERNAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) { - $names[Zend_Ldap::ACCTNAME_FORM_PRINCIPAL] = - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - } - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) { - $names[Zend_Ldap::ACCTNAME_FORM_BACKSLASH] = - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME; - } - } - - foreach ($names as $_form => $name) { - foreach ($names as $form => $_name) { - $ret = $ldap->getCanonicalAccountName($name, $form); - $this->assertEquals($names[$form], $ret); - } - } - } - - public function testInvalidAccountCanon() - { - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->bind('invalid', 'invalid'); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $msg = $zle->getMessage(); - $this->assertTrue(strstr($msg, 'Invalid credentials') || - strstr($msg, 'No such object') || - strstr($msg, 'No object found')); - } - } - - public function testDnCanon() - { - $ldap = new Zend_Ldap($this->_options); - $name = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, Zend_Ldap::ACCTNAME_FORM_DN); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_DN, $name); - } - - public function testMismatchDomainBind() - { - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->bind('BOGUS\\doesntmatter', 'doesntmatter'); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertTrue($zle->getCode() == Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH); - } - } - - public function testAccountCanonization() - { - $options = $this->_options; - $ldap = new Zend_Ldap($options); - - $canonDn = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_DN); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_DN, $canonDn); - $canonUsername = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_USERNAME, $canonUsername); - $canonBackslash = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_BACKSLASH); - $this->assertEquals( - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME, - $canonBackslash); - $canonPrincipal = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_PRINCIPAL); - $this->assertEquals( - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - $canonPrincipal); - - $options['accountCanonicalForm'] = Zend_Ldap::ACCTNAME_FORM_USERNAME; - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_USERNAME, $canon); - - $options['accountCanonicalForm'] = Zend_Ldap::ACCTNAME_FORM_BACKSLASH; - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals( - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME, $canon); - - $options['accountCanonicalForm'] = Zend_Ldap::ACCTNAME_FORM_PRINCIPAL; - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals( - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, $canon); - - unset($options['accountCanonicalForm']); - - unset($options['accountDomainName']); - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals( - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME, $canon); - - unset($options['accountDomainNameShort']); - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals(TESTS_ZEND_LDAP_ALT_USERNAME, $canon); - - $options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - $ldap->setOptions($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME); - $this->assertEquals( - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, $canon); - } - - public function testDefaultAccountFilterFormat() - { - $options = $this->_options; - - unset($options['accountFilterFormat']); - $options['bindRequiresDn'] = true; - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName('invalid', Zend_Ldap::ACCTNAME_FORM_DN); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('(&(objectClass=posixAccount)(uid=invalid))', $zle->getMessage()); - } - - $options['bindRequiresDn'] = false; - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName('invalid', Zend_Ldap::ACCTNAME_FORM_DN); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('(&(objectClass=user)(sAMAccountName=invalid))', $zle->getMessage()); - } - } - - public function testPossibleAuthority() - { - $options = $this->_options; - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName('invalid\invalid', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Binding domain is not an authority for user: invalid\invalid', - $zle->getMessage()); - } - try { - $canon = $ldap->getCanonicalAccountName('invalid@invalid.tld', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Binding domain is not an authority for user: invalid@invalid.tld', - $zle->getMessage()); - } - - unset($options['accountDomainName']); - $ldap = new Zend_Ldap($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\invalid', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->assertEquals('invalid', $canon); - try { - $canon = $ldap->getCanonicalAccountName('invalid@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Binding domain is not an authority for user: invalid@' . - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - $zle->getMessage()); - } - - unset($options['accountDomainNameShort']); - $options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\invalid', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Binding domain is not an authority for user: ' . - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\invalid', - $zle->getMessage()); - } - - $canon = $ldap->getCanonicalAccountName('invalid@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->assertEquals('invalid', $canon); - - unset($options['accountDomainName']); - $ldap = new Zend_Ldap($options); - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\invalid', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->assertEquals('invalid', $canon); - $canon = $ldap->getCanonicalAccountName('invalid@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->assertEquals('invalid', $canon); - } - - public function testInvalidAccountName() - { - $options = $this->_options; - $ldap = new Zend_Ldap($options); - - try { - $canon = $ldap->getCanonicalAccountName('0@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid account name syntax: 0@' . - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME, - $zle->getMessage()); - } - - try { - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\0', - Zend_Ldap::ACCTNAME_FORM_USERNAME); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid account name syntax: ' . - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\0', - $zle->getMessage()); - } - } - - public function testGetUnknownCanonicalForm() - { - $options = $this->_options; - $ldap = new Zend_Ldap($options); - - try { - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, 99); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Unknown canonical name form: 99', - $zle->getMessage()); - } - } - - public function testGetUnavailableCanoncialForm() - { - $options = $this->_options; - unset($options['accountDomainName']); - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_PRINCIPAL); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Option required: accountDomainName', - $zle->getMessage()); - } - - unset($options['accountDomainNameShort']); - $ldap = new Zend_Ldap($options); - try { - $canon = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_USERNAME, - Zend_Ldap::ACCTNAME_FORM_BACKSLASH); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Option required: accountDomainNameShort', - $zle->getMessage()); - } - } - - public function testSplittingOption() - { - $options = $this->_options; - unset($options['accountDomainName']); - unset($options['accountDomainNameShort']); - $options['tryUsernameSplit'] = true; - $ldap = new Zend_Ldap($options); - $this->assertEquals('username', $ldap->getCanonicalAccountName('username@example.com', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('username', $ldap->getCanonicalAccountName('EXAMPLE\username', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('username', $ldap->getCanonicalAccountName('username', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - - $options['tryUsernameSplit'] = false; - $ldap = new Zend_Ldap($options); - $this->assertEquals('username@example.com', - $ldap->getCanonicalAccountName('username@example.com', Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('example\username', $ldap->getCanonicalAccountName('EXAMPLE\username', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('username', $ldap->getCanonicalAccountName('username', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - - } - - /** - * ZF-4495 - */ - public function testSpecialCharacterInUsername() - { - $options = $this->_options; - $options['accountDomainName'] = 'example.com'; - $options['accountDomainNameShort'] = 'EXAMPLE'; - $ldap = new Zend_Ldap($options); - - $this->assertEquals('schäfer', $ldap->getCanonicalAccountName('SCHÄFER@example.com', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('schäfer', $ldap->getCanonicalAccountName('EXAMPLE\SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - $this->assertEquals('schäfer', $ldap->getCanonicalAccountName('SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_USERNAME)); - - $this->assertEquals('schäfer@example.com', $ldap->getCanonicalAccountName('SCHÄFER@example.com', - Zend_Ldap::ACCTNAME_FORM_PRINCIPAL)); - $this->assertEquals('schäfer@example.com', $ldap->getCanonicalAccountName('EXAMPLE\SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_PRINCIPAL)); - $this->assertEquals('schäfer@example.com', $ldap->getCanonicalAccountName('SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_PRINCIPAL)); - - $this->assertEquals('EXAMPLE\schäfer', $ldap->getCanonicalAccountName('SCHÄFER@example.com', - Zend_Ldap::ACCTNAME_FORM_BACKSLASH)); - $this->assertEquals('EXAMPLE\schäfer', $ldap->getCanonicalAccountName('EXAMPLE\SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_BACKSLASH)); - $this->assertEquals('EXAMPLE\schäfer', $ldap->getCanonicalAccountName('SCHÄFER', - Zend_Ldap::ACCTNAME_FORM_BACKSLASH)); - } -} diff --git a/tests/Zend/Ldap/ChangePasswordTest.php b/tests/Zend/Ldap/ChangePasswordTest.php deleted file mode 100644 index d0aaaeaaa0..0000000000 --- a/tests/Zend/Ldap/ChangePasswordTest.php +++ /dev/null @@ -1,223 +0,0 @@ -_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $dn = $this->_createDn('uid=newuser,'); - $data = array(); - $password = 'pa$$w0rd'; - Zend_Ldap_Attribute::setAttribute($data, 'uid', 'newuser', false); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'account', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'simpleSecurityObject', true); - Zend_Ldap_Attribute::setPassword($data, $password, - Zend_Ldap_Attribute::PASSWORD_HASH_SSHA, 'userPassword'); - - try { - $this->_getLdap()->add($dn, $data); - - $this->assertTrue( - $this->_getLdap()->bind($dn, $password) instanceof Zend_Ldap - ); - - $this->_getLdap()->bind(); - $this->_getLdap()->delete($dn); - } catch (Zend_Ldap_Exception $e) { - $this->_getLdap()->bind(); - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testChangePasswordWithUserAccountOpenLdap() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $dn = $this->_createDn('uid=newuser,'); - $data = array(); - $password = 'pa$$w0rd'; - Zend_Ldap_Attribute::setAttribute($data, 'uid', 'newuser', false); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'account', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'simpleSecurityObject', true); - Zend_Ldap_Attribute::setPassword($data, $password, - Zend_Ldap_Attribute::PASSWORD_HASH_SSHA, 'userPassword'); - - try { - $this->_getLdap()->add($dn, $data); - - $this->_getLdap()->bind($dn, $password); - - $newPasswd = 'newpasswd'; - $newData = array(); - Zend_Ldap_Attribute::setPassword($newData, $newPasswd, - Zend_Ldap_Attribute::PASSWORD_HASH_SHA, 'userPassword'); - $this->_getLdap()->update($dn, $newData); - - try { - $this->_getLdap()->bind($dn, $password); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $message = $zle->getMessage(); - $this->assertTrue(strstr($message, 'Invalid credentials') || - strstr($message, 'Server is unwilling to perform')); - } - - $this->assertTrue( - $this->_getLdap()->bind($dn, $newPasswd) instanceof Zend_Ldap - ); - - $this->_getLdap()->bind(); - $this->_getLdap()->delete($dn); - } catch (Zend_Ldap_Exception $e) { - $this->_getLdap()->bind(); - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testAddNewUserWithPasswordActiveDirectory() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY) { - $this->markTestSkipped('Test can only be run on an ActiveDirectory server'); - } - $options = $this->_getLdap()->getOptions(); - if ($options['useSsl'] !== true && $options['useStartTls'] !== true) { - $this->markTestSkipped('Test can only be run on an SSL or TLS secured connection'); - } - - $dn = $this->_createDn('cn=New User,'); - $data = array(); - $password = 'pa$$w0rd'; - Zend_Ldap_Attribute::setAttribute($data, 'cn', 'New User', false); - Zend_Ldap_Attribute::setAttribute($data, 'displayName', 'New User', false); - Zend_Ldap_Attribute::setAttribute($data, 'sAMAccountName', 'newuser', false); - Zend_Ldap_Attribute::setAttribute($data, 'userAccountControl', 512, false); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'person', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'organizationalPerson', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'user', true); - Zend_Ldap_Attribute::setPassword($data, $password, - Zend_Ldap_Attribute::PASSWORD_UNICODEPWD, 'unicodePwd'); - - try { - $this->_getLdap()->add($dn, $data); - - $this->assertTrue( - $this->_getLdap()->bind($dn, $password) instanceof Zend_Ldap - ); - - $this->_getLdap()->bind(); - $this->_getLdap()->delete($dn); - } catch (Zend_Ldap_Exception $e) { - $this->_getLdap()->bind(); - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testChangePasswordWithUserAccountActiveDirectory() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY) { - $this->markTestSkipped('Test can only be run on an ActiveDirectory server'); - } - $options = $this->_getLdap()->getOptions(); - if ($options['useSsl'] !== true && $options['useStartTls'] !== true) { - $this->markTestSkipped('Test can only be run on an SSL or TLS secured connection'); - } - - $dn = $this->_createDn('cn=New User,'); - $data = array(); - $password = 'pa$$w0rd'; - Zend_Ldap_Attribute::setAttribute($data, 'cn', 'New User', false); - Zend_Ldap_Attribute::setAttribute($data, 'displayName', 'New User', false); - Zend_Ldap_Attribute::setAttribute($data, 'sAMAccountName', 'newuser', false); - Zend_Ldap_Attribute::setAttribute($data, 'userAccountControl', 512, false); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'person', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'organizationalPerson', true); - Zend_Ldap_Attribute::setAttribute($data, 'objectClass', 'user', true); - Zend_Ldap_Attribute::setPassword($data, $password, - Zend_Ldap_Attribute::PASSWORD_UNICODEPWD, 'unicodePwd'); - - try { - $this->_getLdap()->add($dn, $data); - - $this->_getLdap()->bind($dn, $password); - - $newPasswd = 'newpasswd'; - $newData = array(); - Zend_Ldap_Attribute::setPassword($newData, $newPasswd, Zend_Ldap_Attribute::PASSWORD_UNICODEPWD); - $this->_getLdap()->update($dn, $newData); - - try { - $this->_getLdap()->bind($dn, $password); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $message = $zle->getMessage(); - $this->assertTrue(strstr($message, 'Invalid credentials') || - strstr($message, 'Server is unwilling to perform')); - } - - $this->assertTrue( - $this->_getLdap()->bind($dn, $newPasswd) instanceof Zend_Ldap - ); - - $this->_getLdap()->bind(); - $this->_getLdap()->delete($dn); - } catch (Zend_Ldap_Exception $e) { - $this->_getLdap()->bind(); - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } -} diff --git a/tests/Zend/Ldap/ConnectTest.php b/tests/Zend/Ldap/ConnectTest.php deleted file mode 100644 index 51c75f5aa8..0000000000 --- a/tests/Zend/Ldap/ConnectTest.php +++ /dev/null @@ -1,221 +0,0 @@ -_options = array('host' => TESTS_ZEND_LDAP_HOST); - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - } - - public function testEmptyOptionsConnect() - { - $ldap = new Zend_Ldap(array()); - try { - $ldap->connect(); - $this->fail('Expected exception for empty options'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('host parameter is required', $zle->getMessage()); - } - } - public function testUnknownHostConnect() - { - $ldap = new Zend_Ldap(array('host' => 'bogus.example.com')); - try { - // connect doesn't actually try to connect until bind is called - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown host'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Can\'t contact LDAP server', $zle->getMessage()); - } - } - public function testPlainConnect() - { - $ldap = new Zend_Ldap($this->_options); - try { - // Connect doesn't actually try to connect until bind is called - // but if we get 'Invalid credentials' then we know the connect - // succeeded. - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testExplicitParamsConnect() - { - $host = TESTS_ZEND_LDAP_HOST; - $port = 0; - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $port = TESTS_ZEND_LDAP_PORT; - $useSsl = false; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $useSsl = TESTS_ZEND_LDAP_USE_SSL; - - $ldap = new Zend_Ldap(); - try { - $ldap->connect($host, $port, $useSsl) - ->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testExplicitPortConnect() - { - $port = 389; - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT) - $port = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_SSL') && TESTS_ZEND_LDAP_USE_SSL) - $port = 636; - - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->connect(null, $port) - ->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testBadPortConnect() - { - $options = $this->_options; - $options['port'] = 10; - - $ldap = new Zend_Ldap($options); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Can\'t contact LDAP server', $zle->getMessage()); - } - } - public function testSetOptionsConnect() - { - $ldap = new Zend_Ldap(); - $ldap->setOptions($this->_options); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testMultiConnect() - { - $ldap = new Zend_Ldap($this->_options); - for ($i = 0; $i < 3; $i++) { - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - } - public function testDisconnect() - { - $ldap = new Zend_Ldap($this->_options); - for ($i = 0; $i < 3; $i++) { - $ldap->disconnect(); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - } - - public function testGetErrorCode() - { - $ldap = new Zend_Ldap($this->_options); - try { - // Connect doesn't actually try to connect until bind is called - // but if we get 'Invalid credentials' then we know the connect - // succeeded. - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - - $this->assertEquals(0x31, $zle->getCode()); - $this->assertEquals(0x0, Zend_Ldap_Exception::getLdapCode($ldap)); - $this->assertEquals(0x0, Zend_Ldap_Exception::getLdapCode(null)); - } - } - - /** - * @group ZF-8274 - */ - public function testConnectWithUri() - { - $host = TESTS_ZEND_LDAP_HOST; - $port = 0; - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) $port = TESTS_ZEND_LDAP_PORT; - $useSsl = false; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) $useSsl = TESTS_ZEND_LDAP_USE_SSL; - if ($useSsl) { - $host = 'ldaps://' . $host; - } else { - $host = 'ldap://' . $host; - } - if ($port) { - $host = $host . ':' . $port; - } - - $ldap = new Zend_Ldap(); - try { - $ldap->connect($host) - ->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } -} diff --git a/tests/Zend/Ldap/ConverterTest.php b/tests/Zend/Ldap/ConverterTest.php deleted file mode 100644 index 61b515decc..0000000000 --- a/tests/Zend/Ldap/ConverterTest.php +++ /dev/null @@ -1,267 +0,0 @@ -?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`' . - 'abcdefghijklmnopqrstuvwxyz{|}~'; - $str=''; - for ($i=0; $i<127; $i++) { - $str.=chr($i); - } - $this->assertEquals($expected, Zend_Ldap_Converter::ascToHex32($str)); - } - - public function testHex2asc() - { - $expected=''; - for ($i=0; $i<127; $i++) { - $expected.=chr($i); - } - - $str='\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f\10\11\12\13\14\15\16\17\18\19\1a\1b' . - '\1c\1d\1e\1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg' . - 'hijklmnopqrstuvwxyz{|}~'; - $this->assertEquals($expected, Zend_Ldap_Converter::hex32ToAsc($str)); - } - - /** - * @dataProvider toLdapDateTimeProvider - */ - public function testToLdapDateTime($convert,$expect) - { - $result = Zend_Ldap_Converter::toLdapDatetime($convert['date'], $convert['utc']); - $this->assertEquals( $expect,$result); - } - - public function toLdapDateTimeProvider(){ - include_once 'Zend/Date.php'; - $tz = new DateTimeZone('UTC'); - return array( - array(array('date'=> 0, 'utc' => true ),'19700101000000Z'), - array(array('date'=> new DateTime('2010-05-12 13:14:45+0300', $tz), 'utc' => false ),'20100512131445+0300'), - array(array('date'=> new DateTime('2010-05-12 13:14:45+0300', $tz), 'utc' => true ),'20100512101445Z'), - array(array('date'=> '2010-05-12 13:14:45+0300', 'utc' => false ),'20100512131445+0300'), - array(array('date'=> '2010-05-12 13:14:45+0300', 'utc' => true ),'20100512101445Z'), - array(array('date'=> new Zend_Date('2010-05-12T13:14:45+0300', Zend_Date::ISO_8601), 'utc' => true ),'20100512101445Z'), - array(array('date'=> new Zend_Date('2010-05-12T13:14:45+0300', Zend_Date::ISO_8601), 'utc' => false ),'20100512131445+0300'), - array(array('date'=> new Zend_Date('0', Zend_Date::TIMESTAMP), 'utc' => true ),'19700101000000Z'), - ); - } - - /** - * @dataProvider toLdapBooleanProvider - */ - public function testToLdapBoolean($expect, $convert) - { - $this->assertEquals($expect, Zend_Ldap_Converter::toldapBoolean($convert)); - } - - public function toLdapBooleanProvider(){ - return array ( - array('TRUE',true), - array('TRUE',1), - array('TRUE','true'), - array('FALSE','false'), - array('FALSE', false), - array('FALSE', array('true')), - array('FALSE', array('false')), - ); - } - - /** - * @dataProvider toLdapSerializeProvider - */ - public function testToLdapSerialize($expect, $convert){ - $this->assertEquals($expect, Zend_Ldap_Converter::toLdapSerialize($convert)); - } - - public function toLdapSerializeProvider(){ - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - return array( - array('N;', null), - array('i:1;', 1), - array('O:8:"DateTime":0:{}', new DateTime('@0')), - array('a:3:{i:0;s:4:"test";i:1;i:1;s:3:"foo";s:3:"bar";}', array('test',1,'foo'=>'bar')), - ); - } - - if (getenv('TRAVIS') && version_compare(PHP_VERSION, '5.4.0', '>=')) { - return array( - array('N;', null), - array('i:1;', 1), - array('O:8:"DateTime":3:{s:4:"date";s:26:"1970-01-01 00:00:00.000000";s:13:"timezone_type";i:1;s:8:"timezone";s:6:"+00:00";}', new DateTime('@0')), - array('a:3:{i:0;s:4:"test";i:1;i:1;s:3:"foo";s:3:"bar";}', array('test',1,'foo'=>'bar')), - ); - } - - if (version_compare(PHP_VERSION, '5.6.0beta4', '>=')) { - return array( - array('N;', null), - array('i:1;', 1), - array('O:8:"DateTime":3:{s:4:"date";s:26:"1970-01-01 00:00:00.000000";s:13:"timezone_type";i:1;s:8:"timezone";s:6:"+00:00";}', new DateTime('@0')), - array('a:3:{i:0;s:4:"test";i:1;i:1;s:3:"foo";s:3:"bar";}', array('test',1,'foo'=>'bar')), - ); - } - - return array( - array('N;', null), - array('i:1;', 1), - array('O:8:"DateTime":3:{s:4:"date";s:19:"1970-01-01 00:00:00";s:13:"timezone_type";i:1;s:8:"timezone";s:6:"+00:00";}', new DateTime('@0')), - array('a:3:{i:0;s:4:"test";i:1;i:1;s:3:"foo";s:3:"bar";}', array('test',1,'foo'=>'bar')), - ); - } - - /** - * @dataProvider toLdapProvider - */ - public function testToLdap($expect, $convert){ - $this->assertEquals($expect, Zend_Ldap_Converter::toLdap($convert['value'], $convert['type'])); - } - - public function toLdapProvider(){ - return array( - array(null, array('value' => null,'type' => 0)), - array('19700101000000Z',array ('value'=> 0, 'type' => 2)), - array('0',array ('value'=> 0, 'type' => 0)), - array('FALSE',array ('value'=> 0, 'type' => 1)), - array('19700101000000Z',array('value'=>new Zend_Date('1970-01-01T00:00:00+0000',Zend_Date::ISO_8601),'type'=>0)), - - ); - } - - /** - * @dataProvider fromLdapUnserializeProvider - */ - public function testFromLdapUnserialize ($expect, $convert) - { - $this->assertEquals($expect, Zend_Ldap_Converter::fromLdapUnserialize($convert)); - } - - public function testFromLdapUnserializeThrowsException () - { - $this->setExpectedException('UnexpectedValueException'); - Zend_Ldap_Converter::fromLdapUnserialize('--'); - } - - public function fromLdapUnserializeProvider(){ - return array ( - array(null,'N;'), - array(1,'i:1;'), - array(false,'b:0;'), - ); - } - - public function testFromLdapBoolean() - { - $this->assertTrue(Zend_Ldap_Converter::fromLdapBoolean('TRUE')); - $this->assertFalse(Zend_Ldap_Converter::fromLdapBoolean('FALSE')); - $this->setExpectedException('InvalidArgumentException'); - Zend_Ldap_Converter::fromLdapBoolean('test'); - } - - /** - * @dataProvider fromLdapDateTimeProvider - */ - public function testFromLdapDateTime($expected, $convert, $utc) - { - if ( true === $utc ) { - $expected -> setTimezone(new DateTimeZone('UTC')); - } - $this->assertEquals($expected, Zend_Ldap_Converter::fromLdapDatetime($convert,$utc)); - } - - public function fromLdapDateTimeProvider () - { - return array ( - array(new DateTime('2010-12-24 08:00:23+0300'),'20101224080023+0300', false), - array(new DateTime('2010-12-24 08:00:23+0300'),'20101224080023+03\'00\'', false), - array(new DateTime('2010-12-24 08:00:23+0000'),'20101224080023', false), - array(new DateTime('2010-12-24 08:00:00+0000'),'201012240800', false), - array(new DateTime('2010-12-24 08:00:00+0000'),'2010122408', false), - array(new DateTime('2010-12-24 00:00:00+0000'),'20101224', false), - array(new DateTime('2010-12-01 00:00:00+0000'),'201012', false), - array(new DateTime('2010-01-01 00:00:00+0000'),'2010', false), - array(new DateTime('2010-04-03 12:23:34+0000'), '20100403122334', true), - ); - } - - /** - * @expectedException InvalidArgumentException - * @dataProvider fromLdapDateTimeException - */ - public function testFromLdapDateTimeThrowsException ($value) - { - Zend_Ldap_Converter::fromLdapDatetime($value); - } - - public static function fromLdapDateTimeException () - { - return array ( - array('foobar'), - array('201'), - array('201013'), - array('20101232'), - array('2010123124'), - array('201012312360'), - array('20101231235960'), - array('20101231235959+13'), - array('20101231235959+1160'), - ); - } - - /** - * @dataProvider fromLdapProvider - */ - public function testFromLdap($expect, $value, $type, $dateTimeAsUtc){ - $this->assertSame($expect, Zend_Ldap_Converter::fromLdap($value, $type, $dateTimeAsUtc)); - } - - public function fromLdapProvider(){ - return array( - array('1', '1', 0, true), - array('0', '0', 0, true), - array(true, 'TRUE', 0, true), - array(false, 'FALSE', 0, true), - array('123456789', '123456789', 0, true), - // ZF-11639 - array('+123456789', '+123456789', 0, true), - ); - } -} - diff --git a/tests/Zend/Ldap/CopyRenameTest.php b/tests/Zend/Ldap/CopyRenameTest.php deleted file mode 100644 index 59f9ab49b3..0000000000 --- a/tests/Zend/Ldap/CopyRenameTest.php +++ /dev/null @@ -1,362 +0,0 @@ -_prepareLdapServer(); - - $this->_orgDn=$this->_createDn('ou=OrgTest,'); - $this->_newDn=$this->_createDn('ou=NewTest,'); - $this->_orgSubTreeDn=$this->_createDn('ou=OrgSubtree,'); - $this->_newSubTreeDn=$this->_createDn('ou=NewSubtree,'); - $this->_targetSubTreeDn=$this->_createDn('ou=Target,'); - - $this->_nodes=array( - $this->_orgDn => array("objectClass" => "organizationalUnit", "ou" => "OrgTest"), - $this->_orgSubTreeDn => array("objectClass" => "organizationalUnit", "ou" => "OrgSubtree"), - 'ou=Subtree1,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree1"), - 'ou=Subtree11,ou=Subtree1,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree11"), - 'ou=Subtree12,ou=Subtree1,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree12"), - 'ou=Subtree13,ou=Subtree1,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree13"), - 'ou=Subtree2,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree2"), - 'ou=Subtree3,' . $this->_orgSubTreeDn => - array("objectClass" => "organizationalUnit", "ou" => "Subtree3"), - $this->_targetSubTreeDn => array("objectClass" => "organizationalUnit", "ou" => "Target") - ); - - $ldap=$this->_getLdap()->getResource(); - foreach ($this->_nodes as $dn => $entry) { - ldap_add($ldap, $dn, $entry); - } - } - - protected function tearDown() - { - if ($this->_getLdap()->exists($this->_newDn)) - $this->_getLdap()->delete($this->_newDn, false); - if ($this->_getLdap()->exists($this->_orgDn)) - $this->_getLdap()->delete($this->_orgDn, false); - if ($this->_getLdap()->exists($this->_orgSubTreeDn)) - $this->_getLdap()->delete($this->_orgSubTreeDn, true); - if ($this->_getLdap()->exists($this->_newSubTreeDn)) - $this->_getLdap()->delete($this->_newSubTreeDn, true); - if ($this->_getLdap()->exists($this->_targetSubTreeDn)) - $this->_getLdap()->delete($this->_targetSubTreeDn, true); - - - $this->_cleanupLdapServer(); - parent::tearDown(); - } - - public function testSimpleLeafRename() - { - $org=$this->_getLdap()->getEntry($this->_orgDn, array(), true); - $this->_getLdap()->rename($this->_orgDn, $this->_newDn, false); - $this->assertFalse($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newDn)); - $new=$this->_getLdap()->getEntry($this->_newDn); - $this->assertEquals($org['objectclass'], $new['objectclass']); - $this->assertEquals(array('NewTest'), $new['ou']); - } - - public function testSimpleLeafMoveAlias() - { - $this->_getLdap()->move($this->_orgDn, $this->_newDn, false); - $this->assertFalse($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newDn)); - } - - public function testSimpleLeafMoveToSubtree() - { - $this->_getLdap()->moveToSubtree($this->_orgDn, $this->_orgSubTreeDn, false); - $this->assertFalse($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgTest,' . $this->_orgSubTreeDn)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameSourceNotExists() - { - $this->_getLdap()->rename($this->_createDn('ou=DoesNotExist,'), $this->_newDn, false); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameTargetExists() - { - $this->_getLdap()->rename($this->_orgDn, $this->_createDn('ou=Test1,'), false); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameTargetParentNotExists() - { - $this->_getLdap()->rename($this->_orgDn, $this->_createDn('ou=Test1,ou=ParentDoesNotExist,'), false); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameEmulationSourceNotExists() - { - $this->_getLdap()->rename($this->_createDn('ou=DoesNotExist,'), $this->_newDn, false, true); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameEmulationTargetExists() - { - $this->_getLdap()->rename($this->_orgDn, $this->_createDn('ou=Test1,'), false, true); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testRenameEmulationTargetParentNotExists() - { - $this->_getLdap()->rename($this->_orgDn, $this->_createDn('ou=Test1,ou=ParentDoesNotExist,'), - false, true); - } - - public function testSimpleLeafRenameEmulation() - { - $this->_getLdap()->rename($this->_orgDn, $this->_newDn, false, true); - $this->assertFalse($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newDn)); - } - - public function testSimpleLeafCopyToSubtree() - { - $this->_getLdap()->copyToSubtree($this->_orgDn, $this->_orgSubTreeDn, false); - $this->assertTrue($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgTest,' . $this->_orgSubTreeDn)); - } - - public function testSimpleLeafCopy() - { - $this->_getLdap()->copy($this->_orgDn, $this->_newDn, false); - $this->assertTrue($this->_getLdap()->exists($this->_orgDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newDn)); - } - - public function testRecursiveRename() - { - $this->_getLdap()->rename($this->_orgSubTreeDn, $this->_newSubTreeDn, true); - $this->assertFalse($this->_getLdap()->exists($this->_orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($this->_newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $this->_newSubTreeDn)); - } - - public function testRecursiveMoveToSubtree() - { - $this->_getLdap()->moveToSubtree($this->_orgSubTreeDn, $this->_targetSubTreeDn, true); - $this->assertFalse($this->_getLdap()->exists($this->_orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgSubtree,' . $this->_targetSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=OrgSubtree,' . $this->_targetSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,ou=OrgSubtree,' . $this->_targetSubTreeDn)); - } - - public function testRecursiveCopyToSubtree() - { - $this->_getLdap()->copyToSubtree($this->_orgSubTreeDn, $this->_targetSubTreeDn, true); - $this->assertTrue($this->_getLdap()->exists($this->_orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgSubtree,' . $this->_targetSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($this->_orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $this->_orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=OrgSubtree,' . $this->_targetSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,ou=OrgSubtree,' . $this->_targetSubTreeDn)); - } - - public function testRecursiveCopy() - { - $this->_getLdap()->copy($this->_orgSubTreeDn, $this->_newSubTreeDn, true); - $this->assertTrue($this->_getLdap()->exists($this->_orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists($this->_newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($this->_orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $this->_orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($this->_newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $this->_newSubTreeDn)); - } - - public function testSimpleLeafRenameWithDnObjects() - { - $orgDn=Zend_Ldap_Dn::fromString($this->_orgDn); - $newDn=Zend_Ldap_Dn::fromString($this->_newDn); - - $this->_getLdap()->rename($orgDn, $newDn, false); - $this->assertFalse($this->_getLdap()->exists($orgDn)); - $this->assertTrue($this->_getLdap()->exists($newDn)); - - $this->_getLdap()->move($newDn, $orgDn, false); - $this->assertTrue($this->_getLdap()->exists($orgDn)); - $this->assertFalse($this->_getLdap()->exists($newDn)); - } - - public function testSimpleLeafMoveToSubtreeWithDnObjects() - { - $orgDn=Zend_Ldap_Dn::fromString($this->_orgDn); - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - - $this->_getLdap()->moveToSubtree($orgDn, $orgSubTreeDn, false); - $this->assertFalse($this->_getLdap()->exists($orgDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgTest,' . $orgSubTreeDn->toString())); - } - - public function testSimpleLeafRenameEmulationWithDnObjects() - { - $orgDn=Zend_Ldap_Dn::fromString($this->_orgDn); - $newDn=Zend_Ldap_Dn::fromString($this->_newDn); - - $this->_getLdap()->rename($orgDn, $newDn, false, true); - $this->assertFalse($this->_getLdap()->exists($orgDn)); - $this->assertTrue($this->_getLdap()->exists($newDn)); - } - - public function testSimpleLeafCopyToSubtreeWithDnObjects() - { - $orgDn=Zend_Ldap_Dn::fromString($this->_orgDn); - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - - $this->_getLdap()->copyToSubtree($orgDn, $orgSubTreeDn, false); - $this->assertTrue($this->_getLdap()->exists($orgDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgTest,' . $orgSubTreeDn->toString())); - } - - public function testSimpleLeafCopyWithDnObjects() - { - $orgDn=Zend_Ldap_Dn::fromString($this->_orgDn); - $newDn=Zend_Ldap_Dn::fromString($this->_newDn); - - $this->_getLdap()->copy($orgDn, $newDn, false); - $this->assertTrue($this->_getLdap()->exists($orgDn)); - $this->assertTrue($this->_getLdap()->exists($newDn)); - } - - public function testRecursiveRenameWithDnObjects() - { - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - $newSubTreeDn=Zend_Ldap_Dn::fromString($this->_newSubTreeDn); - - $this->_getLdap()->rename($orgSubTreeDn, $newSubTreeDn, true); - $this->assertFalse($this->_getLdap()->exists($orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists($newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $newSubTreeDn->toString())); - } - - public function testRecursiveMoveToSubtreeWithDnObjects() - { - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - $targetSubTreeDn=Zend_Ldap_Dn::fromString($this->_targetSubTreeDn); - - $this->_getLdap()->moveToSubtree($orgSubTreeDn, $targetSubTreeDn, true); - $this->assertFalse($this->_getLdap()->exists($orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgSubtree,' . $targetSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=OrgSubtree,' . $targetSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,ou=OrgSubtree,' . $targetSubTreeDn->toString())); - } - - public function testRecursiveCopyToSubtreeWithDnObjects() - { - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - $targetSubTreeDn=Zend_Ldap_Dn::fromString($this->_targetSubTreeDn); - - $this->_getLdap()->copyToSubtree($orgSubTreeDn, $targetSubTreeDn, true); - $this->assertTrue($this->_getLdap()->exists($orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists('ou=OrgSubtree,' . $targetSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren($orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $orgSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=OrgSubtree,' . $targetSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,ou=OrgSubtree,' . $targetSubTreeDn->toString())); - } - - public function testRecursiveCopyWithDnObjects() - { - $orgSubTreeDn=Zend_Ldap_Dn::fromString($this->_orgSubTreeDn); - $newSubTreeDn=Zend_Ldap_Dn::fromString($this->_newSubTreeDn); - - $this->_getLdap()->copy($orgSubTreeDn, $newSubTreeDn, true); - $this->assertTrue($this->_getLdap()->exists($orgSubTreeDn)); - $this->assertTrue($this->_getLdap()->exists($newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren($orgSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $orgSubTreeDn->toString())); - $this->assertEquals(3, $this->_getLdap()->countChildren($newSubTreeDn)); - $this->assertEquals(3, $this->_getLdap()->countChildren('ou=Subtree1,' . $newSubTreeDn->toString())); - } -} diff --git a/tests/Zend/Ldap/CrudTest.php b/tests/Zend/Ldap/CrudTest.php deleted file mode 100644 index 3b7257900d..0000000000 --- a/tests/Zend/Ldap/CrudTest.php +++ /dev/null @@ -1,509 +0,0 @@ -_createDn('ou=TestCreated,'); - $data=array( - 'ou' => 'TestCreated', - 'objectClass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $this->assertEquals(1, $this->_getLdap()->count('ou=TestCreated')); - $this->_getLdap()->delete($dn); - $this->assertEquals(0, $this->_getLdap()->count('ou=TestCreated')); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testUpdate() - { - $dn=$this->_createDn('ou=TestCreated,'); - $data=array( - 'ou' => 'TestCreated', - 'l' => 'mylocation1', - 'objectClass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $entry=$this->_getLdap()->getEntry($dn); - $this->assertEquals('mylocation1', $entry['l'][0]); - $entry['l']='mylocation2'; - $this->_getLdap()->update($dn, $entry); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals('mylocation2', $entry['l'][0]); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testIllegalAdd() - { - $dn=$this->_createDn('ou=TestCreated,ou=Node2,'); - $data=array( - 'ou' => 'TestCreated', - 'objectClass' => 'organizationalUnit' - ); - $this->_getLdap()->add($dn, $data); - $this->_getLdap()->delete($dn); - } - - public function testIllegalUpdate() - { - $dn=$this->_createDn('ou=TestCreated,'); - $data=array( - 'ou' => 'TestCreated', - 'objectclass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $entry=$this->_getLdap()->getEntry($dn); - $entry['objectclass'][]='inetOrgPerson'; - - $exThrown=false; - try { - $this->_getLdap()->update($dn, $entry); - } - catch (Zend_Ldap_Exception $e) { - $exThrown=true; - } - $this->_getLdap()->delete($dn); - if (!$exThrown) $this->fail('no exception thrown while illegaly updating entry'); - } - catch (Zend_Ldap_Exception $e) { - $this->fail($e->getMessage()); - } - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testIllegalDelete() - { - $dn=$this->_createDn('ou=TestCreated,'); - $this->_getLdap()->delete($dn); - } - - public function testDeleteRecursively() - { - $topDn=$this->_createDn('ou=RecursiveTest,'); - $dn=$topDn; - $data=array('ou' => 'RecursiveTest', 'objectclass' => 'organizationalUnit' - ); - $this->_getLdap()->add($dn, $data); - for ($level=1; $level<=5; $level++) { - $name='Level' . $level; - $dn='ou=' . $name . ',' . $dn; - $data=array('ou' => $name, 'objectclass' => 'organizationalUnit'); - $this->_getLdap()->add($dn, $data); - for ($item=1; $item<=5; $item++) { - $uid='Item' . $item; - $idn='ou=' . $uid . ',' . $dn; - $idata=array('ou' => $uid, 'objectclass' => 'organizationalUnit'); - $this->_getLdap()->add($idn, $idata); - } - } - - $exCaught=false; - try { - $this->_getLdap()->delete($topDn, false); - } catch (Zend_Ldap_Exception $e) { - $exCaught=true; - } - $this->assertTrue($exCaught, - 'Execption not raised when deleting item with children without specifiying recursive delete'); - $this->_getLdap()->delete($topDn, true); - $this->assertFalse($this->_getLdap()->exists($topDn)); - } - - public function testSave() - { - $dn=$this->_createDn('ou=TestCreated,'); - $data=array('ou' => 'TestCreated', 'objectclass' => 'organizationalUnit'); - try { - $this->_getLdap()->save($dn, $data); - $this->assertTrue($this->_getLdap()->exists($dn)); - $data['l']='mylocation1'; - $this->_getLdap()->save($dn, $data); - $this->assertTrue($this->_getLdap()->exists($dn)); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals('mylocation1', $entry['l'][0]); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - - } - - public function testPrepareLdapEntryArray() - { - $data=array( - 'a1' => 'TestCreated', - 'a2' => 'account', - 'a3' => null, - 'a4' => '', - 'a5' => array('TestCreated'), - 'a6' => array('account'), - 'a7' => array(null), - 'a8' => array(''), - 'a9' => array('', null, 'account', '', null, 'TestCreated', '', null)); - Zend_Ldap::prepareLdapEntryArray($data); - $expected=array( - 'a1' => array('TestCreated'), - 'a2' => array('account'), - 'a3' => array(), - 'a4' => array(), - 'a5' => array('TestCreated'), - 'a6' => array('account'), - 'a7' => array(), - 'a8' => array(), - 'a9' => array('account', 'TestCreated')); - $this->assertEquals($expected, $data); - } - - /** - * @group ZF-7888 - */ - public function testZeroValueMakesItThroughSanitationProcess() - { - $data = array( - 'string' => '0', - 'integer' => 0, - 'stringArray' => array('0'), - 'integerArray' => array(0), - 'null' => null, - 'empty' => '', - 'nullArray' => array(null), - 'emptyArray' => array(''), - ); - Zend_Ldap::prepareLdapEntryArray($data); - $expected=array( - 'string' => array('0'), - 'integer' => array('0'), - 'stringarray' => array('0'), - 'integerarray' => array('0'), - 'null' => array(), - 'empty' => array(), - 'nullarray' => array(), - 'emptyarray' => array() - ); - $this->assertEquals($expected, $data); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testPrepareLdapEntryArrayArrayData() - { - $data=array( - 'a1' => array(array('account'))); - Zend_Ldap::prepareLdapEntryArray($data); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testPrepareLdapEntryArrayObjectData() - { - $class=new stdClass(); - $class->a='b'; - $data=array( - 'a1' => array($class)); - Zend_Ldap::prepareLdapEntryArray($data); - } - - public function testAddWithDnObject() - { - $dn=Zend_Ldap_Dn::fromString($this->_createDn('ou=TestCreated,')); - $data=array( - 'ou' => 'TestCreated', - 'objectclass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $this->assertEquals(1, $this->_getLdap()->count('ou=TestCreated')); - $this->_getLdap()->delete($dn); - } - catch (Zend_Ldap_Exception $e) { - $this->fail($e->getMessage()); - } - } - - public function testUpdateWithDnObject() - { - $dn=Zend_Ldap_Dn::fromString($this->_createDn('ou=TestCreated,')); - $data=array( - 'ou' => 'TestCreated', - 'l' => 'mylocation1', - 'objectclass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $entry=$this->_getLdap()->getEntry($dn); - $this->assertEquals('mylocation1', $entry['l'][0]); - $entry['l']='mylocation2'; - $this->_getLdap()->update($dn, $entry); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals('mylocation2', $entry['l'][0]); - } - catch (Zend_Ldap_Exception $e) { - $this->fail($e->getMessage()); - } - } - - public function testSaveWithDnObject() - { - $dn=Zend_Ldap_Dn::fromString($this->_createDn('ou=TestCreated,')); - $data=array('ou' => 'TestCreated', 'objectclass' => 'organizationalUnit'); - try { - $this->_getLdap()->save($dn, $data); - $this->assertTrue($this->_getLdap()->exists($dn)); - $data['l']='mylocation1'; - $this->_getLdap()->save($dn, $data); - $this->assertTrue($this->_getLdap()->exists($dn)); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals('mylocation1', $entry['l'][0]); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testAddObjectClass() - { - $dn=$this->_createDn('ou=TestCreated,'); - $data=array( - 'ou' => 'TestCreated', - 'l' => 'mylocation1', - 'objectClass' => 'organizationalUnit' - ); - try { - $this->_getLdap()->add($dn, $data); - $entry=$this->_getLdap()->getEntry($dn); - $entry['objectclass'][]='domainRelatedObject'; - $entry['associatedDomain'][]='domain'; - $this->_getLdap()->update($dn, $entry); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - - $this->assertEquals('domain', $entry['associateddomain'][0]); - $this->assertContains('organizationalUnit', $entry['objectclass']); - $this->assertContains('domainRelatedObject', $entry['objectclass']); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - public function testRemoveObjectClass() - { - $dn=$this->_createDn('ou=TestCreated,'); - $data=array( - 'associatedDomain' => 'domain', - 'ou' => 'TestCreated', - 'l' => 'mylocation1', - 'objectClass' => array('organizationalUnit', 'domainRelatedObject') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry=$this->_getLdap()->getEntry($dn); - $entry['objectclass']='organizationalUnit'; - $entry['associatedDomain']=null; - $this->_getLdap()->update($dn, $entry); - $entry=$this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - - $this->assertArrayNotHasKey('associateddomain', $entry); - $this->assertContains('organizationalUnit', $entry['objectclass']); - $this->assertNotContains('domainRelatedObject', $entry['objectclass']); - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-9564 - */ - public function testAddingEntryWithMissingRdnAttribute() { - $dn = $this->_createDn('ou=TestCreated,'); - $data = array( - 'objectClass' => array('organizationalUnit') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals(array('TestCreated'), $entry['ou']); - - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-9564 - */ - public function testAddingEntryWithMissingRdnAttributeValue() { - $dn = $this->_createDn('ou=TestCreated,'); - $data = array( - 'ou' => array('SecondOu'), - 'objectClass' => array('organizationalUnit') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals(array('TestCreated', 'SecondOu'), $entry['ou']); - - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-9564 - */ - public function testAddingEntryThatHasMultipleValuesOnRdnAttribute() { - $dn = $this->_createDn('ou=TestCreated,'); - $data = array( - 'ou' => array('TestCreated', 'SecondOu'), - 'objectClass' => array('organizationalUnit') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals(array('TestCreated', 'SecondOu'), $entry['ou']); - - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-9564 - */ - public function testUpdatingEntryWithAttributeThatIsAnRdnAttribute() { - $dn = $this->_createDn('ou=TestCreated,'); - $data = array( - 'ou' => array('TestCreated'), - 'objectClass' => array('organizationalUnit') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - - $data = array('ou' => array_merge($entry['ou'], array('SecondOu'))); - $this->_getLdap()->update($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals(array('TestCreated', 'SecondOu'), $entry['ou']); - - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - } - - /** - * @group ZF-9564 - */ - public function testUpdatingEntryWithRdnAttributeValueMissingInData() { - $dn = $this->_createDn('ou=TestCreated,'); - $data = array( - 'ou' => array('TestCreated'), - 'objectClass' => array('organizationalUnit') - ); - try { - $this->_getLdap()->add($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - - $data = array('ou' => 'SecondOu'); - $this->_getLdap()->update($dn, $data); - $entry = $this->_getLdap()->getEntry($dn); - $this->_getLdap()->delete($dn); - $this->assertEquals(array('TestCreated', 'SecondOu'), $entry['ou']); - - } catch (Zend_Ldap_Exception $e) { - if ($this->_getLdap()->exists($dn)) { - $this->_getLdap()->delete($dn); - } - $this->fail($e->getMessage()); - } - - } -} diff --git a/tests/Zend/Ldap/Dn/AllTests.php b/tests/Zend/Ldap/Dn/AllTests.php deleted file mode 100644 index 01f1846597..0000000000 --- a/tests/Zend/Ldap/Dn/AllTests.php +++ /dev/null @@ -1,67 +0,0 @@ -addTestSuite('Zend_Ldap_Dn_EscapingTest'); - $suite->addTestSuite('Zend_Ldap_Dn_ExplodingTest'); - $suite->addTestSuite('Zend_Ldap_Dn_ImplodingTest'); - $suite->addTestSuite('Zend_Ldap_Dn_CreationTest'); - $suite->addTestSuite('Zend_Ldap_Dn_ModificationTest'); - $suite->addTestSuite('Zend_Ldap_Dn_MiscTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Ldap_Dn_AllTests::main') { - Zend_Ldap_Dn_AllTests::main(); -} diff --git a/tests/Zend/Ldap/Dn/CreationTest.php b/tests/Zend/Ldap/Dn/CreationTest.php deleted file mode 100644 index 627c9b0869..0000000000 --- a/tests/Zend/Ldap/Dn/CreationTest.php +++ /dev/null @@ -1,210 +0,0 @@ - 'Baker, Alice'), - array('CN' => 'Users', 'OU' => 'Lab'), - array('DC' => 'example'), - array('DC' => 'com')); - - $dnString2='cn=Baker\\, Alice,cn=Users+ou=Lab,dc=example,dc=com'; - $dnArray2=array( - array('cn' => 'Baker, Alice'), - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example'), - array('dc' => 'com')); - - $dnString3='Cn=Baker\\, Alice,Cn=Users+Ou=Lab,Dc=example,Dc=com'; - $dnArray3=array( - array('Cn' => 'Baker, Alice'), - array('Cn' => 'Users', 'Ou' => 'Lab'), - array('Dc' => 'example'), - array('Dc' => 'com')); - - $dn11=Zend_Ldap_Dn::fromString($dnString1); - $dn12=Zend_Ldap_Dn::fromArray($dnArray1); - $dn13=Zend_Ldap_Dn::factory($dnString1); - $dn14=Zend_Ldap_Dn::factory($dnArray1); - - $this->assertEquals($dn11, $dn12); - $this->assertEquals($dn11, $dn13); - $this->assertEquals($dn11, $dn14); - - $this->assertEquals($dnString1, $dn11->toString()); - $this->assertEquals($dnString1, $dn11->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnString2, $dn11->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $this->assertEquals($dnArray1, $dn11->toArray()); - $this->assertEquals($dnArray1, $dn11->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnArray2, $dn11->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - - $dn21=Zend_Ldap_Dn::fromString($dnString2); - $dn22=Zend_Ldap_Dn::fromArray($dnArray2); - $dn23=Zend_Ldap_Dn::factory($dnString2); - $dn24=Zend_Ldap_Dn::factory($dnArray2); - - $this->assertEquals($dn21, $dn22); - $this->assertEquals($dn21, $dn23); - $this->assertEquals($dn21, $dn24); - - $this->assertEquals($dnString2, $dn21->toString()); - $this->assertEquals($dnString1, $dn21->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnString2, $dn21->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $this->assertEquals($dnArray2, $dn21->toArray()); - $this->assertEquals($dnArray1, $dn21->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnArray2, $dn21->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $this->assertEquals($dnArray2, $dn22->toArray()); - - $dn31=Zend_Ldap_Dn::fromString($dnString3); - $dn32=Zend_Ldap_Dn::fromArray($dnArray3); - $dn33=Zend_Ldap_Dn::factory($dnString3); - $dn34=Zend_Ldap_Dn::factory($dnArray3); - - $this->assertEquals($dn31, $dn32); - $this->assertEquals($dn31, $dn33); - $this->assertEquals($dn31, $dn34); - - $this->assertEquals($dnString3, $dn31->toString()); - $this->assertEquals($dnString1, $dn31->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnString2, $dn31->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $this->assertEquals($dnArray3, $dn31->toArray()); - $this->assertEquals($dnArray1, $dn31->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals($dnArray2, $dn31->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - - try { - $dn=Zend_Ldap_Dn::factory(1); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Invalid argument type for $dn', $e->getMessage()); - } - } - - public function testDnCreationWithDifferentCaseFoldings() - { - Zend_Ldap_Dn::setDefaultCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_NONE); - - $dnString1='Cn=Baker\\, Alice,Cn=Users+Ou=Lab,Dc=example,Dc=com'; - $dnString2='CN=Baker\\, Alice,CN=Users+OU=Lab,DC=example,DC=com'; - $dnString3='cn=Baker\\, Alice,cn=Users+ou=Lab,dc=example,dc=com'; - - $dn=Zend_Ldap_Dn::fromString($dnString1, null); - $this->assertEquals($dnString1, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER); - $this->assertEquals($dnString2, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dnString3, (string)$dn); - - $dn=Zend_Ldap_Dn::fromString($dnString1, Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER); - $this->assertEquals($dnString2, (string)$dn); - $dn->setCaseFold(null); - $this->assertEquals($dnString1, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dnString3, (string)$dn); - - $dn=Zend_Ldap_Dn::fromString($dnString1, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dnString3, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER); - $this->assertEquals($dnString2, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dnString3, (string)$dn); - $dn->setCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER); - $this->assertEquals($dnString2, (string)$dn); - - Zend_Ldap_Dn::setDefaultCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER); - $dn=Zend_Ldap_Dn::fromString($dnString1, null); - $this->assertEquals($dnString2, (string)$dn); - - Zend_Ldap_Dn::setDefaultCaseFold(null); - $dn=Zend_Ldap_Dn::fromString($dnString1, null); - $this->assertEquals($dnString1, (string)$dn); - - Zend_Ldap_Dn::setDefaultCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_NONE); - } - - public function testGetRdn() - { - Zend_Ldap_Dn::setDefaultCaseFold(Zend_Ldap_Dn::ATTR_CASEFOLD_NONE); - - $dnString='cn=Baker\\, Alice,cn=Users,dc=example,dc=com'; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals(array('cn' => 'Baker, Alice'), $dn->getRdn()); - $this->assertEquals('cn=Baker\\, Alice', $dn->getRdnString()); - - $dnString = 'Cn=Users+Ou=Lab,dc=example,dc=com'; - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals(array('Cn' => 'Users', 'Ou' => 'Lab'), $dn->getRdn()); - $this->assertEquals('Cn=Users+Ou=Lab', $dn->getRdnString()); - } - - public function testGetParentDn() - { - $dnString='cn=Baker\\, Alice,cn=Users,dc=example,dc=com'; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals('cn=Users,dc=example,dc=com', $dn->getParentDn()->toString()); - $this->assertEquals('cn=Users,dc=example,dc=com', $dn->getParentDn(1)->toString()); - $this->assertEquals('dc=example,dc=com', $dn->getParentDn(2)->toString()); - $this->assertEquals('dc=com', $dn->getParentDn(3)->toString()); - - try { - $dn->getParentDn(0)->toString(); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot retrieve parent DN with given $levelUp', $e->getMessage()); - } - try { - $dn->getParentDn(4)->toString(); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot retrieve parent DN with given $levelUp', $e->getMessage()); - } - } - - public function testEmptyStringDn() - { - $dnString=''; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals($dnString, $dn->toString()); - } -} diff --git a/tests/Zend/Ldap/Dn/EscapingTest.php b/tests/Zend/Ldap/Dn/EscapingTest.php deleted file mode 100644 index 3ce9f8cf82..0000000000 --- a/tests/Zend/Ldap/Dn/EscapingTest.php +++ /dev/null @@ -1,58 +0,0 @@ -l;u#e=! '; - $expected='\20\20\16 t\,e\+s\"t\,\\\\v\l\;u\#e\=!\20\20\20\20'; - $this->assertEquals($expected, Zend_Ldap_Dn::escapeValue($dnval)); - $this->assertEquals($expected, Zend_Ldap_Dn::escapeValue(array($dnval))); - $this->assertEquals(array($expected, $expected, $expected), - Zend_Ldap_Dn::escapeValue(array($dnval, $dnval, $dnval))); - } - - public function testUnescapeValues() - { - $dnval='\\20\\20\\16\\20t\\,e\\+s \\"t\\,\\\\v\\l\\;u\\#e\\=!\\20\\20\\20\\20'; - $expected=' '.chr(22).' t,e+s "t,\\vl;u#e=! '; - $this->assertEquals($expected, Zend_Ldap_Dn::unescapeValue($dnval)); - $this->assertEquals($expected, Zend_Ldap_Dn::unescapeValue(array($dnval))); - $this->assertEquals(array($expected, $expected, $expected), - Zend_Ldap_Dn::unescapeValue(array($dnval,$dnval,$dnval))); - } -} diff --git a/tests/Zend/Ldap/Dn/ExplodingTest.php b/tests/Zend/Ldap/Dn/ExplodingTest.php deleted file mode 100644 index 312a806f59..0000000000 --- a/tests/Zend/Ldap/Dn/ExplodingTest.php +++ /dev/null @@ -1,263 +0,0 @@ -assertTrue($ret === $expected); - } - - public function testExplodeDnCaseFold() - { - $dn='CN=Alice Baker,cn=Users,DC=example,dc=com'; - $k=array(); - $v=null; - $this->assertTrue(Zend_Ldap_Dn::checkDn($dn, $k, $v, Zend_Ldap_Dn::ATTR_CASEFOLD_NONE)); - $this->assertEquals(array('CN', 'cn', 'DC', 'dc'), $k); - - $this->assertTrue(Zend_Ldap_Dn::checkDn($dn, $k, $v, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $this->assertEquals(array('cn', 'cn', 'dc', 'dc'), $k); - - $this->assertTrue(Zend_Ldap_Dn::checkDn($dn, $k, $v, Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $this->assertEquals(array('CN', 'CN', 'DC', 'DC'), $k); - } - - public function testExplodeDn() - { - $dn='cn=name1,cn=name2,dc=example,dc=org'; - $k=array(); - $v=array(); - $dnArray=Zend_Ldap_Dn::explodeDn($dn, $k, $v); - $expected=array( - array("cn" => "name1"), - array("cn" => "name2"), - array("dc" => "example"), - array("dc" => "org") - ); - $ke=array('cn', 'cn', 'dc', 'dc'); - $ve=array('name1', 'name2', 'example', 'org'); - $this->assertEquals($expected, $dnArray); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - } - - public function testExplodeDnWithUtf8Characters() - { - $dn='uid=rogasawara,ou=営業部,o=Airius'; - $k=array(); - $v=array(); - $dnArray=Zend_Ldap_Dn::explodeDn($dn, $k, $v); - $expected=array( - array("uid" => "rogasawara"), - array("ou" => "営業部"), - array("o" => "Airius"), - ); - $ke=array('uid', 'ou', 'o'); - $ve=array('rogasawara', '営業部', 'Airius'); - $this->assertEquals($expected, $dnArray); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - } - - public function testExplodeDnWithSpaces() - { - $dn='cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com'; - $k=array(); - $v=array(); - $dnArray=Zend_Ldap_Dn::explodeDn($dn, $k, $v); - $expected=array( - array("cn" => "Barbara Jensen"), - array("ou" => "Product Development"), - array("dc" => "airius"), - array("dc" => "com"), - ); - $ke=array('cn', 'ou', 'dc', 'dc'); - $ve=array('Barbara Jensen', 'Product Development', 'airius', 'com'); - $this->assertEquals($expected, $dnArray); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - } - - public function testCoreExplodeDnWithMultiValuedRdn() - { - $dn='cn=name1+uid=user,cn=name2,dc=example,dc=org'; - $k=array(); - $v=array(); - $this->assertTrue(Zend_Ldap_Dn::checkDn($dn, $k, $v)); - $ke=array(array('cn', 'uid'), 'cn', 'dc', 'dc'); - $ve=array(array('name1', 'user'), 'name2', 'example', 'org'); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - - $dn='cn=name11+cn=name12,cn=name2,dc=example,dc=org'; - $this->assertFalse(Zend_Ldap_Dn::checkDn($dn)); - - $dn='CN=name11+Cn=name12,cn=name2,dc=example,dc=org'; - $this->assertFalse(Zend_Ldap_Dn::checkDn($dn)); - } - - public function testExplodeDnWithMultiValuedRdn() - { - $dn='cn=Surname\, Firstname+uid=userid,cn=name2,dc=example,dc=org'; - $k=array(); - $v=array(); - $dnArray=Zend_Ldap_Dn::explodeDn($dn, $k, $v); - $ke=array(array('cn', 'uid'), 'cn', 'dc', 'dc'); - $ve=array(array('Surname, Firstname', 'userid'), 'name2', 'example', 'org'); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - $expected=array( - array("cn" => "Surname, Firstname", "uid" => "userid"), - array("cn" => "name2"), - array("dc" => "example"), - array("dc" => "org") - ); - $this->assertEquals($expected, $dnArray); - } - - public function testExplodeDnWithMultiValuedRdn2() - { - $dn='cn=Surname\, Firstname+uid=userid+sn=Surname,cn=name2,dc=example,dc=org'; - $k=array(); - $v=array(); - $dnArray=Zend_Ldap_Dn::explodeDn($dn, $k, $v); - $ke=array(array('cn', 'uid', 'sn'), 'cn', 'dc', 'dc'); - $ve=array(array('Surname, Firstname', 'userid', 'Surname'), 'name2', 'example', 'org'); - $this->assertEquals($ke, $k); - $this->assertEquals($ve, $v); - $expected=array( - array("cn" => "Surname, Firstname", "uid" => "userid", "sn" => "Surname"), - array("cn" => "name2"), - array("dc" => "example"), - array("dc" => "org") - ); - $this->assertEquals($expected, $dnArray); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testCreateDnArrayIllegalDn() - { - $dn='name1,cn=name2,dc=example,dc=org'; - $dnArray=Zend_Ldap_Dn::explodeDn($dn); - } - - public static function rfc2253DnProvider() - { - $testData = array( - array('CN=Steve Kille,O=Isode Limited,C=GB', - array( - array('CN' => 'Steve Kille'), - array('O' => 'Isode Limited'), - array('C' => 'GB') - )), - array('OU=Sales+CN=J. Smith,O=Widget Inc.,C=US', - array( - array('OU' => 'Sales', 'CN' => 'J. Smith'), - array('O' => 'Widget Inc.'), - array('C' => 'US') - )), - array('CN=L. Eagle,O=Sue\, Grabbit and Runn,C=GB', - array( - array('CN' => 'L. Eagle'), - array('O' => 'Sue, Grabbit and Runn'), - array('C' => 'GB') - )), - array('CN=Before\0DAfter,O=Test,C=GB', - array( - array('CN' => "Before\rAfter"), - array('O' => 'Test'), - array('C' => 'GB') - )), - array('SN=Lu\C4\8Di\C4\87', - array( - array('SN' => 'LuÄić') - )) - ); - return $testData; - } - - /** - * @dataProvider rfc2253DnProvider - */ - public function testExplodeDnsProvidedByRFC2253($input, $expected) - { - $dnArray=Zend_Ldap_Dn::explodeDn($input); - $this->assertEquals($expected, $dnArray); - } -} diff --git a/tests/Zend/Ldap/Dn/ImplodingTest.php b/tests/Zend/Ldap/Dn/ImplodingTest.php deleted file mode 100644 index 8528203748..0000000000 --- a/tests/Zend/Ldap/Dn/ImplodingTest.php +++ /dev/null @@ -1,137 +0,0 @@ -assertEquals($dn1, $dn2); - } - - public function testImplodeDn() - { - $expected='cn=name1,cn=name2,dc=example,dc=org'; - $dnArray=array( - array("cn" => "name1"), - array("cn" => "name2"), - array("dc" => "example"), - array("dc" => "org") - ); - $dn=Zend_Ldap_Dn::implodeDn($dnArray); - $this->assertEquals($expected, $dn); - - $dn=Zend_Ldap_Dn::implodeDn($dnArray, Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER, ';'); - $this->assertEquals('CN=name1;CN=name2;DC=example;DC=org', $dn); - } - - public function testImplodeDnWithUtf8Characters() - { - $expected='uid=rogasawara,ou=営業部,o=Airius'; - $dnArray=array( - array("uid" => "rogasawara"), - array("ou" => "営業部"), - array("o" => "Airius"), - ); - $dn=Zend_Ldap_Dn::implodeDn($dnArray); - $this->assertEquals($expected, $dn); - } - - public function testImplodeRdn() - { - $a=array('cn' => 'value'); - $expected='cn=value'; - $this->assertEquals($expected, Zend_Ldap_Dn::implodeRdn($a)); - } - - public function testImplodeRdnMultiValuedRdn() - { - $a=array('cn' => 'value', 'uid' => 'testUser'); - $expected='cn=value+uid=testUser'; - $this->assertEquals($expected, Zend_Ldap_Dn::implodeRdn($a)); - } - - public function testImplodeRdnMultiValuedRdn2() - { - $a=array('cn' => 'value', 'uid' => 'testUser', 'ou' => 'myDep'); - $expected='cn=value+ou=myDep+uid=testUser'; - $this->assertEquals($expected, Zend_Ldap_Dn::implodeRdn($a)); - } - - public function testImplodeRdnCaseFold() - { - $a=array('cn' => 'value'); - $expected='CN=value'; - $this->assertEquals($expected, - Zend_Ldap_Dn::implodeRdn($a, Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $a=array('CN' => 'value'); - $expected='cn=value'; - $this->assertEquals($expected, - Zend_Ldap_Dn::implodeRdn($a, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - } - - public function testImplodeRdnMultiValuedRdnCaseFold() - { - $a=array('cn' => 'value', 'uid' => 'testUser', 'ou' => 'myDep'); - $expected='CN=value+OU=myDep+UID=testUser'; - $this->assertEquals($expected, - Zend_Ldap_Dn::implodeRdn($a, Zend_Ldap_Dn::ATTR_CASEFOLD_UPPER)); - $a=array('CN' => 'value', 'uID' => 'testUser', 'ou' => 'myDep'); - $expected='cn=value+ou=myDep+uid=testUser'; - $this->assertEquals($expected, - Zend_Ldap_Dn::implodeRdn($a, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testImplodeRdnInvalidOne() - { - $a=array('cn'); - Zend_Ldap_Dn::implodeRdn($a); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testImplodeRdnInvalidThree() - { - $a=array('cn' => 'value', 'ou'); - Zend_Ldap_Dn::implodeRdn($a); - } -} diff --git a/tests/Zend/Ldap/Dn/MiscTest.php b/tests/Zend/Ldap/Dn/MiscTest.php deleted file mode 100644 index 9b3491f39d..0000000000 --- a/tests/Zend/Ldap/Dn/MiscTest.php +++ /dev/null @@ -1,87 +0,0 @@ -assertFalse(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOfIllegalDn2() - { - $dn1='cn=name1,cn=name2,dc=example,dc=org'; - $dn2='example,dc=org'; - $this->assertFalse(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOfIllegalBothDn() - { - $dn1='name1,cn=name2,dc=example,dc=org'; - $dn2='example,dc=org'; - $this->assertFalse(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOf() - { - $dn1='cb=name1,cn=name2,dc=example,dc=org'; - $dn2='dc=example,dc=org'; - $this->assertTrue(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOfWithDnObjects() - { - $dn1=Zend_Ldap_Dn::fromString('cb=name1,cn=name2,dc=example,dc=org'); - $dn2=Zend_Ldap_Dn::fromString('dc=example,dc=org'); - $this->assertTrue(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOfOtherSubtree() - { - $dn1='cb=name1,cn=name2,dc=example,dc=org'; - $dn2='dc=example,dc=de'; - $this->assertFalse(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } - - public function testIsChildOfParentDnLonger() - { - $dn1='dc=example,dc=de'; - $dn2='cb=name1,cn=name2,dc=example,dc=org'; - $this->assertFalse(Zend_Ldap_Dn::isChildOf($dn1, $dn2)); - } -} diff --git a/tests/Zend/Ldap/Dn/ModificationTest.php b/tests/Zend/Ldap/Dn/ModificationTest.php deleted file mode 100644 index 9545b6d5e3..0000000000 --- a/tests/Zend/Ldap/Dn/ModificationTest.php +++ /dev/null @@ -1,294 +0,0 @@ -assertEquals(array('cn' => 'Baker, Alice'), $dn->get(0)); - $this->assertEquals(array('cn' => 'Users', 'ou' => 'Lab'), $dn->get(1)); - $this->assertEquals(array('dc' => 'example'), $dn->get(2)); - $this->assertEquals(array('dc' => 'com'), $dn->get(3)); - try { - $this->assertEquals(array('dc' => 'com'), $dn->get('string')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index must be an integer', $e->getMessage()); - } - try { - $this->assertEquals(array('cn' => 'Baker, Alice'), $dn->get(-1)); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index out of bounds', $e->getMessage()); - } - try { - $this->assertEquals(array('dc' => 'com'), $dn->get(4)); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index out of bounds', $e->getMessage()); - } - - $this->assertEquals(array( - array('cn' => 'Baker, Alice'), - array('cn' => 'Users', 'ou' => 'Lab') - ), $dn->get(0, 2)); - $this->assertEquals(array( - array('cn' => 'Baker, Alice'), - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example') - ), $dn->get(0, 3)); - $this->assertEquals(array( - array('cn' => 'Baker, Alice'), - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(0, 4)); - $this->assertEquals(array( - array('cn' => 'Baker, Alice'), - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(0, 5)); - - $this->assertEquals(array( - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example') - ), $dn->get(1, 2)); - $this->assertEquals(array( - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(1, 3)); - $this->assertEquals(array( - array('cn' => 'Users', 'ou' => 'Lab'), - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(1, 4)); - - $this->assertEquals(array( - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(2, 2)); - $this->assertEquals(array( - array('dc' => 'example'), - array('dc' => 'com') - ), $dn->get(2, 3)); - - $this->assertEquals(array( - array('dc' => 'com') - ), $dn->get(3, 2)); - } - - public function testDnManipulationSet() - { - $dnString='cn=Baker\\, Alice,cn=Users+ou=Lab,dc=example,dc=com'; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals('uid=abaker,cn=Users+ou=Lab,dc=example,dc=com', - $dn->set(0, array('uid' => 'abaker'))->toString()); - $this->assertEquals('uid=abaker,ou=Lab,dc=example,dc=com', - $dn->set(1, array('ou' => 'Lab'))->toString()); - $this->assertEquals('uid=abaker,ou=Lab,dc=example+ou=Test,dc=com', - $dn->set(2, array('dc' => 'example', 'ou' => 'Test'))->toString()); - $this->assertEquals('uid=abaker,ou=Lab,dc=example+ou=Test,dc=de\+fr', - $dn->set(3, array('dc' => 'de+fr'))->toString()); - - try { - $dn->set(4, array('dc' => 'de')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index out of bounds', $e->getMessage()); - } - try { - $dn->set(3, array('dc' => 'de', 'ou')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('RDN Array is malformed: it must use string keys', $e->getMessage()); - } - } - - public function testDnManipulationRemove() - { - $dnString='cn=Baker\\, Alice,cn=Users+ou=Lab,dc=example,dc=com'; - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Users+ou=Lab,dc=example,dc=com', $dn->remove(0)->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,dc=example,dc=com', $dn->remove(1)->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,cn=Users+ou=Lab,dc=com', $dn->remove(2)->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,cn=Users+ou=Lab,dc=example', - $dn->remove(3)->toString()); - - try { - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn->remove(4); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index out of bounds', $e->getMessage()); - } - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,dc=com', - $dn->remove(1, 2)->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice', - $dn->remove(1, 3)->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice', - $dn->remove(1, 4)->toString()); - } - - public function testDnManipulationAppendAndPrepend() - { - $dnString='OU=Sales,DC=example'; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals('OU=Sales,DC=example,DC=com', - $dn->append(array('DC' => 'com'))->toString()); - - $this->assertEquals('OU=New York,OU=Sales,DC=example,DC=com', - $dn->prepend(array('OU' => 'New York'))->toString()); - - try { - $dn->append(array('dc' => 'de', 'ou')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('RDN Array is malformed: it must use string keys', $e->getMessage()); - } - try { - $dn->prepend(array('dc' => 'de', 'ou')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('RDN Array is malformed: it must use string keys', $e->getMessage()); - } - } - - public function testDnManipulationInsert() - { - $dnString='cn=Baker\\, Alice,cn=Users,dc=example,dc=com'; - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,dc=test,cn=Users,dc=example,dc=com', - $dn->insert(0, array('dc' => 'test'))->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=test,dc=example,dc=com', - $dn->insert(1, array('dc' => 'test'))->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=example,dc=test,dc=com', - $dn->insert(2, array('dc' => 'test'))->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=example,dc=com,dc=test', - $dn->insert(3, array('dc' => 'test'))->toString()); - - try { - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn->insert(4, array('dc' => 'de')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Parameter $index out of bounds', $e->getMessage()); - } - try { - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn->insert(3, array('dc' => 'de', 'ou')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('RDN Array is malformed: it must use string keys', $e->getMessage()); - } - } - - public function testArrayAccessImplementation() - { - $dnString='cn=Baker\\, Alice,cn=Users,dc=example,dc=com'; - $dn=Zend_Ldap_Dn::fromString($dnString); - - $this->assertEquals(array('cn' => 'Baker, Alice'), $dn[0]); - $this->assertEquals(array('cn' => 'Users'), $dn[1]); - $this->assertEquals(array('dc' => 'example'), $dn[2]); - $this->assertEquals(array('dc' => 'com'), $dn[3]); - - $this->assertTrue(isset($dn[0])); - $this->assertTrue(isset($dn[1])); - $this->assertTrue(isset($dn[2])); - $this->assertTrue(isset($dn[3])); - $this->assertFalse(isset($dn[-1])); - $this->assertFalse(isset($dn[4])); - - $dn=Zend_Ldap_Dn::fromString($dnString); - unset($dn[0]); - $this->assertEquals('cn=Users,dc=example,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - unset($dn[1]); - $this->assertEquals('cn=Baker\\, Alice,dc=example,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - unset($dn[2]); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - unset($dn[3]); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=example', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn[0]=array('uid' => 'abaker'); - $this->assertEquals('uid=abaker,cn=Users,dc=example,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn[1]=array('ou' => 'Lab'); - $this->assertEquals('cn=Baker\\, Alice,ou=Lab,dc=example,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn[2]=array('dc' => 'example', 'ou' => 'Test'); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=example+ou=Test,dc=com', $dn->toString()); - - $dn=Zend_Ldap_Dn::fromString($dnString); - $dn[3]=array('dc' => 'de+fr'); - $this->assertEquals('cn=Baker\\, Alice,cn=Users,dc=example,dc=de\+fr', $dn->toString()); - } -} diff --git a/tests/Zend/Ldap/FilterTest.php b/tests/Zend/Ldap/FilterTest.php deleted file mode 100644 index c80f0464c0..0000000000 --- a/tests/Zend/Ldap/FilterTest.php +++ /dev/null @@ -1,214 +0,0 @@ -assertEquals($expected, Zend_Ldap_Filter::escapeValue($input)); - } - - public function testEscapeValues() - { - $expected='t\28e,s\29t\2av\5cal\1eue'; - $filterval='t(e,s)t*v\\al' . chr(30) . 'ue'; - $this->assertEquals($expected, Zend_Ldap_Filter::escapeValue($filterval)); - $this->assertEquals($expected, Zend_Ldap_Filter::escapeValue(array($filterval))); - $this->assertEquals(array($expected, $expected, $expected), - Zend_Ldap_Filter::escapeValue(array($filterval, $filterval, $filterval))); - } - - public function testUnescapeValues() - { - $expected='t(e,s)t*v\\al' . chr(30) . 'ue'; - $filterval='t\28e,s\29t\2av\5cal\1eue'; - $this->assertEquals($expected, Zend_Ldap_Filter::unescapeValue($filterval)); - $this->assertEquals($expected, Zend_Ldap_Filter::unescapeValue(array($filterval))); - $this->assertEquals(array($expected, $expected, $expected), - Zend_Ldap_Filter::unescapeValue(array($filterval, $filterval, $filterval))); - } - - public function testFilterValueUtf8() - { - $filter='ÄÖÜäöü߀'; - $escaped=Zend_Ldap_Filter::escapeValue($filter); - $unescaped=Zend_Ldap_Filter::unescapeValue($escaped); - $this->assertEquals($filter, $unescaped); - } - - public function testFilterCreation() - { - $f1=Zend_Ldap_Filter::equals('name', 'value'); - $this->assertEquals('(name=value)', $f1->toString()); - $f2=Zend_Ldap_Filter::begins('name', 'value'); - $this->assertEquals('(name=value*)', $f2->toString()); - $f3=Zend_Ldap_Filter::ends('name', 'value'); - $this->assertEquals('(name=*value)', $f3->toString()); - $f4=Zend_Ldap_Filter::contains('name', 'value'); - $this->assertEquals('(name=*value*)', $f4->toString()); - $f5=Zend_Ldap_Filter::greater('name', 'value'); - $this->assertEquals('(name>value)', $f5->toString()); - $f6=Zend_Ldap_Filter::greaterOrEqual('name', 'value'); - $this->assertEquals('(name>=value)', $f6->toString()); - $f7=Zend_Ldap_Filter::less('name', 'value'); - $this->assertEquals('(nametoString()); - $f8=Zend_Ldap_Filter::lessOrEqual('name', 'value'); - $this->assertEquals('(name<=value)', $f8->toString()); - $f9=Zend_Ldap_Filter::approx('name', 'value'); - $this->assertEquals('(name~=value)', $f9->toString()); - $f10=Zend_Ldap_Filter::any('name'); - $this->assertEquals('(name=*)', $f10->toString()); - $f11=Zend_Ldap_Filter::string('name=*value*value*'); - $this->assertEquals('(name=*value*value*)', $f11->toString()); - $f12=Zend_Ldap_Filter::mask('(&(objectClass=account)(uid=%s))', 'a*b(b)d\e/f'); - $this->assertEquals('(&(objectClass=account)(uid=a\2ab\28b\29d\5ce/f))', $f12->toString()); - } - - public function testToStringImplementation() - { - $f1=Zend_Ldap_Filter::ends('name', 'value'); - $this->assertEquals($f1->toString(), (string)$f1); - } - - public function testNegate() - { - $f1=Zend_Ldap_Filter::ends('name', 'value'); - $this->assertEquals('(name=*value)', $f1->toString()); - $f1=$f1->negate(); - $this->assertEquals('(!(name=*value))', $f1->toString()); - $f1=$f1->negate(); - $this->assertEquals('(name=*value)', $f1->toString()); - } - - /** - * @expectedException Zend_Ldap_Filter_Exception - */ - public function testIllegalGroupingFilter() - { - $data=array('a', 'b', 5); - $f=new Zend_Ldap_Filter_And($data); - } - - public function testGroupingFilter() - { - $f1=Zend_Ldap_Filter::equals('name', 'value'); - $f2=Zend_Ldap_Filter::begins('name', 'value'); - $f3=Zend_Ldap_Filter::ends('name', 'value'); - - $f4=Zend_Ldap_Filter::andFilter($f1, $f2, $f3); - $f5=Zend_Ldap_Filter::orFilter($f1, $f2, $f3); - - $this->assertEquals('(&(name=value)(name=value*)(name=*value))', $f4->toString()); - $this->assertEquals('(|(name=value)(name=value*)(name=*value))', $f5->toString()); - - $f4=$f4->addFilter($f1); - $this->assertEquals('(&(name=value)(name=value*)(name=*value)(name=value))', $f4->toString()); - } - - public function testComplexFilter() - { - $f1=Zend_Ldap_Filter::equals('name1', 'value1'); - $f2=Zend_Ldap_Filter::equals('name1', 'value2'); - - $f3=Zend_Ldap_Filter::equals('name2', 'value1'); - $f4=Zend_Ldap_Filter::equals('name2', 'value2'); - - $f5=Zend_Ldap_Filter::orFilter($f1, $f2); - $f6=Zend_Ldap_Filter::orFilter($f3, $f4); - - $f7=Zend_Ldap_Filter::andFilter($f5, $f6); - - $this->assertEquals('(&(|(name1=value1)(name1=value2))(|(name2=value1)(name2=value2)))', - $f7->toString()); - } - - public function testChaining() - { - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->addAnd(Zend_Ldap_Filter::approx('a2', 'v2')); - $this->assertEquals('(&(a1=v1)(a2~=v2))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->addOr(Zend_Ldap_Filter::approx('a2', 'v2')); - $this->assertEquals('(|(a1=v1)(a2~=v2))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->negate() - ->addOr(Zend_Ldap_Filter::approx('a2', 'v2')); - $this->assertEquals('(|(!(a1=v1))(a2~=v2))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->addAnd(Zend_Ldap_Filter::approx('a2', 'v2')->negate()); - $this->assertEquals('(&(a1=v1)(!(a2~=v2)))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->negate() - ->addAnd(Zend_Ldap_Filter::approx('a2', 'v2')->negate()); - $this->assertEquals('(&(!(a1=v1))(!(a2~=v2)))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->negate() - ->addAnd(Zend_Ldap_Filter::approx('a2', 'v2')->negate()); - $this->assertEquals('(&(!(a1=v1))(!(a2~=v2)))', $f->toString()); - $f=Zend_Ldap_Filter::equals('a1', 'v1') - ->negate() - ->addAnd(Zend_Ldap_Filter::approx('a2', 'v2')->negate()) - ->negate(); - $this->assertEquals('(!(&(!(a1=v1))(!(a2~=v2))))', $f->toString()); - } - - public function testRealFilterString() - { - $f1=Zend_Ldap_Filter::orFilter( - Zend_Ldap_Filter::equals('sn', 'Gehrig'), - Zend_Ldap_Filter::equals('sn', 'Goerke') - ); - $f2=Zend_Ldap_Filter::orFilter( - Zend_Ldap_Filter::equals('givenName', 'Stefan'), - Zend_Ldap_Filter::equals('givenName', 'Ingo') - ); - - $f=Zend_Ldap_Filter::andFilter($f1, $f2); - - $this->assertEquals('(&(|(sn=Gehrig)(sn=Goerke))(|(givenName=Stefan)(givenName=Ingo)))', - $f->toString()); - } -} - diff --git a/tests/Zend/Ldap/Ldif/AllTests.php b/tests/Zend/Ldap/Ldif/AllTests.php deleted file mode 100644 index 925cd30e6e..0000000000 --- a/tests/Zend/Ldap/Ldif/AllTests.php +++ /dev/null @@ -1,78 +0,0 @@ -addTestSuite('Zend_Ldap_Ldif_SimpleEncoderTest'); - $suite->addTestSuite('Zend_Ldap_Ldif_SimpleDecoderTest'); - - if (defined('TESTS_ZEND_LDAP_ONLINE_ENABLED') - && constant('TESTS_ZEND_LDAP_ONLINE_ENABLED')) { - - } else { - $suite->addTest(new Zend_Ldap_Ldif_SkipOnlineTests()); - } - - return $suite; - } -} - -class Zend_Ldap_Ldif_SkipOnlineTests extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Ldap_Ldif online tests not enabled in TestConfiguration.php'); - } - - public function testNothing() - { - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Ldap_Ldif_AllTests::main') { - Zend_Ldap_Ldif_AllTests::main(); -} diff --git a/tests/Zend/Ldap/Ldif/SimpleDecoderTest.php b/tests/Zend/Ldap/Ldif/SimpleDecoderTest.php deleted file mode 100644 index 22844cb455..0000000000 --- a/tests/Zend/Ldap/Ldif/SimpleDecoderTest.php +++ /dev/null @@ -1,390 +0,0 @@ - 'cn=test3,ou=example,dc=cno', - 'objectclass' => array('oc1'), - 'attr3' => array('foo')); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeSingleItemWithFoldedAttribute() - { - $data = -"dn: cn=test blabla,ou=example,dc=cno -objectclass: oc2 -attr1: 12345 -attr2: 1234 -attr2: baz -attr3: foo -attr3: bar -cn: test blabla -verylong: fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8 - h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb - 5789thvngwr789cghm738"; - $expected = array( - 'dn' => 'cn=test blabla,ou=example,dc=cno', - 'objectclass' => array('oc2'), - 'attr1' => array('12345'), - 'attr2' => array('1234', 'baz'), - 'attr3' => array('foo', 'bar'), - 'cn' => array('test blabla'), - 'verylong' => array('fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8' . - 'h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb' . - '5789thvngwr789cghm738'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeSingleItemWithBase64Attributes() - { - $data = -"dn:: Y249dGVzdCBibGFibGEsb3U9ZXhhbXBsZSxkYz1jbm8= -objectclass: oc3 -attr1: 12345 -attr2: 1234 -attr2: baz -attr3: foo -attr3: bar -attr4:: w7bDpMO8 -attr5:: ZW5kc3BhY2Ug -attr6:: OmJhZGluaXRjaGFy -attr6:: PGJhZGluaXRjaGFy -cn:: dGVzdCDDtsOkw7w="; - $expected = array( - 'dn' => 'cn=test blabla,ou=example,dc=cno', - 'objectclass' => array('oc3'), - 'attr1' => array('12345'), - 'attr2' => array('1234', 'baz'), - 'attr3' => array('foo', 'bar'), - 'attr4' => array('öäü'), - 'attr5' => array('endspace '), - 'attr6' => array(':badinitchar', ' array('test öäü'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeSingleItemWithFoldedBase64Attribute() - { - $data = -"dn:: Y249dGVzdCBibGFibGEsb - 3U9ZXhhbXBsZSxkYz1jbm8= -objectclass: oc3 -attr1: 12345 -attr2: 1234 -attr2: baz -attr3: foo -attr3: bar"; - $expected = array( - 'dn' => 'cn=test blabla,ou=example,dc=cno', - 'objectclass' => array('oc3'), - 'attr1' => array('12345'), - 'attr2' => array('1234', 'baz'), - 'attr3' => array('foo', 'bar'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeTwoItems() - { - $data = -"version: 1 -dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com -objectclass: top -objectclass: person -objectclass: organizationalPerson -cn: Barbara Jensen -cn: Barbara J Jensen -cn: Babs Jensen -sn: Jensen -uid: bjensen -telephonenumber: +1 408 555 1212 -description: A big sailing fan. - -dn: cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com -objectclass: top -objectclass: person -objectclass: organizationalPerson -cn: Bjorn Jensen -sn: Jensen -telephonenumber: +1 408 555 1212"; - $expected = array( - array( - 'dn' => 'cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com', - 'objectclass' => array('top', 'person', 'organizationalPerson'), - 'cn' => array('Barbara Jensen', 'Barbara J Jensen', 'Babs Jensen'), - 'sn' => array('Jensen'), - 'uid' => array('bjensen'), - 'telephonenumber' => array('+1 408 555 1212'), - 'description' => array('A big sailing fan.'), - ), - array( - 'dn' => 'cn=Bjorn Jensen, ou=Accounting, dc=airius, dc=com', - 'objectclass' => array('top', 'person', 'organizationalPerson'), - 'cn' => array('Bjorn Jensen'), - 'sn' => array('Jensen'), - 'telephonenumber' => array('+1 408 555 1212'), - ), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeStringContainingEntryWithFoldedAttributeValue() - { - $data = -"version: 1 -dn:cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com -objectclass:top -objectclass:person -objectclass:organizationalPerson -cn:Barbara Jensen -cn:Barbara J Jensen -cn:Babs Jensen -sn:Jensen -uid:bjensen -telephonenumber:+1 408 555 1212 -description:Babs is a big sailing fan, and travels extensively in sea - rch of perfect sailing conditions. -title:Product Manager, Rod and Reel Division"; - $expected = array( - 'dn' => 'cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com', - 'objectclass' => array('top', 'person', 'organizationalPerson'), - 'cn' => array('Barbara Jensen', 'Barbara J Jensen', 'Babs Jensen'), - 'sn' => array('Jensen'), - 'uid' => array('bjensen'), - 'telephonenumber' => array('+1 408 555 1212'), - 'description' => array('Babs is a big sailing fan, and travels extensively' . - ' in search of perfect sailing conditions.'), - 'title' => array('Product Manager, Rod and Reel Division'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeStringContainingBase64EncodedValue() - { - $data = -"version: 1 -dn: cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com -objectclass: top -objectclass: person -objectclass: organizationalPerson -cn: Gern Jensen -cn: Gern O Jensen -sn: Jensen -uid: gernj -telephonenumber: +1 408 555 1212 -description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl - IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG - VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg - b3V0IG1vcmUu"; - $expected = array( - 'dn' => 'cn=Gern Jensen, ou=Product Testing, dc=airius, dc=com', - 'objectclass' => array('top', 'person', 'organizationalPerson'), - 'cn' => array('Gern Jensen', 'Gern O Jensen'), - 'sn' => array('Jensen'), - 'uid' => array('gernj'), - 'telephonenumber' => array('+1 408 555 1212'), - 'description' => array('What a careful reader you are!' . - ' This value is base-64-encoded because it has a ' . - 'control character in it (a CR).' . "\r" . - ' By the way, you should really get out more.'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testDecodeStringContainingEntriesWithUtf8EncodedAttributeValues() - { - $data = -"version: 1 -dn:: b3U95Za25qWt6YOoLG89QWlyaXVz -# dn:: ou=営業部,o=Airius -objectclass: top -objectclass: organizationalUnit -ou:: 5Za25qWt6YOo -# ou:: 営業部 -ou;lang-ja:: 5Za25qWt6YOo -# ou;lang-ja:: 営業部 -ou;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2 -# ou;lang-ja:: ãˆã„ãŽã‚‡ã†ã¶ - -ou;lang-en: Sales -description: Japanese office - -dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz -# dn:: uid=rogasawara,ou=営業部,o=Airius -userpassword: {SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM= -objectclass: top -objectclass: person -objectclass: organizationalPerson -objectclass: inetOrgPerson -uid: rogasawara -mail: rogasawara@airius.co.jp -givenname;lang-ja:: 44Ot44OJ44OL44O8 -# givenname;lang-ja:: ロドニー -sn;lang-ja:: 5bCP56yg5Y6f -# sn;lang-ja:: å°ç¬ åŽŸ -cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA== -# cn;lang-ja:: å°ç¬ åŽŸ ロドニー -title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw== -# title;lang-ja:: 営業部 部長 -preferredlanguage: ja -givenname:: 44Ot44OJ44OL44O8 -# givenname:: ロドニー -sn:: 5bCP56yg5Y6f -# sn:: å°ç¬ åŽŸ -cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA== -# cn:: å°ç¬ åŽŸ ロドニー -title:: 5Za25qWt6YOoIOmDqOmVtw== -# title:: 営業部 部長 -givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8 -# givenname;lang-ja;phonetic:: ã‚ã©ã«ãƒ¼ -sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ -# sn;lang-ja;phonetic:: ãŠãŒã•ã‚ら -cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA== -# cn;lang-ja;phonetic:: ãŠãŒã•ã‚ら ã‚ã©ã«ãƒ¼ -title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg== -# title;lang-ja;phonetic:: ãˆã„ãŽã‚‡ã†ã¶ ã¶ã¡ã‚‡ã† -givenname;lang-en: Rodney -sn;lang-en: Ogasawara -cn;lang-en: Rodney Ogasawara -title;lang-en: Sales, Director"; - - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - - $this->assertEquals('ou=営業部,o=Airius', $actual[0]['dn']); - $this->assertEquals(array('top', 'organizationalUnit'), $actual[0]['objectclass']); - $this->assertEquals('営業部', $actual[0]['ou'][0]); - $this->assertEquals('営業部', $actual[0]['ou;lang-ja'][0]); - $this->assertEquals('ãˆã„ãŽã‚‡ã†ã¶', $actual[0]['ou;lang-ja;phonetic'][0]); - $this->assertEquals('Sales', $actual[0]['ou;lang-en'][0]); - $this->assertEquals('Japanese office', $actual[0]['description'][0]); - - $this->assertEquals('uid=rogasawara,ou=営業部,o=Airius', $actual[1]['dn']); - $this->assertEquals('{SHA}O3HSv1MusyL4kTjP+HKI5uxuNoM=', $actual[1]['userpassword'][0]); - $this->assertEquals(array('top', 'person', 'organizationalPerson', 'inetOrgPerson'), - $actual[1]['objectclass']); - $this->assertEquals('rogasawara', $actual[1]['uid'][0]); - $this->assertEquals('rogasawara@airius.co.jp', $actual[1]['mail'][0]); - $this->assertEquals('ロドニー', $actual[1]['givenname;lang-ja'][0]); - $this->assertEquals('å°ç¬ åŽŸ', $actual[1]['sn;lang-ja'][0]); - $this->assertEquals('å°ç¬ åŽŸ ロドニー', $actual[1]['cn;lang-ja'][0]); - $this->assertEquals('営業部 部長', $actual[1]['title;lang-ja'][0]); - $this->assertEquals('ja', $actual[1]['preferredlanguage'][0]); - $this->assertEquals('ロドニー', $actual[1]['givenname'][0]); - $this->assertEquals('å°ç¬ åŽŸ', $actual[1]['sn'][0]); - $this->assertEquals('å°ç¬ åŽŸ ロドニー', $actual[1]['cn'][0]); - $this->assertEquals('営業部 部長', $actual[1]['title'][0]); - $this->assertEquals('ã‚ã©ã«ãƒ¼', $actual[1]['givenname;lang-ja;phonetic'][0]); - $this->assertEquals('ãŠãŒã•ã‚ら', $actual[1]['sn;lang-ja;phonetic'][0]); - $this->assertEquals('ãŠãŒã•ã‚ら ã‚ã©ã«ãƒ¼', $actual[1]['cn;lang-ja;phonetic'][0]); - $this->assertEquals('ãˆã„ãŽã‚‡ã†ã¶ ã¶ã¡ã‚‡ã†', $actual[1]['title;lang-ja;phonetic'][0]); - $this->assertEquals('Rodney', $actual[1]['givenname;lang-en'][0]); - $this->assertEquals('Ogasawara', $actual[1]['sn;lang-en'][0]); - $this->assertEquals('Rodney Ogasawara', $actual[1]['cn;lang-en'][0]); - $this->assertEquals('Sales, Director', $actual[1]['title;lang-en'][0]); - } - - public function testDecodeSingleItemWithFoldedAttributesAndEmptyLinesBetween() - { - $data = -"dn: cn=test blabla,ou=example,dc=cno - -objectclass: top - - -objectclass: person - -objectclass: organizationalPerson - -description:: V2hhdCBhIGNhcmVmdWwgcmVhZGVyIHlvdSBhcmUhICBUaGlzIHZhbHVl - - IGlzIGJhc2UtNjQtZW5jb2RlZCBiZWNhdXNlIGl0IGhhcyBhIGNvbnRyb2wgY2hhcmFjdG - - VyIGluIGl0IChhIENSKS4NICBCeSB0aGUgd2F5LCB5b3Ugc2hvdWxkIHJlYWxseSBnZXQg - - b3V0IG1vcmUu - - -verylong: fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8 - - h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb - - 5789thvngwr789cghm738"; - $expected = array( - 'dn' => 'cn=test blabla,ou=example,dc=cno', - 'objectclass' => array('top', 'person', 'organizationalPerson'), - 'description' => array('What a careful reader you are!' . - ' This value is base-64-encoded because it has a ' . - 'control character in it (a CR).' . "\r" . - ' By the way, you should really get out more.'), - 'verylong' => array('fhu08rhvt7b478vt5hv78h45nfgt45h78t34hhhhhhhhhv5bg8' . - 'h6ttttttttt3489t57nhvgh4788trhg8999vnhtgthgui65hgb' . - '5789thvngwr789cghm738'), - ); - $actual = Zend_Ldap_Ldif_Encoder::decode($data); - $this->assertEquals($expected, $actual); - } - - public function testRoundtripEncoding() - { - $node = $this->_createTestNode(); - $ldif = $node->toLdif(); - $data = Zend_Ldap_Ldif_Encoder::decode($ldif); - $expected = array_merge(array('dn' => $node->getDnString()), $node->getData(false)); - $this->assertEquals($expected, $data); - } -} diff --git a/tests/Zend/Ldap/Ldif/SimpleEncoderTest.php b/tests/Zend/Ldap/Ldif/SimpleEncoderTest.php deleted file mode 100644 index e1c8f647b1..0000000000 --- a/tests/Zend/Ldap/Ldif/SimpleEncoderTest.php +++ /dev/null @@ -1,269 +0,0 @@ -assertEquals($expected, Zend_Ldap_Ldif_Encoder::encode($string)); - } - - public static function attributeEncodingProvider() - { - $testData = array( - array(array('dn' => 'cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com'), - 'dn: cn=Barbara Jensen, ou=Product Development, dc=airius, dc=com'), - array(array('dn' => 'cn=Jürgen Österreicher, ou=Äpfel, dc=airius, dc=com'), - 'dn:: ' . base64_encode('cn=Jürgen Österreicher, ou=Äpfel, dc=airius, dc=com')), - array(array('description' => 'Babs is a big sailing fan, and travels extensively in search of perfect sailing conditions.'), - 'description: Babs is a big sailing fan, and travels extensively in search of p' . PHP_EOL . ' erfect sailing conditions.'), - array(array('description' => "CHR(127) \x7f in string"), - 'description:: ' . base64_encode("CHR(127) \x7f in string")), - array(array('description' => '1234567890123456789012345678901234567890123456789012345678901234 567890'), - 'description: 1234567890123456789012345678901234567890123456789012345678901234 ' . PHP_EOL . ' 567890'), - ); - return $testData; - } - - /** - * @dataProvider attributeEncodingProvider - */ - public function testAttributeEncoding($array, $expected) - { - $actual = Zend_Ldap_Ldif_Encoder::encode($array); - $this->assertEquals($expected, $actual); - } - - public function testChangedWrapCount() - { - $input = '56789012345678901234567890'; - $expected = 'dn: 567890' . PHP_EOL . ' 1234567890' . PHP_EOL . ' 1234567890'; - $output = Zend_Ldap_Ldif_Encoder::encode(array('dn' => $input), array('wrap' => 10)); - $this->assertEquals($expected, $output); - } - - public function testEncodeMultipleAttributes() - { - $data = array( - 'a' => array('a', 'b'), - 'b' => 'c', - 'c' => '', - 'd' => array(), - 'e' => array('')); - $expected = 'a: a' . PHP_EOL . - 'a: b' . PHP_EOL . - 'b: c' . PHP_EOL . - 'c: ' . PHP_EOL . - 'd: ' . PHP_EOL . - 'e: '; - $actual = Zend_Ldap_Ldif_Encoder::encode($data); - $this->assertEquals($expected, $actual); - } - - public function testEncodeUnsupportedType() - { - $this->assertNull(Zend_Ldap_Ldif_Encoder::encode(new stdClass())); - } - - public function testSorting() - { - $data=array( - 'cn' => array('name'), - 'dn' => 'cn=name,dc=example,dc=org', - 'host' => array('a', 'b', 'c'), - 'empty' => array(), - 'boolean' => array('TRUE', 'FALSE'), - 'objectclass' => array('account', 'top'), - ); - $expected = 'version: 1' . PHP_EOL . - 'dn: cn=name,dc=example,dc=org' . PHP_EOL . - 'objectclass: account' . PHP_EOL . - 'objectclass: top' . PHP_EOL . - 'boolean: TRUE' . PHP_EOL . - 'boolean: FALSE' . PHP_EOL . - 'cn: name' . PHP_EOL . - 'empty: ' . PHP_EOL . - 'host: a' . PHP_EOL . - 'host: b' . PHP_EOL . - 'host: c'; - $actual = Zend_Ldap_Ldif_Encoder::encode($data); - $this->assertEquals($expected, $actual); - - $expected = 'version: 1' . PHP_EOL . - 'cn: name' . PHP_EOL . - 'dn: cn=name,dc=example,dc=org' . PHP_EOL . - 'host: a' . PHP_EOL . - 'host: b' . PHP_EOL . - 'host: c' . PHP_EOL . - 'empty: ' . PHP_EOL . - 'boolean: TRUE' . PHP_EOL . - 'boolean: FALSE' . PHP_EOL . - 'objectclass: account' . PHP_EOL . - 'objectclass: top'; - $actual = Zend_Ldap_Ldif_Encoder::encode($data, array('sort' => false)); - $this->assertEquals($expected, $actual); - } - - public function testNodeEncoding() - { - $node = $this->_createTestNode(); - $expected = 'version: 1' . PHP_EOL . - 'dn: cn=name,dc=example,dc=org' . PHP_EOL . - 'objectclass: account' . PHP_EOL . - 'objectclass: top' . PHP_EOL . - 'boolean: TRUE' . PHP_EOL . - 'boolean: FALSE' . PHP_EOL . - 'cn: name' . PHP_EOL . - 'empty: ' . PHP_EOL . - 'host: a' . PHP_EOL . - 'host: b' . PHP_EOL . - 'host: c'; - $actual = $node->toLdif(); - $this->assertEquals($expected, $actual); - - $actual = Zend_Ldap_Ldif_Encoder::encode($node); - $this->assertEquals($expected, $actual); - } - - public function testSupressVersionHeader() - { - $data=array( - 'cn' => array('name'), - 'dn' => 'cn=name,dc=example,dc=org', - 'host' => array('a', 'b', 'c'), - 'empty' => array(), - 'boolean' => array('TRUE', 'FALSE'), - 'objectclass' => array('account', 'top'), - ); - $expected = 'dn: cn=name,dc=example,dc=org' . PHP_EOL . - 'objectclass: account' . PHP_EOL . - 'objectclass: top' . PHP_EOL . - 'boolean: TRUE' . PHP_EOL . - 'boolean: FALSE' . PHP_EOL . - 'cn: name' . PHP_EOL . - 'empty: ' . PHP_EOL . - 'host: a' . PHP_EOL . - 'host: b' . PHP_EOL . - 'host: c'; - $actual = Zend_Ldap_Ldif_Encoder::encode($data, array('version' => null)); - $this->assertEquals($expected, $actual); - } - - public function testEncodingWithJapaneseCharacters() - { - $data=array( - 'dn' => 'uid=rogasawara,ou=営業部,o=Airius', - 'objectclass' => array('top', 'person', 'organizationalPerson', 'inetOrgPerson'), - 'uid' => array('rogasawara'), - 'mail' => array('rogasawara@airius.co.jp'), - 'givenname;lang-ja' => array('ロドニー'), - 'sn;lang-ja' => array('å°ç¬ åŽŸ'), - 'cn;lang-ja' => array('å°ç¬ åŽŸ ロドニー'), - 'title;lang-ja' => array('営業部 部長'), - 'preferredlanguage' => array('ja'), - 'givenname' => array('ロドニー'), - 'sn' => array('å°ç¬ åŽŸ'), - 'cn' => array('å°ç¬ åŽŸ ロドニー'), - 'title' => array('営業部 部長'), - 'givenname;lang-ja;phonetic' => array('ã‚ã©ã«ãƒ¼'), - 'sn;lang-ja;phonetic' => array('ãŠãŒã•ã‚ら'), - 'cn;lang-ja;phonetic' => array('ãŠãŒã•ã‚ら ã‚ã©ã«ãƒ¼'), - 'title;lang-ja;phonetic' => array('ãˆã„ãŽã‚‡ã†ã¶ ã¶ã¡ã‚‡ã†'), - 'givenname;lang-en' => array('Rodney'), - 'sn;lang-en' => array('Ogasawara'), - 'cn;lang-en' => array('Rodney Ogasawara'), - 'title;lang-en' => array('Sales, Director'), - ); - $expected = 'dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz' . PHP_EOL . - 'objectclass: top' . PHP_EOL . - 'objectclass: person' . PHP_EOL . - 'objectclass: organizationalPerson' . PHP_EOL . - 'objectclass: inetOrgPerson' . PHP_EOL . - 'uid: rogasawara' . PHP_EOL . - 'mail: rogasawara@airius.co.jp' . PHP_EOL . - 'givenname;lang-ja:: 44Ot44OJ44OL44O8' . PHP_EOL . - 'sn;lang-ja:: 5bCP56yg5Y6f' . PHP_EOL . - 'cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==' . PHP_EOL . - 'title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==' . PHP_EOL . - 'preferredlanguage: ja' . PHP_EOL . - 'givenname:: 44Ot44OJ44OL44O8' . PHP_EOL . - 'sn:: 5bCP56yg5Y6f' . PHP_EOL . - 'cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==' . PHP_EOL . - 'title:: 5Za25qWt6YOoIOmDqOmVtw==' . PHP_EOL . - 'givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8' . PHP_EOL . - 'sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ' . PHP_EOL . - 'cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==' . PHP_EOL . - 'title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==' . PHP_EOL . - 'givenname;lang-en: Rodney' . PHP_EOL . - 'sn;lang-en: Ogasawara' . PHP_EOL . - 'cn;lang-en: Rodney Ogasawara' . PHP_EOL . - 'title;lang-en: Sales, Director'; - $actual = Zend_Ldap_Ldif_Encoder::encode($data, array('sort' => false, 'version' => null)); - $this->assertEquals($expected, $actual); - } -} diff --git a/tests/Zend/Ldap/Node/AllTests.php b/tests/Zend/Ldap/Node/AllTests.php deleted file mode 100644 index 448442ee42..0000000000 --- a/tests/Zend/Ldap/Node/AllTests.php +++ /dev/null @@ -1,93 +0,0 @@ -addTestSuite('Zend_Ldap_Node_OfflineTest'); - $suite->addTestSuite('Zend_Ldap_Node_AttributeIterationTest'); - - if (defined('TESTS_ZEND_LDAP_ONLINE_ENABLED') - && constant('TESTS_ZEND_LDAP_ONLINE_ENABLED')) { - $suite->addTestSuite('Zend_Ldap_Node_OnlineTest'); - $suite->addTestSuite('Zend_Ldap_Node_ChildrenTest'); - $suite->addTestSuite('Zend_Ldap_Node_ChildrenIterationTest'); - $suite->addTestSuite('Zend_Ldap_Node_UpdateTest'); - $suite->addTestSuite('Zend_Ldap_Node_RootDseTest'); - $suite->addTestSuite('Zend_Ldap_Node_SchemaTest'); - } else { - $suite->addTest(new Zend_Ldap_Node_SkipOnlineTests()); - } - - return $suite; - } -} - -class Zend_Ldap_Node_SkipOnlineTests extends PHPUnit_Framework_TestCase -{ - public function setUp() - { - $this->markTestSkipped('Zend_Ldap_Node online tests not enabled in TestConfiguration.php'); - } - - public function testNothing() - { - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Ldap_Node_AllTests::main') { - Zend_Ldap_Node_AllTests::main(); -} diff --git a/tests/Zend/Ldap/Node/AttributeIterationTest.php b/tests/Zend/Ldap/Node/AttributeIterationTest.php deleted file mode 100644 index 937e6b5764..0000000000 --- a/tests/Zend/Ldap/Node/AttributeIterationTest.php +++ /dev/null @@ -1,64 +0,0 @@ -_createTestNode(); - $i=0; - $data=array(); - foreach ($node->getAttributes() as $k => $v) { - $this->assertNotNull($k); - $this->assertNotNull($v); - $this->assertEquals($node->$k, $v); - $data[$k]=$v; - $i++; - } - $this->assertEquals(5, $i); - $this->assertEquals($i, count($node)); - $this->assertEquals(array( - 'boolean' => array(true, false), - 'cn' => array('name'), - 'empty' => array(), - 'host' => array('a', 'b', 'c'), - 'objectclass' => array('account', 'top')), $data); - } -} diff --git a/tests/Zend/Ldap/Node/ChildrenIterationTest.php b/tests/Zend/Ldap/Node/ChildrenIterationTest.php deleted file mode 100644 index 3a848b3792..0000000000 --- a/tests/Zend/Ldap/Node/ChildrenIterationTest.php +++ /dev/null @@ -1,125 +0,0 @@ -_prepareLdapServer(); - } - - protected function tearDown() - { - $this->_cleanupLdapServer(); - parent::tearDown(); - } - - public function testSimpleIteration() - { - $node=$this->_getLdap()->getBaseNode(); - $children=$node->getChildren(); - - $i=1; - foreach ($children as $rdn => $n) { - $dn=$n->getDn()->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $rdn=Zend_Ldap_Dn::implodeRdn($n->getRdnArray(), Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - if ($i==1) { - $this->assertEquals('ou=Node', $rdn); - $this->assertEquals($this->_createDn('ou=Node,'), $dn); - } - else { - $this->assertEquals('ou=Test' . ($i-1), $rdn); - $this->assertEquals($this->_createDn('ou=Test' . ($i-1) . ','), $dn); - } - $i++; - } - $this->assertEquals(6, $i-1); - } - - public function testSimpleRecursiveIteration() - { - $node=$this->_getLdap()->getBaseNode(); - $ri=new RecursiveIteratorIterator($node, RecursiveIteratorIterator::SELF_FIRST); - $i=0; - foreach ($ri as $rdn => $n) { - $dn=$n->getDn()->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $rdn=Zend_Ldap_Dn::implodeRdn($n->getRdnArray(), Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - if ($i==0) { - $this->assertEquals(Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE) - ->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER), $dn); - } - else if ($i==1) { - $this->assertEquals('ou=Node', $rdn); - $this->assertEquals($this->_createDn('ou=Node,'), $dn); - } - else { - if ($i<4) { - $j=$i-1; - $base=$this->_createDn('ou=Node,'); - } - else { - $j=$i-3; - $base=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE) - ->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - } - $this->assertEquals('ou=Test' . $j, $rdn); - $this->assertEquals('ou=Test' . $j . ',' . $base, $dn); - } - $i++; - } - $this->assertEquals(9, $i); - } - - /** - * Test issue reported by Lance Hendrix on - * http://framework.zend.com/wiki/display/ZFPROP/Zend_Ldap+-+Extended+support+-+Stefan+Gehrig? - * focusedCommentId=13107431#comment-13107431 - */ - public function testCallingNextAfterIterationShouldNotThrowException() - { - $node = $this->_getLdap()->getBaseNode(); - $nodes = $node->searchChildren('(objectClass=*)'); - foreach ($nodes as $rdn => $n) { - // do nothing - just iterate - } - $nodes->next(); - } -} diff --git a/tests/Zend/Ldap/Node/ChildrenTest.php b/tests/Zend/Ldap/Node/ChildrenTest.php deleted file mode 100644 index 0cdd3424f8..0000000000 --- a/tests/Zend/Ldap/Node/ChildrenTest.php +++ /dev/null @@ -1,207 +0,0 @@ -_prepareLdapServer(); - } - - protected function tearDown() - { - $this->_cleanupLdapServer(); - parent::tearDown(); - } - - public function testGetChildrenOnAttachedNode() - { - $node=$this->_getLdap()->getBaseNode(); - $children=$node->getChildren(); - $this->assertTrue($children instanceof Zend_Ldap_Node_ChildrenIterator); - $this->assertEquals(6, count($children)); - $this->assertTrue($children['ou=Node'] instanceof Zend_Ldap_Node); - } - - public function testGetChildrenOnDetachedNode() - { - $node=$this->_getLdap()->getBaseNode(); - $node->detachLdap(); - $children=$node->getChildren(); - $this->assertTrue($children instanceof Zend_Ldap_Node_ChildrenIterator); - $this->assertEquals(0, count($children)); - - $node->attachLdap($this->_getLdap()); - $node->reload(); - $children=$node->getChildren(); - - $this->assertTrue($children instanceof Zend_Ldap_Node_ChildrenIterator); - $this->assertEquals(6, count($children)); - $this->assertTrue($children['ou=Node'] instanceof Zend_Ldap_Node); - } - - public function testHasChildrenOnAttachedNode() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $this->assertTrue($node->hasChildren()); - $this->assertTrue($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $this->assertTrue($node->hasChildren()); - $this->assertTrue($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,')); - $this->assertFalse($node->hasChildren()); - $this->assertFalse($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,ou=Node,')); - $this->assertFalse($node->hasChildren()); - $this->assertFalse($node->hasChildren()); - } - - public function testHasChildrenOnDetachedNodeWithoutPriorGetChildren() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,')); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,ou=Node,')); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - } - - public function testHasChildrenOnDetachedNodeWithPriorGetChildren() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $node->getChildren(); - $node->detachLdap(); - $this->assertTrue($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $node->getChildren(); - $node->detachLdap(); - $this->assertTrue($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,')); - $node->getChildren(); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Test1,ou=Node,')); - $node->getChildren(); - $node->detachLdap(); - $this->assertFalse($node->hasChildren()); - } - - public function testChildrenCollectionSerialization() - { - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - - $children=$node->getChildren(); - $this->assertTrue($node->hasChildren()); - $this->assertEquals(2, count($children)); - - $string=serialize($node); - $node2=unserialize($string); - - $children2=$node2->getChildren(); - $this->assertTrue($node2->hasChildren()); - $this->assertEquals(2, count($children2)); - - $node2->attachLdap($this->_getLdap()); - - $children2=$node2->getChildren(); - $this->assertTrue($node2->hasChildren()); - $this->assertEquals(2, count($children2)); - - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $this->assertTrue($node->hasChildren()); - $string=serialize($node); - $node2=unserialize($string); - $this->assertFalse($node2->hasChildren()); - $node2->attachLdap($this->_getLdap()); - $this->assertTrue($node2->hasChildren()); - } - - public function testCascadingAttachAndDetach() - { - $node=$this->_getLdap()->getBaseNode(); - $baseChildren=$node->getChildren(); - $nodeChildren=$baseChildren['ou=Node']->getChildren(); - - $this->assertTrue($node->isAttached()); - foreach ($baseChildren as $bc) { - $this->assertTrue($bc->isAttached()); - } - foreach ($nodeChildren as $nc) { - $this->assertTrue($nc->isAttached()); - } - - $node->detachLdap(); - $this->assertFalse($node->isAttached()); - foreach ($baseChildren as $bc) { - $this->assertFalse($bc->isAttached()); - } - foreach ($nodeChildren as $nc) { - $this->assertFalse($nc->isAttached()); - } - - $node->attachLdap($this->_getLdap()); - $this->assertTrue($node->isAttached()); - $this->assertSame($this->_getLdap(), $node->getLdap()); - foreach ($baseChildren as $bc) { - $this->assertTrue($bc->isAttached()); - $this->assertSame($this->_getLdap(), $bc->getLdap()); - } - foreach ($nodeChildren as $nc) { - $this->assertTrue($nc->isAttached()); - $this->assertSame($this->_getLdap(), $nc->getLdap()); - } - } -} diff --git a/tests/Zend/Ldap/Node/OfflineTest.php b/tests/Zend/Ldap/Node/OfflineTest.php deleted file mode 100644 index 3c3816c55a..0000000000 --- a/tests/Zend/Ldap/Node/OfflineTest.php +++ /dev/null @@ -1,672 +0,0 @@ -assertEquals(date('YmdHis\Z', $timestamp), $value); - } - - protected function _assertUtcDateTimeString($localTimestamp, $value) - { - $localOffset = date('Z', $localTimestamp); - $utcTimestamp = $localTimestamp - $localOffset; - $this->assertEquals(date('YmdHis', $utcTimestamp) . 'Z', $value); - } - - public function testCreateFromArrayStringDn() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertFalse($node->isAttached()); - $this->assertFalse($node->willBeDeleted()); - $this->assertFalse($node->willBeMoved()); - $this->assertTrue($node->isNew()); - } - - public function testCreateFromArrayObjectDn() - { - $data=$this->_createTestArrayData(); - $data['dn']=Zend_Ldap_Dn::fromString($data['dn']); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertFalse($node->isAttached()); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testCreateFromArrayMissingDn() - { - $data=$this->_createTestArrayData(); - unset($data['dn']); - $node=Zend_Ldap_Node::fromArray($data); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testCreateFromArrayIllegalDn() - { - $data=$this->_createTestArrayData(); - $data['dn']=5; - $node=Zend_Ldap_Node::fromArray($data); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testCreateFromArrayMalformedDn() - { - $data=$this->_createTestArrayData(); - $data['dn']='name1,cn=name2,dc=example,dc=org'; - $node=Zend_Ldap_Node::fromArray($data); - } - - public function testCreateFromArrayAndEnsureRdnValues() - { - $data=$this->_createTestArrayData(); - $data['dn']=Zend_Ldap_Dn::fromString($data['dn']); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertFalse($node->isAttached()); - unset($data['dn']); - $this->assertEquals($data, $node->getData()); - } - - public function testGetDnString() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertEquals($data['dn'], $node->getDnString()); - } - - public function testGetDnArray() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - $exA=Zend_Ldap_Dn::explodeDn($data['dn']); - $this->assertEquals($exA, $node->getDnArray()); - } - - public function testGetDnObject() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - $compareDn=Zend_Ldap_Dn::fromString('cn=name,dc=example,dc=org'); - $this->assertEquals($compareDn, $node->getDn()); - $this->assertNotSame($node->getDn(), $node->getDn()); - } - - public function testGetRdnString() - { - $node=$this->_createTestNode(); - $this->assertEquals('cn=name', $node->getRdnString()); - } - - public function testGetRdnArray() - { - $node=$this->_createTestNode(); - $this->assertEquals(array('cn' => 'name'), $node->getRdnArray()); - } - - public function testSerialize() - { - $node=$this->_createTestNode(); - $sdata=serialize($node); - $newObject=unserialize($sdata); - $this->assertEquals($node, $newObject); - } - - public function testToString() - { - $node=$this->_createTestNode(); - $this->assertEquals('cn=name,dc=example,dc=org', $node->toString()); - $this->assertEquals('cn=name,dc=example,dc=org', (string)$node); - } - - public function testToArray() - { - $node=$this->_createTestNode(); - $this->assertEquals(array( - 'dn' => 'cn=name,dc=example,dc=org', - 'cn' => array('name'), - 'host' => array('a', 'b', 'c'), - 'empty' => array(), - 'boolean' => array(true, false), - 'objectclass' => array('account', 'top'), - ), $node->toArray()); - } - - public function testToJson() - { - $node=$this->_createTestNode(); - $this->assertEquals('{"dn":"cn=name,dc=example,dc=org",' . - '"boolean":[true,false],' . - '"cn":["name"],' . - '"empty":[],' . - '"host":["a","b","c"],' . - '"objectclass":["account","top"]}', $node->toJson()); - } - - public function testGetData() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - ksort($data, SORT_STRING); - unset($data['dn']); - $this->assertEquals($data, $node->getData()); - } - - public function testGetObjectClass() - { - $node=$this->_createTestNode(); - $this->assertEquals(array('account', 'top'), $node->getObjectClass()); - } - - public function testModifyObjectClass() - { - $node=$this->_createTestNode(); - $this->assertEquals(array('account', 'top'), $node->getObjectClass()); - - $node->setObjectClass('domain'); - $this->assertEquals(array('domain'), $node->getObjectClass()); - - $node->setObjectClass(array('account', 'top')); - $this->assertEquals(array('account', 'top'), $node->getObjectClass()); - - $node->appendObjectClass('domain'); - $this->assertEquals(array('account', 'top', 'domain'), $node->getObjectClass()); - - $node->setObjectClass('domain'); - $node->appendObjectClass(array('account', 'top')); - $this->assertEquals(array('domain', 'account', 'top'), $node->getObjectClass()); - } - - public function testGetAttributes() - { - $node=$this->_createTestNode(); - $expected=array( - 'boolean' => array(true, false), - 'cn' => array('name'), - 'empty' => array(), - 'host' => array('a', 'b', 'c'), - 'objectclass' => array('account', 'top'), - ); - $this->assertEquals($expected, $node->getAttributes()); - $this->assertFalse($node->willBeDeleted()); - $this->assertFalse($node->willBeMoved()); - $this->assertFalse($node->isNew()); - - $node->delete(); - $this->assertTrue($node->willBeDeleted()); - } - - public function testAppendToAttributeFirstTime() - { - $node=$this->_createTestNode(); - $node->appendToAttribute('host', 'newHost'); - $ts=mktime(12, 30, 30, 6, 25, 2008); - $node->appendToDateTimeAttribute('objectClass', $ts); - $this->assertEquals('newHost', $node->host[3]); - $this->assertEquals($ts, $node->getDateTimeAttribute('objectClass', 2)); - } - - public function testExistsAttribute() - { - $node=$this->_createTestNode(); - $this->assertFalse($node->existsAttribute('nonExistant')); - $this->assertFalse($node->existsAttribute('empty', false)); - $this->assertTrue($node->existsAttribute('empty', true)); - - $node->newEmpty=null; - $this->assertFalse($node->existsAttribute('newEmpty', false)); - $this->assertTrue($node->existsAttribute('newEmpty', true)); - - $node->empty='string'; - $this->assertTrue($node->existsAttribute('empty', false)); - $this->assertTrue($node->existsAttribute('empty', true)); - - $node->deleteAttribute('empty'); - $this->assertFalse($node->existsAttribute('empty', false)); - $this->assertTrue($node->existsAttribute('empty', true)); - } - - public function testGetSetAndDeleteMethods() - { - $timezone = date_default_timezone_get(); - date_default_timezone_set('GMT'); - - $node=$this->_createTestNode(); - - $node->setAttribute('key', 'value1'); - $this->assertEquals('value1', $node->getAttribute('key', 0)); - $node->appendToAttribute('key', 'value2'); - $this->assertEquals('value1', $node->getAttribute('key', 0)); - $this->assertEquals('value2', $node->getAttribute('key', 1)); - $this->assertTrue($node->existsAttribute('key', true)); - $this->assertTrue($node->existsAttribute('key', false)); - $node->deleteAttribute('key'); - $this->assertEquals(0, count($node->getAttribute('key'))); - $this->assertTrue($node->existsAttribute('key', true)); - $this->assertFalse($node->existsAttribute('key', false)); - - $ts=mktime(12, 30, 30, 6, 25, 2008); - $node->setDateTimeAttribute('key', $ts, false); - $this->_assertLocalDateTimeString($ts, $node->getAttribute('key', 0)); - $this->assertEquals($ts, $node->getDateTimeAttribute('key', 0)); - $node->appendToDateTimeAttribute('key', $ts, true); - $this->_assertLocalDateTimeString($ts, $node->getAttribute('key', 0)); - $this->assertEquals($ts, $node->getDateTimeAttribute('key', 0)); - $this->_assertUtcDateTimeString($ts, $node->getAttribute('key', 1)); - $this->assertEquals($ts, $node->getDateTimeAttribute('key', 1)); - $this->assertTrue($node->existsAttribute('key', true)); - $this->assertTrue($node->existsAttribute('key', false)); - $node->deleteAttribute('key'); - $this->assertEquals(0, count($node->getAttribute('key'))); - $this->assertTrue($node->existsAttribute('key', true)); - $this->assertFalse($node->existsAttribute('key', false)); - - $node->setPasswordAttribute('pa$$w0rd', Zend_Ldap_Attribute::PASSWORD_HASH_MD5); - $this->assertEquals('{MD5}bJuLJ96h3bhF+WqiVnxnVA==', $node->getAttribute('userPassword', 0)); - $this->assertTrue($node->existsAttribute('userPassword', true)); - $this->assertTrue($node->existsAttribute('userPassword', false)); - $node->deleteAttribute('userPassword'); - $this->assertEquals(0, count($node->getAttribute('userPassword'))); - $this->assertTrue($node->existsAttribute('userPassword', true)); - $this->assertFalse($node->existsAttribute('userPassword', false)); - - date_default_timezone_set($timezone); - } - - public function testOverloading() - { - $node=$this->_createTestNode(); - - $node->key='value1'; - $this->assertEquals('value1', $node->key[0]); - $this->assertTrue(isset($node->key)); - unset($node->key); - $this->assertEquals(0, count($node->key)); - $this->assertFalse(isset($node->key)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testIllegalAttributeAccessRdnAttributeSet() - { - $node=$this->_createTestNode(); - $node->cn='test'; - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testIllegalAttributeAccessDnSet() - { - $node=$this->_createTestNode(); - $node->dn='test'; - } - - public function testAttributeAccessDnGet() - { - $node=$this->_createTestNode(); - $this->assertTrue(is_string($node->dn)); - $this->assertEquals($node->getDn()->toString(), $node->dn); - } - - public function testArrayAccess() - { - $node=$this->_createTestNode(); - - $node['key']='value1'; - $this->assertEquals('value1', $node['key'][0]); - $this->assertTrue(isset($node['key'])); - unset($node['key']); - $this->assertEquals(0, count($node['key'])); - $this->assertFalse(isset($node['key'])); - } - - public function testCreateEmptyNode() - { - $dn='cn=name,dc=example,dc=org'; - $objectClass=array('account', 'test', 'inetOrgPerson'); - $node=Zend_Ldap_Node::create($dn, $objectClass); - $this->assertEquals($dn, $node->getDnString()); - $this->assertEquals('cn=name', $node->getRdnString()); - $this->assertEquals('name', $node->cn[0]); - $this->assertEquals($objectClass, $node->objectClass); - $this->assertFalse($node->willBeDeleted()); - $this->assertFalse($node->willBeMoved()); - $this->assertTrue($node->isNew()); - - $node->delete(); - $this->assertTrue($node->willBeDeleted()); - } - - public function testGetChangedData() - { - $node=$this->_createTestNode(); - $node->host=array('d'); - $node->empty='not Empty'; - unset($node->objectClass); - $changedData=$node->getChangedData(); - $this->assertEquals(array('d'), $changedData['host']); - $this->assertEquals(array('not Empty'), $changedData['empty']); - $this->assertEquals(array(), $changedData['objectclass']); - } - - public function testDeleteUnusedAttribute() - { - $node=$this->_createTestNode(); - $node->deleteAttribute('nonexistant'); - $changedData=$node->getChangedData(); - $this->assertArrayNotHasKey('nonexistant', $changedData); - } - - public function testRenameNodeString() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - - $newDnString='cn=test+ou=Lab+uid=tester,cn=name,dc=example,dc=org'; - $node->setDn($newDnString); - $this->assertEquals($data['dn'], $node->getCurrentDn()->toString()); - $this->assertEquals($newDnString, $node->getDn()->toString()); - $this->assertEquals(array('test'), $node->cn); - $this->assertEquals(array('tester'), $node->uid); - $this->assertEquals(array('Lab'), $node->ou); - - $this->assertFalse($node->willBeDeleted()); - $this->assertFalse($node->willBeMoved()); - $this->assertTrue($node->isNew()); - } - - public function testRenameNodeArray() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - - $newDnArray=array( - array('uid' => 'tester'), - array('dc' => 'example'), - array('dc' => 'org')); - - $node->setDn($newDnArray); - $this->assertEquals($data['dn'], $node->getCurrentDn()->toString()); - $this->assertEquals($newDnArray, $node->getDn()->toArray()); - $this->assertEquals(array('name'), $node->cn); - } - - public function testRenameNodeDnObject() - { - $data=$this->_createTestArrayData(); - $node=Zend_Ldap_Node::fromArray($data); - - $newDn=Zend_Ldap_Dn::fromString('cn=test+ou=Lab+uid=tester,cn=name,dc=example,dc=org'); - $node->setDn($newDn); - $this->assertEquals($data['dn'], $node->getCurrentDn()->toString()); - $this->assertEquals($newDn, $node->getDn()); - $this->assertEquals(array('test'), $node->cn); - $this->assertEquals(array('tester'), $node->uid); - $this->assertEquals(array('Lab'), $node->ou); - } - - public function testRenameNodeFromDataSource() - { - $node=$this->_createTestNode(); - $newDnString='cn=test+ou=Lab+uid=tester,cn=name,dc=example,dc=org'; - $node->rename($newDnString); - - $this->assertFalse($node->willBeDeleted()); - $this->assertTrue($node->willBeMoved()); - $this->assertFalse($node->isNew()); - } - - public function testDnObjectCloning() - { - $node1=$this->_createTestNode(); - $dn1=Zend_Ldap_Dn::fromString('cn=name2,dc=example,dc=org'); - $node1->setDn($dn1); - $dn1->prepend(array('cn' => 'name')); - $this->assertNotEquals($dn1->toString(), $node1->getDn()->toString()); - - $dn2=Zend_Ldap_Dn::fromString('cn=name2,dc=example,dc=org'); - $node2=Zend_Ldap_Node::create($dn2); - $dn2->prepend(array('cn' => 'name')); - $this->assertNotEquals($dn2->toString(), $node2->getDn()->toString()); - - $dn3=Zend_Ldap_Dn::fromString('cn=name2,dc=example,dc=org'); - $node3=Zend_Ldap_Node::fromArray(array( - 'dn' => $dn3, - 'ou' => 'Test'), false); - $dn3->prepend(array('cn' => 'name')); - $this->assertNotEquals($dn3->toString(), $node3->getDn()->toString()); - } - - public function testGetChanges() - { - $node=$this->_createTestNode(); - $node->host=array('d'); - $node->empty='not Empty'; - unset($node->boolean); - $changes=$node->getChanges(); - $this->assertEquals(array( - 'add' => array( - 'empty' => array('not Empty') - ), - 'delete' => array( - 'boolean' => array() - ), - 'replace' => array( - 'host' => array('d') - ) - ), $changes); - - $node=Zend_Ldap_Node::create('uid=test,dc=example,dc=org', array('account')); - $node->host='host'; - unset($node->cn); - unset($node['sn']); - $node['givenName']='givenName'; - $node->appendToAttribute('objectClass', 'domain'); - $this->assertEquals(array( - 'uid' => array('test'), - 'objectclass' => array('account', 'domain'), - 'host' => array('host'), - 'givenname' => array('givenName') - ), $node->getChangedData()); - $this->assertEquals(array( - 'add' => array( - 'uid' => array('test'), - 'objectclass' => array('account', 'domain'), - 'host' => array('host'), - 'givenname' => array('givenName'), - ), - 'delete' => array(), - 'replace' => array() - ), $node->getChanges()); - } - - public function testHasValue() - { - $node=$this->_createTestNode(); - - $this->assertTrue($node->attributeHasValue('cn', 'name')); - $this->assertFalse($node->attributeHasValue('cn', 'noname')); - $this->assertTrue($node->attributeHasValue('boolean', true)); - $this->assertTrue($node->attributeHasValue('boolean', false)); - - $this->assertTrue($node->attributeHasValue('host', array('a', 'b'))); - $this->assertTrue($node->attributeHasValue('host', array('a', 'b', 'c'))); - $this->assertFalse($node->attributeHasValue('host', array('a', 'b', 'c', 'd'))); - $this->assertTrue($node->attributeHasValue('boolean', array(true, false))); - } - - public function testRemoveDuplicates() - { - $node=$this->_createTestNode(); - $node->strings1= array('value1', 'value2', 'value2', 'value3'); - $node->strings2= array('value1', 'value2', 'value3', 'value4'); - $node->boolean1= array(true, true, true, true); - $node->boolean2= array(true, false, true, false); - - $expected=array( - 'cn' => array('name'), - 'host' => array('a', 'b', 'c'), - 'empty' => array(), - 'boolean' => array('TRUE', 'FALSE'), - 'objectclass' => array('account', 'top'), - 'strings1' => array('value1', 'value2', 'value3'), - 'strings2' => array('value1', 'value2', 'value3', 'value4'), - 'boolean1' => array('TRUE'), - 'boolean2' => array('TRUE', 'FALSE'), - ); - - $node->removeDuplicatesFromAttribute('strings1'); - $node->removeDuplicatesFromAttribute('strings2'); - $node->removeDuplicatesFromAttribute('boolean1'); - $node->removeDuplicatesFromAttribute('boolean2'); - $this->assertEquals($expected, $node->getData(false)); - } - - public function testRemoveFromAttributeSimple() - { - $node=$this->_createTestNode(); - $node->test=array('value1', 'value2', 'value3', 'value3'); - $node->removeFromAttribute('test', 'value2'); - $this->assertEquals(array('value1', 'value3', 'value3'), $node->test); - } - - public function testRemoveFromAttributeArray() - { - $node=$this->_createTestNode(); - $node->test=array('value1', 'value2', 'value3', 'value3'); - $node->removeFromAttribute('test', array('value1', 'value2')); - $this->assertEquals(array('value3', 'value3'), $node->test); - } - - public function testRemoveFromAttributeMultipleSimple() - { - $node=$this->_createTestNode(); - $node->test=array('value1', 'value2', 'value3', 'value3'); - $node->removeFromAttribute('test', 'value3'); - $this->assertEquals(array('value1', 'value2'), $node->test); - } - - public function testRemoveFromAttributeMultipleArray() - { - $node=$this->_createTestNode(); - $node->test=array('value1', 'value2', 'value3', 'value3'); - $node->removeFromAttribute('test', array('value1', 'value3')); - $this->assertEquals(array('value2'), $node->test); - } - - /** - * ZF-11611 - */ - public function testRdnAttributesHandleMultiValuedAttribute() - { - $data = array( - 'dn' => 'cn=funkygroup,ou=Groupes,dc=domain,dc=local', - 'objectClass' => array( - 'groupOfNames', - 'top', - ), - 'cn' => array( - 'The Funkygroup', - 'funkygroup', - ), - 'member' => 'uid=john-doe,ou=Users,dc=domain,dc=local', - ); - - $node = Zend_Ldap_Node::fromArray($data, true); - $changedData = $node->getChangedData(); - $this->assertTrue(empty($changedData)); - } - - /** - * ZF-11611 - */ - public function testRdnAttributesHandleMultiValuedAttribute2() - { - $data = array( - 'dn' => 'cn=funkygroup,ou=Groupes,dc=domain,dc=local', - 'objectClass' => array( - 'groupOfNames', - 'top', - ), - 'member' => 'uid=john-doe,ou=Users,dc=domain,dc=local', - ); - - $node = Zend_Ldap_Node::fromArray($data, true); - $cn = $node->getAttribute('cn'); - $this->assertEquals(array( - 0 => 'funkygroup' - ), $cn); - } - - /** - * ZF-11611 - */ - public function testRdnAttributesHandleMultiValuedAttribute3() - { - $data = array( - 'dn' => 'cn=funkygroup,ou=Groupes,dc=domain,dc=local', - 'objectClass' => array( - 'groupOfNames', - 'top', - ), - 'cn' => array( - 0 => 'The Funkygroup' - ), - 'member' => 'uid=john-doe,ou=Users,dc=domain,dc=local', - ); - - $node = Zend_Ldap_Node::fromArray($data, true); - $cn = $node->getAttribute('cn'); - $this->assertEquals(array( - 0 => 'The Funkygroup', - 1 => 'funkygroup', - ), $cn); - } -} diff --git a/tests/Zend/Ldap/Node/OnlineTest.php b/tests/Zend/Ldap/Node/OnlineTest.php deleted file mode 100644 index c3f4978c3d..0000000000 --- a/tests/Zend/Ldap/Node/OnlineTest.php +++ /dev/null @@ -1,289 +0,0 @@ -_prepareLdapServer(); - } - - protected function tearDown() - { - $this->_cleanupLdapServer(); - parent::tearDown(); - } - - public function testLoadFromLdap() - { - $dn=$this->_createDn('ou=Test1,'); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertTrue($node->isAttached()); - } - - public function testChangeReadOnlySystemAttributes() - { - $node=$this->_getLdap()->getBaseNode(); - try { - $node->setAttribute('createTimestamp', false); - $this->fail('Expected exception for modification of read-only attribute createTimestamp'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot change attribute because it\'s read-only', $e->getMessage()); - } - try { - $node->createTimestamp=false; - $this->fail('Expected exception for modification of read-only attribute createTimestamp'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot change attribute because it\'s read-only', $e->getMessage()); - } - try { - $node['createTimestamp']=false; - $this->fail('Expected exception for modification of read-only attribute createTimestamp'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot change attribute because it\'s read-only', $e->getMessage()); - } - try { - $node->appendToAttribute('createTimestamp', 'value'); - $this->fail('Expected exception for modification of read-only attribute createTimestamp'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot change attribute because it\'s read-only', $e->getMessage()); - } - try { - $rdn=$node->getRdnArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $attr=key($rdn); - $node->deleteAttribute($attr); - $this->fail('Expected exception for modification of read-only attribute ' . $attr); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals('Cannot change attribute because it\'s part of the RDN', $e->getMessage()); - } - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testLoadFromLdapIllegalEntry() - { - $dn=$this->_createDn('ou=Test99,'); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - } - - public function testDetachAndReattach() - { - $dn=$this->_createDn('ou=Test1,'); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertTrue($node->isAttached()); - $node->detachLdap(); - $this->assertFalse($node->isAttached()); - $node->attachLdap($this->_getLdap()); - $this->assertTrue($node->isAttached()); - } - - public function testSerialize() - { - $dn=$this->_createDn('ou=Test1,'); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $sdata=serialize($node); - $newObject=unserialize($sdata); - $this->assertFalse($newObject->isAttached()); - $this->assertTrue($node->isAttached()); - $this->assertEquals($sdata, serialize($newObject)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testAttachToInvalidLdap() - { - $data=array( - 'dn' => 'ou=name,dc=example,dc=org', - 'ou' => array('name'), - 'l' => array('a', 'b', 'c'), - 'objectClass' => array('organizationalUnit', 'top'), - ); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertFalse($node->isAttached()); - $node->attachLdap($this->_getLdap()); - } - - public function testAttachToValidLdap() - { - $data=array( - 'dn' => $this->_createDn('ou=name,'), - 'ou' => array('name'), - 'l' => array('a', 'b', 'c'), - 'objectClass' => array('organizationalUnit', 'top'), - ); - $node=Zend_Ldap_Node::fromArray($data); - $this->assertFalse($node->isAttached()); - $node->attachLdap($this->_getLdap()); - $this->assertTrue($node->isAttached()); - } - - public function testExistsDn() - { - $data=array( - 'dn' => $this->_createDn('ou=name,'), - 'ou' => array('name'), - 'l' => array('a', 'b', 'c'), - 'objectClass' => array('organizationalUnit', 'top'), - ); - $node1=Zend_Ldap_Node::fromArray($data); - $node1->attachLdap($this->_getLdap()); - $this->assertFalse($node1->exists()); - $dn=$this->_createDn('ou=Test1,'); - $node2=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $this->assertTrue($node2->exists()); - } - - public function testReload() - { - $dn=$this->_createDn('ou=Test1,'); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $node->reload(); - $this->assertEquals($dn, $node->getDn()->toString()); - $this->assertEquals('ou=Test1', $node->getRdnString()); - } - - public function testGetNode() - { - $dn=$this->_createDn('ou=Test1,'); - $node=$this->_getLdap()->getNode($dn); - $this->assertEquals($dn, $node->getDn()->toString()); - $this->assertEquals("Test1", $node->getAttribute('ou', 0)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testGetIllegalNode() - { - $dn=$this->_createDn('ou=Test99,'); - $node=$this->_getLdap()->getNode($dn); - } - - public function testGetBaseNode() - { - $node=$this->_getLdap()->getBaseNode(); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $node->getDnString()); - - $dn=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dn[0]['ou'], $node->getAttribute('ou', 0)); - } - - public function testSearchSubtree() - { - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $items=$node->searchSubtree('(objectClass=organizationalUnit)', Zend_Ldap::SEARCH_SCOPE_SUB, - array(), 'ou'); - $this->assertTrue($items instanceof Zend_Ldap_Node_Collection); - $this->assertEquals(3, $items->count()); - - $i=0; - $dns=array( - $this->_createDn('ou=Node,'), - $this->_createDn('ou=Test1,ou=Node,'), - $this->_createDn('ou=Test2,ou=Node,')); - foreach ($items as $key => $node) { - $key=Zend_Ldap_Dn::fromString($key)->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - $this->assertEquals($dns[$i], $key); - if ($i === 0) { - $this->assertEquals('Node', $node->ou[0]); - } else { - $this->assertEquals('Test' . $i, $node->ou[0]); - } - $this->assertEquals($key, $node->getDnString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - $i++; - } - $this->assertEquals(3, $i); - } - - public function testCountSubtree() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $this->assertEquals(9, $node->countSubtree('(objectClass=organizationalUnit)', - Zend_Ldap::SEARCH_SCOPE_SUB)); - } - - public function testCountChildren() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $this->assertEquals(6, $node->countChildren()); - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $this->assertEquals(2, $node->countChildren()); - } - - public function testSearchChildren() - { - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $this->assertEquals(2, $node->searchChildren('(objectClass=*)', array(), 'ou')->count()); - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $this->assertEquals(6, $node->searchChildren('(objectClass=*)', array(), 'ou')->count()); - } - - public function testGetParent() - { - $node=$this->_getLdap()->getNode($this->_createDn('ou=Node,')); - $pnode=$node->getParent(); - $this->assertEquals(Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE) - ->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER), - $pnode->getDnString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testGetNonexistantParent() - { - $node=$this->_getLdap()->getNode(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $pnode=$node->getParent(); - } - - public function testLoadFromLdapWithDnObject() - { - $dn=Zend_Ldap_Dn::fromString($this->_createDn('ou=Test1,')); - $node=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $this->assertTrue($node instanceof Zend_Ldap_Node); - $this->assertTrue($node->isAttached()); - } -} diff --git a/tests/Zend/Ldap/Node/RootDseTest.php b/tests/Zend/Ldap/Node/RootDseTest.php deleted file mode 100644 index 0a1d020ebd..0000000000 --- a/tests/Zend/Ldap/Node/RootDseTest.php +++ /dev/null @@ -1,177 +0,0 @@ -_getLdap()->getRootDse(); - $root2=$this->_getLdap()->getRootDse(); - - $this->assertEquals($root1, $root2); - $this->assertSame($root1, $root2); - } - - public function testSupportCheckMethods() - { - $root=$this->_getLdap()->getRootDse(); - - $this->assertTrue(is_bool($root->supportsSaslMechanism('GSSAPI'))); - $this->assertTrue(is_bool($root->supportsSaslMechanism(array('GSSAPI', 'DIGEST-MD5')))); - $this->assertTrue(is_bool($root->supportsVersion('3'))); - $this->assertTrue(is_bool($root->supportsVersion(3))); - $this->assertTrue(is_bool($root->supportsVersion(array('3', '2')))); - $this->assertTrue(is_bool($root->supportsVersion(array(3, 2)))); - - switch ($root->getServerType()) { - case Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY: - $this->assertTrue(is_bool($root->supportsControl('1.2.840.113556.1.4.319'))); - $this->assertTrue(is_bool($root->supportsControl(array('1.2.840.113556.1.4.319', - '1.2.840.113556.1.4.473')))); - $this->assertTrue(is_bool($root->supportsCapability('1.3.6.1.4.1.4203.1.9.1.1'))); - $this->assertTrue(is_bool($root->supportsCapability(array('1.3.6.1.4.1.4203.1.9.1.1', - '2.16.840.1.113730.3.4.18')))); - $this->assertTrue(is_bool($root->supportsPolicy('unknown'))); - $this->assertTrue(is_bool($root->supportsPolicy(array('unknown', 'unknown')))); - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_EDIRECTORY: - $this->assertTrue(is_bool($root->supportsExtension('1.3.6.1.4.1.1466.20037'))); - $this->assertTrue(is_bool($root->supportsExtension(array('1.3.6.1.4.1.1466.20037', - '1.3.6.1.4.1.4203.1.11.1')))); - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP: - $this->assertTrue(is_bool($root->supportsControl('1.3.6.1.4.1.4203.1.9.1.1'))); - $this->assertTrue(is_bool($root->supportsControl(array('1.3.6.1.4.1.4203.1.9.1.1', - '2.16.840.1.113730.3.4.18')))); - $this->assertTrue(is_bool($root->supportsExtension('1.3.6.1.4.1.1466.20037'))); - $this->assertTrue(is_bool($root->supportsExtension(array('1.3.6.1.4.1.1466.20037', - '1.3.6.1.4.1.4203.1.11.1')))); - $this->assertTrue(is_bool($root->supportsFeature('1.3.6.1.1.14'))); - $this->assertTrue(is_bool($root->supportsFeature(array('1.3.6.1.1.14', - '1.3.6.1.4.1.4203.1.5.1')))); - break; - } - } - - public function testGetters() - { - $root=$this->_getLdap()->getRootDse(); - - $this->assertTrue(is_array($root->getNamingContexts())); - $this->assertTrue(is_array($root->getSubschemaSubentry())); - - switch ($root->getServerType()) { - case Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY: - $this->assertTrue(is_string($root->getConfigurationNamingContext())); - $this->assertTrue(is_string($root->getCurrentTime())); - $this->assertTrue(is_string($root->getDefaultNamingContext())); - $this->assertTrue(is_string($root->getDnsHostName())); - $this->assertTrue(is_string($root->getDomainControllerFunctionality())); - $this->assertTrue(is_string($root->getDomainFunctionality())); - $this->assertTrue(is_string($root->getDsServiceName())); - $this->assertTrue(is_string($root->getForestFunctionality())); - $this->assertTrue(is_string($root->getHighestCommittedUSN())); - $this->assertTrue(is_bool($root->getIsGlobalCatalogReady())); - $this->assertTrue(is_bool($root->getIsSynchronized())); - $this->assertTrue(is_string($root->getLdapServiceName())); - $this->assertTrue(is_string($root->getRootDomainNamingContext())); - $this->assertTrue(is_string($root->getSchemaNamingContext())); - $this->assertTrue(is_string($root->getServerName())); - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_EDIRECTORY: - $this->assertTrue(is_string($root->getVendorName())); - $this->assertTrue(is_string($root->getVendorVersion())); - $this->assertTrue(is_string($root->getDsaName())); - $this->assertTrue(is_string($root->getStatisticsErrors())); - $this->assertTrue(is_string($root->getStatisticsSecurityErrors())); - $this->assertTrue(is_string($root->getStatisticsChainings())); - $this->assertTrue(is_string($root->getStatisticsReferralsReturned())); - $this->assertTrue(is_string($root->getStatisticsExtendedOps())); - $this->assertTrue(is_string($root->getStatisticsAbandonOps())); - $this->assertTrue(is_string($root->getStatisticsWholeSubtreeSearchOps())); - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP: - $this->_assertNullOrString($root->getConfigContext()); - $this->_assertNullOrString($root->getMonitorContext()); - break; - } - } - - protected function _assertNullOrString($value) - { - if ($value===null) { - $this->assertNull($value); - } else { - $this->assertTrue(is_string($value)); - } - } - - /** - * @expectedException BadMethodCallException - */ - public function testSetterWillThrowException() - { - $root=$this->_getLdap()->getRootDse(); - $root->objectClass='illegal'; - } - - /** - * @expectedException BadMethodCallException - */ - public function testOffsetSetWillThrowException() - { - $root=$this->_getLdap()->getRootDse(); - $root['objectClass']='illegal'; - } - - /** - * @expectedException BadMethodCallException - */ - public function testUnsetterWillThrowException() - { - $root=$this->_getLdap()->getRootDse(); - unset($root->objectClass); - } - - /** - * @expectedException BadMethodCallException - */ - public function testOffsetUnsetWillThrowException() - { - $root=$this->_getLdap()->getRootDse(); - unset($root['objectClass']); - } -} diff --git a/tests/Zend/Ldap/Node/SchemaTest.php b/tests/Zend/Ldap/Node/SchemaTest.php deleted file mode 100644 index d6cb613d36..0000000000 --- a/tests/Zend/Ldap/Node/SchemaTest.php +++ /dev/null @@ -1,314 +0,0 @@ -_schema=$this->_getLdap()->getSchema(); - } - - public function testSchemaNode() - { - $schema=$this->_getLdap()->getSchema(); - - $this->assertEquals($this->_schema, $schema); - $this->assertSame($this->_schema, $schema); - - $serial=serialize($this->_schema); - $schemaUn=unserialize($serial); - $this->assertEquals($this->_schema, $schemaUn); - $this->assertNotSame($this->_schema, $schemaUn); - } - - public function testGetters() - { - $this->assertTrue(is_array($this->_schema->getAttributeTypes())); - $this->assertTrue(is_array($this->_schema->getObjectClasses())); - - switch ($this->_getLdap()->getRootDse()->getServerType()) { - case Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY: - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_EDIRECTORY: - break; - case Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP: - $this->assertTrue(is_array($this->_schema->getLdapSyntaxes())); - $this->assertTrue(is_array($this->_schema->getMatchingRules())); - $this->assertTrue(is_array($this->_schema->getMatchingRuleUse())); - break; - } - } - - /** - * @expectedException BadMethodCallException - */ - public function testSetterWillThrowException() - { - $this->_schema->objectClass='illegal'; - } - - /** - * @expectedException BadMethodCallException - */ - public function testOffsetSetWillThrowException() - { - $this->_schema['objectClass']='illegal'; - } - - /** - * @expectedException BadMethodCallException - */ - public function testUnsetterWillThrowException() - { - unset($this->_schema->objectClass); - } - - /** - * @expectedException BadMethodCallException - */ - public function testOffsetUnsetWillThrowException() - { - unset($this->_schema['objectClass']); - } - - public function testOpenLdapSchema() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $objectClasses=$this->_schema->getObjectClasses(); - $attributeTypes=$this->_schema->getAttributeTypes(); - - $this->assertArrayHasKey('organizationalUnit', $objectClasses); - $ou=$objectClasses['organizationalUnit']; - $this->assertTrue($ou instanceof Zend_Ldap_Node_Schema_ObjectClass_OpenLdap); - $this->assertEquals('organizationalUnit', $ou->getName()); - $this->assertEquals('2.5.6.5', $ou->getOid()); - $this->assertEquals(array('objectClass', 'ou'), $ou->getMustContain()); - $this->assertEquals(array('businessCategory', 'description', 'destinationIndicator', - 'facsimileTelephoneNumber', 'internationaliSDNNumber', 'l', - 'physicalDeliveryOfficeName', 'postOfficeBox', 'postalAddress', 'postalCode', - 'preferredDeliveryMethod', 'registeredAddress', 'searchGuide', 'seeAlso', 'st', - 'street', 'telephoneNumber', 'teletexTerminalIdentifier', 'telexNumber', - 'userPassword', 'x121Address'), $ou->getMayContain()); - $this->assertEquals('RFC2256: an organizational unit', $ou->getDescription()); - $this->assertEquals(Zend_Ldap_Node_Schema::OBJECTCLASS_TYPE_STRUCTURAL, $ou->getType()); - $this->assertEquals(array('top'), $ou->getParentClasses()); - - $this->assertEquals('2.5.6.5', $ou->oid); - $this->assertEquals('organizationalUnit', $ou->name); - $this->assertEquals('RFC2256: an organizational unit', $ou->desc); - $this->assertFalse($ou->obsolete); - $this->assertEquals(array('top'), $ou->sup); - $this->assertFalse($ou->abstract); - $this->assertTrue($ou->structural); - $this->assertFalse($ou->auxiliary); - $this->assertEquals(array('ou'), $ou->must); - $this->assertEquals(array('userPassword', 'searchGuide', 'seeAlso', 'businessCategory', - 'x121Address', 'registeredAddress', 'destinationIndicator', 'preferredDeliveryMethod', - 'telexNumber', 'teletexTerminalIdentifier', 'telephoneNumber', - 'internationaliSDNNumber', 'facsimileTelephoneNumber', 'street', 'postOfficeBox', - 'postalCode', 'postalAddress', 'physicalDeliveryOfficeName', 'st', 'l', - 'description'), $ou->may); - $this->assertEquals("( 2.5.6.5 NAME 'organizationalUnit' " . - "DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou " . - "MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ " . - "registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ " . - "teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ " . - "facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ " . - "physicalDeliveryOfficeName $ st $ l $ description ) )", $ou->_string); - $this->assertEquals(array(), $ou->aliases); - $this->assertSame($objectClasses['top'], $ou->_parents[0]); - - $this->assertArrayHasKey('ou', $attributeTypes); - $ou=$attributeTypes['ou']; - $this->assertTrue($ou instanceof Zend_Ldap_Node_Schema_AttributeType_OpenLdap); - $this->assertEquals('ou', $ou->getName()); - $this->assertEquals('2.5.4.11', $ou->getOid()); - $this->assertEquals('1.3.6.1.4.1.1466.115.121.1.15', $ou->getSyntax()); - $this->assertEquals(32768, $ou->getMaxLength()); - $this->assertFalse($ou->isSingleValued()); - $this->assertEquals('RFC2256: organizational unit this object belongs to', $ou->getDescription()); - - $this->assertEquals('2.5.4.11', $ou->oid); - $this->assertEquals('ou', $ou->name); - $this->assertEquals('RFC2256: organizational unit this object belongs to', $ou->desc); - $this->assertFalse($ou->obsolete); - $this->assertEquals(array('name'), $ou->sup); - $this->assertNull($ou->equality); - $this->assertNull($ou->ordering); - $this->assertNull($ou->substr); - $this->assertNull($ou->syntax); - $this->assertNull($ou->{'max-length'}); - $this->assertFalse($ou->{'single-value'}); - $this->assertFalse($ou->collective); - $this->assertFalse($ou->{'no-user-modification'}); - $this->assertEquals('userApplications', $ou->usage); - $this->assertEquals("( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) " . - "DESC 'RFC2256: organizational unit this object belongs to' SUP name )", $ou->_string); - $this->assertEquals(array('organizationalUnitName'), $ou->aliases); - $this->assertSame($attributeTypes['name'], $ou->_parents[0]); - } - - public function testActiveDirectorySchema() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY) { - $this->markTestSkipped('Test can only be run on an Active Directory server'); - } - - $objectClasses=$this->_schema->getObjectClasses(); - $attributeTypes=$this->_schema->getAttributeTypes(); - } - - public function testeDirectorySchema() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_EDIRECTORY) { - $this->markTestSkipped('Test can only be run on an eDirectory server'); - } - $this->markTestIncomplete("Novell eDirectory schema parsing is incomplete"); - } - - public function testOpenLdapSchemaAttributeTypeInheritance() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $attributeTypes=$this->_schema->getAttributeTypes(); - - $name=$attributeTypes['name']; - $cn=$attributeTypes['cn']; - - $this->assertEquals('2.5.4.41', $name->getOid()); - $this->assertEquals('2.5.4.3', $cn->getOid()); - $this->assertNull($name->sup); - $this->assertEquals(array('name'), $cn->sup); - - $this->assertEquals('caseIgnoreMatch', $name->equality); - $this->assertNull($name->ordering); - $this->assertEquals('caseIgnoreSubstringsMatch', $name->substr); - $this->assertEquals('1.3.6.1.4.1.1466.115.121.1.15', $name->syntax); - $this->assertEquals('1.3.6.1.4.1.1466.115.121.1.15', $name->getSyntax()); - $this->assertEquals(32768, $name->{'max-length'}); - $this->assertEquals(32768, $name->getMaxLength()); - - $this->assertNull($cn->equality); - $this->assertNull($cn->ordering); - $this->assertNull($cn->substr); - $this->assertNull($cn->syntax); - $this->assertEquals('1.3.6.1.4.1.1466.115.121.1.15', $cn->getSyntax()); - $this->assertNull($cn->{'max-length'}); - $this->assertEquals(32768, $cn->getMaxLength()); - } - - public function testOpenLdapSchemaObjectClassInheritance() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $objectClasses=$this->_schema->getObjectClasses(); - - if (!array_key_exists('certificationAuthority', $objectClasses) || - !array_key_exists('certificationAuthority-V2', $objectClasses)) { - $this->markTestSkipped('This requires OpenLDAP core schema'); - } - - $ca=$objectClasses['certificationAuthority']; - $ca2=$objectClasses['certificationAuthority-V2']; - - $this->assertEquals('2.5.6.16', $ca->getOid()); - $this->assertEquals('2.5.6.16.2', $ca2->getOid()); - $this->assertEquals(array('top'), $ca->sup); - $this->assertEquals(array('certificationAuthority'), $ca2->sup); - - $this->assertEquals(array('authorityRevocationList', 'certificateRevocationList', - 'cACertificate'), $ca->must); - $this->assertEquals(array('authorityRevocationList', 'cACertificate', - 'certificateRevocationList', 'objectClass'), $ca->getMustContain()); - $this->assertEquals(array('crossCertificatePair'), $ca->may); - $this->assertEquals(array('crossCertificatePair'), $ca->getMayContain()); - - $this->assertEquals(array(), $ca2->must); - $this->assertEquals(array('authorityRevocationList', 'cACertificate', - 'certificateRevocationList', 'objectClass'), $ca2->getMustContain()); - $this->assertEquals(array('deltaRevocationList'), $ca2->may); - $this->assertEquals(array('crossCertificatePair', 'deltaRevocationList'), - $ca2->getMayContain()); - } - - public function testOpenLdapSchemaAttributeTypeAliases() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $attributeTypes=$this->_schema->getAttributeTypes(); - $this->assertArrayHasKey('cn', $attributeTypes); - $this->assertArrayHasKey('commonName', $attributeTypes); - $ob1=$attributeTypes['cn']; - $ob2=$attributeTypes['commonName']; - $this->assertSame($ob1, $ob2); - } - - public function testOpenLdapSchemaObjectClassAliases() - { - if ($this->_getLdap()->getRootDse()->getServerType() !== - Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP) { - $this->markTestSkipped('Test can only be run on an OpenLDAP server'); - } - - $objectClasses=$this->_schema->getObjectClasses(); - $this->assertArrayHasKey('OpenLDAProotDSE', $objectClasses); - $this->assertArrayHasKey('LDAProotDSE', $objectClasses); - $ob1=$objectClasses['OpenLDAProotDSE']; - $ob2=$objectClasses['LDAProotDSE']; - $this->assertSame($ob1, $ob2); - } -} diff --git a/tests/Zend/Ldap/Node/UpdateTest.php b/tests/Zend/Ldap/Node/UpdateTest.php deleted file mode 100644 index db2b1f5e21..0000000000 --- a/tests/Zend/Ldap/Node/UpdateTest.php +++ /dev/null @@ -1,219 +0,0 @@ -_prepareLdapServer(); - } - - protected function tearDown() - { - foreach ($this->_getLdap()->getBaseNode()->searchChildren('objectClass=*') as $child) { - $this->_getLdap()->delete($child->getDn(), true); - } - - parent::tearDown(); - } - - protected function _stripActiveDirectorySystemAttributes(&$entry) - { - $adAttributes = array('distinguishedname', 'instancetype', 'name', 'objectcategory', - 'objectguid', 'usnchanged', 'usncreated', 'whenchanged', 'whencreated'); - foreach ($adAttributes as $attr) { - if (array_key_exists($attr, $entry)) { - unset($entry[$attr]); - } - } - - if (array_key_exists('objectclass', $entry) && count($entry['objectclass']) > 0) { - if ($entry['objectclass'][0] !== 'top') { - $entry['objectclass']=array_merge(array('top'), $entry['objectclass']); - } - } - } - - public function testSimpleUpdateOneValue() - { - $dn=$this->_createDn('ou=Test1,'); - $node1=Zend_Ldap_Node::fromLdap($dn, $this->_getLdap()); - $node1->l='f'; - $node1->update(); - - $this->assertTrue($this->_getLdap()->exists($dn)); - $node2=$this->_getLdap()->getEntry($dn); - $this->_stripActiveDirectorySystemAttributes($node2); - unset($node2['dn']); - $node1=$node1->getData(false); - $this->_stripActiveDirectorySystemAttributes($node1); - $this->assertEquals($node2, $node1); - } - - public function testAddNewNode() - { - $dn=$this->_createDn('ou=Test,'); - $node1=Zend_Ldap_Node::create($dn, array('organizationalUnit')); - $node1->l='a'; - $node1->update($this->_getLdap()); - - $this->assertTrue($this->_getLdap()->exists($dn)); - $node2=$this->_getLdap()->getEntry($dn); - $this->_stripActiveDirectorySystemAttributes($node2); - unset($node2['dn']); - $node1=$node1->getData(false); - $this->_stripActiveDirectorySystemAttributes($node1); - $this->assertEquals($node2, $node1); - } - - public function testMoveExistingNode() - { - $dnOld=$this->_createDn('ou=Test1,'); - $dnNew=$this->_createDn('ou=Test,'); - $node1=Zend_Ldap_Node::fromLdap($dnOld, $this->_getLdap()); - $node1->l='f'; - $node1->setDn($dnNew); - $node1->update(); - - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertTrue($this->_getLdap()->exists($dnNew)); - $node2=$this->_getLdap()->getEntry($dnNew); - $this->_stripActiveDirectorySystemAttributes($node2); - unset($node2['dn']); - $node1=$node1->getData(false); - $this->_stripActiveDirectorySystemAttributes($node1); - $this->assertEquals($node2, $node1); - } - - public function testMoveNewNode() - { - $dnOld=$this->_createDn('ou=Test,'); - $dnNew=$this->_createDn('ou=TestNew,'); - $node1=Zend_Ldap_Node::create($dnOld, array('organizationalUnit')); - $node1->l='a'; - $node1->setDn($dnNew); - $node1->update($this->_getLdap()); - - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertTrue($this->_getLdap()->exists($dnNew)); - $node2=$this->_getLdap()->getEntry($dnNew); - $this->_stripActiveDirectorySystemAttributes($node2); - unset($node2['dn']); - $node1=$node1->getData(false); - $this->_stripActiveDirectorySystemAttributes($node1); - $this->assertEquals($node2, $node1); - } - - public function testModifyDeletedNode() - { - $dn=$this->_createDn('ou=Test1,'); - $node1=Zend_Ldap_Node::create($dn, array('organizationalUnit')); - $node1->delete(); - $node1->update($this->_getLdap()); - - $this->assertFalse($this->_getLdap()->exists($dn)); - - $node1->l='a'; - $node1->update(); - - $this->assertFalse($this->_getLdap()->exists($dn)); - } - - public function testAddDeletedNode() - { - $dn=$this->_createDn('ou=Test,'); - $node1=Zend_Ldap_Node::create($dn, array('organizationalUnit')); - $node1->delete(); - $node1->update($this->_getLdap()); - - $this->assertFalse($this->_getLdap()->exists($dn)); - } - - public function testMoveDeletedExistingNode() - { - $dnOld=$this->_createDn('ou=Test1,'); - $dnNew=$this->_createDn('ou=Test,'); - $node1=Zend_Ldap_Node::fromLdap($dnOld, $this->_getLdap()); - $node1->setDn($dnNew); - $node1->delete(); - $node1->update(); - - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertFalse($this->_getLdap()->exists($dnNew)); - } - - public function testMoveDeletedNewNode() - { - $dnOld=$this->_createDn('ou=Test,'); - $dnNew=$this->_createDn('ou=TestNew,'); - $node1=Zend_Ldap_Node::create($dnOld, array('organizationalUnit')); - $node1->setDn($dnNew); - $node1->delete(); - $node1->update($this->_getLdap()); - - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertFalse($this->_getLdap()->exists($dnNew)); - } - - public function testMoveNode() - { - $dnOld=$this->_createDn('ou=Test1,'); - $dnNew=$this->_createDn('ou=Test,'); - - $node=Zend_Ldap_Node::fromLdap($dnOld, $this->_getLdap()); - $node->setDn($dnNew); - $node->update(); - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertTrue($this->_getLdap()->exists($dnNew)); - - $node=Zend_Ldap_Node::fromLdap($dnNew, $this->_getLdap()); - $node->move($dnOld); - $node->update(); - $this->assertFalse($this->_getLdap()->exists($dnNew)); - $this->assertTrue($this->_getLdap()->exists($dnOld)); - - $node=Zend_Ldap_Node::fromLdap($dnOld, $this->_getLdap()); - $node->rename($dnNew); - $node->update(); - $this->assertFalse($this->_getLdap()->exists($dnOld)); - $this->assertTrue($this->_getLdap()->exists($dnNew)); - } -} diff --git a/tests/Zend/Ldap/OfflineTest.php b/tests/Zend/Ldap/OfflineTest.php deleted file mode 100644 index 16e5248a97..0000000000 --- a/tests/Zend/Ldap/OfflineTest.php +++ /dev/null @@ -1,152 +0,0 @@ -markTestSkipped('LDAP is not enabled'); - } - $this->_ldap = new Zend_Ldap(); - } - - /** - * @return void - */ - public function testInvalidOptionResultsInException() - { - $optionName = 'invalid'; - try { - $this->_ldap->setOptions(array($optionName => 'irrelevant')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals("Unknown Zend_Ldap option: $optionName", $e->getMessage()); - } - } - - public function testException() - { - $e = new Zend_Ldap_Exception(null, '', 0); - $this->assertEquals('no exception message', $e->getMessage()); - $this->assertEquals(0, $e->getCode()); - $this->assertEquals(0, $e->getErrorCode()); - - $e = new Zend_Ldap_Exception(null, '', 15); - $this->assertEquals('0xf: no exception message', $e->getMessage()); - $this->assertEquals(15, $e->getCode()); - $this->assertEquals(15, $e->getErrorCode()); - } - - public function testOptionsGetter() - { - $options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - $ldap = new Zend_Ldap($options); - $this->assertEquals(array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'port' => 0, - 'useSsl' => false, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'bindRequiresDn' => false, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - 'accountCanonicalForm' => null, - 'accountDomainName' => null, - 'accountDomainNameShort' => null, - 'accountFilterFormat' => null, - 'allowEmptyPassword' => false, - 'useStartTls' => false, - 'optReferrals' => false, - 'tryUsernameSplit' => true - ), $ldap->getOptions()); - } - - public function testConfigObject() - { - /** - * @see Zend_Config - */ - require_once 'Zend/Config.php'; - $config = new Zend_Config(array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - )); - $ldap = new Zend_Ldap($config); - $this->assertEquals(array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'port' => 0, - 'useSsl' => false, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'bindRequiresDn' => false, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - 'accountCanonicalForm' => null, - 'accountDomainName' => null, - 'accountDomainNameShort' => null, - 'accountFilterFormat' => null, - 'allowEmptyPassword' => false, - 'useStartTls' => false, - 'optReferrals' => false, - 'tryUsernameSplit' => true - ), $ldap->getOptions()); - } -} diff --git a/tests/Zend/Ldap/OnlineTestCase.php b/tests/Zend/Ldap/OnlineTestCase.php deleted file mode 100644 index 48508f5766..0000000000 --- a/tests/Zend/Ldap/OnlineTestCase.php +++ /dev/null @@ -1,143 +0,0 @@ -_ldap; - } - - protected function setUp() - { - if (!TESTS_ZEND_LDAP_ONLINE_ENABLED) { - $this->markTestSkipped("Test skipped due to test configuration"); - return; - } - - $options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - ); - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_START_TLS')) - $options['useStartTls'] = TESTS_ZEND_LDAP_USE_START_TLS; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT')) - $options['accountFilterFormat'] = TESTS_ZEND_LDAP_ACCOUNT_FILTER_FORMAT; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) - $options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) - $options['accountDomainNameShort'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT; - - $this->_ldap=new Zend_Ldap($options); - $this->_ldap->bind(); - } - - protected function tearDown() - { - if ($this->_ldap!==null) { - $this->_ldap->disconnect(); - $this->_ldap=null; - } - } - - protected function _createDn($dn) - { - if (substr($dn, -1)!==',') { - $dn.=','; - } - $dn = $dn . TESTS_ZEND_LDAP_WRITEABLE_SUBTREE; - return Zend_Ldap_Dn::fromString($dn)->toString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - } - - protected function _prepareLdapServer() - { - $this->_nodes=array( - $this->_createDn('ou=Node,') => - array("objectClass" => "organizationalUnit", "ou" => "Node", "postalCode" => "1234"), - $this->_createDn('ou=Test1,ou=Node,') => - array("objectClass" => "organizationalUnit", "ou" => "Test1"), - $this->_createDn('ou=Test2,ou=Node,') => - array("objectClass" => "organizationalUnit", "ou" => "Test2"), - $this->_createDn('ou=Test1,') => - array("objectClass" => "organizationalUnit", "ou" => "Test1", "l" => "e"), - $this->_createDn('ou=Test2,') => - array("objectClass" => "organizationalUnit", "ou" => "Test2", "l" => "d"), - $this->_createDn('ou=Test3,') => - array("objectClass" => "organizationalUnit", "ou" => "Test3", "l" => "c"), - $this->_createDn('ou=Test4,') => - array("objectClass" => "organizationalUnit", "ou" => "Test4", "l" => "b"), - $this->_createDn('ou=Test5,') => - array("objectClass" => "organizationalUnit", "ou" => "Test5", "l" => "a"), - ); - - $ldap=$this->_ldap->getResource(); - foreach ($this->_nodes as $dn => $entry) { - ldap_add($ldap, $dn, $entry); - } - } - - protected function _cleanupLdapServer() - { - $ldap=$this->_ldap->getResource(); - foreach (array_reverse($this->_nodes) as $dn => $entry) { - ldap_delete($ldap, $dn); - } - } -} diff --git a/tests/Zend/Ldap/OriginalBindTest.php b/tests/Zend/Ldap/OriginalBindTest.php deleted file mode 100644 index 60b2a85649..0000000000 --- a/tests/Zend/Ldap/OriginalBindTest.php +++ /dev/null @@ -1,181 +0,0 @@ -_options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_START_TLS')) - $this->_options['useStartTls'] = TESTS_ZEND_LDAP_USE_START_TLS; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $this->_options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ALT_USERNAME')) - $this->_altUsername = TESTS_ZEND_LDAP_ALT_USERNAME; - - if (isset($this->_options['bindRequiresDn'])) - $this->_bindRequiresDn = $this->_options['bindRequiresDn']; - } - - public function testEmptyOptionsBind() - { - $ldap = new Zend_Ldap(array()); - try { - $ldap->bind(); - $this->fail('Expected exception for empty options'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('A host parameter is required', $zle->getMessage()); - } - } - public function testAnonymousBind() - { - $options = $this->_options; - unset($options['password']); - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind(); - } catch (Zend_Ldap_Exception $zle) { - // or I guess the server doesn't allow unauthenticated binds - $this->assertContains('unauthenticated bind', $zle->getMessage()); - } - } - public function testNoBaseDnBind() - { - $options = $this->_options; - unset($options['baseDn']); - $options['bindRequiresDn'] = true; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind('invalid', 'ignored'); - $this->fail('Expected exception for baseDn missing'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Base DN not set', $zle->getMessage()); - } - } - public function testNoDomainNameBind() - { - $options = $this->_options; - unset($options['baseDn']); - $options['bindRequiresDn'] = false; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind('invalid', 'ignored'); - $this->fail('Expected exception for missing accountDomainName'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Option required: accountDomainName', $zle->getMessage()); - } - } - public function testPlainBind() - { - $ldap = new Zend_Ldap($this->_options); - $ldap->bind(); - } - public function testConnectBind() - { - $ldap = new Zend_Ldap($this->_options); - $ldap->connect()->bind(); - } - public function testExplicitParamsBind() - { - $options = $this->_options; - $username = $options['username']; - $password = $options['password']; - - unset($options['username']); - unset($options['password']); - - $ldap = new Zend_Ldap($options); - $ldap->bind($username, $password); - } - public function testRequiresDnBind() - { - $options = $this->_options; - - /* Fixup filter since bindRequiresDn is used to determine default accountFilterFormat - */ - if (!isset($options['accountFilterFormat']) && $this->_bindRequiresDn === false) - $options['accountFilterFormat'] = '(&(objectClass=user)(sAMAccountName=%s))'; - - $options['bindRequiresDn'] = true; - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_altUsername, 'invalid'); - } catch (Zend_Ldap_Exception $zle) { - $message = str_replace("\n", " ", $zle->getMessage()); - $this->assertContains('Invalid credentials', $message); - } - } - public function testRequiresDnWithoutDnBind() - { - $options = $this->_options; - - /* Fixup filter since bindRequiresDn is used to determine default accountFilterFormat - */ - if (!isset($options['accountFilterFormat']) && !$this->_bindRequiresDn) - $options['accountFilterFormat'] = '(&(objectClass=user)(sAMAccountName=%s))'; - - $options['bindRequiresDn'] = true; - - unset($options['username']); - - $ldap = new Zend_Ldap($options); - try { - $ldap->bind($this->_principalName); - } catch (Zend_Ldap_Exception $zle) { - /* Note that if your server actually allows anonymous binds this test will fail. - */ - $this->assertContains('Failed to retrieve DN', $zle->getMessage()); - } - } -} diff --git a/tests/Zend/Ldap/OriginalCanonTest.php b/tests/Zend/Ldap/OriginalCanonTest.php deleted file mode 100644 index 2eba017c95..0000000000 --- a/tests/Zend/Ldap/OriginalCanonTest.php +++ /dev/null @@ -1,119 +0,0 @@ -_options = array( - 'host' => TESTS_ZEND_LDAP_HOST, - 'username' => TESTS_ZEND_LDAP_USERNAME, - 'password' => TESTS_ZEND_LDAP_PASSWORD, - 'baseDn' => TESTS_ZEND_LDAP_BASE_DN, - ); - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - if (defined('TESTS_ZEND_LDAP_BIND_REQUIRES_DN')) - $this->_options['bindRequiresDn'] = TESTS_ZEND_LDAP_BIND_REQUIRES_DN; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) - $this->_options['accountDomainName'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) - $this->_options['accountDomainNameShort'] = TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT; - if (defined('TESTS_ZEND_LDAP_ALT_USERNAME')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_USERNAME] = TESTS_ZEND_LDAP_ALT_USERNAME; - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_PRINCIPAL] = - TESTS_ZEND_LDAP_ALT_USERNAME . '@' . TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME; - } - if (defined('TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT')) { - $this->_names[Zend_Ldap::ACCTNAME_FORM_BACKSLASH] = - TESTS_ZEND_LDAP_ACCOUNT_DOMAIN_NAME_SHORT . '\\' . TESTS_ZEND_LDAP_ALT_USERNAME; - } - } - } - - public function testPlainCanon() - { - $ldap = new Zend_Ldap($this->_options); - - /* This test tries to canonicalize each name (uname, uname@example.com, - * EXAMPLE\uname) to each of the 3 forms (username, principal and backslash) - * for a total of canonicalizations. - */ - - foreach ($this->_names as $_form => $name) { - foreach ($this->_names as $form => $_name) { - $ret = $ldap->getCanonicalAccountName($name, $form); - $this->assertTrue($ret === $this->_names[$form]); - } - } - } - public function testInvalidAccountCanon() - { - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->bind('invalid', 'invalid'); - } catch (Zend_Ldap_Exception $zle) { - $msg = $zle->getMessage(); - $this->assertTrue(strstr($msg, 'Invalid credentials') || strstr($msg, 'No such object')); - } - } - public function testDnCanon() - { - $ldap = new Zend_Ldap($this->_options); - $name = $ldap->getCanonicalAccountName(TESTS_ZEND_LDAP_ALT_DN, Zend_Ldap::ACCTNAME_FORM_DN); - } - public function testMismatchDomainBind() - { - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->bind('BOGUS\\doesntmatter', 'doesntmatter'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertTrue($zle->getCode() == Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH); - } - } - public function testBindCanon() - { - /** - * @todo test accountCanonicalForm option - */ - } -} diff --git a/tests/Zend/Ldap/OriginalConnectTest.php b/tests/Zend/Ldap/OriginalConnectTest.php deleted file mode 100644 index cf90899747..0000000000 --- a/tests/Zend/Ldap/OriginalConnectTest.php +++ /dev/null @@ -1,174 +0,0 @@ -_options = array('host' => TESTS_ZEND_LDAP_HOST); - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $this->_options['port'] = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $this->_options['useSsl'] = TESTS_ZEND_LDAP_USE_SSL; - } - - public function testEmptyOptionsConnect() - { - $ldap = new Zend_Ldap(array()); - try { - $ldap->connect(); - $this->fail('Expected exception for empty options'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('host parameter is required', $zle->getMessage()); - } - } - public function testUnknownHostConnect() - { - $ldap = new Zend_Ldap(array('host' => 'bogus.example.com')); - try { - // connect doesn't actually try to connect until bind is called - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown host'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Can\'t contact LDAP server', $zle->getMessage()); - } - } - public function testPlainConnect() - { - $ldap = new Zend_Ldap($this->_options); - try { - // Connect doesn't actually try to connect until bind is called - // but if we get 'Invalid credentials' then we know the connect - // succeeded. - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testExplicitParamsConnect() - { - $host = TESTS_ZEND_LDAP_HOST; - $port = 0; - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT != 389) - $port = TESTS_ZEND_LDAP_PORT; - $useSsl = false; - if (defined('TESTS_ZEND_LDAP_USE_SSL')) - $useSsl = TESTS_ZEND_LDAP_USE_SSL; - - $ldap = new Zend_Ldap(); - try { - $ldap->connect($host, $port, $useSsl) - ->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testExplicitPortConnect() - { - $port = 389; - if (defined('TESTS_ZEND_LDAP_PORT') && TESTS_ZEND_LDAP_PORT) - $port = TESTS_ZEND_LDAP_PORT; - if (defined('TESTS_ZEND_LDAP_USE_SSL') && TESTS_ZEND_LDAP_USE_SSL) - $port = 636; - - $ldap = new Zend_Ldap($this->_options); - try { - $ldap->connect(null, $port) - ->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testBadPortConnect() - { - $options = $this->_options; - $options['port'] = 10; - - $ldap = new Zend_Ldap($options); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Can\'t contact LDAP server', $zle->getMessage()); - } - } - public function testSetOptionsConnect() - { - $ldap = new Zend_Ldap(); - $ldap->setOptions($this->_options); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for invalid username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - public function testMultiConnect() - { - $ldap = new Zend_Ldap($this->_options); - for ($i = 0; $i < 3; $i++) { - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - } - public function testDisconnect() - { - $ldap = new Zend_Ldap($this->_options); - for ($i = 0; $i < 3; $i++) { - $ldap->disconnect(); - try { - $ldap->connect()->bind('CN=ignored,DC=example,DC=com', 'ignored'); - $this->fail('Expected exception for unknown username'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains('Invalid credentials', $zle->getMessage()); - } - } - } -} diff --git a/tests/Zend/Ldap/OriginalOfflineTest.php b/tests/Zend/Ldap/OriginalOfflineTest.php deleted file mode 100644 index 5fa2e341f9..0000000000 --- a/tests/Zend/Ldap/OriginalOfflineTest.php +++ /dev/null @@ -1,113 +0,0 @@ -_ldap = new Zend_Ldap(); - } - - /** - * @return void - */ - public function testFilterEscapeBasicOperation() - { - $input = 'a*b(b)d\e/f'; - $expected = 'a\2ab\28b\29d\5ce\2ff'; - $this->assertEquals($expected, Zend_Ldap::filterEscape($input)); - } - - /** - * @return void - */ - public function testInvalidOptionResultsInException() - { - $optionName = 'invalid'; - try { - $this->_ldap->setOptions(array($optionName => 'irrelevant')); - $this->fail('Expected Zend_Ldap_Exception not thrown'); - } catch (Zend_Ldap_Exception $e) { - $this->assertEquals("Unknown Zend_Ldap option: $optionName", $e->getMessage()); - } - } - - /** - * @return void - */ - public function testExplodeDnOperation() - { - $inputs = array( - 'CN=Alice Baker,CN=Users,DC=example,DC=com' => true, - 'CN=Baker\\, Alice,CN=Users,DC=example,DC=com' => true, - 'OU=Sales,DC=local' => true, - 'OU=Sales;DC=local' => true, - 'OU=Sales ,DC=local' => true, - 'OU=Sales, dC=local' => true, - 'ou=Sales , DC=local' => true, - 'OU=Sales ; dc=local' => true, - 'DC=local' => true, - ' DC=local' => true, - 'DC= local ' => true, - 'username' => false, - 'username@example.com' => false, - 'EXAMPLE\\username' => false, - 'CN=,Alice Baker,CN=Users,DC=example,DC=com' => false, - 'CN=Users,DC==example,DC=com' => false, - 'O=ACME' => true, - '' => false, - ' ' => false, - ); - - foreach ($inputs as $dn => $expected) { - $ret = Zend_Ldap::explodeDn($dn); - $this->assertTrue($ret === $expected); - } - } -} diff --git a/tests/Zend/Ldap/SearchTest.php b/tests/Zend/Ldap/SearchTest.php deleted file mode 100644 index 3169be4109..0000000000 --- a/tests/Zend/Ldap/SearchTest.php +++ /dev/null @@ -1,613 +0,0 @@ -_prepareLdapServer(); - } - - protected function tearDown() - { - $this->_cleanupLdapServer(); - parent::tearDown(); - } - - public function testGetSingleEntry() - { - $dn=$this->_createDn('ou=Test1,'); - $entry=$this->_getLdap()->getEntry($dn); - $this->assertEquals($dn, $entry["dn"]); - $this->assertArrayHasKey('ou', $entry); - $this->assertContains('Test1', $entry['ou']); - $this->assertEquals(1, count($entry['ou'])); - } - - public function testGetSingleIllegalEntry() - { - $dn=$this->_createDn('ou=Test99,'); - $entry=$this->_getLdap()->getEntry($dn); - $this->assertNull($entry); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testGetSingleIllegalEntryWithException() - { - $dn=$this->_createDn('ou=Test99,'); - $entry=$this->_getLdap()->getEntry($dn, array(), true); - } - - public function testCountBase() - { - $dn=$this->_createDn('ou=Node,'); - $count=$this->_getLdap()->count('(objectClass=*)', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $this->assertEquals(1, $count); - } - - public function testCountOne() - { - $dn1=$this->_createDn('ou=Node,'); - $count1=$this->_getLdap()->count('(objectClass=*)', $dn1, Zend_Ldap::SEARCH_SCOPE_ONE); - $this->assertEquals(2, $count1); - $dn2=TESTS_ZEND_LDAP_WRITEABLE_SUBTREE; - $count2=$this->_getLdap()->count('(objectClass=*)', $dn2, Zend_Ldap::SEARCH_SCOPE_ONE); - $this->assertEquals(6, $count2); - } - - public function testCountSub() - { - $dn1=$this->_createDn('ou=Node,'); - $count1=$this->_getLdap()->count('(objectClass=*)', $dn1, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(3, $count1); - $dn2=TESTS_ZEND_LDAP_WRITEABLE_SUBTREE; - $count2=$this->_getLdap()->count('(objectClass=*)', $dn2, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(9, $count2); - } - - public function testResultIteration() - { - $items=$this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(9, $items->count()); - $this->assertEquals(9, count($items)); - - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals(9, $i); - $j=0; - foreach ($items as $item) { $j++; } - $this->assertEquals($i, $j); - } - - public function testSearchNoResult() - { - $items=$this->_getLdap()->search('(objectClass=account)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(0, $items->count()); - } - - public function testSearchEntriesShortcut() - { - $entries=$this->_getLdap()->searchEntries('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertTrue(is_array($entries)); - $this->assertEquals(9, count($entries)); - } - - /** - * @expectedException Zend_Ldap_Exception - */ - public function testIllegalSearch() - { - $dn=$this->_createDn('ou=Node2,'); - $items=$this->_getLdap()->search('(objectClass=account)', $dn, Zend_Ldap::SEARCH_SCOPE_SUB); - } - - public function testSearchNothingGetFirst() - { - $entries=$this->_getLdap()->search('(objectClass=account)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(0, $entries->count()); - $this->assertNull($entries->getFirst()); - } - - public function testSorting() - { - $lSorted=array('a', 'b', 'c', 'd', 'e'); - $items=$this->_getLdap()->search('(l=*)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB, array(), 'l'); - $this->assertEquals(5, $items->count()); - foreach ($items as $key => $item) - { - $this->assertEquals($lSorted[$key], $item['l'][0]); - } - } - - public function testCountChildren() - { - $dn1=$this->_createDn('ou=Node,'); - $count1=$this->_getLdap()->countChildren($dn1); - $this->assertEquals(2, $count1); - $dn2=TESTS_ZEND_LDAP_WRITEABLE_SUBTREE; - $count2=$this->_getLdap()->countChildren($dn2); - $this->assertEquals(6, $count2); - } - - public function testExistsDn() - { - $dn1=$this->_createDn('ou=Test2,'); - $dn2=$this->_createDn('ou=Test99,'); - $this->assertTrue($this->_getLdap()->exists($dn1)); - $this->assertFalse($this->_getLdap()->exists($dn2)); - } - - public function testSearchWithDnObjectAndFilterObject() - { - $dn=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $filter=Zend_Ldap_Filter::equals('objectClass', 'organizationalUnit'); - - $items=$this->_getLdap()->search($filter, $dn, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(9, $items->count()); - } - - public function testCountSubWithDnObjectAndFilterObject() - { - $dn1=Zend_Ldap_Dn::fromString($this->_createDn('ou=Node,')); - $filter=Zend_Ldap_Filter::any('objectClass'); - - $count1=$this->_getLdap()->count($filter, $dn1, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(3, $count1); - - $dn2=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $count2=$this->_getLdap()->count($filter, $dn2, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(9, $count2); - } - - public function testCountChildrenWithDnObject() - { - $dn1=Zend_Ldap_Dn::fromString($this->_createDn('ou=Node,')); - $count1=$this->_getLdap()->countChildren($dn1); - $this->assertEquals(2, $count1); - - $dn2=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $count2=$this->_getLdap()->countChildren($dn2); - $this->assertEquals(6, $count2); - } - - public function testExistsDnWithDnObject() - { - $dn1=Zend_Ldap_Dn::fromString($this->_createDn('ou=Test2,')); - $dn2=Zend_Ldap_Dn::fromString($this->_createDn('ou=Test99,')); - - $this->assertTrue($this->_getLdap()->exists($dn1)); - $this->assertFalse($this->_getLdap()->exists($dn2)); - } - - public function testSearchEntriesShortcutWithDnObjectAndFilterObject() - { - $dn=Zend_Ldap_Dn::fromString(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE); - $filter=Zend_Ldap_Filter::equals('objectClass', 'organizationalUnit'); - - $entries=$this->_getLdap()->searchEntries($filter, $dn, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertTrue(is_array($entries)); - $this->assertEquals(9, count($entries)); - } - - public function testGetSingleEntryWithDnObject() - { - $dn=Zend_Ldap_Dn::fromString($this->_createDn('ou=Test1,')); - $entry=$this->_getLdap()->getEntry($dn); - $this->assertEquals($dn->toString(), $entry["dn"]); - } - - public function testMultipleResultIteration() - { - $items=$this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $isCount = 9; - $this->assertEquals($isCount, $items->count()); - - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals($isCount, $i); - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals($isCount, $i); - - $items->close(); - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals($isCount, $i); - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals($isCount, $i); - } - - /** - * Test issue reported by Lance Hendrix on - * http://framework.zend.com/wiki/display/ZFPROP/Zend_Ldap+-+Extended+support+-+Stefan+Gehrig? - * focusedCommentId=13107431#comment-13107431 - */ - public function testCallingNextAfterIterationShouldNotThrowException() - { - $items = $this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - foreach ($items as $key => $item) { - // do nothing - just iterate - } - $items->next(); - } - - public function testUnknownCollectionClassThrowsException() - { - try { - $items=$this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB, array(), null, - 'This_Class_Does_Not_Exist'); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains("Class 'This_Class_Does_Not_Exist' can not be found", - $zle->getMessage()); - } - } - - public function testCollectionClassNotSubclassingZendLdapCollectionThrowsException() - { - try { - $items=$this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB, array(), null, - 'Zend_Ldap_SearchTest_CollectionClassNotSubclassingZendLdapCollection'); - $this->fail('Expected exception not thrown'); - } catch (Zend_Ldap_Exception $zle) { - $this->assertContains( - "Class 'Zend_Ldap_SearchTest_CollectionClassNotSubclassingZendLdapCollection' must subclass 'Zend_Ldap_Collection'", - $zle->getMessage()); - } - } - - /** - * @group ZF-8233 - */ - public function testSearchWithOptionsArray() - { - $items=$this->_getLdap()->search(array( - 'filter' => '(objectClass=organizationalUnit)', - 'baseDn' => TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - 'scope' => Zend_Ldap::SEARCH_SCOPE_SUB - )); - $this->assertEquals(9, $items->count()); - } - - /** - * @group ZF-8233 - */ - public function testSearchEntriesShortcutWithOptionsArray() - { - $items=$this->_getLdap()->searchEntries(array( - 'filter' => '(objectClass=organizationalUnit)', - 'baseDn' => TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - 'scope' => Zend_Ldap::SEARCH_SCOPE_SUB - )); - $this->assertEquals(9, count($items)); - } - - /** - * @group ZF-8233 - */ - public function testReverseSortingWithSearchEntriesShortcut() - { - $lSorted = array('e', 'd', 'c', 'b', 'a'); - $items = $this->_getLdap()->searchEntries('(l=*)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB, array(), 'l', true); - foreach ($items as $key => $item) { - $this->assertEquals($lSorted[$key], $item['l'][0]); - } - } - - /** - * @group ZF-8233 - */ - public function testReverseSortingWithSearchEntriesShortcutWithOptionsArray() - { - $lSorted = array('e', 'd', 'c', 'b', 'a'); - $items = $this->_getLdap()->searchEntries(array( - 'filter' => '(l=*)', - 'baseDn' => TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - 'scope' => Zend_Ldap::SEARCH_SCOPE_SUB, - 'sort' => 'l', - 'reverseSort' => true - )); - foreach ($items as $key => $item) { - $this->assertEquals($lSorted[$key], $item['l'][0]); - } - } - - public function testSearchNothingIteration() - { - $entries = $this->_getLdap()->search('(objectClass=account)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB, - array(), 'uid'); - $this->assertEquals(0, $entries->count()); - $i = 0; - foreach ($entries as $key => $item) { - $i++; - } - $this->assertEquals(0, $i); - } - - public function testSearchNothingToArray() - { - $entries = $this->_getLdap()->search('(objectClass=account)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB, - array(), 'uid'); - $entries = $entries->toArray(); - $this->assertEquals(0, count($entries)); - $i = 0; - foreach ($entries as $key => $item) { - $i++; - } - $this->assertEquals(0, $i); - } - - /** - * @group ZF-8259 - */ - public function testUserIsAutomaticallyBoundOnOperationInDisconnectedState() - { - $ldap = $this->_getLdap(); - $ldap->disconnect(); - $dn = $this->_createDn('ou=Test1,'); - $entry = $ldap->getEntry($dn); - $this->assertEquals($dn, $entry['dn']); - } - - /** - * @group ZF-8259 - */ - public function testUserIsAutomaticallyBoundOnOperationInUnboundState() - { - $ldap = $this->_getLdap(); - $ldap->disconnect(); - $ldap->connect(); - $dn = $this->_createDn('ou=Test1,'); - $entry = $ldap->getEntry($dn); - $this->assertEquals($dn, $entry['dn']); - } - - public function testInnerIteratorIsOfRequiredType() - { - $items = $this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertTrue( - $items->getInnerIterator() instanceof Zend_Ldap_Collection_Iterator_Default - ); - } - - /** - * @group ZF-8262 - */ - public function testCallingCurrentOnIteratorReturnsFirstElement() - { - $items = $this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $items->getInnerIterator()->key()); - $current = $items->getInnerIterator()->current(); - $this->assertTrue(is_array($current)); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $current['dn']); - } - - /** - * @group ZF-8262 - */ - public function testCallingCurrentOnCollectionReturnsFirstElement() - { - $items = $this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(0, $items->key()); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $items->dn()); - $current = $items->current(); - $this->assertTrue(is_array($current)); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $current['dn']); - } - - /** - * @group ZF-8262 - */ - public function testCallingCurrentOnEmptyIteratorReturnsNull() - { - $items = $this->_getLdap()->search('(objectClass=account)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertNull($items->getInnerIterator()->key()); - $this->assertNull($items->getInnerIterator()->current()); - } - - /** - * @group ZF-8262 - */ - public function testCallingCurrentOnEmptyCollectionReturnsNull() - { - $items = $this->_getLdap()->search('(objectClass=account)', TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, - Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertNull($items->key()); - $this->assertNull($items->dn()); - $this->assertNull($items->current()); - } - - /** - * @group ZF-8262 - */ - public function testResultIterationAfterCallingCurrent() - { - $items = $this->_getLdap()->search('(objectClass=organizationalUnit)', - TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, Zend_Ldap::SEARCH_SCOPE_SUB); - $this->assertEquals(9, $items->count()); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $items->getInnerIterator()->key()); - $current = $items->current(); - $this->assertTrue(is_array($current)); - $this->assertEquals(TESTS_ZEND_LDAP_WRITEABLE_SUBTREE, $current['dn']); - - $i=0; - foreach ($items as $key => $item) - { - $this->assertEquals($i, $key); - $i++; - } - $this->assertEquals(9, $i); - $j=0; - foreach ($items as $item) { $j++; } - $this->assertEquals($i, $j); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentToLower() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $list->getInnerIterator()->setAttributeNameTreatment(Zend_Ldap_Collection_Iterator_Default::ATTRIBUTE_TO_LOWER); - $this->assertArrayHasKey('postalcode', $list->current()); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentToUpper() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $list->getInnerIterator()->setAttributeNameTreatment(Zend_Ldap_Collection_Iterator_Default::ATTRIBUTE_TO_UPPER); - $this->assertArrayHasKey('POSTALCODE', $list->current()); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentNative() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $list->getInnerIterator()->setAttributeNameTreatment(Zend_Ldap_Collection_Iterator_Default::ATTRIBUTE_NATIVE); - $this->assertArrayHasKey('postalCode', $list->current()); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentCustomFunction() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $list->getInnerIterator()->setAttributeNameTreatment('Zend_Ldap_SearchTest_customNaming'); - $this->assertArrayHasKey('EDOCLATSOP', $list->current()); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentCustomStaticMethod() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $list->getInnerIterator()->setAttributeNameTreatment(array('Zend_Ldap_SearchTest_CustomNaming', 'name1')); - $this->assertArrayHasKey('edoclatsop', $list->current()); - } - - /** - * @group ZF-8263 - */ - public function testAttributeNameTreatmentCustomInstanceMethod() - { - $dn = $this->_createDn('ou=Node,'); - $list = $this->_getLdap()->search('objectClass=*', $dn, Zend_Ldap::SEARCH_SCOPE_BASE); - $namer = new Zend_Ldap_SearchTest_CustomNaming(); - $list->getInnerIterator()->setAttributeNameTreatment(array($namer, 'name2')); - $this->assertArrayHasKey('edoClatsop', $list->current()); - } -} - -function Zend_Ldap_SearchTest_customNaming($attrib) -{ - return strtoupper(strrev($attrib)); -} - -class Zend_Ldap_SearchTest_CustomNaming -{ - public static function name1($attrib) - { - return strtolower(strrev($attrib)); - } - - public function name2($attrib) - { - return strrev($attrib); - } -} - -class Zend_Ldap_SearchTest_CollectionClassNotSubclassingZendLdapCollection -{ } diff --git a/tests/Zend/Ldap/TestCase.php b/tests/Zend/Ldap/TestCase.php deleted file mode 100644 index 7b08830329..0000000000 --- a/tests/Zend/Ldap/TestCase.php +++ /dev/null @@ -1,61 +0,0 @@ - 'cn=name,dc=example,dc=org', - 'cn' => array('name'), - 'host' => array('a', 'b', 'c'), - 'empty' => array(), - 'boolean' => array('TRUE', 'FALSE'), - 'objectclass' => array('account', 'top'), - ); - return $data; - } - - /** - * @return Zend_Ldap_Node - */ - protected function _createTestNode() - { - return Zend_Ldap_Node::fromArray($this->_createTestArrayData(), true); - } -} diff --git a/tests/Zend/Ldap/_files/AttributeTest.input.txt b/tests/Zend/Ldap/_files/AttributeTest.input.txt deleted file mode 100644 index 83c1b193ea..0000000000 --- a/tests/Zend/Ldap/_files/AttributeTest.input.txt +++ /dev/null @@ -1 +0,0 @@ -String from file \ No newline at end of file From 1d78fe7c8288e05cce1cc3421b83e0f61d554517 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:49:41 -0500 Subject: [PATCH 34/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Serializer Tests --- tests/Zend/AllTests.php | 2 - tests/Zend/Serializer/Adapter/AllTests.php | 135 ------- tests/Zend/Serializer/Adapter/Amf0Test.php | 76 ---- tests/Zend/Serializer/Adapter/Amf3Test.php | 76 ---- .../Zend/Serializer/Adapter/IgbinaryTest.php | 174 -------- tests/Zend/Serializer/Adapter/JsonTest.php | 157 ------- tests/Zend/Serializer/Adapter/PhpCodeTest.php | 152 ------- .../Serializer/Adapter/PhpSerializeTest.php | 147 ------- .../PythonPickleSerializeProtocol0Test.php | 172 -------- .../PythonPickleSerializeProtocol1Test.php | 138 ------- .../Adapter/PythonPickleUnserializeTest.php | 382 ------------------ tests/Zend/Serializer/Adapter/WddxTest.php | 275 ------------- tests/Zend/Serializer/AllTests.php | 72 ---- tests/Zend/Serializer/SerializerTest.php | 132 ------ tests/Zend/Serializer/_files/Dummy.php | 31 -- 15 files changed, 2121 deletions(-) delete mode 100644 tests/Zend/Serializer/Adapter/AllTests.php delete mode 100644 tests/Zend/Serializer/Adapter/Amf0Test.php delete mode 100644 tests/Zend/Serializer/Adapter/Amf3Test.php delete mode 100644 tests/Zend/Serializer/Adapter/IgbinaryTest.php delete mode 100644 tests/Zend/Serializer/Adapter/JsonTest.php delete mode 100644 tests/Zend/Serializer/Adapter/PhpCodeTest.php delete mode 100644 tests/Zend/Serializer/Adapter/PhpSerializeTest.php delete mode 100644 tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol0Test.php delete mode 100644 tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol1Test.php delete mode 100644 tests/Zend/Serializer/Adapter/PythonPickleUnserializeTest.php delete mode 100644 tests/Zend/Serializer/Adapter/WddxTest.php delete mode 100644 tests/Zend/Serializer/AllTests.php delete mode 100644 tests/Zend/Serializer/SerializerTest.php delete mode 100644 tests/Zend/Serializer/_files/Dummy.php diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index 7df6f23c54..ac7bc0beb0 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -57,7 +57,6 @@ require_once 'Zend/Pdf/AllTests.php'; require_once 'Zend/ProgressBar/AllTests.php'; require_once 'Zend/RegistryTest.php'; -require_once 'Zend/Serializer/AllTests.php'; require_once 'Zend/Server/AllTests.php'; require_once 'Zend/Session/AllTests.php'; require_once 'Zend/Soap/AllTests.php'; @@ -163,7 +162,6 @@ public static function suite() $suite->addTest(Zend_Pdf_AllTests::suite()); $suite->addTest(Zend_ProgressBar_AllTests::suite()); $suite->addTestSuite('Zend_RegistryTest'); - $suite->addTest(Zend_Serializer_AllTests::suite()); $suite->addTest(Zend_Server_AllTests::suite()); $suite->addTest(Zend_Text_AllTests::suite()); $suite->addTestSuite('Zend_TimeSyncTest'); diff --git a/tests/Zend/Serializer/Adapter/AllTests.php b/tests/Zend/Serializer/Adapter/AllTests.php deleted file mode 100644 index 3386f35b27..0000000000 --- a/tests/Zend/Serializer/Adapter/AllTests.php +++ /dev/null @@ -1,135 +0,0 @@ -addTestSuite('Zend_Serializer_Adapter_PhpSerializeTest'); - $suite->addTestSuite('Zend_Serializer_Adapter_PhpCodeTest'); - $suite->addTestSuite('Zend_Serializer_Adapter_JsonTest'); - $suite->addTestSuite('Zend_Serializer_Adapter_Amf0Test'); - $suite->addTestSuite('Zend_Serializer_Adapter_Amf3Test'); - - if (!defined('TESTS_ZEND_SERIALIZER_ADAPTER_WDDX_ENABLED') || !TESTS_ZEND_SERIALIZER_ADAPTER_WDDX_ENABLED) { - $skippedTest = new Zend_Serializer_Adapter_WddxSkipTest(); - $skippedTest->message = 'this Adapter is not enabled in TestConfiguration.php'; - $suite->addTest($skippedTest); - } elseif (!extension_loaded('wddx')) { - $skippedTest = new Zend_Serializer_Adapter_WddxSkipTest(); - $skippedTest->message = 'extension "wddx" is not loaded'; - $suite->addTest($skippedTest); - } else { - $suite->addTestSuite('Zend_Serializer_Adapter_WddxTest'); - } - - if (!defined('TESTS_ZEND_SERIALIZER_ADAPTER_IGBINARY_ENABLED') || !TESTS_ZEND_SERIALIZER_ADAPTER_IGBINARY_ENABLED) { - $skippedTest = new Zend_Serializer_Adapter_IgbinarySkipTest(); - $skippedTest->message = 'this Adapter is not enabled in TestConfiguration.php'; - $suite->addTest($skippedTest); - } elseif (!extension_loaded('igbinary')) { - $skippedTest = new Zend_Serializer_Adapter_IgbinarySkipTest(); - $skippedTest->message = 'extension "igbinary" is not loaded'; - $suite->addTest($skippedTest); - } else { - $suite->addTestSuite('Zend_Serializer_Adapter_IgbinaryTest'); - } - - $suite->addTestSuite('Zend_Serializer_Adapter_PythonPickleSerializeProtocol0Test'); - $suite->addTestSuite('Zend_Serializer_Adapter_PythonPickleSerializeProtocol1Test'); - $suite->addTestSuite('Zend_Serializer_Adapter_PythonPickleUnserializeTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Serializer_Adapter_AllTests::main') { - Zend_Serializer_Adapter_AllTests::main(); -} diff --git a/tests/Zend/Serializer/Adapter/Amf0Test.php b/tests/Zend/Serializer/Adapter/Amf0Test.php deleted file mode 100644 index 41933bdef1..0000000000 --- a/tests/Zend/Serializer/Adapter/Amf0Test.php +++ /dev/null @@ -1,76 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_Amf0(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - /** - * Simple test to serialize a value using Zend_Amf_Parser_Amf0_Serializer - * -> This only tests the usage of Zend_Amf @see Zend_Amf_AllTests - */ - public function testSerialize() - { - $value = true; - $expected = "\x01\x01"; // Amf0 -> true - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - /** - * Simple test to serialize a value using Zend_Amf_Parser_Amf0_Deserializer - * -> This only tests the usage of Zend_Amf @see Zend_Amf_AllTests - */ - public function testUnserialize() - { - $expected = true; - $value = "\x01\x01"; // Amf0 -> true - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - -} diff --git a/tests/Zend/Serializer/Adapter/Amf3Test.php b/tests/Zend/Serializer/Adapter/Amf3Test.php deleted file mode 100644 index c4dee04178..0000000000 --- a/tests/Zend/Serializer/Adapter/Amf3Test.php +++ /dev/null @@ -1,76 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_Amf3(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - /** - * Simple test to serialize a value using Zend_Amf_Parser_Amf3_Serializer - * -> This only tests the usage of Zend_Amf @see Zend_Amf_AllTests - */ - public function testSerialize() - { - $value = true; - $expected = "\x03"; // Amf3 -> true - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - /** - * Simple test to unserialize a value using Zend_Amf_Parser_Amf3_Deserializer - * -> This only tests the usage of Zend_Amf @see Zend_Amf_AllTests - */ - public function testUnserialize() - { - $expected = true; - $value = "\x03"; // Amf3 -> true - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - -} diff --git a/tests/Zend/Serializer/Adapter/IgbinaryTest.php b/tests/Zend/Serializer/Adapter/IgbinaryTest.php deleted file mode 100644 index e77b9ff64e..0000000000 --- a/tests/Zend/Serializer/Adapter/IgbinaryTest.php +++ /dev/null @@ -1,174 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_Igbinary(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeString() - { - $value = 'test'; - $expected = igbinary_serialize($value); - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = igbinary_serialize($value); - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNull() - { - $value = null; - $expected = igbinary_serialize($value); - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNumeric() - { - $value = 100; - $expected = igbinary_serialize($value); - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new stdClass(); - $expected = igbinary_serialize($value); - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $expected = 'test'; - $value = igbinary_serialize($expected); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFalse() - { - $expected = false; - $value = igbinary_serialize($expected); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNull() - { - $expected = null; - $value = igbinary_serialize($expected); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNumeric() - { - $expected = 100; - $value = igbinary_serialize($expected); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeObject() - { - $expected = new stdClass(); - $value = igbinary_serialize($expected); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserialzeInvalid() - { - $value = "\0\1\r\n"; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - -} - - -/** - * @category Zend - * @package Zend_Serializer - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Serializer_Adapter_IgbinarySkipTest extends PHPUnit_Framework_TestCase -{ - public $message = null; - - public function setUp() - { - $message = 'Skipped Zend_Serializer_Adapter_IgbinaryTest'; - if ($this->message) { - $message.= ': ' . $this->message; - } - $this->markTestSkipped($message); - } - - public function testEmpty() - { - // this is here only so we have at least one test - } -} diff --git a/tests/Zend/Serializer/Adapter/JsonTest.php b/tests/Zend/Serializer/Adapter/JsonTest.php deleted file mode 100644 index 2267bb0507..0000000000 --- a/tests/Zend/Serializer/Adapter/JsonTest.php +++ /dev/null @@ -1,157 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_Json(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeString() - { - $value = 'test'; - $expected = '"test"'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = 'false'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNull() - { - $value = null; - $expected = 'null'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNumeric() - { - $value = 100; - $expected = '100'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new stdClass(); - $value->test = "test"; - $expected = '{"test":"test"}'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $value = '"test"'; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFalse() - { - $value = 'false'; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNull() { - $value = 'null'; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNumeric() - { - $value = '100'; - $expected = 100; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeAsArray() - { - $value = '{"test":"test"}'; - $expected = array('test' => 'test'); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeAsObject() - { - $value = '{"test":"test"}'; - $expected = new stdClass(); - $expected->test = 'test'; - - $data = $this->_adapter->unserialize($value, array('objectDecodeType' => Zend_Json::TYPE_OBJECT)); - $this->assertEquals($expected, $data); - } - - public function testUnserialzeInvalid() - { - $value = 'not a serialized string'; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - -} diff --git a/tests/Zend/Serializer/Adapter/PhpCodeTest.php b/tests/Zend/Serializer/Adapter/PhpCodeTest.php deleted file mode 100644 index aa7387880e..0000000000 --- a/tests/Zend/Serializer/Adapter/PhpCodeTest.php +++ /dev/null @@ -1,152 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_PhpCode(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeString() - { - $value = 'test'; - $expected = "'test'"; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = 'false'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNull() - { - $value = null; - $expected = 'NULL'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNumeric() - { - $value = 100.12345; - $expected = '100.12345'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new stdClass(); - $expected = "stdClass::__set_state(array(\n))"; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $value = "'test'"; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFalse() - { - $value = 'false'; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNull() - { - $value = 'NULL'; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNumeric() - { - $value = '100'; - $expected = 100; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - -/* TODO: PHP Fatal error: Call to undefined method stdClass::__set_state() - public function testUnserializeObject() - { - $value = "stdClass::__set_state(array(\n))"; - $expected = new stdClass(); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } -*/ - - public function testUnserialzeInvalid() - { - if (version_compare(phpversion(), '7', '>=')) { - $this->markTestSkipped('Evaling of invalid input is PHP Parse error in PHP7+'); - } - $value = 'not a serialized string'; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - -} diff --git a/tests/Zend/Serializer/Adapter/PhpSerializeTest.php b/tests/Zend/Serializer/Adapter/PhpSerializeTest.php deleted file mode 100644 index c15a277b2b..0000000000 --- a/tests/Zend/Serializer/Adapter/PhpSerializeTest.php +++ /dev/null @@ -1,147 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_PhpSerialize(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeString() - { - $value = 'test'; - $expected = 's:4:"test";'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = 'b:0;'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNull() - { - $value = null; - $expected = 'N;'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNumeric() - { - $value = 100; - $expected = 'i:100;'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new stdClass(); - $expected = 'O:8:"stdClass":0:{}'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $value = 's:4:"test";'; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFalse() - { - $value = 'b:0;'; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNull() - { - $value = 'N;'; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNumeric() - { - $value = 'i:100;'; - $expected = 100; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeObject() - { - $value = 'O:8:"stdClass":0:{}'; - $expected = new stdClass(); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserialzeInvalid() - { - $value = 'not a serialized string'; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - -} diff --git a/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol0Test.php b/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol0Test.php deleted file mode 100644 index 5370d33ba2..0000000000 --- a/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol0Test.php +++ /dev/null @@ -1,172 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_PythonPickle(array('protocol' => 0)); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeNull() - { - $value = null; - $expected = 'N.'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeTrue() - { - $value = true; - $expected = "I01\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = "I00\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeInt() - { - $value = -12345; - $expected = "I-12345\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFloat() - { - $value = -12345.6789; - $expected = "F-12345.6789\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeString() - { - $value = 'test'; - $expected = "S'test'\r\np0\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeStringWithSpecialChars() - { - $value = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" - . "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" - . "\xff\\\"'"; - $expected = "S'\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f" - . "\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f" - . "\\xff\\\\\"\\''\r\n" - . "p0\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeArrayList() - { - $value = array('1', '2', 'test'); - $expected = "(lp0\r\n" - . "S'1'\r\n" - . "p1\r\n" - . "aS'2'\r\n" - . "p2\r\n" - . "aS'test'\r\n" - . "p3\r\n" - . "a."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeArrayDict() - { - $value = array('1', '2', 'three' => 'test'); - $expected = "(dp0\r\n" - . "I0\r\n" - . "S'1'\r\n" - . "p1\r\n" - . "sI1\r\n" - . "S'2'\r\n" - . "p2\r\n" - . "sS'three'\r\n" - . "p3\r\n" - . "S'test'\r\n" - . "p4\r\n" - . "s."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new StdClass(); - $value->test = 'test'; - $value->test2 = 2; - $expected = "(dp0\r\n" - . "S'test'\r\n" - . "p1\r\n" - . "g1\r\n" - . "sS'test2'\r\n" - . "p2\r\n" - . "I2\r\n" - . "s."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - -} diff --git a/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol1Test.php b/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol1Test.php deleted file mode 100644 index f25b37f88a..0000000000 --- a/tests/Zend/Serializer/Adapter/PythonPickleSerializeProtocol1Test.php +++ /dev/null @@ -1,138 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_PythonPickle(array('protocol' => 1)); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeNull() - { - $value = null; - $expected = 'N.'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeTrue() - { - $value = true; - $expected = "I01\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = "I00\r\n."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeBinInt1() - { - $value = 255; - $expected = "K\xff."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeBinInt2() - { - $value = 256; - $expected = "M\x00\x01."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeBinInt() - { - $value = -2; - $expected = "J\xfe\xff\xff\xff."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeBinFloat() - { - $value = -12345.6789; - $expected = "G\xc0\xc8\x1c\xd6\xe6\x31\xf8\xa1."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeShortBinString() - { - $value = 'test'; - $expected = "U\x04test" - . "q\x00."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeBinString() - { - $value = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" - . "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789012345"; - $expected = "T\x00\x01\x00\x00" - . "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" - . "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789012345" - . "q\x00."; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - -} diff --git a/tests/Zend/Serializer/Adapter/PythonPickleUnserializeTest.php b/tests/Zend/Serializer/Adapter/PythonPickleUnserializeTest.php deleted file mode 100644 index 503270335d..0000000000 --- a/tests/Zend/Serializer/Adapter/PythonPickleUnserializeTest.php +++ /dev/null @@ -1,382 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_PythonPickle(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testUnserializeNone() - { - $value = "N."; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNewTrue() - { - $value = "\x80\x02\x88."; - $expected = true; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNewFalse() - { - $value = "\x80\x02\x89."; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeIntTrue() - { - $value = "I01\r\n."; - $expected = true; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeIntFalse() - { - $value = "I00\r\n."; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeInt() - { - $value = "I1\r\n."; - $expected = 1; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinInt() - { - $value = "\x80\x02J\xc7\xcf\xff\xff."; - $expected = -12345; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinInt1() - { - $value = "\x80\x02K\x02."; - $expected = 2; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinInt2() - { - $value = "\x80\x02M\x00\x01."; - $expected = 256; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeLong() - { - $value = "L9876543210L\r\n."; - $expected = '9876543210'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeLong1() - { - $value = "\x80\x02\x8a\x05\xea\x16\xb0\x4c\x02."; - $expected = '9876543210'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeLong4Positiv() - { - $value = "\x80\x02\x8b\x07\x00\x00\x00" - . str_pad("\xff", 7, "\x7f") - . "."; - $expected = '35887507618889727'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeLong4Negativ() - { - $value = "\x80\x02\x8b\x07\x00\x00\x00" - . str_pad("\x00", 7, "\x9f") - . "."; - $expected = '-27127564814278912'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeLong4InfBcMath() - { - $value = "\x80\x02\x8b\x08\x00\x00\x00" - . str_pad("\x00", 8, "\x9f") - . "."; - if (extension_loaded('bcmath')) { - $expected = '-6944656592455360768'; - } else { - $expected = INF; - } - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFloat() - { - $value = "F-12345.6789\r\n."; - $expected = -12345.6789; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinFloat() - { - $value = "\x80\x02G\xc0\xc8\x1c\xd6\xe6\x31\xf8\xa1."; - $expected = -12345.6789; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $value = "S'test'\r\np0\r\n."; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeStringDoubleQuotes() - { - $value = "S\"'t'e's't'\"\r\np0\r\n."; - $expected = "'t'e's't'"; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeStringWithSpecialChars() - { - $value = "S'\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f" - . "\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f" - . "\\xff\\\\\"\\''\r\n" - . "p0\r\n."; - $expected = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" - . "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" - . "\xff\\\"'"; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinString() - { - $value = "\x80\x02T\x00\x01\x00\x00" - . "01234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789" - . "01234567890123456789012345678901234567890123456789012345" - . "q\x00."; - $expected = '01234567890123456789012345678901234567890123456789' - . '01234567890123456789012345678901234567890123456789' - . '01234567890123456789012345678901234567890123456789' - . '01234567890123456789012345678901234567890123456789' - . '01234567890123456789012345678901234567890123456789012345'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeShortBinString() - { - $value = "\x80\x02U\x04" - . "test" - . "q\x00."; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeUnicode() - { - $value = "Vtest\\u0400\r\n" // test + ` + E - . "p0\r\n" - . "."; - $expected = "test\xd0\x80"; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeBinUnicode() - { - $value = "\x80\x02" . "X\x07\x00\x00\x00" . "test\xd0\x80\n."; - $expected = "test\xd0\x80\n"; // test + ` + E + \n - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeListAppend() - { - $value = "(lp0\r\n" - . "I1\r\n" - . "aI2\r\n" - . "aI3\r\n" - . "a."; - $expected = array(1,2,3); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeEmptyListAppends() - { - $value = "\x80\x02]q\x00(K\x01K\x02K\x03e."; - $expected = array(1,2,3); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeDictSetItem() - { - $value = "(dp0\r\n" - . "S'test1'\r\n" - . "p1\r\n" - . "I1\r\n" - . "sI0\r\n" - . "I2\r\n" - . "sS'test3'\r\n" - . "p2\r\n" - . "g2\r\n" - . "s."; - $expected = array('test1' => 1, 0 => 2, 'test3' => 'test3'); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeEmptyDictSetItems() - { - $value = "\x80\x02}q\x00(U\x05test1q\x01K\x01K\x00K\x02U\x05test3q\x02h\x02u."; - $expected = array('test1' => 1, 0 => 2, 'test3' => 'test3'); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeTuple() - { - $value = "(I1\r\n" - . "I2\r\n" - . "I3\r\n" - . "tp0\r\n" - . "."; - $expected = array(1,2,3); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeTuple1() - { - $value = "\x80\x02K\x01\x85q\x00."; - $expected = array(1); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeTuple2() - { - $value = "\x80\x02K\x01K\x02\x86q\x00."; - $expected = array(1,2); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeTuple3() - { - $value = "\x80\x02K\x01K\x02K\x03\x87q\x00."; - $expected = array(1,2,3); - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserialzeInvalid() - { - $value = 'not a serialized string'; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - -} diff --git a/tests/Zend/Serializer/Adapter/WddxTest.php b/tests/Zend/Serializer/Adapter/WddxTest.php deleted file mode 100644 index 48f6fdf0c6..0000000000 --- a/tests/Zend/Serializer/Adapter/WddxTest.php +++ /dev/null @@ -1,275 +0,0 @@ -_adapter = new Zend_Serializer_Adapter_Wddx(); - } - - public function tearDown() - { - $this->_adapter = null; - } - - public function testSerializeString() - { - $value = 'test'; - $expected = '
      ' - . 'test'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeStringWithComment() - { - $value = 'test'; - $expected = '
      a test comment
      ' - . 'test
      '; - - $data = $this->_adapter->serialize($value, array('comment' => 'a test comment')); - $this->assertEquals($expected, $data); - } - - public function testSerializeFalse() - { - $value = false; - $expected = '
      ' - . ''; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeTrue() - { - $value = true; - $expected = '
      ' - . ''; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNull() - { - $value = null; - $expected = '
      ' - . ''; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeNumeric() - { - $value = 100; - $expected = '
      ' - . '100'; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testSerializeObject() - { - $value = new stdClass(); - $value->test = "test"; - $expected = '
      ' - . '' - . 'stdClass' - . 'test' - . ''; - - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeString() - { - $value = '
      ' - . 'test'; - $expected = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeFalse() - { - $value = '
      ' - . ''; - $expected = false; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeTrue() - { - $value = '
      ' - . ''; - $expected = true; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNull1() - { - $value = '
      ' - . ''; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - /** - * test to unserialize a valid null value by an valid wddx - * but with some differenzes to the null cenerated by php - * -> the invalid check have to success for all valid wddx null - */ - public function testUnserializeNull2() - { - $value = '
      ' . "\n" - . ''; - $expected = null; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeNumeric() - { - $value = '
      ' - . '100'; - $expected = 100; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeObject() - { - $value = '
      ' - . '' - . 'stdClass' - . 'test' - . ''; - $expected = new stdClass(); - $expected->test = 'test'; - - $data = $this->_adapter->unserialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserialzeInvalid() - { - $value = 'not a serialized string'; - $this->setExpectedException('Zend_Serializer_Exception'); - $this->_adapter->unserialize($value); - } - - /** - * ZF-8911 and PHP-Bug #46496 - * This bug effects php < 5.2.7 - * - * No workaround implemented !!! - This test failes on php < 5.2.7 - */ - public function testSerializeStringUtf8() { - $value = "\xc2\xbf"; // Ξ - $expected = '
      ' - . "\xc2\xbf"; - $data = $this->_adapter->serialize($value); - $this->assertEquals($expected, $data); - } - - public function testUnserializeInvalidXml() - { - if (!class_exists('SimpleXMLElement', false)) { - $this->markTestSkipped('Skipped by missing ext/simplexml'); - } - - $value = 'not a serialized string'; - $this->setExpectedException( - 'Zend_Serializer_Exception', - 'Can\'t unserialize wddx string' - ); - $this->_adapter->unserialize($value); - } - - public function testShouldThrowExceptionIfXmlToUnserializeFromContainsADoctype() - { - $value = '' - . '
      ' - . 'test'; - $this->setExpectedException("Zend_Serializer_Exception"); - $data = $this->_adapter->unserialize($value); - } -} - - -/** - * @category Zend - * @package Zend_Serializer - * @subpackage UnitTests - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Serializer_Adapter_WddxSkipTest extends PHPUnit_Framework_TestCase -{ - public $message = null; - - public function setUp() - { - $message = 'Skipped Zend_Serializer_Adapter_WddxTest'; - if ($this->message) { - $message.= ': ' . $this->message; - } - $this->markTestSkipped($message); - } - - public function testEmpty() - { - // this is here only so we have at least one test - } - -} - diff --git a/tests/Zend/Serializer/AllTests.php b/tests/Zend/Serializer/AllTests.php deleted file mode 100644 index 23fb91d55f..0000000000 --- a/tests/Zend/Serializer/AllTests.php +++ /dev/null @@ -1,72 +0,0 @@ -addTest(Zend_Serializer_Adapter_AllTests::suite()); - - /** - * Performe Zend_Serializer tests - */ - $suite->addTestSuite('Zend_Serializer_SerializerTest'); - - return $suite; - } - -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Serializer_AllTests::main') { - Zend_Serializer_AllTests::main(); -} diff --git a/tests/Zend/Serializer/SerializerTest.php b/tests/Zend/Serializer/SerializerTest.php deleted file mode 100644 index b4230a55ae..0000000000 --- a/tests/Zend/Serializer/SerializerTest.php +++ /dev/null @@ -1,132 +0,0 @@ -assertTrue(Zend_Serializer::getAdapterLoader() instanceof Zend_Loader_PluginLoader); - } - - public function testChangeAdapterLoader() - { - $newLoader = new Zend_Loader_PluginLoader(); - Zend_Serializer::setAdapterLoader($newLoader); - $this->assertTrue(Zend_Serializer::getAdapterLoader() === $newLoader); - } - - public function testFactoryValidCall() - { - $serializer = Zend_Serializer::factory('PhpSerialize'); - $this->assertTrue($serializer instanceof Zend_Serializer_Adapter_PhpSerialize); - } - - public function testFactoryUnknownAdapter() - { - $this->setExpectedException('Zend_Serializer_Exception','Can\'t load serializer adapter'); - Zend_Serializer::factory('unknown'); - } - - public function testFactoryOnADummyClassAdapter() - { - $this->setExpectedException('Zend_Serializer_Exception','must implement Zend_Serializer_Adapter_AdapterInterface'); - Zend_Serializer::setAdapterLoader(new Zend_Loader_PluginLoader(array('Zend_Serializer_Adapter' => dirname(__FILE__) . '/_files'))); - Zend_Serializer::factory('dummy'); - } - - public function testDefaultAdapter() - { - $adapter = Zend_Serializer::getDefaultAdapter(); - $this->assertTrue($adapter instanceof Zend_Serializer_Adapter_AdapterInterface); - } - - public function testChangeDefaultAdapterWithString() - { - $newAdapter = 'Json'; - Zend_Serializer::setDefaultAdapter($newAdapter); - $this->assertTrue(Zend_Serializer::getDefaultAdapter() instanceof Zend_Serializer_Adapter_Json); - } - - public function testChangeDefaultAdapterWithInstance() - { - $newAdapter = new Zend_Serializer_Adapter_PhpSerialize(); - - Zend_Serializer::setDefaultAdapter($newAdapter); - $this->assertTrue($newAdapter === Zend_Serializer::getDefaultAdapter()); - } - - public function testSerializeDefaultAdapter() - { - $value = 'test'; - $adapter = Zend_Serializer::getDefaultAdapter(); - $expected = $adapter->serialize($value); - $this->assertEquals($expected, Zend_Serializer::serialize($value)); - } - - public function testSerializeSpecificAdapter() - { - $value = 'test'; - $adapter = new Zend_Serializer_Adapter_Json(); - $expected = $adapter->serialize($value); - $this->assertEquals($expected, Zend_Serializer::serialize($value, array('adapter' => $adapter))); - } - - public function testUnserializeDefaultAdapter() - { - $value = 'test'; - $adapter = Zend_Serializer::getDefaultAdapter(); - $value = $adapter->serialize($value); - $expected = $adapter->unserialize($value); - $this->assertEquals($expected, Zend_Serializer::unserialize($value)); - } - - public function testUnserializeSpecificAdapter() - { - $adapter = new Zend_Serializer_Adapter_Json(); - $value = '"test"'; - $expected = $adapter->unserialize($value); - $this->assertEquals($expected, Zend_Serializer::unserialize($value, array('adapter' => $adapter))); - } - -} diff --git a/tests/Zend/Serializer/_files/Dummy.php b/tests/Zend/Serializer/_files/Dummy.php deleted file mode 100644 index c5d4474722..0000000000 --- a/tests/Zend/Serializer/_files/Dummy.php +++ /dev/null @@ -1,31 +0,0 @@ - Date: Fri, 6 Apr 2018 11:50:58 -0500 Subject: [PATCH 35/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Wildfire Tests and Demos --- .../IndexController.php | 18 - .../IndexController.php | 13 - .../controllers/ErrorController.php | 51 - .../controllers/IndexController.php | 38 - .../ZendDbProfilerFirebugController.php | 91 -- .../ZendLogWriterFirebugController.php | 94 -- .../ZendWildfirePluginFirePhpController.php | 44 - .../views/scripts/error/error.phtml | 16 - .../views/scripts/index/index.phtml | 58 - .../test-logging.phtml | 16 - .../test-multiple-databases.phtml | 16 - .../test-error-controller.phtml | 0 .../test-grouped-logging.phtml | 16 - .../test-large-message.phtml | 16 - .../test-logging.phtml | 16 - .../test-groups.phtml | 16 - demos/Zend/Wildfire/public/.htaccess | 6 - .../TestDocExample.php | 51 - .../TestDocExample.php | 41 - demos/Zend/Wildfire/public/index.php | 66 - tests/Zend/AllTests.php | 6 - tests/Zend/Wildfire/AllTests.php | 56 - tests/Zend/Wildfire/WildfireTest.php | 1210 ----------------- .../Zend/Wildfire/_files/IndexController.php | 49 - 24 files changed, 2004 deletions(-) delete mode 100644 demos/Zend/Wildfire/application/controllers/Boot/Zend-Db-Profiler-Firebug/IndexController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/Boot/Zend-Log-Writer-Firebug/IndexController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/ErrorController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/IndexController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/ZendDbProfilerFirebugController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/ZendLogWriterFirebugController.php delete mode 100644 demos/Zend/Wildfire/application/controllers/ZendWildfirePluginFirePhpController.php delete mode 100644 demos/Zend/Wildfire/application/views/scripts/error/error.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/index/index.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-logging.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-multiple-databases.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-error-controller.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-grouped-logging.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-large-message.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-logging.phtml delete mode 100644 demos/Zend/Wildfire/application/views/scripts/zend-wildfire-plugin-firephp/test-groups.phtml delete mode 100644 demos/Zend/Wildfire/public/.htaccess delete mode 100644 demos/Zend/Wildfire/public/Boot/Zend-Db-Profiler-Firebug/TestDocExample.php delete mode 100644 demos/Zend/Wildfire/public/Boot/Zend-Log-Writer-Firebug/TestDocExample.php delete mode 100644 demos/Zend/Wildfire/public/index.php delete mode 100644 tests/Zend/Wildfire/AllTests.php delete mode 100644 tests/Zend/Wildfire/WildfireTest.php delete mode 100644 tests/Zend/Wildfire/_files/IndexController.php diff --git a/demos/Zend/Wildfire/application/controllers/Boot/Zend-Db-Profiler-Firebug/IndexController.php b/demos/Zend/Wildfire/application/controllers/Boot/Zend-Db-Profiler-Firebug/IndexController.php deleted file mode 100644 index 688fa3979c..0000000000 --- a/demos/Zend/Wildfire/application/controllers/Boot/Zend-Db-Profiler-Firebug/IndexController.php +++ /dev/null @@ -1,18 +0,0 @@ -getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - - $db->insert('foo', array('id'=>1,'col1'=>'original')); - } -} diff --git a/demos/Zend/Wildfire/application/controllers/Boot/Zend-Log-Writer-Firebug/IndexController.php b/demos/Zend/Wildfire/application/controllers/Boot/Zend-Log-Writer-Firebug/IndexController.php deleted file mode 100644 index f811e3b90f..0000000000 --- a/demos/Zend/Wildfire/application/controllers/Boot/Zend-Log-Writer-Firebug/IndexController.php +++ /dev/null @@ -1,13 +0,0 @@ -log('This is a log message!', Zend_Log::INFO); - } -} diff --git a/demos/Zend/Wildfire/application/controllers/ErrorController.php b/demos/Zend/Wildfire/application/controllers/ErrorController.php deleted file mode 100644 index 6203f0ba9b..0000000000 --- a/demos/Zend/Wildfire/application/controllers/ErrorController.php +++ /dev/null @@ -1,51 +0,0 @@ -err($this->_getParam('error_handler')->exception); - - } catch(Exception $e) { - - /* TODO: You can log this exception somewhere or display it during development. - * DO NOT USE THE logger here as it will create an infinite loop! - */ - - } - } -} - diff --git a/demos/Zend/Wildfire/application/controllers/IndexController.php b/demos/Zend/Wildfire/application/controllers/IndexController.php deleted file mode 100644 index 2d7adb6afa..0000000000 --- a/demos/Zend/Wildfire/application/controllers/IndexController.php +++ /dev/null @@ -1,38 +0,0 @@ -getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - - $db->insert('foo', array('id'=>1,'col1'=>'original')); - - $db->fetchAll('SELECT * FROM foo WHERE id = ?', 1); - - $db->update('foo', array('col1'=>'new'), 'id = 1'); - - $db->fetchAll('SELECT * FROM foo WHERE id = ?', 1); - - $db->delete('foo', 'id = 1'); - - $db->getConnection()->exec('DROP TABLE foo'); - } - - public function testmultipledatabasesAction() - { - $profiler1 = new Zend_Db_Profiler_Firebug('All DB Queries for first database'); - - $db1 = Zend_Db::factory('PDO_SQLITE', - array('dbname' => ':memory:', - 'profiler' => $profiler1)); - - $db1->getProfiler()->setEnabled(true); - - $profiler2 = new Zend_Db_Profiler_Firebug('All DB Queries for second database'); - - $db2 = Zend_Db::factory('PDO_SQLITE', - array('dbname' => ':memory:', - 'profiler' => $profiler2)); - - $db2->getProfiler()->setEnabled(true); - - $db1->getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - - $db1->insert('foo', array('id'=>1,'col1'=>'original')); - - $db2->getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - - $db2->insert('foo', array('id'=>1,'col1'=>'original')); - } - -} - diff --git a/demos/Zend/Wildfire/application/controllers/ZendLogWriterFirebugController.php b/demos/Zend/Wildfire/application/controllers/ZendLogWriterFirebugController.php deleted file mode 100644 index 964396f5a0..0000000000 --- a/demos/Zend/Wildfire/application/controllers/ZendLogWriterFirebugController.php +++ /dev/null @@ -1,94 +0,0 @@ -log('Emergency: system is unusable', Zend_Log::EMERG); - $logger->log('Alert: action must be taken immediately', Zend_Log::ALERT); - $logger->log('Critical: critical conditions', Zend_Log::CRIT); - $logger->log('Error: error conditions', Zend_Log::ERR); - $logger->log('Warning: warning conditions', Zend_Log::WARN); - $logger->log('Notice: normal but significant condition', Zend_Log::NOTICE); - $logger->log('Informational: informational messages', Zend_Log::INFO); - $logger->log('Debug: debug messages', Zend_Log::DEBUG); - $logger->log(array('$_SERVER',$_SERVER), Zend_Log::DEBUG); - - $logger->trace('Trace to here'); - - $table = array('Summary line for the table', - array( - array('Column 1', 'Column 2'), - array('Row 1 c 1',' Row 1 c 2'), - array('Row 2 c 1',' Row 2 c 2') - ) - ); - $logger->table($table); - } - - public function testgroupedloggingAction() - { - $logger = Zend_Registry::get('logger'); - - Zend_Wildfire_Plugin_FirePhp::group("Collapsed Group", array('Collapsed' => true)); - $logger->log('Message in collapsed group', Zend_Log::DEBUG); - Zend_Wildfire_Plugin_FirePhp::groupEnd(); - - Zend_Wildfire_Plugin_FirePhp::group("Expanded Group", array('Collapsed' => false)); - $logger->log('Message in expanded group', Zend_Log::DEBUG); - Zend_Wildfire_Plugin_FirePhp::groupEnd(); - } - - public function testerrorcontrollerAction() - { - require_once 'Zend/Exception.php'; - throw new Zend_Exception('Test Exception'); - } - - public function testlargemessageAction() - { - $message = array(); - - for ( $i=0 ; $i<300 ; $i++ ) { - $message[] = 'This is message #' . $i; - } - - $logger = Zend_Registry::get('logger'); - $logger->log($message, Zend_Log::INFO); - } -} diff --git a/demos/Zend/Wildfire/application/controllers/ZendWildfirePluginFirePhpController.php b/demos/Zend/Wildfire/application/controllers/ZendWildfirePluginFirePhpController.php deleted file mode 100644 index 387f5369a8..0000000000 --- a/demos/Zend/Wildfire/application/controllers/ZendWildfirePluginFirePhpController.php +++ /dev/null @@ -1,44 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -We had an error! But it's ok. We are testing the ErrorController. - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/index/index.phtml b/demos/Zend/Wildfire/application/views/scripts/index/index.phtml deleted file mode 100644 index bf000d245d..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/index/index.phtml +++ /dev/null @@ -1,58 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - - - - - - -
      -

      Zend_Log_Writer_Firebug

      - -

      Zend_Db_Profiler_Firebug

      - -

      Zend_Wildfire_Plugin_FirePhp

      - - -
      -
      - -

      Requirements

      - - -

      Instructions

      -

      Click on the links above and
      look for output in the Firebug Console.

      - -
      - -
      - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-logging.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-logging.phtml deleted file mode 100644 index 811241b903..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-logging.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Logging - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-multiple-databases.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-multiple-databases.phtml deleted file mode 100644 index 4868c5b1ac..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-db-profiler-firebug/test-multiple-databases.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Multiple Databases - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-error-controller.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-error-controller.phtml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-grouped-logging.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-grouped-logging.phtml deleted file mode 100644 index 15b2fad85f..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-grouped-logging.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Grouped Logging - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-large-message.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-large-message.phtml deleted file mode 100644 index dcc6d63af8..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-large-message.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Large Message - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-logging.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-logging.phtml deleted file mode 100644 index 811241b903..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-log-writer-firebug/test-logging.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Logging - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/application/views/scripts/zend-wildfire-plugin-firephp/test-groups.phtml b/demos/Zend/Wildfire/application/views/scripts/zend-wildfire-plugin-firephp/test-groups.phtml deleted file mode 100644 index 6929734b2a..0000000000 --- a/demos/Zend/Wildfire/application/views/scripts/zend-wildfire-plugin-firephp/test-groups.phtml +++ /dev/null @@ -1,16 +0,0 @@ - - - Zend_Wildfire Demos and Tests - - - - -Test Groups - - - \ No newline at end of file diff --git a/demos/Zend/Wildfire/public/.htaccess b/demos/Zend/Wildfire/public/.htaccess deleted file mode 100644 index 545b1cbfdf..0000000000 --- a/demos/Zend/Wildfire/public/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - -RewriteEngine on - -RewriteRule Boot/(.*) Boot/$1 [QSA,L] - -RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php \ No newline at end of file diff --git a/demos/Zend/Wildfire/public/Boot/Zend-Db-Profiler-Firebug/TestDocExample.php b/demos/Zend/Wildfire/public/Boot/Zend-Db-Profiler-Firebug/TestDocExample.php deleted file mode 100644 index 4c9f4ac398..0000000000 --- a/demos/Zend/Wildfire/public/Boot/Zend-Db-Profiler-Firebug/TestDocExample.php +++ /dev/null @@ -1,51 +0,0 @@ -setEnabled(true); - $db = Zend_Db::factory('PDO_SQLITE', array('dbname' => ':memory:')); - $db->setProfiler($profiler); - Zend_Registry::set('db',$db); - - $controller = Zend_Controller_Front::getInstance(); - $controller->setParam('useDefaultControllerAlways',true); - $controller->setParam('noViewRenderer', true); - $controller->setControllerDirectory(dirname(dirname(dirname(dirname(__FILE__)))).'/application/controllers/Boot/Zend-Db-Profiler-Firebug'); - $controller->dispatch(); - - print 'Test Doc Example with Controller'; - break; - - case 'WithoutController': - - $profiler = new Zend_Db_Profiler_Firebug('All DB Queries'); - $profiler->setEnabled(true); - $db = Zend_Db::factory('PDO_SQLITE', array('dbname' => ':memory:')); - $db->setProfiler($profiler); - - $request = new Zend_Controller_Request_Http(); - $response = new Zend_Controller_Response_Http(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($request); - $channel->setResponse($response); - - $db->getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - - $db->insert('foo', array('id'=>1,'col1'=>'original')); - - $channel->flush(); - $response->sendHeaders(); - - print 'Test Doc Example without Controller'; - break; - -} diff --git a/demos/Zend/Wildfire/public/Boot/Zend-Log-Writer-Firebug/TestDocExample.php b/demos/Zend/Wildfire/public/Boot/Zend-Log-Writer-Firebug/TestDocExample.php deleted file mode 100644 index afa923774d..0000000000 --- a/demos/Zend/Wildfire/public/Boot/Zend-Log-Writer-Firebug/TestDocExample.php +++ /dev/null @@ -1,41 +0,0 @@ -setParam('useDefaultControllerAlways',true); - $controller->setParam('noViewRenderer', true); - $controller->setControllerDirectory(dirname(dirname(dirname(dirname(__FILE__)))).'/application/controllers/Boot/Zend-Log-Writer-Firebug'); - $controller->dispatch(); - - print 'Test Doc Example with Controller'; - break; - - case 'WithoutController': - - $writer = new Zend_Log_Writer_Firebug(); - $logger = new Zend_Log($writer); - - $request = new Zend_Controller_Request_Http(); - $response = new Zend_Controller_Response_Http(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($request); - $channel->setResponse($response); - - $logger->log('This is a log message!', Zend_Log::INFO); - - $channel->flush(); - $response->sendHeaders(); - - print 'Test Doc Example without Controller'; - break; -} diff --git a/demos/Zend/Wildfire/public/index.php b/demos/Zend/Wildfire/public/index.php deleted file mode 100644 index 12dab18658..0000000000 --- a/demos/Zend/Wildfire/public/index.php +++ /dev/null @@ -1,66 +0,0 @@ -setPriorityStyle(8, 'TABLE'); -$writer->setPriorityStyle(9, 'TRACE'); - -$logger = new Zend_Log($writer); -$logger->addPriority('TABLE', 8); -$logger->addPriority('TRACE', 9); - -Zend_Registry::set('logger',$logger); - - -/* - * Add our Firebug DB Profiler to the registry - */ - -require_once 'Zend/Db.php'; -require_once 'Zend/Db/Profiler/Firebug.php'; - -$profiler = new Zend_Db_Profiler_Firebug('All DB Queries'); - -$db = Zend_Db::factory('PDO_SQLITE', - array('dbname' => ':memory:', - 'profiler' => $profiler)); - -$db->getProfiler()->setEnabled(true); - -Zend_Registry::set('db',$db); - - -/* - * Run the front controller - */ - -require_once 'Zend/Controller/Front.php'; - -Zend_Controller_Front::run(dirname(dirname(__FILE__)).'/application/controllers'); diff --git a/tests/Zend/AllTests.php b/tests/Zend/AllTests.php index ac7bc0beb0..d8258d3e35 100644 --- a/tests/Zend/AllTests.php +++ b/tests/Zend/AllTests.php @@ -68,9 +68,6 @@ require_once 'Zend/Uri/AllTests.php'; require_once 'Zend/ValidateTest.php'; require_once 'Zend/Validate/AllTests.php'; -if (PHP_OS != 'AIX') { - require_once 'Zend/Wildfire/AllTests.php'; -} /** * @category Zend @@ -171,9 +168,6 @@ public static function suite() $suite->addTest(Zend_Uri_AllTests::suite()); $suite->addTestSuite('Zend_ValidateTest'); $suite->addTest(Zend_Validate_AllTests::suite()); - if (PHP_OS != 'AIX') { - $suite->addTest(Zend_Wildfire_AllTests::suite()); - } return $suite; } diff --git a/tests/Zend/Wildfire/AllTests.php b/tests/Zend/Wildfire/AllTests.php deleted file mode 100644 index 7f14a6a6f4..0000000000 --- a/tests/Zend/Wildfire/AllTests.php +++ /dev/null @@ -1,56 +0,0 @@ -addTestSuite('Zend_Wildfire_WildfireTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Wildfire_AllTests::main') { - Zend_Wildfire_AllTests::main(); -} diff --git a/tests/Zend/Wildfire/WildfireTest.php b/tests/Zend/Wildfire/WildfireTest.php deleted file mode 100644 index f03a456cb3..0000000000 --- a/tests/Zend/Wildfire/WildfireTest.php +++ /dev/null @@ -1,1210 +0,0 @@ -resetInstance(); - Zend_Wildfire_Channel_HttpHeaders::destroyInstance(); - Zend_Wildfire_Plugin_FirePhp::destroyInstance(); - } - - protected function _setupWithFrontController() - { - $this->_request = new Zend_Wildfire_WildfireTest_Request(); - $this->_response = new Zend_Wildfire_WildfireTest_Response(); - $this->_controller = Zend_Controller_Front::getInstance(); - $this->_controller->resetInstance(); - $this->_controller->setControllerDirectory(dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files') - ->setRequest($this->_request) - ->setResponse($this->_response) - ->setParam('noErrorHandler', true) - ->setParam('noViewRenderer', true) - ->throwExceptions(false); - - Zend_Wildfire_Plugin_FirePhp::getInstance()->setOption('includeLineNumbers', false); - - $this->_request->setUserAgentExtensionEnabled(true); - } - - protected function _setupWithoutFrontController($ModifyOptions=true) - { - $this->_request = new Zend_Wildfire_WildfireTest_Request(); - $this->_response = new Zend_Wildfire_WildfireTest_Response(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($this->_request); - $channel->setResponse($this->_response); - - if ($ModifyOptions) { - Zend_Wildfire_Plugin_FirePhp::getInstance()->setOption('includeLineNumbers', false); - } - - $this->_request->setUserAgentExtensionEnabled(true); - } - - public function testNoResponseObject() - { - Zend_Wildfire_Plugin_FirePhp::getInstance()->setEnabled(false); - Zend_Wildfire_Plugin_FirePhp::send('Hello World'); - - Zend_Wildfire_Plugin_FirePhp::getInstance()->setEnabled(true); - try { - Zend_Wildfire_Plugin_FirePhp::send('Hello World'); - $this->fail('Should throw a response object not initialized error'); - } catch (Exception $e) { - // success - } - } - - public function testIsReady1() - { - $this->_setupWithFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - - $this->assertTrue($channel->isReady(true)); - - $this->_request->setUserAgentExtensionEnabled(false); - - $this->assertFalse($channel->isReady(true)); - - $this->_request->setUserAgentExtensionEnabled(true, 'User-Agent'); - - $this->assertTrue($channel->isReady(true)); - - $this->_request->setUserAgentExtensionEnabled(true, 'X-FirePHP-Version'); - - $this->assertTrue($channel->isReady(true)); - } - - public function testIsReady2() - { - $this->_setupWithoutFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - - $this->assertTrue($channel->isReady()); - - $this->_request->setUserAgentExtensionEnabled(false); - - $this->assertFalse($channel->isReady()); - - $this->_request->setUserAgentExtensionEnabled(true, 'User-Agent'); - - $this->assertTrue($channel->isReady()); - - $this->_request->setUserAgentExtensionEnabled(true, 'X-FirePHP-Version'); - - $this->assertTrue($channel->isReady()); - } - - public function testFirePhpPluginInstanciation() - { - $this->_setupWithoutFrontController(); - try { - Zend_Wildfire_Plugin_FirePhp::getInstance(); - Zend_Wildfire_Plugin_FirePhp::init(null); - $this->fail('Should not be able to re-initialize'); - } catch (Exception $e) { - // success - } - } - - public function testFirePhpPluginEnablement() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->assertFalse($protocol->getMessages()); - - $this->assertTrue($firephp->getEnabled()); - - $this->assertTrue($firephp->send('Hello World')); - - $messages = array(Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE=> - array(Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI=> - array('[{"Type":"LOG"},"Hello World"]'))); - - $this->assertEquals(serialize($protocol->getMessages()), - serialize($messages)); - - $this->assertTrue($firephp->setEnabled(false)); - - $this->assertFalse($firephp->send('Hello World')); - - $this->assertFalse($protocol->getMessages()); - } - - public function testSetControllerPluginStackIndex1() - { - $this->_setupWithoutFrontController(); - $controller = Zend_Controller_Front::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $firephp->send('Hello World'); - - $plugins = $controller->getPlugins(); - - $this->assertEquals($plugins[999],$channel); - } - - public function testSetControllerPluginStackIndex2() - { - $this->_setupWithoutFrontController(false); - - $controller = Zend_Controller_Front::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - - Zend_Wildfire_Channel_HttpHeaders::setControllerPluginStackIndex(99); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $firephp->send('Hello World'); - - $plugins = $controller->getPlugins(); - - $this->assertEquals($plugins[99],$channel); - } - - public function testBasicLogging1() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $message = 'This is a log message!'; - - $firephp->send($message); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '41|[{"Type":"LOG"},"This is a log message!"]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - public function testBasicLogging2() - { - $this->_setupWithFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $message = 'This is a log message!'; - - $firephp->send($message); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '41|[{"Type":"LOG"},"This is a log message!"]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - /** - * At this point UTF-8 characters are not supported as Zend_Json_Decoder - * does not support them. - * Once ZF-4054 is resolved this test must be updated. - */ - public function testUTF8Logging() - { - $this->_setupWithFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $encodedMessage = $message = 'Отладочный'; - - if (function_exists('json_encode') && Zend_Json::$useBuiltinEncoderDecoder !== true) { - $encodedMessage = '\u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439'; - } - - $firephp->send($message); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = (strlen($encodedMessage)+19).'|[{"Type":"LOG"},"'.$encodedMessage.'"]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - public function testCyclicalObjectLogging() - { - $this->_setupWithFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $obj1 = new Zend_Wildfire_WildfireTest_JsonEncodingTestClass(); - $obj2 = new Zend_Wildfire_WildfireTest_JsonEncodingTestClass(); - - $obj1->child = $obj2; - $obj2->child = $obj1; - - $firephp->send($obj1); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '257|[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_JsonEncodingTestClass","undeclared:child":{"__className":"Zend_Wildfire_WildfireTest_JsonEncodingTestClass","undeclared:child":"** Recursion (Zend_Wildfire_WildfireTest_JsonEncodingTestClass) **"}}]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - /** - * @group ZF-4927 - */ - public function testAdvancedLogging() - { - Zend_Wildfire_Plugin_FirePhp::getInstance()->setOption('maxTraceDepth',0); - - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $message = 'This is a log message!'; - $label = 'Test Label'; - $table = array('Summary line for the table', - array( - array('Column 1', 'Column 2'), - array('Row 1 c 1',' Row 1 c 2'), - array('Row 2 c 1',' Row 2 c 2') - ) - ); - - $firephp->send($message, null, 'TRACE'); - $firephp->send($table, null, 'TABLE'); - - Zend_Wildfire_Plugin_FirePhp::send($message, $label); - Zend_Wildfire_Plugin_FirePhp::send($message, $label, Zend_Wildfire_Plugin_FirePhp::DUMP); - - try { - throw new Exception('Test Exception'); - } catch (Exception $e) { - Zend_Wildfire_Plugin_FirePhp::send($e); - } - - try { - Zend_Wildfire_Plugin_FirePhp::send($message, $label, 'UNKNOWN'); - $this->fail('Should not be able to log with undefined log style'); - } catch (Exception $e) { - // success - } - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $messages = array(Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE=> - array(Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI=> - array(1=>'[{"Type":"TABLE"},["Summary line for the table",[["Column 1","Column 2"],["Row 1 c 1"," Row 1 c 2"],["Row 2 c 1"," Row 2 c 2"]]]]', - 2=>'[{"Type":"LOG","Label":"Test Label"},"This is a log message!"]')), - Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_DUMP=> - array(Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI=> - array('{"Test Label":"This is a log message!"}'))); - - $qued_messages = $protocol->getMessages(); - unset($qued_messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0]); - unset($qued_messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][3]); - - $this->assertEquals(serialize($qued_messages), - serialize($messages)); - } - - - public function testMessage() - { - $this->_setupWithoutFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $message = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, 'Message 1'); - - - $this->assertEquals($message->getStyle(), Zend_Wildfire_Plugin_FirePhp::LOG); - - $message->setStyle(Zend_Wildfire_Plugin_FirePhp::INFO); - - $this->assertEquals($message->getStyle(), Zend_Wildfire_Plugin_FirePhp::INFO); - - - $this->assertNull($message->getLabel()); - - $message->setLabel('Label 1'); - - $this->assertEquals($message->getLabel(), 'Label 1'); - - - $this->assertFalse($message->getDestroy()); - - $message->setDestroy(true); - - $this->assertTrue($message->getDestroy()); - - - $this->assertEquals($message->getMessage(), 'Message 1'); - - $message->setMessage('Message 2'); - - $this->assertEquals($message->getMessage(), 'Message 2'); - - - - $message->setDestroy(true); - $this->assertfalse(Zend_Wildfire_Plugin_FirePhp::send($message)); - - $message->setDestroy(false); - $this->assertTrue(Zend_Wildfire_Plugin_FirePhp::send($message)); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertEquals($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0], - '[{"Type":"INFO","Label":"Label 1"},"Message 2"]'); - } - - - /** - * @group ZF-5742 - */ - public function testTableMessage() - { - $table = new Zend_Wildfire_Plugin_FirePhp_TableMessage('TestMessage'); - - $this->assertEquals($table->getLabel(), 'TestMessage'); - - try { - $table->getLastRow(); - $this->fail('Should throw exception when no rows exist'); - } catch (Exception $e) { - // success - } - - $row = array('col1','col2'); - - $this->assertEquals($table->getRowCount(), 0); - - try { - $table->getRowAt(1); - $this->fail('Should throw exception as no rows present'); - } catch (Exception $e) { - // success - } - - try { - $table->setRowAt(1,array()); - $this->fail('Should throw exception as no rows present'); - } catch (Exception $e) { - // success - } - - $table->addRow($row); - - $this->assertEquals($table->getMessage(), array($row)); - $this->assertEquals($table->getLastRow(), $row); - - $this->assertEquals($table->getRowCount(), 1); - - $table->addRow($row); - - $this->assertEquals($table->getMessage(), array($row, - $row)); - - $this->assertEquals($table->getRowCount(), 2); - $this->assertEquals($table->getLastRow(), $row); - - try { - $table->getRowAt(2); - $this->fail('Should throw exception as index is out of bounds'); - } catch (Exception $e) { - // success - } - - try { - $table->setRowAt(2,array()); - $this->fail('Should throw exception as index is out of bounds'); - } catch (Exception $e) { - // success - } - - $rowOld = $table->getRowAt(1); - $this->assertEquals($rowOld, $row); - - $rowOld[1] = 'Column2'; - $table->setRowAt(1, $rowOld); - - $this->assertEquals($table->getRowAt(1), $rowOld); - $this->assertEquals($table->getLastRow(), $rowOld); - - $this->assertEquals($table->getMessage(), array($row, - $rowOld)); - - $header = array('hc1', 'hc2'); - $table->setHeader($header); - - $this->assertEquals($table->getMessage(), array($header, - $row, - $rowOld)); - } - - /** - * @group ZF-6396 - */ - public function testTableMessage2() - { - $this->_setupWithoutFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $table = new Zend_Wildfire_Plugin_FirePhp_TableMessage('TestMessage'); - $table->setHeader(array('col1','col2')); - $table->setBuffered(true); - - Zend_Wildfire_Plugin_FirePhp::send($table); - - $cell = new ArrayObject(); - $cell->append("item1"); - $cell->append("item2"); - - $table->addRow(array("row1", $cell)); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertEquals($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0], - '[{"Type":"TABLE","Label":"TestMessage"},[["col1","col2"],["row1",{"__className":"ArrayObject","undeclared:0":"item1","undeclared:1":"item2"}]]]'); - } - - public function testMessageGroups() - { - $this->_setupWithFrontController(); - - Zend_Wildfire_Plugin_FirePhp::group('Test Group'); - Zend_Wildfire_Plugin_FirePhp::send('Test Message'); - Zend_Wildfire_Plugin_FirePhp::groupEnd(); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '50|[{"Type":"GROUP_START","Label":"Test Group"},null]|'; - $headers['X-Wf-1-1-1-2'] = '31|[{"Type":"LOG"},"Test Message"]|'; - $headers['X-Wf-1-1-1-3'] = '27|[{"Type":"GROUP_END"},null]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - /** - * @group ZF-10761 - */ - public function testMessageGroupsWithCollapsedTrueOption() - { - $this->_setupWithFrontController(); - - Zend_Wildfire_Plugin_FirePhp::group('Test Group', array('Collapsed' => true)); - Zend_Wildfire_Plugin_FirePhp::send('Test Message'); - Zend_Wildfire_Plugin_FirePhp::groupEnd(); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '69|[{"Type":"GROUP_START","Label":"Test Group","Collapsed":"true"},null]|'; - $headers['X-Wf-1-1-1-2'] = '31|[{"Type":"LOG"},"Test Message"]|'; - $headers['X-Wf-1-1-1-3'] = '27|[{"Type":"GROUP_END"},null]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - /** - * @group ZF-10761 - */ - public function testMessageGroupsWithCollapsedFalseOption() - { - $this->_setupWithFrontController(); - - Zend_Wildfire_Plugin_FirePhp::group('Test Group', array('Collapsed' => false)); - Zend_Wildfire_Plugin_FirePhp::send('Test Message'); - Zend_Wildfire_Plugin_FirePhp::groupEnd(); - - $this->_controller->dispatch(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '70|[{"Type":"GROUP_START","Label":"Test Group","Collapsed":"false"},null]|'; - $headers['X-Wf-1-1-1-2'] = '31|[{"Type":"LOG"},"Test Message"]|'; - $headers['X-Wf-1-1-1-3'] = '27|[{"Type":"GROUP_END"},null]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - public function testMessageComparison() - { - $label = 'Message'; - - $message1 = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, $label); - - $message2 = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, $label); - - $this->assertNotEquals($message1,$message2); - } - - public function testBufferedMessage1() - { - $this->_setupWithoutFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $message = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, 'Message 1'); - $this->assertFalse($message->setBuffered(true)); - - Zend_Wildfire_Plugin_FirePhp::send($message); - - $this->assertFalse($protocol->getMessages()); - - $message->setMessage('Message 2'); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertEquals($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0], - '[{"Type":"LOG"},"Message 2"]'); - } - - public function testBufferedMessage2() - { - $this->_setupWithFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $message = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, 'Message 1'); - $this->assertFalse($message->setBuffered(true)); - - Zend_Wildfire_Plugin_FirePhp::send($message); - - $this->assertFalse($protocol->getMessages()); - - $message->setMessage('Message 2'); - - $this->_controller->dispatch(); - - $messages = $protocol->getMessages(); - - $this->assertEquals($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0], - '[{"Type":"LOG"},"Message 2"]'); - } - - public function testDestroyedBufferedMessage() - { - $this->_setupWithoutFrontController(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $message = new Zend_Wildfire_Plugin_FirePhp_Message(Zend_Wildfire_Plugin_FirePhp::LOG, 'Message 1'); - $message->setBuffered(true); - - Zend_Wildfire_Plugin_FirePhp::send($message); - - $this->assertEquals($message->getStyle(), Zend_Wildfire_Plugin_FirePhp::LOG); - - $message->setStyle(Zend_Wildfire_Plugin_FirePhp::INFO); - - $this->assertEquals($message->getStyle(), Zend_Wildfire_Plugin_FirePhp::INFO); - - $message->setDestroy(true); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $this->assertFalse($protocol->getMessages()); - } - - public function testChannelInstanciation() - { - $this->_setupWithoutFrontController(); - try { - Zend_Wildfire_Channel_HttpHeaders::getInstance(); - Zend_Wildfire_Channel_HttpHeaders::init(null); - $this->fail('Should not be able to re-initialize'); - } catch (Exception $e) { - // success - } - } - - public function testChannelFlush() - { - $this->_setupWithoutFrontController(false); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - - $this->assertFalse($channel->flush(), 'Nothing to flush - No messages'); - - Zend_Wildfire_Plugin_FirePhp::send('Hello World'); - - $this->assertTrue($channel->flush(), 'One message to flush'); - - $this->_request->setUserAgentExtensionEnabled(false); - - $this->assertFalse($channel->flush(), 'Nothing to flush - Extension not in UserAgent'); - } - - public function testFirePhpPluginSubclass() - { - - $firephp = Zend_Wildfire_Plugin_FirePhp::init('Zend_Wildfire_WildfireTest_FirePhpPlugin'); - - $this->assertEquals(get_class($firephp), - 'Zend_Wildfire_WildfireTest_FirePhpPlugin'); - - Zend_Wildfire_Plugin_FirePhp::destroyInstance(); - - try { - Zend_Wildfire_Plugin_FirePhp::init('Zend_Wildfire_WildfireTest_Request'); - $this->fail('Should not be able to initialize'); - } catch (Exception $e) { - // success - } - - $this->assertNull(Zend_Wildfire_Plugin_FirePhp::getInstance(true)); - - try { - Zend_Wildfire_Plugin_FirePhp::init(array()); - $this->fail('Should not be able to initialize'); - } catch (Exception $e) { - // success - } - - $this->assertNull(Zend_Wildfire_Plugin_FirePhp::getInstance(true)); - } - - public function testHttpHeadersChannelSubclass() - { - - $firephp = Zend_Wildfire_Channel_HttpHeaders::init('Zend_Wildfire_WildfireTest_HttpHeadersChannel'); - - $this->assertEquals(get_class($firephp), - 'Zend_Wildfire_WildfireTest_HttpHeadersChannel'); - - Zend_Wildfire_Channel_HttpHeaders::destroyInstance(); - - try { - Zend_Wildfire_Channel_HttpHeaders::init('Zend_Wildfire_WildfireTest_Request'); - $this->fail('Should not be able to initialize'); - } catch (Exception $e) { - // success - } - - $this->assertNull(Zend_Wildfire_Channel_HttpHeaders::getInstance(true)); - - try { - Zend_Wildfire_Channel_HttpHeaders::init(array()); - $this->fail('Should not be able to initialize'); - } catch (Exception $e) { - // success - } - - $this->assertNull(Zend_Wildfire_Channel_HttpHeaders::getInstance(true)); - } - - /** - * @group ZF-4843 - */ - public function testResourceLogging() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $firephp->send(array('file'=>tmpfile())); - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - $this->assertEquals(substr($message,0,41) - , '[{"Type":"LOG"},{"file":"** Resource id #'); - } - - /** - * @group ZF-4863 - */ - public function testLargeMessages() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $data = array(); - for ($i=0 ; $i < 400 ; $i++) { - $data[] = 'Test Data '.$i; - } - $firephp->send($data); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $this->_response->getHeadersForTesting(); - - $this->assertTrue(substr($messages[3]['value'],0,10)=='6308|[{"Ty' - && substr($messages[3]['value'],-8,8)==',"Test|\\' - && substr($messages[4]['value'],0,10)=='| Data 318' - && substr($messages[4]['value'],-7,7)=='399"]]|'); - } - - /** - * @group ZF-5540 - */ - public function testOptions() - { - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - - $_options = array( - 'traceOffset' => 1, /* The offset in the trace which identifies the source of the message */ - 'maxTraceDepth' => 99, /* Maximum depth for stack traces */ - 'maxObjectDepth' => 10, /* The maximum depth to traverse objects when encoding */ - 'maxArrayDepth' => 20, /* The maximum depth to traverse nested arrays when encoding */ - 'includeLineNumbers' => true /* Whether to include line and file info for each message */ - ); - - $this->assertEquals($firephp->getOptions(), $_options, 'Ensure defaults stay the same'); - - $this->assertEquals($firephp->setOption('includeLineNumbers',false), - $_options['includeLineNumbers'], - 'Should return old value'); - - $this->assertEquals($firephp->getOption('includeLineNumbers'), - false, - 'Should contain new value'); - } - - /** - * @group ZF-5540 - */ - public function testObjectFilter() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $obj = new Zend_Wildfire_WildfireTest_TestObject1(); - - $firephp->send($obj); - - $firephp->setObjectFilter('Zend_Wildfire_WildfireTest_TestObject1',array('value', 'protectedStatic')); - - $firephp->send($obj); - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - if (version_compare(phpversion(), '5.3' , '<')) { - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject1","public:name":"Name","public:value":"Value","protected:static:protectedStatic":"** Need PHP 5.3 to get value **"}]'); - } else - if (version_compare(phpversion(), '5.3' , '>=')) { - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject1","public:name":"Name","public:value":"Value","protected:static:protectedStatic":"ProtectedStatic"}]'); - } - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [1]; - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject1","public:name":"Name","public:value":"** Excluded by Filter **","protected:static:protectedStatic":"** Excluded by Filter **"}]'); - } - - public function testObjectMembers() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $obj = new Zend_Wildfire_WildfireTest_TestObject2(); - - $firephp->send($obj); - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - if (version_compare(phpversion(), '5.3' , '<')) { - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject2","public:public":"Public","private:private":"Private","protected:protected":"Protected","public:static:static":"Static","private:static:staticPrivate":"** Need PHP 5.3 to get value **","protected:static:staticProtected":"** Need PHP 5.3 to get value **"}]'); - - } else - if (version_compare(phpversion(), '5.3' , '>=')) { - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject2","public:public":"Public","private:private":"Private","protected:protected":"Protected","public:static:static":"Static","private:static:staticPrivate":"StaticPrivate","protected:static:staticProtected":"StaticProtected"}]'); - } - } - - /** - * @group ZF-5540 - */ - public function testMaxObjectArrayDepth() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $firephp->setOption('maxObjectDepth',2); - $firephp->setOption('maxArrayDepth',1); - - $obj = new Zend_Wildfire_WildfireTest_TestObject3(); - $obj->testArray = array('val1',array('val2',array('Hello World'))); - $obj->child = clone $obj; - $obj->child->child = clone $obj; - - $firephp->send($obj); - - - $table = array(); - $table[] = array('Col1', 'Col2'); - $table[] = array($obj, $obj); - - $firephp->send($table, 'Label', Zend_Wildfire_Plugin_FirePhp::TABLE); - - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - $this->assertEquals($message, - '[{"Type":"LOG"},{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":"** Max Object Depth (2) **"}}]'); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [1]; - - $this->assertEquals($message, - '[{"Type":"TABLE","Label":"Label"},[["Col1","Col2"],[{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":"** Max Object Depth (2) **"}},{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":{"__className":"Zend_Wildfire_WildfireTest_TestObject3","public:name":"Name","public:value":"Value","undeclared:testArray":["val1","** Max Array Depth (1) **"],"undeclared:child":"** Max Object Depth (2) **"}}]]]'); - } - - /** - * @group ZF-10526 - */ - public function testNonHTTPRequest() - { - $this->_request = new Zend_Controller_Request_Simple(); - $this->_response = new Zend_Wildfire_WildfireTest_Response(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($this->_request); - $channel->setResponse($this->_response); - - // this should not fail with: PHP Fatal error: Call to undefined method Zend_Controller_Request_Simple::getHeader() - $this->assertFalse($channel->isReady()); - - // this should not fail with: PHP Fatal error: Call to undefined method Zend_Controller_Request_Simple::getHeader() - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $firephp->send('This is a log message!'); - } - - /** - * @group ZF-10537 - */ - public function testFileLineOffsets() - { - $this->_setupWithoutFrontController(); - - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - $firephp->setOption('includeLineNumbers', true); - $firephp->setOption('maxTraceDepth', 0); - - $lines = array(); - // NOTE: Do NOT separate the following pairs otherwise the line numbers will not match for the test - - // Message number: 1 - $lines[] = __LINE__+1; - $firephp->send('Hello World'); - - // Message number: 2 - $lines[] = __LINE__+1; - $firephp->send('Hello World', null, 'TRACE'); - - // Message number: 3 - $table = array('Summary line for the table', - array( - array('Column 1', 'Column 2'), - array('Row 1 c 1',' Row 1 c 2'), - array('Row 2 c 1',' Row 2 c 2') - ) - ); - $lines[] = __LINE__+1; - $firephp->send($table, null, 'TABLE'); - - $messages = $protocol->getMessages(); - $messages = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI]; - - for( $i=0 ; $ifail("File and line does not match for message number: " . ($i+1)); - } - - } - } -} - -class Zend_Wildfire_WildfireTest_TestObject1 -{ - var $name = 'Name'; - var $value = 'Value'; - protected static $protectedStatic = 'ProtectedStatic'; -} - -class Zend_Wildfire_WildfireTest_TestObject2 -{ - var $public = 'Public'; - private $private = 'Private'; - protected $protected = 'Protected'; - - static $static = 'Static'; - static private $staticPrivate = 'StaticPrivate'; - static protected $staticProtected = 'StaticProtected'; -} - -class Zend_Wildfire_WildfireTest_TestObject3 -{ - var $name = 'Name'; - var $value = 'Value'; -} - -class Zend_Wildfire_WildfireTest_JsonEncodingTestClass -{ -} - - -class Zend_Wildfire_WildfireTest_FirePhpPlugin extends Zend_Wildfire_Plugin_FirePhp -{ -} - -class Zend_Wildfire_WildfireTest_HttpHeadersChannel extends Zend_Wildfire_Channel_HttpHeaders -{ -} - -class Zend_Wildfire_WildfireTest_Request extends Zend_Controller_Request_HttpTestCase -{ - - protected $_enabled = false; - protected $_enabled_headerName = false; - - public function setUserAgentExtensionEnabled($enabled, $headerName = "User-Agent") { - $this->_enabled = $enabled; - $this->_enabled_headerName = $headerName; - } - - public function getHeader($header, $default = null) - { - if ($header == 'User-Agent' && $this->_enabled_headerName == 'User-Agent') { - if ($this->_enabled) { - return 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 FirePHP/0.1.0'; - } else { - return 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'; - } - } else - if ($header == 'X-FirePHP-Version' && $this->_enabled_headerName == 'X-FirePHP-Version') { - if ($this->_enabled) { - return '0.1.0'; - } - } - return null; - } -} - - -class Zend_Wildfire_WildfireTest_Response extends Zend_Controller_Response_HttpTestCase -{ - - public function getHeadersForTesting() - { - return $this->getHeaders(); - } - - public function verifyHeaders($headers) - { - $response_headers = $this->getHeaders(); - if (!$response_headers) { - return false; - } - - $keys1 = array_keys($headers); - sort($keys1); - $keys1 = serialize($keys1); - - $keys2 = array(); - foreach ($response_headers as $header ) { - $keys2[] = $header['name']; - } - sort($keys2); - $keys2 = serialize($keys2); - - if ($keys1 != $keys2) { - return false; - } - - $values1 = array_values($headers); - sort($values1); - $values1 = serialize($values1); - - $values2 = array(); - foreach ($response_headers as $header ) { - $values2[] = $header['value']; - } - sort($values2); - $values2 = serialize($values2); - - if ($values1 != $values2) { - return false; - } - - return true; - } - -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Wildfire_WildfireTest::main') { - Zend_Wildfire_WildfireTest::main(); -} diff --git a/tests/Zend/Wildfire/_files/IndexController.php b/tests/Zend/Wildfire/_files/IndexController.php deleted file mode 100644 index c903a11dc4..0000000000 --- a/tests/Zend/Wildfire/_files/IndexController.php +++ /dev/null @@ -1,49 +0,0 @@ - Date: Fri, 6 Apr 2018 11:53:51 -0500 Subject: [PATCH 36/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Db_Profiler_Firebug Tests --- tests/Zend/Db/Profiler/AllTests.php | 2 - tests/Zend/Db/Profiler/FirebugTest.php | 219 ------------------------- 2 files changed, 221 deletions(-) delete mode 100644 tests/Zend/Db/Profiler/FirebugTest.php diff --git a/tests/Zend/Db/Profiler/AllTests.php b/tests/Zend/Db/Profiler/AllTests.php index 4764c2cf53..7e6ab1af3f 100644 --- a/tests/Zend/Db/Profiler/AllTests.php +++ b/tests/Zend/Db/Profiler/AllTests.php @@ -24,8 +24,6 @@ define('PHPUnit_MAIN_METHOD', 'Zend_Db_Profiler_AllTests::main'); } -require_once 'Zend/Db/Profiler/FirebugTest.php'; - /** * @category Zend * @package Zend_Db diff --git a/tests/Zend/Db/Profiler/FirebugTest.php b/tests/Zend/Db/Profiler/FirebugTest.php deleted file mode 100644 index eb2f89ebeb..0000000000 --- a/tests/Zend/Db/Profiler/FirebugTest.php +++ /dev/null @@ -1,219 +0,0 @@ -markTestSkipped('Requires PDO_Sqlite extension'); - } - - date_default_timezone_set('America/Los_Angeles'); - - $this->_request = new Zend_Db_Profiler_FirebugTest_Request(); - $this->_response = new Zend_Db_Profiler_FirebugTest_Response(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($this->_request); - $channel->setResponse($this->_response); - - $this->_profiler = new Zend_Db_Profiler_Firebug(); - $this->_db = Zend_Db::factory('PDO_SQLITE', - array('dbname' => ':memory:', - 'profiler' => $this->_profiler)); - $this->_db->getConnection()->exec('CREATE TABLE foo ( - id INTEGNER NOT NULL, - col1 VARCHAR(10) NOT NULL - )'); - } - - public function tearDown() - { - if (extension_loaded('pdo_sqlite')) { - $this->_db->getConnection()->exec('DROP TABLE foo'); - } - - Zend_Wildfire_Channel_HttpHeaders::destroyInstance(); - Zend_Wildfire_Plugin_FirePhp::destroyInstance(); - } - - public function testEnable() - { - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->_db->insert('foo', array('id'=>1,'col1'=>'original')); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $this->assertFalse($protocol->getMessages()); - - $this->_profiler->setEnabled(true); - - $this->_db->insert('foo', array('id'=>1,'col1'=>'original')); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertEquals(substr($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0],0,55), - '[{"Type":"TABLE","Label":"Zend_Db_Profiler_Firebug (1 @'); - } - - public function testDisable() - { - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->_profiler->setEnabled(true); - - $this->_db->insert('foo', array('id'=>1,'col1'=>'original')); - - $this->_profiler->setEnabled(false); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $this->assertFalse($protocol->getMessages()); - } - - public function testCustomLabel() - { - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->_profiler = new Zend_Db_Profiler_Firebug('Label 1'); - $this->_profiler->setEnabled(true); - $this->_db->setProfiler($this->_profiler); - $this->_db->insert('foo', array('id'=>1,'col1'=>'original')); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertEquals(substr($messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0],0,38), - '[{"Type":"TABLE","Label":"Label 1 (1 @'); - } - - public function testNoQueries() - { - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->_profiler->setEnabled(true); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertFalse($messages); - } - - /** - * @group ZF-6395 - */ - public function testNoQueriesAfterFiltering() - { - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $profiler = $this->_profiler->setEnabled(true); - $profiler->setFilterQueryType(Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); - $this->_db->fetchAll('select * from foo'); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $messages = $protocol->getMessages(); - - $this->assertFalse($messages); - } - -} - - -class Zend_Db_Profiler_FirebugTest_Request extends Zend_Controller_Request_Http -{ - public function getHeader($header) - { - if ($header == 'User-Agent') { - return 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 FirePHP/0.1.0'; - } - } -} - -class Zend_Db_Profiler_FirebugTest_Response extends Zend_Controller_Response_Http -{ - public function canSendHeaders($throw = false) - { - return true; - } -} From 86ec1e144b2704d70023445c669e3901e6f127c8 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:54:59 -0500 Subject: [PATCH 37/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Log_Formatter_Firebug Tests --- tests/Zend/Log/Formatter/AllTests.php | 1 - tests/Zend/Log/Formatter/FirebugTest.php | 73 ------------------------ 2 files changed, 74 deletions(-) delete mode 100644 tests/Zend/Log/Formatter/FirebugTest.php diff --git a/tests/Zend/Log/Formatter/AllTests.php b/tests/Zend/Log/Formatter/AllTests.php index 57a2615b63..f5014c34a2 100644 --- a/tests/Zend/Log/Formatter/AllTests.php +++ b/tests/Zend/Log/Formatter/AllTests.php @@ -24,7 +24,6 @@ define('PHPUnit_MAIN_METHOD', 'Zend_Log_Formatter_AllTests::main'); } -require_once 'Zend/Log/Formatter/FirebugTest.php'; require_once 'Zend/Log/Formatter/SimpleTest.php'; require_once 'Zend/Log/Formatter/XmlTest.php'; diff --git a/tests/Zend/Log/Formatter/FirebugTest.php b/tests/Zend/Log/Formatter/FirebugTest.php deleted file mode 100644 index 85779d20aa..0000000000 --- a/tests/Zend/Log/Formatter/FirebugTest.php +++ /dev/null @@ -1,73 +0,0 @@ - date('c'), - 'message' => 'tottakai', - 'priority' => 2, - 'priorityName' => 'CRIT' - ); - $formatter = new Zend_Log_Formatter_Firebug(); - $output = $formatter->format($event); - - $this->assertEquals('tottakai', $output); - } - - /** - * @group ZF-9176 - */ - public function testFactory() - { - $options = array(); - $formatter = Zend_Log_Formatter_Firebug::factory($options); - $this->assertTrue($formatter instanceof Zend_Log_Formatter_Firebug); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Log_Formatter_FirebugTest::main') { - Zend_Log_Formatter_FirebugTest::main(); -} From 9f316108b29190de9d9d0aa4e684d905c93c6ecf Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:56:05 -0500 Subject: [PATCH 38/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Log_Writer_Firebug Tests --- tests/Zend/Log/Writer/AllTests.php | 3 - tests/Zend/Log/Writer/FirebugTest.php | 421 -------------------------- 2 files changed, 424 deletions(-) delete mode 100644 tests/Zend/Log/Writer/FirebugTest.php diff --git a/tests/Zend/Log/Writer/AllTests.php b/tests/Zend/Log/Writer/AllTests.php index 42772e37fd..4d50a3436e 100644 --- a/tests/Zend/Log/Writer/AllTests.php +++ b/tests/Zend/Log/Writer/AllTests.php @@ -26,9 +26,6 @@ require_once 'Zend/Log/Writer/AbstractTest.php'; require_once 'Zend/Log/Writer/DbTest.php'; -if (PHP_OS != 'AIX') { - require_once 'Zend/Log/Writer/FirebugTest.php'; -} require_once 'Zend/Log/Writer/MailTest.php'; require_once 'Zend/Log/Writer/MockTest.php'; require_once 'Zend/Log/Writer/NullTest.php'; diff --git a/tests/Zend/Log/Writer/FirebugTest.php b/tests/Zend/Log/Writer/FirebugTest.php deleted file mode 100644 index f9adadcf6c..0000000000 --- a/tests/Zend/Log/Writer/FirebugTest.php +++ /dev/null @@ -1,421 +0,0 @@ -resetInstance(); - - $this->_request = new Zend_Log_Writer_FirebugTest_Request(); - $this->_response = new Zend_Log_Writer_FirebugTest_Response(); - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $channel->setRequest($this->_request); - $channel->setResponse($this->_response); - - $this->_writer = new Zend_Log_Writer_Firebug(); - - // Explicitly enable writer as it is disabled by default - // when running from the command line. - $this->_writer->setEnabled(true); - - $this->_logger = new Zend_Log($this->_writer); - - Zend_Wildfire_Plugin_FirePhp::getInstance()->setOption('includeLineNumbers', false); - } - - public function tearDown() - { - Zend_Wildfire_Channel_HttpHeaders::destroyInstance(); - Zend_Wildfire_Plugin_FirePhp::destroyInstance(); - } - - - /** - * Test for ZF-3960 - * - * Zend_Log_Writer_Firebug should be automatically disabled when - * run from the command line - */ - public function testZf3960() - { - Zend_Wildfire_Channel_HttpHeaders::destroyInstance(); - Zend_Wildfire_Plugin_FirePhp::destroyInstance(); - - $log = new Zend_Log(); - $writerFirebug = new Zend_Log_Writer_Firebug(); - $log->addWriter($writerFirebug); - $log->log('hi', 2); - } - - /** - * @group ZF-4952 - */ - public function testSetFormatter() - { - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $this->_logger->log('Test Message 1', Zend_Log::INFO); - - $formatter = new Zend_Log_Writer_FirebugTest_Formatter(); - $this->_writer->setFormatter($formatter); - - $this->_logger->setEventItem('testLabel','Test Label'); - - $this->_logger->log('Test Message 2', Zend_Log::INFO); - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - $this->assertEquals($message, - '[{"Type":"INFO"},"Test Message 1"]'); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [1]; - - $this->assertEquals($message, - '[{"Type":"INFO"},"Test Label : Test Message 2"]'); - } - - /** - * @group ZF-4952 - */ - public function testEventItemLabel() - { - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - - $this->_logger->log('Test Message 1', Zend_Log::INFO); - - $this->_logger->setEventItem('firebugLabel','Test Label'); - - $this->_logger->log('Test Message 2', Zend_Log::INFO); - - $messages = $protocol->getMessages(); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [0]; - - $this->assertEquals($message, - '[{"Type":"INFO"},"Test Message 1"]'); - - $message = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE] - [Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI] - [1]; - - $this->assertEquals($message, - '[{"Type":"INFO","Label":"Test Label"},"Test Message 2"]'); - } - - public function testLogStyling() - { - $this->assertEquals($this->_writer->getDefaultPriorityStyle(), - Zend_Wildfire_Plugin_FirePhp::LOG); - $this->assertEquals($this->_writer->setDefaultPriorityStyle(Zend_Wildfire_Plugin_FirePhp::WARN), - Zend_Wildfire_Plugin_FirePhp::LOG); - $this->assertEquals($this->_writer->getDefaultPriorityStyle(), - Zend_Wildfire_Plugin_FirePhp::WARN); - - $this->assertEquals($this->_writer->getPriorityStyle(9), - false); - $this->assertEquals($this->_writer->setPriorityStyle(9,Zend_Wildfire_Plugin_FirePhp::WARN), - true); - $this->assertEquals($this->_writer->getPriorityStyle(9), - Zend_Wildfire_Plugin_FirePhp::WARN); - $this->assertEquals($this->_writer->setPriorityStyle(9,Zend_Wildfire_Plugin_FirePhp::LOG), - Zend_Wildfire_Plugin_FirePhp::WARN); - } - - public function testBasicLogging() - { - $message = 'This is a log message!'; - - $this->_logger->log($message, Zend_Log::INFO); - - Zend_Wildfire_Channel_HttpHeaders::getInstance()->flush(); - - $headers = array(); - $headers['X-Wf-Protocol-1'] = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - $headers['X-Wf-1-Structure-1'] = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - $headers['X-Wf-1-Plugin-1'] = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - $headers['X-Wf-1-1-1-1'] = '42|[{"Type":"INFO"},"This is a log message!"]|'; - - $this->assertTrue($this->_response->verifyHeaders($headers)); - } - - - /** - * @group ZF-4934 - */ - public function testAdvancedLogging() - { - Zend_Wildfire_Plugin_FirePhp::getInstance()->setOption('maxTraceDepth',0); - - $message = 'This is a log message!'; - $label = 'Test Label'; - $table = array('Summary line for the table', - array( - array('Column 1', 'Column 2'), - array('Row 1 c 1',' Row 1 c 2'), - array('Row 2 c 1',' Row 2 c 2') - ) - ); - - - $this->_logger->addPriority('TRACE', 8); - $this->_logger->addPriority('TABLE', 9); - $this->_writer->setPriorityStyle(8, 'TRACE'); - $this->_writer->setPriorityStyle(9, 'TABLE'); - - $this->_logger->trace($message); - $this->_logger->table($table); - - try { - throw new Exception('Test Exception'); - } catch (Exception $e) { - $this->_logger->err($e); - } - - try { - Zend_Wildfire_Plugin_FirePhp::send($message, $label, 'UNKNOWN'); - $this->fail('Should not be able to log with undefined log style'); - } catch (Exception $e) { - // success - } - - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - - $messages = array(Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE=> - array(Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI=> - array(1=>'[{"Type":"TABLE"},["Summary line for the table",[["Column 1","Column 2"],["Row 1 c 1"," Row 1 c 2"],["Row 2 c 1"," Row 2 c 2"]]]]'))); - - $qued_messages = $protocol->getMessages(); - - unset($qued_messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][0]); - unset($qued_messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI][2]); - - $this->assertEquals(serialize($qued_messages), - serialize($messages)); - } - - public function testFactory() - { - $cfg = array('log' => array('memory' => array( - 'writerName' => "Firebug" - ))); - - $logger = Zend_Log::factory($cfg['log']); - $this->assertTrue($logger instanceof Zend_Log); - } - - /** - * @group ZF-10537 - */ - public function testFileLineOffsets() - { - $firephp = Zend_Wildfire_Plugin_FirePhp::getInstance(); - $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); - $protocol = $channel->getProtocol(Zend_Wildfire_Plugin_FirePhp::PROTOCOL_URI); - $firephp->setOption('includeLineNumbers', true); - $firephp->setOption('maxTraceDepth', 0); - - $lines = array(); - // NOTE: Do NOT separate the following pairs otherwise the line numbers will not match for the test - - // Message number: 1 - $lines[] = __LINE__+1; - $this->_logger->log('Hello World', Zend_Log::INFO); - - // Message number: 2 - $this->_logger->addPriority('TRACE', 8); - $this->_writer->setPriorityStyle(8, 'TRACE'); - $lines[] = __LINE__+1; - $this->_logger->trace('Trace to here'); - - // Message number: 3 - $this->_logger->addPriority('TABLE', 9); - $this->_writer->setPriorityStyle(9, 'TABLE'); - $table = array('Summary line for the table', - array( - array('Column 1', 'Column 2'), - array('Row 1 c 1',' Row 1 c 2'), - array('Row 2 c 1',' Row 2 c 2') - ) - ); - $lines[] = __LINE__+1; - $this->_logger->table($table); - - // Message number: 4 - $lines[] = __LINE__+1; - $this->_logger->info('Hello World'); - - $messages = $protocol->getMessages(); - $messages = $messages[Zend_Wildfire_Plugin_FirePhp::STRUCTURE_URI_FIREBUGCONSOLE][Zend_Wildfire_Plugin_FirePhp::PLUGIN_URI]; - - for( $i=0 ; $ifail("File and line does not match for message number: " . ($i+1)); - } - - } - } -} - -class Zend_Log_Writer_FirebugTest_Formatter extends Zend_Log_Formatter_Firebug -{ - public function format($event) - { - return $event['testLabel'].' : '.$event['message']; - } -} - - -class Zend_Log_Writer_FirebugTest_Request extends Zend_Controller_Request_Http -{ - public function getHeader($header) - { - if ($header == 'User-Agent') { - return 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 FirePHP/0.1.0'; - } - } -} - - -class Zend_Log_Writer_FirebugTest_Response extends Zend_Controller_Response_Http -{ - - public function canSendHeaders($throw = false) - { - return true; - } - - public function verifyHeaders($headers) - { - - $response_headers = $this->getHeaders(); - if (!$response_headers) { - return false; - } - - $keys1 = array_keys($headers); - sort($keys1); - $keys1 = serialize($keys1); - - $keys2 = array(); - foreach ($response_headers as $header ) { - $keys2[] = $header['name']; - } - sort($keys2); - $keys2 = serialize($keys2); - - if ($keys1 != $keys2) { - return false; - } - - $values1 = array_values($headers); - sort($values1); - $values1 = serialize($values1); - - $values2 = array(); - foreach ($response_headers as $header ) { - $values2[] = $header['value']; - } - sort($values2); - $values2 = serialize($values2); - - if ($values1 != $values2) { - return false; - } - - return true; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Log_Writer_FirebugTest::main') { - Zend_Log_Writer_FirebugTest::main(); -} From e03a82feb2e9752b4245795727d7e0e0ecfacde9 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:58:28 -0500 Subject: [PATCH 39/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Application Tests --- tests/Zend/Application/AllTests.php | 64 -- tests/Zend/Application/ApplicationTest.php | 546 ------------ .../Bootstrap/BootstrapAbstractTest.php | 843 ------------------ .../Application/Bootstrap/BootstrapTest.php | 215 ----- .../Application/Module/AutoloaderTest.php | 190 ---- .../Zend/Application/Module/BootstrapTest.php | 237 ----- tests/Zend/Application/Resource/AllTests.php | 89 -- .../Application/Resource/CacheManagerTest.php | 285 ------ tests/Zend/Application/Resource/DbTest.php | 253 ------ tests/Zend/Application/Resource/DojoTest.php | 124 --- .../Resource/FrontcontrollerTest.php | 418 --------- .../Zend/Application/Resource/LayoutTest.php | 121 --- .../Zend/Application/Resource/LocaleTest.php | 190 ---- tests/Zend/Application/Resource/LogTest.php | 190 ---- tests/Zend/Application/Resource/MailTest.php | 237 ----- .../Zend/Application/Resource/ModulesTest.php | 217 ----- .../Zend/Application/Resource/MultidbTest.php | 249 ------ .../Application/Resource/NavigationTest.php | 215 ----- .../Resource/ResourceAbstractTest.php | 196 ---- .../Zend/Application/Resource/RouterTest.php | 135 --- .../Zend/Application/Resource/SessionTest.php | 104 --- .../Resource/TestAsset/ViewRenderer.php | 35 - .../Application/Resource/TranslateTest.php | 269 ------ .../Application/Resource/UseragentTest.php | 124 --- tests/Zend/Application/Resource/ViewTest.php | 249 ------ .../_files/ZfAppBootstrapCustomView.php | 37 - .../Application/Resource/mailTestCAsE.php | 11 - .../BootstrapBaseCircularDependency.php | 49 - tests/Zend/Application/_files/Zf-6719-1.ini | 5 - tests/Zend/Application/_files/Zf-6719-2.ini | 5 - .../Application/_files/Zf7696Bootstrap.php | 77 -- .../Application/_files/ZfAppBadBootstrap.php | 32 - .../Application/_files/ZfAppBootstrap.php | 70 -- .../Application/_files/ZfAppNoBootstrap.php | 23 - .../Application/_files/ZfModuleBootstrap.php | 41 - tests/Zend/Application/_files/appconfig.inc | 9 - tests/Zend/Application/_files/appconfig.ini | 5 - .../Application/_files/appconfig.ini.dist | 5 - tests/Zend/Application/_files/appconfig.json | 8 - tests/Zend/Application/_files/appconfig.php | 24 - tests/Zend/Application/_files/appconfig.xml | 7 - tests/Zend/Application/_files/appconfig.yaml | 7 - tests/Zend/Application/_files/appconfig.yml | 7 - .../_files/modules/bar/Bootstrap.php | 43 - .../modules/bar/controllers/.placeholder | 0 .../modules/baz/controllers/.placeholder | 0 .../_files/modules/default/Bootstrap.php | 43 - .../_files/modules/foo-bar/Bootstrap.php | 42 - .../_files/modules/foo/Bootstrap.php | 43 - .../modules/foo/controllers/.placeholder | 0 .../controllers/ErrorController.php | 37 - .../controllers/IndexController.php | 38 - .../_files/more_modules/bat/Bootstrap.php | 43 - .../more_modules/bat/controllers/.placeholder | 0 .../foobaz/controllers/.placeholder | 0 .../_files/resources/Autoloaded.php | 36 - .../Zend/Application/_files/resources/Baz.php | 38 - .../Zend/Application/_files/resources/Foo.php | 43 - .../Application/_files/resources/Foobar.php | 36 - tests/Zend/Application/_files/zf-6679-1.inc | 8 - tests/Zend/Application/_files/zf-6679-2.inc | 7 - 61 files changed, 6674 deletions(-) delete mode 100644 tests/Zend/Application/AllTests.php delete mode 100644 tests/Zend/Application/ApplicationTest.php delete mode 100644 tests/Zend/Application/Bootstrap/BootstrapAbstractTest.php delete mode 100644 tests/Zend/Application/Bootstrap/BootstrapTest.php delete mode 100644 tests/Zend/Application/Module/AutoloaderTest.php delete mode 100644 tests/Zend/Application/Module/BootstrapTest.php delete mode 100644 tests/Zend/Application/Resource/AllTests.php delete mode 100644 tests/Zend/Application/Resource/CacheManagerTest.php delete mode 100644 tests/Zend/Application/Resource/DbTest.php delete mode 100644 tests/Zend/Application/Resource/DojoTest.php delete mode 100644 tests/Zend/Application/Resource/FrontcontrollerTest.php delete mode 100644 tests/Zend/Application/Resource/LayoutTest.php delete mode 100644 tests/Zend/Application/Resource/LocaleTest.php delete mode 100644 tests/Zend/Application/Resource/LogTest.php delete mode 100644 tests/Zend/Application/Resource/MailTest.php delete mode 100644 tests/Zend/Application/Resource/ModulesTest.php delete mode 100644 tests/Zend/Application/Resource/MultidbTest.php delete mode 100644 tests/Zend/Application/Resource/NavigationTest.php delete mode 100644 tests/Zend/Application/Resource/ResourceAbstractTest.php delete mode 100644 tests/Zend/Application/Resource/RouterTest.php delete mode 100644 tests/Zend/Application/Resource/SessionTest.php delete mode 100644 tests/Zend/Application/Resource/TestAsset/ViewRenderer.php delete mode 100644 tests/Zend/Application/Resource/TranslateTest.php delete mode 100644 tests/Zend/Application/Resource/UseragentTest.php delete mode 100644 tests/Zend/Application/Resource/ViewTest.php delete mode 100644 tests/Zend/Application/Resource/_files/ZfAppBootstrapCustomView.php delete mode 100644 tests/Zend/Application/Resource/mailTestCAsE.php delete mode 100644 tests/Zend/Application/_files/BootstrapBaseCircularDependency.php delete mode 100644 tests/Zend/Application/_files/Zf-6719-1.ini delete mode 100644 tests/Zend/Application/_files/Zf-6719-2.ini delete mode 100644 tests/Zend/Application/_files/Zf7696Bootstrap.php delete mode 100644 tests/Zend/Application/_files/ZfAppBadBootstrap.php delete mode 100644 tests/Zend/Application/_files/ZfAppBootstrap.php delete mode 100644 tests/Zend/Application/_files/ZfAppNoBootstrap.php delete mode 100644 tests/Zend/Application/_files/ZfModuleBootstrap.php delete mode 100644 tests/Zend/Application/_files/appconfig.inc delete mode 100644 tests/Zend/Application/_files/appconfig.ini delete mode 100644 tests/Zend/Application/_files/appconfig.ini.dist delete mode 100644 tests/Zend/Application/_files/appconfig.json delete mode 100644 tests/Zend/Application/_files/appconfig.php delete mode 100644 tests/Zend/Application/_files/appconfig.xml delete mode 100644 tests/Zend/Application/_files/appconfig.yaml delete mode 100644 tests/Zend/Application/_files/appconfig.yml delete mode 100644 tests/Zend/Application/_files/modules/bar/Bootstrap.php delete mode 100644 tests/Zend/Application/_files/modules/bar/controllers/.placeholder delete mode 100644 tests/Zend/Application/_files/modules/baz/controllers/.placeholder delete mode 100644 tests/Zend/Application/_files/modules/default/Bootstrap.php delete mode 100644 tests/Zend/Application/_files/modules/foo-bar/Bootstrap.php delete mode 100644 tests/Zend/Application/_files/modules/foo/Bootstrap.php delete mode 100644 tests/Zend/Application/_files/modules/foo/controllers/.placeholder delete mode 100644 tests/Zend/Application/_files/modules/zfappbootstrap/controllers/ErrorController.php delete mode 100644 tests/Zend/Application/_files/modules/zfappbootstrap/controllers/IndexController.php delete mode 100644 tests/Zend/Application/_files/more_modules/bat/Bootstrap.php delete mode 100644 tests/Zend/Application/_files/more_modules/bat/controllers/.placeholder delete mode 100644 tests/Zend/Application/_files/more_modules/foobaz/controllers/.placeholder delete mode 100644 tests/Zend/Application/_files/resources/Autoloaded.php delete mode 100644 tests/Zend/Application/_files/resources/Baz.php delete mode 100644 tests/Zend/Application/_files/resources/Foo.php delete mode 100644 tests/Zend/Application/_files/resources/Foobar.php delete mode 100644 tests/Zend/Application/_files/zf-6679-1.inc delete mode 100644 tests/Zend/Application/_files/zf-6679-2.inc diff --git a/tests/Zend/Application/AllTests.php b/tests/Zend/Application/AllTests.php deleted file mode 100644 index 4af7f9d16b..0000000000 --- a/tests/Zend/Application/AllTests.php +++ /dev/null @@ -1,64 +0,0 @@ -addTestSuite('Zend_Application_ApplicationTest'); - $suite->addTestSuite('Zend_Application_Bootstrap_BootstrapAbstractTest'); - $suite->addTestSuite('Zend_Application_Module_AutoloaderTest'); - $suite->addTestSuite('Zend_Application_Module_BootstrapTest'); - $suite->addTest(Zend_Application_Resource_AllTests::suite()); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_AllTests::main') { - Zend_Application_AllTests::main(); -} diff --git a/tests/Zend/Application/ApplicationTest.php b/tests/Zend/Application/ApplicationTest.php deleted file mode 100644 index db6d7879ba..0000000000 --- a/tests/Zend/Application/ApplicationTest.php +++ /dev/null @@ -1,546 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - // Store original include_path - $this->includePath = get_include_path(); - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->iniOptions = array(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - foreach ($this->iniOptions as $key) { - ini_restore($key); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testConstructorSetsEnvironment() - { - $this->assertEquals('testing', $this->application->getEnvironment()); - } - - public function testConstructorInstantiatesAutoloader() - { - $autoloader = $this->application->getAutoloader(); - $this->assertTrue($autoloader instanceof Zend_Loader_Autoloader); - } - - public function testConstructorShouldSetOptionsWhenProvided() - { - $options = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - $application = new Zend_Application('testing', $options); - $this->assertEquals($options, $application->getOptions()); - } - - /** - * @group GH-564 - * @depends testConstructorInstantiatesAutoloader - */ - public function testConstructorRespectsSuppressFileNotFoundWarningFlag() - { - $application = new Zend_Application('testing'); - $this->assertFalse($application->getAutoloader()->suppressNotFoundWarnings()); //Default value - - $application = new Zend_Application('testing', null, $suppressNotFoundWarnings = true); - $this->assertTrue($application->getAutoloader()->suppressNotFoundWarnings()); - - $application = new Zend_Application('testing', null, $suppressNotFoundWarnings = false); - $this->assertFalse($application->getAutoloader()->suppressNotFoundWarnings()); - - $options = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - - $application = new Zend_Application('testing', $options, $suppressNotFoundWarnings = true); - $this->assertTrue($application->getAutoloader()->suppressNotFoundWarnings()); - - $application = new Zend_Application('testing', $options, $suppressNotFoundWarnings = false); - $this->assertFalse($application->getAutoloader()->suppressNotFoundWarnings()); - } - - public function testHasOptionShouldReturnFalseWhenOptionNotPresent() - { - $this->assertFalse($this->application->hasOption('foo')); - } - - public function testHasOptionShouldReturnTrueWhenOptionPresent() - { - $options = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - $application = new Zend_Application('testing', $options); - $this->assertTrue($application->hasOption('foo')); - } - - public function testGetOptionShouldReturnNullWhenOptionNotPresent() - { - $this->assertNull($this->application->getOption('foo')); - } - - public function testGetOptionShouldReturnOptionValue() - { - $options = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - $application = new Zend_Application('testing', $options); - $this->assertEquals($options['foo'], $application->getOption('foo')); - } - - public function testPassingAutoloaderNamespaceOptionsShouldProxyToAutoloader() - { - $autoloader = $this->autoloader; - $this->application->setOptions(array( - 'autoloaderNamespaces' => array( - 'Foo', - ), - )); - $namespaces = $this->autoloader->getRegisteredNamespaces(); - $this->assertContains('Foo', $namespaces); - } - - public function testPassingIncludePathOptionShouldModifyIncludePath() - { - $expected = dirname(__FILE__) . '/_files'; - $this->application->setOptions(array( - 'includePaths' => array( - $expected, - ), - )); - $test = get_include_path(); - $this->assertContains($expected, $test); - } - - public function testPassingPhpSettingsSetsIniValues() - { - $this->iniOptions[] = 'html_errors'; - $orig = ini_get('html_errors'); - $expected = $orig ? 0 : 1; - $this->application->setOptions(array( - 'phpSettings' => array( - 'html_errors' => $expected, - ), - )); - $this->assertEquals($expected, ini_get('html_errors')); - } - - public function testPassingPhpSettingsAsArrayShouldConstructDotValuesAndSetRelatedIniValues() - { - $this->iniOptions[] = 'date.default_latitude'; - $orig = ini_get('date.default_latitude'); - $expected = '1.234'; - $this->application->setOptions(array( - 'phpSettings' => array( - 'date' => array( - 'default_latitude' => $expected, - ), - ), - )); - $this->assertEquals($expected, ini_get('date.default_latitude')); - } - - public function testShouldUseBaseBootstrapClassByDefaultIfNoBootstrapRegistered() - { - $bootstrap = $this->application->getBootstrap(); - $this->assertTrue($bootstrap instanceof Zend_Application_Bootstrap_Bootstrap); - } - - public function testPassingStringBootstrapPathOptionShouldRegisterBootstrap() - { - $this->application->setOptions(array( - 'bootstrap' => dirname(__FILE__) . '/_files/modules/default/Bootstrap.php', - )); - $bootstrap = $this->application->getBootstrap(); - $this->assertTrue($bootstrap instanceof Bootstrap); - } - - public function testPassingArrayBootstrapOptionShouldRegisterBootstrapBasedOnPathOption() - { - $this->application->setOptions(array( - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/modules/default/Bootstrap.php', - ), - )); - $bootstrap = $this->application->getBootstrap(); - $this->assertTrue($bootstrap instanceof Bootstrap); - } - - public function testPassingArrayBootstrapOptionShouldRegisterBootstrapBasedOnPathAndClassOption() - { - $this->application->setOptions(array( - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap', - ), - )); - $bootstrap = $this->application->getBootstrap(); - $this->assertTrue($bootstrap instanceof ZfAppBootstrap); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testPassingArrayBootstrapWithoutPathOptionShouldRaiseException() - { - $this->application->setOptions(array( - 'bootstrap' => array( - 'class' => 'ZfAppBootstrap', - ), - )); - $bootstrap = $this->application->getBootstrap(); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testPassingInvalidBootstrapOptionShouldRaiseException() - { - $this->application->setOptions(array( - 'bootstrap' => new stdClass(), - )); - $bootstrap = $this->application->getBootstrap(); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testPassingInvalidOptionsArgumentToConstructorShouldRaiseException() - { - $application = new Zend_Application('testing', new stdClass()); - } - - public function testPassingStringIniConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.ini'); - $this->assertTrue($application->hasOption('foo')); - } - - public function testPassingStringXmlConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.xml'); - $this->assertTrue($application->hasOption('foo')); - } - - public function testPassingStringPhpConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.php'); - $this->assertTrue($application->hasOption('foo')); - } - - public function testPassingStringIncConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.inc'); - $this->assertTrue($application->hasOption('foo')); - } - - /** - * @group ZF-10898 - */ - public function testPassingStringIniDistfileConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.ini.dist'); - $this->assertTrue($application->hasOption('foo')); - } - - /** - * @group ZF-10898 - */ - public function testPassingArrayOptionsWithConfigKeyDistfileShouldLoadOptions() - { - $application = new Zend_Application('testing', array('bar' => 'baz', 'config' => dirname(__FILE__) . '/_files/appconfig.ini.dist')); - $this->assertTrue($application->hasOption('foo')); - $this->assertTrue($application->hasOption('bar')); - } - - /** - * @group ZF-10568 - */ - public function testPassingStringYamlConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.yaml'); - $this->assertTrue($application->hasOption('foo')); - } - - /** - * @group ZF-10568 - */ - public function testPassingStringJsonConfigPathOptionToConstructorShouldLoadOptions() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.json'); - $this->assertTrue($application->hasOption('foo')); - } - - /** - * @group ZF-11425 - */ - public function testPassingStringYmlConfigPathOptionToConstructorShouldLoadOptionsAsYaml() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig.yml'); - $this->assertTrue($application->hasOption('foo')); - } - - public function testPassingArrayOptionsWithConfigKeyShouldLoadOptions() - { - $application = new Zend_Application('testing', array('bar' => 'baz', 'config' => dirname(__FILE__) . '/_files/appconfig.inc')); - $this->assertTrue($application->hasOption('foo')); - $this->assertTrue($application->hasOption('bar')); - } - - /** - * This was changed to have the passed in array always overwrite the config file. - * @group ZF-6811 - */ - public function testPassingArrayOptionsWithConfigKeyShouldLoadOptionsAndNotOverride() - { - $application = new Zend_Application('testing', array('foo' => 'baz', 'config' => dirname(__FILE__) . '/_files/appconfig.inc')); - $this->assertNotEquals('bar', $application->getOption('foo')); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testPassingInvalidStringOptionToConstructorShouldRaiseException() - { - $application = new Zend_Application('testing', dirname(__FILE__) . '/_files/appconfig'); - } - - public function testPassingZendConfigToConstructorShouldLoadOptions() - { - $config = new Zend_Config_Ini(dirname(__FILE__) . '/_files/appconfig.ini', 'testing'); - $application = new Zend_Application('testing', $config); - $this->assertTrue($application->hasOption('foo')); - } - - public function testPassingArrayOptionsToConstructorShouldLoadOptions() - { - $config = new Zend_Config_Ini(dirname(__FILE__) . '/_files/appconfig.ini', 'testing'); - $application = new Zend_Application('testing', $config->toArray()); - $this->assertTrue($application->hasOption('foo')); - } - - public function testBootstrapImplementsFluentInterface() - { - $application = $this->application->bootstrap(); - $this->assertSame($application, $this->application); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testApplicationShouldRaiseExceptionIfBootstrapFileDoesNotContainBootstrapClass() - { - $this->application->setOptions(array( - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/ZfAppNoBootstrap.php', - 'class' => 'ZfAppNoBootstrap', - ), - )); - $bootstrap = $this->application->getBootstrap(); - } - - /** - * @expectedException Zend_Application_Exception - */ - public function testApplicationShouldRaiseExceptionWhenBootstrapClassNotOfCorrectType() - { - $this->application->setOptions(array( - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/ZfAppBadBootstrap.php', - 'class' => 'ZfAppBadBootstrap', - ), - )); - $bootstrap = $this->application->getBootstrap(); - } - - public function testOptionsShouldRetainOriginalCase() - { - require_once dirname(__FILE__) . '/_files/ZfModuleBootstrap.php'; - $options = array( - 'pluginPaths' => array( - 'Zend_Application_Test_Path' => dirname(__FILE__), - ), - 'Resources' => array( - 'modules' => array(), - 'FrontController' => array( - 'baseUrl' => '/foo', - 'moduleDirectory' => dirname(__FILE__) . '/_files/modules', - ), - ), - 'Bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap', - ), - ); - $this->application->setOptions($options); - $setOptions = $this->application->getOptions(); - $this->assertSame(array_keys($options), array_keys($setOptions)); - } - - /** - * @group ZF-6679 - */ - public function testSetOptionsShouldProperlyMergeTwoConfigFileOptions() - { - $application = new Zend_Application( - 'production', dirname(__FILE__) . - '/_files/zf-6679-1.inc' - ); - $options = $application->getOptions(); - $this->assertEquals(array('includePaths', 'config'), array_keys($options)); - } - - public function testPassingZfVersionAutoloaderInformationConfiguresAutoloader() - { - if (!constant('TESTS_ZEND_LOADER_AUTOLOADER_MULTIVERSION_ENABLED')) { - $this->markTestSkipped(); - } - if (!constant('TESTS_ZEND_LOADER_AUTOLOADER_MULTIVERSION_LATEST')) { - $this->markTestSkipped(); - } - $path = constant('TESTS_ZEND_LOADER_AUTOLOADER_MULTIVERSION_PATH'); - $latest = constant('TESTS_ZEND_LOADER_AUTOLOADER_MULTIVERSION_LATEST'); - - $application = new Zend_Application('production', array( - 'autoloaderZfPath' => $path, - 'autoloaderZfVersion' => 'latest', - )); - $autoloader = $application->getAutoloader(); - $actual = $autoloader->getZfPath(); - $this->assertContains($latest, $actual); - } - - /** - * @group ZF-7742 - */ - public function testHasOptionShouldTreatOptionKeysAsCaseInsensitive() - { - $application = new Zend_Application('production', array( - 'fooBar' => 'baz', - )); - $this->assertTrue($application->hasOption('FooBar')); - } - - /** - * @group ZF-7742 - */ - public function testGetOptionShouldTreatOptionKeysAsCaseInsensitive() - { - $application = new Zend_Application('production', array( - 'fooBar' => 'baz', - )); - $this->assertEquals('baz', $application->getOption('FooBar')); - } - - /** - * @group ZF-6618 - */ - public function testCanExecuteBoostrapResourceViaApplicationInstanceBootstrapMethod() - { - $application = new Zend_Application('testing', array( - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap' - ) - ) - ); - $application->bootstrap('foo'); - - $this->assertEquals(1, $application->getBootstrap()->fooExecuted); - $this->assertEquals(0, $application->getBootstrap()->barExecuted); - } - - public function testOptionsCanHandleMuiltipleConigFiles() - { - $application = new Zend_Application('testing', array( - 'config' => array( - dirname(__FILE__) . '/_files/Zf-6719-1.ini', - dirname(__FILE__) . '/_files/Zf-6719-2.ini' - ) - ) - ); - - $this->assertEquals('baz', $application->getOption('foo')); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_ApplicationTest::main') { - Zend_Application_ApplicationTest::main(); -} diff --git a/tests/Zend/Application/Bootstrap/BootstrapAbstractTest.php b/tests/Zend/Application/Bootstrap/BootstrapAbstractTest.php deleted file mode 100644 index 84c3db464d..0000000000 --- a/tests/Zend/Application/Bootstrap/BootstrapAbstractTest.php +++ /dev/null @@ -1,843 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - $this->error = false; - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function handleError($errno, $errstr) - { - $this->error = $errstr; - return true; - } - - public function testConstructorShouldPopulateApplication() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertSame($this->application, $bootstrap->getApplication()); - } - - public function testConstructorShouldPopulateOptionsFromApplicationObject() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $options = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - $this->application->setOptions($options); - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertSame($options, $bootstrap->getOptions()); - } - - public function testConstructorShouldAllowPassingAnotherBootstrapObject() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap1 = new ZfAppBootstrap($this->application); - $bootstrap2 = new ZfAppBootstrap($bootstrap1); - $this->assertSame($bootstrap1, $bootstrap2->getApplication()); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testConstructorShouldRaiseExceptionForInvalidApplicationArgument() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap(new stdClass); - } - - public function testSettingOptionsShouldProxyToInternalSetters() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $options = array( - 'arbitrary' => 'foo', - ); - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions($options); - $this->assertEquals('foo', $bootstrap->getArbitrary()); - } - - /** - * @group ZF-6459 - */ - public function testCallingSetOptionsMultipleTimesShouldMergeOptionsRecursively() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $options = array( - 'deep' => array( - 'foo' => 'bar', - 'bar' => 'baz', - ), - ); - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions($options); - $options2 = array( - 'deep' => array( - 'bar' => 'bat', - 'baz' => 'foo', - ), - ); - $bootstrap->setOptions($options2); - $expected = $bootstrap->mergeOptions($options, $options2); - $test = $bootstrap->getOptions(); - $this->assertEquals($expected, $test); - } - - public function testPluginPathsOptionKeyShouldAddPrefixPathsToPluginLoader() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions(array( - 'pluginPaths' => array( - 'Foo' => 'foo/bar/path/', - ), - )); - $loader = $bootstrap->getPluginLoader(); - $paths = $loader->getPaths('Foo'); - $this->assertTrue(is_array($paths)); - } - - public function testResourcesOptionKeyShouldRegisterBootstrapPluginResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions(array( - 'resources' => array( - 'view' => array( - 'basePath' => dirname(__FILE__) . '/../_files/views/scripts', - ), - ), - )); - $this->assertTrue($bootstrap->hasPluginResource('view')); - } - - public function testHasOptionShouldReturnFalseWhenOptionUnavailable() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertFalse($bootstrap->hasOption('foo')); - } - - public function testHasOptionShouldReturnTrueWhenOptionPresent() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions(array('foo' => 'bar')); - $this->assertTrue($bootstrap->hasOption('foo')); - } - - public function testGetOptionShouldReturnNullWhenOptionUnavailable() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertNull($bootstrap->getOption('foo')); - } - - public function testGetOptionShouldReturnOptionValue() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->setOptions(array('foo' => 'bar')); - $this->assertEquals('bar', $bootstrap->getOption('foo')); - } - - public function testInternalIntializersShouldBeRegisteredAsClassResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $test = $bootstrap->getClassResources(); - $resources = array('foo' => '_initFoo', 'bar' => '_initBar', 'barbaz' => '_initBarbaz'); - $this->assertEquals($resources, $test); - } - - public function testInternalInitializersShouldRegisterResourceNames() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $test = $bootstrap->getClassResourceNames(); - $resources = array('foo', 'bar', 'barbaz'); - $this->assertEquals($resources, $test); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testRegisterPluginResourceShouldThrowExceptionForInvalidResourceType() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource(array()); - } - - public function testShouldAllowRegisteringConcretePluginResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $resource = new Zend_Application_Resource_View(); - $bootstrap->registerPluginResource($resource); - $test = $bootstrap->getPluginResource('view'); - $this->assertSame($resource, $test); - } - - public function testRegisteringSecondPluginResourceOfSameTypeShouldOverwrite() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $resource1 = new Zend_Application_Resource_View(); - $resource2 = new Zend_Application_Resource_View(); - $bootstrap->registerPluginResource($resource1) - ->registerPluginResource($resource2); - $test = $bootstrap->getPluginResource('view'); - $this->assertSame($resource2, $test); - } - - public function testShouldAllowRegisteringPluginResourceUsingNameOnly() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource('view'); - $test = $bootstrap->getPluginResource('view'); - $this->assertEquals('Zend_Application_Resource_View', get_class($test)); - } - - public function testShouldAllowUnregisteringPluginResourcesUsingConcreteInstance() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $resource = new Zend_Application_Resource_View(); - $bootstrap->registerPluginResource($resource); - $bootstrap->unregisterPluginResource($resource); - $this->assertFalse($bootstrap->hasPluginResource('view')); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testAttemptingToUnregisterPluginResourcesUsingInvalidResourceTypeShouldThrowException() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource('view'); - $bootstrap->unregisterPluginResource(array()); - } - - public function testShouldAllowUnregisteringPluginResourcesByName() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource('view'); - $bootstrap->unregisterPluginResource('view'); - $this->assertFalse($bootstrap->hasPluginResource('view')); - } - - public function testRetrievingNonExistentPluginResourceShouldReturnNull() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertNull($bootstrap->getPluginResource('view')); - } - - public function testRetrievingPluginResourcesShouldRetrieveConcreteInstances() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource('view'); - $test = $bootstrap->getPluginResources(); - foreach ($test as $type => $resource) { - $this->assertTrue($resource instanceof Zend_Application_Resource_Resource); - } - } - - public function testShouldAllowRetrievingOnlyPluginResourceNames() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->registerPluginResource('view'); - $test = $bootstrap->getPluginResourceNames(); - $this->assertEquals(array('view'), $test); - } - - public function testShouldAllowSettingAlternativePluginLoaderInstance() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $loader = new Zend_Loader_PluginLoader(); - $bootstrap->setPluginLoader($loader); - $this->assertSame($loader, $bootstrap->getPluginLoader()); - } - - public function testDefaultPluginLoaderShouldRegisterPrefixPathForResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $loader = $bootstrap->getPluginLoader(); - $paths = $loader->getPaths('Zend_Application_Resource'); - $this->assertFalse(empty($paths)); - } - - public function testEnvironmentShouldMatchApplicationEnvironment() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $this->assertSame($this->application->getEnvironment(), $bootstrap->getEnvironment()); - } - - public function testBootstrappingShouldOnlyExecuteEachInitializerOnce() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap('foo'); - $bootstrap->bootstrap('foo'); - $this->assertEquals(1, $bootstrap->fooExecuted); - } - - /** - * @group ZF-7955 - */ - public function testBootstrappingIsCaseInsensitive() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap('Foo'); - $bootstrap->bootstrap('Foo'); - $bootstrap->bootstrap('foo'); - $bootstrap->bootstrap('foo'); - $this->assertEquals(1, $bootstrap->fooExecuted); - } - - public function testBootstrappingShouldFavorInternalResourcesOverPlugins() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->getPluginLoader()->addPrefixPath('Zend_Application_BootstrapTest_Resource', dirname(__FILE__) . '/../_files/resources'); - $bootstrap->bootstrap('foo'); - $this->assertFalse($bootstrap->executedFooResource); - } - - public function testBootstrappingShouldAllowPassingAnArrayOfResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap(array('foo', 'bar')); - $this->assertEquals(1, $bootstrap->fooExecuted); - $this->assertEquals(1, $bootstrap->barExecuted); - } - - public function testPassingNoValuesToBootstrapExecutesAllResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->getPluginLoader()->addPrefixPath('Zend_Application_BootstrapTest_Resource', dirname(__FILE__) . '/../_files/resources'); - $bootstrap->registerPluginResource('foobar'); - $bootstrap->bootstrap(); - $this->assertEquals(1, $bootstrap->fooExecuted); - $this->assertEquals(1, $bootstrap->barExecuted); - $this->assertTrue($bootstrap->executedFoobarResource); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testPassingInvalidResourceArgumentToBootstrapShouldThrowException() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap(new stdClass); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testPassingUnknownResourceToBootstrapShouldThrowException() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap('bazbat'); - } - - public function testCallShouldOverloadToBootstrap() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrapFoo(); - $this->assertEquals(1, $bootstrap->fooExecuted); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testCallShouldThrowExceptionForInvalidMethodCall() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->initFoo(); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testDependencyTrackingShouldDetectCircularDependencies() - { - require_once dirname(__FILE__) . '/../_files/BootstrapBaseCircularDependency.php'; - $bootstrap = new BootstrapBaseCircularDependency($this->application); - $bootstrap->bootstrap(); - } - - public function testContainerShouldBeRegistryInstanceByDefault() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $container = $bootstrap->getContainer(); - $this->assertTrue($container instanceof Zend_Registry); - } - - public function testContainerShouldAggregateReturnValuesFromClassResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap('barbaz'); - $container = $bootstrap->getContainer(); - $this->assertEquals('Baz', $container->barbaz->baz); - } - - public function testContainerShouldAggregateReturnValuesFromPluginResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->getPluginLoader()->addPrefixPath('Zend_Application_BootstrapTest_Resource', dirname(__FILE__) . '/../_files/resources'); - $bootstrap->registerPluginResource('baz'); - $bootstrap->bootstrap('baz'); - $container = $bootstrap->getContainer(); - $this->assertEquals('Baz', $container->baz->baz); - } - - public function testClassResourcesShouldBeAvailableFollowingBootstrapping() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->bootstrap('barbaz'); - $this->assertTrue($bootstrap->hasResource('barbaz')); - - $resource = $bootstrap->getResource('barbaz'); - $this->assertEquals('Baz', $resource->baz); - } - - public function testPluginResourcesShouldBeAvailableFollowingBootstrapping() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->getPluginLoader()->addPrefixPath('Zend_Application_BootstrapTest_Resource', dirname(__FILE__) . '/../_files/resources'); - $bootstrap->registerPluginResource('baz'); - $bootstrap->bootstrap('baz'); - - $this->assertTrue($bootstrap->hasResource('baz')); - $resource = $bootstrap->getResource('baz'); - $this->assertEquals('Baz', $resource->baz); - } - - public function testMagicMethodsForPluginResources() - { - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $bootstrap = new ZfAppBootstrap($this->application); - $bootstrap->getPluginLoader()->addPrefixPath('Zend_Application_BootstrapTest_Resource', dirname(__FILE__) . '/../_files/resources'); - $bootstrap->registerPluginResource('baz'); - $bootstrap->bootstrap('baz'); - - $this->assertTrue(isset($bootstrap->baz)); - $resource = $bootstrap->baz; - $this->assertEquals('Baz', $resource->baz); - } - - /** - * @group ZF-6543 - */ - public function testPassingPluginResourcesByFullClassNameWithMatchingPluginPathShouldRegisterAsShortName() - { - $this->application->setOptions(array( - 'resources' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest_View' => array(), - ), - 'pluginPaths' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest' => dirname(__FILE__), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $this->assertTrue($bootstrap->hasPluginResource('View'), var_export(array_keys($bootstrap->getPluginResources()), 1)); - } - - /** - * @group ZF-6543 - */ - public function testPassingFullViewClassNameNotMatchingARegisteredPrefixShouldRegisterAsTheClassName() - { - $this->application->setOptions(array( - 'resources' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest_View' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $this->assertTrue($bootstrap->hasPluginResource('Zend_Application_Bootstrap_BootstrapAbstractTest_View')); - } - - /** - * @group ZF-6543 - */ - public function testPassingFullViewClassNameNotMatchingARegisteredPrefixShouldReturnAppropriateResource() - { - $this->application->setOptions(array( - 'resources' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest_View' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $bootstrap->bootstrap('Zend_Application_Bootstrap_BootstrapAbstractTest_View'); - $resource = $bootstrap->getResource('Zend_Application_Bootstrap_BootstrapAbstractTest_View'); - $this->assertTrue($resource instanceof Zend_Application_Bootstrap_BootstrapAbstractTest_View, var_export(array_keys($bootstrap->getPluginResources()), 1)); - } - - /** - * @group ZF-6543 - */ - public function testCanMixAndMatchPluginResourcesAndFullClassNames() - { - $this->application->setOptions(array( - 'resources' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest_View' => array(), - 'view' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $bootstrap->bootstrap('Zend_Application_Bootstrap_BootstrapAbstractTest_View'); - $resource1 = $bootstrap->getResource('Zend_Application_Bootstrap_BootstrapAbstractTest_View'); - $bootstrap->bootstrap('view'); - $resource2 = $bootstrap->getResource('view'); - $this->assertNotSame($resource1, $resource2); - $this->assertTrue($resource1 instanceof Zend_Application_Bootstrap_BootstrapAbstractTest_View, var_export(array_keys($bootstrap->getPluginResources()), 1)); - $this->assertTrue($resource2 instanceof Zend_View); - } - - /** - * @group ZF-6543 - */ - public function testPluginClassesDefiningExplicitTypeWillBeRegisteredWithThatValue() - { - $this->application->setOptions(array( - 'resources' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest_Layout' => array(), - 'layout' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $bootstrap->bootstrap('BootstrapAbstractTestLayout'); - $resource1 = $bootstrap->getResource('BootstrapAbstractTestLayout'); - $bootstrap->bootstrap('layout'); - $resource2 = $bootstrap->getResource('layout'); - $this->assertNotSame($resource1, $resource2); - $this->assertTrue($resource1 instanceof Zend_Application_Bootstrap_BootstrapAbstractTest_Layout, var_export(array_keys($bootstrap->getPluginResources()), 1)); - $this->assertTrue($resource2 instanceof Zend_Layout); - } - - /** - * @group ZF-6471 - */ - public function testBootstrapShouldPassItselfToResourcePluginConstructor() - { - $this->application->setOptions(array( - 'pluginPaths' => array( - 'Zend_Application_Bootstrap_BootstrapAbstractTest' => dirname(__FILE__), - ), - 'resources' => array( - 'Foo' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $resource = $bootstrap->getPluginResource('foo'); - $this->assertTrue($resource->bootstrapSetInConstructor, var_export(get_object_vars($resource), 1)); - } - - /** - * @group ZF-6591 - */ - public function testRequestingPluginsByShortNameShouldNotRaiseFatalErrors() - { - $this->autoloader->setFallbackAutoloader(true) - ->suppressNotFoundWarnings(false); - $this->application->setOptions(array( - 'resources' => array( - 'FrontController' => array(), - ), - )); - set_error_handler(array($this, 'handleError')); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $resource = $bootstrap->getPluginResource('FrontController'); - restore_error_handler(); - $this->assertTrue(false === $this->error, $this->error); - } - - /** - * @group ZF-7550 - */ - public function testRequestingPluginsByAutoloadableClassNameShouldNotRaiseFatalErrors() - { - // Using namesapce 'zabt' to prevent conflict with Zend namespace - $rl = new Zend_Loader_Autoloader_Resource(array( - 'namespace' => 'Zabt', - 'basePath' => dirname(__FILE__) . '/../_files', - )); - $rl->addResourceType('resources', 'resources', 'Resource'); - $options = array( - 'resources' => array( - 'Zabt_Resource_Autoloaded' => array('bar' => 'baz') - ), - ); - $this->application->setOptions($options); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $bootstrap->bootstrap(); - } - - /** - * @group ZF-7690 - */ - public function testCallingSetOptionsMultipleTimesShouldUpdateOptionKeys() - { - $this->application->setOptions(array( - 'resources' => array( - 'layout' => array(), - ), - )); - $bootstrap = new Zend_Application_Bootstrap_BootstrapAbstractTest_OptionKeys($this->application); - $bootstrap->setOptions(array( - 'pluginPaths' => array( - 'Foo' => dirname(__FILE__), - ), - )); - $expected = array('resources', 'pluginpaths'); - $actual = $bootstrap->getOptionKeys(); - $this->assertEquals($expected, $actual); - } - - /** - * @group ZF-9110 - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testPassingSameBootstrapAsApplicationShouldNotCauseRecursion() - { - $bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $bootstrap->setApplication($bootstrap); - } - - /** - * @group ZF-7696 - */ - public function testUsingFallbackAutoloaderWithModulesShouldNotResultInFrontcontrollerNotFoundWarning() - { - require_once dirname(__FILE__) . '/../_files/Zf7696Bootstrap.php'; - $this->autoloader->setFallbackAutoloader(true); - $options = array( - 'Resources' => array( - 'modules' => array(), - ), - ); - $this->application->setOptions($options); - $bootstrap = new Zf7696Bootstrap($this->application); - $bootstrap->bootstrap(array('modules')); - } - - /** - * @group ZF-10199 - */ - public function testHasOptionShouldTreatOptionKeysAsCaseInsensitive() - { - $application = $this->application; - $application->setOptions(array( - 'fooBar' => 'baz', - )); - $this->assertTrue($application->getBootstrap()->hasOption('FooBar')); - } - - /** - * @group ZF-10199 - */ - public function testGetOptionShouldTreatOptionKeysAsCaseInsensitive() - { - $application = $this->application; - $application->setOptions(array( - 'fooBar' => 'baz', - )); - $this->assertEquals('baz', $application->getBootstrap()->getOption('FooBar')); - } - - /** - * @group ZF-8751 - * @group ZF-10842 - */ - public function testPathDefaultZendXToPluginsResources() - { - $application = $this->application - ->getBootstrap() - ->getPluginLoader(); - - $paths = $application->getPaths('ZendX_Application_Resource_'); - $this->assertEquals('ZendX/Application/Resource/', $paths[0]); - } -} - -class Zend_Application_Bootstrap_BootstrapAbstractTest_View - extends Zend_Application_Resource_ResourceAbstract -{ - public function init() - { - return $this; - } -} - -class Zend_Application_Bootstrap_BootstrapAbstractTest_Layout - extends Zend_Application_Resource_ResourceAbstract -{ - public $_explicitType = 'BootstrapAbstractTestLayout'; - public $bootstrapSetInConstructor = false; - - public function __construct($options = null) - { - parent::__construct($options); - if (null !== $this->getBootstrap()) { - $this->bootstrapSetInConstructor = true; - } - } - - public function init() - { - return $this; - } -} - -class Zend_Application_Bootstrap_BootstrapAbstractTest_Foo - extends Zend_Application_Resource_ResourceAbstract -{ - public $bootstrapSetInConstructor = false; - - public function __construct($options = null) - { - parent::__construct($options); - if (null !== $this->getBootstrap()) { - $this->bootstrapSetInConstructor = true; - } - } - - public function init() - { - return $this; - } -} - -class Zend_Application_Bootstrap_BootstrapAbstractTest_OptionKeys - extends Zend_Application_Bootstrap_Bootstrap -{ - public function getOptionKeys() - { - return $this->_optionKeys; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Bootstrap_BootstrapAbstractTest::main') { - Zend_Application_Bootstrap_BootstrapAbstractTest::main(); -} diff --git a/tests/Zend/Application/Bootstrap/BootstrapTest.php b/tests/Zend/Application/Bootstrap/BootstrapTest.php deleted file mode 100644 index 2a4d61773f..0000000000 --- a/tests/Zend/Application/Bootstrap/BootstrapTest.php +++ /dev/null @@ -1,215 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap( - $this->application - ); - - $this->resetFrontController(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function resetFrontController() - { - $front = Zend_Controller_Front::getInstance(); - $front->resetInstance(); - $front->setRequest(new Zend_Controller_Request_HttpTestCase) - ->setResponse(new Zend_Controller_Response_HttpTestCase); - } - - public function testFrontControllerResourcePluginShouldBeRegisteredByDefault() - { - $this->assertTrue($this->bootstrap->hasPluginResource('FrontController')); - } - - /** - * @expectedException Zend_Application_Bootstrap_Exception - */ - public function testRunShouldRaiseExceptionIfNoControllerDirectoryRegisteredWithFrontController() - { - $this->bootstrap->bootstrap(); - $this->bootstrap->run(); - } - - public function testRunShouldDispatchFrontController() - { - $this->bootstrap->setOptions(array( - 'resources' => array( - 'frontcontroller' => array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - ), - ), - )); - $this->bootstrap->bootstrap(); - - $front = $this->bootstrap->getResource('FrontController'); - - $request = $front->getRequest(); - $request->setRequestUri('/zfappbootstrap'); - $this->bootstrap->run(); - - $this->assertTrue($this->bootstrap->getContainer()->zfappbootstrap); - } - - /** - * @group ZF-8496 - */ - public function testBootstrapModuleAutoloaderShouldNotBeInitializedByDefault() - { - $this->assertFalse($this->bootstrap->getResourceLoader() instanceof Zend_Application_Module_Autoloader); - } - - /** - * @group ZF-8496 - */ - public function testBootstrapShouldInitializeModuleAutoloaderWhenNamespaceSpecified() - { - $application = new Zend_Application('testing', array( - 'appnamespace' => 'Application', - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap( - $application - ); - $this->assertTrue($bootstrap->getResourceLoader() instanceof Zend_Application_Module_Autoloader); - $al = $bootstrap->getResourceLoader(); - $this->assertEquals('Application', $al->getNamespace()); - } - - /** - * @group ZF-8496 - */ - public function testBootstrapAutoloaderNamespaceShouldBeConfigurable() - { - $application = new Zend_Application('testing', array( - 'appnamespace' => 'Default', - )); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap( - $application - ); - $al = $bootstrap->getResourceLoader(); - $this->assertEquals('Default', $al->getNamespace()); - } - - /** - * @group ZF-9435 - */ - public function testBootstrapShouldInitializeModuleAutoloaderWhenNamespaceSpecifiedAsEmpty() - { - $application = new Zend_Application( - 'testing', - array( - 'appnamespace' => null, - ) - ); - $bootstrap = new Zend_Application_Bootstrap_Bootstrap( - $application - ); - - // Tests - $this->assertTrue( - $bootstrap->getResourceLoader() instanceof Zend_Application_Module_Autoloader - ); - $al = $bootstrap->getResourceLoader(); - $this->assertEquals('', $al->getNamespace()); - } - - /** - * @group ZF-7367 - */ - public function testBootstrapRunMethodShouldReturnResponseIfFlagEnabled() - { - $this->bootstrap->setOptions(array( - 'resources' => array( - 'frontcontroller' => array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - 'returnresponse' => true, - ), - ), - )); - $this->bootstrap->bootstrap(); - - $front = $this->bootstrap->getResource('FrontController'); - $request = $front->getRequest(); - $request->setRequestUri('/zfappbootstrap'); - - $result = $this->bootstrap->run(); - $this->assertTrue($result instanceof Zend_Controller_Response_Abstract); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Bootstrap_BootstrapTest::main') { - Zend_Application_Bootstrap_BootstrapTest::main(); -} diff --git a/tests/Zend/Application/Module/AutoloaderTest.php b/tests/Zend/Application/Module/AutoloaderTest.php deleted file mode 100644 index 7a51a0f324..0000000000 --- a/tests/Zend/Application/Module/AutoloaderTest.php +++ /dev/null @@ -1,190 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - // Store original include_path - $this->includePath = get_include_path(); - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - // initialize 'error' member for tests that utilize error handling - $this->error = null; - - $this->loader = new Zend_Application_Module_Autoloader(array( - 'namespace' => 'FooBar', - 'basePath' => realpath(dirname(__FILE__) . '/_files'), - )); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Retore original include_path - set_include_path($this->includePath); - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testDbTableResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('dbtable')); - } - - public function testDbTableResourceTypeShouldPointToModelsDbTableSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('models/DbTable', $resources['dbtable']['path']); - } - - public function testFormResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('form')); - } - - public function testFormResourceTypeShouldPointToFormsSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('forms', $resources['form']['path']); - } - - public function testModelResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('model')); - } - - public function testModelResourceTypeShouldPointToModelsSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('models', $resources['model']['path']); - } - - public function testPluginResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('plugin')); - } - - public function testPluginResourceTypeShouldPointToPluginsSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('plugins', $resources['plugin']['path']); - } - - public function testServiceResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('service')); - } - - public function testServiceResourceTypeShouldPointToServicesSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('services', $resources['service']['path']); - } - - public function testViewHelperResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('viewhelper')); - } - - public function testViewHelperResourceTypeShouldPointToViewHelperSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('views/helpers', $resources['viewhelper']['path']); - } - - public function testViewFilterResourceTypeShouldBeLoadedByDefault() - { - $this->assertTrue($this->loader->hasResourceType('viewfilter')); - } - - public function testViewFilterResourceTypeShouldPointToViewFilterSubdirectory() - { - $resources = $this->loader->getResourceTypes(); - $this->assertContains('views/filters', $resources['viewfilter']['path']); - } - - public function testDefaultResourceShouldBeModel() - { - $this->assertEquals('model', $this->loader->getDefaultResourceType()); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Module_AutoloaderTest::main') { - Zend_Application_Module_AutoloaderTest::main(); -} diff --git a/tests/Zend/Application/Module/BootstrapTest.php b/tests/Zend/Application/Module/BootstrapTest.php deleted file mode 100644 index 129f925afd..0000000000 --- a/tests/Zend/Application/Module/BootstrapTest.php +++ /dev/null @@ -1,237 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testConstructorShouldInitializeModuleResourceLoaderWithModulePrefix() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $bootstrap = new ZfModule_Bootstrap($this->application); - $module = $bootstrap->getModuleName(); - $loader = $bootstrap->getResourceLoader(); - $this->assertNotNull($loader, "resource loader is unexpectedly NULL"); - $this->assertEquals($module, $loader->getNamespace()); - } - - public function testConstructorShouldAcceptResourceLoaderInOptions() - { - $loader = new Zend_Loader_Autoloader_Resource(array( - 'namespace' => 'Foo', - 'basePath' => dirname(__FILE__), - )); - $this->application->setOptions(array('resourceLoader' => $loader)); - - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $bootstrap = new ZfModule_Bootstrap($this->application); - $this->assertSame($loader, $bootstrap->getResourceLoader(), var_export($bootstrap->getOptions(), 1)); - } - - public function testModuleNameShouldBeFirstSegmentOfClassName() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $bootstrap = new ZfModule_Bootstrap($this->application); - $this->assertEquals('ZfModule', $bootstrap->getModuleName()); - } - - public function testShouldPullModuleNamespacedOptionsWhenPresent() - { - $options = array( - 'foo' => 'bar', - 'ZfModule' => array( - 'foo' => 'baz', - ) - ); - $this->application->setOptions($options); - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $bootstrap = new ZfModule_Bootstrap($this->application); - $this->assertEquals('baz', $bootstrap->foo); - } - - /** - * @group ZF-6545 - */ - public function testFrontControllerPluginResourceShouldBeRegistered() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $bootstrap = new ZfModule_Bootstrap($this->application); - $this->assertTrue($bootstrap->hasPluginResource('FrontController')); - } - - /** - * @group ZF-6545 - */ - public function testFrontControllerStateRemainsSameIfNoOptionsPassedToModuleBootstrap() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $this->application->setOptions(array( - 'resources' => array( - 'frontController' => array( - 'baseUrl' => '/foo', - 'controllerDirectory' => dirname(__FILE__), - ), - ), - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/../_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap', - ), - 'ZfModule' => array( - 'resources' => array( - 'FrontController' => array(), - ), - ), - )); - $appBootstrap = $this->application->getBootstrap(); - $appBootstrap->bootstrap('FrontController'); - $front = $appBootstrap->getResource('FrontController'); - $bootstrap = new ZfModule_Bootstrap($appBootstrap); - $bootstrap->bootstrap('FrontController'); - $test = $bootstrap->getResource('FrontController'); - $this->assertSame($front, $test); - $this->assertEquals('/foo', $test->getBaseUrl()); - $this->assertEquals(dirname(__FILE__), $test->getControllerDirectory('default')); - } - - /** - * @group ZF-6545 - */ - public function testModuleBootstrapsShouldNotAcceptModuleResourceInOrderToPreventRecursion() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $this->application->setOptions(array( - 'resources' => array( - 'modules' => array(), - 'frontController' => array( - 'baseUrl' => '/foo', - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - ), - ), - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/../_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap', - ) - )); - $appBootstrap = $this->application->getBootstrap(); - $appBootstrap->bootstrap('Modules'); - $modules = $appBootstrap->getResource('Modules'); - foreach ($modules as $module => $bootstrap) { - if ($module == 'default') { - // "default" module gets lumped in, and is not a Module_Bootstrap - continue; - } - $resources = $bootstrap->getPluginResourceNames(); - $this->assertFalse($bootstrap->hasPluginResource('Modules')); - } - } - - /** - * @group ZF-6567 - */ - public function testModuleBootstrapShouldInheritApplicationBootstrapPluginPaths() - { - require_once dirname(__FILE__) . '/../_files/ZfModuleBootstrap.php'; - $this->application->setOptions(array( - 'resources' => array( - 'modules' => array(), - 'frontController' => array( - 'baseUrl' => '/foo', - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - ), - ), - 'pluginPaths' => array( - 'ZfModuleBootstrap_Resource' => dirname(__FILE__), - ), - 'bootstrap' => array( - 'path' => dirname(__FILE__) . '/../_files/ZfAppBootstrap.php', - 'class' => 'ZfAppBootstrap', - ) - )); - $appBootstrap = $this->application->getBootstrap(); - $appBootstrap->bootstrap('Modules'); - $modules = $appBootstrap->getResource('Modules'); - foreach ($modules as $bootstrap) { - $loader = $bootstrap->getPluginLoader(); - $paths = $loader->getPaths(); - $this->assertTrue(array_key_exists('ZfModuleBootstrap_Resource_', $paths)); - } - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Module_BootstrapTest::main') { - Zend_Application_Module_BootstrapTest::main(); -} diff --git a/tests/Zend/Application/Resource/AllTests.php b/tests/Zend/Application/Resource/AllTests.php deleted file mode 100644 index 00293c4174..0000000000 --- a/tests/Zend/Application/Resource/AllTests.php +++ /dev/null @@ -1,89 +0,0 @@ -addTestSuite('Zend_Application_Resource_ResourceAbstractTest'); - $suite->addTestSuite('Zend_Application_Resource_CacheManagerTest'); - $suite->addTestSuite('Zend_Application_Resource_DbTest'); - $suite->addTestSuite('Zend_Application_Resource_DojoTest'); - $suite->addTestSuite('Zend_Application_Resource_FrontcontrollerTest'); - $suite->addTestSuite('Zend_Application_Resource_LayoutTest'); - $suite->addTestSuite('Zend_Application_Resource_LocaleTest'); - $suite->addTestSuite('Zend_Application_Resource_LogTest'); - $suite->addTestSuite('Zend_Application_Resource_MailTest'); - $suite->addTestSuite('Zend_Application_Resource_ModulesTest'); - $suite->addTestSuite('Zend_Application_Resource_MultidbTest'); - $suite->addTestSuite('Zend_Application_Resource_NavigationTest'); - $suite->addTestSuite('Zend_Application_Resource_RouterTest'); - $suite->addTestSuite('Zend_Application_Resource_SessionTest'); - $suite->addTestSuite('Zend_Application_Resource_TranslateTest'); - $suite->addTestSuite('Zend_Application_Resource_UseragentTest'); - $suite->addTestSuite('Zend_Application_Resource_ViewTest'); - - return $suite; - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_AllTests::main') { - Zend_Application_Resource_AllTests::main(); -} diff --git a/tests/Zend/Application/Resource/CacheManagerTest.php b/tests/Zend/Application/Resource/CacheManagerTest.php deleted file mode 100644 index a678c96ec3..0000000000 --- a/tests/Zend/Application/Resource/CacheManagerTest.php +++ /dev/null @@ -1,285 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - Zend_Controller_Front::getInstance()->resetInstance(); - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationCreatesCacheManagerInstance() - { - - $resource = new Zend_Application_Resource_Cachemanager(array()); - $resource->init(); - $this->assertTrue($resource->getCachemanager() instanceof Zend_Cache_Manager); - } - - public function testShouldReturnCacheManagerWhenComplete() - { - $resource = new Zend_Application_Resource_Cachemanager(array()); - $manager = $resource->init(); - $this->assertTrue($manager instanceof Zend_Cache_Manager); - } - - public function testShouldMergeConfigsIfOptionsPassedForDefaultCacheTemplate() - { - $options = array( - 'page' => array( - 'backend' => array( - 'options' => array( - 'cache_dir' => '/foo' - ) - ) - ) - ); - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cacheTemplate = $manager->getCacheTemplate('page'); - $this->assertEquals('/foo', $cacheTemplate['backend']['options']['cache_dir']); - - } - - public function testShouldCreateNewCacheTemplateIfConfigNotMatchesADefaultTemplate() - { - $options = array( - 'foo' => array( - 'backend' => array( - 'options' => array( - 'cache_dir' => '/foo' - ) - ) - ) - ); - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cacheTemplate = $manager->getCacheTemplate('foo'); - $this->assertSame($options['foo'], $cacheTemplate); - } - - public function testShouldNotMeddleWithFrontendOrBackendCapitalisation() - { - $options = array( - 'foo' => array( - 'backend' => array( - 'name' => 'BlackHole' - ) - ) - ); - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cacheTemplate = $manager->getCacheTemplate('foo'); - $this->assertEquals('BlackHole', $cacheTemplate['backend']['name']); - } - - public function testEmptyBackendOptionsShouldNotResultInError() - { - $options = array( - 'foo' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 7200, - ), - ), - 'backend' => array( - 'name' => 'black.hole', - ), - ), - ); - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cache = $manager->getCache('foo'); - $this->assertTrue($cache instanceof Zend_Cache_Core); - } - - /** - * @group ZF-9738 - */ - public function testZendServer() - { - if (!function_exists('zend_disk_cache_store')) { - $this->markTestSkipped('ZendServer is required for this test'); - } - - $options = array( - 'foo' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 7200, - ), - ), - 'backend' => array( - 'name' => 'ZendServer_Disk', - ), - ), - ); - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cache = $manager->getCache('foo')->getBackend(); - $this->assertTrue($cache instanceof Zend_Cache_Backend_ZendServer_Disk); - } - - /** - * @group ZF-9737 - */ - public function testCustomFrontendBackendNaming() - { - $options = array( - 'zf9737' => array( - 'frontend' => array( - 'name' => 'custom-naming', - 'customFrontendNaming' => false), - 'backend' => array('name' => 'Zend_Cache_Backend_Custom_Naming', - 'customBackendNaming' => true), - 'frontendBackendAutoload' => true) - ); - - $resource = new Zend_Application_Resource_Cachemanager($options); - $manager = $resource->init(); - $cache = $manager->getCache('zf9737'); - $this->assertTrue($cache->getBackend() instanceof Zend_Cache_Backend_Custom_Naming); - $this->assertTrue($cache instanceof Zend_Cache_Frontend_CustomNaming); - } - - /** - * @group GH-103 - */ - public function testLoggerFactory() - { - $options = array( - 'page' => array( - 'frontend' => array( - 'options' => array( - 'logging' => true, - 'logger' => array( - new Zend_Log_Writer_Mock() - ) - ) - ) - ) - ); - - $resource = new Zend_Application_Resource_Cachemanager($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - - $page = $resource->getCacheManager()->getCache('page'); - $page->getBackend()->clean(Zend_Cache::CLEANING_MODE_OLD); - - $event = current($options['page']['frontend']['options']['logger'][0]->events); - - $this->assertTrue(is_array($event)); - $this->assertTrue(array_key_exists('message', $event)); - $this->assertContains('Zend_Cache_Backend_Static', $event['message']); - } -} - - -class Zend_Cache_Backend_Custom_Naming extends Zend_Cache_Backend -{ -} - -class Zend_Cache_Frontend_CustomNaming extends Zend_Cache_Core -{ -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_CacheManagerTest::main') { - Zend_Application_Resource_CacheManagerTest::main(); -} diff --git a/tests/Zend/Application/Resource/DbTest.php b/tests/Zend/Application/Resource/DbTest.php deleted file mode 100644 index dad0e93952..0000000000 --- a/tests/Zend/Application/Resource/DbTest.php +++ /dev/null @@ -1,253 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - } - - public function tearDown() - { - Zend_Db_Table::setDefaultMetadataCache(); - - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testAdapterIsNullByDefault() - { - require_once 'Zend/Application/Resource/Db.php'; - $resource = new Zend_Application_Resource_Db(); - $this->assertNull($resource->getAdapter()); - } - - public function testDbIsNullByDefault() - { - require_once 'Zend/Application/Resource/Db.php'; - $resource = new Zend_Application_Resource_Db(); - $this->assertNull($resource->getDbAdapter()); - } - - public function testParamsAreEmptyByDefault() - { - require_once 'Zend/Application/Resource/Db.php'; - $resource = new Zend_Application_Resource_Db(); - $params = $resource->getParams(); - $this->assertTrue(empty($params)); - } - - public function testIsDefaultTableAdapter() - { - require_once 'Zend/Application/Resource/Db.php'; - $resource = new Zend_Application_Resource_Db(); - $this->assertTrue($resource->isDefaultTableAdapter()); - } - - public function testPassingDatabaseConfigurationSetsObjectState() - { - require_once 'Zend/Application/Resource/Db.php'; - $config = array( - 'adapter' => 'Pdo_Sqlite', - 'params' => array( - 'dbname' => ':memory:', - ), - 'isDefaultTableAdapter' => false, - ); - $resource = new Zend_Application_Resource_Db($config); - $this->assertFalse($resource->isDefaultTableAdapter()); - $this->assertEquals($config['adapter'], $resource->getAdapter()); - $this->assertEquals($config['params'], $resource->getParams()); - } - - public function testInitShouldInitializeDbAdapter() - { - require_once 'Zend/Application/Resource/Db.php'; - $config = array( - 'adapter' => 'Pdo_Sqlite', - 'params' => array( - 'dbname' => ':memory:', - ), - 'isDefaultTableAdapter' => false, - ); - $resource = new Zend_Application_Resource_Db($config); - $resource->init(); - $db = $resource->getDbAdapter(); - $this->assertTrue($db instanceof Zend_Db_Adapter_Pdo_Sqlite); - } - - /** - * @group ZF-10033 - */ - public function testSetDefaultMetadataCache() - { - $cache = Zend_Cache::factory('Core', 'Black Hole', array( - 'lifetime' => 120, - 'automatic_serialization' => true - )); - - $config = array( - 'adapter' => 'PDO_SQLite', - 'params' => array( - 'dbname' => ':memory:', - ), - 'defaultMetadataCache' => $cache, - ); - $resource = new Zend_Application_Resource_Db($config); - $resource->init(); - $this->assertTrue(Zend_Db_Table::getDefaultMetadataCache() instanceof Zend_Cache_Core); - } - - /** - * @group ZF-10033 - */ - public function testSetDefaultMetadataCacheFromCacheManager() - { - $configCache = array( - 'database' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 120, - 'automatic_serialization' => true - ) - ), - 'backend' => array( - 'name' => 'Black Hole' - ) - ) - ); - $this->bootstrap->registerPluginResource('cachemanager', $configCache); - - $config = array( - 'bootstrap' => $this->bootstrap, - 'adapter' => 'PDO_SQLite', - 'params' => array( - 'dbname' => ':memory:', - ), - 'defaultMetadataCache' => 'database', - ); - $resource = new Zend_Application_Resource_Db($config); - $resource->init(); - $this->assertTrue(Zend_Db_Table::getDefaultMetadataCache() instanceof Zend_Cache_Core); - } - - /** - * @group ZF-6620 - */ - public function testSetOptionFetchMode() - { - $config = array( - 'bootstrap' => $this->bootstrap, - 'adapter' => 'PDO_SQLite', - 'params' => array( - 'dbname' => ':memory:', - 'options' => array( - 'fetchMode' => 'obj' - ) - ), - ); - $resource = new Zend_Application_Resource_Db($config); - $db = $resource->init(); - $this->assertEquals($db->getFetchMode(), Zend_Db::FETCH_OBJ); - } - - /** - * @group ZF-10543 - */ - public function testSetDefaultMetadataCacheThroughBootstrap() - { - $options = array( - 'resources' => array( - 'db' => array( - 'adapter' => 'Pdo_Sqlite', - 'params' => array( - 'dbname' => ':memory:' - ), - 'defaultMetadataCache' => 'default' - ), - 'cachemanager' => array( - 'default' => array( - 'backend' => array('name' => 'black-hole') - ) - ) - ) - ); - - $this->bootstrap->setOptions($options); - $this->bootstrap->bootstrap(); - $resource = $this->bootstrap->getResource('cachemanager'); - $this->assertEquals($resource->getCache('default'), Zend_Db_Table::getDefaultMetadataCache()); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_DbTest::main') { - Zend_Application_Resource_DbTest::main(); -} diff --git a/tests/Zend/Application/Resource/DojoTest.php b/tests/Zend/Application/Resource/DojoTest.php deleted file mode 100644 index 887f0261b4..0000000000 --- a/tests/Zend/Application/Resource/DojoTest.php +++ /dev/null @@ -1,124 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - $this->bootstrap->registerPluginResource('view'); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesDojoContainer() - { - $resource = new Zend_Application_Resource_Dojo(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getDojo() instanceof Zend_Dojo_View_Helper_Dojo_Container); - } - - public function testInitializationReturnsDojoContainer() - { - $resource = new Zend_Application_Resource_Dojo(array()); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Dojo_View_Helper_Dojo_Container); - } - - public function testOptionsPassedToResourceAreUsedToSetDojosContainerState() - { - $options = array( - 'requireModules' => array('DojoTest'), - 'localPath' => '/ofc/ZF/Rules/', - ); - - $resource = new Zend_Application_Resource_Dojo($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $resource->getBootstrap()->bootstrap('view'); - $dojo = $resource->getBootstrap()->view->dojo(); - - $test = array( - 'requireModules' => $dojo->getModules(), - 'localPath' => $dojo->getLocalPath() - ); - $this->assertEquals($options, $test); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_DojoTest::main') { - Zend_Application_Resource_DojoTest::main(); -} diff --git a/tests/Zend/Application/Resource/FrontcontrollerTest.php b/tests/Zend/Application/Resource/FrontcontrollerTest.php deleted file mode 100644 index ff149e81d7..0000000000 --- a/tests/Zend/Application/Resource/FrontcontrollerTest.php +++ /dev/null @@ -1,418 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - Zend_Controller_Front::getInstance()->resetInstance(); - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationCreatesFrontControllerInstance() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array()); - $resource->init(); - $this->assertTrue($resource->getFrontController() instanceof Zend_Controller_Front); - } - - public function testInitializationPushesFrontControllerToBootstrapWhenPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertSame($resource->getFrontController(), $this->bootstrap->frontController); - } - - public function testShouldSetControllerDirectoryWhenStringOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'controllerDirectory' => dirname(__FILE__), - )); - $resource->init(); - $front = $resource->getFrontController(); - $dir = $front->getControllerDirectory('default'); - $this->assertEquals(dirname(__FILE__), $dir); - } - - public function testShouldSetControllerDirectoryWhenArrayOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'controllerDirectory' => array( - 'foo' => dirname(__FILE__), - ), - )); - $resource->init(); - $front = $resource->getFrontController(); - $dir = $front->getControllerDirectory('foo'); - $this->assertEquals(dirname(__FILE__), $dir); - } - - /** - * @group ZF-6458 - */ - public function testAllControllerDirectoriesShouldBeSetWhenArrayPassedToControllerDirectoryOption() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'controllerDirectory' => array( - 'foo' => dirname(__FILE__), - 'bar' => dirname(__FILE__), - ), - )); - $resource->init(); - $front = $resource->getFrontController(); - $dirs = $front->getControllerDirectory(); - $this->assertEquals(array( - 'foo' => dirname(__FILE__), - 'bar' => dirname(__FILE__), - ), $dirs); - } - - public function testShouldSetModuleControllerDirectoryNameWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'moduleControllerDirectoryName' => 'foo', - )); - $resource->init(); - $front = $resource->getFrontController(); - $dir = $front->getModuleControllerDirectoryName(); - $this->assertEquals('foo', $dir); - } - - public function testShouldSetModuleDirectoryWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'moduleDirectory' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules', - )); - $resource->init(); - $front = $resource->getFrontController(); - $dir = $front->getControllerDirectory(); - $expected = array( - 'bar' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'bar' . DIRECTORY_SEPARATOR . 'controllers', - 'default' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'default' . DIRECTORY_SEPARATOR . 'controllers', - 'foo-bar' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'foo-bar' . DIRECTORY_SEPARATOR . 'controllers', - 'foo' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'foo' . DIRECTORY_SEPARATOR . 'controllers', - 'baz' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'baz' . DIRECTORY_SEPARATOR . 'controllers', - 'zfappbootstrap' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'zfappbootstrap' . DIRECTORY_SEPARATOR . 'controllers', - ); - $this->assertEquals($expected, $dir); - } - - /** - * @group ZF-9258 - */ - public function testShouldSetMultipleModuleDirectorysWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'moduleDirectory' => array(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules', - dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'more_modules') - )); - $resource->init(); - $front = $resource->getFrontController(); - $dir = $front->getControllerDirectory(); - $expected = array( - 'bar' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'bar' . DIRECTORY_SEPARATOR . 'controllers', - 'default' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'default' . DIRECTORY_SEPARATOR . 'controllers', - 'foo-bar' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'foo-bar' . DIRECTORY_SEPARATOR . 'controllers', - 'foo' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'foo' . DIRECTORY_SEPARATOR . 'controllers', - 'baz' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'baz' . DIRECTORY_SEPARATOR . 'controllers', - 'zfappbootstrap' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR - . 'zfappbootstrap' . DIRECTORY_SEPARATOR . 'controllers', - 'bat' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'more_modules' . DIRECTORY_SEPARATOR - . 'bat' . DIRECTORY_SEPARATOR . 'controllers', - 'foobaz' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR - . '_files' . DIRECTORY_SEPARATOR . 'more_modules' . DIRECTORY_SEPARATOR - . 'foobaz' . DIRECTORY_SEPARATOR . 'controllers', - ); - $this->assertEquals($expected, $dir); - } - - - public function testShouldSetDefaultControllerNameWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'defaultControllerName' => 'foo', - )); - $resource->init(); - $front = $resource->getFrontController(); - $test = $front->getDefaultControllerName(); - $this->assertEquals('foo', $test); - } - - public function testShouldSetDefaultActionWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'defaultAction' => 'foo', - )); - $resource->init(); - $front = $resource->getFrontController(); - $test = $front->getDefaultAction(); - $this->assertEquals('foo', $test); - } - - public function testShouldSetDefaultModuleWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'defaultModule' => 'foo', - )); - $resource->init(); - $front = $resource->getFrontController(); - $test = $front->getDefaultModule(); - $this->assertEquals('foo', $test); - } - - public function testShouldSetBaseUrlWhenOptionPresent() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'baseUrl' => '/foo', - )); - $resource->init(); - $front = $resource->getFrontController(); - $test = $front->getBaseUrl(); - $this->assertEquals('/foo', $test); - } - - public function testShouldSetParamsWhenOptionPresent() - { - $params = array( - 'foo' => 'bar', - 'bar' => 'baz', - ); - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'params' => $params, - )); - $resource->init(); - $front = $resource->getFrontController(); - $test = $front->getParams(); - $this->assertEquals($params, $test); - } - - public function testShouldInstantiateAndRegisterPluginsWhenOptionPassed() - { - $plugins = array( - 'Zend_Controller_Plugin_ActionStack', - ); - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'plugins' => $plugins, - )); - $resource->init(); - $front = $resource->getFrontController(); - foreach ($plugins as $class) { - $this->assertTrue($front->hasPlugin($class)); - } - } - - public function testShouldReturnFrontControllerWhenComplete() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'controllerDirectory' => dirname(__FILE__), - )); - $front = $resource->init(); - $this->assertTrue($front instanceof Zend_Controller_Front); - } - - public function testNoBaseUrlShouldBeSetIfEmptyBaseUrlProvidedInOptions() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'baseurl' => '', - )); - $resource->init(); - $front = $resource->getFrontController(); - $this->assertNull($front->getBaseUrl()); - } - - /** - * @group ZF-9044 - */ - public function testSettingOfRegisterPluginIndexActuallyWorks() - { - $plugins = array( - array('class' => 'Zend_Controller_Plugin_ErrorHandler', - 'stackindex' => 10), - 'Zend_Controller_Plugin_ActionStack', - array('class' => 'Zend_Controller_Plugin_PutHandler', - 'stackIndex' => 5), - ); - - $expected = array( - 1 => 'Zend_Controller_Plugin_ActionStack', - 5 => 'Zend_Controller_Plugin_PutHandler', - 10 => 'Zend_Controller_Plugin_ErrorHandler', - ); - - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'plugins' => $plugins - )); - - $resource->init(); - $front = $resource->getFrontController(); - $plugins = $front->getPlugins(); - - $this->assertEquals(count($expected), count($plugins)); - foreach($expected as $index => $class) { - $this->assertEquals($class, get_class($plugins[$index])); - } - } - - /** - * @group ZF-7367 - */ - public function testPassingReturnResponseFlagShouldAlterFrontControllerStatus() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'returnresponse' => true, - )); - $resource->init(); - $front = $resource->getFrontController(); - $this->assertTrue($front->returnResponse()); - } - - /** - * @group ZF-9724 - */ - public function testShouldSetDispatcherFromConfiguration() - { - require_once 'Zend/Application/Resource/Frontcontroller.php'; - $resource = new Zend_Application_Resource_Frontcontroller(array( - 'dispatcher' => array( - 'class' => 'ZF9724_Dispatcher', - 'params' => array( - 'bar' => 'baz' - ) - ) - )); - $resource->init(); - $front = $resource->getFrontController(); - $this->assertEquals('ZF9724_Dispatcher', get_class($front->getDispatcher())); - $this->assertEquals('baz', $front->getDispatcher()->getParam('bar')); - } -} - -require_once 'Zend/Controller/Dispatcher/Standard.php'; -class ZF9724_Dispatcher extends Zend_Controller_Dispatcher_Standard {} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_FrontcontrollerTest::main') { - Zend_Application_Resource_FrontcontrollerTest::main(); -} diff --git a/tests/Zend/Application/Resource/LayoutTest.php b/tests/Zend/Application/Resource/LayoutTest.php deleted file mode 100644 index ac00ac6b5d..0000000000 --- a/tests/Zend/Application/Resource/LayoutTest.php +++ /dev/null @@ -1,121 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesLayoutObject() - { - $resource = new Zend_Application_Resource_Layout(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getLayout() instanceof Zend_Layout); - } - - public function testInitializationReturnsLayoutObject() - { - $resource = new Zend_Application_Resource_Layout(array()); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Layout); - } - - public function testOptionsPassedToResourceAreUsedToSetLayoutState() - { - $options = array( - 'layout' => 'foo.phtml', - 'layoutPath' => dirname(__FILE__), - ); - - $resource = new Zend_Application_Resource_Layout($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $layout = $resource->getLayout(); - $test = array( - 'layout' => $layout->getLayout(), - 'layoutPath' => $layout->getLayoutPath(), - ); - $this->assertEquals($options, $test); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_LayoutTest::main') { - Zend_Application_Resource_LayoutTest::main(); -} diff --git a/tests/Zend/Application/Resource/LocaleTest.php b/tests/Zend/Application/Resource/LocaleTest.php deleted file mode 100644 index 25da51c72e..0000000000 --- a/tests/Zend/Application/Resource/LocaleTest.php +++ /dev/null @@ -1,190 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Registry::_unsetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesLocaleObject() - { - $resource = new Zend_Application_Resource_Locale(array()); - $resource->init(); - $this->assertTrue($resource->getLocale() instanceof Zend_Locale); - } - - public function testInitializationReturnsLocaleObject() - { - $resource = new Zend_Application_Resource_Locale(array()); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Locale); - } - - public function testOptionsPassedToResourceAreUsedToSetLocaleState() - { - $options = array( - 'default' => 'kok_IN', - 'registry_key' => 'Foo_Bar', - 'force' => true - ); - - $resource = new Zend_Application_Resource_Locale($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $locale = $resource->getLocale(); - $this->assertEquals('kok_IN', $locale->__toString()); - $this->assertTrue(Zend_Registry::isRegistered('Foo_Bar')); - $this->assertSame(Zend_Registry::get('Foo_Bar'), $locale); - } - - public function testOptionsPassedToResourceAreUsedToSetLocaleState1() - { - $options = array( - 'default' => 'kok_IN', - 'force' => true - ); - - $resource = new Zend_Application_Resource_Locale($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $locale = $resource->getLocale(); - - // This test will fail if your configured locale is kok_IN - $this->assertEquals('kok_IN', $locale->__toString()); - $this->assertSame(Zend_Registry::get('Zend_Locale'), $locale); - } - - /** - * @group ZF-7058 - */ - public function testSetCache() - { - $cache = Zend_Cache::factory('Core', 'Black Hole', array( - 'lifetime' => 120, - 'automatic_serialization' => true - )); - - $config = array( - 'default' => 'fr_FR', - 'cache' => $cache, - ); - $resource = new Zend_Application_Resource_Locale($config); - $resource->init(); - $backend = Zend_Locale::getCache()->getBackend(); - $this->assertTrue($backend instanceof Zend_Cache_Backend_BlackHole); - Zend_Locale::removeCache(); - } - - /** - * @group ZF-7058 - */ - public function testSetCacheFromCacheManager() - { - $configCache = array( - 'memory' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 120, - 'automatic_serialization' => true - ) - ), - 'backend' => array( - 'name' => 'Black Hole' - ) - ) - ); - $this->bootstrap->registerPluginResource('cachemanager', $configCache); - $this->assertFalse(Zend_Locale::hasCache()); - - $config = array( - 'bootstrap' => $this->bootstrap, - 'cache' => 'memory', - ); - $resource = new Zend_Application_Resource_Locale($config); - $resource->init(); - - $this->assertTrue(Zend_Locale::hasCache()); - Zend_Locale::removeCache(); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_LocaleTest::main') { - Zend_Application_Resource_LocaleTest::main(); -} diff --git a/tests/Zend/Application/Resource/LogTest.php b/tests/Zend/Application/Resource/LogTest.php deleted file mode 100644 index 40f8f3fa09..0000000000 --- a/tests/Zend/Application/Resource/LogTest.php +++ /dev/null @@ -1,190 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - $this->application = new Zend_Application('testing'); - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesLogObject() - { - $resource = new Zend_Application_Resource_Log(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions(array( - 'Mock' => array('writerName' => 'Mock'), - )); - $resource->init(); - $this->assertTrue($resource->getLog() instanceof Zend_Log); - } - - public function testInitializationReturnsLogObject() - { - $resource = new Zend_Application_Resource_Log(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions(array( - 'Mock' => array('writerName' => 'Mock'), - )); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Log); - } - - public function testOptionsPassedToResourceAreUsedToInitializeLog() - { - $stream = fopen('php://memory', 'w+', false); - $options = array('memory' => array( - 'writerName' => 'Stream', - 'writerParams' => array( - 'stream' => $stream, - ) - )); - - $resource = new Zend_Application_Resource_Log($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - - $log = $resource->getLog(); - $this->assertTrue($log instanceof Zend_Log); - - $log->log($message = 'logged-message', Zend_Log::INFO); - rewind($stream); - $this->assertContains($message, stream_get_contents($stream)); - } - - /** - * @group ZF-8602 - */ - public function testNumericLogStreamFilterParamsPriorityDoesNotFail() - { - $options = array( - 'stream' => array( - 'writerName' => 'Stream', - 'writerParams' => array( - 'stream' => "php://memory", - 'mode' => 'a' - ), - 'filterName' => 'Priority', - 'filterParams' => array( - 'priority' => '4' - ), - ), - ); - $resource = new Zend_Application_Resource_Log($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - } - - /** - * @group ZF-9790 - */ - public function testInitializationWithFilterAndFormatter() - { - $stream = fopen('php://memory', 'w+'); - $options = array( - 'memory' => array( - 'writerName' => 'Stream', - 'writerParams' => array( - 'stream' => $stream, - ), - 'filterName' => 'Priority', - 'filterParams' => array( - 'priority' => Zend_Log::INFO, - ), - 'formatterName' => 'Simple', - 'formatterParams' => array( - 'format' => '%timestamp%: %message%', - ) - ) - ); - $message = 'tottakai'; - - $resource = new Zend_Application_Resource_Log($options); - $resource->setBootstrap($this->bootstrap); - $log = $resource->init(); - - $this->assertTrue($log instanceof Zend_Log); - - $log->log($message, Zend_Log::INFO); - rewind($stream); - $contents = stream_get_contents($stream); - - $this->assertStringEndsWith($message, $contents); - $this->assertRegexp('/\d\d:\d\d:\d\d/', $contents); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_LogTest::main') { - Zend_Application_Resource_LogTest::main(); -} diff --git a/tests/Zend/Application/Resource/MailTest.php b/tests/Zend/Application/Resource/MailTest.php deleted file mode 100644 index 3ab482caae..0000000000 --- a/tests/Zend/Application/Resource/MailTest.php +++ /dev/null @@ -1,237 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - $this->application = new Zend_Application('testing'); - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - Zend_Mail::clearDefaultTransport(); - - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesMailObject() - { - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions(array('transport' => array('type' => 'sendmail'))); - $resource->init(); - $this->assertTrue($resource->getMail() instanceof Zend_Mail_Transport_Abstract); - $this->assertTrue($resource->getMail() instanceof Zend_Mail_Transport_Sendmail); - } - - public function testInitializationReturnsMailObject() - { - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions(array('transport' => array('type' => 'sendmail'))); - $resource->init(); - $this->assertTrue($resource->init() instanceof Zend_Mail_Transport_Abstract); - $this->assertTrue(Zend_Mail::getDefaultTransport() instanceof Zend_Mail_Transport_Sendmail); - } - - public function testOptionsPassedToResourceAreUsedToInitializeMailTransportSmtp() - { - // If host option isn't passed on, an exception is thrown, making this text effective - $options = array('transport' => array('type' => 'smtp', - 'host' => 'example.com', - 'register' => true)); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertTrue(Zend_Mail::getDefaultTransport() instanceof Zend_Mail_Transport_Smtp); - } - - public function testNotRegisteringTransport() - { - // If host option isn't passed on, an exception is thrown, making this test effective - $options = array('transport' => array('type' => 'sendmail', - 'register' => false)); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertNull(Zend_Mail::getDefaultTransport()); - } - - public function testDefaultFromAndReplyTo() - { - $options = array('defaultfrom' => array('email' => 'foo@example.com', - 'name' => 'Foo Bar'), - 'defaultreplyto' => array('email' => 'john@example.com', - 'name' => 'John Doe')); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertNull(Zend_Mail::getDefaultTransport()); - $this->assertEquals($options['defaultfrom'], Zend_Mail::getDefaultFrom()); - $this->assertEquals($options['defaultreplyto'], Zend_Mail::getDefaultReplyTo()); - } - - /** - * Got notice: Undefined index: type - */ - public function testDefaultTransport() { - $options = array('transport' => array(//'type' => 'sendmail', // dont define type - 'register' => true)); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertTrue(Zend_Mail::getDefaultTransport() instanceof Zend_Mail_Transport_Sendmail); - } - - /** - * @group ZF-8811 - */ - public function testDefaultsCaseSensivity() { - $options = array('defaultFroM' => array('email' => 'f00@example.com', 'name' => null), - 'defAultReplyTo' => array('email' => 'j0hn@example.com', 'name' => null)); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertNull(Zend_Mail::getDefaultTransport()); - $this->assertEquals($options['defaultFroM'], Zend_Mail::getDefaultFrom()); - $this->assertEquals($options['defAultReplyTo'], Zend_Mail::getDefaultReplyTo()); - } - - /** - * @group ZF-8981 - */ - public function testNumericRegisterDirectiveIsPassedOnCorrectly() { - $options = array('transport' => array('type' => 'sendmail', - 'register' => '1')); // Culprit - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $resource->init(); - $this->assertTrue(Zend_Mail::getDefaultTransport() instanceof Zend_Mail_Transport_Sendmail); - } - - /** - * @group ZF-9136 - */ - public function testCustomMailTransportWithFQName() { - $options = array('transport' => array('type' => 'Zend_Mail_Transport_Sendmail')); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $this->assertTrue($resource->init() instanceof Zend_Mail_Transport_Sendmail); - } - - /** - * @group ZF-9136 - */ - public function testCustomMailTransportWithWrongCasesAsShouldBe() { - $options = array('transport' => array('type' => 'Zend_Application_Resource_mailTestCAsE')); - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $this->assertTrue($resource->init() instanceof Zend_Application_Resource_mailTestCAsE); - } - - /** - * @group ZF-11022 - */ - public function testOptionRegisterIsUnset() - { - $options = array('transport' => - array('register' => 1, - 'type' => 'Zend_Mail_Transport_Sendmail')); - - $resource = new Zend_Application_Resource_Mail(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - - $parameters = $resource->getMail()->parameters; - $this->assertTrue(empty($parameters)); - } - -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_MailTest::main') { - Zend_Application_Resource_MailTest::main(); -} - diff --git a/tests/Zend/Application/Resource/ModulesTest.php b/tests/Zend/Application/Resource/ModulesTest.php deleted file mode 100644 index 03223539b0..0000000000 --- a/tests/Zend/Application/Resource/ModulesTest.php +++ /dev/null @@ -1,217 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - - $this->front = Zend_Controller_Front::getInstance(); - $this->front->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationTriggersNothingIfNoModulesRegistered() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array()); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertFalse(isset($this->bootstrap->default)); - $this->assertFalse(isset($this->bootstrap->foo)); - $this->assertFalse(isset($this->bootstrap->bar)); - } - - /** - * @group ZF-6803 - * @group ZF-7158 - */ - public function testInitializationTriggersDefaultModuleBootstrapWhenDiffersFromApplicationBootstrap() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue(isset($this->bootstrap->default)); - } - - public function testInitializationShouldTriggerModuleBootstrapsWhenTheyExist() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($this->bootstrap->foo, 'foo failed'); - $this->assertTrue($this->bootstrap->bar, 'bar failed'); - } - - /** - * @group ZF-6803 - * @group ZF-7158 - */ - public function testInitializationShouldSkipModulesWithoutBootstraps() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $bootstraps = $resource->getExecutedBootstraps(); - $this->assertEquals(4, count((array)$bootstraps)); - $this->assertArrayHasKey('bar', (array)$bootstraps); - $this->assertArrayHasKey('foo-bar', (array)$bootstraps); - $this->assertArrayHasKey('foo', (array)$bootstraps); - $this->assertArrayHasKey('default', (array)$bootstraps); - } - - /** - * @group ZF-6803 - * @group ZF-7158 - */ - public function testShouldReturnExecutedBootstrapsWhenComplete() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $bootstraps = $resource->init(); - $this->assertEquals(4, count((array)$bootstraps)); - $this->assertArrayHasKey('bar', (array)$bootstraps); - $this->assertArrayHasKey('foo-bar', (array)$bootstraps); - $this->assertArrayHasKey('foo', (array)$bootstraps); - $this->assertArrayHasKey('default', (array)$bootstraps); - } - - public function testBootstrapBootstrapsIsOwnMethod() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new ZendTest_Application_Resource_ModulesHalf(array()); - $resource->setBootstrap($this->bootstrap); - $bootstraps = $resource->init(); - $this->assertEquals(3, count((array)$bootstraps)); - } - - /** - * @group ZF-11548 - */ - public function testGetExecutedBootstrapsShouldReturnArrayObject() - { - require_once 'Zend/Application/Resource/Modules.php'; - - $this->bootstrap->registerPluginResource('Frontcontroller', array( - 'moduleDirectory' => dirname(__FILE__) . '/../_files/modules', - )); - $resource = new Zend_Application_Resource_Modules(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $bootstraps = $resource->getExecutedBootstraps(); - $this->assertTrue($bootstraps instanceof ArrayObject); - } -} - -require_once 'Zend/Application/Resource/Modules.php'; -class ZendTest_Application_Resource_ModulesHalf - extends Zend_Application_Resource_Modules -{ - protected function bootstrapBootstraps($bootstraps) - { - array_pop($bootstraps); - return parent::bootstrapBootstraps($bootstraps); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_ModulesTest::main') { - Zend_Application_Resource_ModulesTest::main(); -} diff --git a/tests/Zend/Application/Resource/MultidbTest.php b/tests/Zend/Application/Resource/MultidbTest.php deleted file mode 100644 index 8700c6a426..0000000000 --- a/tests/Zend/Application/Resource/MultidbTest.php +++ /dev/null @@ -1,249 +0,0 @@ - array('adapter' => 'pdo_mysql','dbname' => 'db1','password' => 'XXXX','username' => 'webuser'), - 'db2' => array('adapter' => 'pdo_pgsql', 'dbname' => 'db2', 'password' => 'notthatpublic', 'username' => 'dba')); - - public static function main() - { - $suite = new PHPUnit_Framework_TestSuite(__CLASS__); - $result = PHPUnit_TextUI_TestRunner::run($suite); - } - - public function setUp() - { - // Store original autoloaders - $this->loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - $this->application = new Zend_Application('testing'); - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - Zend_Db_Table::setDefaultAdapter(null); - Zend_Db_Table::setDefaultMetadataCache(); - - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesResourcePluginObject() - { - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($this->_dbOptions); - $res = $resource->init(); - $this->assertTrue($res instanceof Zend_Application_Resource_Multidb); - } - - public function testDbsAreSetupCorrectlyObject() - { - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($this->_dbOptions); - $res = $resource->init(); - $this->assertTrue($res->getDb('db1') instanceof Zend_Db_Adapter_Pdo_Mysql); - $this->assertTrue($res->getDb('db2') instanceof Zend_Db_Adapter_Pdo_Pgsql); - } - - public function testGetDefaultIsSetAndReturnedObject() - { - $options = $this->_dbOptions; - $options['db2']['default'] = true; - - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - $res = $resource->init(); - $this->assertTrue($res->getDb() instanceof Zend_Db_Adapter_Pdo_Pgsql); - $this->assertTrue($res->isDefault($res->getDb('db2'))); - $this->assertTrue($res->isDefault('db2')); - - $options = $this->_dbOptions; - $options['db2']['isDefaultTableAdapter'] = true; - - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($options); - $res = $resource->init(); - $this->assertTrue($res->getDb() instanceof Zend_Db_Adapter_Pdo_Pgsql); - $this->assertTrue($res->isDefault($res->getDb('db2'))); - $this->assertTrue($res->isDefault('db2')); - $this->assertTrue(Zend_Db_Table::getDefaultAdapter() instanceof Zend_Db_Adapter_Pdo_Pgsql); - - } - - public function testGetDefaultRandomWhenNoDefaultWasSetObject() - { - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($this->_dbOptions); - $res = $resource->init(); - $this->assertTrue($res->getDefaultDb() instanceof Zend_Db_Adapter_Pdo_Mysql); - $this->assertTrue($res->getDefaultDb(true) instanceof Zend_Db_Adapter_Pdo_Mysql); - $this->assertNull($res->getDefaultDb(false)); - } - - public function testGetDbWithFaultyDbNameThrowsException() - { - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $resource->setOptions($this->_dbOptions); - $res = $resource->init(); - - try { - $res->getDb('foobar'); - $this->fail('An exception should have been thrown'); - } catch(Zend_Application_Resource_Exception $e) { - $this->assertEquals($e->getMessage(), 'A DB adapter was tried to retrieve, but was not configured'); - } - } - - /** - * @group ZF-9131 - */ - public function testParamDefaultAndAdapterAreNotPassedOnAsParameter() - { - $resource = new Zend_Application_Resource_Multidb(array()); - $resource->setBootstrap($this->bootstrap); - $options = $this->_dbOptions; - $options['db2']['isDefaultTableAdapter'] = true; - $resource->setOptions($options); - $res = $resource->init(); - - $expected = array( - 'dbname' => 'db2', - 'password' => 'notthatpublic', - 'username' => 'dba', - 'charset' => null, - 'persistent' => false, - 'options' => array( - 'caseFolding' => 0, - 'autoQuoteIdentifiers' => true, - 'fetchMode' => 2), - 'driver_options' => array()); - $this->assertEquals($expected, $res->getDb('db2')->getConfig()); - - $options = $this->_dbOptions; - $options['db2']['default'] = true; - $resource->setOptions($options); - $res = $resource->init(); - $this->assertEquals($expected, $res->getDb('db2')->getConfig()); - } - - /** - * @group ZF-10049 - */ - public function testSetDefaultMetadataCache() - { - $cache = Zend_Cache::factory('Core', 'Black Hole', array( - 'lifetime' => 120, - 'automatic_serialization' => true - )); - - $options = $this->_dbOptions; - $options['defaultMetadataCache'] = $cache; - $resource = new Zend_Application_Resource_Multidb($options); - $resource->init(); - $this->assertTrue(Zend_Db_Table::getDefaultMetadataCache() instanceof Zend_Cache_Core); - } - - /** - * @group ZF-10049 - */ - public function testSetDefaultMetadataCacheFromCacheManager() - { - $configCache = array( - 'database' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 120, - 'automatic_serialization' => true - ) - ), - 'backend' => array( - 'name' => 'Black Hole' - ) - ) - ); - $this->bootstrap->registerPluginResource('cachemanager', $configCache); - - $options = $this->_dbOptions; - $options['defaultMetadataCache'] = 'database'; - $resource = new Zend_Application_Resource_Multidb($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue(Zend_Db_Table::getDefaultMetadataCache() instanceof Zend_Cache_Core); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_MultidbTest::main') { - Zend_Application_Resource_MultidbTest::main(); -} diff --git a/tests/Zend/Application/Resource/NavigationTest.php b/tests/Zend/Application/Resource/NavigationTest.php deleted file mode 100644 index 1180b0ec03..0000000000 --- a/tests/Zend/Application/Resource/NavigationTest.php +++ /dev/null @@ -1,215 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Registry::_unsetInstance(); - } - - public function tearDown() - { - Zend_Navigation_Page::setDefaultPageType(); - - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesNavigationObject() - { - $this->bootstrap->registerPluginResource('view'); - $resource = new Zend_Application_Resource_Navigation(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getContainer() instanceof Zend_Navigation_Container); - $this->bootstrap->unregisterPluginResource('view'); - } - - public function testInitializationReturnsNavigationObject() - { - $this->bootstrap->registerPluginResource('view'); - $resource = new Zend_Application_Resource_Navigation(array()); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Navigation); - $this->bootstrap->unregisterPluginResource('view'); - } - - public function testContainerIsStoredInViewhelper() - { - $options = array('pages'=> array(new Zend_Navigation_Page_Mvc(array( - 'action' => 'index', - 'controller' => 'index')))); - - $this->bootstrap->registerPluginResource('view'); - $resource = new Zend_Application_Resource_Navigation($options); - $resource->setBootstrap($this->bootstrap)->init(); - - $view = $this->bootstrap->getPluginResource('view')->getView(); - $number = $view->getHelper('navigation')->navigation()->count(); - - $this->assertEquals($number,1); - $this->bootstrap->unregisterPluginResource('view'); - } - - public function testContainerIsStoredInRegistry() - { - $options = array('pages'=> array(new Zend_Navigation_Page_Mvc(array( - 'action' => 'index', - 'controller' => 'index'))), 'storage' => array('registry' => true)); - - $resource = new Zend_Application_Resource_Navigation($options); - $resource->setBootstrap($this->bootstrap)->init(); - - $key = Zend_Application_Resource_Navigation::DEFAULT_REGISTRY_KEY; - $this->assertEquals(Zend_Registry::isRegistered($key),true); - $container = Zend_Registry::get($key); - $number = $container->count(); - - $this->assertEquals($number,1); - } - - /** - * @group ZF-6747 - */ - public function testViewMethodIsUsedWhenAvailableInsteadOfResourcePlugin() - { - require_once '_files/ZfAppBootstrapCustomView.php'; - - $bootstrap = new ZfAppBootstrapCustomView($this->application); - $bootstrap->registerPluginResource('view'); - $view = $bootstrap->bootstrap('view')->view; - - $this->assertEquals($view->setInMethodByTest,true); - } - - /** - * @group ZF-10959 - */ - public function testDefaultPageTypeIsSet() - { - $this->bootstrap->registerPluginResource('view'); - $this->bootstrap->getPluginResource('view')->getView(); - - $options = array('defaultPageType' => 'foobar', - 'pages'=> array(array( - 'action' => 'index', - 'controller' => 'index'))); - - $results = array(); - $resource = new Zend_Application_Resource_Navigation($options); - - try { - $resource->setBootstrap($this->bootstrap)->init(); - $this->fail('An exception should have been thrown but wasn\'t'); - } catch(Zend_Exception $e) { - $this->assertTrue(true); - } - - $this->bootstrap->unregisterPluginResource('view'); - } - - /** - * @group ZF-7461 - */ - public function testRegistryIsUsedWhenNumericRegistryValueIsGiven() - { - // Register view for cases where registry should/is not (be) used - $this->bootstrap->registerPluginResource('view'); - $this->bootstrap->getPluginResource('view')->getView(); - - $options1 = array( - 'pages'=> array(new Zend_Navigation_Page_Mvc(array( - 'action' => 'index', - 'controller' => 'index'))), - 'storage' => array('registry' => true)); - $options = array($options1, - array_merge($options1, array('storage' => array('registry' => '1'))), // Original culprit here - array_merge($options1, array('storage' => array('registry' => 1))), - array_merge($options1, array('storage' => array('registry' => false)))); - - $results = array(); - $key = Zend_Application_Resource_Navigation::DEFAULT_REGISTRY_KEY; - foreach($options as $option) { - $resource = new Zend_Application_Resource_Navigation($option); - $resource->setBootstrap($this->bootstrap)->init(); - $results[] = Zend_Registry::get($key) instanceof Zend_Navigation;; - Zend_Registry::set($key,null); - } - - $this->assertEquals(array(true,true,true,false),$results); - $this->bootstrap->unregisterPluginResource('view'); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_NavigationTest::main') { - Zend_Application_Resource_NavigationTest::main(); -} diff --git a/tests/Zend/Application/Resource/ResourceAbstractTest.php b/tests/Zend/Application/Resource/ResourceAbstractTest.php deleted file mode 100644 index d1b74abae7..0000000000 --- a/tests/Zend/Application/Resource/ResourceAbstractTest.php +++ /dev/null @@ -1,196 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testBootstrapIsNullByDefault() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $this->assertNull($resource->getBootstrap()); - } - - public function testResourceShouldAllowSettingParentBootstrap() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $resource->setBootstrap($this->bootstrap); - $this->assertSame($this->bootstrap, $resource->getBootstrap()); - } - - public function testOptionsAreStoredVerbatim() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $options = array( - 'foo' => 'bar', - ); - $resource->setOptions($options); - $this->assertEquals($options, $resource->getOptions()); - } - - public function testCallingSetOptionsMultipleTimesMergesOptions() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $options1 = array( - 'foo' => 'bar', - ); - $options2 = array( - 'bar' => 'baz', - ); - $options3 = array( - 'foo' => 'BAR', - ); - $expected = $resource->mergeOptions($options1, $options2); - $expected = $resource->mergeOptions($expected, $options3); - $resource->setOptions($options1) - ->setOptions($options2) - ->setOptions($options3); - $this->assertEquals($expected, $resource->getOptions()); - } - - public function testSetOptionsProxiesToLocalSetters() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $options = array( - 'someArbitraryKey' => 'test', - ); - $resource->setOptions($options); - $this->assertEquals('test', $resource->someArbitraryKey); - } - - public function testConstructorAcceptsArrayConfiguration() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $options = array( - 'foo' => 'bar', - ); - $resource = new Zend_Application_BootstrapTest_Resource_Foo($options); - $this->assertEquals($options, $resource->getOptions()); - } - - public function testConstructorAcceptsZendConfigObject() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $options = array( - 'foo' => 'bar', - ); - $config = new Zend_Config($options); - $resource = new Zend_Application_BootstrapTest_Resource_Foo($config); - $this->assertEquals($options, $resource->getOptions()); - } - - /** - * @group ZF-6593 - */ - public function testSetOptionsShouldRemoveBootstrapOptionWhenPassed() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $resource = new Zend_Application_BootstrapTest_Resource_Foo(); - $resource->setOptions(array( - 'bootstrap' => $this->bootstrap, - )); - $this->assertSame($this->bootstrap, $resource->getBootstrap()); - $options = $resource->getOptions(); - $this->assertNotContains('bootstrap', array_keys($options)); - } - - /** - * @group ZF-8520 - */ - public function testFirstResourceOptionShouldNotBeDropped() - { - require_once dirname(__FILE__) . '/../_files/resources/Foo.php'; - $options = array( - array('someData'), - array('someMoreData'), - ); - - $resource = new Zend_Application_BootstrapTest_Resource_Foo($options); - $stored = $resource->getOptions(); - $this->assertSame($options, $stored); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_ResourceAbstractTest::main') { - Zend_Application_Resource_ResourceAbstractTest::main(); -} diff --git a/tests/Zend/Application/Resource/RouterTest.php b/tests/Zend/Application/Resource/RouterTest.php deleted file mode 100644 index 24fb0f61e2..0000000000 --- a/tests/Zend/Application/Resource/RouterTest.php +++ /dev/null @@ -1,135 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - $this->application = new Zend_Application('testing'); - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Controller_Front::getInstance()->resetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesRouterObject() - { - $resource = new Zend_Application_Resource_Router(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getRouter() instanceof Zend_Controller_Router_Rewrite); - } - - public function testInitializationReturnsRouterObject() - { - $resource = new Zend_Application_Resource_Router(array()); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Controller_Router_Rewrite); - } - - public function testChainNameSeparatorIsParsedOnToRouter() - { - $resource = new Zend_Application_Resource_Router(array('chainNameSeparator' => '_unitTestSep_')); - $resource->setBootstrap($this->bootstrap); - $router = $resource->init(); - $this->assertEquals('_unitTestSep_', $router->getChainNameSeparator()); - } - - public function testOptionsPassedToResourceAreUsedToCreateRoutes() - { - $options = array('routes' => array( - 'archive' => array( - 'route' => 'archive/:year/*', - 'defaults' => array( - 'controller' => 'archive', - 'action' => 'show', - 'year' => 2000, - ), - 'reqs' => array( - 'year' => '\d+', - ), - ), - )); - - $resource = new Zend_Application_Resource_Router($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $router = $resource->getRouter(); - $this->assertTrue($router->hasRoute('archive')); - $route = $router->getRoute('archive'); - $this->assertTrue($route instanceof Zend_Controller_Router_Route); - $this->assertEquals($options['routes']['archive']['defaults'], $route->getDefaults()); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_RouterTest::main') { - Zend_Application_Resource_RouterTest::main(); -} diff --git a/tests/Zend/Application/Resource/SessionTest.php b/tests/Zend/Application/Resource/SessionTest.php deleted file mode 100644 index 78d9c8bd99..0000000000 --- a/tests/Zend/Application/Resource/SessionTest.php +++ /dev/null @@ -1,104 +0,0 @@ -resource = new Zend_Application_Resource_Session(); - } - - public function testSetSaveHandler() - { - $saveHandler = $this->getMock('Zend_Session_SaveHandler_Interface'); - - $this->resource->setSaveHandler($saveHandler); - $this->assertSame($saveHandler, $this->resource->getSaveHandler()); - } - - public function testSetSaveHandlerString() - { - $saveHandlerClassName = 'Zend_Application_Resource_SessionTestHandlerMock1'; - $saveHandler = $this->getMock('Zend_Session_SaveHandler_Interface', array(), array(), $saveHandlerClassName); - - $this->resource->setSaveHandler($saveHandlerClassName); - - $this->assertTrue($this->resource->getSaveHandler() instanceof $saveHandlerClassName); - } - - public function testSetSaveHandlerArray() - { - $saveHandlerClassName = 'Zend_Application_Resource_SessionTestHandlerMock2'; - $saveHandler = $this->getMock('Zend_Session_SaveHandler_Interface', array(), array(), $saveHandlerClassName); - - $this->resource->setSaveHandler(array('class' => $saveHandlerClassName)); - - $this->assertTrue($this->resource->getSaveHandler() instanceof $saveHandlerClassName); - } - - public function testSetOptions() - { - Zend_Session::setOptions(array( - 'use_only_cookies' => false, - 'remember_me_seconds' => 3600, - )); - - $this->resource->setOptions(array( - 'use_only_cookies' => true, - 'remember_me_seconds' => 7200, - )); - - $this->resource->init(); - - $this->assertEquals(1, Zend_Session::getOptions('use_only_cookies')); - $this->assertEquals(7200, Zend_Session::getOptions('remember_me_seconds')); - } - - public function testInitSetsSaveHandler() - { - Zend_Session::$_unitTestEnabled = true; - - $saveHandler = $this->getMock('Zend_Session_SaveHandler_Interface'); - - $this->resource->setSaveHandler($saveHandler); - - $this->resource->init(); - - $this->assertSame($saveHandler, Zend_Session::getSaveHandler()); - } -} diff --git a/tests/Zend/Application/Resource/TestAsset/ViewRenderer.php b/tests/Zend/Application/Resource/TestAsset/ViewRenderer.php deleted file mode 100644 index 681f959548..0000000000 --- a/tests/Zend/Application/Resource/TestAsset/ViewRenderer.php +++ /dev/null @@ -1,35 +0,0 @@ - array( - 'message1' => 'message1', - 'message2' => 'message2', - 'message3' => 'message3' - ) - ); - - /** - * @var Zend_Loader_Autoloader - */ - protected $autoloader; - - /** - * @var Zend_Application - */ - protected $application; - - /** - * @var Zend_Application_Bootstrap_Bootstrap - */ - protected $bootstrap; - - public static function main() - { - $suite = new PHPUnit_Framework_TestSuite(__CLASS__); - $result = PHPUnit_TextUI_TestRunner::run($suite); - } - - public function setUp() - { - // Store original autoloaders - $this->loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - $this->bootstrap = new Zend_Application_Bootstrap_Bootstrap($this->application); - - Zend_Registry::_unsetInstance(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesTranslateObject() - { - $resource = new Zend_Application_Resource_Translate($this->_translationOptions); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getTranslate() instanceof Zend_Translate); - } - - public function testInitializationReturnsLocaleObject() - { - $resource = new Zend_Application_Resource_Translate($this->_translationOptions); - $resource->setBootstrap($this->bootstrap); - $test = $resource->init(); - $this->assertTrue($test instanceof Zend_Translate); - } - - public function testOptionsPassedToResourceAreUsedToSetLocaleState() - { - $resource = new Zend_Application_Resource_Translate($this->_translationOptions); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $translate = $resource->getTranslate(); - $this->assertTrue(Zend_Registry::isRegistered('Zend_Translate')); - $this->assertSame(Zend_Registry::get('Zend_Translate'), $translate); - } - - public function testResourceThrowsExceptionWithoutData() - { - try { - $resource = new Zend_Application_Resource_Translate(); - $resource->getTranslate(); - $this->fail('Expected Zend_Application_Resource_Exception'); - } catch (Zend_Application_Resource_Exception $e) { - $this->assertTrue($e instanceof Zend_Application_Resource_Exception); - } - } - - /** - * @group ZF-7352 - */ - public function testTranslationIsAddedIfRegistryKeyExistsAlready() - { - $options1 = array('foo' => 'bar'); - $options2 = array_merge_recursive($this->_translationOptions, - array('data' => array('message4' => 'bericht4'))); - - $translate = new Zend_Translate(Zend_Translate::AN_ARRAY, $options1); - Zend_Registry::set('Zend_Translate', $translate); - - $resource = new Zend_Application_Resource_Translate($options2); - - $this->assertTrue($translate === $resource->getTranslate()); - $this->assertEquals('bar', $translate->translate('foo')); - $this->assertEquals('bericht4', $translate->translate('message4')); - $this->assertEquals('shouldNotExist', $translate->translate('shouldNotExist')); - } - - /** - * @group ZF-10034 - */ - public function testSetCacheFromCacheManager() - { - $configCache = array( - 'translate' => array( - 'frontend' => array( - 'name' => 'Core', - 'options' => array( - 'lifetime' => 120, - 'automatic_serialization' => true - ) - ), - 'backend' => array( - 'name' => 'Black Hole' - ) - ) - ); - $this->bootstrap->registerPluginResource('cachemanager', $configCache); - - $options = $this->_translationOptions; - $options['cache'] = 'translate'; - $resource = new Zend_Application_Resource_Translate($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - - $this->assertTrue(Zend_Translate::getCache() instanceof Zend_Cache_Core); - Zend_Translate::removeCache(); - } - - /** - * @group ZF-10352 - */ - public function testToUseTheSameKeyAsTheOptionsZendTranslate() - { - $options = array( - 'adapter' => 'array', - 'content' => array( - 'm1' => 'message1', - 'm2' => 'message2' - ), - 'locale' => 'auto' - ); - - $resource = new Zend_Application_Resource_Translate($options); - $translator = $resource->init(); - - $this->assertEquals(new Zend_Translate($options), $translator); - $this->assertEquals('message2', $translator->_('m2')); - } - - /** - * @group ZF-10352 - * @expectedException Zend_Application_Resource_Exception - */ - public function testToUseTheTwoKeysContentAndDataShouldThrowsException() - { - $options = array( - 'adapter' => 'array', - 'content' => array( - 'm1' => 'message1', - 'm2' => 'message2' - ), - 'data' => array( - 'm3' => 'message3', - 'm4' => 'message4' - ), - 'locale' => 'auto' - ); - - $resource = new Zend_Application_Resource_Translate($options); - $translator = $resource->init(); - } - - /** - * @group GH-103 - */ - public function testLogFactory() - { - $options = $this->_translationOptions; - $options['log'][0] = new Zend_Log_Writer_Mock(); - $options['logUntranslated'] = true; - $options['locale'] = 'en'; - - $resource = new Zend_Application_Resource_Translate($options); - $resource->setBootstrap($this->bootstrap); - - $resource->init()->translate('untranslated'); - $event = current($options['log'][0]->events); - - $this->assertTrue(is_array($event)); - $this->assertTrue(array_key_exists('message', $event)); - $this->assertEquals( - "Untranslated message within 'en': untranslated", - $event['message'] - ); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_TranslateTest::main') { - Zend_Application_Resource_TranslateTest::main(); -} diff --git a/tests/Zend/Application/Resource/UseragentTest.php b/tests/Zend/Application/Resource/UseragentTest.php deleted file mode 100644 index ac909799a5..0000000000 --- a/tests/Zend/Application/Resource/UseragentTest.php +++ /dev/null @@ -1,124 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - - Zend_Controller_Action_HelperBroker::resetHelpers(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesUserAgentObject() - { - $resource = new Zend_Application_Resource_Useragent(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $this->assertTrue($resource->getUserAgent() instanceof Zend_Http_UserAgent); - } - - public function testOptionsPassedToResourceAreUsedToSetUserAgentState() - { - $options = array( - 'storage' => array('adapter' => 'NonPersistent'), - ); - $resource = new Zend_Application_Resource_Useragent($options); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - $ua = $resource->getUserAgent(); - $storage = $ua->getStorage(); - $this->assertTrue($storage instanceof Zend_Http_UserAgent_Storage_NonPersistent); - } - - public function testInjectsUserAgentIntoViewHelperWhenViewResourcePresent() - { - $this->bootstrap->registerPluginResource('view', array()); - $resource = new Zend_Application_Resource_Useragent(array()); - $resource->setBootstrap($this->bootstrap); - $resource->init(); - - $view = $this->bootstrap->getResource('view'); - $helper = $view->getHelper('userAgent'); - - $expected = $resource->getUserAgent(); - $this->assertSame($expected, $helper->getUserAgent()); - } -} - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_UseragentTest::main') { - Zend_Application_Resource_UseragentTest::main(); -} diff --git a/tests/Zend/Application/Resource/ViewTest.php b/tests/Zend/Application/Resource/ViewTest.php deleted file mode 100644 index 87ba8f396e..0000000000 --- a/tests/Zend/Application/Resource/ViewTest.php +++ /dev/null @@ -1,249 +0,0 @@ -loaders = spl_autoload_functions(); - if (!is_array($this->loaders)) { - // spl_autoload_functions does not return empty array when no - // autoloaders registered... - $this->loaders = array(); - } - - Zend_Loader_Autoloader::resetInstance(); - $this->autoloader = Zend_Loader_Autoloader::getInstance(); - - $this->application = new Zend_Application('testing'); - - require_once dirname(__FILE__) . '/../_files/ZfAppBootstrap.php'; - $this->bootstrap = new ZfAppBootstrap($this->application); - - Zend_Controller_Action_HelperBroker::resetHelpers(); - } - - public function tearDown() - { - // Restore original autoloaders - $loaders = spl_autoload_functions(); - foreach ($loaders as $loader) { - spl_autoload_unregister($loader); - } - - foreach ($this->loaders as $loader) { - spl_autoload_register($loader); - } - - // Reset autoloader instance so it doesn't affect other tests - Zend_Loader_Autoloader::resetInstance(); - } - - public function testInitializationInitializesViewObject() - { - $resource = new Zend_Application_Resource_View(array()); - $resource->init(); - $this->assertTrue($resource->getView() instanceof Zend_View); - } - - public function testInitializationInjectsViewIntoViewRenderer() - { - $resource = new Zend_Application_Resource_View(array()); - $resource->init(); - $view = $resource->getView(); - $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); - $this->assertSame($view, $viewRenderer->view); - } - - public function testOptionsPassedToResourceAreUsedToSetViewState() - { - $options = array( - 'scriptPath' => dirname(__FILE__), - ); - require_once 'Zend/Application/Resource/View.php'; - $resource = new Zend_Application_Resource_View($options); - $resource->init(); - $view = $resource->getView(); - $paths = $view->getScriptPaths(); - $this->assertContains(dirname(__FILE__) . '/', $paths, var_export($paths, 1)); - } - - public function testDoctypeIsSet() - { - $options = array('doctype' => 'XHTML1_FRAMESET'); - $resource = new Zend_Application_Resource_View($options); - $resource->init(); - $view = $resource->getView(); - $this->assertEquals('XHTML1_FRAMESET', $view->doctype()->getDoctype()); - } - - /** - * @group ZF-10343 - */ - public function testContentTypeIsSet() - { - $contentType = 'text/html; charset=UTF-8'; - $options = array('contentType' => $contentType); - $resource = new Zend_Application_Resource_View($options); - $headMetaHelper = $resource->init()->headMeta(); - - $actual = null; - $container = $headMetaHelper->getContainer(); - foreach ($container as $item) { - if ('Content-Type' == $item->{$item->type}) { - $actual = $item->content; - break; - } - } - - $this->assertEquals($contentType, $actual); - - Zend_View_Helper_Placeholder_Registry::getRegistry() - ->deleteContainer('Zend_View_Helper_HeadMeta'); - } - - /** - * @group ZF-10343 - */ - public function testSetMetaCharsetForHtml5() - { - $charset = 'UTF-8'; - $options = array( - 'doctype' => 'HTML5', - 'charset' => $charset, - ); - $resource = new Zend_Application_Resource_View($options); - $view = $resource->init(); - $headMetaHelper = $view->headMeta(); - - $actual = null; - $container = $headMetaHelper->getContainer(); - foreach ($container as $item) { - if ('charset' == $item->type) { - $actual = $item->charset; - break; - } - } - - $this->assertTrue($view->doctype()->isHtml5()); - $this->assertEquals($charset, $actual); - - $registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); - $registry->deleteContainer('Zend_View_Helper_HeadMeta'); - $registry->deleteContainer('Zend_View_Helper_Doctype'); - } - - /** - * @group ZF-10343 - */ - public function testSetMetaCharsetShouldOnlyAvailableForHtml5() - { - $charset = 'UTF-8'; - $options = array( - 'doctype' => 'XHTML1_STRICT', - 'charset' => $charset, - ); - $resource = new Zend_Application_Resource_View($options); - $view = $resource->init(); - $headMetaHelper = $view->headMeta(); - - $actual = null; - $container = $headMetaHelper->getContainer(); - foreach ($container as $item) { - if ('charset' == $item->type) { - $actual = $item->charset; - break; - } - } - - $this->assertFalse($view->doctype()->isHtml5()); - $this->assertNull($actual); - - $registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); - $registry->deleteContainer('Zend_View_Helper_HeadMeta'); - $registry->deleteContainer('Zend_View_Helper_Doctype'); - } - - /** - * @group ZF-10042 - */ - public function testAssignmentsAreSet() - { - $options = array( - 'assign' => array( - 'foo' => 'barbapapa', - 'bar' => 'barbazoo', - ) - ); - $resource = new Zend_Application_Resource_View($options); - $view = $resource->init(); - - $this->assertEquals('barbapapa', $view->foo); - $this->assertEquals('barbazoo', $view->bar); - } - - /** - * @group ZF-11579 - */ - public function testViewResourceDoesNotReinjectViewRenderer() - { - require_once dirname(__FILE__) . '/TestAsset/ViewRenderer.php'; - $viewRenderer = new Zend_Application_Resource_TestAsset_ViewRenderer(); - Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); - - $resource = new Zend_Application_Resource_View(array('encoding' => 'UTF-8')); - $view = $resource->init(); - - $this->assertSame($view, $viewRenderer->view); - } -} - - -if (PHPUnit_MAIN_METHOD == 'Zend_Application_Resource_ViewTest::main') { - Zend_Application_Resource_ViewTest::main(); -} diff --git a/tests/Zend/Application/Resource/_files/ZfAppBootstrapCustomView.php b/tests/Zend/Application/Resource/_files/ZfAppBootstrapCustomView.php deleted file mode 100644 index bbf5e86fb0..0000000000 --- a/tests/Zend/Application/Resource/_files/ZfAppBootstrapCustomView.php +++ /dev/null @@ -1,37 +0,0 @@ -setInMethodByTest = true; - return $view; - } -} diff --git a/tests/Zend/Application/Resource/mailTestCAsE.php b/tests/Zend/Application/Resource/mailTestCAsE.php deleted file mode 100644 index 53ecebd44c..0000000000 --- a/tests/Zend/Application/Resource/mailTestCAsE.php +++ /dev/null @@ -1,11 +0,0 @@ -bootstrap('Second'); - $this->complete = true; - } - - public function _initSecond() - { - $this->bootstrap('First'); - $this->complete = true; - } -} diff --git a/tests/Zend/Application/_files/Zf-6719-1.ini b/tests/Zend/Application/_files/Zf-6719-1.ini deleted file mode 100644 index 7426f49673..0000000000 --- a/tests/Zend/Application/_files/Zf-6719-1.ini +++ /dev/null @@ -1,5 +0,0 @@ -[production] -foo = "bar" - -[testing : production] - diff --git a/tests/Zend/Application/_files/Zf-6719-2.ini b/tests/Zend/Application/_files/Zf-6719-2.ini deleted file mode 100644 index 03d31287b1..0000000000 --- a/tests/Zend/Application/_files/Zf-6719-2.ini +++ /dev/null @@ -1,5 +0,0 @@ -[production] -foo = "baz" - -[testing : production] - diff --git a/tests/Zend/Application/_files/Zf7696Bootstrap.php b/tests/Zend/Application/_files/Zf7696Bootstrap.php deleted file mode 100644 index fca731913b..0000000000 --- a/tests/Zend/Application/_files/Zf7696Bootstrap.php +++ /dev/null @@ -1,77 +0,0 @@ -fooExecuted++; - } - - protected function _initBar() - { - $this->barExecuted++; - } - - protected function _initBarbaz() - { - $o = new stdClass(); - $o->baz = 'Baz'; - return $o; - } - - protected function _initFrontController() - { - $front = Zend_Controller_Front::getInstance(); - $front->addModuleDirectory(dirname(__FILE__) . '/modules'); - return $front; - } - - public function setArbitrary($value) - { - $this->_arbitraryValue = $value; - return $this; - } - - public function getArbitrary() - { - return $this->_arbitraryValue; - } -} diff --git a/tests/Zend/Application/_files/ZfAppBadBootstrap.php b/tests/Zend/Application/_files/ZfAppBadBootstrap.php deleted file mode 100644 index 809625448b..0000000000 --- a/tests/Zend/Application/_files/ZfAppBadBootstrap.php +++ /dev/null @@ -1,32 +0,0 @@ -fooExecuted++; - } - - protected function _initBar() - { - $this->barExecuted++; - } - - protected function _initBarbaz() - { - $o = new stdClass(); - $o->baz = 'Baz'; - return $o; - } - - public function setArbitrary($value) - { - $this->_arbitraryValue = $value; - return $this; - } - - public function getArbitrary() - { - return $this->_arbitraryValue; - } -} diff --git a/tests/Zend/Application/_files/ZfAppNoBootstrap.php b/tests/Zend/Application/_files/ZfAppNoBootstrap.php deleted file mode 100644 index b2782c9ff9..0000000000 --- a/tests/Zend/Application/_files/ZfAppNoBootstrap.php +++ /dev/null @@ -1,23 +0,0 @@ -foo = $value; - return $this; - } -} diff --git a/tests/Zend/Application/_files/appconfig.inc b/tests/Zend/Application/_files/appconfig.inc deleted file mode 100644 index af7f378922..0000000000 --- a/tests/Zend/Application/_files/appconfig.inc +++ /dev/null @@ -1,9 +0,0 @@ - 'bar', -); -return $config; diff --git a/tests/Zend/Application/_files/appconfig.ini b/tests/Zend/Application/_files/appconfig.ini deleted file mode 100644 index 7426f49673..0000000000 --- a/tests/Zend/Application/_files/appconfig.ini +++ /dev/null @@ -1,5 +0,0 @@ -[production] -foo = "bar" - -[testing : production] - diff --git a/tests/Zend/Application/_files/appconfig.ini.dist b/tests/Zend/Application/_files/appconfig.ini.dist deleted file mode 100644 index 7426f49673..0000000000 --- a/tests/Zend/Application/_files/appconfig.ini.dist +++ /dev/null @@ -1,5 +0,0 @@ -[production] -foo = "bar" - -[testing : production] - diff --git a/tests/Zend/Application/_files/appconfig.json b/tests/Zend/Application/_files/appconfig.json deleted file mode 100644 index 75387e510d..0000000000 --- a/tests/Zend/Application/_files/appconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "production": { - "foo": "bar" - }, - "testing": { - "_extends": "production" - } -} \ No newline at end of file diff --git a/tests/Zend/Application/_files/appconfig.php b/tests/Zend/Application/_files/appconfig.php deleted file mode 100644 index d1ac28ba8b..0000000000 --- a/tests/Zend/Application/_files/appconfig.php +++ /dev/null @@ -1,24 +0,0 @@ - - - - bar - - - diff --git a/tests/Zend/Application/_files/appconfig.yaml b/tests/Zend/Application/_files/appconfig.yaml deleted file mode 100644 index d4fc206eee..0000000000 --- a/tests/Zend/Application/_files/appconfig.yaml +++ /dev/null @@ -1,7 +0,0 @@ -production: - foo: "bar" - -testing: - _extends: production - - \ No newline at end of file diff --git a/tests/Zend/Application/_files/appconfig.yml b/tests/Zend/Application/_files/appconfig.yml deleted file mode 100644 index d4fc206eee..0000000000 --- a/tests/Zend/Application/_files/appconfig.yml +++ /dev/null @@ -1,7 +0,0 @@ -production: - foo: "bar" - -testing: - _extends: production - - \ No newline at end of file diff --git a/tests/Zend/Application/_files/modules/bar/Bootstrap.php b/tests/Zend/Application/_files/modules/bar/Bootstrap.php deleted file mode 100644 index 8dcfd52f06..0000000000 --- a/tests/Zend/Application/_files/modules/bar/Bootstrap.php +++ /dev/null @@ -1,43 +0,0 @@ -bootstrapped = true; - $this->getApplication()->bar = true; - } -} diff --git a/tests/Zend/Application/_files/modules/bar/controllers/.placeholder b/tests/Zend/Application/_files/modules/bar/controllers/.placeholder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/Zend/Application/_files/modules/baz/controllers/.placeholder b/tests/Zend/Application/_files/modules/baz/controllers/.placeholder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/Zend/Application/_files/modules/default/Bootstrap.php b/tests/Zend/Application/_files/modules/default/Bootstrap.php deleted file mode 100644 index fbcc08d469..0000000000 --- a/tests/Zend/Application/_files/modules/default/Bootstrap.php +++ /dev/null @@ -1,43 +0,0 @@ -bootstrapped = true; - $this->getApplication()->default = true; - } -} diff --git a/tests/Zend/Application/_files/modules/foo-bar/Bootstrap.php b/tests/Zend/Application/_files/modules/foo-bar/Bootstrap.php deleted file mode 100644 index 65fa136618..0000000000 --- a/tests/Zend/Application/_files/modules/foo-bar/Bootstrap.php +++ /dev/null @@ -1,42 +0,0 @@ -bootstrapped = true; - } -} diff --git a/tests/Zend/Application/_files/modules/foo/Bootstrap.php b/tests/Zend/Application/_files/modules/foo/Bootstrap.php deleted file mode 100644 index baf84657b7..0000000000 --- a/tests/Zend/Application/_files/modules/foo/Bootstrap.php +++ /dev/null @@ -1,43 +0,0 @@ -bootstrapped = true; - $this->getApplication()->foo = true; - } -} diff --git a/tests/Zend/Application/_files/modules/foo/controllers/.placeholder b/tests/Zend/Application/_files/modules/foo/controllers/.placeholder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/ErrorController.php b/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/ErrorController.php deleted file mode 100644 index 57355feabf..0000000000 --- a/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/ErrorController.php +++ /dev/null @@ -1,37 +0,0 @@ -_helper->viewRenderer->setNoRender(); - $this->getInvokeArg('bootstrap')->getContainer()->error = $this->_getParam('error_handler'); - } -} diff --git a/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/IndexController.php b/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/IndexController.php deleted file mode 100644 index a437a46af7..0000000000 --- a/tests/Zend/Application/_files/modules/zfappbootstrap/controllers/IndexController.php +++ /dev/null @@ -1,38 +0,0 @@ -_helper->viewRenderer->setNoRender(); - $this->getInvokeArg('bootstrap')->getContainer()->zfappbootstrap = true; - } -} diff --git a/tests/Zend/Application/_files/more_modules/bat/Bootstrap.php b/tests/Zend/Application/_files/more_modules/bat/Bootstrap.php deleted file mode 100644 index f9446b5de9..0000000000 --- a/tests/Zend/Application/_files/more_modules/bat/Bootstrap.php +++ /dev/null @@ -1,43 +0,0 @@ -bootstrapped = true; - $this->getApplication()->bar = true; - } -} diff --git a/tests/Zend/Application/_files/more_modules/bat/controllers/.placeholder b/tests/Zend/Application/_files/more_modules/bat/controllers/.placeholder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/Zend/Application/_files/more_modules/foobaz/controllers/.placeholder b/tests/Zend/Application/_files/more_modules/foobaz/controllers/.placeholder deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/Zend/Application/_files/resources/Autoloaded.php b/tests/Zend/Application/_files/resources/Autoloaded.php deleted file mode 100644 index bfe77e2b5d..0000000000 --- a/tests/Zend/Application/_files/resources/Autoloaded.php +++ /dev/null @@ -1,36 +0,0 @@ -getBootstrap()->executedAutoloadedResource = true; - } -} diff --git a/tests/Zend/Application/_files/resources/Baz.php b/tests/Zend/Application/_files/resources/Baz.php deleted file mode 100644 index c75446d258..0000000000 --- a/tests/Zend/Application/_files/resources/Baz.php +++ /dev/null @@ -1,38 +0,0 @@ -baz = 'Baz'; - return $o; - } -} diff --git a/tests/Zend/Application/_files/resources/Foo.php b/tests/Zend/Application/_files/resources/Foo.php deleted file mode 100644 index 82f878b6c0..0000000000 --- a/tests/Zend/Application/_files/resources/Foo.php +++ /dev/null @@ -1,43 +0,0 @@ -getBootstrap()->executedFooResource = true; - } - - public function setSomeArbitraryKey($value) - { - $this->someArbitraryKey = $value; - } -} diff --git a/tests/Zend/Application/_files/resources/Foobar.php b/tests/Zend/Application/_files/resources/Foobar.php deleted file mode 100644 index da9cf0de6e..0000000000 --- a/tests/Zend/Application/_files/resources/Foobar.php +++ /dev/null @@ -1,36 +0,0 @@ -getBootstrap()->executedFoobarResource = true; - } -} diff --git a/tests/Zend/Application/_files/zf-6679-1.inc b/tests/Zend/Application/_files/zf-6679-1.inc deleted file mode 100644 index 6108e4f97a..0000000000 --- a/tests/Zend/Application/_files/zf-6679-1.inc +++ /dev/null @@ -1,8 +0,0 @@ - dirname(__FILE__) . '/zf-6679-2.inc', - 'includePaths' => array( - 'path1' => 'some/path', - ), -); -return $config; diff --git a/tests/Zend/Application/_files/zf-6679-2.inc b/tests/Zend/Application/_files/zf-6679-2.inc deleted file mode 100644 index b18e735b22..0000000000 --- a/tests/Zend/Application/_files/zf-6679-2.inc +++ /dev/null @@ -1,7 +0,0 @@ - array( - 'path2' => 'another/path', - ), -); -return $config; From 2553aeb16857bdd077d7712fd96e46b16f968b57 Mon Sep 17 00:00:00 2001 From: Joan He Date: Fri, 6 Apr 2018 11:59:40 -0500 Subject: [PATCH 40/40] MAGETWO-89443: Release New Version of ZF1 - Remove Zend_Log_Writer_Mail Tests --- tests/Zend/Log/Writer/AllTests.php | 1 - tests/Zend/Log/Writer/MailTest.php | 522 ----------------------------- 2 files changed, 523 deletions(-) delete mode 100644 tests/Zend/Log/Writer/MailTest.php diff --git a/tests/Zend/Log/Writer/AllTests.php b/tests/Zend/Log/Writer/AllTests.php index 4d50a3436e..d10a67ac81 100644 --- a/tests/Zend/Log/Writer/AllTests.php +++ b/tests/Zend/Log/Writer/AllTests.php @@ -26,7 +26,6 @@ require_once 'Zend/Log/Writer/AbstractTest.php'; require_once 'Zend/Log/Writer/DbTest.php'; -require_once 'Zend/Log/Writer/MailTest.php'; require_once 'Zend/Log/Writer/MockTest.php'; require_once 'Zend/Log/Writer/NullTest.php'; require_once 'Zend/Log/Writer/StreamTest.php'; diff --git a/tests/Zend/Log/Writer/MailTest.php b/tests/Zend/Log/Writer/MailTest.php deleted file mode 100644 index d288cc3c7f..0000000000 --- a/tests/Zend/Log/Writer/MailTest.php +++ /dev/null @@ -1,522 +0,0 @@ -_transport = $this->getMockForAbstractClass( - 'Zend_Mail_Transport_Abstract', - array() - ); - Zend_Mail::setDefaultTransport($this->_transport); - } - - protected function tearDown() - { - Zend_Mail::clearDefaultTransport(); - } - - /** - * Tests normal logging, but with multiple messages for a level. - * - * @return void - */ - public function testNormalLoggingMultiplePerLevel() - { - list(, , $log) = $this->_getSimpleLogger(); - $log->info('an info message'); - $log->info('a second info message'); - } - - /** - * Tests normal logging without use of Zend_Layout. - * - * @return void - */ - public function testNormalLoggingNoLayout() - { - list(, , $log) = $this->_getSimpleLogger(); - $log->info('an info message'); - $log->warn('a warning message'); - } - - /** - * Tests normal logging with Zend_Layout usage. - * - * @return void - */ - public function testNormalLoggingWithLayout() - { - list(, , $log) = $this->_getSimpleLogger(true); - $log->info('an info message'); - $log->warn('a warning message'); - } - - /** - * Tests normal logging with Zend_Layout and a custom formatter for it. - * - * @return void - */ - public function testNormalLoggingWithLayoutAndItsFormatter() - { - list(, $writer, $log) = $this->_getSimpleLogger(true); - - // Since I'm using Zend_Layout, I should be able to set a formatter - // for it. - $writer->setLayoutFormatter(new Zend_Log_Formatter_Simple()); - - // Log some messages to cover those cases. - $log->info('an info message'); - $log->warn('a warning message'); - } - - /** - * Tests normal logging with use of Zend_Layout, a custom formatter, and - * subject prepend text. - * - * @return void - */ - public function testNormalLoggingWithLayoutFormatterAndSubjectPrependText() - { - list(, $writer, $log) = $this->_getSimpleLogger(true); - $writer->setLayoutFormatter(new Zend_Log_Formatter_Simple()); - $return = $writer->setSubjectPrependText('foo'); - - $this->assertSame($writer, $return); - - // Log some messages to cover those cases. - $log->info('an info message'); - $log->warn('a warning message'); - } - - /** - * Tests setting of subject prepend text. - * - * @return void - */ - public function testSetSubjectPrependTextNormal() - { - list($mail, $writer, $log) = $this->_getSimpleLogger(); - - $return = $writer->setSubjectPrependText('foo'); - - // Ensure that fluent interface is present. - $this->assertSame($writer, $return); - } - - /** - * Tests that the subject prepend text can't be set if the Zend_Mail - * object already has a subject line set. - * - * @return void - */ - public function testSetSubjectPrependTextPreExisting() - { - list($mail, $writer, $log) = $this->_getSimpleLogger(); - - // Expect a Zend_Log_Exception because the subject prepend text cannot - // be set of the Zend_Mail object already has a subject line set. - $this->setExpectedException('Zend_Log_Exception'); - - // Set a subject line so the setSubjectPrependText() call triggers an - // exception. - $mail->setSubject('a pre-existing subject line'); - - $writer->setSubjectPrependText('foo'); - } - - /** - * Tests basic fluent interface for setting layout formatter. - * - * @return void - */ - public function testSetLayoutFormatter() - { - list(, $writer) = $this->_getSimpleLogger(true); - $return = $writer->setLayoutFormatter(new Zend_Log_Formatter_Simple()); - $this->assertSame($writer, $return); - } - - /** - * Tests that the layout formatter can be set and retrieved. - * - * @return void - */ - public function testGetLayoutFormatter() - { - list(, $writer) = $this->_getSimpleLogger(true); - $formatter = new Zend_Log_Formatter_Simple(); - - // Ensure that fluent interface is present. - $returnedWriter = $writer->setLayoutFormatter($formatter); - $this->assertSame($writer, $returnedWriter); - - // Ensure that the getter returns the same formatter. - $returnedFormatter = $writer->getLayoutFormatter(); - $this->assertSame($formatter, $returnedFormatter); - } - - /** - * Tests setting of the layout formatter when Zend_Layout is not being - * used. - * - * @return void - */ - public function testSetLayoutFormatterWithoutLayout() - { - list(, $writer) = $this->_getSimpleLogger(); - - // If Zend_Layout is not being used, a formatter cannot be set for it. - $this->setExpectedException('Zend_Log_Exception'); - $writer->setLayoutFormatter(new Zend_Log_Formatter_Simple()); - } - - /** - * Tests destruction of the Zend_Log instance when an error message entry - * is in place, but the mail can't be sent. Should result in a warning, - * which we test for here. - * - * @return void - */ - public function testDestructorMailError() - { - list($mail, $writer, $log) = $this->_getSimpleLogger(false); - - // Force the send() method to throw the same exception that would be - // thrown if, say, the SMTP server couldn't be contacted. - $mail->expects($this->any()) - ->method('send') - ->will($this->throwException(new Zend_Mail_Transport_Exception())); - - // Log an error message so that there's something to send via email. - $log->err('a bogus error message to force mail sending'); - - $this->setExpectedException('PHPUnit_Framework_Error'); - unset($log); - } - - /** - * Tests destruction of the Zend_Log instance when an error message entry - * is in place, but the layout can't be rendered. Should result in a - * notice, which we test for here. - * - * @return void - */ - public function testDestructorLayoutError() - { - list($mail, $writer, $log, $layout) = $this->_getSimpleLogger(true); - - // Force the render() method to throw the same exception that would - // be thrown if, say, the layout template file couldn't be found. - $layout->expects($this->any()) - ->method('render') - ->will($this->throwException(new Zend_View_Exception('bogus message'))); - - // Log an error message so that there's something to send via email. - $log->err('a bogus error message to force mail sending'); - - $this->setExpectedException('PHPUnit_Framework_Error'); - unset($log); - } - - /** - * @group ZF-8953 - */ - public function testFluentInterface() - { - require_once 'Zend/Log/Formatter/Simple.php'; - list(, $writer) = $this->_getSimpleLogger(true); - $instance = $writer->setLayoutFormatter(new Zend_Log_Formatter_Simple()) - ->setSubjectPrependText('subject'); - - $this->assertTrue($instance instanceof Zend_Log_Writer_Mail); - } - - /** - * @group ZF-9990 - */ - public function testFactory() - { - $config = array( - 'from' => array( - 'email' => 'log@test.framework.zend.com' - ), - 'to' => 'admin@domain.com', - 'subject' => '[error] exceptions on my application' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $this->assertTrue($writer instanceof Zend_Log_Writer_Mail); - - $writer->write($this->_getEvent()); - $writer->shutdown(); - - $this->assertEquals('admin@domain.com', $this->_transport->recipients); - $this->assertContains('an info message', $this->_transport->body); - $this->assertContains('From: log@test.framework.zend.com', $this->_transport->header); - $this->assertContains('To: admin@domain.com', $this->_transport->header); - $this->assertContains('Subject: [error] exceptions on my application', $this->_transport->header); - } - - /** - * @group ZF-9990 - */ - public function testFactoryShouldSetSubjectPrependText() - { - $config = array( - 'subjectPrependText' => '[error] exceptions on my application' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $writer->write($this->_getEvent()); - $writer->shutdown(); - - $this->assertContains('Subject: [error] exceptions on my application (INFO=1)', $this->_transport->header); - } - - /** - * @group ZF-9990 - */ - public function testFactoryShouldAcceptCustomMailClass() - { - $this->getMock('Zend_Mail', array(), array(), 'Zend_Stub_Mail_Custom'); - $config = array( - 'class' => 'Zend_Stub_Mail_Custom' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $this->assertTrue($writer instanceof Zend_Log_Writer_Mail); - } - - /** - * @group ZF-9990 - */ - public function testFactoryShouldSetCharsetForMail() - { - $config = array( - 'charset' => 'UTF-8' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $writer->write($this->_getEvent()); - $writer->shutdown(); - - $this->assertContains('Content-Type: text/plain; charset=UTF-8', $this->_transport->header); - } - - /** - * @group ZF-9990 - */ - public function testFactoryShouldAllowToSetMultipleRecipientsInArray() - { - $config = array( - 'to' => array( - 'John Doe' => 'admin1@domain.com', - 'admin2@domain.com' - ), - 'cc' => array( - 'bug@domain.com', - 'project' => 'projectname@domain.com' - ) - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $writer->write($this->_getEvent()); - $writer->shutdown(); - - $this->assertContains('admin1@domain.com', $this->_transport->recipients); - $this->assertContains('admin2@domain.com', $this->_transport->recipients); - $this->assertContains('bug@domain.com', $this->_transport->recipients); - $this->assertContains('projectname@domain.com', $this->_transport->recipients); - $this->assertContains('To: John Doe ', $this->_transport->header); - $this->assertContains('admin2@domain.com', $this->_transport->header); - $this->assertContains('Cc: bug@domain.com', $this->_transport->header); - $this->assertContains('project ', $this->_transport->header); - } - - /** - * @group ZF-9990 - */ - public function testFactoryWithLayout() - { - $config = array( - 'layoutOptions' => array( - 'layoutPath' => dirname(__FILE__) . '/_files' - ) - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $writer->write($this->_getEvent()); - $writer->shutdown(); - - $this->assertFalse(empty($this->_transport->boundary)); - $this->assertContains('Content-Type: multipart/', $this->_transport->header); - $this->assertContains('boundary=', $this->_transport->header); - $this->assertContains('Content-Type: text/plain', $this->_transport->body); - $this->assertContains('Content-Type: text/html', $this->_transport->body); - $this->assertContains($this->_transport->boundary, $this->_transport->body); - $this->assertEquals(2, substr_count($this->_transport->body, 'an info message')); - } - - /** - * @group ZF-9990 - */ - public function testFactoryShouldSetLayoutFormatter() - { - $config = array( - 'layoutOptions' => array( - 'layoutPath' => '/path/to/layout/scripts' - ), - 'layoutFormatter' => 'Zend_Log_Formatter_Simple' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $this->assertTrue($writer->getLayoutFormatter() instanceof Zend_Log_Formatter_Simple); - } - - /** - * @group ZF-9990 - */ - public function testFactoryWithCustomLayoutClass() - { - $this->getMock('Zend_Layout', null, array(), 'Zend_Stub_Layout_Custom'); - $config = array( - 'layout' => 'Zend_Stub_Layout_Custom' - ); - - $writer = Zend_Log_Writer_Mail::factory($config); - $this->assertTrue($writer instanceof Zend_Log_Writer_Mail); - } - - /** - * Returns an array of the Zend_Mail mock object, Zend_Log_Writer_Mail - * object, and Zend_Log objects. - * - * This is just a helper function for the various test methods above. - * - * @return array Numerically indexed array of Zend_Mail, - * Zend_Log_Writer_Mail, Zend_Log, and Zend_Layout objects, - * in that order. - */ - protected function _getSimpleLogger($useLayout = false) - { - // Get a mock object for Zend_Mail so that no emails are actually - // sent. - $mail = $this->getMock('Zend_Mail', array('send')); - - // The send() method can be called any number of times. - $mail->expects($this->any()) - ->method('send'); - - $mail->addTo('zend_log_writer_mail_test@example.org'); - $mail->setFrom('zend_log_writer_mail_test@example.org'); - - // Setup a mock object for Zend_Layout because we can't rely on any - // layout files being in place. - if ($useLayout) { - $layout = $this->getMock('Zend_Layout', array('render')); - $writer = new Zend_Log_Writer_Mail($mail, $layout); - } else { - $writer = new Zend_Log_Writer_Mail($mail); - $layout = null; - } - - $log = new Zend_Log(); - $log->addWriter($writer); - - return array($mail, $writer, $log, $layout); - } - - /** - * Returns a sample of an event - * - * @return array - */ - protected function _getEvent() - { - return array( - 'timestamp' => date('c'), - 'message' => 'an info message', - 'priority' => 6, - 'priorityName' => 'INFO' - ); - } -} - -// Call Zend_Log_Writer_MailTest::main() if this source file is executed directly. -if (PHPUnit_MAIN_METHOD == "Zend_Log_Writer_MailTest::main") { - Zend_Log_Writer_MailTest::main(); -}