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