MediaWiki
REL1_23
|
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 }