MediaWiki  REL1_24
GenericArrayObjectTest.php
Go to the documentation of this file.
00001 <?php
00002 
00030 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
00031 
00040     abstract public function elementInstancesProvider();
00041 
00049     abstract public function getInstanceClass();
00050 
00058     public function instanceProvider() {
00059         $instances = array();
00060 
00061         foreach ( $this->elementInstancesProvider() as $elementInstances ) {
00062             $instances[] = $this->getNew( $elementInstances[0] );
00063         }
00064 
00065         return $this->arrayWrap( $instances );
00066     }
00067 
00075     protected function getNew( array $elements = array() ) {
00076         $class = $this->getInstanceClass();
00077 
00078         return new $class( $elements );
00079     }
00080 
00090     public function testConstructor( array $elements ) {
00091         $arrayObject = $this->getNew( $elements );
00092 
00093         $this->assertEquals( count( $elements ), $arrayObject->count() );
00094     }
00095 
00105     public function testIsEmpty( array $elements ) {
00106         $arrayObject = $this->getNew( $elements );
00107 
00108         $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
00109     }
00110 
00120     public function testUnset( GenericArrayObject $list ) {
00121         if ( $list->isEmpty() ) {
00122             $this->assertTrue( true ); // We cannot test unset if there are no elements
00123         } else {
00124             $offset = $list->getIterator()->key();
00125             $count = $list->count();
00126             $list->offsetUnset( $offset );
00127             $this->assertEquals( $count - 1, $list->count() );
00128         }
00129 
00130         if ( !$list->isEmpty() ) {
00131             $offset = $list->getIterator()->key();
00132             $count = $list->count();
00133             unset( $list[$offset] );
00134             $this->assertEquals( $count - 1, $list->count() );
00135         }
00136     }
00137 
00147     public function testAppend( array $elements ) {
00148         $list = $this->getNew();
00149 
00150         $listSize = count( $elements );
00151 
00152         foreach ( $elements as $element ) {
00153             $list->append( $element );
00154         }
00155 
00156         $this->assertEquals( $listSize, $list->count() );
00157 
00158         $list = $this->getNew();
00159 
00160         foreach ( $elements as $element ) {
00161             $list[] = $element;
00162         }
00163 
00164         $this->assertEquals( $listSize, $list->count() );
00165 
00166         $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00167             $list->append( $element );
00168         } );
00169     }
00170 
00178     protected function checkTypeChecks( $function ) {
00179         $excption = null;
00180         $list = $this->getNew();
00181 
00182         $elementClass = $list->getObjectType();
00183 
00184         foreach ( array( 42, 'foo', array(), new stdClass(), 4.2 ) as $element ) {
00185             $validValid = $element instanceof $elementClass;
00186 
00187             try {
00188                 call_user_func( $function, $list, $element );
00189                 $valid = true;
00190             } catch ( InvalidArgumentException $exception ) {
00191                 $valid = false;
00192             }
00193 
00194             $this->assertEquals(
00195                 $validValid,
00196                 $valid,
00197                 'Object of invalid type got successfully added to a GenericArrayObject'
00198             );
00199         }
00200     }
00201 
00211     public function testOffsetSet( array $elements ) {
00212         if ( $elements === array() ) {
00213             $this->assertTrue( true );
00214 
00215             return;
00216         }
00217 
00218         $list = $this->getNew();
00219 
00220         $element = reset( $elements );
00221         $list->offsetSet( 42, $element );
00222         $this->assertEquals( $element, $list->offsetGet( 42 ) );
00223 
00224         $list = $this->getNew();
00225 
00226         $element = reset( $elements );
00227         $list['oHai'] = $element;
00228         $this->assertEquals( $element, $list['oHai'] );
00229 
00230         $list = $this->getNew();
00231 
00232         $element = reset( $elements );
00233         $list->offsetSet( 9001, $element );
00234         $this->assertEquals( $element, $list[9001] );
00235 
00236         $list = $this->getNew();
00237 
00238         $element = reset( $elements );
00239         $list->offsetSet( null, $element );
00240         $this->assertEquals( $element, $list[0] );
00241 
00242         $list = $this->getNew();
00243         $offset = 0;
00244 
00245         foreach ( $elements as $element ) {
00246             $list->offsetSet( null, $element );
00247             $this->assertEquals( $element, $list[$offset++] );
00248         }
00249 
00250         $this->assertEquals( count( $elements ), $list->count() );
00251 
00252         $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00253             $list->offsetSet( mt_rand(), $element );
00254         } );
00255     }
00256 
00268     public function testSerialization( GenericArrayObject $list ) {
00269         $serialization = serialize( $list );
00270         $copy = unserialize( $serialization );
00271 
00272         $this->assertEquals( $serialization, serialize( $copy ) );
00273         $this->assertEquals( count( $list ), count( $copy ) );
00274 
00275         $list = $list->getArrayCopy();
00276         $copy = $copy->getArrayCopy();
00277 
00278         $this->assertArrayEquals( $list, $copy, true, true );
00279     }
00280 }