MediaWiki
REL1_21
|
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 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 $this->assertTrue( true ); // We cannot test unset if there are no elements 00115 } else { 00116 $offset = $list->getIterator()->key(); 00117 $count = $list->count(); 00118 $list->offsetUnset( $offset ); 00119 $this->assertEquals( $count - 1, $list->count() ); 00120 } 00121 00122 if ( !$list->isEmpty() ) { 00123 $offset = $list->getIterator()->key(); 00124 $count = $list->count(); 00125 unset( $list[$offset] ); 00126 $this->assertEquals( $count - 1, $list->count() ); 00127 } 00128 } 00129 00137 public function testAppend( array $elements ) { 00138 $list = $this->getNew(); 00139 00140 $listSize = count( $elements ); 00141 00142 foreach ( $elements as $element ) { 00143 $list->append( $element ); 00144 } 00145 00146 $this->assertEquals( $listSize, $list->count() ); 00147 00148 $list = $this->getNew(); 00149 00150 foreach ( $elements as $element ) { 00151 $list[] = $element; 00152 } 00153 00154 $this->assertEquals( $listSize, $list->count() ); 00155 00156 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) { 00157 $list->append( $element ); 00158 } ); 00159 } 00160 00166 protected function checkTypeChecks( $function ) { 00167 $excption = null; 00168 $list = $this->getNew(); 00169 00170 $elementClass = $list->getObjectType(); 00171 00172 foreach ( array( 42, 'foo', array(), new stdClass(), 4.2 ) as $element ) { 00173 $validValid = $element instanceof $elementClass; 00174 00175 try { 00176 call_user_func( $function, $list, $element ); 00177 $valid = true; 00178 } catch ( InvalidArgumentException $exception ) { 00179 $valid = false; 00180 } 00181 00182 $this->assertEquals( 00183 $validValid, 00184 $valid, 00185 'Object of invalid type got successfully added to a GenericArrayObject' 00186 ); 00187 } 00188 } 00189 00197 public function testOffsetSet( array $elements ) { 00198 if ( $elements === array() ) { 00199 $this->assertTrue( true ); 00200 return; 00201 } 00202 00203 $list = $this->getNew(); 00204 00205 $element = reset( $elements ); 00206 $list->offsetSet( 42, $element ); 00207 $this->assertEquals( $element, $list->offsetGet( 42 ) ); 00208 00209 $list = $this->getNew(); 00210 00211 $element = reset( $elements ); 00212 $list['oHai'] = $element; 00213 $this->assertEquals( $element, $list['oHai'] ); 00214 00215 $list = $this->getNew(); 00216 00217 $element = reset( $elements ); 00218 $list->offsetSet( 9001, $element ); 00219 $this->assertEquals( $element, $list[9001] ); 00220 00221 $list = $this->getNew(); 00222 00223 $element = reset( $elements ); 00224 $list->offsetSet( null, $element ); 00225 $this->assertEquals( $element, $list[0] ); 00226 00227 $list = $this->getNew(); 00228 $offset = 0; 00229 00230 foreach ( $elements as $element ) { 00231 $list->offsetSet( null, $element ); 00232 $this->assertEquals( $element, $list[$offset++] ); 00233 } 00234 00235 $this->assertEquals( count( $elements ), $list->count() ); 00236 00237 $this->checkTypeChecks( function ( GenericArrayObject $list, $element ) { 00238 $list->offsetSet( mt_rand(), $element ); 00239 } ); 00240 } 00241 00249 public function testSerialization( GenericArrayObject $list ) { 00250 $serialization = serialize( $list ); 00251 $copy = unserialize( $serialization ); 00252 00253 $this->assertEquals( $serialization, serialize( $copy ) ); 00254 $this->assertEquals( count( $list ), count( $copy ) ); 00255 00256 $list = $list->getArrayCopy(); 00257 $copy = $copy->getArrayCopy(); 00258 00259 $this->assertArrayEquals( $list, $copy, true, true ); 00260 } 00261 00262 }