[Argil-svn] SF.net SVN: argil: [529] branches/experimental
Status: Alpha
Brought to you by:
tswicegood
|
From: <tsw...@us...> - 2007-05-25 23:00:06
|
Revision: 529
http://argil.svn.sourceforge.net/argil/?rev=529&view=rev
Author: tswicegood
Date: 2007-05-25 16:00:08 -0700 (Fri, 25 May 2007)
Log Message:
-----------
Add in the fleshing out of the Annotation_Collection object
Modified Paths:
--------------
branches/experimental/src/Argil/Util/Annotation/Collection.php
branches/experimental/tests/Argil/Util/Annotation/CollectionTest.php
Modified: branches/experimental/src/Argil/Util/Annotation/Collection.php
===================================================================
--- branches/experimental/src/Argil/Util/Annotation/Collection.php 2007-05-25 18:51:33 UTC (rev 528)
+++ branches/experimental/src/Argil/Util/Annotation/Collection.php 2007-05-25 23:00:08 UTC (rev 529)
@@ -1,10 +1,11 @@
<?php
-class Argil_Util_Annotation_Collection
+class Argil_Util_Annotation_Collection implements Iterator
{
+ private $_cursor = 0;
private $_stack = array();
- public function add(Argil_Util_Annotation_Value $annontation)
+ public function add(Argil_Util_Annotation_Value $annotation)
{
$this->_stack[] = $annotation;
}
@@ -13,4 +14,70 @@
{
return count($this->_stack);
}
+
+ public function has($name)
+ {
+ $stackCount = $this->count();
+ for ($i = 0; $i < $stackCount; $i++) {
+ if ($this->_stack[$i]->name == $name) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public function filter($names)
+ {
+ $names = (array)$names;
+
+ $return = new self();
+ $stackCount = $this->count();
+ for ($i = 0; $i < $stackCount; $i++) {
+ if (in_array($this->_stack[$i]->name, $names)) {
+ $return->add($this->_stack[$i]);
+ }
+ }
+
+ return $return;
+ }
+
+ public function filterOut($names)
+ {
+ $names = (array)$names;
+
+ $return = new self();
+ $stackCount = $this->count();
+ for ($i = 0; $i < $stackCount; $i++) {
+ if (!in_array($this->_stack[$i]->name, $names)) {
+ $return->add($this->_stack[$i]);
+ }
+ }
+
+ return $return;
+ }
+
+ public function current()
+ {
+ return $this->_stack[$this->_cursor];
+ }
+
+ public function key()
+ {
+ return $this->valid() ? $this->_cursor : null;
+ }
+
+ public function next()
+ {
+ $this->_cursor++;
+ }
+
+ public function rewind()
+ {
+ $this->_cursor = 0;
+ }
+
+ public function valid()
+ {
+ return $this->_cursor < $this->count();
+ }
}
\ No newline at end of file
Modified: branches/experimental/tests/Argil/Util/Annotation/CollectionTest.php
===================================================================
--- branches/experimental/tests/Argil/Util/Annotation/CollectionTest.php 2007-05-25 18:51:33 UTC (rev 528)
+++ branches/experimental/tests/Argil/Util/Annotation/CollectionTest.php 2007-05-25 23:00:08 UTC (rev 529)
@@ -12,4 +12,117 @@
$collection->add(new MockArgil_Util_Annotation_Value());
$this->assertEqual(1, $collection->count());
}
+
+ public function testHasTellsWhetherTheCollectionContainsASpecificAnnotation()
+ {
+ $annotation = new MockArgil_Util_Annotation_Value();
+ $annotation->setReturnValue('__get', 'known', array('name'));
+ $collection = new Argil_Util_Annotation_Collection();
+ $collection->add($annotation);
+
+ $this->assertTrue($collection->has('known'));
+ $this->assertFalse($collection->has('unknown'));
+ }
+
+ public function testCanReturnANewCollectionWithFilteredResults()
+ {
+ $is = new Argil_Util_Annotation_Value('is');
+ $isNot = new Argil_Util_Annotation_Value('isNot');
+
+ $collection = new Argil_Util_Annotation_Collection();
+ $collection->add($is);
+ $collection->add($isNot);
+
+ $this->assertEqual(2, $collection->count(), 'sanity check');
+ $this->assertTrue($collection->has('is'), 'sanity check');
+ $this->assertTrue($collection->has('isNot'), 'sanity check');
+
+ $isCollection = $collection->filter('is');
+ $this->assertEqual(1, $isCollection->count());
+ $this->assertTrue($isCollection->has('is'));
+ $this->assertFalse($isCollection->has('isNot'));
+
+ $isNotCollection = $collection->filter('isNot');
+ $this->assertEqual(1, $isNotCollection->count());
+ $this->assertFalse($isNotCollection->has('is'));
+ $this->assertTrue($isNotCollection->has('isNot'));
+ }
+
+ public function testCanReturnANewCollectionWithMultipleFilteredResults()
+ {
+ $is = new Argil_Util_Annotation_Value('is');
+ $isNot = new Argil_Util_Annotation_Value('isNot');
+
+ $collection = new Argil_Util_Annotation_Collection();
+ $collection->add($is);
+ $collection->add($isNot);
+
+ $this->assertEqual(2, $collection->count(), 'sanity check');
+ $this->assertTrue($collection->has('is'), 'sanity check');
+ $this->assertTrue($collection->has('isNot'), 'sanity check');
+
+ $newCollection = $collection->filter(array('is', 'isNot'));
+ $this->assertEqual(2, $newCollection->count());
+ $this->assertTrue($newCollection->has('is'));
+ $this->assertTrue($newCollection->has('isNot'));
+
+ $this->assertTrue(
+ $collection == $newCollection,
+ '$collection and $newCollection are equal in what they contains'
+ );
+ $this->assertTrue(
+ $collection !== $newCollection,
+ '$collection and $newCollection are not the exact same object'
+ );
+ }
+
+ public function testCanFilterOutAnnotationsAsWell()
+ {
+ $is = new Argil_Util_Annotation_Value('is');
+ $isNot = new Argil_Util_Annotation_Value('isNot');
+
+ $collection = new Argil_Util_Annotation_Collection();
+ $collection->add($is);
+ $collection->add($isNot);
+
+ $this->assertEqual(2, $collection->count(), 'sanity check');
+ $this->assertTrue($collection->has('is'), 'sanity check');
+ $this->assertTrue($collection->has('isNot'), 'sanity check');
+
+ $isOutCollection = $collection->filterOut('is');
+ $this->assertEqual(1, $isOutCollection->count());
+ $this->assertFalse($isOutCollection->has('is'));
+ $this->assertTrue($isOutCollection->has('isNot'));
+
+ $isNotOutCollection = $collection->filterOut('isNot');
+ $this->assertEqual(1, $isNotOutCollection->count());
+ $this->assertTrue($isNotOutCollection->has('is'));
+ $this->assertFalse($isNotOutCollection->has('isNot'));
+ }
+
+ public function testIsAnIterator()
+ {
+ $collection = new Argil_Util_Annotation_Collection();
+ $this->assertIsA($collection, 'Iterator');
+
+ $this->assertFalse($collection->valid());
+ $this->assertNull($collection->key());
+ $this->assertNull($collection->current());
+
+ $is = new Argil_Util_Annotation_Value('is');
+ $collection->add($is);
+ $this->assertTrue($collection->valid());
+ $this->assertEqual($collection->current(), $is);
+ $this->assertIdentical($collection->key(), 0);
+
+ $collection->next();
+ $this->assertFalse($collection->valid());
+ $this->assertNull($collection->current());
+ $this->assertNull($collection->key());
+
+ $collection->rewind();
+ $this->assertTrue($collection->valid());
+ $this->assertEqual($collection->current(), $is);
+ $this->assertIdentical($collection->key(), 0);
+ }
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|