MediaWiki  REL1_20
GenericArrayObjectTest.php
Go to the documentation of this file.
00001 <?php
00002 
00030 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
00031 
00039         public abstract function elementInstancesProvider();
00040 
00048         public abstract function getInstanceClass();
00049 
00057         public function instanceProvider() {
00058                 $instances = array();
00059 
00060                 foreach ( $this->elementInstancesProvider() as $elementInstances ) {
00061                         $instances[] = $this->getNew( $elementInstances );
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                         $offset = $list->getIterator()->key();
00115                         $count = $list->count();
00116                         $list->offsetUnset( $offset );
00117                         $this->assertEquals( $count - 1, $list->count() );
00118                 }
00119 
00120                 if ( !$list->isEmpty() ) {
00121                         $offset = $list->getIterator()->key();
00122                         $count = $list->count();
00123                         unset( $list[$offset] );
00124                         $this->assertEquals( $count - 1, $list->count() );
00125                 }
00126 
00127                 $exception = null;
00128                 try { $list->offsetUnset( 'sdfsedtgsrdysftu' ); } catch ( \Exception $exception ){}
00129                 $this->assertInstanceOf( '\Exception', $exception );
00130         }
00131 
00139         public function testAppend( array $elements ) {
00140                 $list = $this->getNew();
00141 
00142                 $listSize = count( $elements );
00143 
00144                 foreach ( $elements as $element ) {
00145                         $list->append( $element );
00146                 }
00147 
00148                 $this->assertEquals( $listSize, $list->count() );
00149 
00150                 $list = $this->getNew();
00151 
00152                 foreach ( $elements as $element ) {
00153                         $list[] = $element;
00154                 }
00155 
00156                 $this->assertEquals( $listSize, $list->count() );
00157 
00158                 $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
00159                         $list->append( $element );
00160                 } );
00161         }
00162 
00168         protected function checkTypeChecks( $function ) {
00169                 $excption = null;
00170                 $list = $this->getNew();
00171 
00172                 $elementClass = $list->getObjectType();
00173 
00174                 foreach ( array( 42, 'foo', array(), new \stdClass(), 4.2 ) as $element ) {
00175                         $validValid = $element instanceof $elementClass;
00176 
00177                         try{
00178                                 call_user_func( $function, $list, $element );
00179                                 $valid = true;
00180                         }
00181                         catch ( InvalidArgumentException $exception ) {
00182                                 $valid = false;
00183                         }
00184 
00185                         $this->assertEquals(
00186                                 $validValid,
00187                                 $valid,
00188                                 'Object of invalid type got successfully added to a GenericArrayObject'
00189                         );
00190                 }
00191         }
00192 
00200         public function testOffsetSet( array $elements ) {
00201                 if ( $elements === array() ) {
00202                         $this->assertTrue( true );
00203                         return;
00204                 }
00205 
00206                 $list = $this->getNew();
00207 
00208                 $element = reset( $elements );
00209                 $list->offsetSet( 42, $element );
00210                 $this->assertEquals( $element, $list->offsetGet( 42 ) );
00211 
00212                 $list = $this->getNew();
00213 
00214                 $element = reset( $elements );
00215                 $list['oHai'] = $element;
00216                 $this->assertEquals( $element, $list['oHai'] );
00217 
00218                 $list = $this->getNew();
00219 
00220                 $element = reset( $elements );
00221                 $list->offsetSet( 9001, $element );
00222                 $this->assertEquals( $element, $list[9001] );
00223 
00224                 $list = $this->getNew();
00225 
00226                 $element = reset( $elements );
00227                 $list->offsetSet( null, $element );
00228                 $this->assertEquals( $element, $list[0] );
00229 
00230                 $list = $this->getNew();
00231                 $offset = 0;
00232 
00233                 foreach ( $elements as $element ) {
00234                         $list->offsetSet( null, $element );
00235                         $this->assertEquals( $element, $list[$offset++] );
00236                 }
00237 
00238                 $this->assertEquals( count( $elements ), $list->count() );
00239 
00240                 $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
00241                         $list->offsetSet( mt_rand(), $element );
00242                 } );
00243         }
00244 
00245 }