MediaWiki  REL1_21
GenericArrayObjectTest.php
Go to the documentation of this file.
00001 <?php
00002 
00030 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
00031 
00039         abstract public function elementInstancesProvider();
00040 
00048         abstract public function getInstanceClass();
00049 
00057         public function instanceProvider() {
00058                 $instances = array();
00059 
00060                 foreach ( $this->elementInstancesProvider() as $elementInstances ) {
00061                         $instances[] = $this->getNew( $elementInstances[0] );
00062                 }
00063 
00064                 return $this->arrayWrap( $instances );
00065         }
00066 
00074         protected function getNew( array $elements = array() ) {
00075                 $class = $this->getInstanceClass();
00076                 return new $class( $elements );
00077         }
00078 
00086         public function testConstructor( array $elements ) {
00087                 $arrayObject = $this->getNew( $elements );
00088 
00089                 $this->assertEquals( count( $elements ), $arrayObject->count() );
00090         }
00091 
00099         public function testIsEmpty( array $elements ) {
00100                 $arrayObject = $this->getNew( $elements );
00101 
00102                 $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
00103         }
00104 
00112         public function testUnset( GenericArrayObject $list ) {
00113                 if ( $list->isEmpty() ) {
00114                         $this->assertTrue( true ); // We cannot test unset if there are no elements
00115                 } else {
00116                         $offset = $list->getIterator()->key();
00117                         $count = $list->count();
00118                         $list->offsetUnset( $offset );
00119                         $this->assertEquals( $count - 1, $list->count() );
00120                 }
00121 
00122                 if ( !$list->isEmpty() ) {
00123                         $offset = $list->getIterator()->key();
00124                         $count = $list->count();
00125                         unset( $list[$offset] );
00126                         $this->assertEquals( $count - 1, $list->count() );
00127                 }
00128         }
00129 
00137         public function testAppend( array $elements ) {
00138                 $list = $this->getNew();
00139 
00140                 $listSize = count( $elements );
00141 
00142                 foreach ( $elements as $element ) {
00143                         $list->append( $element );
00144                 }
00145 
00146                 $this->assertEquals( $listSize, $list->count() );
00147 
00148                 $list = $this->getNew();
00149 
00150                 foreach ( $elements as $element ) {
00151                         $list[] = $element;
00152                 }
00153 
00154                 $this->assertEquals( $listSize, $list->count() );
00155 
00156                 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00157                         $list->append( $element );
00158                 } );
00159         }
00160 
00166         protected function checkTypeChecks( $function ) {
00167                 $excption = null;
00168                 $list = $this->getNew();
00169 
00170                 $elementClass = $list->getObjectType();
00171 
00172                 foreach ( array( 42, 'foo', array(), new stdClass(), 4.2 ) as $element ) {
00173                         $validValid = $element instanceof $elementClass;
00174 
00175                         try {
00176                                 call_user_func( $function, $list, $element );
00177                                 $valid = true;
00178                         } catch ( InvalidArgumentException $exception ) {
00179                                 $valid = false;
00180                         }
00181 
00182                         $this->assertEquals(
00183                                 $validValid,
00184                                 $valid,
00185                                 'Object of invalid type got successfully added to a GenericArrayObject'
00186                         );
00187                 }
00188         }
00189 
00197         public function testOffsetSet( array $elements ) {
00198                 if ( $elements === array() ) {
00199                         $this->assertTrue( true );
00200                         return;
00201                 }
00202 
00203                 $list = $this->getNew();
00204 
00205                 $element = reset( $elements );
00206                 $list->offsetSet( 42, $element );
00207                 $this->assertEquals( $element, $list->offsetGet( 42 ) );
00208 
00209                 $list = $this->getNew();
00210 
00211                 $element = reset( $elements );
00212                 $list['oHai'] = $element;
00213                 $this->assertEquals( $element, $list['oHai'] );
00214 
00215                 $list = $this->getNew();
00216 
00217                 $element = reset( $elements );
00218                 $list->offsetSet( 9001, $element );
00219                 $this->assertEquals( $element, $list[9001] );
00220 
00221                 $list = $this->getNew();
00222 
00223                 $element = reset( $elements );
00224                 $list->offsetSet( null, $element );
00225                 $this->assertEquals( $element, $list[0] );
00226 
00227                 $list = $this->getNew();
00228                 $offset = 0;
00229 
00230                 foreach ( $elements as $element ) {
00231                         $list->offsetSet( null, $element );
00232                         $this->assertEquals( $element, $list[$offset++] );
00233                 }
00234 
00235                 $this->assertEquals( count( $elements ), $list->count() );
00236 
00237                 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00238                         $list->offsetSet( mt_rand(), $element );
00239                 } );
00240         }
00241 
00249         public function testSerialization( GenericArrayObject $list ) {
00250                 $serialization = serialize( $list );
00251                 $copy = unserialize( $serialization );
00252 
00253                 $this->assertEquals( $serialization, serialize( $copy ) );
00254                 $this->assertEquals( count( $list ), count( $copy ) );
00255 
00256                 $list = $list->getArrayCopy();
00257                 $copy = $copy->getArrayCopy();
00258 
00259                 $this->assertArrayEquals( $list, $copy, true, true );
00260         }
00261 
00262 }