MediaWiki  REL1_23
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 
00077         return new $class( $elements );
00078     }
00079 
00089     public function testConstructor( array $elements ) {
00090         $arrayObject = $this->getNew( $elements );
00091 
00092         $this->assertEquals( count( $elements ), $arrayObject->count() );
00093     }
00094 
00104     public function testIsEmpty( array $elements ) {
00105         $arrayObject = $this->getNew( $elements );
00106 
00107         $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
00108     }
00109 
00119     public function testUnset( GenericArrayObject $list ) {
00120         if ( $list->isEmpty() ) {
00121             $this->assertTrue( true ); // We cannot test unset if there are no elements
00122         } else {
00123             $offset = $list->getIterator()->key();
00124             $count = $list->count();
00125             $list->offsetUnset( $offset );
00126             $this->assertEquals( $count - 1, $list->count() );
00127         }
00128 
00129         if ( !$list->isEmpty() ) {
00130             $offset = $list->getIterator()->key();
00131             $count = $list->count();
00132             unset( $list[$offset] );
00133             $this->assertEquals( $count - 1, $list->count() );
00134         }
00135     }
00136 
00146     public function testAppend( array $elements ) {
00147         $list = $this->getNew();
00148 
00149         $listSize = count( $elements );
00150 
00151         foreach ( $elements as $element ) {
00152             $list->append( $element );
00153         }
00154 
00155         $this->assertEquals( $listSize, $list->count() );
00156 
00157         $list = $this->getNew();
00158 
00159         foreach ( $elements as $element ) {
00160             $list[] = $element;
00161         }
00162 
00163         $this->assertEquals( $listSize, $list->count() );
00164 
00165         $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00166             $list->append( $element );
00167         } );
00168     }
00169 
00177     protected function checkTypeChecks( $function ) {
00178         $excption = null;
00179         $list = $this->getNew();
00180 
00181         $elementClass = $list->getObjectType();
00182 
00183         foreach ( array( 42, 'foo', array(), new stdClass(), 4.2 ) as $element ) {
00184             $validValid = $element instanceof $elementClass;
00185 
00186             try {
00187                 call_user_func( $function, $list, $element );
00188                 $valid = true;
00189             } catch ( InvalidArgumentException $exception ) {
00190                 $valid = false;
00191             }
00192 
00193             $this->assertEquals(
00194                 $validValid,
00195                 $valid,
00196                 'Object of invalid type got successfully added to a GenericArrayObject'
00197             );
00198         }
00199     }
00200 
00210     public function testOffsetSet( array $elements ) {
00211         if ( $elements === array() ) {
00212             $this->assertTrue( true );
00213 
00214             return;
00215         }
00216 
00217         $list = $this->getNew();
00218 
00219         $element = reset( $elements );
00220         $list->offsetSet( 42, $element );
00221         $this->assertEquals( $element, $list->offsetGet( 42 ) );
00222 
00223         $list = $this->getNew();
00224 
00225         $element = reset( $elements );
00226         $list['oHai'] = $element;
00227         $this->assertEquals( $element, $list['oHai'] );
00228 
00229         $list = $this->getNew();
00230 
00231         $element = reset( $elements );
00232         $list->offsetSet( 9001, $element );
00233         $this->assertEquals( $element, $list[9001] );
00234 
00235         $list = $this->getNew();
00236 
00237         $element = reset( $elements );
00238         $list->offsetSet( null, $element );
00239         $this->assertEquals( $element, $list[0] );
00240 
00241         $list = $this->getNew();
00242         $offset = 0;
00243 
00244         foreach ( $elements as $element ) {
00245             $list->offsetSet( null, $element );
00246             $this->assertEquals( $element, $list[$offset++] );
00247         }
00248 
00249         $this->assertEquals( count( $elements ), $list->count() );
00250 
00251         $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) {
00252             $list->offsetSet( mt_rand(), $element );
00253         } );
00254     }
00255 
00267     public function testSerialization( GenericArrayObject $list ) {
00268         $serialization = serialize( $list );
00269         $copy = unserialize( $serialization );
00270 
00271         $this->assertEquals( $serialization, serialize( $copy ) );
00272         $this->assertEquals( count( $list ), count( $copy ) );
00273 
00274         $list = $list->getArrayCopy();
00275         $copy = $copy->getArrayCopy();
00276 
00277         $this->assertArrayEquals( $list, $copy, true, true );
00278     }
00279 }